Zum Hauptinhalt springen

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:

(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 XXYY heruntergeladen 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:

  1. Backend-API — wenn PASSWORK_DOMAIN gesetzt ist, fordert das Skript die verfügbare Desktop-Version über die Passwork-Server-API an und lädt das entsprechende XXYY herunter.
  2. Lokale Datei — die Datei LOCAL_VERSIONS_FILE enthä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

VariableBeschreibung
REPO_BASE_URLURL des Repositorys mit den gebauten Desktop-Installern (Dateiquelle).
OUTPUT_DIRVerzeichnis für gespeicherte Dateien (Update-Server-Stamm oder Kopie).
PASSWORK_DOMAINBackend-URL für Versionsanfrage per API (empfohlen, wenn erreichbar).
LOCAL_VERSIONS_FILEPfad zur Versionsdatei, wenn die API nicht genutzt wird.
HTTP_PROXYProxy für ausgehende Anfragen (z. B. http://proxy:3128).
LOG_FILEPfad zur Protokolldatei (optional).
STATUS_FILEPfad zur Statusdatei für die Überwachung (optional, siehe „Monitoring“).
KEEP_RELEASESWie viele alte XXYY-Verzeichnisse in OUTPUT_DIR behalten werden (Standard 2).
LOCK_FILESperrdatei zur Vermeidung paralleler Läufe (Task Scheduler); leere Zeichenkette zum Deaktivieren.

Dry run

.\get_desktop.ps1 --dry-run

Ausführung

# 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:

  1. 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.
  2. Statusdatei (STATUS_FILE)
    Ist STATUS_FILE gesetzt, überschreibt das Skript diese Datei nach jedem Lauf mit Zeilen im Format key=value:

    • statusok oder error;
    • 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:

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.

  1. Protokoll (LOG_FILE)
    Ist LOG_FILE gesetzt, 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):

$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" }