Перейти к основному содержимому
Версия: 7.0

Сервер обновлений Windows

Получение скрипта

Для получения файлов, необходимых на сервере обновлений, мы предлагаем использовать PowerShell-скрипт. Вы можете скачать его из браузера или из терминала:

(New-Object System.Net.WebClient).DownloadFile("https://repos.passwork.ru/repository/powershell/get_desktops.ps1",  "$pwd\get_desktops.ps1")

Преимущества использования

  • Скачивает из нашего репозитория только нужную версию — согласованную с бэкендом. Удалённый репозиторий используется как источник файлов, но не как источник версии: в нём располагаются все версии десктопного приложения. Какую именно XXYY скачивать, скрипт определяет из API или локального файла.
  • Поддерживает прокси (HTTP_PROXY), что важно в закрытых сетях с выходом в интернет через прокси.
  • Можно запускать по расписанию (cron / Task Scheduler), чтобы сервер обновлений содержал актуальную для вашего бэкенда версию.

Откуда берётся версия (какой XXYY качать):

  1. API бэкенда — если задан PASSWORK_DOMAIN, скрипт запрашивает доступную версию десктопа через API вашего сервера Пассворк и скачивает соответствующий XXYY.
  2. Локальный файл — файл LOCAL_VERSIONS_FILE содержит строку с версией.

Других источников версии нет: репозиторий с файлами используется только для скачивания, не для определения версии.

За один запуск скачивается только одна версия XXYY. Если бэкенд переключился на новую версию — при следующем запуске скрипт получит новый XXYY (из API или обновлённого файла) и скачает файлы обновлений.

Основные переменные

ПеременнаяОписание
REPO_BASE_URLURL репозитория с собранными десктопами (источник файлов).
OUTPUT_DIRКаталог для сохраняемых файлов (корень сервера обновлений или его копия).
PASSWORK_DOMAINURL бэкенда для запроса версии через API (рекомендуется, если есть доступ).
LOCAL_VERSIONS_FILEПуть к файлу версий, если API не используется.
HTTP_PROXYПрокси для исходящих запросов (например http://proxy:3128).
LOG_FILEПуть к файлу лога (необязательно).
STATUS_FILEПуть к файлу статуса для мониторинга (необязательно, см. раздел «Мониторинг»).
KEEP_RELEASESСколько старых каталогов XXYY хранить в OUTPUT_DIR (по умолчанию 2).
LOCK_FILEФайл блокировки для предотвращения параллельного запуска (Планировщик заданий); пустая строка — отключить.

Тестовый запуск

.\get_desktop.ps1 --dry-run

Запуск

# Один раз или по расписанию (Планировщик заданий)
$env:PASSWORK_DOMAIN = "https://your-backend.example.com"
$env:OUTPUT_DIR = "C:\inetpub\wwwroot\passwork\updates"
$env:HTTP_PROXY = "http://proxy.example.com:3128" # при необходимости
.\get_desktop.ps1

Скрипт проверяет место на диске, при необходимости создаёт блокировку, чтобы не запускались два экземпляра скрипта одновременно (например, из Планировщика заданий), сравнивает манифесты с уже скачанными и качает только при изменениях.

Мониторинг

Чтобы проверять, что синхронизация отработала и контент актуален:

  1. Код выхода скрипта

    • 0 — успех, обновление не требовалось или успешно выполнено, либо режим --dry-run.
    • 1 — ошибка (сеть, репозиторий, место на диске и т.д.).
      Системы мониторинга (Планировщик заданий + скрипт проверки, Zabbix, Prometheus и т.п.) могут анализировать коды выходы скрипта.
  2. Файл статуса (STATUS_FILE)
    Если задана переменная STATUS_FILE, скрипт после каждого запуска перезаписывает этот файл строками формата key=value:

    • statusok или error;
    • version — актуальная версия XXYY (или пусто при ошибке до определения версии);
    • timestamp — время в UTC (ISO);
    • message — краткое сообщение (например «Update complete for version 0002» или «All latest YAML unchanged»).

    Пример содержимого после успешного запуска:

status=ok
version=0002
timestamp=2025-02-17T12:00:00Z
message=Update complete for version 0002

При ошибке (в том числе до определения версии) скрипт пишет status=error и при необходимости message=exit N. Проверка в мониторинге: читать STATUS_FILE, убедиться, что status=ok, и при желании проверить актуальность по timestamp или наличие каталога OUTPUT_DIR\<version>\latest.yml.

  1. Лог (LOG_FILE)
    Если задан LOG_FILE, туда пишутся все сообщения скрипта. Можно анализировать лог на наличие ошибок или строк вроде «Update complete» / «Repository unreachable».

Пример проверки для мониторинга (PowerShell):

$env:STATUS_FILE = "C:\inetpub\wwwroot\passwork\updates\.sync_status"
.\get_desktop.ps1

# Проверка после запуска (или из другого скрипта по расписанию):
$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" }

# или по актуальности (например, не старше 25 часов):
$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" }