Files
Bridge-and-Join-s/deploy/ish/upgrade-ish.sh

109 lines
5.7 KiB
Bash
Executable File

#!/usr/bin/env bash
# upgrade-ish.sh — автоматическое обновление ПО «Интеграционный шлюз НРД» (igate)
# на Astra Linux (amd64). Конфигурация ИШ живёт в PostgreSQL и ПЕРЕЖИВАЕТ
# обновление — пакет заменяет только бинарники в /opt/nsd/igate.
#
# Дистрибутив — .deb с сайта НРД (стабильный URL, без авторизации):
# https://www.nsd.ru/media/integratsionnyj-shlyuz/<ver>/igate-<ver>-amd64.zip
# (внутри igate_<ver>_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=<id устанавливающего>, WD=/home).
mkdir -p "$DROPIN"
if [ -d "$WORK/dropin-backup" ]; then
cp -a "$WORK/dropin-backup/." "$DROPIN/"
else
cat > "$DROPIN/override.conf" <<EOF
[Service]
User=$SVC_USER
WorkingDirectory=/var/lib/igate
EOF
fi
# На случай, если postinst выставил числовой User= в основном юните — приведём к igate.
sed -i "s/^User=.*/User=$SVC_USER/" /etc/systemd/system/igate.service 2>/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 <<EOF
Дальнейшие шаги (TEST3, вручную либо через configure-ish.sql):
• параметры канала WSL для TEST3 миграцией НЕ переносятся — применить наш
configure-ish.sql (channels/parameters переживают обновление, но сверить);
• при ошибке «Сертификат издателя не найден» — пересобрать профиль
Справочника сертификатов (Валидата);
• для M2M включить: флаг «M2M переводы», fetchInterval=00:00:10,
время ожидания перед отправкой=00:00:01, папка ERRORS, автоуведомления
о приёме транзита, ignorePackageDirectoryStructure=True;
• config.xml businessLine=MOST — в bj: Настройка → НРД → «ИШ 107.0.0.904+».
Откат: systemctl stop igate && rm -rf $IGATE_DIR &&
tar xzf /var/backups/igate-$STAMP.tar.gz -C $(dirname "$IGATE_DIR") &&
systemctl start igate
EOF