Ключ: мастер не пишет «Готово» при ошибке; справочник подготовленной флешки — как есть; проверка подписи

- Мастер смотрел не на итог установщика, а ставил галочки подряд: при «ошибке
  пересборки» и несформированном профиле ИШ показывал «Готово». Теперь этап с
  ошибкой — красный, причина — в сообщении, «Готово» — только когда справочник
  собран, профиль ИШ создан и ключ подписывает (оба пути — флешка и архив).
- Подготовленная флешка: справочник на ней уже совместимый (пересобран при первой
  установке) — если пересборка не удалась, берётся как есть (gdbm cf9a5713;
  архивный НРД ce9a5713 — только с пересборкой).
- В конце установки — проверка под igate: ключ подписывает проверочный документ
  профилем ИШ; не подписывает — понятная ошибка («вставлена ли флешка?»).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-10-06 18:41:10 +03:00
parent c616d83a5c
commit fb2fc15569
4 changed files with 74 additions and 5 deletions
+21 -3
View File
@@ -224,9 +224,17 @@ if [ -n "$SPRNAME" ] && [ -x "$REBUILD" ] && [ -f "$FLASH_SPR/local.pse" ]; then
sync
fi
# флешка уже подготовлена (use-media): её справочник совместим — пересобран при первой установке; пересборка
# не удалась (ключ подписи справочника не загрузился) — взять его как есть. Совместимый gdbm начинается с cf9a5713,
# архивный НРД — с ce9a5713 (его без пересборки ИШ не читает).
if [ "$NOWRITE" = 1 ] && [ "$REBUILD_RES" != ok ] && [ -f "$FLASH_SPR/local.gdbm" ] && \
[ "$(head -c4 "$FLASH_SPR/local.gdbm" | od -An -tx1 | tr -d ' \n')" = cf9a5713 ]; then
REBUILD_RES="as-is"
fi
# ---- сформировать профиль для ИШ (стораны на диске, ключ остаётся на флешке) ----
IGATE_RES="skip"
if [ "$REBUILD_RES" = "ok" ] && [ -d "$(dirname "$IGATE_PROFILES")" ]; then
if { [ "$REBUILD_RES" = "ok" ] || [ "$REBUILD_RES" = "as-is" ]; } && [ -d "$(dirname "$IGATE_PROFILES")" ]; then
IGP="$IGATE_PROFILES/$PROFILE"
rm -rf "$IGP"; mkdir -p "$IGP"
cp -f "$FLASH_SPR/local.pse" "$FLASH_SPR/local.gdbm" "$IGP"/ 2>/dev/null
@@ -293,6 +301,16 @@ PY
fi
fi
# ---- проверка: ключ подписывает под igate (как будет подписывать ИШ) — проверочный документ профилем ----
KEYCHECK="skip"
if [ "$IGATE_RES" = connected ] || [ "$IGATE_RES" = pending-channel ]; then
KT=$(mktemp -d); echo "bj key check" > "$KT/in"; chown -R igate:igate "$KT"
KO=$(timeout -k 5 60 runuser -u igate -- env HOME=/var/lib/igate LD_LIBRARY_PATH="$VDLIB" "$ZPKI" -sign -profile "$PROFILE" -registry -in "$KT/in" -out "$KT/out.p7s" 2>&1)
if [ -s "$KT/out.p7s" ]; then KEYCHECK=ok
else KEYCHECK="fail: $(printf '%s' "$KO" | grep -iE 'ошибк|результат|error' | head -1 | tr -d '"\\' | head -c 200)"; fi
rm -rf "$KT"
fi
finish; trap - EXIT
printf '{"ok":true,"profile":"%s","spr":"%s","vdk":"%s","backup":"%s","target":"%s","rebuild":"%s","igate":"%s","igate_profile_dir":"%s","keymedia":"%s","nowrite":%s}\n' \
"$PROFILE" "$SPRNAME" "$VDK_NAME" "$BACKUP" "$TARGET_MNT" "$REBUILD_RES" "$IGATE_RES" "$IGATE_PROFILES/$PROFILE" "$KEYMEDIA_UUID" "$([ "$NOWRITE" = 1 ] && echo true || echo false)"
printf '{"ok":true,"profile":"%s","spr":"%s","vdk":"%s","backup":"%s","target":"%s","rebuild":"%s","igate":"%s","igate_profile_dir":"%s","keymedia":"%s","nowrite":%s,"keycheck":"%s"}\n' \
"$PROFILE" "$SPRNAME" "$VDK_NAME" "$BACKUP" "$TARGET_MNT" "$REBUILD_RES" "$IGATE_RES" "$IGATE_PROFILES/$PROFILE" "$KEYMEDIA_UUID" "$([ "$NOWRITE" = 1 ] && echo true || echo false)" "$KEYCHECK"