feat: deploy дописывает HEARTBEAT_INTERVAL при отсутствии в конфиге (2.0.6-SAC)

Явная проверка ключей в /etc/ssh-monitor.conf, блок 240 мин + watchdog; исправлен текст startup heartbeat.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-12 16:46:41 +10:00
parent 4cd1a85b3e
commit 9a3855bf0a
3 changed files with 62 additions and 12 deletions
+59 -8
View File
@@ -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