Servidor de actualización Windows
Obtención del script
Para obtener los archivos necesarios en el servidor de actualización, proporcionamos un script PowerShell. Puede descargarlo en su navegador o desde una terminal:
- PowerShell
(New-Object System.Net.WebClient).DownloadFile("https://repos.passwork.pro/repository/powershell/get_desktops.ps1", "$pwd\get_desktops.ps1")
Ventajas
- Descarga solo la versión requerida de nuestro repositorio — la que coincide con su backend. El repositorio remoto se utiliza como fuente de archivos, no de versión: aloja todas las versiones de la aplicación de escritorio. Qué
XXYYdescargar lo determina el script desde la API o un archivo local. - Admite proxy (
HTTP_PROXY), importante en redes aisladas que acceden a internet mediante proxy. - Puede ejecutarse según una programación (cron / Task Scheduler) para que el servidor de actualización se mantenga sincronizado con su backend.
De dónde proviene la versión (qué XXYY descargar):
- API del backend — si se define
PASSWORK_DOMAIN, el script solicita la versión de escritorio disponible mediante la API de su servidor Passwork y descarga elXXYYcorrespondiente. - Archivo local — el archivo
LOCAL_VERSIONS_FILEcontiene una línea con la versión.
No se utilizan otras fuentes de versión: el repositorio de archivos se usa solo para descargar, no para determinar la versión.
Cada ejecución descarga una versión XXYY. Si el backend cambia a una versión nueva — en la siguiente ejecución el script obtendrá el nuevo XXYY (desde la API o el archivo actualizado) y descargará los archivos de actualización.
Variables
| Variable | Descripción |
|---|---|
REPO_BASE_URL | URL del repositorio con los instaladores de escritorio (fuente de archivos). |
OUTPUT_DIR | Directorio para los archivos guardados (raíz del servidor de actualización o una copia). |
PASSWORK_DOMAIN | URL del backend para solicitar la versión vía API (recomendado si es accesible). |
LOCAL_VERSIONS_FILE | Ruta al archivo de versiones cuando no se usa la API. |
HTTP_PROXY | Proxy para peticiones salientes (ej. http://proxy:3128). |
LOG_FILE | Ruta al archivo de registro (opcional). |
STATUS_FILE | Ruta al archivo de estado para supervisión (opcional, véase «Supervisión»). |
KEEP_RELEASES | Cuántos directorios XXYY antiguos mantener en OUTPUT_DIR (por defecto 2). |
LOCK_FILE | Archivo de bloqueo para evitar ejecuciones simultáneas (Task Scheduler); cadena vacía para desactivar. |
Ejecución en modo prueba
- PowerShell
.\get_desktop.ps1 --dry-run
Ejecución
- PowerShell
# Una vez o según programación (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" # si es necesario
.\get_desktop.ps1
El script comprueba el espacio en disco, crea un bloqueo si es necesario para evitar que dos instancias se ejecuten a la vez (p. ej. desde Task Scheduler), compara los manifiestos con los archivos ya descargados y solo descarga cuando algo ha cambiado.
Supervisión
Para comprobar que la sincronización se ejecutó y el contenido está actualizado:
-
Código de salida del script
0— éxito; no se requiere actualización o actualización completada, o--dry-run.1— error (red, repositorio, espacio en disco, etc.).
Los sistemas de supervisión (Task Scheduler + script de comprobación, Zabbix, Prometheus, etc.) pueden usar el código de salida del script.
-
Archivo de estado (STATUS_FILE)
Si se defineSTATUS_FILE, el script sobrescribe este archivo tras cada ejecución con líneas en formatokey=value:status—okoerror;version— versión XXYY actual (o vacío si error antes de determinar la versión);timestamp— hora en UTC (ISO);message— mensaje breve (ej. «Update complete for version 0002» o «All latest YAML unchanged»).
Contenido de ejemplo tras una ejecución correcta:
- shell
status=ok
version=0002
timestamp=2025-02-17T12:00:00Z
message=Update complete for version 0002
En caso de error (incluido antes de determinar la versión), el script escribe status=error y opcionalmente message=exit N. Para supervisión: leer STATUS_FILE, comprobar que status=ok y opcionalmente la vigencia vía timestamp o la existencia de OUTPUT_DIR\<version>\latest.yml.
- Registro (LOG_FILE)
Si se defineLOG_FILE, todos los mensajes del script se escriben ahí. Puede buscar en el registro errores o líneas como «Update complete» / «Repository unreachable».
Ejemplo de comprobación para supervisión (PowerShell):
- PowerShell
$env:STATUS_FILE = "C:\inetpub\wwwroot\passwork\updates\.sync_status"
.\get_desktop.ps1
# Comprobar tras la ejecución (o desde otro script programado):
$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" }
# o por vigencia (ej. no más de 25 horas):
$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" }