diff --git a/beszel/internal/agent/agent.go b/beszel/internal/agent/agent.go index 00b3d1c..2e5f639 100644 --- a/beszel/internal/agent/agent.go +++ b/beszel/internal/agent/agent.go @@ -36,7 +36,6 @@ type Agent struct { server *ssh.Server // SSH server dataDir string // Directory for persisting data keys []gossh.PublicKey // SSH public keys - hasBattery bool // true if agent has access to battery stats } // NewAgent creates a new agent with the given data directory for persisting data. diff --git a/beszel/internal/agent/battery.go b/beszel/internal/agent/battery.go deleted file mode 100644 index 6f99dfd..0000000 --- a/beszel/internal/agent/battery.go +++ /dev/null @@ -1,24 +0,0 @@ -package agent - -import "github.com/distatus/battery" - -// getBatteryStats returns the current battery percent and charge state -func getBatteryStats() (batteryPercent uint8, batteryState uint8, err error) { - batteries, err := battery.GetAll() - if err != nil || len(batteries) == 0 { - return batteryPercent, batteryState, err - } - totalCapacity := float64(0) - totalCharge := float64(0) - for _, bat := range batteries { - if bat.Design != 0 { - totalCapacity += bat.Design - } else { - totalCapacity += bat.Full - } - totalCharge += bat.Current - } - batteryPercent = uint8(totalCharge / totalCapacity * 100) - batteryState = uint8(batteries[0].State.Raw) - return batteryPercent, batteryState, nil -} diff --git a/beszel/internal/agent/battery/battery.go b/beszel/internal/agent/battery/battery.go new file mode 100644 index 0000000..f671842 --- /dev/null +++ b/beszel/internal/agent/battery/battery.go @@ -0,0 +1,53 @@ +//go:build !freebsd + +// Package battery provides functions to check if the system has a battery and to get the battery stats. +package battery + +import ( + "errors" + "log/slog" + + "github.com/distatus/battery" +) + +var systemHasBattery = false +var haveCheckedBattery = false + +// HasReadableBattery checks if the system has a battery and returns true if it does. +func HasReadableBattery() bool { + if haveCheckedBattery { + return systemHasBattery + } + haveCheckedBattery = true + bat, err := battery.Get(0) + if err == nil && bat != nil { + systemHasBattery = true + } else { + slog.Debug("No battery found", "err", err) + } + return systemHasBattery +} + +// GetBatteryStats returns the current battery percent and charge state +func GetBatteryStats() (batteryPercent uint8, batteryState uint8, err error) { + if !systemHasBattery { + return batteryPercent, batteryState, errors.ErrUnsupported + } + batteries, err := battery.GetAll() + if err != nil || len(batteries) == 0 { + return batteryPercent, batteryState, err + } + totalCapacity := float64(0) + totalCharge := float64(0) + for _, bat := range batteries { + if bat.Design != 0 { + totalCapacity += bat.Design + } else { + totalCapacity += bat.Full + } + totalCharge += bat.Current + } + batteryPercent = uint8(totalCharge / totalCapacity * 100) + batteryState = uint8(batteries[0].State.Raw) + return batteryPercent, batteryState, nil +} diff --git a/beszel/internal/agent/battery/battery_freebsd.go b/beszel/internal/agent/battery/battery_freebsd.go new file mode 100644 index 0000000..dfbd5ff --- /dev/null +++ b/beszel/internal/agent/battery/battery_freebsd.go @@ -0,0 +1,13 @@ +//go:build freebsd + +package battery + +import "errors" + +func HasReadableBattery() bool { + return false +} + +func GetBatteryStats() (uint8, uint8, error) { + return 0, 0, errors.ErrUnsupported +} diff --git a/beszel/internal/agent/system.go b/beszel/internal/agent/system.go index 1926f5e..908bc13 100644 --- a/beszel/internal/agent/system.go +++ b/beszel/internal/agent/system.go @@ -2,6 +2,7 @@ package agent import ( "beszel" + "beszel/internal/agent/battery" "beszel/internal/entities/system" "bufio" "fmt" @@ -64,13 +65,6 @@ func (a *Agent) initializeSystemInfo() { } else { a.zfs = true } - - // battery - if _, _, err := getBatteryStats(); err != nil { - slog.Debug("No battery detected", "err", err) - } else { - a.hasBattery = true - } } // Returns current info, stats about the host system @@ -78,8 +72,8 @@ func (a *Agent) getSystemStats() system.Stats { systemStats := system.Stats{} // battery - if a.hasBattery { - systemStats.Battery[0], systemStats.Battery[1], _ = getBatteryStats() + if battery.HasReadableBattery() { + systemStats.Battery[0], systemStats.Battery[1], _ = battery.GetBatteryStats() } // cpu percent