#!/usr/bin/env bash # upgrade-ish.sh — автоматическое обновление ПО «Интеграционный шлюз НРД» (igate) # на Astra Linux (amd64). Конфигурация ИШ живёт в PostgreSQL и ПЕРЕЖИВАЕТ # обновление — пакет заменяет только бинарники в /opt/nsd/igate. # # Дистрибутив — .deb с сайта НРД (стабильный URL, без авторизации): # https://www.nsd.ru/media/integratsionnyj-shlyuz//igate--amd64.zip # (внутри igate__amd64.deb) + <...>-amd64sgn.zip (отделённая подпись). # # ⚠️ TEST3: миграция параметров канала WSL утилитой igate-mig НЕ предусмотрена # (см. obnovlenie107.pdf). Параметры канала WSL для TEST3 обновляются вручную # или нашим configure-ish.sql. Пароли БД у нас через trust — миграция паролей # в защищённое хранилище ОС не обязательна. # # Использование: # sudo ./upgrade-ish.sh /путь/к/igate-107-0-930-amd64.zip [/путь/к/...sgn.zip] # set -euo pipefail ZIP="${1:?укажите путь к igate-*-amd64.zip}" SGN="${2:-}" SVC_USER="igate" IGATE_DIR="/opt/nsd/igate" STAMP="$(date +%Y%m%d-%H%M%S)" WORK="$(mktemp -d)" trap 'rm -rf "$WORK"' EXIT log(){ echo -e "\n=== $* ==="; } [ "$(id -u)" = 0 ] || { echo "нужен root (sudo)"; exit 1; } log "1/8 Распаковка дистрибутива" unzip -o -q "$ZIP" -d "$WORK" DEB="$(ls "$WORK"/*.deb 2>/dev/null | head -1)" [ -n "$DEB" ] || { echo "в архиве нет .deb"; exit 1; } echo "пакет: $(basename "$DEB") версия: $(dpkg-deb -f "$DEB" Version)" if [ -n "$SGN" ]; then log "2/8 Подпись дистрибутива приложена: $(basename "$SGN")" echo "(проверку подписи выполняет средство НРД/Валидата — файл сохранён рядом)" else log "2/8 Файл подписи не передан — пропуск" fi log "3/8 Бэкап текущей установки и конфига сервиса" if [ -d "$IGATE_DIR" ]; then tar czf "/var/backups/igate-$STAMP.tar.gz" -C "$(dirname "$IGATE_DIR")" "$(basename "$IGATE_DIR")" 2>/dev/null || true echo "бэкап: /var/backups/igate-$STAMP.tar.gz" fi # Наш drop-in (WorkingDirectory=/var/lib/igate, User=igate) — сохраняем для восстановления. DROPIN="/etc/systemd/system/igate.service.d" [ -d "$DROPIN" ] && cp -a "$DROPIN" "$WORK/dropin-backup" && echo "drop-in сохранён" log "4/8 Остановка сервиса igate" systemctl stop igate 2>/dev/null || true # GUI и служба не должны работать одновременно с одной БД. pkill -u "$SVC_USER" -f '/opt/nsd/igate/igate/igate' 2>/dev/null || true log "5/8 Preseed debconf (без интерактива) и установка пакета" # postinst спрашивает igate/service (регистрация сервиса) и igate/shortcut. echo "igate igate/service boolean true" | debconf-set-selections echo "igate igate/shortcut boolean false" | debconf-set-selections # postinst использует logname → в неинтерактиве может падать; задаём SUDO_USER. export DEBIAN_FRONTEND=noninteractive if ! dpkg -i "$DEB"; then echo "dpkg сообщил об ошибке — пробуем довести зависимости" apt-get -f install -y || true fi log "6/8 Восстановление нашего drop-in и пользователя сервиса" # Пакет мог перезаписать igate.service (User=, WD=/home). mkdir -p "$DROPIN" if [ -d "$WORK/dropin-backup" ]; then cp -a "$WORK/dropin-backup/." "$DROPIN/" else cat > "$DROPIN/override.conf" </dev/null || true systemctl daemon-reload log "7/8 Запуск сервиса и проверка" systemctl start igate sleep 6 STATE="$(curl -s http://localhost:8090/api/admin/engine/state 2>/dev/null || true)" VER="$(grep -oE '"igate/[0-9.]+"' "$IGATE_DIR/igate/igate.deps.json" 2>/dev/null | head -1)" echo "engine/state: ${STATE:-нет ответа}" echo "версия: ${VER:-неизвестно}" log "8/8 Готово" cat <