4cb158f30a
Copy sac-client.sh on every git pull by checksum, not only when ssh-monitor binary changes. Restart service when either file updates.
5.6 KiB
5.6 KiB
Автообновление 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.
Что делает скрипт
- Создаёт рабочий каталог
UPDATE_DIR(по умолчанию/opt/scripts/update). - Проверяет наличие
ipset; при отсутствии пытается установить через пакетный менеджер (apt, yum, dnf, pacman, zypper). Без ipset скрипт завершается с ошибкой — новая версия монитора сENABLE_IP_BAN=1требует ipset. - В
UPDATE_DIRвыполняетgit cloneилиgit pull origin mainрепозитория. - Ищет файл
ssh-monitorв клоне:$UPDATE_DIR/ssh-monitor/src/branch/main/ssh-monitor(структура GitLab);$UPDATE_DIR/ssh-monitor/ssh-monitor(плоский репозиторий, как в этом проекте).
- Сравнивает SHA256 удалённого файла с
LOCAL_SCRIPT_PATH(по умолчанию/usr/local/bin/ssh-monitor). - Всегда (независимо от шага 5) синхронизирует
sac-client.shв каталог рядом с монитором (по умолчанию/usr/local/bin/sac-client.sh) — нужен дляUseSACи--check-sac. - При отличии 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).
- резервная копия
- Пишет лог в
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 для форка.