feat: verbose update_ssh_monitor action log and run summary
Log each step to /var/log/update_script.log and stdout (unless --quiet). End-of-run summary explains skip reasons: checksum match, git pull fail, missing clone path, versions and sha256 prefixes.
This commit is contained in:
@@ -146,6 +146,17 @@ sudo cp /usr/local/bin/ssh-monitor.backup.YYYYMMDD_HHMMSS /usr/local/bin/ssh-mon
|
|||||||
sudo systemctl restart ssh-monitor.service
|
sudo systemctl restart ssh-monitor.service
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Лог и диагностика «мгновенного» завершения
|
||||||
|
|
||||||
|
Все шаги пишутся в **`/var/log/update_script.log`**. При обычном запуске те же строки дублируются в stdout (кроме **`--quiet`**).
|
||||||
|
|
||||||
|
В конце каждого прогона — блок **«Итог обновления»**: статус `ssh-monitor` / `sac-client` / git / перезапуск и **причина**, если файлы не копировались (checksum совпал, git pull failed, скрипт не найден в клоне).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo /opt/scripts/update_ssh_monitor.sh
|
||||||
|
sudo tail -40 /var/log/update_script.log
|
||||||
|
```
|
||||||
|
|
||||||
## Ограничения
|
## Ограничения
|
||||||
|
|
||||||
- Обновляется **только** файл **`ssh-monitor`**, не конфиг и не watchdog.
|
- Обновляется **только** файл **`ssh-monitor`**, не конфиг и не watchdog.
|
||||||
|
|||||||
+177
-37
@@ -10,6 +10,16 @@ LOG_FILE="/var/log/update_script.log"
|
|||||||
# Режим отладки: 1 = включён, 0 = выключен
|
# Режим отладки: 1 = включён, 0 = выключен
|
||||||
DEBUG=0
|
DEBUG=0
|
||||||
DEPLOY_MODE=0
|
DEPLOY_MODE=0
|
||||||
|
QUIET=0
|
||||||
|
|
||||||
|
# Итог последнего прогона (для лога и консоли)
|
||||||
|
SUMMARY_SCRIPT="—"
|
||||||
|
SUMMARY_SCRIPT_REASON="—"
|
||||||
|
SUMMARY_SAC_CLIENT="—"
|
||||||
|
SUMMARY_SAC_REASON="—"
|
||||||
|
SUMMARY_CONFIG="—"
|
||||||
|
SUMMARY_GIT="—"
|
||||||
|
SUMMARY_SERVICE_RESTART="—"
|
||||||
|
|
||||||
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"
|
||||||
@@ -51,8 +61,11 @@ update_ssh_monitor.sh — обновление или первичная уст
|
|||||||
Опции:
|
Опции:
|
||||||
--deploy установить ssh-monitor, sac-client, пример конфига, systemd unit
|
--deploy установить ssh-monitor, sac-client, пример конфига, systemd unit
|
||||||
--debug подробный лог в /var/log/update_script.log
|
--debug подробный лог в /var/log/update_script.log
|
||||||
|
--quiet не печатать шаги в stdout (только в $LOG_FILE)
|
||||||
-h, --help эта справка
|
-h, --help эта справка
|
||||||
|
|
||||||
|
Лог действий: /var/log/update_script.log (в конце каждого прогона — блок «Итог обновления»).
|
||||||
|
|
||||||
При первой установке или апгрейде с UseSAC=off / пустым SAC_API_KEY / без sac-client.sh
|
При первой установке или апгрейде с UseSAC=off / пустым SAC_API_KEY / без sac-client.sh
|
||||||
example из git перезаписывает /etc/ssh-monitor.conf (старый файл — .bak.*).
|
example из git перезаписывает /etc/ssh-monitor.conf (старый файл — .bak.*).
|
||||||
EOF
|
EOF
|
||||||
@@ -153,6 +166,10 @@ parse_command_line() {
|
|||||||
DEBUG=1
|
DEBUG=1
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
--quiet)
|
||||||
|
QUIET=1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
-h | --help)
|
-h | --help)
|
||||||
show_help
|
show_help
|
||||||
exit 0
|
exit 0
|
||||||
@@ -198,6 +215,47 @@ log_message() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Всегда в лог; в stdout — если не --quiet (удобно при ручном запуске и cron с mail)
|
||||||
|
log_action() {
|
||||||
|
log_message "INFO" "$1"
|
||||||
|
if [ "$QUIET" -eq 0 ]; then
|
||||||
|
printf '[update_ssh_monitor] %s\n' "$1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
get_git_short_rev() {
|
||||||
|
local repo_dir="$1"
|
||||||
|
git -C "$repo_dir" rev-parse --short HEAD 2>/dev/null || printf 'unknown'
|
||||||
|
}
|
||||||
|
|
||||||
|
read_ssh_monitor_version() {
|
||||||
|
local f="$1"
|
||||||
|
local line
|
||||||
|
[ -f "$f" ] || return 0
|
||||||
|
line=$(grep -E '^[[:space:]]*SSH_MONITOR_VERSION=' "$f" 2>/dev/null | head -1) || return 0
|
||||||
|
line=${line#SSH_MONITOR_VERSION=}
|
||||||
|
line=${line#\"}
|
||||||
|
line=${line%\"}
|
||||||
|
line=${line#\'}
|
||||||
|
line=${line%\'}
|
||||||
|
printf '%s' "$line"
|
||||||
|
}
|
||||||
|
|
||||||
|
file_sha256() {
|
||||||
|
sha256sum "$1" 2>/dev/null | awk '{print $1}' || true
|
||||||
|
}
|
||||||
|
|
||||||
|
log_update_summary() {
|
||||||
|
log_action "===== Итог обновления ====="
|
||||||
|
log_action "ssh-monitor: $SUMMARY_SCRIPT ($SUMMARY_SCRIPT_REASON)"
|
||||||
|
log_action "sac-client.sh: $SUMMARY_SAC_CLIENT ($SUMMARY_SAC_REASON)"
|
||||||
|
log_action "конфиг: $SUMMARY_CONFIG"
|
||||||
|
log_action "git: $SUMMARY_GIT"
|
||||||
|
log_action "перезапуск ssh-monitor.service: $SUMMARY_SERVICE_RESTART"
|
||||||
|
log_action "полный лог: $LOG_FILE"
|
||||||
|
log_action "==========================="
|
||||||
|
}
|
||||||
|
|
||||||
# Функция для логирования шагов с комментариями (работает только при DEBUG=1)
|
# Функция для логирования шагов с комментариями (работает только при DEBUG=1)
|
||||||
debug_step() {
|
debug_step() {
|
||||||
if [ "$DEBUG" -eq 1 ]; then
|
if [ "$DEBUG" -eq 1 ]; then
|
||||||
@@ -377,38 +435,50 @@ sync_sac_client() {
|
|||||||
SAC_CLIENT_CHANGED=0
|
SAC_CLIENT_CHANGED=0
|
||||||
local remote local_dst local_sum remote_sum
|
local remote local_dst local_sum remote_sum
|
||||||
remote=$(find_sac_client_remote) || {
|
remote=$(find_sac_client_remote) || {
|
||||||
log_message "INFO" "WARNING: sac-client.sh not found in repository clone"
|
SUMMARY_SAC_CLIENT="не найден в клоне"
|
||||||
|
SUMMARY_SAC_REASON="путь $UPDATE_DIR/$SCRIPT_NAME/sac-client.sh"
|
||||||
|
log_action "WARNING: sac-client.sh не найден в клоне git"
|
||||||
debug_step "sac-client.sh не найден в клоне репозитория"
|
debug_step "sac-client.sh не найден в клоне репозитория"
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
local_dst="${LOCAL_SCRIPT_PATH%/*}/sac-client.sh"
|
local_dst="${LOCAL_SCRIPT_PATH%/*}/sac-client.sh"
|
||||||
remote_sum=$(sha256sum "$remote" 2>/dev/null | awk '{print $1}')
|
log_action "sac-client: remote=$remote local=$local_dst"
|
||||||
|
remote_sum=$(file_sha256 "$remote")
|
||||||
if [ -z "$remote_sum" ]; then
|
if [ -z "$remote_sum" ]; then
|
||||||
log_message "INFO" "ERROR: Failed to checksum remote sac-client.sh"
|
SUMMARY_SAC_CLIENT="ошибка"
|
||||||
|
SUMMARY_SAC_REASON="не удалось sha256 remote"
|
||||||
|
log_action "ERROR: не удалось посчитать sha256 для $remote"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$DEPLOY_MODE" -ne 1 ] && [ -f "$local_dst" ]; then
|
if [ "$DEPLOY_MODE" -ne 1 ] && [ -f "$local_dst" ]; then
|
||||||
local_sum=$(sha256sum "$local_dst" 2>/dev/null | awk '{print $1}')
|
local_sum=$(file_sha256 "$local_dst")
|
||||||
if [ "$local_sum" = "$remote_sum" ]; then
|
if [ "$local_sum" = "$remote_sum" ]; then
|
||||||
log_message "INFO" "sac-client.sh checksums match. No update needed."
|
SUMMARY_SAC_CLIENT="без изменений"
|
||||||
|
SUMMARY_SAC_REASON="sha256 совпадает (${local_sum:0:16}…)"
|
||||||
|
log_action "sac-client.sh: checksum совпадает, копирование не требуется"
|
||||||
debug_step "sac-client.sh без изменений"
|
debug_step "sac-client.sh без изменений"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
log_action "sac-client.sh: checksum отличается (local ${local_sum:0:16}… != remote ${remote_sum:0:16}…)"
|
||||||
elif [ ! -f "$local_dst" ]; then
|
elif [ ! -f "$local_dst" ]; then
|
||||||
log_message "INFO" "Local sac-client.sh not found. Will install."
|
log_action "sac-client.sh: локальный файл отсутствует, будет установлен"
|
||||||
debug_step "Локальный sac-client.sh отсутствует, будет установлен"
|
debug_step "Локальный sac-client.sh отсутствует, будет установлен"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
debug_step "Копируем sac-client.sh в $local_dst"
|
debug_step "Копируем sac-client.sh в $local_dst"
|
||||||
if ! cp "$remote" "$local_dst"; then
|
if ! cp "$remote" "$local_dst"; then
|
||||||
log_message "INFO" "ERROR: Failed to copy sac-client.sh"
|
SUMMARY_SAC_CLIENT="ошибка копирования"
|
||||||
|
SUMMARY_SAC_REASON="cp $remote -> $local_dst"
|
||||||
|
log_action "ERROR: не удалось скопировать sac-client.sh"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
chmod 644 "$local_dst"
|
chmod 644 "$local_dst"
|
||||||
SAC_CLIENT_CHANGED=1
|
SAC_CLIENT_CHANGED=1
|
||||||
log_message "INFO" "sac-client.sh updated."
|
SUMMARY_SAC_CLIENT="обновлён"
|
||||||
|
SUMMARY_SAC_REASON="sha256 ${remote_sum:0:16}…"
|
||||||
|
log_action "sac-client.sh обновлён → $local_dst"
|
||||||
if [ "$DEPLOY_MODE" -eq 1 ]; then
|
if [ "$DEPLOY_MODE" -eq 1 ]; then
|
||||||
say_ok "sac-client.sh → $local_dst"
|
say_ok "sac-client.sh → $local_dst"
|
||||||
fi
|
fi
|
||||||
@@ -419,27 +489,33 @@ find_remote_ssh_monitor_path() {
|
|||||||
REMOTE_SCRIPT_PATH="$UPDATE_DIR/$SCRIPT_NAME/src/branch/main/$SCRIPT_NAME"
|
REMOTE_SCRIPT_PATH="$UPDATE_DIR/$SCRIPT_NAME/src/branch/main/$SCRIPT_NAME"
|
||||||
ALT_REMOTE_PATH="$UPDATE_DIR/$SCRIPT_NAME/$SCRIPT_NAME"
|
ALT_REMOTE_PATH="$UPDATE_DIR/$SCRIPT_NAME/$SCRIPT_NAME"
|
||||||
if [ -f "$REMOTE_SCRIPT_PATH" ]; then
|
if [ -f "$REMOTE_SCRIPT_PATH" ]; then
|
||||||
|
log_action "ssh-monitor в клоне: $REMOTE_SCRIPT_PATH (src/branch/main)"
|
||||||
printf '%s\n' "$REMOTE_SCRIPT_PATH"
|
printf '%s\n' "$REMOTE_SCRIPT_PATH"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
if [ -f "$ALT_REMOTE_PATH" ]; then
|
if [ -f "$ALT_REMOTE_PATH" ]; then
|
||||||
log_message "INFO" "Script found at alternative path"
|
log_action "ssh-monitor в клоне: $ALT_REMOTE_PATH (корень репозитория)"
|
||||||
printf '%s\n' "$ALT_REMOTE_PATH"
|
printf '%s\n' "$ALT_REMOTE_PATH"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
log_action "WARNING: ssh-monitor не найден ни в $REMOTE_SCRIPT_PATH, ни в $ALT_REMOTE_PATH"
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
install_ssh_monitor_from() {
|
install_ssh_monitor_from() {
|
||||||
local actual_script_path="$1"
|
local actual_script_path="$1"
|
||||||
|
local backup_path=""
|
||||||
if [ -f "$LOCAL_SCRIPT_PATH" ]; then
|
if [ -f "$LOCAL_SCRIPT_PATH" ]; then
|
||||||
cp "$LOCAL_SCRIPT_PATH" "${LOCAL_SCRIPT_PATH}.backup.$(date +%Y%m%d_%H%M%S)" 2>/dev/null || true
|
backup_path="${LOCAL_SCRIPT_PATH}.backup.$(date +%Y%m%d_%H%M%S)"
|
||||||
|
cp "$LOCAL_SCRIPT_PATH" "$backup_path" 2>/dev/null || true
|
||||||
|
log_action "резервная копия: $backup_path"
|
||||||
fi
|
fi
|
||||||
if ! cp "$actual_script_path" "$LOCAL_SCRIPT_PATH"; then
|
if ! cp "$actual_script_path" "$LOCAL_SCRIPT_PATH"; then
|
||||||
log_message "INFO" "ERROR: Failed to copy script"
|
log_action "ERROR: не удалось скопировать $actual_script_path → $LOCAL_SCRIPT_PATH"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
chmod +x "$LOCAL_SCRIPT_PATH"
|
chmod +x "$LOCAL_SCRIPT_PATH"
|
||||||
|
log_action "ssh-monitor установлен: $LOCAL_SCRIPT_PATH (версия $(read_ssh_monitor_version "$LOCAL_SCRIPT_PATH"))"
|
||||||
if [ "$DEPLOY_MODE" -eq 1 ]; then
|
if [ "$DEPLOY_MODE" -eq 1 ]; then
|
||||||
say_ok "ssh-monitor → $LOCAL_SCRIPT_PATH"
|
say_ok "ssh-monitor → $LOCAL_SCRIPT_PATH"
|
||||||
fi
|
fi
|
||||||
@@ -536,99 +612,155 @@ restart_ssh_monitor_service() {
|
|||||||
debug_step "Перезапускаем сервис ssh-monitor.service"
|
debug_step "Перезапускаем сервис ssh-monitor.service"
|
||||||
if command -v systemctl &>/dev/null; then
|
if command -v systemctl &>/dev/null; then
|
||||||
if systemctl restart ssh-monitor.service 2>/dev/null; then
|
if systemctl restart ssh-monitor.service 2>/dev/null; then
|
||||||
log_message "INFO" "Service restarted successfully."
|
SUMMARY_SERVICE_RESTART="выполнен"
|
||||||
|
log_action "ssh-monitor.service перезапущен"
|
||||||
debug_step "Сервис успешно перезапущен"
|
debug_step "Сервис успешно перезапущен"
|
||||||
else
|
else
|
||||||
log_message "INFO" "WARNING: Failed to restart service (may not be running)"
|
SUMMARY_SERVICE_RESTART="не удался"
|
||||||
|
log_action "WARNING: systemctl restart ssh-monitor.service не выполнен"
|
||||||
debug_step "ПРЕДУПРЕЖДЕНИЕ: Не удалось перезапустить сервис"
|
debug_step "ПРЕДУПРЕЖДЕНИЕ: Не удалось перезапустить сервис"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
log_message "INFO" "systemctl not found, service not restarted"
|
SUMMARY_SERVICE_RESTART="пропущен (нет systemctl)"
|
||||||
|
log_action "systemctl не найден, перезапуск сервиса пропущен"
|
||||||
debug_step "systemctl не найден, сервис не перезапущен"
|
debug_step "systemctl не найден, сервис не перезапущен"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Функция для обновления скрипта
|
# Функция для обновления скрипта
|
||||||
update_script() {
|
update_script() {
|
||||||
log_message "INFO" "Starting script update..."
|
local git_repo="$UPDATE_DIR/$SCRIPT_NAME"
|
||||||
|
local git_before="" git_after="" pull_ok=1
|
||||||
|
local actual_script_path="" script_changed=0
|
||||||
|
local local_ver="" remote_ver="" local_sum="" remote_sum=""
|
||||||
|
|
||||||
|
SUMMARY_SCRIPT="—"
|
||||||
|
SUMMARY_SCRIPT_REASON="—"
|
||||||
|
SUMMARY_SAC_CLIENT="—"
|
||||||
|
SUMMARY_SAC_REASON="—"
|
||||||
|
SUMMARY_CONFIG="—"
|
||||||
|
SUMMARY_GIT="—"
|
||||||
|
SUMMARY_SERVICE_RESTART="не требовался"
|
||||||
|
|
||||||
|
log_action "Старт обновления (deploy=$DEPLOY_MODE, debug=$DEBUG)"
|
||||||
debug_step "Запуск функции обновления скрипта"
|
debug_step "Запуск функции обновления скрипта"
|
||||||
|
|
||||||
# Гарантируем наличие директории
|
|
||||||
debug_step "Гарантируем наличие директории для работы"
|
debug_step "Гарантируем наличие директории для работы"
|
||||||
if ! ensure_directories; then
|
if ! ensure_directories; then
|
||||||
|
SUMMARY_SCRIPT="ошибка"
|
||||||
|
SUMMARY_SCRIPT_REASON="нет каталога $UPDATE_DIR или нет прав на запись"
|
||||||
|
log_update_summary
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Переходим в директорию для клона репозитория
|
|
||||||
debug_step "Переходим в директорию для клона репозитория: $UPDATE_DIR"
|
debug_step "Переходим в директорию для клона репозитория: $UPDATE_DIR"
|
||||||
if ! cd "$UPDATE_DIR" 2>/dev/null; then
|
if ! cd "$UPDATE_DIR" 2>/dev/null; then
|
||||||
log_message "INFO" "ERROR: Cannot cd to $UPDATE_DIR"
|
SUMMARY_SCRIPT="ошибка"
|
||||||
|
SUMMARY_SCRIPT_REASON="cannot cd $UPDATE_DIR"
|
||||||
|
log_action "ERROR: cannot cd $UPDATE_DIR"
|
||||||
|
log_update_summary
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Клонируем или обновляем репозиторий
|
|
||||||
debug_step "Проверяем наличие репозитория и обновляем/клонируем"
|
debug_step "Проверяем наличие репозитория и обновляем/клонируем"
|
||||||
if [ -d "$SCRIPT_NAME" ]; then
|
if [ -d "$SCRIPT_NAME" ]; then
|
||||||
log_message "INFO" "Repository exists, pulling updates..."
|
git_before="$(get_git_short_rev "$git_repo")"
|
||||||
|
log_action "git: pull origin main (было commit $git_before) → $REPO_URL"
|
||||||
debug_step "Выполняем git pull origin main"
|
debug_step "Выполняем git pull origin main"
|
||||||
if ! git -C "$SCRIPT_NAME" pull origin main >> "$LOG_FILE" 2>&1; then
|
if git -C "$SCRIPT_NAME" pull origin main >> "$LOG_FILE" 2>&1; then
|
||||||
log_message "INFO" "WARNING: git pull failed, continuing with existing local copy..."
|
git_after="$(get_git_short_rev "$git_repo")"
|
||||||
|
SUMMARY_GIT="pull ok, $git_before → $git_after"
|
||||||
|
log_action "git pull: успех (commit $git_before → $git_after)"
|
||||||
|
else
|
||||||
|
pull_ok=0
|
||||||
|
git_after="$(get_git_short_rev "$git_repo")"
|
||||||
|
SUMMARY_GIT="pull FAILED, используется локальный клон ($git_after)"
|
||||||
|
log_action "WARNING: git pull не удался — продолжаем со старым клоном (commit $git_after). См. хвост $LOG_FILE"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
log_message "INFO" "Cloning repository from $REPO_URL"
|
log_action "git: clone $REPO_URL → $UPDATE_DIR/$SCRIPT_NAME"
|
||||||
debug_step "Выполняем git clone $REPO_URL $SCRIPT_NAME"
|
debug_step "Выполняем git clone $REPO_URL $SCRIPT_NAME"
|
||||||
if ! git clone "$REPO_URL" "$SCRIPT_NAME" >> "$LOG_FILE" 2>&1; then
|
if ! git clone "$REPO_URL" "$SCRIPT_NAME" >> "$LOG_FILE" 2>&1; then
|
||||||
log_message "INFO" "ERROR: git clone failed"
|
SUMMARY_GIT="clone FAILED"
|
||||||
|
SUMMARY_SCRIPT="ошибка"
|
||||||
|
SUMMARY_SCRIPT_REASON="git clone failed"
|
||||||
|
log_action "ERROR: git clone failed (см. $LOG_FILE)"
|
||||||
|
log_update_summary
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
git_after="$(get_git_short_rev "$git_repo")"
|
||||||
|
SUMMARY_GIT="clone ok, commit $git_after"
|
||||||
|
log_action "git clone: успех (commit $git_after)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local actual_script_path=""
|
|
||||||
actual_script_path="$(find_remote_ssh_monitor_path 2>/dev/null || true)"
|
actual_script_path="$(find_remote_ssh_monitor_path 2>/dev/null || true)"
|
||||||
debug_step "Путь к ssh-monitor в клоне: ${actual_script_path:-не найден}"
|
debug_step "Путь к ssh-monitor в клоне: ${actual_script_path:-не найден}"
|
||||||
|
|
||||||
SAC_CLIENT_CHANGED=0
|
SAC_CLIENT_CHANGED=0
|
||||||
if ! sync_sac_client; then
|
if ! sync_sac_client; then
|
||||||
|
log_update_summary
|
||||||
return 1
|
return 1
|
||||||
fi
|
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
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
if [ "${CONFIG_CHANGED:-0}" -eq 1 ]; then
|
||||||
local script_changed=0
|
SUMMARY_CONFIG="обновлён из example"
|
||||||
|
else
|
||||||
|
SUMMARY_CONFIG="без изменений"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -n "$actual_script_path" ] && [ -f "$actual_script_path" ]; then
|
if [ -n "$actual_script_path" ] && [ -f "$actual_script_path" ]; then
|
||||||
if [ "$DEPLOY_MODE" -eq 1 ]; then
|
if [ "$DEPLOY_MODE" -eq 1 ]; then
|
||||||
log_message "INFO" "Deploy: installing ssh-monitor to $LOCAL_SCRIPT_PATH"
|
log_action "режим --deploy: установка ssh-monitor → $LOCAL_SCRIPT_PATH"
|
||||||
if install_ssh_monitor_from "$actual_script_path"; then
|
if install_ssh_monitor_from "$actual_script_path"; then
|
||||||
script_changed=1
|
script_changed=1
|
||||||
|
SUMMARY_SCRIPT="установлен (--deploy)"
|
||||||
|
SUMMARY_SCRIPT_REASON="$(read_ssh_monitor_version "$LOCAL_SCRIPT_PATH")"
|
||||||
else
|
else
|
||||||
|
SUMMARY_SCRIPT="ошибка установки"
|
||||||
|
log_update_summary
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
log_message "INFO" "Remote script found. Comparing checksums..."
|
|
||||||
if [ ! -f "$LOCAL_SCRIPT_PATH" ]; then
|
if [ ! -f "$LOCAL_SCRIPT_PATH" ]; then
|
||||||
LOCAL_CHECKSUM=""
|
LOCAL_CHECKSUM=""
|
||||||
|
local_ver="(нет файла)"
|
||||||
else
|
else
|
||||||
LOCAL_CHECKSUM=$(sha256sum "$LOCAL_SCRIPT_PATH" 2>/dev/null | awk '{print $1}')
|
LOCAL_CHECKSUM=$(file_sha256 "$LOCAL_SCRIPT_PATH")
|
||||||
|
local_ver="$(read_ssh_monitor_version "$LOCAL_SCRIPT_PATH")"
|
||||||
|
fi
|
||||||
|
REMOTE_CHECKSUM=$(file_sha256 "$actual_script_path")
|
||||||
|
remote_ver="$(read_ssh_monitor_version "$actual_script_path")"
|
||||||
|
log_action "сравнение: local=$LOCAL_SCRIPT_PATH ver=$local_ver sha=${LOCAL_CHECKSUM:0:16}…"
|
||||||
|
log_action "сравнение: remote=$actual_script_path ver=$remote_ver sha=${REMOTE_CHECKSUM:0:16}…"
|
||||||
|
if [ "$pull_ok" -eq 0 ]; then
|
||||||
|
log_action "примечание: git pull не удался — remote может быть устаревшим"
|
||||||
fi
|
fi
|
||||||
REMOTE_CHECKSUM=$(sha256sum "$actual_script_path" 2>/dev/null | awk '{print $1}')
|
|
||||||
if [ "$LOCAL_CHECKSUM" != "$REMOTE_CHECKSUM" ]; then
|
if [ "$LOCAL_CHECKSUM" != "$REMOTE_CHECKSUM" ]; then
|
||||||
log_message "INFO" "Checksums differ. Updating $LOCAL_SCRIPT_PATH..."
|
log_action "checksum различается — обновляем $LOCAL_SCRIPT_PATH"
|
||||||
if install_ssh_monitor_from "$actual_script_path"; then
|
if install_ssh_monitor_from "$actual_script_path"; then
|
||||||
script_changed=1
|
script_changed=1
|
||||||
log_message "INFO" "Script updated successfully."
|
SUMMARY_SCRIPT="обновлён"
|
||||||
|
SUMMARY_SCRIPT_REASON="${local_ver} → ${remote_ver}, sha изменился"
|
||||||
else
|
else
|
||||||
|
SUMMARY_SCRIPT="ошибка копирования"
|
||||||
|
log_update_summary
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
log_message "INFO" "Checksums match. No update needed."
|
SUMMARY_SCRIPT="без изменений"
|
||||||
|
SUMMARY_SCRIPT_REASON="sha256 совпадает; версия local=$local_ver remote=$remote_ver"
|
||||||
|
log_action "ssh-monitor: файлы идентичны, копирование не требуется"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
log_message "INFO" "No remote script found. No update needed."
|
SUMMARY_SCRIPT="не найден в клоне"
|
||||||
|
SUMMARY_SCRIPT_REASON="проверьте структуру репозитория после git pull"
|
||||||
|
log_action "ERROR: ssh-monitor не найден в клоне $UPDATE_DIR/$SCRIPT_NAME"
|
||||||
if [ "$DEPLOY_MODE" -eq 1 ]; then
|
if [ "$DEPLOY_MODE" -eq 1 ]; then
|
||||||
say_warn "ssh-monitor не найден в клоне $UPDATE_DIR/$SCRIPT_NAME"
|
say_warn "ssh-monitor не найден в клоне $UPDATE_DIR/$SCRIPT_NAME"
|
||||||
fi
|
fi
|
||||||
@@ -643,11 +775,12 @@ update_script() {
|
|||||||
script_changed=1
|
script_changed=1
|
||||||
elif [ "$script_changed" -eq 1 ] || [ "${SAC_CLIENT_CHANGED:-0}" -eq 1 ] || [ "${CONFIG_CHANGED:-0}" -eq 1 ]; then
|
elif [ "$script_changed" -eq 1 ] || [ "${SAC_CLIENT_CHANGED:-0}" -eq 1 ] || [ "${CONFIG_CHANGED:-0}" -eq 1 ]; then
|
||||||
restart_ssh_monitor_service
|
restart_ssh_monitor_service
|
||||||
|
else
|
||||||
|
log_action "перезапуск сервиса не нужен (ни один файл не изменился)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Логируем значения переменных скрипта при DEBUG=1
|
|
||||||
log_script_vars
|
log_script_vars
|
||||||
|
log_update_summary
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -661,7 +794,12 @@ if [ "$DEPLOY_MODE" -eq 1 ]; then
|
|||||||
say_step "Репозиторий и файлы"
|
say_step "Репозиторий и файлы"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
_updater_self="$(readlink -f "$0" 2>/dev/null || realpath "$0" 2>/dev/null || printf '%s' "$0")"
|
||||||
|
_updater_sha="$(file_sha256 "$_updater_self")"
|
||||||
log_message "INFO" "=== Script update started (deploy=$DEPLOY_MODE) ==="
|
log_message "INFO" "=== Script update started (deploy=$DEPLOY_MODE) ==="
|
||||||
|
log_action "запуск updater: $_updater_self (sha ${_updater_sha:0:16}…)"
|
||||||
|
log_action "хост=$(hostname 2>/dev/null || echo '?') user=$(id -un 2>/dev/null) uid=$(id -u 2>/dev/null)"
|
||||||
|
log_action "пути: LOCAL=$LOCAL_SCRIPT_PATH UPDATE_DIR=$UPDATE_DIR REPO=$REPO_URL"
|
||||||
debug_step "Инициализация скрипта обновления"
|
debug_step "Инициализация скрипта обновления"
|
||||||
|
|
||||||
if ! ensure_directories; then
|
if ! ensure_directories; then
|
||||||
@@ -693,11 +831,13 @@ fi
|
|||||||
|
|
||||||
if [ $exit_code -eq 0 ]; then
|
if [ $exit_code -eq 0 ]; then
|
||||||
log_message "INFO" "=== Script update completed successfully ==="
|
log_message "INFO" "=== Script update completed successfully ==="
|
||||||
|
log_action "завершено успешно (код 0). Итог см. выше или: tail -30 $LOG_FILE"
|
||||||
if [ "$DEPLOY_MODE" -eq 1 ]; then
|
if [ "$DEPLOY_MODE" -eq 1 ]; then
|
||||||
printf '\n=== Установка завершена. Отредактируйте %s и перезапустите сервис. ===\n' "$CONFIG_FILE"
|
printf '\n=== Установка завершена. Отредактируйте %s и перезапустите сервис. ===\n' "$CONFIG_FILE"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
log_message "INFO" "=== Script update completed with errors (exit code: $exit_code) ==="
|
log_message "INFO" "=== Script update completed with errors (exit code: $exit_code) ==="
|
||||||
|
log_action "завершено с ошибкой (код $exit_code). См. $LOG_FILE"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exit $exit_code
|
exit $exit_code
|
||||||
|
|||||||
Reference in New Issue
Block a user