feat: watchdog Telegram shows server name (2.1.9-SAC)

Add shared server label helpers in ssh-monitor-perms.sh; roadmap marks
phase 1 done and phase 2.2.0 as next release.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
PTah
2026-07-08 11:28:57 +10:00
parent 2048162057
commit 275d305d62
6 changed files with 52 additions and 10 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
# ssh-monitor # ssh-monitor
**Версия:** `2.1.8-SAC` **Версия:** `2.1.9-SAC`
Bash-мониторинг **SSH**, **sudo**, **systemd-logind**: Telegram/email, бан IP (ipset), ежедневный отчёт, heartbeat. Bash-мониторинг **SSH**, **sudo**, **systemd-logind**: Telegram/email, бан IP (ipset), ежедневный отчёт, heartbeat.
+9 -7
View File
@@ -24,11 +24,15 @@
|--------|------|------| |--------|------|------|
| **2.1.7-SAC** | Фаза 1 + выбранное из Фазы 4 | Права, `REPO_URL` обязателен, webhook, docs | ✅ реализовано | | **2.1.7-SAC** | Фаза 1 + выбранное из Фазы 4 | Права, `REPO_URL` обязателен, webhook, docs | ✅ реализовано |
| **2.1.8-SAC** | Дополнение к 1.1 | SAC-first update: hardening прав на каждом прогоне updater | ✅ реализовано | | **2.1.8-SAC** | Дополнение к 1.1 | SAC-first update: hardening прав на каждом прогоне updater | ✅ реализовано |
| **2.2.0-SAC** | Фаза 2 | Manifest, pinned ref, без слепого `reset --hard` | | **2.1.9-SAC** | Дополнение к 1.x | Watchdog: `🖥️ Сервер:` в Telegram (как у агента) | ✅ реализовано |
| **2.2.0-SAC** | **Фаза 2** | Manifest, pinned ref, без слепого `reset --hard` | **следующий релиз** |
| **2.3.0-SAC** | Фаза 3 | Парсер конфига без `source` (minor breaking) | | **2.3.0-SAC** | Фаза 3 | Парсер конфига без `source` (minor breaking) |
Bump: `ssh-monitor` (`SSH_MONITOR_VERSION`) + `version.txt` в каждом релизе. Bump: `ssh-monitor` (`SSH_MONITOR_VERSION`) + `version.txt` в каждом релизе.
**Текущий статус (2026-07-08):** фаза 1 закрыта (2.1.72.1.9). **Дальше — фаза 2 → релиз 2.2.0-SAC.**
Backlog по ingest при массовом update (SAC + ops): [ingest-mass-update-backlog.ru.md](https://git.kalinamall.ru/PapaTramp/security-alert-center/src/branch/main/docs/ingest-mass-update-backlog.ru.md) (отдельный ToDo, не блокирует 2.2.0).
--- ---
## Фаза 1 — 2.1.7-SAC ## Фаза 1 — 2.1.7-SAC
@@ -232,14 +236,12 @@ Bump: `ssh-monitor` (`SSH_MONITOR_VERSION`) + `version.txt` в каждом ре
## Чек-лист «перед стартом работы завтра» ## Чек-лист «перед стартом работы завтра»
Утвердить галочками: - [x] **Релиз 2.1.72.1.9** — фаза 1 + SAC-first + watchdog server label
- [ ] **Релиз 2.2.0** — scope: 2.12.3, 2.5, 4.5, 4.7(M7); **2.4 GPG отложить**
- [ ] **Релиз 2.1.7** — scope: 1.1, 1.2 (warn), 1.4, 1.5, 4.4, 4.3 + **1.3 вариант A/B/C**
- [ ] **Релиз 2.2.0** — scope: 2.12.3, 2.5, 4.5, 4.7(M7); **2.4 отложить**
- [ ] **Релиз 2.3.0** — scope: 3.13.3, удаление webhook (если A) - [ ] **Релиз 2.3.0** — scope: 3.13.3, удаление webhook (если A)
- [ ] **Дефолт `GIT_REF`** в 2.2.0: тег из `version.txt` vs `main` - [ ] **Дефолт `GIT_REF`** в 2.2.0: тег из `version.txt` vs `main`
- [ ] **Миграция хостов 2.1.7:** рассылка примера `Environment=REPO_URL=...` для systemd / SAC - [x] **Миграция хостов:** SAC-first update, `known_hosts`, `REPO_URL` через SAC
- [ ] **GPG:** отложить до явного запроса - [ ] **Ingest mass-update backlog** — см. security-alert-center `docs/ingest-mass-update-backlog.ru.md`
--- ---
+1 -1
View File
@@ -7,7 +7,7 @@ IFS=$'\n\t'
# ============================================ # ============================================
CONFIG_FILE="/etc/ssh-monitor.conf" CONFIG_FILE="/etc/ssh-monitor.conf"
SSH_MONITOR_VERSION="2.1.8-SAC" SSH_MONITOR_VERSION="2.1.9-SAC"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
if [ -f "$SCRIPT_DIR/ssh-monitor-perms.sh" ]; then if [ -f "$SCRIPT_DIR/ssh-monitor-perms.sh" ]; then
+39
View File
@@ -132,3 +132,42 @@ ssh_monitor_check_config_file_perms() {
esac esac
return 0 return 0
} }
# Подпись сервера в Telegram/webhook (как в ssh-monitor: SERVER_DISPLAY_NAME или hostname + IPv4).
ssh_monitor_server_display_name_with_ip() {
local hn ip
hn="${SERVER_DISPLAY_NAME:-}"
if [ -z "$hn" ]; then
hn="$(hostname 2>/dev/null | tr -d '\r\n')"
[ -z "$hn" ] && hn="(unknown)"
fi
ip="${SERVER_IPV4:-}"
if [ -z "$ip" ] && command -v ip >/dev/null 2>&1; then
ip="$(ip -4 route get 1.1.1.1 2>/dev/null | awk '/\bsrc\b/ {for (i = 1; i < NF; i++) if ($i == "src") { print $(i + 1); exit }}')"
[ -z "$ip" ] && ip="$(ip -4 route get 8.8.8.8 2>/dev/null | awk '/\bsrc\b/ {for (i = 1; i < NF; i++) if ($i == "src") { print $(i + 1); exit }}')"
fi
if [ -z "$ip" ] && command -v hostname >/dev/null 2>&1 && hostname -I >/dev/null 2>&1; then
ip="$(hostname -I 2>/dev/null | tr ' ' '\n' | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' | grep -Ev '^(127\.|0\.0\.0\.0)$' | head -n1)"
fi
if [ -n "$ip" ]; then
printf '%s (%s)' "$hn" "$ip"
else
printf '%s' "$hn"
fi
}
ssh_monitor_message_ensure_server_line() {
local msg="$1"
if [[ "$msg" == *'🖥️ Сервер:'* ]]; then
printf '%s' "$msg"
return 0
fi
local first rest
first="${msg%%$'\n'*}"
if [ "$first" = "$msg" ]; then
printf '%s\n🖥️ Сервер: %s' "$first" "$(ssh_monitor_server_display_name_with_ip)"
else
rest="${msg#*$'\n'}"
printf '%s\n🖥️ Сервер: %s\n%s' "$first" "$(ssh_monitor_server_display_name_with_ip)" "$rest"
fi
}
+1
View File
@@ -67,6 +67,7 @@ PY
notify_send() { notify_send() {
local message="$1" local message="$1"
message="$(ssh_monitor_message_ensure_server_line "$message")"
if send_telegram_raw "$message"; then if send_telegram_raw "$message"; then
return 0 return 0
fi fi
+1 -1
View File
@@ -1 +1 @@
2.1.8-SAC 2.1.9-SAC