You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
2.1 KiB

  1. //go:build !windows && !openbsd && !netbsd && !plan9 && !solaris
  2. // +build !windows,!openbsd,!netbsd,!plan9,!solaris
  3. package main
  4. import (
  5. "log"
  6. "syscall"
  7. )
  8. // go run unmaintained/disk/disk_status.go
  9. type DiskStatus struct {
  10. Dir string `protobuf:"bytes,1,opt,name=dir,proto3" json:"dir,omitempty"`
  11. All uint64 `protobuf:"varint,2,opt,name=all,proto3" json:"all,omitempty"`
  12. Used uint64 `protobuf:"varint,3,opt,name=used,proto3" json:"used,omitempty"`
  13. Free uint64 `protobuf:"varint,4,opt,name=free,proto3" json:"free,omitempty"`
  14. PercentFree float32 `protobuf:"fixed32,5,opt,name=percent_free,json=percentFree,proto3" json:"percent_free,omitempty"`
  15. PercentUsed float32 `protobuf:"fixed32,6,opt,name=percent_used,json=percentUsed,proto3" json:"percent_used,omitempty"`
  16. DiskType string `protobuf:"bytes,7,opt,name=disk_type,json=diskType,proto3" json:"disk_type,omitempty"`
  17. // new fields about avail blocks
  18. Avail uint64 `protobuf:"varint,4,opt,name=avail,proto3" json:"avail,omitempty"`
  19. PercentAvail float32 `protobuf:"fixed32,5,opt,name=percent_avail,json=percentAvail,proto3" json:"percent_avail,omitempty"`
  20. }
  21. func main() {
  22. dirs := []string{"/mnt/sdb", "/mnt/sdc", "/mnt/sdd", "/mnt/sde", "/mnt/sdf", "/mnt/sdg", "/mnt/sdh", "/mnt/sdi", "/mnt/sdj"}
  23. // dirs := []string{"/mnt/sdb"}
  24. for _, dir := range dirs {
  25. disk := &DiskStatus{Dir: dir}
  26. fillInDiskStatus(disk)
  27. // bytes, _ := json.Marshal(disk)
  28. // log.Printf("disk status %s", bytes)
  29. log.Printf("disk: %s avail: %f free: %f", disk.Dir, disk.PercentAvail, disk.PercentFree)
  30. }
  31. }
  32. func fillInDiskStatus(disk *DiskStatus) {
  33. fs := syscall.Statfs_t{}
  34. err := syscall.Statfs(disk.Dir, &fs)
  35. if err != nil {
  36. return
  37. }
  38. disk.All = fs.Blocks * uint64(fs.Bsize)
  39. disk.Free = fs.Bfree * uint64(fs.Bsize)
  40. disk.Used = disk.All - disk.Free
  41. disk.PercentFree = float32((float64(disk.Free) / float64(disk.All)) * 100)
  42. disk.PercentUsed = float32((float64(disk.Used) / float64(disk.All)) * 100)
  43. // avail blocks
  44. disk.Avail = fs.Bavail * uint64(fs.Bsize)
  45. disk.PercentAvail = float32((float64(disk.Avail) / float64(disk.All)) * 100)
  46. return
  47. }