Ключ: служба ключей Валидаты запускается надёжно — справочник собирается, как на Астре
На .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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user