Commit Graph
100 Commits
Author SHA1 Message Date
Dushnilin a32ad76285 telegram: fix regex injection, state race, and oversized callback_data (BUG7/8, BUG9, BUG13)
- BUG7/8 CRITICAL: view_test_rule() used escape_html() as regex escape,
  allowing user input injection. Now uses plain string suffix matching.
- BUG9 HIGH: set_tg_state(chat_id, null) ran BEFORE action execution,
  so if the action threw an exception the user lost their state context.
  Now state is cleared only after successful UCI commit in each branch.
  sec_create with invalid name preserves state for retry.
- BUG13 LOW: /set_arr_del and /sec_del_it callback_data could exceed
  Telegram's 64-byte limit with long domain names. Added cb_data()
  helper that truncates and appends a hash when over limit.
2026-08-05 11:45:01 +03:00
Dushnilin bddd0a972b fix: 10 bugs in Telegram bot
- CRITICAL: /dns_apply substr offset 12→11 was always applying preset 0
- CRITICAL: /test_rule IP CIDR match now checks subnet, not just format
- HIGH: check_notified_updates now iterates data.results (was iterating
  top-level object keys, so update notifications were completely broken)
- HIGH: exec_support_bundle cleanup now deletes /etc/.tachyon/ paths
  (was deleting /tmp/ paths that didn't exist)
- HIGH: command_status() now uses command_from_args() for ai_heal,
  watchdog_start, watchdog_stop (was passing raw strings)
- HIGH: set_tg_state fs.unlink now wrapped in try/catch
- MEDIUM: close_connections now reports error when curl fails
- MEDIUM: view_connections validates page >= 0
- LOW: /noop callback now silently ignored instead of falling through
- LOW: > command HTML output now uses <code> instead of backticks
2026-08-05 11:38:14 +03:00
Dushnilin a21a818ea5 fix: dns_hosts predefined rules now fall after FakeIP/section DNS rules; fix parse_text_domains for // comments
- dns_hosts and hosts cache predefined DNS rules are now appended AFTER
  section-level FakeIP routing rules, preventing third-party hosts entries
  (e.g. from Unlock AI projects) from short-circuiting FakeIP for domains
  already routed through proxy via section rules
- parse_text_domains now properly handles // comments and multi-domain
  comma-separated lines from option domain
2026-08-05 10:37:21 +03:00
Dushnilin 7b6f607257 installer: don't fail when apk reports non-critical errors
- Capture apk output to log file instead of /dev/null
- Show last 5 lines of apk output on screen when installation fails
- Fix package name parsing to strip version (tachyon_1.2.58 -> tachyon)
- Continue installation if package is actually installed despite apk errors
- Apply same resilience to backend, luci-app, and i18n packages
2026-08-05 08:18:18 +03:00
Dushnilin 4d4bdb16d0 fix: watchdog rpcd FD leak heal + updates show outdated_same_release
- watchdog: add ai_heal_rpcd() - monitors rpcd file descriptor count,
  restarts rpcd when FD count exceeds 512 (threshold of 1024 limit).
  Prevents LuCI from showing all services as 'stopped' due to FD exhaustion
  when rpcd can no longer fork to execute /usr/bin/tachyon commands.
  Runs on every watchdog health audit cycle (~15s).

- watchdog: move safe_reload_firewall() definition before ai_heal_nftables()
  and ai_heal_qos() to fix 'left-hand side is not a function' error.
  ucode does not hoist function declarations.

- updates: show Update button for outdated_same_release status (same version
  number but different commit SHA). Previously the button was hidden when
  current_version == latest_version even if SHAs differed.
2026-08-04 22:57:39 +03:00
Dushnilin 7b8114bef1 fix: незаустановленные компоненты (zapret/byedpi/zapret2) не возвращают ошибку при check_update
- action.uc: для zapret, zapret2 и byedpi при check_update,
  если компонент не установлен, возвращаем success:true со статусом '' вместо action_fail,
  предотвращая красные toast-уведомления в LuCI
2026-08-04 21:12:01 +03:00
Dushnilin 9815198585 fix: исправлена команда /check_updates в Telegram боте
- exec_check_updates в telegram.uc: исправлен парсинг JSON ответа component_update_check_cache
  (формат { enabled, results: [] } вместо словаря по имени компонента)
- исправлено поле installed_version -> current_version
- добавлена обработка случая disabled/пустой кэш/ошибка success
- добавлено отображение zapret2 и других компонентов
2026-08-04 21:03:24 +03:00
Dushnilin 888a9633d4 fix: исправление синтаксических ошибок повторного объявления переменных в watchdog.uc 2026-08-04 20:54:40 +03:00
Dushnilin 9551c18d8c fix: устранение ложноположительных срабатываний OOM в watchdog
- watchdog.uc: добавлен фильтр сообщений OOM (учитывает только системный OOM killer и аварийное завершение sing-box, исключает сетевые предупреждения буферов типа nlbwmon),
  игнорирование устаревшего буфера логов при старте подписки logread -f,
  инициализация переменных last_oom_time и syslog_start_time
2026-08-04 19:22:55 +03:00
Dushnilin 1b6cda9c8d fix: исправление подвисания Telegram бота и ошибок AI Watchdog
- telegram.uc: добавлены таймауты --max-time 35 и --connect-timeout 10 для всех запросов curl,
  ограничение длины сообщений до 3900 символов (предотвращение 400 Bad Request от Telegram API),
  безопасная обработка callback_query в try...catch с гарантированным вызовом answerCallbackQuery,
  защита основного цикла worker от падений при сбоях сети
- api.uc: добавлены таймауты --max-time и --connect-timeout для всех curl вызовов,
  устраняющие зависание подпроцессов при опросе Clash API и проверках соединения через прокси
- watchdog.uc: добавлена функция safe_reload_firewall, устранившая ошибки
  'left-hand side is not a function' в процессах ai_heal_nftables и ai_heal_qos
2026-08-04 19:03:01 +03:00
Dushnilin ff627cfb52 fix: FD-cascade при reinstall + SHA версии в UI + тип outdated_same_release
- action.uc: killall logread перед restart_tachyon_after_successful_change,
  предотвращает FD-каскад при reinstall/update (orphan logread pipe FD)
- action.uc: current_sha/latest_sha в ответе check_update для Tachyon
- updates.uc: SHA пробрасывается через кэш проверки обновлений
- fe/types.ts: outdated_same_release добавлен в union статусов,
  поля current_sha/latest_sha в ComponentActionResult,
  AI Watchdog поля в ConfigSection (pre-existing TS2339 fix)
- fe/store.service.ts: outdated_same_release и SHA в состоянии updatesChecks
- fe/initController.ts: рендер SHA hash-badge для outdated_same_release,
  setCheckResult принимает SHA, applyCachedCheckResults/handleCheckResult обновлены
- fe/styles.ts: .sha-info — monospace badge для отображения коммит-хешей
2026-08-04 16:03:07 +03:00
Dushnilin b7d05034c8 исправление: утечки ФД и временных файлов, переполнение ОЗУ
Проблема с FD-каскадом (зависание sing-box):
watchdog.uc открывал logread -f через popen() без O_CLOEXEC. Каждый
фоновый system('... &') порождал дочерний процесс, наследующий read-end
logread pipe. После kill watchdog — дочерний процесс держал pipe, logread
не получал SIGPIPE и оставался живым. За N перезапусков накапливалось
N orphan-процессов logread → исчерпание лимита 1024 FD → генератор
конфига sing-box не мог открыть .uc файлы → sing-box не стартовал.

Исправления FD-утечки:
- watchdog.uc: добавлена переменная logread_pipe_fd + помощник bg_system(),
  который закрывает FD logread перед запуском фоновых процессов
- watchdog.uc: killall logread перед открытием нового logread -f в
  setup_syslog_listener() для очистки orphan-процессов от предыдущих экземпляров
- watchdog.uc: все 7 вызовов system('... &') переведены на bg_system():
  restart, reload_firewall (x3), WAN ifdown/ifup, subscription_update_async (x3)
- initd.uc: killall logread в stop_service() после остановки tachyon
- nft/apply.uc: добавлены </dev/null >/dev/null 2>&1 к голому reload_firewall &
- updates.uc: добавлены редиректы к tachyon reload &
- telegram.uc: добавлен </dev/null к reload_firewall &

Проблема с утечкой временных файлов (500MB в /tmp):
При каждом tachyon restart (SIGKILL) процессы-генераторы умирали на
полуслове, оставляя /tmp/tmp.* файлы (sing-box config JSON ~3.4MB,
reload state). За 8 дней накопилось 227 файлов = 506MB в tmpfs,
что занимало 25% всего ОЗУ (519MB из 2007MB shared).

Исправления утечки временных файлов:
- temp_path() в runtime.uc и updates.uc теперь создаёт /tmp/tachyon-XXXXXX
  вместо /tmp/tmp.XXXXXX (безопасный для очистки префикс)
- nft/apply.uc и lifecycle.uc: аналогичное изменение mktemp
- lifecycle.uc start_impl(): автоматическая очистка /tmp/tachyon-* файлов
  старше 30 минут при каждом старте сервиса

Результат на роутере 192.168.2.1:
  logread после stop  = 0 (было 1+)
  logread после start = 1 (было 2+ в каскаде)
  sing-box = запущен
  /tmp shared         = 27MB (было 519MB, освобождено ~490MB)
  ОЗУ available       = 1691MB (было 1195MB)
2026-08-04 15:36:37 +03:00
Dushnilin a3de505a9a chore: switch zapret2 repo to Dushnilin/zapret2-openwrt 2026-08-04 14:04:29 +03:00
Dushnilin 2c31a62e4d fix: same-release SHA prefix compare + sing-box generator error detail
- action.uc: compare release target_commitish (full 40-char SHA) with
  installed short SHA by prefix instead of exact match; fixes false
  'same release update found' when commit is actually the same
- runtime.uc: generator_failure_reason now returns the first error line
  instead of the ucode 'Near here ---^' position marker, and logs full
  generator output at debug level on failure for better diagnostics
2026-08-04 11:31:51 +03:00
Dushnilin ea40ce1e93 fix: upgrade postcss 8.5.20 → 8.5.23 (GHSA-6g55-p6wh-862q)
Arbitrary .map file read via untrusted sourceMappingURL when from is
unset. Added npm overrides to force postcss@8.5.23 across all transitive
deps (tsup, vitest→vite).
2026-08-04 09:12:20 +03:00
Dushnilin 56480443b4 feat: dynamic sing-box repo links + expanded README
- runtime.uc: add sing_box_repo_url to build_system_info() based on
  installed variant (extended→shtorm-7, lx→Leadaxe, stable→SagerNet)
- main.js: use systemInfo.sing_box_repo_url instead of hardcoded URL
- README.md / README.en.md: expanded Watchdog section with all 14 fixes,
  atomic operations, restart protection, data correctness, Telegram
  rate limits, firewall improvements, dynamic repo links, commit-level
  update tracking
2026-08-03 21:52:49 +03:00
Dushnilin 22a236e5d1 feat: commit-level version tracking for same-release updates
Backend:
- constants.uc: add TACHYON_COMMIT_SHA constant (placeholder __COMPILED_COMMIT_SHA__)
- build.sh: capture git rev-parse HEAD and sed-replace commit SHA placeholder
- Makefile: same commit SHA sed replacement for OpenWrt builds
- action.uc: modify check_tachyon() to compare installed commit SHA with
  target_commitish from GitHub release, new status 'outdated_same_release'
- action.uc: reuse release_json for both version and commit SHA extraction
- updater.uc: add release_commit_sha helper to extract target_commitish
- updates.uc: extend cacheable status to include outdated_same_release

Frontend:
- main.js: handle outdated_same_release status in renderComponentCard
- main.js: include outdated_same_release in shouldShowInstallAfterCheck
- main.js: include outdated_same_release in applyCachedCheckResults

i18n:
- Add 'Update is available for current release' and 'Update is available
  for current release:' to .pot and .ru.po files

78 tests pass.
2026-08-03 21:35:06 +03:00
Dushnilin e67cd066b2 feat(i18n): Russian translations for Remote Hosts Lists settings
- Remote Hosts Lists → Удалённые списки хостов
- Auto-update Hosts Lists → Автообновление списков хостов
- Hosts Lists Update Interval → Интервал обновления списков хостов
- Description strings translated
2026-08-03 20:43:09 +03:00
Dushnilin a1c6cdd86a fix: migration.uc uses warn() not log_message() (undefined function) 2026-08-03 20:14:10 +03:00
Dushnilin 2d13e295b8 chore: gitignore tmp test artifacts 2026-08-03 20:07:10 +03:00
Dushnilin 6c7ceb0873 chore: remove test artifacts from tracking 2026-08-03 20:06:42 +03:00
Dushnilin a3f877c960 fix: file handle safety, orphan cleanup, error logging edge cases
generator.uc: try/catch around hosts cache file read with guaranteed close
hosts.uc: try/catch around parse_hosts_file with guaranteed close
migration.uc: try/catch around remove_cache_path, checked unlink in remove_legacy
runtime.uc: cleanup stale temp config files on init_config startup
lifecycle.uc: log warning on nft table delete failure in stop_main
2026-08-03 20:06:18 +03:00
Dushnilin 4e12681179 fix: migration error handling + updates retry mechanism
migration.uc:
- try/catch around migration.run() with error logging
- try/catch around apply_operations() with error logging
- Error checking for UCI cursor operations in apply_operations
- Checked fs.writefile return values in ensure_runtime_cache_format

updates.uc:
- Write pending marker on lock acquisition failure for next retry
2026-08-03 20:01:09 +03:00
Dushnilin 5f5031e4db fix: watchdog remaining bugs + atomic writes across 6 files
watchdog.uc:
- H-8: keepalive timestamp for init.d supervision
- H-14: save config backup after successful start
- M-1: empty_sections check domain/domain_suffix/ip_cidr
- M-2: dns_loop re-enable cooldown (5 min)
- M-11: reload_firewall always dedup
- M-12: merge wan+gateway heal into one function
- M-13: telegram rate limit (max 10 per 5 min)

nft/apply.uc: background reload_firewall to avoid blocking
subscription/cache.uc: write_text → write_text_if_changed (atomic)
dns_prefetch.uc: blocking sleep 10 → poll with early exit
diagnostics/runtime.uc: atomic uci_backup_save/restore, atomic scale writes, nslookup -port fix
wan-monitor: rate limit notifications (60s cooldown)
2026-08-03 19:54:50 +03:00
Dushnilin c7febcb0dc fix: atomic writes, crash safety, deadlock prevention across 10 files
watchdog.uc:
- H-4: ai_heal_uci_config atomic write (tmp → rename)
- H-5: backup validation via uci valid before restart
- H-6: proxy restart cooldown (max 3 per 10 min)
- H-7: restart lock file prevents parallel restarts
- H-13: ai_heal_wan_interface reads 'network' not 'tachyon' config
- M-3: nslookup -port=53 → plain nslookup (BusyBox compat)

generator.uc: atomic_write_json_file for main config output
hosts.uc: atomic cache write (tmp + mv), TOCTOU double stat fix
telegram.uc: atomic config restore, persistent /etc/.tachyon/ paths
migration.uc: UCI commit before cache removal
updates.uc: background reload inside locked section (deadlock prevention)
lifecycle.uc: uci commit return check, watchdog/telegram failure logging
package.uc: postinst_restore returns actual start result
build.sh/install.sh: Wave 1 backup/restore fixes
2026-08-03 19:43:10 +03:00
Dushnilin 0a428083af fix: watchdog/state/telegram crash bugs (ucode JS-isms + SIGHUP race)
- watchdog: fix 'left-hand side is not a function' tick crashes
  - safe_call: replace String(e)/instanceof Error with as_string(e)
  - ai_heal_empty_sections: list_option/read_json_file -> common.*
  - read_dns_recovery_state/ai_heal_dns_loop: read_json_file -> common.*
  - common.is_connections_action -> connections.is_connections_action
    (add missing 'config.connections' module import)
  - wrap check_singbox_process/check_auto_resume_pause/ai_full_health_audit
    in safe_call to prevent uncaught exceptions in tick loop
- state: SIGHUP race condition: fall back to sing-box start instead of
  exit(1) when process dies between config generation and signal delivery
- telegram: fix String(e)/instanceof Error crash in update catch block
2026-08-03 16:50:08 +03:00
Dushnilin 2965277877 feat: custom hosts lists — remote URL download, dnsmasq addn-hosts, sing-box DNS rules, LuCI UI 2026-08-03 16:05:53 +03:00
Dushnilin 51f9f1e43e installer: fix shellcheck SC1072 in tui_progress 2026-08-03 15:17:49 +03:00
Dushnilin 0cbbf3bd15 installer: fix TUI colors on OpenWrt busybox, clean output 2026-08-03 15:13:26 +03:00
Dushnilin 7a10fc9486 installer: inline TUI, remove tools dir, remove installer_tui.sh 2026-08-03 14:55:02 +03:00
Dushnilin e371f7a52e installer: TUI without ASCII logo 2026-08-03 14:48:04 +03:00
Dushnilin 280aa2bfac fix(install): tolerate apk non-critical errors when package is actually installed
On some OpenWrt builds (e.g., FriendlyWRT with ip-full conflict), apk
reports '1 error' even though the package installed successfully
(pre/post scripts ran). The install script now checks if the package
is actually installed after apk returns non-zero, and continues if so.
2026-08-03 14:22:20 +03:00
Dushnilin 5eef78b877 fix: DNS петля + watchdog автоисправление + централизация file_is_usable
Ключевые изменения:

1. core/helpers.uc: file_is_usable(path, min_bytes) + file_size_value(path)
   для единообразной проверки файлов (минимальный размер порог).

2. singbox/dns.uc: WAN fallback DNS серверы (fallback_wan_main) теперь
   используют прямой UDP без detour — исправлена петля когда
   DNS шёл через мёртвую прокси-секцию.
   Health probes для ВСЕХ DNS серверов (включая DoH) идут direct —
   failover может определить доступность DNS серверов.

3. watchdog.uc: ai_heal_empty_sections() — автообнаружение пустых
   proxy-секций с подписками → запуск subscription_update_async.
   ai_heal_dns_loop() — при обнаружении DNS-петли (dead proxy +
   dead DNS) → временно отключает DNS detour → загружает подписку →
   восстанавливает настройки.

4. Единая file_is_usable: nft/apply.uc, generator_routes.uc,
   components/{updates,action}.uc, config/validator.uc,
   subscription/cache.uc — все используют helpers.file_is_usable.

5. Тест tests/file_usable.sh для проверки helpers CLI.

6. Исправлен components_updater_job.sh mock lib — добавлен core/helpers.uc
2026-08-03 14:07:57 +03:00
Dushnilin 9b956e1bb4 fix(singbox+nft): skip broken local .srs/.lst rulesets and raise size guards
- generator_routes.uc: ensure_custom_ruleset() returns null and local
  file references with size <100 bytes are skipped (previously would
  silently reference a nonexistent/broken path, leaving sing-box with
  no domain matchers)
- generator_routes.uc: ruleset/rule_sets_with_subnets loops guard
  against null ensured result before accessing .tag/.kind
- nft/apply.uc: community-subnets .lst files with size <50 bytes are
  skipped before handing data to nftables
2026-08-03 09:37:37 +03:00
Dushnilin f98819b1e9 fix(singbox): guard against broken/truncated .srs rulesets (min 100 bytes)
Tiny or zero-byte .srs files can appear after interrupted downloads or
failed remote fetches. If such a file is picked as a local ruleset, the
section silently loses its domain matchers. Raise the size threshold to
100 bytes so damaged snapshots fall back to the remote rule_set URL.
2026-08-02 21:49:07 +03:00
Dushnilin 1e1f19d7b4 telegram bot: 12 новых фич + updates panel: кнопки GitHub репозиториев 2026-08-02 10:41:04 +03:00
Dushnilin a7bbd746db fix: 6 telegram/watchdog bugs found in code audit 2026-08-02 09:38:32 +03:00
Dushnilin 98cad5eb17 fix: telegram bot callback_query offset never saved (infinite loop) 2026-08-01 22:58:45 +03:00
Dushnilin 336db69429 fix: convert dns_hosts from list to option format in UCI 2026-08-01 22:41:05 +03:00
Dushnilin 7345515902 fix(po2lmo): исправлена хеш-функция sfh_hash в po2lmo.js 2026-08-01 18:43:22 +03:00
Dushnilin 1c535dd1b9 fix: исправлены переводы описаний AI Watchdog в LuCI settings.js 2026-08-01 17:11:23 +03:00
Dushnilin 0a3ef0dff2 feat: AI Watchdog — 11 новых фич с полной настройкой из LuCI 2026-08-01 14:41:59 +03:00
Dushnilin c1e6b6363e fix(watchdog): fix ai_heal_wan_interface false positive on PPPoE — check pppoe-wan instead of eth0, add cooldowns 2026-08-01 11:03:14 +03:00
Dushnilin 3752439895 Tachyon Doctor: новые проверки, авто-фиксы, расширенный AI Doctor 2026-08-01 09:24:44 +03:00
Dushnilin 55d52ee713 docs: rewrite SECURITY.md in English, fix pronouns in READMEs 2026-07-31 21:52:00 +03:00
Dushnilin 207f77954a fix: auto-switch DNS servers on protocol change in settings and per-rule 2026-07-31 20:05:33 +03:00
Dushnilin 6061c92571 fix: read dns_type from DOM select instead of UCI for dynamic DNS server filtering 2026-07-31 19:01:07 +03:00
Dushnilin bc04794b73 feat: DoQ в UI + динамическая фильтрация DNS серверов по протоколу (UDP/DoT/DoH/DoQ) 2026-07-31 18:41:58 +03:00
Dushnilin ac1ff6bbb7 fix: кнопки активны после обновления + перевод Reinstall → Переустановить 2026-07-31 18:15:28 +03:00
Dushnilin ac209457d7 feat: кнопка Переустановить для Tachyon на странице обновлений 2026-07-31 17:34:11 +03:00
Dushnilin ed0def7886 test: обновить фикстур sing-box signature для TUIC state полей 2026-07-31 17:05:47 +03:00
Dushnilin a8cf31c9cd feat: DNS пресеты — рекомендованные серверы по протоколам (UDP/DoT/DoH/DoQ) 2026-07-31 17:01:50 +03:00
Dushnilin 448267335b feat: добавлена поддержка TUIC протокола и DNS over QUIC (DoQ) с ECH 2026-07-31 16:49:55 +03:00
Dushnilin ce0256528b fix(security): харденинг Telegram-бота, DNS failover и ACL 2026-07-31 14:31:13 +03:00
Dushnilin 866c04cdd5 chore: replace hardcoded version with timeless STABLE RELEASE badge in hero SVG 2026-07-30 22:45:14 +03:00
Dushnilin 7757ceae6a feat: implement WebRTC Leak Protection and Strict DNS DoQ Enforcer 2026-07-30 21:43:56 +03:00
Dushnilin 7e64eb10b1 Fix updates: split arch.candidates string into array for zapret2 release resolution 2026-07-30 20:24:17 +03:00
Dushnilin 79ed7b03cf fix: add cortex-a53 fallback for zapret2 generic aarch64 resolution 2026-07-30 18:39:07 +03:00
Dushnilin 7bcf7590ea fix(tests): актуализация сигнатур nftables и паритета хэшей в state.uc 2026-07-30 18:04:27 +03:00
Dushnilin af620a2f45 fix: исправление резолвинга пакета zapret2 для роутеров и поиск релизов 2026-07-30 17:52:16 +03:00
Dushnilin b057e0a48d refactor: удаление неиспользуемого автоподбора Zapret2 и чистка файлов локализации 2026-07-30 16:42:30 +03:00
Dushnilin f3d8c5a264 fix: решение зацикливания TPROXY FakeIP для ip.podkop.fyi и синхронизация тестов с локалями 2026-07-30 10:39:55 +03:00
Dushnilin 16d06fc9cc docs: обновление README.md (Forkop, Zapret v1/v2, OpenWrt 25+, донат) 2026-07-30 10:10:05 +03:00
Dushnilin 2bbc041686 docs: обновление README.md и добавление англоязычной версии README.en.md 2026-07-30 10:01:42 +03:00
Dushnilin bd4c686479 refactor(zapret2): исправление правил nftables, отказ от автоподбора и переход на zapret2-mcp 2026-07-30 09:37:46 +03:00
Dushnilin 93eac2002e Zapret2 Auto-Tune: Remove baseline_none and add generic UDP bypass for Discord voice 2026-07-29 22:45:01 +03:00
Dushnilin 6c1d3dc7be LuCI: Remove express/deep scan dropdown, use single deep scan 2026-07-29 22:39:45 +03:00
Dushnilin f48258ef2e Zapret2: Implement dynamic combinatorial strategy generator (tune) 2026-07-29 22:39:04 +03:00
Dushnilin 28b3a98ec2 Fix AI Watchdog QoS parsing issue with nftables DSCP names 2026-07-29 22:10:55 +03:00
Dushnilin d52c1bf6a2 Fix zapret2 tuner: use nftables for bypass, DoH for real IPs and fs.popen to avoid stdout corruption 2026-07-29 21:28:48 +03:00
Dushnilin 0100935f3d Fix zapret2 tuner: use nftables for bypass and DoH for real IPs 2026-07-29 21:18:29 +03:00
Dushnilin cc41864d2d fix(test): sync po file 2026-07-29 19:58:35 +03:00
Dushnilin 4422416227 fix(ui): native rules button layout and tracer community match logic 2026-07-29 18:32:17 +03:00
Dushnilin 3821e92148 style(luci): complete visual redesign of zapret2 strategy tuner with 1-click automated section domain optimization 2026-07-29 13:41:41 +03:00
Dushnilin bf28dce4a8 fix(ui): prevent false worker exit timeout during deep scan strategy tuning 2026-07-29 13:28:51 +03:00
Dushnilin 03f6699099 feat(zapret2): fully automated 1-click strategy tuner for section domains and fix state directory creation 2026-07-29 13:19:15 +03:00
Dushnilin a8187270ca fix(luci): use async background polling for strategy tuner to prevent XHR timeouts 2026-07-29 13:02:26 +03:00
Dushnilin b82f98288a ux(luci): render strategy auto-tuner inline inside section modal with visual textarea feedback 2026-07-29 12:59:44 +03:00
Dushnilin 14270430d2 fix(zapret2): improve strategy probe connectivity and winner evaluation logic 2026-07-29 12:02:51 +03:00
Dushnilin dc695ff2d5 fix(luci): use renderWidget for native LuCI dependency handling 2026-07-29 11:52:43 +03:00
Dushnilin f28035393b i18n(fe-app): add Russian translations for zapret2 strategy tuner 2026-07-29 11:44:32 +03:00
Dushnilin 3c4efea11b fix(luci): add zapret2 strategy tuner UI widget and fix AWG obfuscation visibility 2026-07-29 11:43:01 +03:00
Dushnilin 8b8c4b7df1 feat(zapret2): add high-performance strategy generator and tuner 2026-07-29 11:30:23 +03:00
Dushnilin c7ff142a48 Release 1.2.43 - Pre-download and cache all preset rulesets & databases 2026-07-29 08:58:00 +03:00
Dushnilin 28f2a04f02 chore(locales): synchronize extracted translation templates and Russian PO catalog 2026-07-28 21:48:24 +03:00
Dushnilin 53e3f1f041 feat(routing): add traffic type / protocol filtering and exclusion per section 2026-07-28 21:46:18 +03:00
Dushnilin a3e9981d13 fix(backend): optimize plain-list domain import to O(N) deduplication and fast-path ASCII parsing for 100k+ domain lists 2026-07-28 21:19:44 +03:00
Dushnilin 698ef4dd33 fix(ui): fix AWG group render argument signature to (option_index, section_id, in_table) 2026-07-28 11:35:09 +03:00
Dushnilin a54607a6e7 fix(ui): remove duplicate realSid declaration 2026-07-28 11:29:30 +03:00
Dushnilin 297ffd0975 fix(ui): resolve real UCI section name from CBI section_id in AWG group render 2026-07-28 11:22:10 +03:00
Dushnilin a06248cd6e fix(ui): read AWG params via cfgvalue() not uci.get() — fixes missing values in spoiler 2026-07-28 11:05:40 +03:00
Dushnilin 9dcb474228 feat(ui): AWG obfuscation params compact spoiler in OpenWRT style + ru translations; fix(types): add dns_turbo_cache to ConfigSection 2026-07-28 11:02:29 +03:00
Dushnilin 3e1c68f836 feat(ui): collapse AWG amnezia params (Jc/Jmin/Jmax/S1-4/H1-4/I1-5) into compact spoiler 2026-07-28 10:52:42 +03:00
Dushnilin e8fa171644 fix(protocols): WARP mtu=1280, AnyTLS SNI fallback to server, OpenVPN server validation 2026-07-28 10:47:01 +03:00
Dushnilin d2cb9d9e43 fix(awg): harden AmneziaWG validation, auto-convert plaintext headers to hex, and enforce optimal MTU/keepalive defaults 2026-07-28 09:22:54 +03:00
Dushnilin e936f39b53 fix(singbox): strip <b prefix from binary UCI buffer strings in uci_bin_to_hex 2026-07-28 01:02:28 +03:00
Dushnilin e9a9ead675 fix(updater): add fallback resolution for sing-box-extended when GitHub API rate-limits 2026-07-28 00:01:04 +03:00
Dushnilin b069e8f6a4 style(ui): remove emojis and clean up GeoIP mode labels 2026-07-27 18:47:04 +03:00
Dushnilin cc8cec4275 fix(ui): strip legacy all value and map non-ru in geoip_country load handler 2026-07-27 18:44:45 +03:00
Dushnilin eef4d587bd feat: custom multi-country GeoIP grouping and filter modes (include/exclude) 2026-07-27 18:30:02 +03:00