Ключ: служба ключей Валидаты запускается надёжно — справочник собирается, как на Астре
На .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=""
|
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
|
if [ "$ACTION" = "restart-ish" ]; then
|
||||||
systemctl restart igate.service >/dev/null 2>&1 || systemctl restart igate-svc >/dev/null 2>&1 || true
|
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
|
echo '{"ok":true,"action":"restart-ish"}'; exit 0
|
||||||
@@ -213,7 +228,7 @@ fi
|
|||||||
[ -n "$TARGET_DEV" ] && attach_keymedia "$TARGET_DEV"
|
[ -n "$TARGET_DEV" ] && attach_keymedia "$TARGET_DEV"
|
||||||
|
|
||||||
# ---- зарегистрировать ключевой носитель (vdmkdev читает ключ с флешки) ----
|
# ---- зарегистрировать ключевой носитель (vdmkdev читает ключ с флешки) ----
|
||||||
systemctl restart vdmkdev.service >/dev/null 2>&1 || /etc/init.d/vdmkdev restart >/dev/null 2>&1 || true
|
keysvc_restart
|
||||||
sleep 2
|
sleep 2
|
||||||
|
|
||||||
# ---- ПЕРЕСОБРАТЬ совместимый справочник на флешке (архивный gdbm malformed) ----
|
# ---- ПЕРЕСОБРАТЬ совместимый справочник на флешке (архивный gdbm malformed) ----
|
||||||
@@ -314,17 +329,18 @@ keydiag(){ # что видит ИШ: смонтирована ли ключев
|
|||||||
local m v
|
local m v
|
||||||
m=$(findmnt -rn -o SOURCE,FSTYPE "$DEFAULT_KEYMEDIA" 2>/dev/null | grep -v autofs | head -1)
|
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' ' ')
|
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 [ "$IGATE_RES" = connected ] || [ "$IGATE_RES" = pending-channel ]; then
|
||||||
if ! keysign && [ -n "$TARGET_DEV" ] && [ -b "$TARGET_DEV" ] && \
|
if ! keysign; then
|
||||||
[ -z "$(findmnt -rn -o FSTYPE "$DEFAULT_KEYMEDIA" 2>/dev/null | grep -v autofs)" ]; then
|
if [ -n "$TARGET_DEV" ] && [ -b "$TARGET_DEV" ] && [ -z "$(findmnt -rn -o FSTYPE "$DEFAULT_KEYMEDIA" 2>/dev/null | grep -v autofs)" ]; then
|
||||||
# автомонтирование не сработало — смонтировать флешку напрямую (только чтение, под igate) и проверить ещё раз
|
# автомонтирование не сработало — смонтировать флешку напрямую (только чтение, под igate)
|
||||||
FT=$(blkid -s TYPE -o value "$TARGET_DEV" 2>/dev/null)
|
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
|
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
|
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
|
mkdir -p "$DEFAULT_KEYMEDIA"; mount -o "$MO" "$TARGET_DEV" "$DEFAULT_KEYMEDIA" 2>/dev/null
|
||||||
systemctl restart vdmkdev.service >/dev/null 2>&1; sleep 2
|
fi
|
||||||
|
keysvc_restart # служба ключей заново видит носитель
|
||||||
keysign
|
keysign
|
||||||
fi
|
fi
|
||||||
[ "$KEYCHECK" = ok ] || keydiag
|
[ "$KEYCHECK" = ok ] || keydiag
|
||||||
|
|||||||
Reference in New Issue
Block a user