ИШ: этапы обновления шлюза в окне обновления bj, проверка нового ИШ, свежая версия в строке НРД
- окно обновления bj после перезапуска ведёт обновление ИШ по этапам (загрузка, остановка, резервная копия, установка, запуск, проверка) и закрывается только после проверки; пока шлюз обновляется, то же окно на любой странице - bj-igate-admin: этапы stop/backup/verify; после запуска сверяются версия, служба, движок, каналы и ключ с прежними (иначе автооткат), обмен с НРД - версия ИШ в строке НРД читается всегда заново (кэш 6 ч — только сайт НРД); после установки версии пересобираются сразу Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
@@ -73,19 +73,22 @@ run_as_igate_keyring() { # команда в сессии igate с разбло
|
||||
dbus-run-session -- bash -c 'eval "$(printf "%s\n" "$(cat "$HOME/.keyring-pass")" | gnome-keyring-daemon --replace --unlock --components=secrets,pkcs11 2>/dev/null)"; export GNOME_KEYRING_CONTROL; '"$1"
|
||||
}
|
||||
|
||||
channels_json() { # каналы ИШ: код, включён, адрес НРД, ключ, крипто, депонент, папка
|
||||
if runuser -u postgres -- psql -lqt 2>/dev/null | cut -d'|' -f1 | grep -qw "$DB"; then
|
||||
psqlq -c "select coalesce(json_agg(json_build_object('id',c.id,'code',c.code,'enabled',c.enable,
|
||||
'endpoint',(select value from parameters p where p.chanel_id=c.id and p.name='wslEndpoint'),
|
||||
'profile',(select value from parameters p where p.chanel_id=c.id and p.name='cryptography.profile'),
|
||||
'crypto',(select value from parameters p where p.chanel_id=c.id and p.name='cryptography.type'),
|
||||
'deponent',(select value from parameters p where p.chanel_id=c.id and p.name='repositoryCode'),
|
||||
'dir',(select value from parameters p where p.chanel_id=c.id and p.name='dir')) order by c.id),'[]') from channels c" 2>/dev/null || echo "[]"
|
||||
else echo "[]"; fi
|
||||
}
|
||||
|
||||
case "$cmd" in
|
||||
status)
|
||||
inst=false; [ -x "$IGATE_DIR/igate-svc/igate-svc" ] && inst=true
|
||||
svc=$(systemctl is-active igate 2>/dev/null); st=$(engine_state)
|
||||
chans="[]"
|
||||
if runuser -u postgres -- psql -lqt 2>/dev/null | cut -d'|' -f1 | grep -qw "$DB"; then
|
||||
chans=$(psqlq -c "select coalesce(json_agg(json_build_object('id',c.id,'code',c.code,'enabled',c.enable,
|
||||
'endpoint',(select value from parameters p where p.chanel_id=c.id and p.name='wslEndpoint'),
|
||||
'profile',(select value from parameters p where p.chanel_id=c.id and p.name='cryptography.profile'),
|
||||
'crypto',(select value from parameters p where p.chanel_id=c.id and p.name='cryptography.type'),
|
||||
'deponent',(select value from parameters p where p.chanel_id=c.id and p.name='repositoryCode'),
|
||||
'dir',(select value from parameters p where p.chanel_id=c.id and p.name='dir')) order by c.id),'[]') from channels c" 2>/dev/null || echo "[]")
|
||||
fi
|
||||
chans=$(channels_json)
|
||||
rb=""; BK=$(cat /var/backups/ish-last-backup.txt 2>/dev/null)
|
||||
[ -n "$BK" ] && [ -s "$BK/version" ] && [ -s "$BK/opt-nsd-igate.tar.gz" ] && [ -s "$BK/igate-db.dump" ] && [ -s "$BK/var-lib-igate.tar.gz" ] && rb=$(cat "$BK/version")
|
||||
echo "{\"ok\":true,\"installed\":$inst,\"version\":$(q "$(igate_version)"),\"service\":$(q "$svc"),\"engine\":$(q "$st"),\"rollback\":$(q "$rb"),\"channels\":${chans:-[]}}" ;;
|
||||
@@ -168,11 +171,14 @@ PY
|
||||
runuser -u postgres -- psql -qtAc "select pg_reload_conf()" >/dev/null
|
||||
fi
|
||||
|
||||
st install "установка пакета ИШ"
|
||||
oldv=""; [ -d "$IGATE_DIR" ] && oldv=$(igate_version)
|
||||
st stop "остановка ${oldv:+старого }ИШ${oldv:+ $oldv}"
|
||||
systemctl stop igate >/dev/null 2>&1 || true
|
||||
pkill -9 -u "$SVC_USER" -f igate-svc 2>/dev/null; pkill -9 -u "$SVC_USER" -f Xvfb 2>/dev/null; rm -f /tmp/CoreFxPipe_NSD.IGate.*
|
||||
if [ -d "$IGATE_DIR" ]; then
|
||||
st backup "резервная копия ИШ $oldv (программа, данные, база)"
|
||||
BK=/var/backups/ish-$(date +%Y%m%d-%H%M%S); mkdir -p "$BK"
|
||||
channels_json > "$BK/channels.json" # для проверки после обновления: каналы и ключи те же
|
||||
tar czf "$BK/opt-nsd-igate.tar.gz" -C "$(dirname "$IGATE_DIR")" "$(basename "$IGATE_DIR")" 2>/dev/null
|
||||
runuser -u postgres -- pg_dump -Fc "$DB" > "$BK/igate-db.dump" 2>/dev/null
|
||||
# для отката: данные ИШ (без флешки с ключом и кэша), юнит, обёртка запуска, версия
|
||||
@@ -188,6 +194,7 @@ PY
|
||||
newv=$(basename "$deb" | sed -E "s/^igate_([0-9.]+)-([0-9]+)_.*/\\1.\\2/") # igate_110.0-997_amd64.deb → 110.0.997
|
||||
die() { st rollback "$1 — откатываю к прежней версии"; echo "== ошибка обновления: $1 — откат"; BJ_RB_REASON="$1" BJ_RB_TO="$newv" /usr/local/sbin/bj-igate-admin rollback-now; exit 1; }
|
||||
fi
|
||||
st install "установка ${FULLBK:+нового }ИШ${newv:+ $newv}"
|
||||
echo "igate igate/service boolean false" | debconf-set-selections
|
||||
echo "igate igate/shortcut boolean false" | debconf-set-selections
|
||||
DEBIAN_FRONTEND=noninteractive dpkg -i --force-confnew "$deb" || { DEBIAN_FRONTEND=noninteractive apt-get -f install -y -qq || die "пакет ИШ не установился (dpkg)"; }
|
||||
@@ -264,7 +271,44 @@ SQL
|
||||
systemctl restart igate || die "служба igate не запустилась"
|
||||
wait_engine 120 || die "ИШ запущен, но движок не перешёл в Running за 2 минуты. Журнал ИШ: $DATA_DIR/logs-svc/log.txt"
|
||||
case "$(j file)" in /var/lib/bj/igate-upload/*) rm -f "$(j file)" ;; esac # загруженный архив больше не нужен (с образа — остаётся)
|
||||
st done "ИШ $(igate_version) установлен и работает; дальше — канал контура (TEST3 или боевой)" ;;
|
||||
if [ -n "${FULLBK:-}" ]; then
|
||||
# обновление: «готово» — только когда новый ИШ проверен; не прошло — die (автооткат к прежней версии)
|
||||
st verify "проверка нового ИШ: версия, служба, каналы, ключ, обмен с НРД"
|
||||
v=$(igate_version)
|
||||
[ "$v" = "$newv" ] || die "после установки версия ИШ $v, ожидалась $newv"
|
||||
echo "✓ версия ИШ $v"
|
||||
sleep 10
|
||||
[ "$(systemctl is-active igate)" = active ] && [ "$(engine_state)" = Running ] || die "ИШ $v остановился после запуска"
|
||||
echo "✓ служба igate работает, движок Running"
|
||||
now=$(channels_json)
|
||||
chk=$(python3 - "$FULLBK/channels.json" "$now" <<'PY'
|
||||
import json,sys
|
||||
keys=('code','enabled','endpoint','profile','crypto','deponent','dir')
|
||||
try: old=json.load(open(sys.argv[1]))
|
||||
except Exception: old=None
|
||||
new=json.loads(sys.argv[2] or '[]')
|
||||
pick=lambda l:[{k:c.get(k) for k in keys} for c in l]
|
||||
if old is not None and pick(old)!=pick(new):
|
||||
print('ERR каналы ИШ после обновления не совпадают с прежними: было %s, стало %s'%(pick(old),pick(new))); sys.exit()
|
||||
on=[c for c in new if c.get('enabled')]
|
||||
print('OK '+'; '.join('канал %s включён, ключ %s'%(c['code'],c.get('profile') or '—') for c in on) if on else 'OK каналов не настроено')
|
||||
PY
|
||||
)
|
||||
case "$chk" in OK*) echo "✓ ${chk#OK } — как до обновления" ;; *) die "${chk#ERR }" ;; esac
|
||||
xok=""
|
||||
if printf '%s' "$now" | grep -q '"enabled" : true'; then
|
||||
pid=$(pgrep -u "$SVC_USER" -f "$IGATE_DIR/igate-svc/igate-svc" | tail -1)
|
||||
for _ in $(seq 1 30); do
|
||||
grep -a "PID_$pid " "$DATA_DIR/logs-svc/log.txt" 2>/dev/null | grep -q -- '-> OK (HTTP 200)' && { xok=1; break; }
|
||||
sleep 3
|
||||
done
|
||||
# НРД не ответил — не повод откатывать (старая версия связаться тоже не сможет): итог с предупреждением
|
||||
[ -n "$xok" ] && echo "✓ обмен с НРД: запрос к НРД прошёл (HTTP 200)" || echo "⚠ за 90 с ИШ не получил ответа НРД — проверьте связь"
|
||||
fi
|
||||
st done "ИШ обновлён с $oldv до $v и проверен: служба и движок работают, каналы и ключ как до обновления${xok:+, обмен с НРД идёт}${xok:-; ответа НРД пока нет — проверьте связь}"
|
||||
else
|
||||
st done "ИШ $(igate_version) установлен и работает; дальше — канал контура (TEST3 или боевой)"
|
||||
fi ;;
|
||||
|
||||
rollback)
|
||||
pgrep -f "bj-igate-admin (install|rollback)-now" >/dev/null && err "установка или откат ИШ уже идёт"
|
||||
|
||||
Reference in New Issue
Block a user