- agent-linux/: Kompletter Linux/Proxmox RMM Agent - Collectors: CPU, Memory, Disk, Network, Services, Updates, Proxmox (VMs, Container, Storage, ZFS), Backups - Backup Collector: Jobs nach Node gefiltert (Cluster-aware) - WebSocket: Tunnel-Support, writeMux fuer stabile Verbindungen - Systemd Service Template - updater/: Plattform-unabhaengiger Updater (FreeBSD + Linux) - runtime.GOOS erkennt Plattform automatisch - FreeBSD: /usr/local/rmm/, service rmm_agent - Linux: /usr/local/bin/, /etc/rmm/, systemctl rmm-agent - Firmware-Download mit ?platform= Parameter - frontend/: Proxmox-Bereich - ProxmoxServers.jsx: Eigene Seite fuer PVE Server mit VM/CT Counts - ProxmoxPanel.jsx: Detail-Panel mit Uebersicht, VMs, Container, Storage, ZFS, Tunnel, Dienste, Updates, Backups - Agents.jsx: Filtert Linux-Agents raus (nur OPNsense) - Sidebar: Proxmox Navigationspunkt - Installationsanleitung mit rmm-agent-linux + rmm-updater-linux - backend: Platform-Feld fuer Agents, Firmware multi-platform
132 lines
3.1 KiB
Go
132 lines
3.1 KiB
Go
package collector
|
|
|
|
import (
|
|
"os"
|
|
"os/exec"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// Basis-Systemdaten sammeln
|
|
|
|
func CollectHostname() string {
|
|
if data, err := os.ReadFile("/etc/hostname"); err == nil {
|
|
return strings.TrimSpace(string(data))
|
|
}
|
|
|
|
// Fallback
|
|
if hostname, err := os.Hostname(); err == nil {
|
|
return hostname
|
|
}
|
|
|
|
return "unknown"
|
|
}
|
|
|
|
func CollectOSVersion() string {
|
|
// Versuche verschiedene Wege die OS-Version zu bestimmen
|
|
|
|
// 1. /etc/os-release (Standard für moderne Linux-Distributionen)
|
|
if data, err := os.ReadFile("/etc/os-release"); err == nil {
|
|
lines := strings.Split(string(data), "\n")
|
|
var name, version string
|
|
|
|
for _, line := range lines {
|
|
line = strings.TrimSpace(line)
|
|
if strings.HasPrefix(line, "NAME=") {
|
|
name = strings.Trim(strings.SplitN(line, "=", 2)[1], "\"")
|
|
} else if strings.HasPrefix(line, "VERSION=") {
|
|
version = strings.Trim(strings.SplitN(line, "=", 2)[1], "\"")
|
|
}
|
|
}
|
|
|
|
if name != "" {
|
|
if version != "" {
|
|
return name + " " + version
|
|
}
|
|
return name
|
|
}
|
|
}
|
|
|
|
// 2. /etc/debian_version (Debian/Ubuntu)
|
|
if data, err := os.ReadFile("/etc/debian_version"); err == nil {
|
|
version := strings.TrimSpace(string(data))
|
|
return "Debian " + version
|
|
}
|
|
|
|
// 3. /etc/redhat-release (RHEL/CentOS)
|
|
if data, err := os.ReadFile("/etc/redhat-release"); err == nil {
|
|
return strings.TrimSpace(string(data))
|
|
}
|
|
|
|
// 4. uname fallback
|
|
if output, err := exec.Command("/usr/bin/uname", "-sr").CombinedOutput(); err == nil {
|
|
return strings.TrimSpace(string(output))
|
|
}
|
|
|
|
return "Linux (unknown)"
|
|
}
|
|
|
|
func CollectUptime() int64 {
|
|
if data, err := os.ReadFile("/proc/uptime"); err == nil {
|
|
parts := strings.Fields(string(data))
|
|
if len(parts) > 0 {
|
|
if uptime, err := strconv.ParseFloat(parts[0], 64); err == nil {
|
|
return int64(uptime)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Fallback: Boot-Zeit berechnen
|
|
if stat, err := os.Stat("/proc/1"); err == nil {
|
|
bootTime := stat.ModTime()
|
|
return int64(time.Since(bootTime).Seconds())
|
|
}
|
|
|
|
return 0
|
|
}
|
|
|
|
// Hardware-Informationen sammeln
|
|
type HardwareInfo struct {
|
|
Manufacturer string
|
|
Model string
|
|
Serial string
|
|
BIOSVersion string
|
|
}
|
|
|
|
func CollectHardware() HardwareInfo {
|
|
hw := HardwareInfo{}
|
|
|
|
// DMI-Informationen aus /sys/class/dmi/id/ lesen
|
|
if data, err := os.ReadFile("/sys/class/dmi/id/sys_vendor"); err == nil {
|
|
hw.Manufacturer = strings.TrimSpace(string(data))
|
|
}
|
|
|
|
if data, err := os.ReadFile("/sys/class/dmi/id/product_name"); err == nil {
|
|
hw.Model = strings.TrimSpace(string(data))
|
|
}
|
|
|
|
if data, err := os.ReadFile("/sys/class/dmi/id/product_serial"); err == nil {
|
|
hw.Serial = strings.TrimSpace(string(data))
|
|
}
|
|
|
|
if data, err := os.ReadFile("/sys/class/dmi/id/bios_version"); err == nil {
|
|
hw.BIOSVersion = strings.TrimSpace(string(data))
|
|
}
|
|
|
|
// Fallback für Manufacturer
|
|
if hw.Manufacturer == "" {
|
|
if data, err := os.ReadFile("/sys/class/dmi/id/board_vendor"); err == nil {
|
|
hw.Manufacturer = strings.TrimSpace(string(data))
|
|
}
|
|
}
|
|
|
|
// Fallback für Model
|
|
if hw.Model == "" {
|
|
if data, err := os.ReadFile("/sys/class/dmi/id/board_name"); err == nil {
|
|
hw.Model = strings.TrimSpace(string(data))
|
|
}
|
|
}
|
|
|
|
return hw
|
|
} |