Compare commits
3 Commits
6bff073108
...
8a97bbfb43
| Author | SHA1 | Date | |
|---|---|---|---|
| 8a97bbfb43 | |||
| 2069e57f14 | |||
| 6b288bfa49 |
@@ -18,6 +18,7 @@
|
||||
| [seaca-mobile.md](seaca-mobile.md) | **Seaca**: коды, устройства, сессия, API |
|
||||
| [seaca-fcm.md](seaca-fcm.md) | **Seaca push**: Firebase и `SAC_FCM_*` |
|
||||
| [workspace-three-repos.md](workspace-three-repos.md) | Multi-root workspace (три репо) |
|
||||
| [agent-update-backlog.md](agent-update-backlog.md) | **ToDo:** версии агентов, удалённое обновление |
|
||||
|
||||
## Порядок чтения
|
||||
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
# ToDo — управление версиями агентов и удалённое обновление
|
||||
|
||||
**Статус:** идея, требует проработки архитектуры.
|
||||
**Связано:** [roadmap.md](roadmap.md) (v0.7), [agent-integration.md](agent-integration.md), UI «Хосты».
|
||||
|
||||
---
|
||||
|
||||
## Цель
|
||||
|
||||
SAC должен:
|
||||
|
||||
1. **Отслеживать соответствие версий** агентов (`ssh-monitor`, `RDP-login-monitor`) ожидаемым/минимальным для текущей версии SAC.
|
||||
2. **Инициировать обновление удалённо** с компьютеров/серверов из UI SAC (или по политике), без ручного захода на каждый хост.
|
||||
|
||||
Сейчас версии видны по `host.product_version` и heartbeat; обновление — вручную (`update_ssh_monitor.sh`, `Deploy-LoginMonitor.ps1` / NETLOGON, GPO).
|
||||
|
||||
---
|
||||
|
||||
## Вопросы для проработки
|
||||
|
||||
| # | Тема | Варианты / заметки |
|
||||
|---|------|-------------------|
|
||||
| 1 | **Источник истины версии** | Матрица в SAC (min/recommended per `product`); теги в репо; отдельный manifest API |
|
||||
| 2 | **Сигнал «устарел»** | Problem `agent.version.stale`; severity на карточке хоста; дашборд «не на версии» |
|
||||
| 3 | **Канал команд** | Pull-only (агент сам тянет по расписанию) vs push-команда от SAC (нужен обратный канал) |
|
||||
| 4 | **Linux** | Вызов `update_ssh_monitor.sh` по systemd timer + флаг «pending update» из SAC ingest response? Отдельный `agent.command` event? SSH/Ansible с SAC — вне scope агента |
|
||||
| 5 | **Windows** | GPO/NETLOGON уже есть; remote = триггер `Deploy-LoginMonitor.ps1` через scheduled task / WinRM / SCCM — что допустимо по безопасности |
|
||||
| 6 | **Авторизация** | Только admin SAC; audit log; подтверждение массового обновления; rate limit |
|
||||
| 7 | **Отчёт о результате** | `agent.update.started` / `agent.update.success` / `agent.update.failed` в ingest; привязка к `host_id` |
|
||||
| 8 | **Сеть** | Агент за NAT только исходящий HTTPS — предпочтителен **pull**, не inbound на хост |
|
||||
| 9 | **Совместимость** | Связка с `schema_version`, откат, окно maintenance |
|
||||
|
||||
---
|
||||
|
||||
## Черновые критерии приёмки (когда дойдём до реализации)
|
||||
|
||||
- [ ] В UI «Хосты»: колонка/бейдж «версия OK / устарела / неизвестна».
|
||||
- [ ] Настройка минимальной/рекомендуемой версии по продукту в SAC (или env).
|
||||
- [ ] Problem или оповещение при расхождении (с cooldown).
|
||||
- [ ] Действие admin: «Запросить обновление» на одном хосте / группе (MVP).
|
||||
- [ ] Агент подтверждает попытку обновления событием в SAC.
|
||||
- [ ] Документация: Linux + Windows runbook, ограничения безопасности.
|
||||
|
||||
---
|
||||
|
||||
## Не в первой итерации (вероятно)
|
||||
|
||||
- Полная замена Ansible/GPO/SCCM.
|
||||
- Обновление SAC с агентов.
|
||||
- macOS-агент.
|
||||
|
||||
---
|
||||
|
||||
## См. также
|
||||
|
||||
- [analytics-backlog.md](analytics-backlog.md) — отложенная аналитика
|
||||
- [todo-2026-05-29.md](todo-2026-05-29.md) — оповещения и настройки
|
||||
- Репозитории агентов: `update_ssh_monitor.sh`, `Deploy-LoginMonitor.ps1`, `update-rdp-monitor.ps1`
|
||||
@@ -81,6 +81,20 @@
|
||||
|
||||
---
|
||||
|
||||
## v0.7 — Версии агентов и удалённое обновление (ToDo)
|
||||
|
||||
**Цель:** SAC контролирует актуальность `ssh-monitor` и `RDP-login-monitor` на хостах и может **инициировать обновление** без обхода всех машин вручную.
|
||||
|
||||
- Сверка `product_version` с политикой SAC (min / recommended)
|
||||
- UI: статус версии на карточке хоста, список отстающих
|
||||
- Problems / оповещения при устаревании агента
|
||||
- Команда обновления (предпочтительно **pull** с хоста: агент видит «нужно обновиться» и запускает свой updater)
|
||||
- События `agent.update.*` в ingest для аудита
|
||||
|
||||
**Проработка:** [agent-update-backlog.md](agent-update-backlog.md).
|
||||
|
||||
---
|
||||
|
||||
## Не планируется (пока)
|
||||
|
||||
- Замена Zabbix для инфраструктурного мониторинга
|
||||
|
||||
@@ -84,5 +84,6 @@ UseSAC=exclusive→ только SAC ingest; TG/email = настройки SAC (
|
||||
|
||||
- [TZ.md](TZ.md) §4.6 F-NOT-01 … F-NOT-05
|
||||
- [agent-integration.md](agent-integration.md) — режимы UseSAC
|
||||
- [agent-update-backlog.md](agent-update-backlog.md) — **ToDo:** версии агентов и удалённое обновление из SAC
|
||||
- `backend/app/config.py` — `telegram_*`
|
||||
- `backend/app/services/telegram_notify.py`
|
||||
|
||||
@@ -6,13 +6,13 @@
|
||||
|
||||
## 1. Расположение репозиториев (пример)
|
||||
|
||||
| Имя в workspace | Путь (пример Windows) | Публичный remote |
|
||||
|-----------------|----------------------|------------------|
|
||||
| Имя в workspace | Путь (пример Windows) | Remote |
|
||||
|-----------------|----------------------|--------|
|
||||
| `ssh-monitor` | `D:\Soft\Git\ssh-monitor` | git.kalinamall.ru/PapaTramp/ssh-monitor |
|
||||
| `rdp-monitor` | `D:\Soft\Git\RDP-login-monitor` | git.kalinamall.ru/PapaTramp/RDP-login-monitor |
|
||||
| `security-alert-center` | `D:\Soft\Git\security-alert-center` | git.kalinamall.ru/PapaTramp/security-alert-center |
|
||||
|
||||
Пути подставьте свои. Закрытый инстанс **git.kalinamall.ru** — зеркало с теми же репозиториями; ссылки в документации на каждом хосте должны вести **на этот же хост** (см. ниже).
|
||||
Пути подставьте свои.
|
||||
|
||||
---
|
||||
|
||||
@@ -53,32 +53,15 @@
|
||||
- Изменение схемы → обновить ТЗ + версию `schema_version` + оба агента.
|
||||
- Коммиты в три репо **раздельные**; связь через теги/версии в README (см. [roadmap.md](roadmap.md)).
|
||||
|
||||
### 4.1. Git: зеркала и ссылки в документации
|
||||
|
||||
В **main** ссылки между репозиториями указывают на **GitHub** (`https://git.kalinamall.ru/PapaTramp/...`).
|
||||
|
||||
Перед push на другой хост (kalinamall, papatramp) используйте скрипт зеркалирования — он подменяет URL в docs, пушит и **не оставляет** чужие ссылки в локальной ветке:
|
||||
|
||||
```powershell
|
||||
# security-alert-center (аналогичные скрипты — в соседних репо при необходимости)
|
||||
.\scripts\Rewrite-GitHostUrls.ps1 kalinamall # только проверка diff
|
||||
.\scripts\Push-Mirror.ps1 kalinamall # commit → push kalinamall → reset main
|
||||
.\scripts\Push-Mirror.ps1 github # push на GitHub после обычного commit
|
||||
```
|
||||
|
||||
Обычный цикл разработки:
|
||||
|
||||
```bash
|
||||
git add …
|
||||
git commit -m "…"
|
||||
git push github main
|
||||
# при необходимости синхронизировать kalinamall:
|
||||
# PowerShell: .\scripts\Push-Mirror.ps1 kalinamall
|
||||
git push kalinamall main
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. URL репозиториев (GitHub)
|
||||
## 5. URL репозиториев
|
||||
|
||||
| Проект | URL |
|
||||
|--------|-----|
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
# Push main to a mirror remote with host-specific doc URLs, without leaving URL churn on main.
|
||||
# Usage: .\scripts\Push-Mirror.ps1 github|kalinamall|papatramp
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[ValidateSet('github', 'kalinamall', 'papatramp')]
|
||||
[string]$Target
|
||||
)
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$Root = Split-Path -Parent $PSScriptRoot
|
||||
Set-Location $Root
|
||||
|
||||
$remote = switch ($Target) {
|
||||
'github' { 'github' }
|
||||
'kalinamall' { 'kalinamall' }
|
||||
'papatramp' { 'papatramp' }
|
||||
}
|
||||
|
||||
git remote get-url $remote 2>$null | Out-Null
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw "remote not configured: $remote"
|
||||
}
|
||||
|
||||
if ((git status --porcelain -uno)) {
|
||||
throw 'working tree has uncommitted tracked changes; commit or stash first'
|
||||
}
|
||||
|
||||
$before = (git rev-parse HEAD).Trim()
|
||||
& "$PSScriptRoot\Rewrite-GitHostUrls.ps1" -Target $Target
|
||||
|
||||
if (-not (git status --porcelain)) {
|
||||
Write-Output "no URL changes for $Target; pushing as-is"
|
||||
git push $remote main
|
||||
exit 0
|
||||
}
|
||||
|
||||
git add -A
|
||||
git commit -m "chore(docs): sync repository URLs for ${Target} mirror"
|
||||
git push --force-with-lease $remote main
|
||||
git reset --hard $before
|
||||
Write-Output "pushed $remote with ${Target} URLs; local main reset to $before"
|
||||
@@ -1,57 +0,0 @@
|
||||
# Rewrite cross-repo URLs in tracked docs/config for the target Git host.
|
||||
# Usage: .\scripts\Rewrite-GitHostUrls.ps1 github|kalinamall|papatramp
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[ValidateSet('github', 'kalinamall', 'papatramp')]
|
||||
[string]$Target
|
||||
)
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$Root = Split-Path -Parent $PSScriptRoot
|
||||
Set-Location $Root
|
||||
|
||||
switch ($Target) {
|
||||
'github' {
|
||||
$Base = 'https://github.com/PTah'
|
||||
$BlobSuffix = '/blob/main'
|
||||
}
|
||||
'kalinamall' {
|
||||
$Base = 'https://git.kalinamall.ru/PapaTramp'
|
||||
$BlobSuffix = '/src/branch/main'
|
||||
}
|
||||
'papatramp' {
|
||||
$Base = 'https://git.papatramp.ru/PTah'
|
||||
$BlobSuffix = '/src/branch/main'
|
||||
}
|
||||
}
|
||||
|
||||
$BaseHost = $Base -replace '^https://', ''
|
||||
|
||||
$patterns = @(
|
||||
@{ From = 'https://git.kalinamall.ru/PapaTramp/([^)/''"\s]+)/blob/main/'; To = "$Base/`$1$BlobSuffix/" }
|
||||
@{ From = 'https://git.kalinamall.ru/PapaTramp/([^)/''"\s]+)/src/branch/main/'; To = "$Base/`$1$BlobSuffix/" }
|
||||
@{ From = 'https://git.kalinamall.ru/PapaTramp/([^)/''"\s]+)/src/branch/main/'; To = "$Base/`$1$BlobSuffix/" }
|
||||
@{ From = 'https://git.kalinamall.ru/PapaTramp/'; To = "$Base/" }
|
||||
@{ From = 'https://git.kalinamall.ru/PapaTramp/'; To = "$Base/" }
|
||||
@{ From = 'https://git.kalinamall.ru/PapaTramp/'; To = "$Base/" }
|
||||
@{ From = 'git.kalinamall.ru/PapaTramp/'; To = "$BaseHost/" }
|
||||
@{ From = 'git.kalinamall.ru/PapaTramp/'; To = "$BaseHost/" }
|
||||
@{ From = 'git.kalinamall.ru/PapaTramp/'; To = "$BaseHost/" }
|
||||
)
|
||||
|
||||
$extensions = @('*.md', '*.json', '*.service', '*.example', '*.sh', '*.ps1', '*.yml', '*.yaml')
|
||||
$files = git ls-files $extensions 2>$null | Where-Object { $_ -and (Test-Path $_) }
|
||||
|
||||
foreach ($file in $files) {
|
||||
$content = [System.IO.File]::ReadAllText((Join-Path $Root $file))
|
||||
$updated = $content
|
||||
foreach ($p in $patterns) {
|
||||
$updated = [regex]::Replace($updated, $p.From, $p.To)
|
||||
}
|
||||
if ($updated -ne $content) {
|
||||
[System.IO.File]::WriteAllText((Join-Path $Root $file), $updated, [System.Text.UTF8Encoding]::new($false))
|
||||
Write-Output "updated: $file"
|
||||
}
|
||||
}
|
||||
|
||||
Write-Output "Rewrite-GitHostUrls: target=$Target base=$Base"
|
||||
@@ -1,43 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Push main to a mirror remote with host-specific doc URLs, without leaving URL churn on main.
|
||||
# Usage: push-mirror.sh github|kalinamall|papatramp
|
||||
set -euo pipefail
|
||||
|
||||
TARGET="${1:?usage: push-mirror.sh github|kalinamall|papatramp}"
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
cd "$ROOT"
|
||||
|
||||
case "$TARGET" in
|
||||
github) REMOTE=github ;;
|
||||
kalinamall) REMOTE=kalinamall ;;
|
||||
papatramp) REMOTE=papatramp ;;
|
||||
*)
|
||||
echo "unknown target: $TARGET" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
if ! git remote get-url "$REMOTE" >/dev/null 2>&1; then
|
||||
echo "remote not configured: $REMOTE" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! git diff --quiet || ! git diff --cached --quiet; then
|
||||
echo "working tree not clean; commit or stash first" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
BEFORE="$(git rev-parse HEAD)"
|
||||
bash "$ROOT/scripts/rewrite-git-host-urls.sh" "$TARGET"
|
||||
|
||||
if git diff --quiet; then
|
||||
echo "no URL changes for $TARGET; pushing as-is"
|
||||
git push "$REMOTE" main
|
||||
exit 0
|
||||
fi
|
||||
|
||||
git add -A
|
||||
git commit -m "chore(docs): sync repository URLs for ${TARGET} mirror"
|
||||
git push "$REMOTE" main
|
||||
git reset --hard "$BEFORE"
|
||||
echo "pushed $REMOTE with ${TARGET} URLs; local main reset to $BEFORE"
|
||||
@@ -1,67 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Rewrite cross-repo URLs in tracked docs/config for the target Git host.
|
||||
# Usage: rewrite-git-host-urls.sh github|kalinamall|papatramp
|
||||
set -euo pipefail
|
||||
|
||||
TARGET="${1:?usage: rewrite-git-host-urls.sh github|kalinamall|papatramp}"
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
cd "$ROOT"
|
||||
|
||||
case "$TARGET" in
|
||||
github)
|
||||
BASE='https://github.com/PTah'
|
||||
BLOB_SUFFIX='/blob/main'
|
||||
;;
|
||||
kalinamall)
|
||||
BASE='https://git.kalinamall.ru/PapaTramp'
|
||||
BLOB_SUFFIX='/src/branch/main'
|
||||
;;
|
||||
papatramp)
|
||||
BASE='https://git.papatramp.ru/PTah'
|
||||
BLOB_SUFFIX='/src/branch/main'
|
||||
;;
|
||||
*)
|
||||
echo "unknown target: $TARGET" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# Order matters: longer patterns first.
|
||||
PATTERNS=(
|
||||
's|https://git.kalinamall.ru/PapaTramp/\([^)/"'"'"' ]*\)/blob/main/|'"${BASE}"'/\1'"${BLOB_SUFFIX}"'/|g'
|
||||
's|https://git.kalinamall.ru/PapaTramp/\([^)/"'"'"' ]*\)/src/branch/main/|'"${BASE}"'/\1'"${BLOB_SUFFIX}"'/|g'
|
||||
's|https://git.kalinamall.ru/PapaTramp/\([^)/"'"'"' ]*\)/src/branch/main/|'"${BASE}"'/\1'"${BLOB_SUFFIX}"'/|g'
|
||||
's|https://git.kalinamall.ru/PapaTramp/|'"${BASE}"'/|g'
|
||||
's|https://git.kalinamall.ru/PapaTramp/|'"${BASE}"'/|g'
|
||||
's|https://git.kalinamall.ru/PapaTramp/|'"${BASE}"'/|g'
|
||||
's|git.kalinamall.ru/PapaTramp/|'"${BASE#https://}"'/|g'
|
||||
's|git.kalinamall.ru/PapaTramp/|'"${BASE#https://}"'/|g'
|
||||
's|git.kalinamall.ru/PapaTramp/|'"${BASE#https://}"'/|g'
|
||||
)
|
||||
|
||||
FILES=()
|
||||
while IFS= read -r -d '' f; do
|
||||
FILES+=("$f")
|
||||
done < <(git ls-files '*.md' '*.json' '*.service' '*.example' '*.sh' '*.ps1' '*.yml' '*.yaml' 2>/dev/null | tr '\n' '\0')
|
||||
|
||||
if [ "${#FILES[@]}" -eq 0 ]; then
|
||||
echo "no files to rewrite" >&2
|
||||
exit 0
|
||||
fi
|
||||
|
||||
for f in "${FILES[@]}"; do
|
||||
[ -f "$f" ] || continue
|
||||
tmp="$(mktemp)"
|
||||
cp "$f" "$tmp"
|
||||
for pat in "${PATTERNS[@]}"; do
|
||||
sed -i "$pat" "$tmp" 2>/dev/null || sed -i '' "$pat" "$tmp"
|
||||
done
|
||||
if ! cmp -s "$f" "$tmp"; then
|
||||
mv "$tmp" "$f"
|
||||
echo "updated: $f"
|
||||
else
|
||||
rm -f "$tmp"
|
||||
fi
|
||||
done
|
||||
|
||||
echo "rewrite-git-host-urls: target=$TARGET base=$BASE"
|
||||
Reference in New Issue
Block a user