server-monitor-manager/agents/codex/inbox/from-smm-deliverables/Старые задачи/smm-codex-task-mesh-state-permissions-2026-08-18.md
Ochenstarik 23eb3f5233 chore(agents): разбор рабочих папок с диска на 2026-08-18
Задания, отчёты и патчи, лежавшие в C:\Users\Ochenstarik\projects и в
домашней папке, перенесены в agents/. Разложено по агентам там, где имя
файла позволяло определить автора; остальное — в _salvage-2026-08-18/
и разбирается вручную.

Патчи в notes/salvage-2026-08-18/ — незакоммиченная работа из брошенных
рабочих копий: она существовала только на диске.

Тяжёлое (релизные архивы, инсталляторы, наборы данных) в репозиторий не
попало: оно лежит рядом, в Agent_projects/_archive и Agent_projects/_data.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 14:19:54 +07:00

5.2 KiB
Raw Permalink Blame History

Codex: дать Control доступ к состоянию mesh

Небольшое задание, но блокирующее: без него эндпоинт выдачи кодов регистрации, сделанный Antigravity в PR #53, на настоящем Hub не работает.

Репозиторий

  • https://github.com/ochenstarik-ui/server-monitor-manager
  • База: main @ 5fd9def или новее
  • Ветка: codex/mesh-state-permissions
  • main защищён: PR обязателен, обязательны статусы build-and-test и build, force-push запрещён
  • один PR — одна тема; описание PR заполняется после завершения CI

Дефект

NodeEnrollmentService в Control читает и дописывает /var/lib/ochenstarik-server-monitor-manager/mesh/nodes.tsv — тот же файл и тот же формат из четырёх колонок, что использует reserve_node_address в deploy/ochenstarik-server-monitor-manager.sh. Разделяемое состояние выбрано верно: два источника истины были бы хуже.

Но доступа к этому файлу у Control нет:

  • deploy/ochenstarik-server-monitor-manager.sh:723 и :764install -d -m 0700 "$MESH_DIR", каталог создаётся от root и остаётся root-овым;
  • :740 и :766chmod 0600 "$MESH_DIR/nodes.tsv";
  • :574chown -R "$CONTROL_USER:$CONTROL_USER" "$STATE_DIR/control". Права выдаются только подкаталогу control. Подкаталог mesh не упомянут нигде;
  • deploy/ochenstarik-smm-control.service:8User=ochenstarik-smm-control.

Итог: на настоящем Hub запрос кода упрётся в отказ доступа. В CI это не проявляется — тесты подставляют Control:MeshNodesPath во временный каталог, поэтому проверяется логика, но не права.

Что сделать

Дать пользователю Control право читать и изменять состояние mesh, не отдавая ему лишнего:

  • каталог $MESH_DIRroot:$CONTROL_USER, режим 0770;
  • $MESH_DIR/nodes.tsvroot:$CONTROL_USER, режим 0660;
  • применить это во всех местах, где каталог и файл создаются, а не в одном: сейчас это mesh_init и reserve_node_address;
  • существующие установки чинятся при обновлении: если каталог уже есть с прежними правами, они приводятся к новым.

Приватные ключи WireGuard в $WG_DIR остаются недоступными Control. Проверьте, что $WG_DIR и $MESH_DIR — разные каталоги, и что расширение прав не задевает ключи.

Что проверить тестами

  • после mesh-init каталог и файл имеют ожидаемых владельца, группу и режим;
  • пользователь Control может прочитать и дописать nodes.tsv;
  • пользователь Control не может прочитать приватный ключ Hub;
  • обновление поверх установки со старыми правами приводит их к новым.

Замечание про гонку

Ни bash, ни Control не берут блокировку на nodes.tsv. Внутри Control выдача сериализована семафором процесса, но с bash-путём node-code он не согласован, а Control ещё и перезаписывает файл целиком, а не дописывает: одновременная запись из bash будет потеряна.

Пока код выдаётся из одного места, это теоретическая гонка. Но два пути к одному файлу уже существуют. Разумно ввести общую блокировку flock на nodes.tsv и использовать её с обеих сторон. Bash-сторона — ваша; если сделаете, отметьте в отчёте, чтобы Antigravity подхватил то же соглашение в Control.

Критерий приёмки

  • Control читает и дописывает nodes.tsv под своим пользователем;
  • приватные ключи WireGuard Control недоступны;
  • права выставляются во всех местах создания и чинятся при обновлении;
  • перечисленные проверки присутствуют и проходят;
  • PR, CI зелёный, PR не смержен до зелёного.

Отчёт

Раздельно: что проверено локально, что в CI со ссылками на прогоны, что не проверялось и почему.