fix: sync /opt/scripts/update_ssh_monitor.sh from git clone each run

After git pull, copy updater from clone to DEPLOY_INSTALL_PATH and re-exec
once so cron always picks up new logging without manual cp.
This commit is contained in:
PTah
2026-05-28 08:15:51 +10:00
parent f3b7c9d41c
commit 7f4d25b91c
2 changed files with 59 additions and 2 deletions
+8
View File
@@ -157,6 +157,14 @@ sudo /opt/scripts/update_ssh_monitor.sh
sudo tail -40 /var/log/update_script.log 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. - Обновляется **только** файл **`ssh-monitor`**, не конфиг и не watchdog.
+51 -2
View File
@@ -20,6 +20,7 @@ SUMMARY_SAC_REASON="—"
SUMMARY_CONFIG="—" SUMMARY_CONFIG="—"
SUMMARY_GIT="—" SUMMARY_GIT="—"
SUMMARY_SERVICE_RESTART="—" SUMMARY_SERVICE_RESTART="—"
SUMMARY_UPDATER="—"
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"
@@ -251,6 +252,7 @@ log_update_summary() {
log_action "sac-client.sh: $SUMMARY_SAC_CLIENT ($SUMMARY_SAC_REASON)" log_action "sac-client.sh: $SUMMARY_SAC_CLIENT ($SUMMARY_SAC_REASON)"
log_action "конфиг: $SUMMARY_CONFIG" log_action "конфиг: $SUMMARY_CONFIG"
log_action "git: $SUMMARY_GIT" log_action "git: $SUMMARY_GIT"
log_action "updater ($DEPLOY_INSTALL_PATH): $SUMMARY_UPDATER"
log_action "перезапуск ssh-monitor.service: $SUMMARY_SERVICE_RESTART" log_action "перезапуск ssh-monitor.service: $SUMMARY_SERVICE_RESTART"
log_action "полный лог: $LOG_FILE" log_action "полный лог: $LOG_FILE"
log_action "===========================" log_action "==========================="
@@ -608,6 +610,51 @@ deploy_post_install() {
print_config_variables_help 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() { 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
@@ -627,7 +674,7 @@ restart_ssh_monitor_service() {
fi fi
} }
# Функция для обновления скрипта # Функция для обновления скрипта (принимает "$@" для re-exec updater)
update_script() { update_script() {
local git_repo="$UPDATE_DIR/$SCRIPT_NAME" local git_repo="$UPDATE_DIR/$SCRIPT_NAME"
local git_before="" git_after="" pull_ok=1 local git_before="" git_after="" pull_ok=1
@@ -693,6 +740,8 @@ update_script() {
log_action "git clone: успех (commit $git_after)" log_action "git clone: успех (commit $git_after)"
fi fi
sync_installed_updater_from_clone "$@"
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:-не найден}"
@@ -814,7 +863,7 @@ if ! ensure_ipset_installed; then
exit 1 exit 1
fi fi
update_script update_script "$@"
exit_code=$? exit_code=$?
if [ "$exit_code" -eq 0 ] && [ "$DEPLOY_MODE" -eq 1 ]; then if [ "$exit_code" -eq 0 ] && [ "$DEPLOY_MODE" -eq 1 ]; then