From bdb10e82d86bf89adb4c15cd29407dfc77791b64 Mon Sep 17 00:00:00 2001 From: PTah Date: Tue, 14 Apr 2026 08:05:50 +1000 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F=20?= =?UTF-8?q?0.9.0,=20--version=20=D0=B8=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=20?= =?UTF-8?q?=D0=B2=20=D0=BB=D0=BE=D0=B3/health/=D1=81=D1=82=D0=B0=D1=80?= =?UTF-8?q?=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SSH_MONITOR_VERSION + суффикс +git[-dirty] при запуске из репозитория - README: раздел про версионирование Made-with: Cursor --- README.md | 15 +++++++++++++++ ssh-monitor | 41 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ea36fe0..97e85d6 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,21 @@ sudo bash ./ssh-monitor --check-config sudo bash ./ssh-monitor --dry-run ``` +Версия (одна строка в stdout, **без** root и без чтения конфига): + +```bash +bash ./ssh-monitor --version +# или краткий флаг: -V +``` + +### Версионирование + +- В начале скрипта задаётся **`SSH_MONITOR_VERSION`** (семантическая версия, сейчас ориентир **0.9.x** до первого стабильного релиза **1.0.0**). +- При запуске **из каталога git-репозитория** к строке версии добавляется **`+<короткий коммит>`**; при незакоммиченных изменениях — суффикс **`-dirty`**. Установленная копия в `/usr/local/bin` без `.git` рядом показывает только semver. +- Строка версии пишется в **`LOG_FILE`** после загрузки конфига, выводится в **`--check-config`**, в Telegram при **старте** сервиса и попадает в **`HEALTHCHECK_STATUS_FILE`** (поле JSON **`version`**), если файл health задан. + +Перед релизом или значимым этапом обновляйте **`SSH_MONITOR_VERSION`** в `ssh-monitor` вручную (и при необходимости теги `v…` в git). + ## Проверка синтаксиса ```bash diff --git a/ssh-monitor b/ssh-monitor index 8b67fb6..df75ff8 100644 --- a/ssh-monitor +++ b/ssh-monitor @@ -6,6 +6,9 @@ IFS=$'\n\t' # КОНФИГУРАЦИЯ # ============================================ +# Семантическая версия. При запуске из git-репозитория к строке добавляется +<короткий sha> и при грязном дереве суффикс -dirty (см. ssh_monitor_version_display). +SSH_MONITOR_VERSION="0.9.0" + CONFIG_FILE="/etc/ssh-monitor.conf" TELEGRAM_BOT_TOKEN="" @@ -66,10 +69,36 @@ declare -A FAIL_COUNTS declare -A BRUTE_LAST_NOTIFY CHECK_CONFIG_ONLY=0 +SHOW_VERSION=0 DRY_RUN=0 # Защита от двойного вызова: при SIGTERM срабатывает trap TERM, затем при выходе — trap EXIT SHUTDOWN_NOTIFIED=0 +# Полная строка версии для логов, --version и Telegram (без загрузки конфига). +ssh_monitor_version_display() { + local ver base_dir rev + ver="${SSH_MONITOR_VERSION:-0.9.0}" + base_dir="" + if [ -n "${BASH_SOURCE[0]:-}" ]; then + base_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd 2>/dev/null)" || base_dir="" + fi + if [ -z "$base_dir" ]; then + base_dir="$(cd "$(dirname "$0")" && pwd 2>/dev/null)" || base_dir="" + fi + if [ -n "$base_dir" ] && command -v git >/dev/null 2>&1; then + if git -C "$base_dir" rev-parse --is-inside-work-tree >/dev/null 2>&1; then + rev=$(git -C "$base_dir" rev-parse --short HEAD 2>/dev/null || true) + if [ -n "$rev" ]; then + ver="${ver}+${rev}" + if ! git -C "$base_dir" diff --quiet 2>/dev/null; then + ver="${ver}-dirty" + fi + fi + fi + fi + printf '%s' "$ver" +} + trim_value() { local value="$1" value="${value#"${value%%[![:space:]]*}"}" @@ -1311,7 +1340,7 @@ write_health_and_metrics() { ts=$(date '+%s') if [ -n "${HEALTHCHECK_STATUS_FILE:-}" ]; then mkdir -p "$(dirname "$HEALTHCHECK_STATUS_FILE")" 2>/dev/null || true - printf '{"ts":%s,"hostname":"%s","dry_run":%s}\n' "$ts" "$(hostname | sed 's/"/\\"/g')" "$([[ "${DRY_RUN:-0}" = "1" ]] && echo true || echo false)" >"${HEALTHCHECK_STATUS_FILE}.tmp" + printf '{"ts":%s,"hostname":"%s","version":"%s","dry_run":%s}\n' "$ts" "$(hostname | sed 's/"/\\"/g')" "$(ssh_monitor_version_display | sed 's/"/\\"/g')" "$([[ "${DRY_RUN:-0}" = "1" ]] && echo true || echo false)" >"${HEALTHCHECK_STATUS_FILE}.tmp" mv "${HEALTHCHECK_STATUS_FILE}.tmp" "$HEALTHCHECK_STATUS_FILE" 2>/dev/null || true fi if [ -n "${PROMETHEUS_TEXTFILE_DIR:-}" ]; then @@ -1336,6 +1365,7 @@ send_startup_notification() { local whitelist_count=$((${#WHITELIST_IPS[@]} + ${#WHITELIST_SUBNETS[@]})) local message=" ✅ СКРИПТ МОНИТОРИНГА ЗАПУЩЕН "$'\n' + message="${message}📌 Версия: $(ssh_monitor_version_display)"$'\n' message="${message}🖥️ Сервер: $(hostname)"$'\n' message="${message}🕐 Время запуска: ${timestamp}"$'\n' message="${message}📊 Мониторинг SSH, SUDO и systemd-logind активирован"$'\n' @@ -1397,6 +1427,7 @@ main() { run_check_config() { printf 'Проверка конфигурации ssh-monitor\n' + printf 'Версия: %s\n' "$(ssh_monitor_version_display)" printf 'CONFIG_FILE=%s\n' "$CONFIG_FILE" printf 'TELEGRAM: %s\n' "$([ -n "$TELEGRAM_BOT_TOKEN" ] && echo настроен || echo НЕ настроен)" printf 'BACKUP_WEBHOOK_URL: %s\n' "$([ -n "${BACKUP_WEBHOOK_URL:-}" ] && echo настроен || echo не задан)" @@ -1424,6 +1455,7 @@ parse_args() { case "$a" in --check-config) CHECK_CONFIG_ONLY=1 ;; --dry-run) DRY_RUN=1 ;; + --version|-V) SHOW_VERSION=1 ;; esac done } @@ -1434,6 +1466,11 @@ parse_args() { parse_args "$@" +if [ "$SHOW_VERSION" = "1" ]; then + printf '%s\n' "$(ssh_monitor_version_display)" + exit 0 +fi + load_config validate_config @@ -1447,7 +1484,7 @@ trap send_shutdown_notification EXIT INT TERM mkdir -p "$(dirname "$LOG_FILE")" touch "$LOG_FILE" -write_log "Конфигурация загружена из $CONFIG_FILE (или дефолты)" +write_log "ssh-monitor $(ssh_monitor_version_display): конфигурация загружена из $CONFIG_FILE (или дефолты)" if [ "${DRY_RUN:-0}" = "1" ]; then write_log "Режим DRY-RUN: iptables/ip6tables не меняются, уведомления печатаются в stderr"