Windows-Update-Server
Script beziehen
Um die benötigten Dateien auf dem Update-Server zu erhalten, stellen wir ein PowerShell-Skript bereit. Sie können es im Browser oder in einem Terminal herunterladen:
- PowerShell
(New-Object System.Net.WebClient).DownloadFile("https://repos.passwork.pro/repository/powershell/get_desktops.ps1", "$pwd\get_desktops.ps1")
Vorteile
- Lädt nur die erforderliche Version aus unserem Repository herunter — die zu Ihrem Backend passt. Das Remote-Repository dient als Dateiquelle, nicht als Versionsquelle: Es hostet alle Desktop-Anwendungsversionen. Welche
XXYYheruntergeladen wird, bestimmt das Skript über die API oder eine lokale Datei. - Unterstützt Proxy (
HTTP_PROXY), wichtig in isolierten Netzwerken, die über einen Proxy auf das Internet zugreifen. - Kann zeitgesteuert (cron / Task Scheduler) ausgeführt werden, damit der Update-Server mit Ihrem Backend synchron bleibt.
Woher die Version (welche XXYY herunterzuladen ist) kommt:
- Backend-API — wenn
PASSWORK_DOMAINgesetzt ist, fordert das Skript die verfügbare Desktop-Version über die Passwork-Server-API an und lädt das entsprechendeXXYYherunter. - Lokale Datei — die Datei
LOCAL_VERSIONS_FILEenthält eine Zeile mit der Version.
Es werden keine anderen Versionsquellen verwendet: Das Dateirepository wird nur zum Herunterladen genutzt, nicht zur Versionsbestimmung.
Jeder Lauf lädt eine XXYY-Version herunter. Wechselt das Backend auf eine neue Version — holt das Skript beim nächsten Lauf das neue XXYY (von der API oder der aktualisierten Datei) und lädt die Update-Dateien herunter.
Variablen
| Variable | Beschreibung |
|---|---|
REPO_BASE_URL | URL des Repositorys mit den gebauten Desktop-Installern (Dateiquelle). |
OUTPUT_DIR | Verzeichnis für gespeicherte Dateien (Update-Server-Stamm oder Kopie). |
PASSWORK_DOMAIN | Backend-URL für Versionsanfrage per API (empfohlen, wenn erreichbar). |
LOCAL_VERSIONS_FILE | Pfad zur Versionsdatei, wenn die API nicht genutzt wird. |
HTTP_PROXY | Proxy für ausgehende Anfragen (z. B. http://proxy:3128). |
LOG_FILE | Pfad zur Protokolldatei (optional). |
STATUS_FILE | Pfad zur Statusdatei für die Überwachung (optional, siehe „Monitoring“). |
KEEP_RELEASES | Wie viele alte XXYY-Verzeichnisse in OUTPUT_DIR behalten werden (Standard 2). |
LOCK_FILE | Sperrdatei zur Vermeidung paralleler Läufe (Task Scheduler); leere Zeichenkette zum Deaktivieren. |
Dry run
- PowerShell
.\get_desktop.ps1 --dry-run
Ausführung
- PowerShell
# Einmalig oder zeitgesteuert (Task Scheduler)
$env:PASSWORK_DOMAIN = "https://your-backend.example.com"
$env:OUTPUT_DIR = "C:\inetpub\wwwroot\passwork\updates"
$env:HTTP_PROXY = "http://proxy.example.com:3128" # bei Bedarf
.\get_desktop.ps1
Das Skript prüft den Speicherplatz, legt bei Bedarf eine Sperre an, damit nicht zwei Instanzen gleichzeitig laufen (z. B. durch Task Scheduler), vergleicht Manifeste mit bereits heruntergeladenen Dateien und lädt nur bei Änderungen herunter.
Monitoring
Um zu prüfen, ob die Synchronisation lief und der Inhalt aktuell ist:
-
Skript-Exitcode
0— Erfolg; keine Aktualisierung nötig oder Aktualisierung abgeschlossen, oder--dry-run.1— Fehler (Netzwerk, Repository, Speicherplatz usw.).
Überwachungssysteme (Task Scheduler + Prüfskript, Zabbix, Prometheus usw.) können den Skript-Exitcode nutzen.
-
Statusdatei (STATUS_FILE)
IstSTATUS_FILEgesetzt, überschreibt das Skript diese Datei nach jedem Lauf mit Zeilen im Formatkey=value:status—okodererror;version— aktuelle XXYY-Version (oder leer bei Fehler vor Versionsbestimmung);timestamp— Zeit in UTC (ISO);message— kurze Meldung (z. B. „Update complete for version 0002“ oder „All latest YAML unchanged“).
Beispielinhalt nach erfolgreichem Lauf:
- shell
status=ok
version=0002
timestamp=2025-02-17T12:00:00Z
message=Update complete for version 0002
Bei Fehler (auch vor Versionsbestimmung) schreibt das Skript status=error und optional message=exit N. Zur Überwachung: STATUS_FILE lesen, status=ok prüfen und optional die Aktualität über timestamp oder das Vorhandensein von OUTPUT_DIR\<version>\latest.yml.
- Protokoll (LOG_FILE)
IstLOG_FILEgesetzt, werden alle Skriptmeldungen dorthin geschrieben. Sie können das Protokoll auf Fehler oder Zeilen wie „Update complete“ / „Repository unreachable“ durchsuchen.
Beispielprüfung für Monitoring (PowerShell):
- PowerShell
$env:STATUS_FILE = "C:\inetpub\wwwroot\passwork\updates\.sync_status"
.\get_desktop.ps1
# Nach dem Lauf prüfen (oder aus einem anderen geplanten Skript):
$status = (Get-Content $env:STATUS_FILE | Where-Object { $_ -match '^status=' }) -replace '^status=', ''
if ($status -eq 'ok') { Write-Host "Sync OK" } else { Write-Host "Sync FAIL" }
# oder nach Aktualität (z. B. nicht älter als 25 Stunden):
$tsLine = Get-Content $env:STATUS_FILE | Where-Object { $_ -match '^timestamp=' }
$tsStr = ($tsLine -split '=', 2)[1]
$syncTime = [DateTime]::ParseExact($tsStr.Trim(), "yyyy-MM-ddTHH:mm:ss'Z'", [Globalization.CultureInfo]::InvariantCulture, [Globalization.DateTimeStyles]::AssumeUniversal)
$hoursOld = (Get-Date).ToUniversalTime().Subtract($syncTime).TotalHours
if ($hoursOld -le 25) { Write-Host "Sync recent" } else { Write-Host "Sync may be stale" }