diff --git a/docs/auto-update.ru.md b/docs/auto-update.ru.md index d4a2de0..0abd2a1 100644 --- a/docs/auto-update.ru.md +++ b/docs/auto-update.ru.md @@ -157,6 +157,14 @@ sudo /opt/scripts/update_ssh_monitor.sh sudo tail -40 /var/log/update_script.log ``` +**Важно:** после `git pull` в клоне скрипт **сам обновляет** `/opt/scripts/update_ssh_monitor.sh` из репозитория и один раз перезапускает себя (если вызывали именно этот путь). Если в логе старые строки вроде `Checksums match` без блока «Итог обновления» — на сервере ещё старая копия updater; один раз: + +```bash +sudo cp /opt/scripts/update/ssh-monitor/update_ssh_monitor.sh /opt/scripts/update_ssh_monitor.sh +sudo chmod 750 /opt/scripts/update_ssh_monitor.sh +sudo /opt/scripts/update_ssh_monitor.sh +``` + ## Ограничения - Обновляется **только** файл **`ssh-monitor`**, не конфиг и не watchdog. diff --git a/update_ssh_monitor.sh b/update_ssh_monitor.sh index c20b261..f3a3d65 100755 --- a/update_ssh_monitor.sh +++ b/update_ssh_monitor.sh @@ -20,6 +20,7 @@ SUMMARY_SAC_REASON="—" SUMMARY_CONFIG="—" SUMMARY_GIT="—" SUMMARY_SERVICE_RESTART="—" +SUMMARY_UPDATER="—" CONFIG_FILE="/etc/ssh-monitor.conf" DEPLOY_INSTALL_PATH="/opt/scripts/update_ssh_monitor.sh" @@ -251,6 +252,7 @@ log_update_summary() { log_action "sac-client.sh: $SUMMARY_SAC_CLIENT ($SUMMARY_SAC_REASON)" log_action "конфиг: $SUMMARY_CONFIG" log_action "git: $SUMMARY_GIT" + log_action "updater ($DEPLOY_INSTALL_PATH): $SUMMARY_UPDATER" log_action "перезапуск ssh-monitor.service: $SUMMARY_SERVICE_RESTART" log_action "полный лог: $LOG_FILE" log_action "===========================" @@ -608,6 +610,51 @@ deploy_post_install() { print_config_variables_help } +# Копирует update_ssh_monitor.sh из git-клона в /opt/scripts/ и при необходимости re-exec. +sync_installed_updater_from_clone() { + local remote="$UPDATE_DIR/$SCRIPT_NAME/update_ssh_monitor.sh" + local self installed_path remote_sum installed_sum="" + + if [ ! -f "$remote" ]; then + SUMMARY_UPDATER="не найден в клоне" + log_action "updater: в клоне нет $remote" + return 0 + fi + + self="$(readlink -f "$0" 2>/dev/null || realpath "$0" 2>/dev/null || printf '%s' "$0")" + installed_path="$(readlink -f "$DEPLOY_INSTALL_PATH" 2>/dev/null || realpath "$DEPLOY_INSTALL_PATH" 2>/dev/null || printf '%s' "$DEPLOY_INSTALL_PATH")" + remote_sum=$(file_sha256 "$remote") + if [ -f "$DEPLOY_INSTALL_PATH" ]; then + installed_sum=$(file_sha256 "$DEPLOY_INSTALL_PATH") + fi + + if [ "$remote_sum" = "$installed_sum" ]; then + SUMMARY_UPDATER="актуален (sha ${remote_sum:0:16}…)" + log_action "updater: $DEPLOY_INSTALL_PATH совпадает с git (commit $(get_git_short_rev "$UPDATE_DIR/$SCRIPT_NAME"))" + return 0 + fi + + mkdir -p "$(dirname "$DEPLOY_INSTALL_PATH")" + if ! cp "$remote" "$DEPLOY_INSTALL_PATH"; then + SUMMARY_UPDATER="ошибка копирования" + log_action "ERROR: не удалось обновить $DEPLOY_INSTALL_PATH из git" + return 1 + fi + chmod 750 "$DEPLOY_INSTALL_PATH" + SUMMARY_UPDATER="обновлён из git (${installed_sum:0:8}…→${remote_sum:0:8}…)" + log_action "updater: записан $DEPLOY_INSTALL_PATH из клона (новый sha ${remote_sum:0:16}…)" + + if [ "$self" = "$installed_path" ] && [ "${UPDATER_REEXEC_GUARD:-0}" != "1" ]; then + log_action "updater: перезапуск с новой версией (расширенный лог)…" + UPDATER_REEXEC_GUARD=1 exec /bin/bash "$DEPLOY_INSTALL_PATH" "$@" + fi + + if [ "$self" != "$installed_path" ]; then + log_action "updater: сейчас запущен $self — в cron используйте $DEPLOY_INSTALL_PATH" + fi + return 0 +} + restart_ssh_monitor_service() { debug_step "Перезапускаем сервис ssh-monitor.service" if command -v systemctl &>/dev/null; then @@ -627,7 +674,7 @@ restart_ssh_monitor_service() { fi } -# Функция для обновления скрипта +# Функция для обновления скрипта (принимает "$@" для re-exec updater) update_script() { local git_repo="$UPDATE_DIR/$SCRIPT_NAME" local git_before="" git_after="" pull_ok=1 @@ -693,6 +740,8 @@ update_script() { log_action "git clone: успех (commit $git_after)" fi + sync_installed_updater_from_clone "$@" + actual_script_path="$(find_remote_ssh_monitor_path 2>/dev/null || true)" debug_step "Путь к ssh-monitor в клоне: ${actual_script_path:-не найден}" @@ -814,7 +863,7 @@ if ! ensure_ipset_installed; then exit 1 fi -update_script +update_script "$@" exit_code=$? if [ "$exit_code" -eq 0 ] && [ "$DEPLOY_MODE" -eq 1 ]; then