fix(windows-phase2): codify SHARKON2025 recovery and harden rollout checks
This commit is contained in:
@@ -66,6 +66,8 @@ ansible-playbook -i inventory.ini provision_proxmox_ct_matrix_and_deploy_aw.yml
|
|||||||
- `cp /home/igor/tmp/AWatch-rus/ansible/inventory.example.ini /home/igor/tmp/AWatch-rus/ansible/inventory.ini`
|
- `cp /home/igor/tmp/AWatch-rus/ansible/inventory.example.ini /home/igor/tmp/AWatch-rus/ansible/inventory.ini`
|
||||||
- `cp /home/igor/tmp/AWatch-rus/ansible/group_vars/windows.example.yml /home/igor/tmp/AWatch-rus/ansible/group_vars/windows.yml`
|
- `cp /home/igor/tmp/AWatch-rus/ansible/group_vars/windows.example.yml /home/igor/tmp/AWatch-rus/ansible/group_vars/windows.yml`
|
||||||
2. Заполните `inventory.ini` (секция `[aw_windows]`) и `group_vars/windows.yml`.
|
2. Заполните `inventory.ini` (секция `[aw_windows]`) и `group_vars/windows.yml`.
|
||||||
|
- Для русской локализации Windows часто нужен `ansible_user=Администратор` (а не `Administrator`).
|
||||||
|
- Если WinRM закрыт, playbook не сможет стартовать и нужно сначала открыть `5985/5986` и `wsman`.
|
||||||
3. Запустите:
|
3. Запустите:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -77,6 +79,8 @@ Playbook:
|
|||||||
|
|
||||||
- выгружает `windows/*` toolkit на целевой хост в `C:\Deploy\AWatch-rus\windows`;
|
- выгружает `windows/*` toolkit на целевой хост в `C:\Deploy\AWatch-rus\windows`;
|
||||||
- выполняет `deploy-ensemble.ps1` (deploy + hardening/recovery) с phase-2 policy/rules;
|
- выполняет `deploy-ensemble.ps1` (deploy + hardening/recovery) с phase-2 policy/rules;
|
||||||
|
- после deploy принудительно запускает `ActivityWatch Recovery` и все `ActivityWatch Launch *` задачи;
|
||||||
|
- выполняет API smoke-check bucket `aw-watcher-afk_SHARKON2025` и ожидает свежие `not-afk` события;
|
||||||
- запускает `validate-deployment.ps1`;
|
- запускает `validate-deployment.ps1`;
|
||||||
- забирает JSON-отчёт в локальную директорию (`/tmp/aw-rus-validation` по умолчанию).
|
- забирает JSON-отчёт в локальную директорию (`/tmp/aw-rus-validation` по умолчанию).
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,12 @@
|
|||||||
aw_windows_policy_path: "{{ aw_windows_deploy_root }}\\windows\\dlp-policy.example.json"
|
aw_windows_policy_path: "{{ aw_windows_deploy_root }}\\windows\\dlp-policy.example.json"
|
||||||
aw_windows_validation_remote_path: "C:\\Windows\\Temp\\aw_validate_phase2_ansible.json"
|
aw_windows_validation_remote_path: "C:\\Windows\\Temp\\aw_validate_phase2_ansible.json"
|
||||||
aw_windows_validation_local_dir: "/tmp/aw-rus-validation"
|
aw_windows_validation_local_dir: "/tmp/aw-rus-validation"
|
||||||
|
aw_windows_launch_task_pattern: "ActivityWatch Launch *"
|
||||||
|
aw_windows_recovery_task_name: "ActivityWatch Recovery"
|
||||||
|
aw_windows_force_task_restart: true
|
||||||
|
aw_windows_api_smoke_check_enabled: true
|
||||||
|
aw_windows_api_smoke_check_bucket: "aw-watcher-afk_SHARKON2025"
|
||||||
|
aw_windows_api_smoke_check_limit: 10
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
- name: Validate required variables
|
- name: Validate required variables
|
||||||
@@ -105,6 +111,36 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
& "{{ aw_windows_deploy_root }}\windows\deploy-ensemble.ps1" @params
|
& "{{ aw_windows_deploy_root }}\windows\deploy-ensemble.ps1" @params
|
||||||
|
|
||||||
|
- name: Force start ActivityWatch recovery and launch tasks
|
||||||
|
when: aw_windows_force_task_restart | bool
|
||||||
|
ansible.windows.win_powershell:
|
||||||
|
script: |
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
Start-ScheduledTask -TaskName "{{ aw_windows_recovery_task_name }}"
|
||||||
|
Get-ScheduledTask |
|
||||||
|
Where-Object TaskName -like "{{ aw_windows_launch_task_pattern }}" |
|
||||||
|
ForEach-Object { Start-ScheduledTask -TaskName $_.TaskName }
|
||||||
|
|
||||||
|
- name: Wait for fresh AFK events to appear on AW server
|
||||||
|
when: aw_windows_api_smoke_check_enabled | bool
|
||||||
|
delegate_to: localhost
|
||||||
|
ansible.builtin.uri:
|
||||||
|
url: "http://{{ aw_windows_server_host }}:{{ aw_windows_server_port }}/api/0/buckets/{{ aw_windows_api_smoke_check_bucket }}/events?limit={{ aw_windows_api_smoke_check_limit }}"
|
||||||
|
method: GET
|
||||||
|
return_content: true
|
||||||
|
register: aw_windows_api_smoke
|
||||||
|
until: >
|
||||||
|
aw_windows_api_smoke.status == 200 and
|
||||||
|
(aw_windows_api_smoke.json | length) > 0 and
|
||||||
|
(
|
||||||
|
aw_windows_api_smoke.json
|
||||||
|
| selectattr('data.status', 'equalto', 'not-afk')
|
||||||
|
| list
|
||||||
|
| length
|
||||||
|
) > 0
|
||||||
|
retries: 10
|
||||||
|
delay: 6
|
||||||
|
|
||||||
- name: Run validation and store report on target
|
- name: Run validation and store report on target
|
||||||
ansible.windows.win_powershell:
|
ansible.windows.win_powershell:
|
||||||
script: |
|
script: |
|
||||||
|
|||||||
@@ -5,4 +5,5 @@ pve-main ansible_host=192.168.10.2 ansible_user=root ansible_port=22
|
|||||||
aw-ct ansible_host=10.20.30.13 ansible_user=root ansible_port=22
|
aw-ct ansible_host=10.20.30.13 ansible_user=root ansible_port=22
|
||||||
|
|
||||||
[aw_windows]
|
[aw_windows]
|
||||||
win-node1 ansible_host=192.168.100.21 ansible_user=Administrator ansible_password=CHANGE_ME ansible_connection=winrm ansible_winrm_transport=ntlm ansible_port=5985 ansible_winrm_server_cert_validation=ignore
|
# NOTE: in RU-localized installs this account is often "Администратор" instead of "Administrator".
|
||||||
|
win-node1 ansible_host=192.168.100.21 ansible_user=Администратор ansible_password=CHANGE_ME ansible_connection=winrm ansible_winrm_transport=ntlm ansible_port=5985 ansible_winrm_server_cert_validation=ignore
|
||||||
|
|||||||
@@ -101,6 +101,60 @@ Get-CimInstance Win32_Process |
|
|||||||
1. Поставить `incidentCapture.screenshotEnabled = false` в `deployment-config.json` (для каждого StateRoot).
|
1. Поставить `incidentCapture.screenshotEnabled = false` в `deployment-config.json` (для каждого StateRoot).
|
||||||
2. Запустить `Start-ScheduledTask -TaskName 'ActivityWatch Recovery'`.
|
2. Запустить `Start-ScheduledTask -TaskName 'ActivityWatch Recovery'`.
|
||||||
|
|
||||||
|
### SHARKON2025: `Активное время = 0s`, хотя `window`-события есть
|
||||||
|
|
||||||
|
Симптом:
|
||||||
|
|
||||||
|
- в Activity view за день видно `Worktime = 0s`;
|
||||||
|
- `Top Window Titles / Top Categories / Category Tree` пустые;
|
||||||
|
- при этом bucket `aw-watcher-window_SHARKON2025` содержит свежие события.
|
||||||
|
|
||||||
|
Подтвержденная причина:
|
||||||
|
|
||||||
|
- watcher `afk` "залип" в `status=afk` без `not-afk`;
|
||||||
|
- из-за этого дневная сводка не считает подтвержденную активность.
|
||||||
|
|
||||||
|
Быстрый recovery (с Linux admin host):
|
||||||
|
|
||||||
|
1. Проверить учетку входа. Для этого кейса рабочая учетная запись: `SHARKON2025\Администратор` (не `Administrator`).
|
||||||
|
2. Поднять remote execution через `wmiexec.py` с auth-file:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cat > /tmp/sharkon_ru.auth << 'EOF'
|
||||||
|
username = Администратор
|
||||||
|
password = <PASSWORD>
|
||||||
|
domain = SHARKON2025
|
||||||
|
EOF
|
||||||
|
chmod 600 /tmp/sharkon_ru.auth
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Запустить recovery task:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
wmiexec.py -nooutput -A /tmp/sharkon_ru.auth 192.168.100.21 \
|
||||||
|
"powershell -NoProfile -Command \"Start-ScheduledTask -TaskName 'ActivityWatch Recovery'\""
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Запустить все launch tasks:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
wmiexec.py -nooutput -A /tmp/sharkon_ru.auth 192.168.100.21 \
|
||||||
|
"powershell -NoProfile -Command \"Get-ScheduledTask | Where-Object TaskName -like 'ActivityWatch Launch *' | ForEach-Object { Start-ScheduledTask -TaskName \$_.TaskName }\""
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Подождать 10-20 секунд и проверить API на AW server (`10.10.10.13:5600`):
|
||||||
|
|
||||||
|
```sh
|
||||||
|
curl -fsS 'http://10.10.10.13:5600/api/0/buckets/aw-watcher-afk_SHARKON2025/events?limit=30' \
|
||||||
|
| jq '{latest:.[0].timestamp, statuses:(group_by(.data.status)|map({status:.[0].data.status,count:length}))}'
|
||||||
|
```
|
||||||
|
|
||||||
|
Ожидаемо после фикса:
|
||||||
|
|
||||||
|
- в свежих AFK-событиях появляется `status=not-afk`;
|
||||||
|
- `aw-watcher-window_SHARKON2025` продолжает обновляться;
|
||||||
|
- после обновления страницы UI дневная сводка перестает быть `0s`.
|
||||||
|
|
||||||
### Сервис не стартует
|
### Сервис не стартует
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
|||||||
Reference in New Issue
Block a user