cynfo3000 7f9fbd257f Linux/Proxmox Agent + Plattform-Updater + Proxmox Frontend
- 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
2026-03-01 22:03:18 +01:00

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
}