Skip to content

fix(preflight): allow candidate config generation with uncached subscriptions - #122

Merged
Dushnilin merged 1 commit into
Dushnilin:mainfrom
beermix:fix/preflight-candidate-uncached-subscriptions
Oct 10, 2026
Merged

Dushnilin merged 1 commit into
Dushnilin:mainfrom
beermix:fix/preflight-candidate-uncached-subscriptions

Conversation

@beermix

@beermix beermix commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

Что сделано

Устранена ошибка пре-флайт проверки (Pre-flight check failed: binary ... rejected config for <var>: exit status -1), которая возникала при установке или переключении ядер sing-box на системе с сохранённым из бэкапа конфигом или добавленными подписками, кэш которых ещё не был загружен.

Проблема

  1. После перепрошивки роутера с сохранением бэкапа (sysupgrade) или при импорте конфигурации UCI в ней уже присутствуют правила с action='connection' и URL подписок (subscription_url). Но локальный кэш /etc/tachyon/subscription-cache на новой системе ещё пуст.
  2. При установке ядра sing-box (через установщик tachyon-setup.sh или веб-интерфейс) verifier.uc запускает pre-flight валидацию через вызов:
    generator.uc generate-config candidate_cfg 127.0.0.1 0 0 ""
  3. Так как аргумент deferred_sections передавался пустым, а кэш нод отсутствовал, генератор падал с ошибкой:
    connection section has no usable outbounds
    
  4. Вывод генератора перенаправлялся в >/dev/null 2>&1, из-за чего ошибка маскировалась: cand_status оставался -1, и установщик сообщал дезинформирующую ошибку:
    Pre-flight check failed: binary ... rejected config for lx: exit status -1
    Downloaded sing-box-lx is incompatible with current configuration: exit status -1
    
  5. Возникал дэдлок: sing-box нельзя установить из-за отсутствия кэша подписок, а скачать подписки штатно через сервис нельзя, потому что sing-box не установлен.

Решение

  1. generator_outbounds.uc: во время pre-flight генерации (SB_PREFLIGHT_BINARY) правила маршрутизации без доступных аутбаундов (например, подписки без локального кэша) динамически помечаются как deferred, предотвращая сбой генератора тестового конфига.
  2. generator_routes.uc: добавлена проверка dns_detour_section на наличие в deferred_sections перед добавлением маршрутных правил для DNS detour.
  3. verifier.uc: вывод генератора теперь перенаправляется в err_file, а при падении генератора ошибка логируется как unable to generate configuration for <var>: <reason> вместо ложного утверждения о несовместимости бинарника со статусом -1.
  4. Тесты: добавлен регрессионный тест tests/sing_box_preflight_uncached_subscriptions.sh.

Проверено

  • Протестировано на устройстве с OpenWrt (UCI с секциями подписок без кэша):
    • До фикса: воспроизводится падение с connection section has no usable outbounds и ложным exit status -1.
    • После фикса: pre-flight валидация успешно генерирует кандидатную конфигурацию и возвращает { "ok": true }.
    • Проверена реакция на реальную ошибку конфигурации (невалидный action): возвращается точная причина (unsupported action ...), а не exit status -1.
  • Запущен тест tests/sing_box_preflight_uncached_subscriptions.sh — passed.

…riptions

When installing or switching sing-box variants on a system with connection sections configured with subscription URLs but no local cache yet (such as after a firmware flash with restored UCI backup), pre-flight candidate config generation failed with:
  'connection section has no usable outbounds'

Because generator output was discarded to /dev/null, cand_status was left at -1 and verifier reported a misleading failure:
  'Pre-flight check failed: binary ... rejected config for <var>: exit status -1'

1. In generator_outbounds, auto-defer connection sections with no usable outbounds during pre-flight candidate generation (SB_PREFLIGHT_BINARY).
2. In generator_routes, guard dns_detour_section when it is deferred.
3. In verifier, capture generator output in err_file and distinguish generator failure from binary rejection in updates_log.
4. Add regression test tests/sing_box_preflight_uncached_subscriptions.sh.
@beermix
beermix requested a review from Dushnilin as a code owner October 9, 2026 17:36
@Dushnilin
Dushnilin merged commit d1e26a5 into Dushnilin:main Oct 10, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants