<# 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-ScheduledTaskSettingsSet -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')"