diff --git a/ssh-monitor b/ssh-monitor index 11603cb..6f35814 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.5-SAC" +SSH_MONITOR_VERSION="2.0.6-SAC" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [ -f "$SCRIPT_DIR/sac-client.sh" ]; then @@ -1968,7 +1968,7 @@ send_startup_notification() { message="${message}🚫 Автоблокировка IP: выключена (ENABLE_IP_BAN=0), только уведомления"$'\n' fi message="${message}⚪ Белый список: ${whitelist_count} IP/подсетей"$'\n' - message="${message}❤️ Heartbeat будет отправляться каждые 12 часов"$'\n' + message="${message}❤️ Heartbeat будет отправляться каждые ${HEARTBEAT_INTERVAL_MINUTES} мин (SAC agent.heartbeat)"$'\n' message="${message}📢 Каналы уведомлений (все по списку): $(notify_chain_human)" message="$(message_ensure_server_line "$message")" diff --git a/update_ssh_monitor.sh b/update_ssh_monitor.sh index efb7e6e..d098d4a 100755 --- a/update_ssh_monitor.sh +++ b/update_ssh_monitor.sh @@ -170,24 +170,75 @@ set_config_kv() { fi } +config_key_exists() { + local key="$1" file="$2" + grep -qE "^[[:space:]]*${key}=" "$file" 2>/dev/null +} + +append_heartbeat_interval_block() { + local file="$1" + { + printf '\n# --- SAC agent.heartbeat (интервал в минутах; %s = 4 ч) ---\n' "$EXPECTED_HEARTBEAT_INTERVAL_MINUTES" + printf 'HEARTBEAT_INTERVAL_MINUTES="%s"\n' "$EXPECTED_HEARTBEAT_INTERVAL_MINUTES" + printf '# Порог watchdog: интервал + 1 ч запас (%s с)\n' "$EXPECTED_WATCHDOG_MAX_HEARTBEAT_AGE" + printf 'WATCHDOG_MAX_HEARTBEAT_AGE="%s"\n' "$EXPECTED_WATCHDOG_MAX_HEARTBEAT_AGE" + } >>"$file" +} + sync_heartbeat_interval_config() { local file="$CONFIG_FILE" local current_interval current_watchdog + local changed=0 + local backed_up=0 [ -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) + backup_config_once() { + if [ "$backed_up" -eq 0 ]; then + cp "$file" "${file}.bak.$(date +%Y%m%d_%H%M%S)" 2>/dev/null || true + backed_up=1 + fi + } - if [ "$current_interval" = "$EXPECTED_HEARTBEAT_INTERVAL_MINUTES" ] \ - && [ "$current_watchdog" = "$EXPECTED_WATCHDOG_MAX_HEARTBEAT_AGE" ]; then + if ! config_key_exists "HEARTBEAT_INTERVAL_MINUTES" "$file"; then + backup_config_once + if ! config_key_exists "WATCHDOG_MAX_HEARTBEAT_AGE" "$file"; then + append_heartbeat_interval_block "$file" + log_message "INFO" "Config $file: добавлены HEARTBEAT_INTERVAL_MINUTES=$EXPECTED_HEARTBEAT_INTERVAL_MINUTES и WATCHDOG_MAX_HEARTBEAT_AGE=$EXPECTED_WATCHDOG_MAX_HEARTBEAT_AGE (отсутствовали в конфиге)." + else + set_config_kv "HEARTBEAT_INTERVAL_MINUTES" "$EXPECTED_HEARTBEAT_INTERVAL_MINUTES" "$file" + log_message "INFO" "Config $file: добавлен HEARTBEAT_INTERVAL_MINUTES=$EXPECTED_HEARTBEAT_INTERVAL_MINUTES (отсутствовал в конфиге)." + fi + changed=1 + else + current_interval=$(config_conf_value "HEARTBEAT_INTERVAL_MINUTES" "$file" 2>/dev/null || true) + if [ "$current_interval" != "$EXPECTED_HEARTBEAT_INTERVAL_MINUTES" ]; then + backup_config_once + set_config_kv "HEARTBEAT_INTERVAL_MINUTES" "$EXPECTED_HEARTBEAT_INTERVAL_MINUTES" "$file" + log_message "INFO" "Config $file: HEARTBEAT_INTERVAL_MINUTES ${current_interval:-?} → $EXPECTED_HEARTBEAT_INTERVAL_MINUTES (deploy policy)." + changed=1 + fi + fi + + if ! config_key_exists "WATCHDOG_MAX_HEARTBEAT_AGE" "$file"; then + backup_config_once + set_config_kv "WATCHDOG_MAX_HEARTBEAT_AGE" "$EXPECTED_WATCHDOG_MAX_HEARTBEAT_AGE" "$file" + log_message "INFO" "Config $file: добавлен WATCHDOG_MAX_HEARTBEAT_AGE=$EXPECTED_WATCHDOG_MAX_HEARTBEAT_AGE (отсутствовал в конфиге)." + changed=1 + else + current_watchdog=$(config_conf_value "WATCHDOG_MAX_HEARTBEAT_AGE" "$file" 2>/dev/null || true) + if [ "$current_watchdog" != "$EXPECTED_WATCHDOG_MAX_HEARTBEAT_AGE" ]; then + backup_config_once + set_config_kv "WATCHDOG_MAX_HEARTBEAT_AGE" "$EXPECTED_WATCHDOG_MAX_HEARTBEAT_AGE" "$file" + log_message "INFO" "Config $file: WATCHDOG_MAX_HEARTBEAT_AGE ${current_watchdog:-?} → $EXPECTED_WATCHDOG_MAX_HEARTBEAT_AGE (deploy policy)." + changed=1 + fi + fi + + if [ "$changed" -eq 0 ]; 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 diff --git a/version.txt b/version.txt index c030fe4..7f313be 100644 --- a/version.txt +++ b/version.txt @@ -1,2 +1 @@ -2.0.5-SAC - +2.0.6-SAC