#!/bin/sh
#
# RMM Agent Plugin Installer fuer OPNsense
#
# Usage:
# scp install.sh rmm-agent root@opnsense:/tmp/
# ssh root@opnsense '/bin/sh /tmp/install.sh'
#
# Oder remote:
# cat install.sh | ssh root@opnsense '/bin/sh'
#
set -e
BASEDIR="/tmp"
BINARY="${BASEDIR}/rmm-agent"
echo "========================================"
echo " RMM Agent Plugin Installer"
echo "========================================"
# Pruefen ob Binary vorhanden
if [ ! -f "${BINARY}" ]; then
echo "FEHLER: ${BINARY} nicht gefunden."
echo "Bitte vorher das Binary kopieren:"
echo " scp rmm-agent root@opnsense:/tmp/"
exit 1
fi
# Alten Agent stoppen falls vorhanden
echo "[1/7] Alten Agent stoppen..."
/usr/local/etc/rc.d/rmm_agent stop 2>/dev/null || true
pkill -9 -f rmm-agent 2>/dev/null || true
# Binary installieren
echo "[2/7] Binary installieren..."
mkdir -p /usr/local/rmm
cp "${BINARY}" /usr/local/rmm/rmm-agent
chmod +x /usr/local/rmm/rmm-agent
# rc.d Script
echo "[3/7] rc.d Service installieren..."
cat > /usr/local/etc/rc.d/rmm_agent << 'RCEOF'
#!/bin/sh
#
# PROVIDE: rmm_agent
# REQUIRE: NETWORKING
# KEYWORD: shutdown
. /etc/rc.subr
name="rmm_agent"
rcvar="rmm_agent_enable"
load_rc_config ${name}
: ${rmm_agent_enable:="NO"}
: ${rmm_agent_config:="/usr/local/rmm/config.yaml"}
: ${rmm_agent_logfile:="/var/log/rmm-agent.log"}
: ${rmm_agent_insecure:="YES"}
pidfile="/var/run/${name}.pid"
command="/usr/local/rmm/rmm-agent"
start_cmd="${name}_start"
stop_cmd="${name}_stop"
status_cmd="${name}_status"
rmm_agent_start()
{
if [ ! -f "${command}" ]; then
echo "rmm-agent binary not found: ${command}"
return 1
fi
if [ ! -f "${rmm_agent_config}" ]; then
echo "Config not found: ${rmm_agent_config}"
return 1
fi
echo "Starting ${name}."
INSECURE_FLAG=""
if checkyesno rmm_agent_insecure; then
INSECURE_FLAG="--insecure"
fi
/usr/sbin/daemon -f -p ${pidfile} -o ${rmm_agent_logfile} \
${command} --config ${rmm_agent_config} ${INSECURE_FLAG}
}
rmm_agent_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_agent_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
}
run_rc_command "$1"
RCEOF
chmod +x /usr/local/etc/rc.d/rmm_agent
# MVC Plugin installieren
echo "[4/7] OPNsense MVC Plugin installieren..."
# Model
mkdir -p /usr/local/opnsense/mvc/app/models/OPNsense/RMMAgent/Menu
cat > /usr/local/opnsense/mvc/app/models/OPNsense/RMMAgent/RMMAgent.xml << 'XMLEOF'
//OPNsense/rmmagent
1.0.0
RMM Agent Settings
0
Y
Y
/^https?:\/\/.+/
Gueltige URL erforderlich (https://host:port)
Y
/^.{8,}$/
API-Key muss mindestens 8 Zeichen lang sein
N
60
10
3600
Intervall zwischen 10 und 3600 Sekunden
1
Y
XMLEOF
cat > /usr/local/opnsense/mvc/app/models/OPNsense/RMMAgent/RMMAgent.php << 'PHPEOF'
/usr/local/opnsense/mvc/app/models/OPNsense/RMMAgent/Menu/Menu.xml << 'MENUEOF'
{{ partial("layout_partials/base_form", ['fields': generalForm, 'id': 'frm_GeneralSettings']) }}
VOLTEOF
# configd actions
echo "[5/7] 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
parameters:
type:script
message:Starting RMM Agent
[stop]
command:/usr/local/etc/rc.d/rmm_agent stop
parameters:
type:script
message:Stopping RMM Agent
[restart]
command:/usr/local/etc/rc.d/rmm_agent restart
parameters:
type:script
message:Restarting RMM Agent
[status]
command:/usr/local/etc/rc.d/rmm_agent status; exit 0
parameters:
type:script_output
message:Request RMM Agent status
[reconfigure]
command:/usr/local/opnsense/scripts/rmmagent/setup.sh
parameters:
type:script
message:Reconfiguring RMM Agent
ACTEOF
# Setup-Script
echo "[6/7] Setup-Script installieren..."
mkdir -p /usr/local/opnsense/scripts/rmmagent
cat > /usr/local/opnsense/scripts/rmmagent/setup.sh << 'SETUPEOF'
#!/bin/sh
CONFIGDIR="/usr/local/rmm"
CONFIGFILE="${CONFIGDIR}/config.yaml"
mkdir -p "${CONFIGDIR}"
# Config aus OPNsense Model generieren
BACKEND_URL=$(pluginctl -g OPNsense.rmmagent.general.BackendUrl 2>/dev/null)
API_KEY=$(pluginctl -g OPNsense.rmmagent.general.ApiKey 2>/dev/null)
INTERVAL=$(pluginctl -g OPNsense.rmmagent.general.Interval 2>/dev/null)
AGENT_NAME=$(pluginctl -g OPNsense.rmmagent.general.AgentName 2>/dev/null)
INSECURE=$(pluginctl -g OPNsense.rmmagent.general.Insecure 2>/dev/null)
ENABLED=$(pluginctl -g OPNsense.rmmagent.general.Enabled 2>/dev/null)
if [ -z "${INTERVAL}" ]; then
INTERVAL="60"
fi
cat > "${CONFIGFILE}" << EOF
backend_url: "${BACKEND_URL}"
api_key: "${API_KEY}"
interval_seconds: ${INTERVAL}
EOF
if [ -n "${AGENT_NAME}" ]; then
echo "agent_name: \"${AGENT_NAME}\"" >> "${CONFIGFILE}"
fi
# Insecure Flag
if [ "${INSECURE}" = "1" ]; then
sysrc rmm_agent_insecure="YES" > /dev/null 2>&1
else
sysrc rmm_agent_insecure="NO" > /dev/null 2>&1
fi
# Service steuern
if [ "${ENABLED}" = "1" ]; then
sysrc rmm_agent_enable="YES" > /dev/null 2>&1
/usr/local/etc/rc.d/rmm_agent restart
echo "RMM Agent gestartet"
else
/usr/local/etc/rc.d/rmm_agent stop 2>/dev/null
sysrc rmm_agent_enable="NO" > /dev/null 2>&1
echo "RMM Agent gestoppt"
fi
SETUPEOF
chmod +x /usr/local/opnsense/scripts/rmmagent/setup.sh
# Plugin Hook
echo "[7/7] Plugin-Hook registrieren..."
cat > /usr/local/etc/inc/plugins.inc.d/rmmagent.inc << 'INCEOF'
general->Enabled == '1') {
$services[] = array(
'description' => gettext('RMM Agent'),
'configd' => array(
'restart' => array('rmmagent restart'),
'start' => array('rmmagent start'),
'stop' => array('rmmagent stop'),
),
'name' => 'rmm_agent',
'pidfile' => '/var/run/rmm_agent.pid',
);
}
return $services;
}
INCEOF
# Cache loeschen und configd neustarten
rm -f /var/lib/php/cache/_usr_local_opnsense_mvc_app_views_opnsense_rmmagent_*.php
service configd restart
echo ""
echo "========================================"
echo " RMM Agent Plugin installiert!"
echo ""
echo " WebGUI: Services > RMM Agent"
echo " - Backend URL + API Key eintragen"
echo " - Aktiviert ankreuzen"
echo " - Speichern & Anwenden"
echo "========================================"