diff --git a/internal/debugreport/collect.go b/internal/debugreport/collect.go index 33b0b61..2937264 100644 --- a/internal/debugreport/collect.go +++ b/internal/debugreport/collect.go @@ -9,7 +9,6 @@ import ( "strconv" "strings" "sync" - "syscall" "github.com/docker/docker/client" "github.com/kballard/go-shellquote" @@ -463,11 +462,7 @@ func availableDiskBytes(ctxCfg *config.Context) (int64, error) { func availableDiskBytesAtPathWithSession(ctxCfg *config.Context, session *Session, path string) (int64, error) { trimmedPath := firstNonEmpty(strings.TrimSpace(path), "/") if ctxCfg.DockerHostType == config.ContextLocal { - var stat syscall.Statfs_t - if err := syscall.Statfs(trimmedPath, &stat); err != nil { - return 0, err - } - return int64(stat.Bavail) * int64(stat.Bsize), nil + return localAvailableDiskBytes(trimmedPath) } if session != nil { accessor, err := session.fileAccessorForContext() diff --git a/internal/debugreport/hoststats_local_other.go b/internal/debugreport/hoststats_local_other.go new file mode 100644 index 0000000..5f8723b --- /dev/null +++ b/internal/debugreport/hoststats_local_other.go @@ -0,0 +1,27 @@ +//go:build !linux && !darwin + +package debugreport + +import ( + "fmt" + "runtime" + + "github.com/libops/sitectl/pkg/config" +) + +func collectLocalHostDiagnostics(ctxCfg *config.Context) HostDiagnostics { + diagnostics := HostDiagnostics{ + CPUCount: runtime.NumCPU(), + MemoryBytes: -1, + SwapBytes: -1, + DiskAvailableBytes: -1, + Issues: []string{"local host diagnostics are not implemented for this platform"}, + } + availableDiskBytes, err := availableDiskBytes(ctxCfg) + if err != nil { + diagnostics.Issues = append(diagnostics.Issues, fmt.Sprintf("disk: %v", err)) + } else { + diagnostics.DiskAvailableBytes = availableDiskBytes + } + return diagnostics +} diff --git a/internal/debugreport/local_disk_unix.go b/internal/debugreport/local_disk_unix.go new file mode 100644 index 0000000..15608a7 --- /dev/null +++ b/internal/debugreport/local_disk_unix.go @@ -0,0 +1,13 @@ +//go:build linux || darwin + +package debugreport + +import "syscall" + +func localAvailableDiskBytes(path string) (int64, error) { + var stat syscall.Statfs_t + if err := syscall.Statfs(path, &stat); err != nil { + return 0, err + } + return int64(stat.Bavail) * int64(stat.Bsize), nil +} diff --git a/internal/debugreport/local_disk_windows.go b/internal/debugreport/local_disk_windows.go new file mode 100644 index 0000000..486695a --- /dev/null +++ b/internal/debugreport/local_disk_windows.go @@ -0,0 +1,19 @@ +//go:build windows + +package debugreport + +import ( + "golang.org/x/sys/windows" +) + +func localAvailableDiskBytes(path string) (int64, error) { + pathPtr, err := windows.UTF16PtrFromString(path) + if err != nil { + return 0, err + } + var freeBytesAvailable uint64 + if err := windows.GetDiskFreeSpaceEx(pathPtr, &freeBytesAvailable, nil, nil); err != nil { + return 0, err + } + return int64(freeBytesAvailable), nil +}