feat(xray-proxy): добавлена проверяемая установка Xray командой install

- Зачем:
  - пользователь без root должен получать проверенный бинарник Xray 26.3.27
    одной явной командой, без риска для живого managed-экземпляра.
- Что:
  - команда install [--replace]: пин 26.3.27, маппинг x86_64/aarch64,
    скачивание urllib + проверка SHA2-256 из официального четырёхзаписного
    .dgst, staging внутри ~/.local/bin и один атомарный os.replace;
  - границы размеров (64 MiB архив/бинарник, 4 KiB .dgst, счёт limit+1,
    сверка Content-Length) и guard managed-режима через start-lock;
  - типизированная StartLockBusyError, offline-тесты реального загрузчика
    через подмену urlopen, снапшоты дерева ФС в отказных путях;
  - README/спека обновлены, включая справку о последней версии с
    allowInsecure (25.12.8, удалена в 26.2.6); тикет 04 закрыт, леджер
    дополнен итогами эксперимента.
- Проверка:
  - PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests — 79 OK.
  - bash tests/test_proxy_launchers.sh — 8 PASS.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
ddadminandClaude Fable 5 committed 2026-07-20 13:46:33 -04:00
1 parent 90cc8456cd
commit 0432c4ae8a
7 files changed
+1266 -43

No files matched your search

+18
View File
@@ -473,6 +473,24 @@ class ManagedXrayCliTest(unittest.TestCase):
profile_text,
)
def test_live_managed_instance_rejects_install_replace_without_changes(self):
profile_text = self.tcp_profile()
self.write_profile(profile_text)
process = self.start()
state_before = self.managed_state_path().read_bytes()
xray_before = self.xray.read_bytes()
result = self.run_cli("install", "--replace")
self.assertNotEqual(0, result.returncode)
self.assertIn("сначала", result.stderr)
self.assertIn("stop", result.stderr)
self.assertEqual(state_before, self.managed_state_path().read_bytes())
self.assertEqual(xray_before, self.xray.read_bytes())
self.assertFalse((self.home / ".local/bin/xray").exists())
self.assert_no_secrets(result.stdout + result.stderr, profile_text)
self.stop_and_collect(process)
def test_stale_cleanup_waits_for_start_lock_and_preserves_files(self):
state_dir = self.state_home / "xray-proxy"
state_dir.mkdir(parents=True, mode=0o700)