From 908f8958a42bcf60f7c61679081fd97cbae96024 Mon Sep 17 00:00:00 2001 From: PTah Date: Wed, 10 Jun 2026 17:25:19 +1000 Subject: [PATCH] feat: heartbeat 4h via HEARTBEAT_INTERVAL_MINUTES (2.0.2-SAC) Co-authored-by: Cursor --- ssh-monitor | 12 ++++++++++-- ssh-monitor-watchdog | 2 +- ssh-monitor.conf.example | 5 ++++- update_ssh_monitor.sh | 37 +++++++++++++++++++++++++++++++++++++ version.txt | 2 +- 5 files changed, 53 insertions(+), 5 deletions(-) diff --git a/ssh-monitor b/ssh-monitor index 32b0c22..97355da 100644 --- a/ssh-monitor +++ b/ssh-monitor @@ -7,7 +7,7 @@ IFS=$'\n\t' # ============================================ CONFIG_FILE="/etc/ssh-monitor.conf" -SSH_MONITOR_VERSION="2.0.1-SAC" +SSH_MONITOR_VERSION="2.0.2-SAC" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [ -f "$SCRIPT_DIR/sac-client.sh" ]; then @@ -51,6 +51,8 @@ MAIL_SMTP_SSL="0" # Конфигурация логов LOG_FILE="/var/log/ssh_monitor.log" LAST_HEARTBEAT_FILE="/var/log/last_heartbeat.txt" +# Интервал SAC agent.heartbeat (минуты). 240 = 4 ч. +HEARTBEAT_INTERVAL_MINUTES=240 LAST_REPORT_FILE="/var/log/last_daily_report.txt" DAILY_REPORT_ENABLED=1 DAILY_REPORT_HOUR=9 @@ -183,6 +185,7 @@ load_config() { local cfg_backup_webhook_url="${BACKUP_WEBHOOK_URL}" local cfg_log_file="${LOG_FILE}" local cfg_last_heartbeat_file="${LAST_HEARTBEAT_FILE}" + local cfg_heartbeat_interval_minutes="${HEARTBEAT_INTERVAL_MINUTES:-240}" local cfg_last_report_file="${LAST_REPORT_FILE}" local cfg_daily_report_enabled="${DAILY_REPORT_ENABLED:-1}" local cfg_daily_report_hour="${DAILY_REPORT_HOUR}" @@ -243,6 +246,10 @@ load_config() { BACKUP_WEBHOOK_URL="${BACKUP_WEBHOOK_URL:-$cfg_backup_webhook_url}" LOG_FILE="${LOG_FILE:-$cfg_log_file}" LAST_HEARTBEAT_FILE="${LAST_HEARTBEAT_FILE:-$cfg_last_heartbeat_file}" + HEARTBEAT_INTERVAL_MINUTES="${HEARTBEAT_INTERVAL_MINUTES:-$cfg_heartbeat_interval_minutes}" + if ! [[ "${HEARTBEAT_INTERVAL_MINUTES:-240}" =~ ^[0-9]+$ ]] || [ "${HEARTBEAT_INTERVAL_MINUTES:-0}" -lt 1 ]; then + HEARTBEAT_INTERVAL_MINUTES=240 + fi LAST_REPORT_FILE="${LAST_REPORT_FILE:-$cfg_last_report_file}" LAST_SSH_CHECK_FILE="${LAST_SSH_CHECK_FILE:-$cfg_last_ssh_check_file}" LAST_SUDO_CHECK_FILE="${LAST_SUDO_CHECK_FILE:-$cfg_last_sudo_check_file}" @@ -1911,8 +1918,9 @@ check_heartbeat() { local current_epoch current_epoch=$(date '+%s') local diff=$((current_epoch - last_heartbeat_epoch)) + local heartbeat_interval_sec=$((HEARTBEAT_INTERVAL_MINUTES * 60)) - if [ "$last_heartbeat_epoch" -eq 0 ] || [ "$diff" -ge 43200 ]; then + if [ "$last_heartbeat_epoch" -eq 0 ] || [ "$diff" -ge "$heartbeat_interval_sec" ]; then send_heartbeat fi } diff --git a/ssh-monitor-watchdog b/ssh-monitor-watchdog index 6537378..d07d472 100644 --- a/ssh-monitor-watchdog +++ b/ssh-monitor-watchdog @@ -5,7 +5,7 @@ IFS=$'\n\t' CONFIG_FILE="/etc/ssh-monitor.conf" WATCHDOG_LOG_FILE="/var/log/ssh_monitor_watchdog.log" LAST_HEARTBEAT_FILE="/var/log/last_heartbeat.txt" -WATCHDOG_MAX_HEARTBEAT_AGE=5400 +WATCHDOG_MAX_HEARTBEAT_AGE=18000 WATCHDOG_SERVICE_NAME="ssh-monitor.service" WATCHDOG_NOTIFY_ON_RECOVERY="0" diff --git a/ssh-monitor.conf.example b/ssh-monitor.conf.example index 428a6f9..aa6aaa3 100644 --- a/ssh-monitor.conf.example +++ b/ssh-monitor.conf.example @@ -49,6 +49,8 @@ MAIL_SMTP_SSL="0" LOG_FILE="/var/log/ssh_monitor.log" LAST_HEARTBEAT_FILE="/var/log/last_heartbeat.txt" +# Интервал SAC agent.heartbeat (минуты). 240 = 4 ч. +HEARTBEAT_INTERVAL_MINUTES="240" LAST_REPORT_FILE="/var/log/last_daily_report.txt" LAST_SSH_CHECK_FILE="/var/log/last_ssh_check" LAST_SUDO_CHECK_FILE="/var/log/last_sudo_check" @@ -102,7 +104,8 @@ PROMETHEUS_TEXTFILE_DIR="" # JSON-снимок состояния на каждой итерации (timestamp, hostname, dry_run). Пусто — отключено. HEALTHCHECK_STATUS_FILE="" -WATCHDOG_MAX_HEARTBEAT_AGE="5400" +# Порог устаревания heartbeat для watchdog (сек): интервал + 1 ч запас (240 мин → 18000). +WATCHDOG_MAX_HEARTBEAT_AGE="18000" WATCHDOG_LOG_FILE="/var/log/ssh_monitor_watchdog.log" WATCHDOG_SERVICE_NAME="ssh-monitor.service" WATCHDOG_NOTIFY_ON_RECOVERY="0" diff --git a/update_ssh_monitor.sh b/update_ssh_monitor.sh index 05807e5..35b0db8 100755 --- a/update_ssh_monitor.sh +++ b/update_ssh_monitor.sh @@ -24,6 +24,8 @@ SUMMARY_UPDATER="—" CONFIG_FILE="/etc/ssh-monitor.conf" DEPLOY_INSTALL_PATH="/opt/scripts/update_ssh_monitor.sh" +EXPECTED_HEARTBEAT_INTERVAL_MINUTES=240 +EXPECTED_WATCHDOG_MAX_HEARTBEAT_AGE=$((EXPECTED_HEARTBEAT_INTERVAL_MINUTES * 60 + 3600)) SAC_SPOOL_DIR_DEFAULT="/var/lib/ssh-monitor/sac-spool" SYSTEMD_UNIT_PATH="/etc/systemd/system/ssh-monitor.service" @@ -155,6 +157,40 @@ ensure_ssh_monitor_config_from_example() { return 0 } +set_config_kv() { + local key="$1" val="$2" file="$3" + if grep -qE "^[[:space:]]*${key}=" "$file" 2>/dev/null; then + sed -i -E "s/^[[:space:]]*${key}=.*/${key}=\"${val}\"/" "$file" + else + printf '%s="%s"\n' "$key" "$val" >>"$file" + fi +} + +sync_heartbeat_interval_config() { + local file="$CONFIG_FILE" + local current_interval current_watchdog + + [ -f "$file" ] || return 1 + + current_interval=$(config_conf_value "HEARTBEAT_INTERVAL_MINUTES" "$file" 2>/dev/null || true) + current_watchdog=$(config_conf_value "WATCHDOG_MAX_HEARTBEAT_AGE" "$file" 2>/dev/null || true) + + if [ "$current_interval" = "$EXPECTED_HEARTBEAT_INTERVAL_MINUTES" ] \ + && [ "$current_watchdog" = "$EXPECTED_WATCHDOG_MAX_HEARTBEAT_AGE" ]; then + return 1 + fi + + cp "$file" "${file}.bak.$(date +%Y%m%d_%H%M%S)" 2>/dev/null || true + set_config_kv "HEARTBEAT_INTERVAL_MINUTES" "$EXPECTED_HEARTBEAT_INTERVAL_MINUTES" "$file" + set_config_kv "WATCHDOG_MAX_HEARTBEAT_AGE" "$EXPECTED_WATCHDOG_MAX_HEARTBEAT_AGE" "$file" + log_message "INFO" "Config $file: HEARTBEAT_INTERVAL_MINUTES=$EXPECTED_HEARTBEAT_INTERVAL_MINUTES, WATCHDOG_MAX_HEARTBEAT_AGE=$EXPECTED_WATCHDOG_MAX_HEARTBEAT_AGE (deploy policy on script upgrade)." + if [ "$DEPLOY_MODE" -eq 1 ]; then + say_info "Heartbeat: ${EXPECTED_HEARTBEAT_INTERVAL_MINUTES} мин, watchdog ${EXPECTED_WATCHDOG_MAX_HEARTBEAT_AGE} с." + fi + CONFIG_CHANGED=1 + return 0 +} + sync_use_sac_fallback_mode() { local file="$CONFIG_FILE" [ -f "$file" ] || return 1 @@ -968,6 +1004,7 @@ update_script() { if [ "$script_changed" -eq 1 ]; then sync_use_sac_fallback_mode || true + sync_heartbeat_interval_config || true fi if [ "$script_changed" -eq 1 ] || [ "${SAC_CLIENT_CHANGED:-0}" -eq 1 ] || [ "${CONFIG_CHANGED:-0}" -eq 1 ]; then diff --git a/version.txt b/version.txt index a6515ba..cefda1d 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.0.1-SAC +2.0.2-SAC