Ключ: служба ключей Валидаты запускается надёжно — справочник собирается, как на Астре

На .29 ключ с флешки не загружался ни у root (пересборка справочника: «Ошибка
загрузки ключа ЭП»), ни у igate (подпись: «Не найден ключ ЭП»), хотя флешка
смонтирована и ключ виден; на рабочем сервере та же проверка подписи — OK.
Перезапуск службы ключей (vdcrysvc, init-скрипт vdmkdev) мог молча не сработать на
свежем сервере: юнит появляется только после daemon-reload, а init-скрипт не
понимает restart. Теперь: daemon-reload, enable, restart (или stop/start), проверка,
что vdcrysvc работает; после неудачной подписи — перезапуск службы и повтор. В
диагностике — состояние службы ключей.

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 19:16:26 +03:00
parent 0b6c7915a7
commit a34fea80ed
+26 -10
View File
@@ -45,6 +45,21 @@ attach_keymedia(){
}
KEYMEDIA_UUID=""
# keysvc_restart — служба ключей Валидаты (vdcrysvc, init-скрипт vdmkdev): без неё ключ с носителя не
# загружается — ни для пересборки справочника (как на Астре), ни для подписи ИШ. На свежем сервере простой
# «systemctl restart vdmkdev» мог молча не сработать: юнит systemd появляется только после daemon-reload, а
# init-скрипт понимает лишь start/stop (restart — ошибка). Служба включается и при загрузке сервера.
keysvc_restart(){
systemctl daemon-reload >/dev/null 2>&1
systemctl enable vdmkdev.service >/dev/null 2>&1
if ! systemctl restart vdmkdev.service >/dev/null 2>&1; then
/etc/init.d/vdmkdev stop >/dev/null 2>&1; /etc/init.d/vdmkdev start >/dev/null 2>&1
fi
for _ in 1 2 3 4 5; do pgrep -x vdcrysvc >/dev/null && break; sleep 1; done
pgrep -x vdcrysvc >/dev/null || { /etc/init.d/vdmkdev start >/dev/null 2>&1; sleep 2; }
sleep 1
}
if [ "$ACTION" = "restart-ish" ]; then
systemctl restart igate.service >/dev/null 2>&1 || systemctl restart igate-svc >/dev/null 2>&1 || true
echo '{"ok":true,"action":"restart-ish"}'; exit 0
@@ -213,7 +228,7 @@ fi
[ -n "$TARGET_DEV" ] && attach_keymedia "$TARGET_DEV"
# ---- зарегистрировать ключевой носитель (vdmkdev читает ключ с флешки) ----
systemctl restart vdmkdev.service >/dev/null 2>&1 || /etc/init.d/vdmkdev restart >/dev/null 2>&1 || true
keysvc_restart
sleep 2
# ---- ПЕРЕСОБРАТЬ совместимый справочник на флешке (архивный gdbm malformed) ----
@@ -314,17 +329,18 @@ keydiag(){ # что видит ИШ: смонтирована ли ключев
local m v
m=$(findmnt -rn -o SOURCE,FSTYPE "$DEFAULT_KEYMEDIA" 2>/dev/null | grep -v autofs | head -1)
v=$(runuser -u igate -- env HOME=/var/lib/igate sh -c 'ls -1L "$HOME"/.Validata/vdkeys/*/*.vdk "$HOME"/.Validata/vdkeys/*.vdk 2>/dev/null' | xargs -r -n1 basename | tr '\n' ' ')
KEYDIAG="флешка в $DEFAULT_KEYMEDIA: ${m:-не смонтирована}; ключи, видимые ИШ: ${v:-нет}"
KEYDIAG="флешка в $DEFAULT_KEYMEDIA: ${m:-не смонтирована}; ключи, видимые ИШ: ${v:-нет}; служба ключей Валидаты (vdcrysvc): $(pgrep -x vdcrysvc >/dev/null && echo работает || echo 'не запущена')"
}
if [ "$IGATE_RES" = connected ] || [ "$IGATE_RES" = pending-channel ]; then
if ! keysign && [ -n "$TARGET_DEV" ] && [ -b "$TARGET_DEV" ] && \
[ -z "$(findmnt -rn -o FSTYPE "$DEFAULT_KEYMEDIA" 2>/dev/null | grep -v autofs)" ]; then
# автомонтирование не сработало — смонтировать флешку напрямую (только чтение, под igate) и проверить ещё раз
FT=$(blkid -s TYPE -o value "$TARGET_DEV" 2>/dev/null)
systemctl stop "$(systemd-escape -p --suffix=automount "$DEFAULT_KEYMEDIA")" 2>/dev/null; umount "$DEFAULT_KEYMEDIA" 2>/dev/null
case "$FT" in vfat|exfat|ntfs*) MO="ro,uid=$(id -u igate),gid=$(id -g igate),fmask=0133,dmask=0022" ;; *) MO="ro" ;; esac
mkdir -p "$DEFAULT_KEYMEDIA"; mount -o "$MO" "$TARGET_DEV" "$DEFAULT_KEYMEDIA" 2>/dev/null
systemctl restart vdmkdev.service >/dev/null 2>&1; sleep 2
if ! keysign; then
if [ -n "$TARGET_DEV" ] && [ -b "$TARGET_DEV" ] && [ -z "$(findmnt -rn -o FSTYPE "$DEFAULT_KEYMEDIA" 2>/dev/null | grep -v autofs)" ]; then
# автомонтирование не сработало — смонтировать флешку напрямую (только чтение, под igate)
FT=$(blkid -s TYPE -o value "$TARGET_DEV" 2>/dev/null)
systemctl stop "$(systemd-escape -p --suffix=automount "$DEFAULT_KEYMEDIA")" 2>/dev/null; umount "$DEFAULT_KEYMEDIA" 2>/dev/null
case "$FT" in vfat|exfat|ntfs*) MO="ro,uid=$(id -u igate),gid=$(id -g igate),fmask=0133,dmask=0022" ;; *) MO="ro" ;; esac
mkdir -p "$DEFAULT_KEYMEDIA"; mount -o "$MO" "$TARGET_DEV" "$DEFAULT_KEYMEDIA" 2>/dev/null
fi
keysvc_restart # служба ключей заново видит носитель
keysign
fi
[ "$KEYCHECK" = ok ] || keydiag