diff --git a/backend/scripts/acceptance/chr-rest-diagnostic.mjs b/backend/scripts/acceptance/chr-rest-diagnostic.mjs new file mode 100644 index 00000000..bc176fdc --- /dev/null +++ b/backend/scripts/acceptance/chr-rest-diagnostic.mjs @@ -0,0 +1,51 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs' + +const hosts = (process.env.MMAPP_TEST_CHR_HOSTS ?? '').split(',') +assert.deepEqual(hosts, ['194.226.121.150', '104.165.244.7'], 'Explicit owned lab hosts required') +const { MMAPP_TEST_CHR_USER: username, MMAPP_TEST_CHR_PASSWORD: password } = process.env +assert(username && password, 'Explicit test credentials required') +const vantage = process.env.MMAPP_TEST_VANTAGE +assert(['workstation', 'debian'].includes(vantage), 'Explicit vantage required') +const output = process.env.MMAPP_TEST_REPORT +assert(output, 'Explicit report path required') +const authorization = 'Basic ' + Buffer.from(username + ':' + password).toString('base64') +const report = { block: '12.5.225', date: '2026-10-14', vantage, startedAt: new Date().toISOString(), requests: [], diagnostics: [], configurationWrites: 0, passwordChanges: 0, rootCauseKnown: false } +const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)) + +async function read(host, path) { + const startedAt = new Date().toISOString(), start = Date.now() + try { + const response = await fetch(`http://${host}/rest${path}`, { headers: { authorization, Connection: 'close' }, signal: AbortSignal.timeout(8000) }) + const body = await response.text() + report.requests.push({ host, path, startedAt, durationMs: Date.now() - start, status: response.status, headers: Object.fromEntries(['date', 'server', 'www-authenticate', 'connection'].map(key => [key, response.headers.get(key)])) }) + if (!response.ok) return null + try { return JSON.parse(body) } catch { return null } + } catch (error) { + report.requests.push({ host, path, startedAt, durationMs: Date.now() - start, status: null, errorName: error.name }) + return null + } finally { await sleep(300) } +} + +for (let cycle = 1; cycle <= 3; cycle++) { + for (const host of hosts) for (const path of ['/system/resource', '/interface/gre']) await read(host, path) + if (cycle < 3) await sleep(5000) +} +for (const host of hosts) { + const clock = await read(host, '/system/clock') + const services = await read(host, '/ip/service') + const logs = await read(host, '/log') + const failures = Array.isArray(logs) ? logs.filter(row => /login failure/i.test(String(row.message))) : null + const sources = {} + const events = failures?.map(row => { + const message = String(row.message), source = message.match(/from ([\d.]+)/)?.[1] ?? 'unparsed' + const origin = source === '161.104.46.222' ? 'test-debian' : 'other-or-unidentified' + sources[origin] = (sources[origin] ?? 0) + 1 + return { time: row.time ?? null, origin, via: message.match(/via (\w+)/)?.[1] ?? null } + }) + report.diagnostics.push({ host, clock: clock ? { date: clock.date, time: clock.time, gmtOffset: clock['gmt-offset'] } : null, wwwServices: Array.isArray(services) ? services.filter(row => row.name === 'www').map(row => ({ disabled: row.disabled, maxSessions: row['max-sessions'] ?? null, dynamic: row.dynamic ?? null })) : null, retainedAuthFailures: failures?.length ?? null, sources, recentFailures: events?.slice(-20) ?? null, retainedLogIsNotCurrentRate: true }) +} +report.completedAt = new Date().toISOString() +report.summary = hosts.map(host => { const rows = report.requests.filter(row => row.host === host); return { host, requests: rows.length, ok: rows.filter(row => row.status === 200).length, unauthorized: rows.filter(row => row.status === 401).length, serverErrors: rows.filter(row => row.status >= 500).length, transportErrors: rows.filter(row => row.status === null).length } }) +fs.writeFileSync(output, JSON.stringify(report, null, 2) + '\n') +console.log(JSON.stringify({ vantage, summary: report.summary, configurationWrites: 0 })) diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index 217b5d5c..d30cd318 100644 --- a/docs/ux-ui-external-acceptance.md +++ b/docs/ux-ui-external-acceptance.md @@ -1,6 +1,6 @@ # UX/UI: протокол внешней приёмки 12.5 -Актуальное продолжение 2026-10-14: блок224 завершён. Короткая REST выборка20cycles/160requests:194.226.121.15080/80×200;104.165.244.7 78/80×200, первые2 запросы401, последующие200;500 в этой выборке0. Cause неизвестна, последние чтения обоих доступны. Конфигурация/пароли не менялись. Backend ux-regression222/frontend ux-routing218; этап12.5 открыт. Следующий225 — диагностировать intermittent auth/REST104 с сопоставлением HTTP/логов, затем продолжать7 групп матрицы. +Актуальное продолжение 2026-10-14: блок225 завершён. Read-only диагностика с workstation и Debian:36/36 REST200, часы согласованы, www max-sessions20; в retained logs нет auth failures от Debian, последние сторонние записи относятся к SSH/FTP. Причина прошлых401/500 не установлена; конфигурация/пароли не менялись. Backend ux-regression222/frontend ux-routing218. Следующий226 — свежая общая UI-регрессия с сохранением пользовательских screenshots; этап12.5 открыт. IPsec78: реальный PSK responder established, mode-config198.18.78.10 и online=true подтверждены API; точные собственные объекты удалены. Сертификатный/DN online, late failure и history restore остаются открытыми. [Отчёт](ux-ui/acceptance/ipsec-mode-config-2026-10-09.json), [журнал](ux-ui-progress.md). @@ -2623,3 +2623,7 @@ Runtime backend ux-regression222/frontend ux-routing218. Latest backend25/UI52 ## 12.5.224 — REST выборка (2026-10-14) 160 readonly requests: первый CHR80/80×200, второй78/80×200 и2 initial401; последний цикл200 обоих. Root cause/SLA не приняты, services/credentials не менялись. [Отчёт](ux-ui/acceptance/chr224-rest-observation-2026-10-14.json). Следующий225 — transient REST/auth диагностика104. + +## 12.5.225 — диагностика REST с двух точек (2026-10-14) + +36/36 GET200 с workstation/Debian. Часы согласованы; www max-sessions20 не доказывает нагрузку, retained failures9/890 не частота отказов. От Debian0, последние сторонние SSH/FTP не объясняют исходные401. Root cause неизвестна; mutations/services/credentials unchanged. [Workstation](ux-ui/acceptance/chr225-workstation-2026-10-14.json), [Debian](ux-ui/acceptance/chr225-debian-2026-10-14.json). Следующий226 — свежая общая UI-регрессия. diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index df78ab6d..ede06353 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,6 +1,6 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-14: блок224 завершён. Короткая REST выборка20cycles/160requests:194.226.121.15080/80×200;104.165.244.7 78/80×200, первые2 запросы401, последующие200;500 в этой выборке0. Cause неизвестна, последние чтения обоих доступны. Конфигурация/пароли не менялись. Backend ux-regression222/frontend ux-routing218; этап12.5 открыт. Следующий225 — диагностировать intermittent auth/REST104 с сопоставлением HTTP/логов, затем продолжать7 групп матрицы. +Актуальное продолжение 2026-10-14: блок225 завершён. Read-only диагностика с workstation и Debian:36/36 REST200, часы согласованы, www max-sessions20; в retained logs нет auth failures от Debian, последние сторонние записи относятся к SSH/FTP. Причина прошлых401/500 не установлена; конфигурация/пароли не менялись. Backend ux-regression222/frontend ux-routing218. Следующий226 — свежая общая UI-регрессия с сохранением пользовательских screenshots; этап12.5 открыт. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-14. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index b8bca4d9..3e0b16dd 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-14: блок224 завершён. Короткая REST выборка20cycles/160requests:194.226.121.15080/80×200;104.165.244.7 78/80×200, первые2 запросы401, последующие200;500 в этой выборке0. Cause неизвестна, последние чтения обоих доступны. Конфигурация/пароли не менялись. Backend ux-regression222/frontend ux-routing218; этап12.5 открыт. Следующий225 — диагностировать intermittent auth/REST104 с сопоставлением HTTP/логов, затем продолжать7 групп матрицы. +Актуальное продолжение 2026-10-14: блок225 завершён. Read-only диагностика с workstation и Debian:36/36 REST200, часы согласованы, www max-sessions20; в retained logs нет auth failures от Debian, последние сторонние записи относятся к SSH/FTP. Причина прошлых401/500 не установлена; конфигурация/пароли не менялись. Backend ux-regression222/frontend ux-routing218. Следующий226 — свежая общая UI-регрессия с сохранением пользовательских screenshots; этап12.5 открыт. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -36,7 +36,15 @@ | 10 | Маршрутизация, диагностика, карта и терминал | Завершён в границах локальной приёмки 2026-10-01; блоки 10.1–10.71, внешние ограничения в 10.71 | | 11А | Пользователи, контейнеры, сертификаты и резервные копии | Завершён в границах локальной приёмки 2026-10-01; 11А.1–11А.33, внешние ограничения в 11А.33 | | 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 | -| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка12.3.83 в границах журнала. Внешняя12.5: блоки1–224 завершены в записанных scopes, этап открыт. Runtime backend ux-regression222/frontend ux-routing218; backend25/UI52 и дополнительные SQL/UDP222 прошли. | +| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка12.3.83 в границах журнала. Внешняя12.5: блоки1–225 завершены в записанных scopes, этап открыт. Runtime backend ux-regression222/frontend ux-routing218; backend25/UI52 и дополнительные SQL/UDP222 прошли. | + +## 12.5.225 — REST с двух точек и границы диагностики авторизации (2026-10-14) + +Воспроизводимый readonly helper chr-rest-diagnostic.mjs требует точные два owned hosts и credentials через env. С рабочей машины и backend network Debian выполнено по18 запросов: три последовательных цикла resource/GRE, затем clock/service/log. Все36 ответили200, transport/401/500 failures0. Сохраняются только безопасные HTTP headers и сводки логов; тело ошибок/пароли/исходные сообщения не публикуются. Configuration writes/password changes0. + +Часы CHR1(+03:00)/CHR2(+02:00) и Date HTTP соответствуют UTC в пределах секунды. Оба www включены, max-sessions20; это настроенный предел, не измеренная загрузка/доказательство причины. Ring-retained auth failures9/890, от Debian161.104.46.222 —0; последние записи соответственно FTP/SSH. Прочие источники обезличены и не объявляются атаками или workstation IP. Количество сохранённых сообщений не является текущей частотой отказов. Точное сопоставление исходных224401 с auth challenge невозможно: тогда соответствующие headers не сохранялись, а текущая выборка401 не воспроизвела. + +Причина220/221/224 остаётся неизвестной. Нельзя считать успешные последующие чтения объяснением или SLA; автоматический повтор mutations/auth не добавлен. Доступ обоих CHR подтверждён на конце этой выборки. Runtime unchanged: backend ux-regression222/frontend ux-routing218. [Workstation](ux-ui/acceptance/chr225-workstation-2026-10-14.json), [Debian](ux-ui/acceptance/chr225-debian-2026-10-14.json). Следующий226 — свежий общий UI-набор без перезаписи пользовательских screenshots, затем остальные доступные группы матрицы. Этап12.5 открыт. ## 12.5.224 — короткая независимая REST выборка CHR (2026-10-14) diff --git a/docs/ux-ui-remaining-acceptance.md b/docs/ux-ui-remaining-acceptance.md index 84f7daef..fac4f54e 100644 --- a/docs/ux-ui-remaining-acceptance.md +++ b/docs/ux-ui-remaining-acceptance.md @@ -1,8 +1,8 @@ # Оставшаяся внешняя приёмка — 2026-10-14 -Актуальное продолжение 2026-10-14: блок224 завершён. Короткая REST выборка20cycles/160requests:194.226.121.15080/80×200;104.165.244.7 78/80×200, первые2 запросы401, последующие200;500 в этой выборке0. Cause неизвестна, последние чтения обоих доступны. Конфигурация/пароли не менялись. Backend ux-regression222/frontend ux-routing218; этап12.5 открыт. Следующий225 — диагностировать intermittent auth/REST104 с сопоставлением HTTP/логов, затем продолжать7 групп матрицы. +Актуальное продолжение 2026-10-14: блок225 завершён. Read-only диагностика с workstation и Debian:36/36 REST200, часы согласованы, www max-sessions20; в retained logs нет auth failures от Debian, последние сторонние записи относятся к SSH/FTP. Причина прошлых401/500 не установлена; конфигурация/пароли не менялись. Backend ux-regression222/frontend ux-routing218. Следующий226 — свежая общая UI-регрессия с сохранением пользовательских screenshots; этап12.5 открыт. -Это актуальная матрица после 12.5.224. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. +Это актуальная матрица после 12.5.225. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-regression222`, frontend `ux-routing218`; production lab с195 использует AUTH_REQUIRED=true и Portal1.3.1. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись. @@ -1553,3 +1553,7 @@ Backend25/UI52, disabled33/months5 и оба IPv6 UDP/SQL worker режима п ## 12.5.224 — REST выборка (2026-10-14) 160 readonly requests: первый CHR80/80×200, второй78/80×200 и2 initial401; последний цикл200 обоих. Root cause/SLA не приняты, services/credentials не менялись. [Отчёт](ux-ui/acceptance/chr224-rest-observation-2026-10-14.json). Следующий225 — transient REST/auth диагностика104. + +## 12.5.225 — диагностика REST с двух точек (2026-10-14) + +36/36 GET200 с workstation/Debian. Часы согласованы; www max-sessions20 не доказывает нагрузку, retained failures9/890 не частота отказов. От Debian0, последние сторонние SSH/FTP не объясняют исходные401. Root cause неизвестна; mutations/services/credentials unchanged. [Workstation](ux-ui/acceptance/chr225-workstation-2026-10-14.json), [Debian](ux-ui/acceptance/chr225-debian-2026-10-14.json). Следующий226 — свежая общая UI-регрессия. diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index 81e86d5a..b75cfb3b 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -1,6 +1,6 @@ # Этап 12: итоговая приёмка UX/UI -Актуальное продолжение 2026-10-14: блок224 завершён. Короткая REST выборка20cycles/160requests:194.226.121.15080/80×200;104.165.244.7 78/80×200, первые2 запросы401, последующие200;500 в этой выборке0. Cause неизвестна, последние чтения обоих доступны. Конфигурация/пароли не менялись. Backend ux-regression222/frontend ux-routing218; этап12.5 открыт. Следующий225 — диагностировать intermittent auth/REST104 с сопоставлением HTTP/логов, затем продолжать7 групп матрицы. +Актуальное продолжение 2026-10-14: блок225 завершён. Read-only диагностика с workstation и Debian:36/36 REST200, часы согласованы, www max-sessions20; в retained logs нет auth failures от Debian, последние сторонние записи относятся к SSH/FTP. Причина прошлых401/500 не установлена; конфигурация/пароли не менялись. Backend ux-regression222/frontend ux-routing218. Следующий226 — свежая общая UI-регрессия с сохранением пользовательских screenshots; этап12.5 открыт. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. @@ -4033,3 +4033,12 @@ Backend ux-regression222 compiled1056/source492 matched, healthy; frontend ux-ro [Отчёт160](ux-ui/acceptance/chr224-rest-observation-2026-10-14.json), воспроизводимый readonly runner — backend/scripts/acceptance/chr-rest-observation.mjs (без credentials). Последняя сборка backend ux-regression222/frontend ux-routing218. Следующий225 — сопоставить transient HTTP auth challenge с source IP/time/service logs на104, не вводить auth retries для mutation и не менять доступ без необходимости. Затем приёмка по7 группам матрицы. Этап12.5 открыт. + +## 12.5.225 — REST с двух точек и границы диагностики авторизации (2026-10-14) + +Воспроизводимый readonly helper chr-rest-diagnostic.mjs требует точные два owned hosts и credentials через env. С рабочей машины и backend network Debian выполнено по18 запросов: три последовательных цикла resource/GRE, затем clock/service/log. Все36 ответили200, transport/401/500 failures0. Сохраняются только безопасные HTTP headers и сводки логов; тело ошибок/пароли/исходные сообщения не публикуются. Configuration writes/password changes0. + +Часы CHR1(+03:00)/CHR2(+02:00) и Date HTTP соответствуют UTC в пределах секунды. Оба www включены, max-sessions20; это настроенный предел, не измеренная загрузка/доказательство причины. Ring-retained auth failures9/890, от Debian161.104.46.222 —0; последние записи соответственно FTP/SSH. Прочие источники обезличены и не объявляются атаками или workstation IP. Количество сохранённых сообщений не является текущей частотой отказов. Точное сопоставление исходных224401 с auth challenge невозможно: тогда соответствующие headers не сохранялись, а текущая выборка401 не воспроизвела. + +Причина220/221/224 остаётся неизвестной. Нельзя считать успешные последующие чтения объяснением или SLA; автоматический повтор mutations/auth не добавлен. Доступ обоих CHR подтверждён на конце этой выборки. Runtime unchanged: backend ux-regression222/frontend ux-routing218. [Workstation](ux-ui/acceptance/chr225-workstation-2026-10-14.json), [Debian](ux-ui/acceptance/chr225-debian-2026-10-14.json). Следующий226 — свежий общий UI-набор без перезаписи пользовательских screenshots, затем остальные доступные группы матрицы. Этап12.5 открыт. + diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md index 0f8f352d..b569b3bb 100644 --- a/docs/ux-ui-test-server.md +++ b/docs/ux-ui-test-server.md @@ -1,6 +1,6 @@ # Тестовый сервер UX/UI — 2026-10-10 -Актуальное продолжение 2026-10-14: блок224 завершён. Короткая REST выборка20cycles/160requests:194.226.121.15080/80×200;104.165.244.7 78/80×200, первые2 запросы401, последующие200;500 в этой выборке0. Cause неизвестна, последние чтения обоих доступны. Конфигурация/пароли не менялись. Backend ux-regression222/frontend ux-routing218; этап12.5 открыт. Следующий225 — диагностировать intermittent auth/REST104 с сопоставлением HTTP/логов, затем продолжать7 групп матрицы. +Актуальное продолжение 2026-10-14: блок225 завершён. Read-only диагностика с workstation и Debian:36/36 REST200, часы согласованы, www max-sessions20; в retained logs нет auth failures от Debian, последние сторонние записи относятся к SSH/FTP. Причина прошлых401/500 не установлена; конфигурация/пароли не менялись. Backend ux-regression222/frontend ux-routing218. Следующий226 — свежая общая UI-регрессия с сохранением пользовательских screenshots; этап12.5 открыт. | Параметр | Проверенное состояние | | --- | --- | @@ -2354,3 +2354,7 @@ Runtime backend ux-regression222/frontend ux-routing218. Latest backend25/UI52 ## 12.5.224 — REST выборка (2026-10-14) 160 readonly requests: первый CHR80/80×200, второй78/80×200 и2 initial401; последний цикл200 обоих. Root cause/SLA не приняты, services/credentials не менялись. [Отчёт](ux-ui/acceptance/chr224-rest-observation-2026-10-14.json). Следующий225 — transient REST/auth диагностика104. + +## 12.5.225 — диагностика REST с двух точек (2026-10-14) + +36/36 GET200 с workstation/Debian. Часы согласованы; www max-sessions20 не доказывает нагрузку, retained failures9/890 не частота отказов. От Debian0, последние сторонние SSH/FTP не объясняют исходные401. Root cause неизвестна; mutations/services/credentials unchanged. [Workstation](ux-ui/acceptance/chr225-workstation-2026-10-14.json), [Debian](ux-ui/acceptance/chr225-debian-2026-10-14.json). Следующий226 — свежая общая UI-регрессия. diff --git a/docs/ux-ui/acceptance/chr225-debian-2026-10-14.json b/docs/ux-ui/acceptance/chr225-debian-2026-10-14.json new file mode 100644 index 00000000..059994cc --- /dev/null +++ b/docs/ux-ui/acceptance/chr225-debian-2026-10-14.json @@ -0,0 +1,465 @@ +{ + "block": "12.5.225", + "date": "2026-10-14", + "vantage": "debian", + "startedAt": "2026-10-14T01:35:24.356Z", + "requests": [ + { + "host": "194.226.121.150", + "path": "/system/resource", + "startedAt": "2026-10-14T01:35:24.357Z", + "durationMs": 85, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:35:23 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "194.226.121.150", + "path": "/interface/gre", + "startedAt": "2026-10-14T01:35:24.743Z", + "durationMs": 8, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:35:24 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "104.165.244.7", + "path": "/system/resource", + "startedAt": "2026-10-14T01:35:25.051Z", + "durationMs": 139, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:35:25 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "104.165.244.7", + "path": "/interface/gre", + "startedAt": "2026-10-14T01:35:25.494Z", + "durationMs": 133, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:35:25 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "194.226.121.150", + "path": "/system/resource", + "startedAt": "2026-10-14T01:35:30.934Z", + "durationMs": 9, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:35:30 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "194.226.121.150", + "path": "/interface/gre", + "startedAt": "2026-10-14T01:35:31.244Z", + "durationMs": 7, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:35:30 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "104.165.244.7", + "path": "/system/resource", + "startedAt": "2026-10-14T01:35:31.551Z", + "durationMs": 130, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:35:31 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "104.165.244.7", + "path": "/interface/gre", + "startedAt": "2026-10-14T01:35:31.982Z", + "durationMs": 134, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:35:32 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "194.226.121.150", + "path": "/system/resource", + "startedAt": "2026-10-14T01:35:37.421Z", + "durationMs": 15, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:35:36 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "194.226.121.150", + "path": "/interface/gre", + "startedAt": "2026-10-14T01:35:37.736Z", + "durationMs": 8, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:35:37 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "104.165.244.7", + "path": "/system/resource", + "startedAt": "2026-10-14T01:35:38.044Z", + "durationMs": 129, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:35:38 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "104.165.244.7", + "path": "/interface/gre", + "startedAt": "2026-10-14T01:35:38.473Z", + "durationMs": 130, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:35:38 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "194.226.121.150", + "path": "/system/clock", + "startedAt": "2026-10-14T01:35:38.903Z", + "durationMs": 7, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:35:38 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "194.226.121.150", + "path": "/ip/service", + "startedAt": "2026-10-14T01:35:39.210Z", + "durationMs": 15, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:35:38 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "194.226.121.150", + "path": "/log", + "startedAt": "2026-10-14T01:35:39.526Z", + "durationMs": 67, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:35:39 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "104.165.244.7", + "path": "/system/clock", + "startedAt": "2026-10-14T01:35:39.898Z", + "durationMs": 129, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:35:40 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "104.165.244.7", + "path": "/ip/service", + "startedAt": "2026-10-14T01:35:40.328Z", + "durationMs": 144, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:35:40 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "104.165.244.7", + "path": "/log", + "startedAt": "2026-10-14T01:35:40.773Z", + "durationMs": 420, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:35:41 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + } + ], + "diagnostics": [ + { + "host": "194.226.121.150", + "clock": { + "date": "2026-10-14", + "time": "04:35:38", + "gmtOffset": "+03:00" + }, + "wwwServices": [ + { + "disabled": "false", + "maxSessions": "20", + "dynamic": "false" + }, + { + "disabled": "false", + "maxSessions": null, + "dynamic": "true" + } + ], + "retainedAuthFailures": 9, + "sources": { + "other-or-unidentified": 9 + }, + "recentFailures": [ + { + "time": "2026-10-13 19:54:09", + "origin": "other-or-unidentified", + "via": "ftp" + }, + { + "time": "2026-10-13 19:54:10", + "origin": "other-or-unidentified", + "via": "ftp" + }, + { + "time": "2026-10-13 19:54:11", + "origin": "other-or-unidentified", + "via": "ftp" + }, + { + "time": "2026-10-13 19:54:13", + "origin": "other-or-unidentified", + "via": "ftp" + }, + { + "time": "2026-10-13 19:54:14", + "origin": "other-or-unidentified", + "via": "ftp" + }, + { + "time": "2026-10-13 19:54:16", + "origin": "other-or-unidentified", + "via": "ftp" + }, + { + "time": "2026-10-13 19:54:18", + "origin": "other-or-unidentified", + "via": "ftp" + }, + { + "time": "2026-10-13 19:54:20", + "origin": "other-or-unidentified", + "via": "ftp" + }, + { + "time": "2026-10-13 19:54:21", + "origin": "other-or-unidentified", + "via": "ftp" + } + ], + "retainedLogIsNotCurrentRate": true + }, + { + "host": "104.165.244.7", + "clock": { + "date": "2026-10-14", + "time": "03:35:40", + "gmtOffset": "+02:00" + }, + "wwwServices": [ + { + "disabled": "false", + "maxSessions": "20", + "dynamic": "false" + }, + { + "disabled": "false", + "maxSessions": null, + "dynamic": "true" + } + ], + "retainedAuthFailures": 890, + "sources": { + "other-or-unidentified": 890 + }, + "recentFailures": [ + { + "time": "2026-10-14 03:25:22", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:25:34", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:25:52", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:26:26", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:26:44", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:27:29", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:27:49", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:28:12", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:29:12", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:29:17", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:29:23", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:29:42", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:30:33", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:30:48", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:31:11", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:31:50", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:32:31", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:32:44", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:34:16", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:34:16", + "origin": "other-or-unidentified", + "via": "ssh" + } + ], + "retainedLogIsNotCurrentRate": true + } + ], + "configurationWrites": 0, + "passwordChanges": 0, + "rootCauseKnown": false, + "completedAt": "2026-10-14T01:35:41.498Z", + "summary": [ + { + "host": "194.226.121.150", + "requests": 9, + "ok": 9, + "unauthorized": 0, + "serverErrors": 0, + "transportErrors": 0 + }, + { + "host": "104.165.244.7", + "requests": 9, + "ok": 9, + "unauthorized": 0, + "serverErrors": 0, + "transportErrors": 0 + } + ] +} diff --git a/docs/ux-ui/acceptance/chr225-workstation-2026-10-14.json b/docs/ux-ui/acceptance/chr225-workstation-2026-10-14.json new file mode 100644 index 00000000..20c1bec5 --- /dev/null +++ b/docs/ux-ui/acceptance/chr225-workstation-2026-10-14.json @@ -0,0 +1,465 @@ +{ + "block": "12.5.225", + "date": "2026-10-14", + "vantage": "workstation", + "startedAt": "2026-10-14T01:34:42.462Z", + "requests": [ + { + "host": "194.226.121.150", + "path": "/system/resource", + "startedAt": "2026-10-14T01:34:42.463Z", + "durationMs": 396, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:34:42 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "194.226.121.150", + "path": "/interface/gre", + "startedAt": "2026-10-14T01:34:43.171Z", + "durationMs": 106, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:34:42 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "104.165.244.7", + "path": "/system/resource", + "startedAt": "2026-10-14T01:34:43.586Z", + "durationMs": 469, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:34:44 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "104.165.244.7", + "path": "/interface/gre", + "startedAt": "2026-10-14T01:34:44.365Z", + "durationMs": 218, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:34:44 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "194.226.121.150", + "path": "/system/resource", + "startedAt": "2026-10-14T01:34:49.891Z", + "durationMs": 106, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:34:49 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "194.226.121.150", + "path": "/interface/gre", + "startedAt": "2026-10-14T01:34:50.304Z", + "durationMs": 107, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:34:49 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "104.165.244.7", + "path": "/system/resource", + "startedAt": "2026-10-14T01:34:50.716Z", + "durationMs": 221, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:34:51 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "104.165.244.7", + "path": "/interface/gre", + "startedAt": "2026-10-14T01:34:51.238Z", + "durationMs": 219, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:34:51 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "194.226.121.150", + "path": "/system/resource", + "startedAt": "2026-10-14T01:34:56.767Z", + "durationMs": 109, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:34:56 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "194.226.121.150", + "path": "/interface/gre", + "startedAt": "2026-10-14T01:34:57.180Z", + "durationMs": 105, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:34:56 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "104.165.244.7", + "path": "/system/resource", + "startedAt": "2026-10-14T01:34:57.593Z", + "durationMs": 218, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:34:57 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "104.165.244.7", + "path": "/interface/gre", + "startedAt": "2026-10-14T01:34:58.113Z", + "durationMs": 221, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:34:58 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "194.226.121.150", + "path": "/system/clock", + "startedAt": "2026-10-14T01:34:58.648Z", + "durationMs": 106, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:34:58 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "194.226.121.150", + "path": "/ip/service", + "startedAt": "2026-10-14T01:34:59.062Z", + "durationMs": 113, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:34:58 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "194.226.121.150", + "path": "/log", + "startedAt": "2026-10-14T01:34:59.477Z", + "durationMs": 317, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:34:59 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "104.165.244.7", + "path": "/system/clock", + "startedAt": "2026-10-14T01:35:00.105Z", + "durationMs": 223, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:35:00 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "104.165.244.7", + "path": "/ip/service", + "startedAt": "2026-10-14T01:35:00.640Z", + "durationMs": 250, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:35:01 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + }, + { + "host": "104.165.244.7", + "path": "/log", + "startedAt": "2026-10-14T01:35:01.191Z", + "durationMs": 659, + "status": 200, + "headers": { + "date": "Wed, 14 Oct 2026 01:35:01 GMT", + "server": null, + "www-authenticate": null, + "connection": "close" + } + } + ], + "diagnostics": [ + { + "host": "194.226.121.150", + "clock": { + "date": "2026-10-14", + "time": "04:34:58", + "gmtOffset": "+03:00" + }, + "wwwServices": [ + { + "disabled": "false", + "maxSessions": "20", + "dynamic": "false" + }, + { + "disabled": "false", + "maxSessions": null, + "dynamic": "true" + } + ], + "retainedAuthFailures": 9, + "sources": { + "other-or-unidentified": 9 + }, + "recentFailures": [ + { + "time": "2026-10-13 19:54:09", + "origin": "other-or-unidentified", + "via": "ftp" + }, + { + "time": "2026-10-13 19:54:10", + "origin": "other-or-unidentified", + "via": "ftp" + }, + { + "time": "2026-10-13 19:54:11", + "origin": "other-or-unidentified", + "via": "ftp" + }, + { + "time": "2026-10-13 19:54:13", + "origin": "other-or-unidentified", + "via": "ftp" + }, + { + "time": "2026-10-13 19:54:14", + "origin": "other-or-unidentified", + "via": "ftp" + }, + { + "time": "2026-10-13 19:54:16", + "origin": "other-or-unidentified", + "via": "ftp" + }, + { + "time": "2026-10-13 19:54:18", + "origin": "other-or-unidentified", + "via": "ftp" + }, + { + "time": "2026-10-13 19:54:20", + "origin": "other-or-unidentified", + "via": "ftp" + }, + { + "time": "2026-10-13 19:54:21", + "origin": "other-or-unidentified", + "via": "ftp" + } + ], + "retainedLogIsNotCurrentRate": true + }, + { + "host": "104.165.244.7", + "clock": { + "date": "2026-10-14", + "time": "03:35:00", + "gmtOffset": "+02:00" + }, + "wwwServices": [ + { + "disabled": "false", + "maxSessions": "20", + "dynamic": "false" + }, + { + "disabled": "false", + "maxSessions": null, + "dynamic": "true" + } + ], + "retainedAuthFailures": 890, + "sources": { + "other-or-unidentified": 890 + }, + "recentFailures": [ + { + "time": "2026-10-14 03:25:22", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:25:34", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:25:52", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:26:26", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:26:44", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:27:29", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:27:49", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:28:12", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:29:12", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:29:17", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:29:23", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:29:42", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:30:33", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:30:48", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:31:11", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:31:50", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:32:31", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:32:44", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:34:16", + "origin": "other-or-unidentified", + "via": "ssh" + }, + { + "time": "2026-10-14 03:34:16", + "origin": "other-or-unidentified", + "via": "ssh" + } + ], + "retainedLogIsNotCurrentRate": true + } + ], + "configurationWrites": 0, + "passwordChanges": 0, + "rootCauseKnown": false, + "completedAt": "2026-10-14T01:35:02.158Z", + "summary": [ + { + "host": "194.226.121.150", + "requests": 9, + "ok": 9, + "unauthorized": 0, + "serverErrors": 0, + "transportErrors": 0 + }, + { + "host": "104.165.244.7", + "requests": 9, + "ok": 9, + "unauthorized": 0, + "serverErrors": 0, + "transportErrors": 0 + } + ] +}