Files
dotfiles/.scratch/headless-xray-proxy/issues/03-safe-process-lifecycle.md
T
ddadminandClaude Fable 5 98bfd6338a refactor(xray-proxy): срезана accidental-сложность CLI, тестов и спеки
- Зачем:
  - CLI и спека были переусложнены относительно принятой модели угроз
    (один пользователь, доверенная машина): лишняя ось версий Xray и
    защита от входов, которые не возникают при ручном редактировании.
- Что:
  - убрана поддержка Xray 25.12.8 — поддерживается только 26.3.27;
    allowInsecure валидируется, но никогда не эмитится в JSON.
  - удалена проверка владения сокетом через /proc/net/tcp; идентичность
    процесса и сверка адрес/порт со state сохранены.
  - валидация INI/профиля/адреса/query сведена к отказам на реальные
    опечатки; scoped IPv6 отклоняется одинаково на Python 3.8 и 3.9+.
  - удалены fsync/O_EXCL-церемония, SIGALRM-таймер, zombie-инспекция,
    мёртвый отпечаток профиля и двойной разбор extra/alpn.
  - shell.bash принимает вывод env без ре-валидации, сохранив атомарность;
    спека и issue 01–05 приведены к новому объёму (тикет 06, леджер).
- Проверка:
  - python3 -m unittest discover -s tests — 34 теста OK.
  - bash tests/test_proxy_launchers.sh — 8 проверок PASS.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 04:13:54 -04:00

37 lines
3.3 KiB
Markdown

# 03 — Безопасный жизненный цикл управляемого процесса
**What to build:** Управляемый Xray предсказуемо переживает повторные команды,
сигналы, устаревшее состояние и аварийное исчезновение супервизора, не затрагивая
чужие процессы и не оставляя секретные или временные данные.
**Blocked by:** 02 — Управляемый Xray: полный штатный путь; 06 — Упрощение.
**Status:** ready-for-agent
**Мандат идентичности:** идентичность = PID + время старта (`/proc/PID/stat`) +
исполняемый файл ребёнка / путь скрипта супервизора; текущий argv-обход заменить
этим механизмом.
- [ ] Супервизор владеет пользовательской блокировкой, допускает только один
управляемый экземпляр и не заменяет запущенный профиль другим без явных
`stop` и нового `start`.
- [ ] Состояние с правами `0600` хранит PID и время старта супервизора и Xray,
путь к бинарнику и порт, но не ссылку или её секреты; служебные каталоги имеют
права `0700`.
- [ ] `status` и `stop` сверяют PID со временем старта и ожидаемым исполняемым
файлом, поэтому чужой, устаревший и повторно использованный PID никогда не
считается управляемым процессом.
- [ ] SIGINT, SIGTERM и SIGHUP передаются дочернему Xray; штатное завершение
удаляет состояние, сгенерированный JSON и временные файлы.
- [ ] Если супервизор аварийно исчез, `stop` завершает оставшийся Xray только
после полной проверки его личности и затем безопасно очищает состояние.
- [ ] Повторный запуск, смена профиля, конфликт локального порта и несогласованный
машинный адрес завершаются понятным отказом без повреждения уже работающего
экземпляра.
- [ ] Полная VLESS-ссылка и её секреты отсутствуют в stdout, stderr, служебных
файлах и аргументах дочерних процессов; временная конфигурация существует
только внутри закрытого служебного каталога.
- [ ] Автоматические тесты покрывают блокировку, повторный запуск, сигналы,
остановку, очистку, смену профиля, конфликт порта, чужой, устаревший и
повторно использованный PID, а также исчезнувший супервизор.