#!/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 bauen (falls nicht vorhanden) if [ ! -f "${DIST_DIR}/mua" ]; then echo " Kompiliere Binary..." cd "${ROOT}" bun build src/index.ts --compile --target=bun-linux-x64 --outfile "${DIST_DIR}/mua" fi 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 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. |21 Tools: Docker (14), Netzwerk (6), System (1). |Port: 3002, Endpunkt: /mcp | |Runtime: TypeScript (Bun Runtime, kompiliertes Binary) |Service: /etc/rc.d/rc.mua (SysVinit) |WebGUI: Settings > 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 "===================================================="