diff --git a/deploy/linux/sbin/bj-keymedia-install b/deploy/linux/sbin/bj-keymedia-install index 821b1ad..7b50ff0 100755 --- a/deploy/linux/sbin/bj-keymedia-install +++ b/deploy/linux/sbin/bj-keymedia-install @@ -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