mirror of
https://github.com/status-im/consul.git
synced 2025-01-11 22:34:55 +00:00
95c027a3ea
https://github.com/shirou/gopsutil/pull/895 is merged and fixes our problem. Time to update. Since there is no new version just yet, updating to the sha.
69 lines
1.8 KiB
Go
69 lines
1.8 KiB
Go
// +build freebsd linux darwin
|
|
|
|
package disk
|
|
|
|
import (
|
|
"context"
|
|
"strconv"
|
|
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
// Usage returns a file system usage. path is a filesystem path such
|
|
// as "/", not device file path like "/dev/vda1". If you want to use
|
|
// a return value of disk.Partitions, use "Mountpoint" not "Device".
|
|
func Usage(path string) (*UsageStat, error) {
|
|
return UsageWithContext(context.Background(), path)
|
|
}
|
|
|
|
func UsageWithContext(ctx context.Context, path string) (*UsageStat, error) {
|
|
stat := unix.Statfs_t{}
|
|
err := unix.Statfs(path, &stat)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
bsize := stat.Bsize
|
|
|
|
ret := &UsageStat{
|
|
Path: unescapeFstab(path),
|
|
Fstype: getFsType(stat),
|
|
Total: (uint64(stat.Blocks) * uint64(bsize)),
|
|
Free: (uint64(stat.Bavail) * uint64(bsize)),
|
|
InodesTotal: (uint64(stat.Files)),
|
|
InodesFree: (uint64(stat.Ffree)),
|
|
}
|
|
|
|
// if could not get InodesTotal, return empty
|
|
if ret.InodesTotal < ret.InodesFree {
|
|
return ret, nil
|
|
}
|
|
|
|
ret.InodesUsed = (ret.InodesTotal - ret.InodesFree)
|
|
ret.Used = (uint64(stat.Blocks) - uint64(stat.Bfree)) * uint64(bsize)
|
|
|
|
if ret.InodesTotal == 0 {
|
|
ret.InodesUsedPercent = 0
|
|
} else {
|
|
ret.InodesUsedPercent = (float64(ret.InodesUsed) / float64(ret.InodesTotal)) * 100.0
|
|
}
|
|
|
|
if (ret.Used + ret.Free) == 0 {
|
|
ret.UsedPercent = 0
|
|
} else {
|
|
// We don't use ret.Total to calculate percent.
|
|
// see https://github.com/shirou/gopsutil/issues/562
|
|
ret.UsedPercent = (float64(ret.Used) / float64(ret.Used+ret.Free)) * 100.0
|
|
}
|
|
|
|
return ret, nil
|
|
}
|
|
|
|
// Unescape escaped octal chars (like space 040, ampersand 046 and backslash 134) to their real value in fstab fields issue#555
|
|
func unescapeFstab(path string) string {
|
|
escaped, err := strconv.Unquote(`"` + path + `"`)
|
|
if err != nil {
|
|
return path
|
|
}
|
|
return escaped
|
|
}
|