chore(test): сопоставить REST клиенты и проверить сессии RouterOS
This commit is contained in:
1 parent
ab48973eb9
commit
e452e528e1
12 files changed
+5396
-9
No files matched your search
@@ -0,0 +1,9 @@
|
||||
import assert from 'node:assert/strict';import fs from 'node:fs';import path from 'node:path';import{pathToFileURL}from'node:url';import{createHash}from'node:crypto';
|
||||
const vantage=process.env.MMAPP_TEST_VANTAGE;assert(['workstation','debian'].includes(vantage));const output=process.env.MMAPP_TEST_REPORT;assert(output);const hosts=['194.226.121.150','104.165.244.7'],root=path.resolve('backend/dist'),{MikrotikClient}=await import(pathToFileURL(root+'/services/mikrotik.js'));let rows;
|
||||
if(vantage==='debian'){const{pool}=await import(pathToFileURL(root+'/db/index.js'));try{rows=(await pool.query("SELECT host,port,use_ssl,enabled,username,password FROM servers WHERE host IN ('194.226.121.150','104.165.244.7') ORDER BY host")).rows}finally{await pool.end()}}else{assert(process.env.MMAPP_TEST_CHR_USER&&process.env.MMAPP_TEST_CHR_PASSWORD);rows=hosts.map(host=>({host,port:80,use_ssl:false,enabled:true,username:process.env.MMAPP_TEST_CHR_USER,password:process.env.MMAPP_TEST_CHR_PASSWORD}))}assert.equal(rows.length,2);assert.deepEqual(rows.map(r=>r.host).sort(),[...hosts].sort());assert(rows.every(r=>r.enabled&&r.port===80&&!r.use_ssl));
|
||||
const report={date:'2026-10-14',block:'12.5.236',vantage,credentialSource:vantage==='debian'?'stored-enabled-server-rows':'explicit-owned-test-env',startedAt:new Date().toISOString(),requests:[],diagnostics:[],configurationWrites:0,passwordChanges:0,rootCauseKnown:false};const sleep=ms=>new Promise(r=>setTimeout(r,ms));const clients=new Map(rows.map(r=>[r.host,new MikrotikClient({host:r.host,port:80,useSsl:false,verifySsl:false,username:r.username,password:r.password})]));
|
||||
function errorMetadata(e,body){let obj;try{obj=JSON.parse(body)}catch{}const detail=String(obj?.detail??'');return{errorName:e?.name??null,errorBodySha256:body?createHash('sha256').update(body).digest('hex'):null,errorKeys:obj&&typeof obj==='object'?Object.keys(obj).sort():[],detailCategory:/not enough permissions/i.test(detail)?'insufficient-policy':/not allowed/i.test(detail)?'not-allowed':/session closed/i.test(detail)?'session-closed':detail?'unclassified':'absent'}}
|
||||
async function read(row,endpoint,mode,cycle,kind='sample'){const begin=Date.now(),record={host:row.host,path:endpoint,mode,cycle,kind,startedAt:new Date().toISOString()};let data;try{if(mode==='compiled-client'){data=await clients.get(row.host).get(endpoint,6000);record.status=200}else{const authorization='Basic '+Buffer.from(row.username+':'+row.password).toString('base64');const r=await fetch('http://'+row.host+'/rest'+endpoint,{headers:{authorization,Connection:'close'},signal:AbortSignal.timeout(6000)}),body=await r.text();record.status=r.status;record.basicChallenge=/Basic/i.test(r.headers.get('www-authenticate')??'');if(r.ok)data=JSON.parse(body);else Object.assign(record,errorMetadata(null,body))}}catch(e){record.status=e.statusCode??null;Object.assign(record,errorMetadata(e,e.body??''))}record.durationMs=Date.now()-begin;report.requests.push(record);await sleep(125);return data}
|
||||
async function diagnostic(row,phase){const userRows=await read(row,'/user','compiled-client',0,'diagnostic'),users=Array.isArray(userRows)?userRows.filter(u=>u.name===row.username):[];const groups=await read(row,'/user/group','compiled-client',0,'diagnostic'),group=Array.isArray(groups)?groups.find(g=>g.name===users[0]?.group):null;const services=await read(row,'/ip/service','compiled-client',0,'diagnostic'),resource=await read(row,'/system/resource','compiled-client',0,'diagnostic'),logs=await read(row,'/log','compiled-client',0,'diagnostic');const auth=Array.isArray(logs)?logs.filter(l=>/login failure/i.test(String(l.message))):[];const events=auth.map(l=>{const message=String(l.message);return{time:l.time??null,via:message.match(/via (\S+)/)?.[1]??null,fromTestDebian:/from 161\.104\.46\.222\b/.test(message),forConfiguredUser:message.includes('for user '+row.username+' ')}});const www=Array.isArray(services)?services.filter(s=>s.name==='www'):[];report.diagnostics.push({host:row.host,phase,userPresent:users.length===1,userDisabled:users[0]?.disabled??null,userAddressRestriction:users[0]?.address??null,hasApiPolicy:group?String(group.policy).split(',').includes('api'):null,hasRestApiPolicy:group?String(group.policy).split(',').includes('rest-api'):null,wwwEnabled:www.some(s=>s.disabled==='false'),wwwMaxSessions:www.find(s=>s['max-sessions'])?.['max-sessions']??null,wwwDynamicRows:www.filter(s=>s.dynamic==='true').length,resource:resource?{version:resource.version,uptime:resource.uptime,cpuLoad:resource['cpu-load'],freeMemory:resource['free-memory']}:null,retainedAuthFailureCount:auth.length,recentFailures:events.slice(-15),retainedLogIsNotCurrentRate:true})}
|
||||
function save(){const samples=report.requests.filter(r=>r.kind==='sample');report.completedAt=new Date().toISOString();report.summary={sampleRequests:samples.length,failedSamples:samples.filter(r=>r.status!==200).length,allRequests:report.requests.length,failures:report.requests.filter(r=>r.status!==200).map(r=>({host:r.host,path:r.path,mode:r.mode,status:r.status,kind:r.kind,startedAt:r.startedAt}))};fs.writeFileSync(output,JSON.stringify(report,null,2)+'\n')}
|
||||
try{for(const row of rows)await diagnostic(row,'before');const started=Date.now(),paths=['/system/resource','/interface/gre','/routing/bgp/session','/routing/ospf/neighbor','/interface/wireguard/peers','/interface/vxlan'];for(let cycle=1;cycle<=8;cycle++){for(const row of rows)for(const endpoint of paths){const modes=cycle%2?['compiled-client','fetch-close']:['fetch-close','compiled-client'];for(const mode of modes){const previous=report.requests.length;await read(row,endpoint,mode,cycle);if(report.requests[previous].status!==200){await read(row,'/system/resource','fetch-close',cycle,'failure-control');await diagnostic(row,'failure-'+cycle)}}}save();console.log(JSON.stringify({vantage,cycle,samples:report.summary.sampleRequests,failed:report.summary.failedSamples}));if(cycle<8)await sleep(Math.max(0,started+cycle*12000-Date.now()))}for(const row of rows)await diagnostic(row,'after')}finally{save();console.log(JSON.stringify({vantage,summary:report.summary,rootCauseKnown:false}))}
|
||||
@@ -1,6 +1,6 @@
|
||||
# UX/UI: протокол внешней приёмки 12.5
|
||||
|
||||
Актуальное продолжение 2026-10-14:230–235 — реальные S3 backup/ограниченный restore/UI, native /file/read, защита подключения/гонок и legacy restore приняты. Исправлены5 Compose variants: /app/storage/backups подключён к host data/backups.2 native CHR backups пережили force-recreate, API SHA256 matched, own files/catalog очищены; original10 rows сохранены, их ранее отсутствующие files не восстановлены. Backend ux-backup234/frontend ux-routing218 healthy. Далее236 — недоступные local files в UX/границы retention и оставшаяся матрица12.5. Этап открыт.
|
||||
Актуальное продолжение 2026-10-14:236 — по приоритету пользователя проверен REST:384 paired samples из workstation/Debian +40 diagnostics, отказов0; current credentials/policies/addresses/service load исправны. На7.24.5 сохранены828/304 rest-api sessions и2 api на каждом; после3 дополнительных reads delta0. Найден vendor fix inactive REST sessions в7.25rc, это гипотеза, причинность401/500 не доказана. Runtime ux-backup234/ux-routing218 unchanged. Следующий REST шаг — корреляция сбоя/renewal или согласованный firmware control; общий следующий237 — missing local files UX. Этап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).
|
||||
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
# План реализации UX/UI по пятичасовым окнам
|
||||
|
||||
Актуальное продолжение 2026-10-14:230–235 — реальные S3 backup/ограниченный restore/UI, native /file/read, защита подключения/гонок и legacy restore приняты. Исправлены5 Compose variants: /app/storage/backups подключён к host data/backups.2 native CHR backups пережили force-recreate, API SHA256 matched, own files/catalog очищены; original10 rows сохранены, их ранее отсутствующие files не восстановлены. Backend ux-backup234/frontend ux-routing218 healthy. Далее236 — недоступные local files в UX/границы retention и оставшаяся матрица12.5. Этап открыт.
|
||||
Актуальное продолжение 2026-10-14:236 — по приоритету пользователя проверен REST:384 paired samples из workstation/Debian +40 diagnostics, отказов0; current credentials/policies/addresses/service load исправны. На7.24.5 сохранены828/304 rest-api sessions и2 api на каждом; после3 дополнительных reads delta0. Найден vendor fix inactive REST sessions в7.25rc, это гипотеза, причинность401/500 не доказана. Runtime ux-backup234/ux-routing218 unchanged. Следующий REST шаг — корреляция сбоя/renewal или согласованный firmware control; общий следующий237 — missing local files UX. Этап12.5 открыт.
|
||||
|
||||
Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-14. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат.
|
||||
|
||||
|
||||
+18
-2
@@ -1,6 +1,6 @@
|
||||
# UX/UI: журнал реализации
|
||||
|
||||
Актуальное продолжение 2026-10-14:230–235 — реальные S3 backup/ограниченный restore/UI, native /file/read, защита подключения/гонок и legacy restore приняты. Исправлены5 Compose variants: /app/storage/backups подключён к host data/backups.2 native CHR backups пережили force-recreate, API SHA256 matched, own files/catalog очищены; original10 rows сохранены, их ранее отсутствующие files не восстановлены. Backend ux-backup234/frontend ux-routing218 healthy. Далее236 — недоступные local files в UX/границы retention и оставшаяся матрица12.5. Этап открыт.
|
||||
Актуальное продолжение 2026-10-14:236 — по приоритету пользователя проверен REST:384 paired samples из workstation/Debian +40 diagnostics, отказов0; current credentials/policies/addresses/service load исправны. На7.24.5 сохранены828/304 rest-api sessions и2 api на каждом; после3 дополнительных reads delta0. Найден vendor fix inactive REST sessions в7.25rc, это гипотеза, причинность401/500 не доказана. Runtime ux-backup234/ux-routing218 unchanged. Следующий REST шаг — корреляция сбоя/renewal или согласованный firmware control; общий следующий237 — missing local files UX. Этап12.5 открыт.
|
||||
|
||||
Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md).
|
||||
|
||||
@@ -36,7 +36,23 @@
|
||||
| 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–235 завершены в записанных scopes, этап открыт. Runtime backend ux-backup234/frontend ux-routing218; backend25/UI52 и дополнительные SQL/UDP222 прошли. |
|
||||
| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка12.3.83 в границах журнала. Внешняя12.5: блоки1–236 завершены в записанных scopes, этап открыт. Runtime backend ux-backup234/frontend ux-routing218; backend25/UI52 и дополнительные SQL/UDP222 прошли. |
|
||||
|
||||
## 12.5.236 — коррелированная диагностика REST и гипотеза RouterOS-сессий (2026-10-14)
|
||||
|
||||
По поручению пользователя остаток окна направлен на REST. Исторические220/224401 получены непосредственно от104.165.244.7, включая независимый HTTP Connection close; UI/кэш приложения не являются единственным источником. У старого221500 на /interface/gre не сохранён detail/body, поэтому назначить ему причину по HTTP code нельзя.
|
||||
|
||||
Две vantage: workstation с явными test credentials и Debian production container со stored enabled-server rows.8 cycles ×2 hosts ×6 endpoints ×2 clients =384 samples:compiled MikrotikClient GET против independent fetch/Connection close, порядок чередуется. resource/GRE/BGP/OSPF/WireGuard/VXLAN — все200.40 diagnostic reads (user/group/service/resource/log) тоже успешны. Disabled devices не опрашивались. [Workstation](ux-ui/acceptance/chr236-workstation.json), [Debian](ux-ui/acceptance/chr236-debian.json).
|
||||
|
||||
Current user enabled, address restriction empty, api/rest-api policies true; www enabled/max sessions20, dynamic connections1–2, CPU0–2%, free RAM около813–815MB. Retained auth failures9/899 до/после не выросли; recent retained failures не указывают на test-debian/configured user. Это данные текущей выборки, не исключение изменений прав/credentials в прошлом и не rate/SLA.
|
||||
|
||||
/user/active показывает828 rest-api +2 api на194 и304 rest-api +2 api на104. После3 дополнительных resource reads и повторного active snapshot counts остались прежними (background polling не приостанавливался). Накопленный объём подтверждён; рост на каждом запросе/возраст/неактивность каждой записи не доказаны. [Sessions](ux-ui/acceptance/rest236-active-sessions.json), [delta0](ux-ui/acceptance/rest236-session-growth.json).
|
||||
|
||||
В официальном vendor announcement7.25rc, changes since7.24.5, указано исправление удаления inactive REST API sessions (introduced7.21). [Первичный changelog](https://forum.mikrotik.com/t/7-25rc-testing-is-released/273520/1). Официальная REST документация описывает cached API login10min; новая редакция проверена на7.25, поэтому её детали не объявляются экспериментом на7.24.5. [REST docs](https://manual.mikrotik.com/docs/developer-guides/rest-api/). Это конкретная гипотеза для version/renewal control, а не доказанный root cause старых401/500. Firmware/users/services/passwords не менялись; automatic request retries не добавлены.
|
||||
|
||||
Новый reproducible helper chr-rest-correlated.mjs сохраняет failure status/path/time/body SHA256/safe detail category и immediately independent control/diagnostics при сбое, не публикуя credentials/config bodies. В этой серии failure controls0, поскольку ошибки не повторились. ESLint и diff check passed, production build/deploy не требуются для acceptance script. Private workstation env удалён. [Итог/границы](ux-ui/acceptance/rest236-summary.json).
|
||||
|
||||
REST пункт остаётся открытым для причинности: получить correlated failure на renewal/long window либо отдельный согласованный version control с vendor fix. Тест длительностью около нескольких минут не покрывает10-minute renewal. Общий следующий237 — UX missing local files; другие группы матрицы сохраняются. Runtime backend ux-backup234/frontend ux-routing218. Этап12.5 открыт.
|
||||
|
||||
## 12.5.235 — постоянное хранение .rsc и реальные копии после пересоздания Docker (2026-10-14)
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Оставшаяся внешняя приёмка — 2026-10-14
|
||||
|
||||
Актуальное продолжение 2026-10-14:230–235 — реальные S3 backup/ограниченный restore/UI, native /file/read, защита подключения/гонок и legacy restore приняты. Исправлены5 Compose variants: /app/storage/backups подключён к host data/backups.2 native CHR backups пережили force-recreate, API SHA256 matched, own files/catalog очищены; original10 rows сохранены, их ранее отсутствующие files не восстановлены. Backend ux-backup234/frontend ux-routing218 healthy. Далее236 — недоступные local files в UX/границы retention и оставшаяся матрица12.5. Этап открыт.
|
||||
Актуальное продолжение 2026-10-14:236 — по приоритету пользователя проверен REST:384 paired samples из workstation/Debian +40 diagnostics, отказов0; current credentials/policies/addresses/service load исправны. На7.24.5 сохранены828/304 rest-api sessions и2 api на каждом; после3 дополнительных reads delta0. Найден vendor fix inactive REST sessions в7.25rc, это гипотеза, причинность401/500 не доказана. Runtime ux-backup234/ux-routing218 unchanged. Следующий REST шаг — корреляция сбоя/renewal или согласованный firmware control; общий следующий237 — missing local files UX. Этап12.5 открыт.
|
||||
|
||||
Это актуальная матрица после 12.5.235. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии.
|
||||
Это актуальная матрица после 12.5.236. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии.
|
||||
|
||||
Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-backup234`, frontend `ux-routing218`; production lab с195 использует AUTH_REQUIRED=true и Portal1.3.1. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись.
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
| Группа | Что уже подтверждено | Оставшийся результат / что требуется |
|
||||
| --- | --- | --- |
|
||||
| REST и достоверность данных | Ошибки OSPF/BFD/BGP/GRE/WAN215–221 явные; latest API smoke222 прошёл | Причина единичных native401/500 неизвестна. Короткое независимое наблюдение возможно сейчас; оно не даст SLA |
|
||||
| REST и достоверность данных | Ошибки OSPF/BFD/BGP/GRE/WAN215–221 явные; latest API smoke222 прошёл | Correlated236:384 samples/40 diagnostics без отказов; current policies/address/load исправны.828/304 retained REST sessions и vendor inactive-session fix — гипотеза; причинность401/500,10min renewal/version control остаются открытыми |
|
||||
| Клиентские ОС и внешняя сеть | CHR↔CHR/Linux, private IPv4/ULA и synthetic IPv6/IPFIX; Android full-tunnel/reconnect227 подтверждены пользователем | Windows/macOS/iOS VPN, расширенная Android приёмка, независимые WAN/multi-WAN и public IPv6; public IPv6 на текущем стенде отсутствует |
|
||||
| Масштаб и длительная устойчивость | Контролируемые lock/dedupe/loss/recovery и короткие native проверки | Несколько backend/worker/writers, длительный rekey/REST/traffic, physical disconnect и maximum throughput |
|
||||
| Внешние хранилища и jobs | Локальные API/errors/RBAC/owned SQL; реальные Portal1.3.1/Telegram195–201 и Selectel S3/client/API/ownSQL228–229 | Large native exports проверены HTTP fixture; S3 restore через UI, missing local files UX, миграция между buckets/multi-instance и retention; provider/container/Gitea/MaxMind jobs с соответствующими endpoints/аккаунтами; private/paid credentials не выдумывать |
|
||||
|
||||
+18
-1
@@ -1,6 +1,6 @@
|
||||
# Этап 12: итоговая приёмка UX/UI
|
||||
|
||||
Актуальное продолжение 2026-10-14:230–235 — реальные S3 backup/ограниченный restore/UI, native /file/read, защита подключения/гонок и legacy restore приняты. Исправлены5 Compose variants: /app/storage/backups подключён к host data/backups.2 native CHR backups пережили force-recreate, API SHA256 matched, own files/catalog очищены; original10 rows сохранены, их ранее отсутствующие files не восстановлены. Backend ux-backup234/frontend ux-routing218 healthy. Далее236 — недоступные local files в UX/границы retention и оставшаяся матрица12.5. Этап открыт.
|
||||
Актуальное продолжение 2026-10-14:236 — по приоритету пользователя проверен REST:384 paired samples из workstation/Debian +40 diagnostics, отказов0; current credentials/policies/addresses/service load исправны. На7.24.5 сохранены828/304 rest-api sessions и2 api на каждом; после3 дополнительных reads delta0. Найден vendor fix inactive REST sessions в7.25rc, это гипотеза, причинность401/500 не доказана. Runtime ux-backup234/ux-routing218 unchanged. Следующий REST шаг — корреляция сбоя/renewal или согласованный firmware control; общий следующий237 — missing local files UX. Этап12.5 открыт.
|
||||
|
||||
План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push.
|
||||
|
||||
@@ -4151,3 +4151,20 @@ Real Portal/browser API, provider local verified: создан один job ро
|
||||
|
||||
Runtime backend ux-backup234/frontend ux-routing218 healthy; новое application image для volume-only fix не требовалось. Пароли CHR не менялись, S3 mutations0 в235, configs body/JWT не опубликованы, private local manifest удалён. Исходные10 missing local files не восстановлены и records не удалены. Force-recreate — не host reboot/power loss/fsync/DR приёмка. Далее236 — UX недоступных local files, затем version retention границы и оставшиеся7 группы матрицы; multi-instance guard не принимается. Этап12.5 открыт.
|
||||
|
||||
|
||||
## 12.5.236 — коррелированная диагностика REST и гипотеза RouterOS-сессий (2026-10-14)
|
||||
|
||||
По поручению пользователя остаток окна направлен на REST. Исторические220/224401 получены непосредственно от104.165.244.7, включая независимый HTTP Connection close; UI/кэш приложения не являются единственным источником. У старого221500 на /interface/gre не сохранён detail/body, поэтому назначить ему причину по HTTP code нельзя.
|
||||
|
||||
Две vantage: workstation с явными test credentials и Debian production container со stored enabled-server rows.8 cycles ×2 hosts ×6 endpoints ×2 clients =384 samples:compiled MikrotikClient GET против independent fetch/Connection close, порядок чередуется. resource/GRE/BGP/OSPF/WireGuard/VXLAN — все200.40 diagnostic reads (user/group/service/resource/log) тоже успешны. Disabled devices не опрашивались. [Workstation](ux-ui/acceptance/chr236-workstation.json), [Debian](ux-ui/acceptance/chr236-debian.json).
|
||||
|
||||
Current user enabled, address restriction empty, api/rest-api policies true; www enabled/max sessions20, dynamic connections1–2, CPU0–2%, free RAM около813–815MB. Retained auth failures9/899 до/после не выросли; recent retained failures не указывают на test-debian/configured user. Это данные текущей выборки, не исключение изменений прав/credentials в прошлом и не rate/SLA.
|
||||
|
||||
/user/active показывает828 rest-api +2 api на194 и304 rest-api +2 api на104. После3 дополнительных resource reads и повторного active snapshot counts остались прежними (background polling не приостанавливался). Накопленный объём подтверждён; рост на каждом запросе/возраст/неактивность каждой записи не доказаны. [Sessions](ux-ui/acceptance/rest236-active-sessions.json), [delta0](ux-ui/acceptance/rest236-session-growth.json).
|
||||
|
||||
В официальном vendor announcement7.25rc, changes since7.24.5, указано исправление удаления inactive REST API sessions (introduced7.21). [Первичный changelog](https://forum.mikrotik.com/t/7-25rc-testing-is-released/273520/1). Официальная REST документация описывает cached API login10min; новая редакция проверена на7.25, поэтому её детали не объявляются экспериментом на7.24.5. [REST docs](https://manual.mikrotik.com/docs/developer-guides/rest-api/). Это конкретная гипотеза для version/renewal control, а не доказанный root cause старых401/500. Firmware/users/services/passwords не менялись; automatic request retries не добавлены.
|
||||
|
||||
Новый reproducible helper chr-rest-correlated.mjs сохраняет failure status/path/time/body SHA256/safe detail category и immediately independent control/diagnostics при сбое, не публикуя credentials/config bodies. В этой серии failure controls0, поскольку ошибки не повторились. ESLint и diff check passed, production build/deploy не требуются для acceptance script. Private workstation env удалён. [Итог/границы](ux-ui/acceptance/rest236-summary.json).
|
||||
|
||||
REST пункт остаётся открытым для причинности: получить correlated failure на renewal/long window либо отдельный согласованный version control с vendor fix. Тест длительностью около нескольких минут не покрывает10-minute renewal. Общий следующий237 — UX missing local files; другие группы матрицы сохраняются. Runtime backend ux-backup234/frontend ux-routing218. Этап12.5 открыт.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Тестовый сервер UX/UI — 2026-10-10
|
||||
|
||||
Актуальное продолжение 2026-10-14:230–235 — реальные S3 backup/ограниченный restore/UI, native /file/read, защита подключения/гонок и legacy restore приняты. Исправлены5 Compose variants: /app/storage/backups подключён к host data/backups.2 native CHR backups пережили force-recreate, API SHA256 matched, own files/catalog очищены; original10 rows сохранены, их ранее отсутствующие files не восстановлены. Backend ux-backup234/frontend ux-routing218 healthy. Далее236 — недоступные local files в UX/границы retention и оставшаяся матрица12.5. Этап открыт.
|
||||
Актуальное продолжение 2026-10-14:236 — по приоритету пользователя проверен REST:384 paired samples из workstation/Debian +40 diagnostics, отказов0; current credentials/policies/addresses/service load исправны. На7.24.5 сохранены828/304 rest-api sessions и2 api на каждом; после3 дополнительных reads delta0. Найден vendor fix inactive REST sessions в7.25rc, это гипотеза, причинность401/500 не доказана. Runtime ux-backup234/ux-routing218 unchanged. Следующий REST шаг — корреляция сбоя/renewal или согласованный firmware control; общий следующий237 — missing local files UX. Этап12.5 открыт.
|
||||
|
||||
| Параметр | Проверенное состояние |
|
||||
| --- | --- |
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"date": "2026-10-14",
|
||||
"block": "12.5.236",
|
||||
"devices": [
|
||||
{
|
||||
"host": "104.165.244.7",
|
||||
"activeSessions": 306,
|
||||
"byVia": {
|
||||
"rest-api": 304,
|
||||
"api": 2
|
||||
},
|
||||
"forConfiguredUser": 306
|
||||
},
|
||||
{
|
||||
"host": "194.226.121.150",
|
||||
"activeSessions": 830,
|
||||
"byVia": {
|
||||
"rest-api": 828,
|
||||
"api": 2
|
||||
},
|
||||
"forConfiguredUser": 830
|
||||
}
|
||||
],
|
||||
"configurationWrites": 0
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"date": "2026-10-14",
|
||||
"block": "12.5.236",
|
||||
"devices": [
|
||||
{
|
||||
"host": "104.165.244.7",
|
||||
"before": {
|
||||
"total": 306,
|
||||
"rest": 304,
|
||||
"api": 2
|
||||
},
|
||||
"after": {
|
||||
"total": 306,
|
||||
"rest": 304,
|
||||
"api": 2
|
||||
},
|
||||
"restDelta": 0,
|
||||
"explicitReadsBetweenSnapshots": 3,
|
||||
"backgroundPollingNotPaused": true,
|
||||
"recordKeys": [
|
||||
".id",
|
||||
"address",
|
||||
"group",
|
||||
"name",
|
||||
"radius",
|
||||
"via",
|
||||
"when"
|
||||
]
|
||||
},
|
||||
{
|
||||
"host": "194.226.121.150",
|
||||
"before": {
|
||||
"total": 830,
|
||||
"rest": 828,
|
||||
"api": 2
|
||||
},
|
||||
"after": {
|
||||
"total": 830,
|
||||
"rest": 828,
|
||||
"api": 2
|
||||
},
|
||||
"restDelta": 0,
|
||||
"explicitReadsBetweenSnapshots": 3,
|
||||
"backgroundPollingNotPaused": true,
|
||||
"recordKeys": [
|
||||
".id",
|
||||
"address",
|
||||
"group",
|
||||
"name",
|
||||
"radius",
|
||||
"via",
|
||||
"when"
|
||||
]
|
||||
}
|
||||
],
|
||||
"configurationWrites": 0
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"date": "2026-10-14",
|
||||
"block": "12.5.236",
|
||||
"samples": 384,
|
||||
"failedSamples": 0,
|
||||
"diagnosticReads": 40,
|
||||
"disabledDeviceReads": 0,
|
||||
"configurationWrites": 0,
|
||||
"passwordChanges": 0,
|
||||
"findings": {
|
||||
"currentCredentialsAndPoliciesWork": true,
|
||||
"persistentAddressRestrictionObserved": false,
|
||||
"currentWwwSessionsBelowLimit": true,
|
||||
"retainedRestSessions": {
|
||||
"194.226.121.150": 828,
|
||||
"104.165.244.7": 304
|
||||
},
|
||||
"internalApiSessionsPerDevice": 2,
|
||||
"restGrowthDuringThreeAdditionalReads": 0
|
||||
},
|
||||
"rootCauseKnown": false,
|
||||
"routerOs": "7.24.5",
|
||||
"candidate": {
|
||||
"kind": "inactive-rest-session-cleanup",
|
||||
"status": "vendor-fixed-related-defect-not-proven-cause-of-historical-errors",
|
||||
"source": "https://forum.mikrotik.com/t/7-25rc-testing-is-released/273520/1",
|
||||
"fixedInAnnouncement": "7.25rc changes since 7.24.5",
|
||||
"introducedSince": "7.21"
|
||||
},
|
||||
"limits": [
|
||||
"Old500 detail body was not recorded",
|
||||
"No failure occurred during current correlated observation",
|
||||
"No 10-minute login renewal or firmware comparison",
|
||||
"Stored failure logs are retained history, not current request rate",
|
||||
"Current valid credentials/policies do not establish historical state"
|
||||
]
|
||||
}
|
||||
Reference in new issue
Block a user