New-ScheduledTaskSettings existiert nicht (CommandNotFound). Korrekt ist New-ScheduledTaskSettingsSet. venv/Requirements liefen bereits; nur die Task-Registrierung brach ab. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
88 lines
4.4 KiB
PowerShell
88 lines
4.4 KiB
PowerShell
<#
|
|
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')"
|