63 lines
1.3 KiB
Go
63 lines
1.3 KiB
Go
package collector
|
|
|
|
import (
|
|
"os/exec"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
type DiskInfo struct {
|
|
Filesystem string `json:"filesystem"`
|
|
TotalBytes int64 `json:"total_bytes"`
|
|
UsedBytes int64 `json:"used_bytes"`
|
|
FreeBytes int64 `json:"free_bytes"`
|
|
MountPoint string `json:"mount_point"`
|
|
}
|
|
|
|
func CollectDisks() []DiskInfo {
|
|
// df -k (1K-Bloecke) fuer einfacheres Parsen
|
|
out, err := exec.Command("df", "-k", "-t", "ufs,zfs").Output()
|
|
if err != nil {
|
|
// Fallback ohne Typ-Filter
|
|
out, err = exec.Command("df", "-k").Output()
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
}
|
|
|
|
var disks []DiskInfo
|
|
lines := strings.Split(strings.TrimSpace(string(out)), "\n")
|
|
|
|
for i, line := range lines {
|
|
if i == 0 {
|
|
continue // Header ueberspringen
|
|
}
|
|
|
|
fields := strings.Fields(line)
|
|
if len(fields) < 6 {
|
|
continue
|
|
}
|
|
|
|
// Pseudo-Filesysteme ueberspringen
|
|
fs := fields[0]
|
|
mount := fields[len(fields)-1]
|
|
if strings.HasPrefix(fs, "devfs") || strings.HasPrefix(fs, "tmpfs") || fs == "fdescfs" || fs == "procfs" {
|
|
continue
|
|
}
|
|
|
|
total, _ := strconv.ParseInt(fields[1], 10, 64)
|
|
used, _ := strconv.ParseInt(fields[2], 10, 64)
|
|
avail, _ := strconv.ParseInt(fields[3], 10, 64)
|
|
|
|
disks = append(disks, DiskInfo{
|
|
Filesystem: fs,
|
|
TotalBytes: total * 1024,
|
|
UsedBytes: used * 1024,
|
|
FreeBytes: avail * 1024,
|
|
MountPoint: mount,
|
|
})
|
|
}
|
|
|
|
return disks
|
|
}
|