Agent-Updater, Multi-Plattform Firmware, Frontend Firmware-Seite, Agent-Tab, Zertifikate-Redesign

Updater:
- Separater Go-Daemon (rmm-updater) als eigener rc.d Service
- Pollt alle 60s: Firmware vorhanden + Hash unterschiedlich + Flag gesetzt
- Download -> SHA256 Verify -> Agent Stop -> Replace -> Agent Start
- Automatisches Rollback bei Fehler
- Deployed und getestet auf allen 3 Firewalls (.1, .19, .33)

Backend:
- Firmware-DB multi-plattform (freebsd/linux/windows)
- update_requested Flag pro Agent in agents Tabelle
- Heartbeat-Response liefert update_available wenn Flag gesetzt
- Neue Endpoints: request-update, request-update-all, firmware/download
- Auth: JWT + CombinedAuth Middleware (API-Key OR JWT)
- Customers CRUD + Agent-Zuordnung
- Users CRUD + Passwort-Aenderung

Frontend:
- Firmware-Seite: Multi-Plattform Upload, Agent-Liste mit Update-Trigger
- Agent-Tab im AgentPanel: Update-Button, nuetzliche Befehle, Agent-Info
- Zertifikate-Tab redesigned: Karten-Layout mit Restlaufzeit und Farbbalken
- Sidebar: Firmware-Eintrag hinzugefuegt

Plugin:
- install.sh erweitert: Installiert Agent + Updater + rc.d Services
- rmm_updater rc.d Service

README:
- Architektur-Diagramm erweitert (Frontend + Updater)
- Auth, Customers, Users, Firmware API dokumentiert
- Updater-Flow dokumentiert
- Frontend-Seiten und Deploy beschrieben
- DB-Schema aktualisiert (neue Tabellen)
- Dateistruktur erweitert (updater/, frontend/, firmware.go, auth.go)
This commit is contained in:
cynfo3000
2026-02-28 22:43:03 +01:00
parent 616a0cb6ac
commit e74cdce0ba
26 changed files with 2857 additions and 241 deletions
+89 -8
View File
@@ -14,6 +14,7 @@ set -e
BASEDIR="/tmp"
BINARY="${BASEDIR}/rmm-agent"
UPDATER_BINARY="${BASEDIR}/rmm-updater"
echo "========================================"
echo " RMM Agent Plugin Installer"
@@ -28,18 +29,27 @@ if [ ! -f "${BINARY}" ]; then
fi
# Alten Agent stoppen falls vorhanden
echo "[1/7] Alten Agent stoppen..."
echo "[1/8] Alte Dienste stoppen..."
/usr/local/etc/rc.d/rmm_updater stop 2>/dev/null || true
/usr/local/etc/rc.d/rmm_agent stop 2>/dev/null || true
pkill -9 -f rmm-agent 2>/dev/null || true
pkill -9 -f rmm-updater 2>/dev/null || true
# Binary installieren
echo "[2/7] Binary installieren..."
# Binaries installieren
echo "[2/8] Binaries installieren..."
mkdir -p /usr/local/rmm
cp "${BINARY}" /usr/local/rmm/rmm-agent
chmod +x /usr/local/rmm/rmm-agent
if [ -f "${UPDATER_BINARY}" ]; then
cp "${UPDATER_BINARY}" /usr/local/rmm/rmm-updater
chmod +x /usr/local/rmm/rmm-updater
echo " Updater installiert"
else
echo " Updater-Binary nicht gefunden — uebersprungen"
fi
# rc.d Script
echo "[3/7] rc.d Service installieren..."
echo "[3/8] rc.d Service installieren..."
cat > /usr/local/etc/rc.d/rmm_agent << 'RCEOF'
#!/bin/sh
#
@@ -110,8 +120,69 @@ run_rc_command "$1"
RCEOF
chmod +x /usr/local/etc/rc.d/rmm_agent
# Updater rc.d Service
cat > /usr/local/etc/rc.d/rmm_updater << 'RCEOF2'
#!/bin/sh
#
# PROVIDE: rmm_updater
# REQUIRE: NETWORKING rmm_agent
# KEYWORD: shutdown
. /etc/rc.subr
name="rmm_updater"
rcvar="${name}_enable"
command="/usr/local/rmm/rmm-updater"
pidfile="/var/run/${name}.pid"
logfile="/var/log/rmm-updater.log"
start_cmd="${name}_start"
stop_cmd="${name}_stop"
status_cmd="${name}_status"
rmm_updater_start()
{
if [ ! -f "${command}" ]; then
echo "rmm-updater binary not found: ${command}"
return 1
fi
if [ -f "$pidfile" ] && kill -0 $(cat "$pidfile") 2>/dev/null; then
echo "${name} already running"
return 0
fi
echo "Starting ${name}."
/usr/sbin/daemon -f -p "$pidfile" -o "$logfile" "$command"
}
rmm_updater_stop()
{
if [ -f "${pidfile}" ]; then
echo "Stopping ${name}."
kill $(cat ${pidfile}) 2>/dev/null
rm -f ${pidfile}
else
echo "${name} is not running."
fi
}
rmm_updater_status()
{
if [ -f "${pidfile}" ] && kill -0 $(cat ${pidfile}) 2>/dev/null; then
echo "${name} is running as pid $(cat ${pidfile})."
else
echo "${name} is not running."
return 1
fi
}
load_rc_config $name
: ${rmm_updater_enable:="NO"}
run_rc_command "$1"
RCEOF2
chmod +x /usr/local/etc/rc.d/rmm_updater
# MVC Plugin installieren
echo "[4/7] OPNsense MVC Plugin installieren..."
echo "[4/8] OPNsense MVC Plugin installieren..."
# Model
mkdir -p /usr/local/opnsense/mvc/app/models/OPNsense/RMMAgent/Menu
@@ -393,7 +464,7 @@ cat > /usr/local/opnsense/mvc/app/views/OPNsense/RMMAgent/general.volt << 'VOLTE
VOLTEOF
# configd actions
echo "[5/7] configd Actions installieren..."
echo "[5/8] configd Actions installieren..."
cat > /usr/local/opnsense/service/conf/actions.d/actions_rmmagent.conf << 'ACTEOF'
[start]
command:/usr/local/etc/rc.d/rmm_agent start
@@ -427,7 +498,7 @@ message:Reconfiguring RMM Agent
ACTEOF
# Setup-Script
echo "[6/7] Setup-Script installieren..."
echo "[6/8] Setup-Script installieren..."
mkdir -p /usr/local/opnsense/scripts/rmmagent
cat > /usr/local/opnsense/scripts/rmmagent/setup.sh << 'SETUPEOF'
#!/bin/sh
@@ -479,7 +550,7 @@ SETUPEOF
chmod +x /usr/local/opnsense/scripts/rmmagent/setup.sh
# Plugin Hook
echo "[7/7] Plugin-Hook registrieren..."
echo "[7/8] Plugin-Hook registrieren..."
cat > /usr/local/etc/inc/plugins.inc.d/rmmagent.inc << 'INCEOF'
<?php
use OPNsense\RMMAgent\RMMAgent;
@@ -508,6 +579,16 @@ INCEOF
rm -f /var/lib/php/cache/_usr_local_opnsense_mvc_app_views_opnsense_rmmagent_*.php
service configd restart
# Updater aktivieren
echo "[8/8] Updater aktivieren..."
if [ -f /usr/local/rmm/rmm-updater ]; then
sysrc rmm_updater_enable=YES 2>/dev/null || true
/usr/local/etc/rc.d/rmm_updater start 2>/dev/null || true
echo " Updater aktiviert und gestartet"
else
echo " Kein Updater-Binary — uebersprungen"
fi
echo ""
echo "========================================"
echo " RMM Agent Plugin installiert!"
@@ -0,0 +1,62 @@
#!/bin/sh
# PROVIDE: rmm_updater
# REQUIRE: NETWORKING rmm_agent
# KEYWORD: shutdown
. /etc/rc.subr
name="rmm_updater"
rcvar="${name}_enable"
command="/usr/local/rmm/rmm-updater"
pidfile="/var/run/${name}.pid"
command_args=""
start_cmd="${name}_start"
stop_cmd="${name}_stop"
status_cmd="${name}_status"
rmm_updater_start() {
if [ -f "$pidfile" ]; then
if kill -0 $(cat "$pidfile") 2>/dev/null; then
echo "${name} already running"
return 0
fi
rm -f "$pidfile"
fi
echo "Starting ${name}."
/usr/sbin/daemon -f -p "$pidfile" "$command" $command_args
}
rmm_updater_stop() {
if [ -f "$pidfile" ]; then
pid=$(cat "$pidfile")
if kill -0 "$pid" 2>/dev/null; then
echo "Stopping ${name}."
kill "$pid"
rm -f "$pidfile"
else
echo "${name} not running (stale pidfile)"
rm -f "$pidfile"
fi
else
echo "${name} not running"
fi
}
rmm_updater_status() {
if [ -f "$pidfile" ]; then
pid=$(cat "$pidfile")
if kill -0 "$pid" 2>/dev/null; then
echo "${name} is running as pid $pid"
return 0
fi
fi
echo "${name} is not running"
return 1
}
load_rc_config $name
: ${rmm_updater_enable:="NO"}
run_rc_command "$1"