Files
ssh-monitor/docs/auto-update.ru.md
T
PTah 4cb158f30a 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.
2026-05-27 12:20:14 +10:00

5.6 KiB
Raw Blame History

Автообновление ssh-monitor

Скрипт update_ssh_monitor.sh в корне репозитория обновляет установленный /usr/local/bin/ssh-monitor из git-репозитория и перезапускает systemd-сервис. Конфиг /etc/ssh-monitor.conf, watchdog и таймеры не изменяются.

Установка самого монитора и unit-файлов: README.md, зависимости: install-prerequisites.ru.md.

Что делает скрипт

  1. Создаёт рабочий каталог UPDATE_DIR (по умолчанию /opt/scripts/update).
  2. Проверяет наличие ipset; при отсутствии пытается установить через пакетный менеджер (apt, yum, dnf, pacman, zypper). Без ipset скрипт завершается с ошибкой — новая версия монитора с ENABLE_IP_BAN=1 требует ipset.
  3. В UPDATE_DIR выполняет git clone или git pull origin main репозитория.
  4. Ищет файл ssh-monitor в клоне:
    • $UPDATE_DIR/ssh-monitor/src/branch/main/ssh-monitor (структура GitLab);
    • $UPDATE_DIR/ssh-monitor/ssh-monitor (плоский репозиторий, как в этом проекте).
  5. Сравнивает SHA256 удалённого файла с LOCAL_SCRIPT_PATH (по умолчанию /usr/local/bin/ssh-monitor).
  6. Всегда (независимо от шага 5) синхронизирует sac-client.sh в каталог рядом с монитором (по умолчанию /usr/local/bin/sac-client.sh) — нужен для UseSAC и --check-sac.
  7. При отличии checksum ssh-monitor и/или sac-client.sh:
    • резервная копия ssh-monitor.backup.YYYYMMDD_HHMMSS (только для основного скрипта);
    • cp + chmod +x для ssh-monitor, chmod 644 для sac-client.sh;
    • systemctl restart ssh-monitor.service (если есть systemctl).
  8. Пишет лог в LOG_FILE (по умолчанию /var/log/update_script.log).
flowchart LR
  A[cron/timer] --> B[update_ssh_monitor.sh]
  B --> C[git pull/clone]
  C --> D[sync sac-client.sh]
  C --> E{SHA256 ssh-monitor?}
  D --> F{что-то обновилось?}
  E -->|да| G[backup + cp ssh-monitor]
  E -->|нет| F
  G --> F
  F -->|да| H[restart ssh-monitor.service]
  F -->|нет| I[без изменений]

Настройка перед первым запуском

Отредактируйте переменные в начале update_ssh_monitor.sh:

Переменная По умолчанию Назначение
UPDATE_DIR /opt/scripts/update Каталог для git-клона
REPO_URL https://git.kalinamall.ru/PapaTramp/ssh-monitor.git URL закрытого репозитория (на GitHub в репо — placeholder)
LOCAL_SCRIPT_PATH /usr/local/bin/ssh-monitor Куда копировать бинарник
LOG_FILE /var/log/update_script.log Лог обновлений
DEBUG 0 1 — подробный DEBUG в лог

Требования на сервере:

  • root (или sudo) для cp, systemctl, установки ipset;
  • git и сетевой доступ к репозиторию (SSH-ключ или HTTPS);
  • ветка в скрипте жёстко main — при другой ветке измените git pull в файле.

Установка

sudo mkdir -p /opt/scripts
sudo cp 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
sudo tail -20 /var/log/update_script.log
sudo systemctl status ssh-monitor

Запуск по расписанию

Cron (пример: каждый день в 04:00)

sudo crontab -e

Добавьте:

0 4 * * * /opt/scripts/update_ssh_monitor.sh

systemd timer (альтернатива)

Создайте /etc/systemd/system/ssh-monitor-update.service:

[Unit]
Description=Update ssh-monitor from git

[Service]
Type=oneshot
ExecStart=/opt/scripts/update_ssh_monitor.sh

И /etc/systemd/system/ssh-monitor-update.timer:

[Unit]
Description=Daily ssh-monitor update

[Timer]
OnCalendar=*-*-* 04:00:00
Persistent=true

[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now ssh-monitor-update.timer

Откат после неудачного обновления

Резервные копии лежат рядом с установленным скриптом:

ls -la /usr/local/bin/ssh-monitor.backup.*
sudo cp /usr/local/bin/ssh-monitor.backup.YYYYMMDD_HHMMSS /usr/local/bin/ssh-monitor
sudo systemctl restart ssh-monitor.service

Ограничения

  • Обновляется только файл ssh-monitor, не конфиг и не watchdog.
  • При недоступном git git pull пишет предупреждение и продолжает с локальной копией.
  • На git.kalinamall.ru в update_ssh_monitor.sh уже задан внутренний REPO_URL; на GitHub остаётся placeholder для форка.