diff --git a/satellite/README.md b/satellite/README.md index 6d2450e..c0a5a23 100644 --- a/satellite/README.md +++ b/satellite/README.md @@ -52,6 +52,29 @@ anspricht („Büro"). (`192.168.177.x`) — steht da `192.168.65.x` oder `172.x`, sitzt der Satellit im falschen (Docker-)Netz. +## Als Dienst installieren (Autostart, ohne Docker) + +Legt automatisch ein `.venv` an, installiert die Requirements und richtet einen +Dienst ein, der bei Boot startet und bei Absturz neu hochkommt. `.env` vorher +anlegen. + +**Linux (systemd) / macOS (launchd):** +```bash +cd satellite +bash install.sh # installieren + starten +bash install.sh uninstall # entfernen +``` +- Linux-Logs: `journalctl -u aria-satellite -f` +- macOS-Logs: `tail -f satellite.log` (evtl. „Lokales Netzwerk"-Zugriff erlauben) + +**Windows (Scheduled Task) — PowerShell als Administrator:** +```powershell +cd satellite +powershell -ExecutionPolicy Bypass -File install.ps1 # installieren + starten +powershell -ExecutionPolicy Bypass -File install.ps1 -Uninstall # entfernen +``` +- Log: `Get-Content -Wait satellite.log` + ## So nutzt ARIA es ARIA hat drei Brain-Tools: diff --git a/satellite/install.ps1 b/satellite/install.ps1 new file mode 100644 index 0000000..3c91d30 --- /dev/null +++ b/satellite/install.ps1 @@ -0,0 +1,87 @@ +<# + ARIA Satellit — Dienst-Installer fuer Windows (Scheduled Task, Autostart + Restart). + + powershell -ExecutionPolicy Bypass -File install.ps1 installiert + startet + powershell -ExecutionPolicy Bypass -File install.ps1 -Uninstall entfernt den Task + + Legt ein venv (.venv) an, installiert requirements.txt und richtet einen + geplanten Task ein, der satellite.py aus DIESEM Ordner startet (findet die .env) + und bei Absturz/Neustart wieder hochkommt. Laeuft als aktueller Nutzer (S4U), + auch ohne Anmeldung. Als Administrator ausfuehren. + + WICHTIG: Der Satellit muss im ECHTEN Ziel-LAN laufen (siehe README) — auf einer + Maschine, die physisch im Netz der Geraete haengt. Docker Desktop taugt nicht. +#> +param([switch]$Uninstall) + +$ErrorActionPreference = "Stop" +$Dir = Split-Path -Parent $MyInvocation.MyCommand.Path +$Task = "ARIA-Satellite" + +# ─── Uninstall ────────────────────────────────────────────────────── +if ($Uninstall) { + if (Get-ScheduledTask -TaskName $Task -ErrorAction SilentlyContinue) { + Unregister-ScheduledTask -TaskName $Task -Confirm:$false + Write-Host "Task '$Task' entfernt." + } else { + Write-Host "Kein Task '$Task' gefunden." + } + exit 0 +} + +# ─── Admin-Check ──────────────────────────────────────────────────── +$isAdmin = ([Security.Principal.WindowsPrincipal] ` + [Security.Principal.WindowsIdentity]::GetCurrent() + ).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) +if (-not $isAdmin) { + Write-Warning "Bitte als Administrator ausfuehren (Rechtsklick PowerShell -> Als Administrator)." + exit 1 +} + +# ─── Python finden ────────────────────────────────────────────────── +$py = (Get-Command python -ErrorAction SilentlyContinue).Source +if (-not $py) { $py = (Get-Command python3 -ErrorAction SilentlyContinue).Source } +if (-not $py) { Write-Error "Python 3 nicht gefunden. Bitte von python.org installieren (mit 'Add to PATH')."; exit 1 } + +# ─── venv + Abhaengigkeiten ───────────────────────────────────────── +if (-not (Test-Path "$Dir\.venv")) { + Write-Host "[install] Lege venv an ..." + & $py -m venv "$Dir\.venv" +} +$venvPy = "$Dir\.venv\Scripts\python.exe" +Write-Host "[install] Installiere Abhaengigkeiten ..." +& $venvPy -m pip install --upgrade pip | Out-Null +& $venvPy -m pip install -r "$Dir\requirements.txt" + +if (-not (Test-Path "$Dir\.env")) { + Write-Warning "Keine .env gefunden - bitte anlegen: copy .env.example .env (RVS-Zugang + SATELLITE_LOCATION)" +} + +# ─── Scheduled Task ───────────────────────────────────────────────── +Write-Host "[install] Richte geplanten Task '$Task' ein ..." +# Ueber cmd starten, damit stdout/stderr in satellite.log landen (der Task laeuft +# in Session 0 / S4U = kein sichtbares Fenster, python.exe ist hier ok). +$logfile = Join-Path $Dir "satellite.log" +$cmdArg = '/c ""{0}" satellite.py >> "{1}" 2>&1"' -f $venvPy, $logfile +$action = New-ScheduledTaskAction -Execute "cmd.exe" -Argument $cmdArg -WorkingDirectory $Dir +$trigger = @( + New-ScheduledTaskTrigger -AtStartup + New-ScheduledTaskTrigger -AtLogOn +) +# Laeuft als aktueller Nutzer, auch ohne Anmeldung (S4U), mit hoechsten Rechten. +$principal = New-ScheduledTaskPrincipal -UserId "$env:USERDOMAIN\$env:USERNAME" ` + -LogonType S4U -RunLevel Highest +# Bei Absturz neu starten, unbegrenzte Laufzeit, startet nach falls Zeitpunkt verpasst, versteckt. +$settings = New-ScheduledTaskSettings -StartWhenAvailable -Hidden ` + -RestartCount 999 -RestartInterval (New-TimeSpan -Minutes 1) ` + -ExecutionTimeLimit (New-TimeSpan -Seconds 0) ` + -MultipleInstances IgnoreNew + +Register-ScheduledTask -TaskName $Task -Action $action -Trigger $trigger ` + -Principal $principal -Settings $settings -Force | Out-Null + +Start-ScheduledTask -TaskName $Task +Write-Host "OK Dienst laeuft." +Write-Host " Status: Get-ScheduledTask -TaskName $Task" +Write-Host " Stoppen: Stop-ScheduledTask -TaskName $Task" +Write-Host " Log: Get-Content -Wait '$logfile' (pruefen: primary_ip + '[scan] N Geraete')" diff --git a/satellite/install.sh b/satellite/install.sh new file mode 100755 index 0000000..b9e38aa --- /dev/null +++ b/satellite/install.sh @@ -0,0 +1,119 @@ +#!/usr/bin/env bash +# +# ARIA Satellit — Dienst-Installer fuer Linux (systemd) und macOS (launchd). +# +# bash install.sh installiert + startet den Dienst +# bash install.sh uninstall entfernt den Dienst +# +# Legt ein venv an (.venv), installiert requirements.txt und richtet einen +# Autostart-Dienst ein, der satellite.py aus DIESEM Ordner startet (damit die +# .env gefunden wird) und bei Absturz neu startet. +# +# WICHTIG: Der Satellit muss im ECHTEN Ziel-LAN laufen (siehe README) — auf einer +# Maschine, die physisch im Netz der Geraete haengt. Docker Desktop taugt nicht. +set -euo pipefail + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SVC="aria-satellite" +PLIST_LABEL="de.aria.satellite" +OS="$(uname -s)" +ACTION="${1:-install}" + +# ─── Uninstall ────────────────────────────────────────────────────── +if [ "$ACTION" = "uninstall" ]; then + if [ "$OS" = "Linux" ]; then + SUDO=""; [ "$(id -u)" -ne 0 ] && SUDO="sudo" + $SUDO systemctl disable --now "$SVC" 2>/dev/null || true + $SUDO rm -f "/etc/systemd/system/$SVC.service" + $SUDO systemctl daemon-reload + echo "systemd-Dienst '$SVC' entfernt." + elif [ "$OS" = "Darwin" ]; then + PLIST="$HOME/Library/LaunchAgents/$PLIST_LABEL.plist" + launchctl unload "$PLIST" 2>/dev/null || true + rm -f "$PLIST" + echo "launchd-Agent '$PLIST_LABEL' entfernt." + fi + exit 0 +fi + +# ─── venv + Abhaengigkeiten ───────────────────────────────────────── +PY="$(command -v python3 || command -v python || true)" +[ -n "$PY" ] || { echo "Python 3 nicht gefunden. Bitte installieren."; exit 1; } + +if [ ! -d "$DIR/.venv" ]; then + echo "[install] Lege venv an …" + if ! "$PY" -m venv "$DIR/.venv" 2>/dev/null; then + echo "venv-Erstellung fehlgeschlagen. Auf Debian/Ubuntu: sudo apt install python3-venv" + exit 1 + fi +fi +VENV_PY="$DIR/.venv/bin/python" +echo "[install] Installiere Abhaengigkeiten …" +"$VENV_PY" -m pip install --upgrade pip >/dev/null +"$VENV_PY" -m pip install -r "$DIR/requirements.txt" + +if [ ! -f "$DIR/.env" ]; then + echo "⚠ Keine .env gefunden — bitte anlegen: cp .env.example .env (RVS-Zugang + SATELLITE_LOCATION)" +fi + +# ─── Dienst einrichten ────────────────────────────────────────────── +if [ "$OS" = "Linux" ]; then + RUN_USER="${SUDO_USER:-$(id -un)}" + UNIT="/etc/systemd/system/$SVC.service" + SUDO=""; [ "$(id -u)" -ne 0 ] && SUDO="sudo" + echo "[install] Schreibe systemd-Unit $UNIT (User=$RUN_USER) …" + $SUDO tee "$UNIT" >/dev/null < "$PLIST" < + + + + Label$PLIST_LABEL + ProgramArguments + + $VENV_PY + $DIR/satellite.py + + WorkingDirectory$DIR + RunAtLoad + KeepAlive + StandardOutPath$DIR/satellite.log + StandardErrorPath$DIR/satellite.log + + +EOF + launchctl unload "$PLIST" 2>/dev/null || true + launchctl load "$PLIST" + echo "✅ Agent geladen." + echo " Logs: tail -f $DIR/satellite.log" + echo " Hinweis: macOS fragt evtl. nach 'Lokales Netzwerk'-Zugriff — erlauben, sonst findet der Satellit keine Geraete." +else + echo "Unbekanntes OS: $OS (dieses Skript kann Linux/macOS; fuer Windows: install.ps1)" + exit 1 +fi