package collector import ( "os/exec" "strconv" "strings" "time" ) func CollectOPNsenseVersion() string { out, err := exec.Command("/usr/local/sbin/opnsense-version").Output() if err != nil { return "" } // Format: "OPNsense 24.1.1_1" - alles nach erstem Leerzeichen s := strings.TrimSpace(string(out)) return s } func CollectFreeBSDVersion() string { out, err := exec.Command("/bin/freebsd-version").Output() if err != nil { return sysctlGet("kern.osrelease") } return strings.TrimSpace(string(out)) } func CollectHostname() string { return sysctlGet("kern.hostname") } func CollectUptime() int64 { // kern.boottime: { sec = 1706000000, usec = 0 } ... oder "sec = 1706000000" out := sysctlGet("kern.boottime") if out == "" { return 0 } // Parse "{ sec = TIMESTAMP, usec = ... }" idx := strings.Index(out, "sec = ") if idx == -1 { return 0 } numStr := out[idx+6:] if commaIdx := strings.IndexAny(numStr, ", }"); commaIdx != -1 { numStr = numStr[:commaIdx] } numStr = strings.TrimSpace(numStr) bootTime, err := strconv.ParseInt(numStr, 10, 64) if err != nil { return 0 } uptime := time.Now().Unix() - bootTime if uptime < 0 { return 0 } return uptime }