fix(node): show completed setup checks with a timestamp
This commit is contained in:
@@ -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"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user