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:
+51
-2
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user