4cb158f30a
Copy sac-client.sh on every git pull by checksum, not only when ssh-monitor binary changes. Restart service when either file updates.
132 lines
5.6 KiB
Markdown
132 lines
5.6 KiB
Markdown
# Автообновление ssh-monitor
|
||
|
||
Скрипт **`update_ssh_monitor.sh`** в корне репозитория обновляет установленный **`/usr/local/bin/ssh-monitor`** из git-репозитория и перезапускает systemd-сервис. Конфиг **`/etc/ssh-monitor.conf`**, watchdog и таймеры **не изменяются**.
|
||
|
||
Установка самого монитора и unit-файлов: [README.md](../README.md), зависимости: [install-prerequisites.ru.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`).
|
||
|
||
```mermaid
|
||
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` в файле.
|
||
|
||
## Установка
|
||
|
||
```bash
|
||
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
|
||
```
|
||
|
||
Проверка вручную:
|
||
|
||
```bash
|
||
sudo /opt/scripts/update_ssh_monitor.sh
|
||
sudo tail -20 /var/log/update_script.log
|
||
sudo systemctl status ssh-monitor
|
||
```
|
||
|
||
## Запуск по расписанию
|
||
|
||
### Cron (пример: каждый день в 04:00)
|
||
|
||
```bash
|
||
sudo crontab -e
|
||
```
|
||
|
||
Добавьте:
|
||
|
||
```
|
||
0 4 * * * /opt/scripts/update_ssh_monitor.sh
|
||
```
|
||
|
||
### systemd timer (альтернатива)
|
||
|
||
Создайте `/etc/systemd/system/ssh-monitor-update.service`:
|
||
|
||
```ini
|
||
[Unit]
|
||
Description=Update ssh-monitor from git
|
||
|
||
[Service]
|
||
Type=oneshot
|
||
ExecStart=/opt/scripts/update_ssh_monitor.sh
|
||
```
|
||
|
||
И `/etc/systemd/system/ssh-monitor-update.timer`:
|
||
|
||
```ini
|
||
[Unit]
|
||
Description=Daily ssh-monitor update
|
||
|
||
[Timer]
|
||
OnCalendar=*-*-* 04:00:00
|
||
Persistent=true
|
||
|
||
[Install]
|
||
WantedBy=timers.target
|
||
```
|
||
|
||
```bash
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl enable --now ssh-monitor-update.timer
|
||
```
|
||
|
||
## Откат после неудачного обновления
|
||
|
||
Резервные копии лежат рядом с установленным скриптом:
|
||
|
||
```bash
|
||
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 для форка.
|