fix(node): show completed setup checks with a timestamp

This commit is contained in:
DCCONSTRUCTIONS
2026-09-05 20:11:17 +03:00
parent 9062126913
commit a98ef339de
3 changed files with 33 additions and 3 deletions
+1 -1
View File
@@ -13,7 +13,7 @@ import tarfile
ROOT = Path(__file__).resolve().parents[1] ROOT = Path(__file__).resolve().parents[1]
VERSION = "0.4.1" VERSION = "0.4.2"
BRAND_SHA256 = "8bfee8ca9f98e0db48d98aae3af4b32493b8593e18b064a0239d513d824182af" BRAND_SHA256 = "8bfee8ca9f98e0db48d98aae3af4b32493b8593e18b064a0239d513d824182af"
+3 -2
View File
@@ -5,7 +5,7 @@ import type { useEnvironment } from "./useEnvironment";
import { TailnetAccess } from "./TailnetAccess"; import { TailnetAccess } from "./TailnetAccess";
import { SystemAccess } from "./SystemAccess"; import { SystemAccess } from "./SystemAccess";
const labels:Record<string,string>={pending:"Ожидает",running:"Выполняется",complete:"Готово",error:"Ошибка",blocked:"Не выполнено"}; const labels:Record<string,string>={pending:"Ожидает",running:"Выполняется",error:"Ошибка",blocked:"Не выполнено"};
export function EnvironmentView({environment,failure,success}: {environment:ReturnType<typeof useEnvironment>;failure:(error:unknown)=>void;success:(text:string)=>void}) { export function EnvironmentView({environment,failure,success}: {environment:ReturnType<typeof useEnvironment>;failure:(error:unknown)=>void;success:(text:string)=>void}) {
const {value,pending,running,loading,start}=environment; const {value,pending,running,loading,start}=environment;
const [adding,setAdding]=useState(false); const [adding,setAdding]=useState(false);
@@ -22,8 +22,9 @@ export function EnvironmentView({environment,failure,success}: {environment:Retu
<ResourceList aria-label="Этапы настройки окружения">{value.profile.steps.map(specification=>{ <ResourceList aria-label="Этапы настройки окружения">{value.profile.steps.map(specification=>{
const step=value.run?.steps.find(item=>item.id===specification.id); const step=value.run?.steps.find(item=>item.id===specification.id);
const state=step?.state??"pending"; const state=step?.state??"pending";
return <li key={specification.id}><ResourceRow icon={state==="running"?<ActivityIndicator size="compact" />:<Icon name={state==="complete"?"check":state==="error"?"alert":"circle"} />} title={specification.label} description={specification.description} metadata={step?.detail} status={<StatusBadge tone={state==="complete"?"success":state==="error"?"warning":"neutral"}>{labels[state]??"Неизвестно"}</StatusBadge>} /></li>; return <li key={specification.id}><ResourceRow icon={state==="running"?<ActivityIndicator size="compact" />:<Icon name={state==="error"?"alert":"circle"} />} title={specification.label} description={specification.description} metadata={step?.detail} status={<StatusBadge tone={state==="complete"?"success":state==="error"?"warning":"neutral"}>{state==="complete"?<Icon name="check" label="Этап завершён" />:labels[state]??"Неизвестно"}</StatusBadge>} /></li>;
})}</ResourceList> })}</ResourceList>
{value.run&&!running&&value.run.updated_at>0&&<p className="node-note">Результат проверки от {new Date(value.run.updated_at*1000).toLocaleString("ru-RU")}.</p>}
{complete&&!running&&<p className="node-note">Системные этапы завершены. Ниже проверьте вход в Tailscale и доверенный ключ для SSH.</p>} {complete&&!running&&<p className="node-note">Системные этапы завершены. Ниже проверьте вход в Tailscale и доверенный ключ для SSH.</p>}
{value.run?.state==="error"&&!running&&<p className="node-note">Часть этапов не завершена. Исправьте указанные причины и повторите настройку.</p>} {value.run?.state==="error"&&!running&&<p className="node-note">Часть этапов не завершена. Исправьте указанные причины и повторите настройку.</p>}
{value.run?.state==="interrupted"&&<p className="node-note">Предыдущая настройка прервана. Повторный запуск проверит уже выполненные этапы.</p>} {value.run?.state==="interrupted"&&<p className="node-note">Предыдущая настройка прервана. Повторный запуск проверит уже выполненные этапы.</p>}
@@ -272,3 +272,32 @@ helper по SSH не заменяет ни одну из них.
точную кнопку и ожидаемое действие. Тест проверяет restrictive umask, повторный точную кнопку и ожидаемое действие. Тест проверяет restrictive umask, повторный
ремонт и сохранение прав чужого каталога. Физическая GUI-проверка исправленной ремонт и сохранение прав чужого каталога. Физическая GUI-проверка исправленной
версии фиксируется по наблюдаемому результату в отчёте Ops. версии фиксируется по наблюдаемому результату в отчёте Ops.
### Подтверждённый GUI-проход профиля /2 и границы доверия
Владелец подтвердил успешный повторный запуск через кнопку в 0.4.1. Журнал
профиля /2 доступен обычному приложению (каталог 0755); семь этапов complete.
Получены три сетевых интерфейса и 13 системных USB-объектов. Отдельная проверка
службы подтверждает active, непривилегированного пользователя, пустой набор
capabilities и AF_NETLINK. SSH и Tailscale активны. Ручная команда ремонта прав
в обход кнопки не выполнялась. В 0.4.2 надпись «Готово» заменена канонической
галочкой со смысловой подписью для средств доступности. Рядом с результатом
указано время проверки, чтобы прошедший запуск не воспринимался как live-status.
Профиль /2 не изменён.
Это положительная приёмка текущего подготовленного Mini, а не доказательство
развёртывания с чистой системой. Ранее инженерный SSH и личная политика
локального подтверждения администратора уже настраивались. Количество USB
не доказывает работу SDK; локальный ответ SSH не доказывает новый удалённый
вход; служба Tailscale не доказывает авторизацию; прошедший запуск является
снимком результата, а не непрерывным монитором всех компонентов.
Ближайший критерий доверия к поставке: отдельная чистая согласованная система,
.deb → запуск → «Сконфигурировать» → вход в частную сеть → доверенный ключ
через UI → проверяемый вход и отзыв → перезагрузка → повторная проверка.
Первичный прогон выполняется без предварительного SSH-bootstrap, команд
инженера, предустановленного OpenSSH/Tailscale и личных polkit-исключений.
Текущий рабочий Mini для этого не стирается. Виртуальная проверка не заменяет
физическую квалификацию USB/BLE/Wi-Fi. После этого следующий функциональный
срез P1 — приглашение Node и сопряжение с реестром аппаратов Core, затем D455.