Ключ подписи: можно взять ключ, который уже на флешке, — без архива НРД

На шаге 1 мастера ключа — второй путь «Ключ уже на флешке»: выбор флешки и
«Взять ключ с флешки». Флешка только читается (bj-keymedia-install stage-media):
ключ (*.vdk) и справочник (local.pse + local.gdbm; раскладка bj — профиль с
key.reg) копируются во временный каталог в раскладке архива, дальше — обычная
установка на ту же флешку под тем же именем профиля (резервная копия флешки,
пересборка справочника, профиль ИШ, перезапуск). Ключ без справочника — понятный
отказ: справочник есть только в архиве НРД. Устройство — только из обнаруженных
съёмных.

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:01:37 +03:00
parent 603c7b09bd
commit b58c4fb898
3 changed files with 107 additions and 5 deletions
+32
View File
@@ -88,6 +88,38 @@ if [ "$ACTION" = "certs-apply" ]; then
echo "{\"ok\":true,\"profile\":\"$PROFILE_NAME\",\"backup\":\"$BK\",\"igate\":\"$ACT\",\"rebuild\":$OUT,\"certs\":$(certs_list_json)}"; exit 0
fi
# ---- ключ уже на флешке: взять с неё ключ и справочник (только чтение) во временный каталог — дальше обычная
# установка (тот же носитель, то же имя профиля). Раскладка bj: <профиль>/key.reg + <профиль>/spr<N>/local.{pse,gdbm}
# + vdkeys/*.vdk; другая — ключ (*.vdk) и справочник (local.gdbm + local.pse) где угодно на носителе.
if [ "$ACTION" = "stage-media" ]; then
MNT="$TARGET_MNT"; RO_MNT=""
if [ -z "$MNT" ]; then
[ -n "$TARGET_DEV" ] || err "не выбран носитель"
RO_MNT="/run/bj-keymedia-ro-$$"; mkdir -p "$RO_MNT"
mount -o ro "$TARGET_DEV" "$RO_MNT" || { rmdir "$RO_MNT"; err "не смонтировать $TARGET_DEV"; }
MNT="$RO_MNT"
fi
done_ro(){ [ -n "$RO_MNT" ] && { umount "$RO_MNT" 2>/dev/null; rmdir "$RO_MNT" 2>/dev/null; }; }
VDKF=$(find "$MNT" -maxdepth 4 -iname '*.vdk' 2>/dev/null | sort | head -1)
GD=$(find "$MNT" -maxdepth 5 -iname 'local.gdbm' 2>/dev/null | sort | head -1)
[ -n "$VDKF" ] || { done_ro; err "на носителе нет ключа (файла *.vdk)"; }
[ -n "$GD" ] && [ -f "$(dirname "$GD")/local.pse" ] || { done_ro; err "на носителе есть ключ, но нет справочника сертификатов (local.pse и local.gdbm) — загрузите архив ключа от НРД: справочник есть в нём"; }
SPR=$(dirname "$GD"); PROFD=$(dirname "$SPR")
ID="media-$(date -u +%Y%m%d%H%M%S)"; ST="/var/lib/bj/media/iso/$ID"; mkdir -p "$ST/vdkeys"
if [ "$PROFD" != "$MNT" ] && [ -f "$PROFD/key.reg" ]; then
cp -a "$PROFD"/. "$ST"/ 2>/dev/null; PNAME=$(basename "$PROFD") # профиль bj: key.reg + spr<N>/
else
cp -a "$SPR" "$ST"/ 2>/dev/null; PNAME="" # справочник без профиля bj — имя по номеру
fi
cp -f "$VDKF" "$ST/vdkeys/"
rm -rf "$ST/vdkeys/vdkeys" 2>/dev/null
chown -R bj:bj "$ST" 2>/dev/null
done_ro
case "$PNAME" in *[!A-Za-z0-9_-]*) PNAME="" ;; esac
printf '{"ok":true,"staging":"%s","vdk":"%s","profile":"%s","spr":"%s"}\n' "$ID" "$(basename "$VDKF")" "$PNAME" "$(basename "$SPR")"
exit 0
fi
[ -n "$STAGING" ] && [ -d "$STAGING" ] || err "staging не найден"
case "$STAGING" in /var/lib/bj/media/iso/*) : ;; *) err "staging вне зоны" ;; esac
VDK=$(find "$STAGING" -iname '*.vdk' | head -1)