Saltar al contenido principal

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:

(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é XXYY descargar 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):

  1. 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 el XXYY correspondiente.
  2. Archivo local — el archivo LOCAL_VERSIONS_FILE contiene 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

VariableDescripción
REPO_BASE_URLURL del repositorio con los instaladores de escritorio (fuente de archivos).
OUTPUT_DIRDirectorio para los archivos guardados (raíz del servidor de actualización o una copia).
PASSWORK_DOMAINURL del backend para solicitar la versión vía API (recomendado si es accesible).
LOCAL_VERSIONS_FILERuta al archivo de versiones cuando no se usa la API.
HTTP_PROXYProxy para peticiones salientes (ej. http://proxy:3128).
LOG_FILERuta al archivo de registro (opcional).
STATUS_FILERuta al archivo de estado para supervisión (opcional, véase «Supervisión»).
KEEP_RELEASESCuántos directorios XXYY antiguos mantener en OUTPUT_DIR (por defecto 2).
LOCK_FILEArchivo de bloqueo para evitar ejecuciones simultáneas (Task Scheduler); cadena vacía para desactivar.

Ejecución en modo prueba

.\get_desktop.ps1 --dry-run

Ejecución

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

  1. 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.
  2. Archivo de estado (STATUS_FILE)
    Si se define STATUS_FILE, el script sobrescribe este archivo tras cada ejecución con líneas en formato key=value:

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

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.

  1. Registro (LOG_FILE)
    Si se define LOG_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):

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