feat: install ssh-monitor-watchdog on agent update (2.0.4-SAC)

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
PTah
2026-06-10 17:41:47 +10:00
parent e576671580
commit 7e5cad0231
3 changed files with 143 additions and 12 deletions
+1 -1
View File
@@ -7,7 +7,7 @@ IFS=$'\n\t'
# ============================================ # ============================================
CONFIG_FILE="/etc/ssh-monitor.conf" CONFIG_FILE="/etc/ssh-monitor.conf"
SSH_MONITOR_VERSION="2.0.3-SAC" SSH_MONITOR_VERSION="2.0.4-SAC"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
if [ -f "$SCRIPT_DIR/sac-client.sh" ]; then if [ -f "$SCRIPT_DIR/sac-client.sh" ]; then
+136 -5
View File
@@ -21,6 +21,7 @@ SUMMARY_CONFIG="—"
SUMMARY_GIT="—" SUMMARY_GIT="—"
SUMMARY_SERVICE_RESTART="—" SUMMARY_SERVICE_RESTART="—"
SUMMARY_UPDATER="—" SUMMARY_UPDATER="—"
SUMMARY_WATCHDOG="—"
CONFIG_FILE="/etc/ssh-monitor.conf" CONFIG_FILE="/etc/ssh-monitor.conf"
DEPLOY_INSTALL_PATH="/opt/scripts/update_ssh_monitor.sh" DEPLOY_INSTALL_PATH="/opt/scripts/update_ssh_monitor.sh"
@@ -28,6 +29,9 @@ EXPECTED_HEARTBEAT_INTERVAL_MINUTES=240
EXPECTED_WATCHDOG_MAX_HEARTBEAT_AGE=$((EXPECTED_HEARTBEAT_INTERVAL_MINUTES * 60 + 3600)) EXPECTED_WATCHDOG_MAX_HEARTBEAT_AGE=$((EXPECTED_HEARTBEAT_INTERVAL_MINUTES * 60 + 3600))
SAC_SPOOL_DIR_DEFAULT="/var/lib/ssh-monitor/sac-spool" SAC_SPOOL_DIR_DEFAULT="/var/lib/ssh-monitor/sac-spool"
SYSTEMD_UNIT_PATH="/etc/systemd/system/ssh-monitor.service" SYSTEMD_UNIT_PATH="/etc/systemd/system/ssh-monitor.service"
LOCAL_WATCHDOG_PATH="/usr/local/bin/ssh-monitor-watchdog"
WATCHDOG_SERVICE_PATH="/etc/systemd/system/ssh-monitor-watchdog.service"
WATCHDOG_TIMER_PATH="/etc/systemd/system/ssh-monitor-watchdog.timer"
# === Список переменных, объявленных в скрипте (для логирования при DEBUG=1) === # === Список переменных, объявленных в скрипте (для логирования при DEBUG=1) ===
SCRIPT_VARS=("UPDATE_DIR" "SCRIPT_NAME" "REPO_URL" "LOCAL_SCRIPT_PATH" "LOG_FILE" "DEBUG" "REMOTE_SCRIPT_PATH" "LOCAL_CHECKSUM" "REMOTE_CHECKSUM") SCRIPT_VARS=("UPDATE_DIR" "SCRIPT_NAME" "REPO_URL" "LOCAL_SCRIPT_PATH" "LOG_FILE" "DEBUG" "REMOTE_SCRIPT_PATH" "LOCAL_CHECKSUM" "REMOTE_CHECKSUM")
@@ -391,6 +395,7 @@ log_update_summary() {
log_action "конфиг: $SUMMARY_CONFIG" log_action "конфиг: $SUMMARY_CONFIG"
log_action "git: $SUMMARY_GIT" log_action "git: $SUMMARY_GIT"
log_action "updater ($DEPLOY_INSTALL_PATH): $SUMMARY_UPDATER" log_action "updater ($DEPLOY_INSTALL_PATH): $SUMMARY_UPDATER"
log_action "watchdog: $SUMMARY_WATCHDOG"
log_action "перезапуск ssh-monitor.service: $SUMMARY_SERVICE_RESTART" log_action "перезапуск ssh-monitor.service: $SUMMARY_SERVICE_RESTART"
log_action "полный лог: $LOG_FILE" log_action "полный лог: $LOG_FILE"
log_action "===========================" log_action "==========================="
@@ -720,12 +725,9 @@ deploy_install_systemd() {
say_step "systemd" say_step "systemd"
if [ -f "$SYSTEMD_UNIT_PATH" ]; then if [ -f "$SYSTEMD_UNIT_PATH" ]; then
say_info "Уже существует: $SYSTEMD_UNIT_PATH" say_info "Уже существует: $SYSTEMD_UNIT_PATH"
return 0 elif [ ! -f "$example" ]; then
fi
if [ ! -f "$example" ]; then
say_warn "Unit example не найден: $example" say_warn "Unit example не найден: $example"
return 0 else
fi
cp "$example" "$SYSTEMD_UNIT_PATH" cp "$example" "$SYSTEMD_UNIT_PATH"
if command -v systemctl &>/dev/null; then if command -v systemctl &>/dev/null; then
systemctl daemon-reload 2>/dev/null || true systemctl daemon-reload 2>/dev/null || true
@@ -734,6 +736,128 @@ deploy_install_systemd() {
else else
say_ok "Скопирован $SYSTEMD_UNIT_PATH (systemctl не найден)" say_ok "Скопирован $SYSTEMD_UNIT_PATH (systemctl не найден)"
fi fi
fi
ensure_watchdog_installed || true
}
find_watchdog_remote() {
local p="$UPDATE_DIR/$SCRIPT_NAME/ssh-monitor-watchdog"
if [ -f "$p" ]; then
printf '%s\n' "$p"
return 0
fi
return 1
}
sync_watchdog_script() {
WATCHDOG_CHANGED=0
local remote local_sum remote_sum
remote=$(find_watchdog_remote) || {
SUMMARY_WATCHDOG="скрипт не найден в клоне"
log_action "WARNING: ssh-monitor-watchdog не найден в клоне git"
return 0
}
remote_sum=$(file_sha256 "$remote")
if [ -z "$remote_sum" ]; then
SUMMARY_WATCHDOG="ошибка sha256 remote"
return 1
fi
if [ -f "$LOCAL_WATCHDOG_PATH" ]; then
local_sum=$(file_sha256 "$LOCAL_WATCHDOG_PATH")
if [ "$local_sum" = "$remote_sum" ]; then
log_action "ssh-monitor-watchdog: checksum совпадает, копирование не требуется"
return 0
fi
log_action "ssh-monitor-watchdog: обновление (sha ${local_sum:0:16}… → ${remote_sum:0:16}…)"
else
log_action "ssh-monitor-watchdog: локальный файл отсутствует, будет установлен"
fi
if ! cp "$remote" "$LOCAL_WATCHDOG_PATH"; then
SUMMARY_WATCHDOG="ошибка копирования"
log_action "ERROR: не удалось скопировать ssh-monitor-watchdog → $LOCAL_WATCHDOG_PATH"
return 1
fi
chmod 750 "$LOCAL_WATCHDOG_PATH"
WATCHDOG_CHANGED=1
SUMMARY_WATCHDOG="скрипт обновлён"
if [ "$DEPLOY_MODE" -eq 1 ]; then
say_ok "ssh-monitor-watchdog → $LOCAL_WATCHDOG_PATH"
fi
return 0
}
install_watchdog_systemd_units() {
local svc_example timer_example units_changed=0
svc_example="$UPDATE_DIR/$SCRIPT_NAME/ssh-monitor-watchdog.service.example"
timer_example="$UPDATE_DIR/$SCRIPT_NAME/ssh-monitor-watchdog.timer.example"
if [ ! -f "$svc_example" ] || [ ! -f "$timer_example" ]; then
log_action "WARNING: watchdog unit examples не найдены в клоне"
return 0
fi
if [ ! -f "$WATCHDOG_SERVICE_PATH" ] \
|| ! cmp -s "$svc_example" "$WATCHDOG_SERVICE_PATH" 2>/dev/null; then
cp "$svc_example" "$WATCHDOG_SERVICE_PATH"
units_changed=1
log_action "watchdog: установлен/обновлён $WATCHDOG_SERVICE_PATH"
fi
if [ ! -f "$WATCHDOG_TIMER_PATH" ] \
|| ! cmp -s "$timer_example" "$WATCHDOG_TIMER_PATH" 2>/dev/null; then
cp "$timer_example" "$WATCHDOG_TIMER_PATH"
units_changed=1
log_action "watchdog: установлен/обновлён $WATCHDOG_TIMER_PATH"
fi
if [ "$units_changed" -eq 1 ]; then
WATCHDOG_CHANGED=1
fi
if ! command -v systemctl &>/dev/null; then
log_action "watchdog: systemctl не найден, units только скопированы"
return 0
fi
systemctl daemon-reload 2>/dev/null || true
if systemctl enable ssh-monitor-watchdog.timer 2>/dev/null; then
log_action "watchdog: enable ssh-monitor-watchdog.timer"
fi
if systemctl start ssh-monitor-watchdog.timer 2>/dev/null; then
log_action "watchdog: start ssh-monitor-watchdog.timer"
if [ -z "$SUMMARY_WATCHDOG" ] || [ "$SUMMARY_WATCHDOG" = "—" ]; then
SUMMARY_WATCHDOG="timer активен"
elif [ "${WATCHDOG_CHANGED:-0}" -eq 1 ]; then
SUMMARY_WATCHDOG="${SUMMARY_WATCHDOG}; timer активен"
fi
else
log_action "WARNING: systemctl start ssh-monitor-watchdog.timer не выполнен"
fi
if [ "$DEPLOY_MODE" -eq 1 ] && [ "${WATCHDOG_CHANGED:-0}" -eq 1 ]; then
say_ok "watchdog: units + timer (ssh-monitor-watchdog.timer)"
fi
return 0
}
ensure_watchdog_installed() {
sync_watchdog_script || return 1
install_watchdog_systemd_units || return 1
if [ -z "$SUMMARY_WATCHDOG" ] || [ "$SUMMARY_WATCHDOG" = "—" ]; then
if [ -f "$LOCAL_WATCHDOG_PATH" ] && systemctl is-enabled ssh-monitor-watchdog.timer &>/dev/null; then
SUMMARY_WATCHDOG="без изменений (timer enabled)"
elif [ -f "$LOCAL_WATCHDOG_PATH" ]; then
SUMMARY_WATCHDOG="скрипт на месте, timer настроен"
else
SUMMARY_WATCHDOG="не установлен"
fi
fi
return 0
} }
deploy_install_self() { deploy_install_self() {
@@ -768,6 +892,8 @@ print_config_variables_help() {
/usr/local/bin/ssh-monitor --check-sac /usr/local/bin/ssh-monitor --check-sac
systemctl restart ssh-monitor.service systemctl restart ssh-monitor.service
systemctl status ssh-monitor.service systemctl status ssh-monitor.service
systemctl status ssh-monitor-watchdog.timer
systemctl list-timers | grep ssh-monitor-watchdog
EOF EOF
} }
@@ -929,6 +1055,11 @@ update_script() {
return 1 return 1
fi fi
WATCHDOG_CHANGED=0
if ! ensure_watchdog_installed; then
log_action "WARNING: установка watchdog завершилась с ошибкой"
fi
CONFIG_CHANGED=0 CONFIG_CHANGED=0
if ! ensure_ssh_monitor_config_from_example; then if ! ensure_ssh_monitor_config_from_example; then
log_update_summary log_update_summary
+1 -1
View File
@@ -1 +1 @@
2.0.3-SAC 2.0.4-SAC