124 lines
3.8 KiB
Bash
Executable File

#!/bin/sh
#
# Build OPNsense RMM Agent Plugin Package
#
# Usage: ./build.sh [version]
# Example: ./build.sh 1.0.0
#
# Prerequisites:
# - Go 1.24+ (for cross-compilation)
# - FreeBSD pkg tools (runs on the target OPNsense, or use pkg-create on FreeBSD)
#
# This script:
# 1. Cross-compiles the agent binary (freebsd/amd64)
# 2. Assembles the staging directory
# 3. Creates a +MANIFEST for pkg
# 4. Outputs a .tar that can be installed with `pkg add`
set -e
VERSION="${1:-1.0.0}"
NAME="os-rmm-agent"
STAGEDIR="$(pwd)/stage"
BUILDDIR="$(pwd)/../build"
PKGFILE="$(pwd)/${NAME}-${VERSION}.pkg"
echo "==> Building RMM Agent Plugin v${VERSION}"
# 1. Build agent binary
echo "==> Compiling agent (freebsd/amd64)..."
cd ../agent
GOOS=freebsd GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-s -w" -o "${BUILDDIR}/rmm-agent" .
cd ../opnsense-plugin
echo " Binary: ${BUILDDIR}/rmm-agent ($(ls -lh ${BUILDDIR}/rmm-agent | awk '{print $5}'))"
# 2. Assemble staging directory
echo "==> Assembling staging directory..."
rm -rf "${STAGEDIR}"
mkdir -p "${STAGEDIR}/usr/local"
# Plugin files
cp -R src/etc "${STAGEDIR}/usr/local/"
cp -R src/opnsense "${STAGEDIR}/usr/local/"
cp -R src/usr/local/etc "${STAGEDIR}/usr/local/"
mkdir -p "${STAGEDIR}/usr/local/rmm"
cp "${BUILDDIR}/rmm-agent" "${STAGEDIR}/usr/local/rmm/rmm-agent"
# Set permissions
chmod +x "${STAGEDIR}/usr/local/rmm/rmm-agent"
chmod +x "${STAGEDIR}/usr/local/etc/rc.d/rmm_agent"
chmod +x "${STAGEDIR}/usr/local/opnsense/scripts/rmmagent/setup.sh"
chmod +x "${STAGEDIR}/usr/local/opnsense/scripts/OPNsense/RMMAgent/generate_config.php"
# 3. Create +COMPACT_MANIFEST and +MANIFEST (UCL format)
echo "==> Creating package manifest..."
cat > "${STAGEDIR}/+COMPACT_MANIFEST" << EOF
{
"name": "${NAME}",
"version": "${VERSION}",
"origin": "sysutils/${NAME}",
"comment": "RMM Agent for OPNsense",
"maintainer": "cm@cynfo.com",
"www": "https://git.cynfo.net/christian/rmm",
"abi": "FreeBSD:14:amd64",
"arch": "freebsd:14:x86:64",
"prefix": "/usr/local",
"desc": "RMM Agent for OPNsense - Remote Monitoring and Management. Configurable via WebGUI under Services > RMM Agent.",
"categories": ["sysutils"]
}
EOF
# +MANIFEST = +COMPACT_MANIFEST plus files/scripts
cp "${STAGEDIR}/+COMPACT_MANIFEST" "${STAGEDIR}/+MANIFEST"
# Post-install script
cat > "${STAGEDIR}/+POST_INSTALL" << 'SCRIPT'
#!/bin/sh
/usr/local/etc/rc.d/opnsense-configd restart 2>/dev/null
echo ""
echo "====================================="
echo " RMM Agent Plugin installed."
echo " Configure: Services > RMM Agent"
echo "====================================="
SCRIPT
# Pre-deinstall script
cat > "${STAGEDIR}/+PRE_DEINSTALL" << 'SCRIPT'
#!/bin/sh
/usr/local/etc/rc.d/rmm_agent stop 2>/dev/null || true
/usr/sbin/sysrc -x rmm_agent_enable 2>/dev/null || true
SCRIPT
# Post-deinstall script
cat > "${STAGEDIR}/+POST_DEINSTALL" << 'SCRIPT'
#!/bin/sh
/usr/local/etc/rc.d/opnsense-configd restart 2>/dev/null
echo "RMM Agent Plugin removed."
SCRIPT
chmod +x "${STAGEDIR}/+POST_INSTALL" "${STAGEDIR}/+PRE_DEINSTALL" "${STAGEDIR}/+POST_DEINSTALL"
# 4. Create package using tar (FreeBSD txz pkg format)
echo "==> Creating package..."
cd "${STAGEDIR}"
# pkg expects: +COMPACT_MANIFEST, +MANIFEST at root, files under usr/
tar -cJf "${PKGFILE}" +COMPACT_MANIFEST +MANIFEST +POST_INSTALL +PRE_DEINSTALL +POST_DEINSTALL $(find usr -type f | sort)
cd ..
rm -rf "${STAGEDIR}"
echo ""
echo "==> Package erstellt: ${PKGFILE}"
echo " Version: ${VERSION}"
echo " Groesse: $(ls -lh ${PKGFILE} | awk '{print $5}')"
echo ""
echo "==> Installation auf OPNsense:"
echo " scp ${PKGFILE} root@opnsense:/tmp/"
echo " ssh root@opnsense 'pkg add /tmp/${NAME}-${VERSION}.pkg'"
echo ""
echo "==> Danach:"
echo " - WebGUI oeffnen → Services → RMM Agent"
echo " - Backend URL und API Key eintragen"
echo " - Aktiviert ankreuzen → Speichern"