fix: always sync sac-client.sh in update_ssh_monitor

Copy sac-client.sh on every git pull by checksum, not only when
ssh-monitor binary changes. Restart service when either file updates.
This commit is contained in:
2026-05-27 12:20:14 +10:00
parent 18562af07a
commit 4cb158f30a
3 changed files with 100 additions and 35 deletions
+2 -2
View File
@@ -8,7 +8,7 @@ Bash-скрипт мониторинга **SSH**, **SUDO** и событий **`
|------|------------| |------|------------|
| **`ssh-monitor`** | Основной цикл: разбор журналов (**journalctl**: sshd, sudo, «тяжёлые» события, **systemd-logind**), цепочка уведомлений (Telegram, SMTP через **python3**, резервный webhook), при **`ENABLE_IP_BAN=1`** — учёт неудачных попыток, бан в **ipset** и согласование с **iptables**/**ip6tables**, ежедневный отчёт, heartbeat, опционально **Prometheus** textfile и JSON health. Режимы: **`--check-config`**, **`--dry-run`**. | | **`ssh-monitor`** | Основной цикл: разбор журналов (**journalctl**: sshd, sudo, «тяжёлые» события, **systemd-logind**), цепочка уведомлений (Telegram, SMTP через **python3**, резервный webhook), при **`ENABLE_IP_BAN=1`** — учёт неудачных попыток, бан в **ipset** и согласование с **iptables**/**ip6tables**, ежедневный отчёт, heartbeat, опционально **Prometheus** textfile и JSON health. Режимы: **`--check-config`**, **`--dry-run`**. |
| **`ssh-monitor-watchdog`** | Отдельный скрипт (обычно по **systemd timer**): проверяет, что сервис монитора активен и файл heartbeat не старше порога; при сбое выполняет **`systemctl restart`** и шлёт уведомление в Telegram или в **`BACKUP_WEBHOOK_URL`**. Читает те же `TELEGRAM_*` / webhook из `/etc/ssh-monitor.conf`. | | **`ssh-monitor-watchdog`** | Отдельный скрипт (обычно по **systemd timer**): проверяет, что сервис монитора активен и файл heartbeat не старше порога; при сбое выполняет **`systemctl restart`** и шлёт уведомление в Telegram или в **`BACKUP_WEBHOOK_URL`**. Читает те же `TELEGRAM_*` / webhook из `/etc/ssh-monitor.conf`. |
| **`update_ssh_monitor.sh`** | Опциональное автообновление: `git pull` / `clone`, сравнение SHA256 с `/usr/local/bin/ssh-monitor`, перезапуск `ssh-monitor.service`. См. [docs/auto-update.ru.md](docs/auto-update.ru.md). | | **`update_ssh_monitor.sh`** | Опциональное автообновление: `git pull` / `clone`, сравнение SHA256 с `/usr/local/bin/ssh-monitor`, синхронизация **`sac-client.sh`** рядом с монитором, перезапуск `ssh-monitor.service`. См. [docs/auto-update.ru.md](docs/auto-update.ru.md). |
**Системные пакеты и зависимости** (что поставить на сервер до запуска): пошагово в [docs/install-prerequisites.ru.md](docs/install-prerequisites.ru.md). **Системные пакеты и зависимости** (что поставить на сервер до запуска): пошагово в [docs/install-prerequisites.ru.md](docs/install-prerequisites.ru.md).
@@ -123,7 +123,7 @@ Bash-скрипт мониторинга **SSH**, **SUDO** и событий **`
### Автообновление скрипта ### Автообновление скрипта
Скрипт **`update_ssh_monitor.sh`** по расписанию (cron или systemd timer) выполняет `git pull` / `clone`, сравнивает SHA256 с `/usr/local/bin/ssh-monitor` и при отличии копирует новую версию и перезапускает **`ssh-monitor.service`**. Конфиг **`/etc/ssh-monitor.conf`** не трогается. Скрипт **`update_ssh_monitor.sh`** по расписанию (cron или systemd timer) выполняет `git pull` / `clone`, сравнивает SHA256 с `/usr/local/bin/ssh-monitor`, **всегда** подтягивает **`/usr/local/bin/sac-client.sh`** и при изменении любого из файлов перезапускает **`ssh-monitor.service`**. Конфиг **`/etc/ssh-monitor.conf`** не трогается.
Пошаговая настройка: [docs/auto-update.ru.md](docs/auto-update.ru.md). Пошаговая настройка: [docs/auto-update.ru.md](docs/auto-update.ru.md).
+13 -8
View File
@@ -13,20 +13,25 @@
- `$UPDATE_DIR/ssh-monitor/src/branch/main/ssh-monitor` (структура GitLab); - `$UPDATE_DIR/ssh-monitor/src/branch/main/ssh-monitor` (структура GitLab);
- `$UPDATE_DIR/ssh-monitor/ssh-monitor` (плоский репозиторий, как в этом проекте). - `$UPDATE_DIR/ssh-monitor/ssh-monitor` (плоский репозиторий, как в этом проекте).
5. Сравнивает **SHA256** удалённого файла с **`LOCAL_SCRIPT_PATH`** (по умолчанию `/usr/local/bin/ssh-monitor`). 5. Сравнивает **SHA256** удалённого файла с **`LOCAL_SCRIPT_PATH`** (по умолчанию `/usr/local/bin/ssh-monitor`).
6. При отличии: 6. **Всегда** (независимо от шага 5) синхронизирует **`sac-client.sh`** в каталог рядом с монитором (по умолчанию **`/usr/local/bin/sac-client.sh`**) — нужен для **`UseSAC`** и **`--check-sac`**.
- резервная копия `ssh-monitor.backup.YYYYMMDD_HHMMSS`; 7. При отличии checksum **`ssh-monitor`** и/или **`sac-client.sh`**:
- `cp` + `chmod +x`; - резервная копия `ssh-monitor.backup.YYYYMMDD_HHMMSS` (только для основного скрипта);
- `cp` + `chmod +x` для `ssh-monitor`, `chmod 644` для `sac-client.sh`;
- **`systemctl restart ssh-monitor.service`** (если есть systemctl). - **`systemctl restart ssh-monitor.service`** (если есть systemctl).
7. Пишет лог в **`LOG_FILE`** (по умолчанию `/var/log/update_script.log`). 8. Пишет лог в **`LOG_FILE`** (по умолчанию `/var/log/update_script.log`).
```mermaid ```mermaid
flowchart LR flowchart LR
A[cron/timer] --> B[update_ssh_monitor.sh] A[cron/timer] --> B[update_ssh_monitor.sh]
B --> C[git pull/clone] B --> C[git pull/clone]
C --> D{SHA256 различается?} C --> D[sync sac-client.sh]
D -->|да| E[backup + cp] C --> E{SHA256 ssh-monitor?}
E --> F[restart ssh-monitor.service] D --> F{что-то обновилось?}
D -->|нет| G[без изменений] E -->|да| G[backup + cp ssh-monitor]
E -->|нет| F
G --> F
F -->|да| H[restart ssh-monitor.service]
F -->|нет| I[без изменений]
``` ```
## Настройка перед первым запуском ## Настройка перед первым запуском
+85 -25
View File
@@ -195,6 +195,78 @@ ensure_directories() {
return 0 return 0
} }
# Путь к sac-client.sh в клоне репозитория (корень git)
find_sac_client_remote() {
local candidates=(
"$UPDATE_DIR/$SCRIPT_NAME/sac-client.sh"
)
local p
for p in "${candidates[@]}"; do
if [ -f "$p" ]; then
printf '%s\n' "$p"
return 0
fi
done
return 1
}
# Копирует sac-client.sh рядом с LOCAL_SCRIPT_PATH (всегда после git pull, по checksum).
# Устанавливает SAC_CLIENT_CHANGED=1 при фактическом обновлении файла.
sync_sac_client() {
SAC_CLIENT_CHANGED=0
local remote local_dst local_sum remote_sum
remote=$(find_sac_client_remote) || {
log_message "INFO" "WARNING: sac-client.sh not found in repository clone"
debug_step "sac-client.sh не найден в клоне репозитория"
return 0
}
local_dst="${LOCAL_SCRIPT_PATH%/*}/sac-client.sh"
remote_sum=$(sha256sum "$remote" 2>/dev/null | awk '{print $1}')
if [ -z "$remote_sum" ]; then
log_message "INFO" "ERROR: Failed to checksum remote sac-client.sh"
return 1
fi
if [ -f "$local_dst" ]; then
local_sum=$(sha256sum "$local_dst" 2>/dev/null | awk '{print $1}')
if [ "$local_sum" = "$remote_sum" ]; then
log_message "INFO" "sac-client.sh checksums match. No update needed."
debug_step "sac-client.sh без изменений"
return 0
fi
else
log_message "INFO" "Local sac-client.sh not found. Will install."
debug_step "Локальный sac-client.sh отсутствует, будет установлен"
fi
debug_step "Копируем sac-client.sh в $local_dst"
if ! cp "$remote" "$local_dst"; then
log_message "INFO" "ERROR: Failed to copy sac-client.sh"
return 1
fi
chmod 644 "$local_dst"
SAC_CLIENT_CHANGED=1
log_message "INFO" "sac-client.sh updated."
return 0
}
restart_ssh_monitor_service() {
debug_step "Перезапускаем сервис ssh-monitor.service"
if command -v systemctl &>/dev/null; then
if systemctl restart ssh-monitor.service 2>/dev/null; then
log_message "INFO" "Service restarted successfully."
debug_step "Сервис успешно перезапущен"
else
log_message "INFO" "WARNING: Failed to restart service (may not be running)"
debug_step "ПРЕДУПРЕЖДЕНИЕ: Не удалось перезапустить сервис"
fi
else
log_message "INFO" "systemctl not found, service not restarted"
debug_step "systemctl не найден, сервис не перезапущен"
fi
}
# Функция для обновления скрипта # Функция для обновления скрипта
update_script() { update_script() {
log_message "INFO" "Starting script update..." log_message "INFO" "Starting script update..."
@@ -248,6 +320,14 @@ update_script() {
debug_step "Скрипт найден по альтернативному пути" debug_step "Скрипт найден по альтернативному пути"
fi fi
# sac-client.sh — отдельно от ssh-monitor: синхронизируем всегда (нужен для UseSAC/--check-sac)
SAC_CLIENT_CHANGED=0
if ! sync_sac_client; then
return 1
fi
local script_changed=0
# Проверяем наличие файла скрипта в репозитории # Проверяем наличие файла скрипта в репозитории
if [ -n "$actual_script_path" ] && [ -f "$actual_script_path" ]; then if [ -n "$actual_script_path" ] && [ -f "$actual_script_path" ]; then
log_message "INFO" "Remote script found. Comparing checksums..." log_message "INFO" "Remote script found. Comparing checksums..."
@@ -287,33 +367,9 @@ update_script() {
debug_step "Делаем скрипт исполняемым" debug_step "Делаем скрипт исполняемым"
chmod +x "$LOCAL_SCRIPT_PATH" chmod +x "$LOCAL_SCRIPT_PATH"
# sac-client.sh должен лежать рядом с ssh-monitor (тот же каталог) script_changed=1
SAC_CLIENT_LOCAL="${LOCAL_SCRIPT_PATH%/*}/sac-client.sh"
SAC_CLIENT_REMOTE="$UPDATE_DIR/$SCRIPT_NAME/sac-client.sh"
if [ -f "$SAC_CLIENT_REMOTE" ]; then
debug_step "Копируем sac-client.sh"
cp "$SAC_CLIENT_REMOTE" "$SAC_CLIENT_LOCAL"
chmod 644 "$SAC_CLIENT_LOCAL"
log_message "INFO" "sac-client.sh updated."
fi
log_message "INFO" "Script updated successfully." log_message "INFO" "Script updated successfully."
debug_step "Скрипт успешно обновлен" debug_step "Скрипт успешно обновлен"
# Перезапускаем сервис
debug_step "Перезапускаем сервис ssh-monitor.service"
if command -v systemctl &>/dev/null; then
if systemctl restart ssh-monitor.service 2>/dev/null; then
log_message "INFO" "Service restarted successfully."
debug_step "Сервис успешно перезапущен"
else
log_message "INFO" "WARNING: Failed to restart service (may not be running)"
debug_step "ПРЕДУПРЕЖДЕНИЕ: Не удалось перезапустить сервис"
fi
else
log_message "INFO" "systemctl not found, service not restarted"
debug_step "systemctl не найден, сервис не перезапущен"
fi
else else
log_message "INFO" "Checksums match. No update needed." log_message "INFO" "Checksums match. No update needed."
debug_step "Контрольные суммы совпадают, обновление не требуется" debug_step "Контрольные суммы совпадают, обновление не требуется"
@@ -333,6 +389,10 @@ update_script() {
fi fi
fi fi
if [ "$script_changed" -eq 1 ] || [ "${SAC_CLIENT_CHANGED:-0}" -eq 1 ]; then
restart_ssh_monitor_service
fi
# Логируем значения переменных скрипта при DEBUG=1 # Логируем значения переменных скрипта при DEBUG=1
log_script_vars log_script_vars