feat(rust): advance powershell migration

This commit is contained in:
igor04091968
2026-06-06 08:58:46 +03:00
parent 2ec1836e8c
commit 9c57d6d2ce
42 changed files with 10056 additions and 407 deletions
+150
View File
@@ -0,0 +1,150 @@
# Windows Rust validation
Дата: 2026-06-05
`aw-windows-telemetry.exe validate-deployment` является Rust-заменой первого
уровня для `windows/validate-deployment.ps1`.
Цель команды: дать машинный JSON gate перед дальнейшей заменой Windows
PowerShell runtime scripts на Rust EXE.
## Команда
```powershell
C:\Program Files\AWatch-rus\windows\aw-windows-telemetry.exe `
validate-deployment `
--config-path C:\ProgramData\AWatch-rus\deployment-config.json
```
Вывод: JSON.
Exit codes:
- `0` - validation прошла;
- `1` - ошибка запуска, чтения config или runtime error;
- `2` - validation выполнена, но есть failed sections.
## Что проверяется сейчас
- `deployment-config.json` читается как JSON, включая UTF-8 BOM.
- `ActivityWatch File1C Upload` указывает на
`aw-windows-telemetry.exe file1c-upload`.
- `ActivityWatch DLP Evidence Sync` указывает на
`aw-windows-telemetry.exe dlp-evidence-sync`.
- `AWatch Rust Telemetry Agent` указывает на `awatch-agent-rs.exe`.
- `AWatchRusCollectorGuard` service указывает на
`aw-windows-telemetry.exe collector-guard` через service wrapper.
- Rust collector guard получает `sessionId` через native Windows API,
дедуплицирует legacy browser/fileops/DLP endpoint collectors по
`(kind, sessionId)` и пропускает повторный запуск launch tasks, если legacy
collectors уже работают.
- Rust worktime agent запущен.
- Rust collector guard запущен.
- Worktime bucket свежий.
- Локальные DLP/file operation queues не превышают безопасный depth.
- `aw-windows-telemetry.exe browser-domains-collector`,
`dlp-endpoint-collector` и `file-operations-collector` доступны как P0
runtime subcommands.
- Browser Rust collector реализует URL/domain/category parity:
UIAutomation extraction, URL normalization, host/rootDomain, default/custom
category rules, `aw-watcher-web-*`, `aw-detmir-web-category_*` и web DLP
incident schema.
- DLP endpoint Rust collector реализует incident semantics для
`clipboard_change`, `usb_insert` и `print_job`: raw endpoint signal,
policy evaluation, cooldown и `aw-dlp-incidents_*` event fields сохранены.
USB write-block и print cancel не выполняются в пилотном режиме без
отдельного enforcement решения.
- В live-конфигурации `collectors.browserCollectorMode`,
`collectors.dlpEndpointMode` и `collectors.fileOpsMode` переключены в
`rust_primary`.
- P0 PowerShell collector runtime
(`browser-domains-native-collector.ps1`,
`dlp-endpoint-signals-collector.ps1`, `file-operations-collector.ps1`)
отсутствует в штатных пользовательских сессиях.
- Rust collectors пишут per-session state/log/queue, чтобы разные RDP-сессии
не конфликтовали за один state-файл.
- Оставшийся PowerShell runtime классифицируется для миграционной карты через
native WinAPI process snapshot. `wmic.exe` не требуется.
## Инвентаризация процессов
На новых Windows `wmic.exe` может отсутствовать. Validator не зависит от него:
1. сначала используется native WinAPI process snapshot;
2. если native snapshot недоступен, используется `wmic.exe`;
3. если `wmic.exe` отсутствует, используется `tasklist.exe` fallback.
В штатном режиме native snapshot дает:
- `processes.commandLineQueryOk=true`;
- классификацию PowerShell runtime по видам:
`browser`, `fileops`, `dlp_endpoint`, `guard`, `recovery`, `worktime`;
- подтверждение отсутствия `worktime-session-collector.ps1`.
- подтверждение отсутствия `aw-collector-guard.ps1`.
`tasklist.exe` fallback ограничен:
- наличие `awatch-agent-rs.exe` подтверждается;
- command line PowerShell-процессов недоступна;
- поле `processes.commandLineQueryOk=false`;
- поле `processes.noPowerShellWorktimeRuntime=null`;
- это не считается ошибкой, если task actions, Rust agent и bucket freshness
подтверждены.
Для полного доказательства отсутствия конкретного `.ps1` процесса можно
дополнительно использовать operator inventory через WinRM/Ansible, но это не
должно блокировать Rust validation на системах без WMIC.
## Проверенный live checkpoint
2026-06-05 на Windows/RDP host:
- `overallOk=true`;
- failed sections: `[]`;
- File1C task: Rust EXE;
- DLP evidence task: Rust EXE;
- worktime agent: Rust EXE;
- collector guard service: Rust EXE child;
- worktime bucket age: меньше 300 секунд.
- native process inventory: `commandLineQueryOk=true`;
- PowerShell worktime runtime: отсутствует;
- PowerShell collector guard runtime: отсутствует;
- оставшийся PowerShell runtime классифицирован как `recovery/other`; P0
browser/fileops/DLP endpoint PowerShell collectors отсутствуют.
- Rust browser/DLP/fileops runtime после live switch: `browser=3`,
`dlp_endpoint=3`, `fileops=3`, `guard=1`, legacy P0 count `0`.
- После одного guard-cycle P0 Rust counts остались `3/3/3`, DLP state по трем
сессиям: `status=ok`, `sendFailures=0`.
- После parity update 2026-06-05T23:10Z:
- `browser_rust=3`, `dlp_endpoint_rust=3`, `fileops_rust=3`,
`guard_rust=1`, legacy P0 collector count `0`;
- `validate-deployment`: `overallOk=true`, failed sections `[]`;
- AW API после restart `activitywatch-server` отвечает локально за ~0.002s;
- `aw-detmir-web-category_*` получает Rust `collector_health` с
`foregroundProcess`, `browserDetected`, `urlDetected`;
- текущие RDP-сеансы disconnected, поэтому live foreground пустой и
`browserDetected=false`, `urlDetected=false`; URL event path проверен
self-test/unit-test, но live URL требует активного foreground browser;
- `aw-dlp-endpoint-signals_*` получает свежие Rust `self_test` events:
`queueDepth=0`, `sendFailures=0`;
- `detmir-dlp`: `ok=true`, `counts={ok:22,warn:0,fail:0}`;
- `detmir-status`: `severity=OK`, `needs_heal=false`,
`ok_for_operator=true`; актуальный refresh через Rust-first
`/usr/local/bin/detmir-auto --no-heal --no-report` дал
`service_warnings=0` и DLP `counts={ok:22,warn:0,fail:0}`.
- Rust file operations live mode использует per-session queue/state/log;
bounded shadow create/rename/delete smoke ранее подтвердил `Created`, один
`Renamed` с `oldPath`, `Deleted` и штатные `collector_health` события.
- Collector guard duplicate prevention smoke: при принудительном stale
action `run-task` получил `applied=false`,
`reason=legacy-collectors-already-running`; runtime counts остались
`browser=3`, `fileops=3`, `dlp_endpoint=2`.
Ограничение: этот checkpoint подтверждает end-to-end live runtime, policy
semantics и schema parity. Полный live URL/domain incident path физически
требует активного foreground browser в интерактивной RDP-сессии; disconnected
сеансы корректно дают только health/self-test. Удаление legacy `.ps1` остается
отдельным rollback/decommission gate.
Live hostnames, private IP и runtime report сохранены только в private
`.ops`-контуре.