Files
Bridge-and-Join-s/deploy/linux/sbin/bj-keymedia-worker
T
zuevav 414227796b Настройка: состояние служб ядра и модулей с перезапуском из админки
Модули работают отдельными службами (bj-npr, bj-quikexport, bj-lk), и когда
служба лежит, раздел модуля отвечает ошибкой связи, а администратору
предлагалось идти в консоль за systemctl status. Теперь в разделе «Обновления»
карточка «Службы»: состояние каждой службы, с какого времени, причина отказа
и кнопка «Перезапустить».

Состояние читаем обычным systemctl show — прав не требует. Перезапуск делает
root-демон bj-keymedia (тот же канал, что у установки обновлений) по закрытому
списку служб: чужую службу и сам демон отсюда не тронуть.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 19:28:58 +03:00

38 lines
1.9 KiB
Bash
Executable File

#!/bin/bash
# bj-keymedia-worker — демон обработки запросов установки ключа (host namespace).
REQDIR=/var/lib/bj/keymedia-requests
getf(){ python3 -c "import json;print(json.load(open('$1')).get('$2',''))" 2>/dev/null; }
process_one(){
local req="$1" id res action staging profile tdev tmnt extra out
id=$(basename "$req" .req); res="$REQDIR/$id.res"
action=$(getf "$req" action); staging=$(getf "$req" staging); profile=$(getf "$req" profile)
tdev=$(getf "$req" target_dev); tmnt=$(getf "$req" target_mnt); extra=$(getf "$req" extra)
rm -f "$req"
case "$action" in
quikexport-*) out=$(BJ_EXTRA="$extra" /usr/local/sbin/bj-quikexport-admin "${action#quikexport-}" "$staging" 2>&1) ;;
component-install) out=$(/usr/local/sbin/bj-component-install "$staging" 2>&1) ;;
# Перезапуск службы модуля из админки. Список закрытый: чужую службу
# (и сам этот демон) отсюда тронуть нельзя.
unit-restart)
case "$extra" in
bj-server|bj-npr|bj-quikexport|bj-lk|bj-crypto)
systemctl reset-failed "$extra" >/dev/null 2>&1
if err=$(systemctl restart "$extra" 2>&1); then
out="{\"ok\":true,\"output\":\"перезапущено: $extra\"}"
else
err=$(printf '%s' "$err" | tr -d '"\\' | tr '\n' ' ')
out="{\"ok\":false,\"error\":\"$extra: $err\"}"
fi ;;
*) out="{\"ok\":false,\"error\":\"недопустимая служба\"}" ;;
esac ;;
*) out=$(BJ_TARGET_DEV="$tdev" BJ_TARGET_MNT="$tmnt" BJ_EXTRA="$extra" /usr/local/sbin/bj-keymedia-install "$action" "$staging" "$profile" 2>&1) ;;
esac
printf '%s' "$out" > "$res.tmp"; chown bj:bj "$res.tmp" 2>/dev/null
mv -f "$res.tmp" "$res"
}
shopt -s nullglob
while true; do
for req in "$REQDIR"/*.req; do process_one "$req"; done
sleep 1
done