142 lines
4.6 KiB
Bash
Executable File
142 lines
4.6 KiB
Bash
Executable File
#!/bin/bash
|
|
# MUA - Mikes Unraid Agent
|
|
# package.sh — Baut das Slackware .txz-Paket
|
|
#
|
|
# Struktur des .txz:
|
|
# install/doinst.sh
|
|
# install/slack-desc
|
|
# usr/local/bin/mua (kompiliertes Binary)
|
|
# etc/rc.d/rc.mua (SysVinit-Service)
|
|
# usr/local/emhttp/plugins/mua/mua.page (WebGUI-Tab)
|
|
#
|
|
# Cross-Platform: .txz ist ein xz-komprimiertes tar und funktioniert auf
|
|
# macOS sowie Linux.
|
|
|
|
set -euo pipefail
|
|
|
|
# macOS erzeugt beim Kopieren/Packen auf manchen Dateisystemen AppleDouble-
|
|
# Dateien (._*) und speichert die lokale UID/GID im Archiv. Auf Unraid kann
|
|
# das sogar /, /usr oder /etc auf UID 501 umhängen. Beides verhindern.
|
|
export COPYFILE_DISABLE=1
|
|
|
|
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
# Version aus package.json lesen (Argument überschreibt)
|
|
PKG_VERSION="$(python3 -c "import json;print(json.load(open('${ROOT}/package.json'))['version'])" 2>/dev/null || echo "")"
|
|
VERSION="${1:-${PKG_VERSION:-2026.08.18.r003}}"
|
|
PKG_NAME="mua"
|
|
ARCH="x86_64"
|
|
BUILD_NUM="1"
|
|
BUILD_DIR="${ROOT}/build/pkg"
|
|
DIST_DIR="${ROOT}/dist"
|
|
|
|
echo "===================================================="
|
|
echo " MUA - Paket-Builder"
|
|
echo " Version: ${VERSION}"
|
|
echo "===================================================="
|
|
|
|
# 1. Binary immer frisch bauen. Ein vorhandenes Binary darf niemals
|
|
# versehentlich in ein neues Sicherheits-Release übernommen werden.
|
|
echo " Kompiliere Binary..."
|
|
cd "${ROOT}"
|
|
bun build src/index.ts --compile --target=bun-linux-x64 --outfile "${DIST_DIR}/mua"
|
|
chmod +x "${DIST_DIR}/mua"
|
|
echo " Binary: $(du -h "${DIST_DIR}/mua" | cut -f1)"
|
|
|
|
# 2. Paket-Struktur aufbauen
|
|
rm -rf "${BUILD_DIR}"
|
|
mkdir -p "${BUILD_DIR}/install"
|
|
mkdir -p "${BUILD_DIR}/usr/local/bin"
|
|
mkdir -p "${BUILD_DIR}/etc/rc.d"
|
|
mkdir -p "${BUILD_DIR}/usr/local/emhttp/plugins/mua"
|
|
|
|
# Binary
|
|
cp "${DIST_DIR}/mua" "${BUILD_DIR}/usr/local/bin/mua"
|
|
chmod 755 "${BUILD_DIR}/usr/local/bin/mua"
|
|
|
|
# SysVinit-Service
|
|
cp "${ROOT}/scripts/rc.mua" "${BUILD_DIR}/etc/rc.d/rc.mua"
|
|
chmod 755 "${BUILD_DIR}/etc/rc.d/rc.mua"
|
|
|
|
# WebGUI-Tab
|
|
cp "${ROOT}/scripts/mua.page" "${BUILD_DIR}/usr/local/emhttp/plugins/mua/mua.page"
|
|
chmod 644 "${BUILD_DIR}/usr/local/emhttp/plugins/mua/mua.page"
|
|
|
|
# PHP-Helper (Write-Operationen: create/modify/update/rebuild)
|
|
cp "${ROOT}/scripts/unraid-docker-mcp-helper.php" "${BUILD_DIR}/usr/local/bin/unraid-docker-mcp-helper.php"
|
|
chmod 755 "${BUILD_DIR}/usr/local/bin/unraid-docker-mcp-helper.php"
|
|
|
|
# 3. doinst.sh (läuft nach Installation)
|
|
cat > "${BUILD_DIR}/install/doinst.sh" << 'DOEOF'
|
|
#!/bin/bash
|
|
# MUA doinst.sh — läuft nach Installation des .txz-Pakets
|
|
|
|
# Verzeichnisse
|
|
mkdir -p /var/log/plugins
|
|
touch /var/log/plugins/mua.log
|
|
touch /var/log/plugins/mua-audit.log
|
|
chmod 600 /var/log/plugins/mua.log /var/log/plugins/mua-audit.log
|
|
mkdir -p /boot/config/plugins/mua
|
|
|
|
# Service starten
|
|
/etc/rc.d/rc.mua start 2>/dev/null || true
|
|
|
|
# Health-Check
|
|
sleep 2
|
|
if curl -sf "http://127.0.0.1:3002/health" > /dev/null 2>&1; then
|
|
echo ""
|
|
echo " Health-Check: OK"
|
|
echo " Endpunkt: http://$(hostname -I | awk '{print $1}'):3002/mcp"
|
|
else
|
|
echo ""
|
|
echo " WARNUNG: Health-Check fehlgeschlagen"
|
|
echo " Logs: tail -f /var/log/plugins/mua.log"
|
|
fi
|
|
DOEOF
|
|
chmod 755 "${BUILD_DIR}/install/doinst.sh"
|
|
|
|
# 4. slack-desc (Paket-Beschreibung)
|
|
cat > "${BUILD_DIR}/install/slack-desc" << DESCEOF
|
|
|${PKG_NAME} (${PKG_NAME})
|
|
|
|
|
|${PKG_NAME} - Mikes Unraid Agent
|
|
|MCP over HTTP (Streamable HTTP) Server für Unraid.
|
|
|22 Tools: Docker (14), Netzwerk (6), System (2).
|
|
|Port: 3002, Endpunkt: /mcp
|
|
|
|
|
|Runtime: TypeScript (Bun Runtime, kompiliertes Binary)
|
|
|Service: /etc/rc.d/rc.mua (SysVinit)
|
|
|WebGUI: Settings > User Utilities > MUA
|
|
|
|
|
|Version: ${VERSION}
|
|
|Arch: ${ARCH}
|
|
|Build: ${BUILD_NUM}
|
|
DESCEOF
|
|
|
|
# 5. .txz erstellen (tar + xz — NICHT gzip, Unraid erwartet echtes xz)
|
|
mkdir -p "${DIST_DIR}"
|
|
TXZ_NAME="${PKG_NAME}-${VERSION}-${ARCH}-${BUILD_NUM}.txz"
|
|
echo " Erstelle ${TXZ_NAME}..."
|
|
find "${BUILD_DIR}" -name '._*' -delete
|
|
|
|
if tar --version 2>/dev/null | grep -q 'GNU tar'; then
|
|
TAR_OWNER_FLAGS=(--owner=0 --group=0 --numeric-owner)
|
|
else
|
|
TAR_OWNER_FLAGS=(--uid 0 --gid 0 --uname root --gname root)
|
|
fi
|
|
|
|
# Absichtlich nicht "." archivieren: Ein Archiveintrag für ./ darf beim
|
|
# Installieren niemals Eigentümer oder Modus des Unraid-Wurzelverzeichnisses
|
|
# überschreiben.
|
|
(
|
|
cd "${BUILD_DIR}"
|
|
tar --no-xattrs "${TAR_OWNER_FLAGS[@]}" -cf - etc install usr \
|
|
| xz -9 -c > "${DIST_DIR}/${TXZ_NAME}"
|
|
)
|
|
|
|
echo ""
|
|
echo "===================================================="
|
|
echo " Paket erstellt: dist/${TXZ_NAME}"
|
|
echo " Größe: $(du -h "${DIST_DIR}/${TXZ_NAME}" | cut -f1)"
|
|
echo " SHA256: $(shasum -a 256 "${DIST_DIR}/${TXZ_NAME}" | cut -d' ' -f1)"
|
|
echo "===================================================="
|