Compare commits

..

3 Commits

Author SHA1 Message Date
PTah 8a97bbfb43 merge: sync local backlog with kalinamall production URLs
Integrate diverged kalinamall/main; keep v0.7 agent-update docs and
kalinamall.ru paths in deploy/docs; mirror scripts remain removed.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-17 11:13:35 +10:00
PTah 2069e57f14 docs: backlog for agent version compliance and remote updates
Add agent-update-backlog.md and roadmap v0.7 outline for SAC-driven
agent version tracking and remote update initiation.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-17 11:07:12 +10:00
PTah 6b288bfa49 chore(github): generic example.com in docs, remove mirror scripts
Replace sac.kalinamall.ru with sac.example.com in public docs/deploy.
Remove Push-Mirror and Rewrite-GitHostUrls scripts from repo.
Simplify workspace-three-repos.md for GitHub-only workflow.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-16 11:57:02 +10:00
9 changed files with 79 additions and 230 deletions
+1
View File
@@ -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:** версии агентов, удалённое обновление |
## Порядок чтения
+58
View File
@@ -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`
+14
View File
@@ -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 для инфраструктурного мониторинга
+1
View File
@@ -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`
+5 -22
View File
@@ -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 |
|--------|-----|
-41
View File
@@ -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"
-57
View File
@@ -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"
-43
View File
@@ -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"
-67
View File
@@ -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"