Files
MUA-Mikes-Unraid-Agent/scripts/package.sh
T

146 lines
4.9 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"
# Kompakter Read-only-Helper für Unraid-Systemzustand
cp "${ROOT}/scripts/unraid-mcp-status-helper.php" "${BUILD_DIR}/usr/local/bin/unraid-mcp-status-helper.php"
chmod 755 "${BUILD_DIR}/usr/local/bin/unraid-mcp-status-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.
|34 Tools: Docker, Community Applications, Netzwerk und Unraid-System.
|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 "===================================================="