Commit Graph
309 Commits
Author SHA1 Message Date
Dushnilin a27173a04a fix(singbox): prevent empty logical subrules when excluding IPs on evaluate and match-all rules (#60) 2026-09-17 14:53:12 +03:00
Dushnilin 2ab4e0db74 fix(subscription): auto fallback on unsupported app provider stubs 2026-09-17 14:39:47 +03:00
Dushnilin 5bfe7103dc fix(updates): trigger immediate telegram push on component updates and fix cron cleanup regex
Backend CI / Backend Runtime Checks (push) Failing after 2m0s
Frontend CI / Frontend Quality Checks (push) Failing after 0s
Backend CI / OpenWrt Docker E2E (push) Skipped
Differential ShellCheck / Differential ShellCheck (push) Failing after 15s
2026-09-17 13:43:51 +03:00
Dushnilin df61efce80 fix(singbox): allow routed DNS on bypass sections and hide proxy group outbounds in urltest 2026-09-17 12:35:14 +03:00
Dushnilin 0efa47abdc fix(dns): preserve 127.0.0.42 during restart and add local DNS cache support
- decouple restart() from stop_impl() in lifecycle.uc to avoid premature dnsmasq_restore
- keep dhcp.@dnsmasq[0].server locked to 127.0.0.42 throughout service restarts
- add atomic restart_service hooks in init.d/tachyon and initd.uc
- fix dns_turbo_cache path resolution to promote default cache to /etc/sing-box/cache.db
- add Local DNS Cache support in dnsmasq (dns_local_cache, dns_cache_size)
- add comprehensive behavioral regression test tests/service_restart_lifecycle.sh
2026-09-17 08:45:24 +03:00
Dushnilin 44a1777c0d fix(singbox): separate dns query and response rulesets for sing-box 1.14+ compatibility 2026-09-17 08:13:11 +03:00
Dushnilin 67761143f5 test(predicates): restore list update signature parity & update plain list validation assertions 2026-09-16 22:54:34 +03:00
Dushnilin 0f5967e51c fix(routing): scope excluded_ips to section rules, humanize section names, and add component visibility 2026-09-16 16:16:32 +03:00
Dushnilin d28af621c9 fix(ruleset): reject plain lists in ruleset references (#58) and route components to Dushnilin repos 2026-09-16 15:16:56 +03:00
Dushnilin a23c2a2a55 fix(fptn): boot recovery, reload planner, persistent selector state and telegram token flow 2026-09-16 14:54:54 +03:00
Dushnilin 3834b783cc fix(diagnostics): prevent tunnel IP pollution in WAN addresses and exempt Tailscale inbounds from public WAN warning 2026-09-16 10:07:09 +03:00
Dushnilin 76c51b92a1 feat(fuzzer): implement Probe v2, stable scoring, two-stage verification, and adaptive smart fuzzer 2026-09-16 08:34:02 +03:00
Dushnilin cd584a100f fuzzer: harden runner, fail-closed validation, job isolation and fix AI handoff 2026-09-16 08:20:17 +03:00
Dushnilin c59e90f4e1 ci: trigger backend-ci for full E2E verification 2026-09-15 22:44:07 +03:00
Dushnilin cb899a208e fix: fptn_component test env var and update calls.json
- Fix fptn_component.sh test #5: diagnostics/runtime.uc reads TACHYON_LIB (not TACHYON_LIB_DIR)
- Update locales/calls.json with FPTN UI strings from section.js
2026-09-15 21:38:25 +03:00
Dushnilin 8855179793 feat: add FPTN section action UI, config fields, dashboard status, and diagnostics
- Add FPTN to ROUTING_ACTIONS, actionProvidersAvailabilityState, isFptnInstalledForUi()
- Add FPTN action option label (FPTN) in getActionOptionLabel and getRuleActionDisplayValue
- Add FPTN to populateActionOptionValues (guarded by isFptnInstalledForUi())
- Add FPTN section config fields: access_token (required), sni, bypass_method, preferred_server
- Add fptn to ACTION_COLORS (#e74c3c)
- Add GetFptnStatus type, GET_FPTN_STATUS method, getFptnStatus() shell method
- Add fptn to dashboard: getDashboardSections, renderSections, getServiceStatus handler
- Add get_fptn_status CLI dispatch and get-fptn-status handler in diagnostics/runtime.uc
- Add FPTN unit test in getDashboardSections.test.ts
- Update translation calls index (locales/calls.json)
2026-09-15 21:25:54 +03:00
Dushnilin 6978601d4d fix: resolve Discord Cloudflare voice ports #55, smart detect proxy sections #56, and UI enhancements 2026-09-15 19:15:57 +03:00
Dushnilin 73cdde17bb feat(fptn): integrate FPTN client component and runtime provider 2026-09-15 14:57:05 +03:00
Dushnilin aba424426b fix(ci): update calls.json index and fix non-root permission in route_router_traffic test 2026-09-15 09:34:17 +03:00
Dushnilin 2d00141696 feat(routing): route router's own traffic through designated section 2026-09-15 09:30:04 +03:00
Dushnilin d6d39dac81 perf(ui,watchdog): adaptive UI polling and zero-UCI cached settings context
- Feat(ui): implement adaptive polling in runtimeUiState service (1s -> 2s during active tasks, 10s idle)
- Perf(controller): cache settings snapshot in current_tick_ctx across all probe setting() calls to eliminate repeated uci_core.get_all()
- Perf(controller): reuse ctx.proxy_port in probe_proxy to eliminate duplicate proxy_port() evaluation
- Perf(watchdog): guard adaptive_normal_interval behind 120s check and clear tick context at tick boundary
- Test: add static and behavioral assertions in tests/watchdog_adaptive_intervals.sh
2026-09-15 08:37:43 +03:00
Dushnilin 1c7feb4aac release: 1.3.27 — Runtime performance, watchdog adaptive probes & mixed proxy DNS fix
- Perf(watchdog): Adaptive external health checks for proxy (30s) and DNS (60s)
  * Honor UCI ai_proxy_health_interval and ai_dns_interval while healthy
  * Adapt to fast retry (10-15s) upon consecutive failures, instant post-heal reset
  * Single shared observation context (tick_context) per tick eliminating redundant pgrep/proc scans
  * Throttle watchdog keepalive file writes from 5s to 30s
- Perf(ui): Read-only fast path for get_ui_state
  * Decouple refresh_action_dirs() filesystem GC from 500ms polling requests
  * Throttle action directory cleanup to once per 30s via /var/run stamp
  * Trigger immediate GC sweep on action job completion
- Perf(telegram): Long-poll 50s and eliminate redundant sleep after success
  * Increase getUpdates long-poll timeout to 50s (curl timeout 65s)
  * Remove redundant sleep after successful poll for instant command responsiveness
- Perf(torrserver): Cache detected PID and replace shell sleep with native ucode sleep(60000)
- Fix(singbox): Remove harmful hijack-dns rules from mixed proxy inbounds
  * Eliminate hijack-dns (port 53 / protocol dns) from section, direct bypass and service mixed proxies
  * Resolve 4-5s curl timeouts on component updates (api.github.com) and slow LAN DNS resolution
  * Maintain ip_is_private: true direct LAN routing bypass
- Test: Add tests/watchdog_adaptive_intervals.sh and update tests/sing_box_runtime.sh
- Version: Bump fe-app-tachyon to 1.3.27
2026-09-15 08:20:35 +03:00
Dushnilin bc0928c277 fix(updates,migration): skip sing-box reload when config unchanged (#54) and guard test service restart 2026-09-15 06:35:35 +03:00
Dushnilin 79710e84a8 fix(tests): prevent SIGPIPE failures under pipefail in content_blocking.sh
Replace brittle grep | head pipelines with assert_contains and direct grep flags to prevent pipefail SIGPIPE exit code 141 in OpenWrt container test runs.
2026-09-14 23:14:34 +03:00
Dushnilin 603c0df91b feat(security,ci,ui): harden CI/CD, LuCI ACL, low-space updates and mobile layout
- ci: make frontend CI read-only with strict diff check and deterministic calls.json
- ci: pin external GitHub Actions in workflows to immutable commit SHAs
- ci: add openwrt-e2e blocking gate job running docker_e2e_test.sh
- fix(diagnostic): fix contstants.ts typo and update all 13 import sites
- fix(acl): remove unused /bin/busybox exec from rpcd ACL and add regression test
- feat(updates): add low-space update fallback when creating sing-box.old is impossible
- fix(routes): preserve dedicated Discord gateway subnets (162.159.128.0/21)
- feat(ui): implement responsive auto-fit grid and mobile modal viewport bounds
- test: add viewport regression test suite in vitest
2026-09-14 23:00:18 +03:00
Dushnilin 7375e26b44 fix(qos): harmonize SQM and CAKE cooperation, resolve bufferbloat degradation 2026-09-14 17:03:45 +03:00
Dushnilin 24c11bbca8 feat(rulesets): add Twitch preset and resilient CDN fallback 2026-09-14 14:46:28 +03:00
Dushnilin 850f1544fe fix(dashboard,lists): restore subscription prefix badges and fix list routing failure 2026-09-14 13:57:00 +03:00
Dushnilin ea0de78cca fix(tracer): resolve discord community cidr filter (#50) and improve leak check display 2026-09-14 06:27:31 +03:00
Dushnilin 959bcb59f5 fix(fuzzer): resolve zapret2 lua library and blob candidate paths, capture daemon output 2026-09-13 21:18:21 +03:00
Dushnilin 59d56c8055 test(ci): guard sing-box validation in community_subnets_sanitization against missing binary 2026-09-13 20:57:34 +03:00
Dushnilin 22ec19b49b fix(watchdog): eliminate WAN false alarms on bridge/Tailscale and restore domain/subnet lists (.lst/.txt) 2026-09-13 20:47:22 +03:00
Dushnilin 4cbf32ee3f fix: resolve server inbound DNS & routing, strategy fuzzer UI sync, and sing-box-extended latency 2026-09-13 16:43:51 +03:00
Dushnilin 4b7faf18a8 fix(discord): restore voice UDP routing on Cloudflare Anycast while isolating web traffic
- Preserve raw Cloudflare subnets in community-subnets-discord.lst in updates.uc instead of destructive deletion.
- In singbox/generator_routes.uc:
  * Exclude Cloudflare Anycast CIDRs from general IP route rules (preventing web hijacking).
  * Generate a dedicated Discord Voice route rule for Cloudflare subnets scoped to network: 'udp' and voice port ranges (50000-65535, 3478, 19302, 5000-5020).
  * Provide DEFAULT_DISCORD_VOICE_SUBNETS fallback in core/ip.uc.
- In nft/apply.uc:
  * Route Cloudflare subnets to ip_ports set with Discord voice ports (5000-5020, 3478, 19302, 50000-65535).
  * Automatically enable ip_port rules when section has community_subnets for Discord.
- In section.js (Routing Rule Tracer):
  * Filter out Cloudflare subnets when resolving domain web traffic to Discord community subnets.
  * Accurately display voice UDP routing notice for Anycast ranges.
- Update tests/community_subnets_sanitization.sh with voice UDP and sing-box validation.
2026-09-13 11:06:28 +03:00
Dushnilin 169e7f497d fix: restore mixed proxy DNS/LAN routing and eliminate service restart log flood
Fixes regression from 1.3.25 where section mixed proxy inbounds lost internet access due to missing DNS hijacking and missing private IP bypass, and suppresses noisy log warnings during service restart/update.
2026-09-12 21:51:05 +03:00
Dushnilin 040b1291c6 fix(parental): resolve quota increase unblocking and preserve domain rules
- Unblock devices when admin increases daily_quota_minutes in parental_quota.uc
- Unblock devices removed from active quota schedules and flush sets on disable
- Ignore target != 'all' schedules in parental_quota.uc screen-time dropper
- Do not suppress domain DNS reject or nft redirect rules when quota is set
- Run parental_quota.uc tick on service start and reload for instant sync
- Add target:all dependency to daily_quota_minutes in LuCI parental view
- Add tests in content_blocking.sh and parental_control.sh
2026-09-12 21:31:03 +03:00
Dushnilin e834971919 fix(singbox): prioritize proxy outbounds for ip.podkop.fyi check and failover regardless of DPI section order 2026-09-12 20:53:47 +03:00
Dushnilin 1697f34a8b fix(singbox,cron,failover): resolve action DNS priority, parental cron error and runaway dig probes 2026-09-12 19:33:26 +03:00
Dushnilin fadfbc2511 fix(parental): resolve daily quota from profile in nft/singbox rules and harden cron tick invocation 2026-09-12 18:52:46 +03:00
Dushnilin 12b07fd2fb fix(section): preserve user-defined subscription order in UCI and backend 2026-09-12 17:38:07 +03:00
Dushnilin 2019ddd12a release: 1.3.26 — Watchdog proxy restart protection, WAN monitor debounce, and subscription bootstrap resilience
- Fix #52: Watchdog proxy restart on single URL failure:
  * Validate failure against secondary independent probe URL before declaring proxy down
  * Skip restart when direct WAN is also degraded or down (!direct_ok)
  * Implement 120s cooldown between automated proxy restarts
  * Fix Telegram notification to accurately state 'Перезапуск sing-box' instead of 'Перезапуск роутера'
- Fix #51: Telegram bot spamming WAN up/down notifications:
  * Filter hotplug events strictly by badwan_monitored_interfaces (defaults to wan)
  * Add atomic directory lock with debounce delay and real ubus state query
  * Prevent repeated notifications when interface state has not transitioned
- Feat: 2-VPN deadlock elimination & self-download subscription proxy:
  * Isolate unbootstrapped dependent subscription sections on initial boot (deferred_sections)
  * Allow self-download proxy target for subscriptions with explicit UI hint '(текущее правило при активности)'
  * Enable automatic local proxy fallback for subscription refresh when direct WAN download fails while sing-box is active
  * Add regression test in tests/subscription_bootstrap_deadlock.sh
- Fix: Parental control quota enforcement:
  * Correct route rule filtering when daily quota minutes are exhausted without a fixed time interval
- i18n & Version bump:
  * Bump fe-app-tachyon to 1.3.26 and update Russian PO/POT translations
2026-09-12 16:50:04 +03:00
Dushnilin f987e88d23 fix(wan_monitor,dns): eliminate invalid regex group in resolve_domain and harden wan monitor locking
- Replace invalid POSIX non-capturing group in diagnostics/runtime.uc with standard POSIX ERE pattern.
- Harden 99-tachyon-wan-monitor with stale PID directory lock cleanup and dynamic badwan_reload_delay support.
- Make is_cloudflare_shared_cidr in core/ip.uc case-insensitive.
- Add default wan to badwan_monitored_interfaces in settings.js.
2026-09-11 23:16:22 +03:00
Dushnilin 0ea1c73832 fix: sanitize Discord community subnets and resolve WAN monitor hotplug spam (fixes #50, #51)
- Fix #50: Discord community subnets hijacking Cloudflare Anycast traffic:
  * Filter broad Cloudflare shared subnets (104.16.0.0/12, 172.64.0.0/13, etc.) for Discord preset in generator_routes.uc, nft/apply.uc, and updates.uc.
  * Add tachyon resolve_domain CLI and runtime.uc helper for DNS queries with rpcd ACL support.
  * Update LuCI Routing Rule Tracer to resolve queried domains against section subnets/CIDRs (including community subnets) and show shared CDN/Anycast warnings.
  * Add unit tests in tests/community_subnets_sanitization.sh.

- Fix #51: Telegram bot spamming WAN up/down notifications on hotplug:
  * Check enable_badwan_interface_monitoring, telegram.enabled, and badwan_monitored_interfaces list in 99-tachyon-wan-monitor.
  * Add background debounce with atomic directory locking and ubus interface status verification.
  * Implement state transition tracking to only notify on actual UP->DOWN and DOWN->UP changes without duplicates.
  * Preserve retry_start_on_wan_up behavior on ifup.
  * Add comprehensive integration test suite in tests/wan_monitor_hotplug.sh.
2026-09-11 23:07:10 +03:00
Dushnilin 5933fd2f0c fix: parental control global network block, luci save&apply reload, and fuzzer localization 2026-09-11 22:35:59 +03:00
Dushnilin 94708d8251 fix: resolve MAC routing crash in sing-box, fallback dashboard on secondary nodes, and unify dashboard naming 2026-09-11 20:34:18 +03:00
Dushnilin 26431f50d3 feat: per-section MAC/DNS exclusions, boot latency sweep, WDTT/OlcRTC providers, DNS hijack socket collision fix
Features:
- Per-Section MAC Exclusions: nft, generator_routes, section.js, i18n
- Per-Section Routed DNS: connections, generator_routes, nft, validator,
  types.ts, section.js, state.uc, reload.uc
- Boot Latency Sweep: ui.uc latency boot sweep with fixture dispatchers
- WDTT provider: full backend (common, validator, runtime), sing-box
  outbound, diagnostics, component install, updater, i18n, section.js UI
- OlcRTC provider: full backend (common, validator, runtime), sing-box
  outbound, diagnostics, component install, updater, i18n, section.js UI
- WireGuard-over-TURN tunnel (WDTT) and TCP-over-WebRTC tunnel (OlcRTC)
  as sidecar processes with local SOCKS5, routed through sing-box outbound

Bug fixes:
- route.uc: restrict hijack-dns to local DNS inbounds only (dns-in,
  source-dns-in, dns-health-*) — fixes socket collision between sing-box
  and dnsmasq on port 53 via SO_REUSEADDR transparent write-back sockets
- runtime.uc: add Port 53 socket collision diagnostic with auto-fix
  (sing-box restart to clear parasitic UNCONN sockets with Recv-Q)
- runtime.uc: add dnsmasq dns_redirect check with auto-fix — disables
  firewall4 DNAT that causes TProxy to rewrite destination to router :53
- failover.uc: add wdtt/olcrtc to failover candidate actions
- telegram.uc: show WDTT/OlcRTC installed status in /info

Tests: 135/155 shell + 591/591 frontend
2026-09-11 18:04:03 +03:00
Dushnilin 2cfb81f680 release: 1.3.25 - fix sing-box 1.14+ http_clients detour schema and prevent startup crash 2026-09-10 21:47:02 +03:00
Dushnilin 37c44a8bdc fix(singbox): correct http_clients detour field and clarify RKN domain list label
- fix(singbox): fix http_clients[0].detour field name (was incorrectly dial_detour, causing fatal decode config unknown field error on sing-box 1.14+)
- fix(ui): rename community list 'Block' to 'Block (RKN)' / 'Реестр РКН' in DOMAIN_LIST_OPTIONS and PO catalogs to prevent confusion with parental control action 'Блокировать'
- fix(ui): fix domain hint for adult content to pornhub.com in section.js
- test(ruleset): update http_clients detour check in ruleset_download_detour.sh
2026-09-10 21:26:48 +03:00
Dushnilin bc4f12913f fix(providers): resolve zapret2 startup crash, nft desync EPERM, and mieru ruleset crash loop
- fix(zapret2): add safe_str fallback and avoid default --filter-tcp=443 injection on UDP rules in prepare_strategy_args()
- fix(providers): make individual rule failures non-fatal in start_runtime() so one bad rule does not rollback all running rules
- fix(binaries): dynamic candidate resolution for nfqws and nfqws2 across standard OpenWrt and custom paths (/opt/zapret2/nfq2, /opt/zapret2/nfq, /opt/zapret2, /usr/bin)
- fix(nft): add raw_output notrack chain and mangle_output/forward counter return rules for desync marks (0x40000000, 0x20000000) and musl/nobody skuid (2147483647, 65534) to prevent EPERM rawsend failure on reload
- fix(reload): ensure nft_rebuild is triggered on zapret and zapret2 runtime updates
- fix(singbox): reject mieru outbounds from rule_set download_detour and http_clients dial_detour to prevent fatal startup crash loop
- fix(singbox): detect sing-box 1.14+ and omit deprecated download_detour on remote rule-sets when http_clients is active
- fix(action): pre-seed /etc/config/zapret2 with enabled=0 via core.uci before package install to prevent conflicting upstream daemon startup
- test(ruleset): add verification tests for mieru download_detour and dial_detour rejection
2026-09-10 20:18:00 +03:00
Dushnilin 240a939bbe fix(routing): resolve real IP for zapret routes, add IPv6 sniffing, and fix monitoring route display 2026-09-10 11:02:51 +03:00