diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 30ca6df5..d7a3d7bf 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -11,8 +11,8 @@ body: Спасибо за создание отчета об ошибке! Перед отправкой, пожалуйста: - - Проверьте [существующие issues](https://github.com/ushan0v/forkop/issues) - - Просмотрите [README проекта](https://github.com/ushan0v/forkop#readme) + - Проверьте [существующие issues](https://github.com/ushan0v/tachyon/issues) + - Просмотрите [README проекта](https://github.com/ushan0v/tachyon#readme) - type: textarea id: description @@ -53,7 +53,7 @@ body: Информация о вашей системе (заполните всё применимое) value: | - **OpenWrt версия**: - - **Forkop версия**: + - **Tachyon версия**: - **Роутер модель**: - **Sing-box версия**: render: markdown @@ -68,7 +68,7 @@ body: Релевантные части конфигурации (удалите чувствительную информацию!) placeholder: | Например: - - Содержимое /etc/config/forkop + - Содержимое /etc/config/tachyon - Конфигурация sing-box (если релевантно) - Дополнительные конфиги, которые потребуются wireless/network/dhcp и т.д. render: shell diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 921d962c..9d21207c 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,8 +1,8 @@ blank_issues_enabled: false contact_links: - name: 💬 Если у вас что-то не работает, прежде всего прочитайте README проекта - url: https://github.com/ushan0v/forkop + url: https://github.com/ushan0v/tachyon about: README проекта - name: 📚 Если вы не нашли в README документацию, то вот ссылка на неё - url: https://github.com/ushan0v/forkop#readme - about: README Forkop + url: https://github.com/ushan0v/tachyon#readme + about: README Tachyon diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 4759a682..ffdf6ceb 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,6 +1,6 @@ --- name: ✨ Запрос новой функции -description: Предложите новую функцию или улучшение для Forkop +description: Предложите новую функцию или улучшение для Tachyon title: "[FEATURE] " labels: ["enhancement", "needs-discussion"] assignees: [] @@ -11,14 +11,14 @@ body: Спасибо за предложение новой функции! Перед отправкой, пожалуйста: - - Проверьте [существующие запросы](https://github.com/ushan0v/forkop/issues?q=is%3Aissue+label%3Aenhancement) - - Убедитесь, что функции не существует в [README проекта](https://github.com/ushan0v/forkop#readme) + - Проверьте [существующие запросы](https://github.com/ushan0v/tachyon/issues?q=is%3Aissue+label%3Aenhancement) + - Убедитесь, что функции не существует в [README проекта](https://github.com/ushan0v/tachyon#readme) - type: textarea id: summary attributes: label: Краткое описание - description: Краткое описание предлагаемой функции для Forkop + description: Краткое описание предлагаемой функции для Tachyon placeholder: В одном предложении опишите, что вы хотите добавить... validations: required: true @@ -40,7 +40,7 @@ body: label: 💡 Предлагаемое решение description: Четкое и краткое описание того, что вы хотите реализовать placeholder: | - Я хочу, чтобы Forkop мог [...] + Я хочу, чтобы Tachyon мог [...] Предлагаю добавить функцию, которая [...] Можно было бы улучшить [...] путем [...] validations: diff --git a/.github/workflows/backend-ci.yml b/.github/workflows/backend-ci.yml index 67e3eea2..fb54f140 100644 --- a/.github/workflows/backend-ci.yml +++ b/.github/workflows/backend-ci.yml @@ -3,8 +3,8 @@ name: Backend CI on: pull_request: paths: - - 'forkop/files/**' - - 'forkop/Makefile' + - 'tachyon/files/**' + - 'tachyon/Makefile' - 'build.sh' - 'tests/**' - '.github/workflows/backend-ci.yml' @@ -12,8 +12,8 @@ on: branches: - main paths: - - 'forkop/files/**' - - 'forkop/Makefile' + - 'tachyon/files/**' + - 'tachyon/Makefile' - 'build.sh' - 'tests/**' - '.github/workflows/backend-ci.yml' @@ -48,8 +48,8 @@ jobs: - name: Check ucode syntax shell: bash run: | - find forkop/files/usr/lib -name '*.uc' -print0 | xargs -0 -n1 ucode -c -o /dev/null - find forkop/files/usr/lib -name '*.uc' -print0 | xargs -0 -n1 ucode -S -c -o /dev/null + find tachyon/files/usr/lib -name '*.uc' -print0 | xargs -0 -n1 ucode -c -o /dev/null + find tachyon/files/usr/lib -name '*.uc' -print0 | xargs -0 -n1 ucode -S -c -o /dev/null - name: Run backend tests shell: bash diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 71621f81..19bc6410 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -45,7 +45,7 @@ jobs: echo "commitish=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" build: - name: Build Forkop release packages + name: Build Tachyon release packages runs-on: ubuntu-latest needs: preparation steps: @@ -122,12 +122,12 @@ jobs: mkdir -p "$web_dir/releases" expected_files=( - "forkop_${VERSION}.ipk" - "forkop_${VERSION}.apk" - "luci-app-forkop_${VERSION}.ipk" - "luci-app-forkop_${VERSION}.apk" - "luci-i18n-forkop-ru_${VERSION}.ipk" - "luci-i18n-forkop-ru_${VERSION}.apk" + "tachyon_${VERSION}.ipk" + "tachyon_${VERSION}.apk" + "luci-app-tachyon_${VERSION}.ipk" + "luci-app-tachyon_${VERSION}.apk" + "luci-i18n-tachyon-ru_${VERSION}.ipk" + "luci-i18n-tachyon-ru_${VERSION}.apk" ) for file_name in "${expected_files[@]}"; do test -s "$release_dir/$file_name" @@ -150,7 +150,7 @@ jobs: replace_once( b'https://api.github.com/repos/${owner}/${repo}/releases/latest', - b'https://forkop.sourceforge.io/releases/latest.json', + b'https://tachyon.sourceforge.io/releases/latest.json', ) replace_once(b'\nSING_BOX_INSTALL_VARIANT=""\n', b'\n') replace_once( @@ -211,7 +211,7 @@ jobs: version = sys.argv[1] release_dir = pathlib.Path(sys.argv[2]) output_path = pathlib.Path(sys.argv[3]) - base_url = f"https://downloads.sourceforge.net/project/forkop/releases/{version}" + base_url = f"https://downloads.sourceforge.net/project/tachyon/releases/{version}" assets = [] for path in sorted(release_dir.iterdir(), key=lambda item: item.name): assets.append({ @@ -253,9 +253,9 @@ jobs: set -euo pipefail sftp -i "$HOME/.ssh/sourceforge" -b - ushan0v@frs.sourceforge.net <> $GITHUB_OUTPUT - name: Cache yarn dependencies uses: actions/cache@v4.3.0 with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('fe-app-forkop/yarn.lock') }} + key: ${{ runner.os }}-yarn-${{ hashFiles('fe-app-tachyon/yarn.lock') }} restore-keys: | ${{ runner.os }}-yarn- diff --git a/.github/workflows/shellcheck.yml b/.github/workflows/shellcheck.yml index 3cf08eb0..edd320ed 100644 --- a/.github/workflows/shellcheck.yml +++ b/.github/workflows/shellcheck.yml @@ -9,8 +9,8 @@ on: paths: - 'build.sh' - 'install.sh' - - 'forkop/files/etc/init.d/**' - - 'luci-app-forkop/root/etc/uci-defaults/**' + - 'tachyon/files/etc/init.d/**' + - 'luci-app-tachyon/root/etc/uci-defaults/**' - 'tests/**/*.sh' - '.github/workflows/shellcheck.yml' pull_request: @@ -20,8 +20,8 @@ on: paths: - 'build.sh' - 'install.sh' - - 'forkop/files/etc/init.d/**' - - 'luci-app-forkop/root/etc/uci-defaults/**' + - 'tachyon/files/etc/init.d/**' + - 'luci-app-tachyon/root/etc/uci-defaults/**' - 'tests/**/*.sh' - '.github/workflows/shellcheck.yml' @@ -48,8 +48,8 @@ jobs: mapfile -d '' scripts < <( find . -type f \ \( -name '*.sh' -o -path './build.sh' -o -path './install.sh' \ - -o -path './forkop/files/etc/init.d/*' \ - -o -path './luci-app-forkop/root/etc/uci-defaults/*' \) \ + -o -path './tachyon/files/etc/init.d/*' \ + -o -path './luci-app-tachyon/root/etc/uci-defaults/*' \) \ -print0 ) shellcheck --severity=error "${scripts[@]}" diff --git a/.gitignore b/.gitignore index 273c5638..06d39c07 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ .idea -fe-app-forkop/node_modules -fe-app-forkop/.yarn/ -fe-app-forkop/.env +fe-app-tachyon/node_modules +fe-app-tachyon/.yarn/ +fe-app-tachyon/.env .DS_Store sandbox/ diff --git a/README.md b/README.md index 433d3ea5..fbe2ead3 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,6 @@ [![Star](https://img.shields.io/github/stars/Dushnilin/tachyon?style=social)](https://github.com/Dushnilin/tachyon/stargazers) [![Releases](https://img.shields.io/github/v/release/Dushnilin/tachyon?label=releases)](https://github.com/Dushnilin/tachyon/releases) -[![Telegram Chat](https://img.shields.io/badge/Telegram-Tachyon%20%7C%20Chat-2CA5E0?logo=telegram&logoColor=white)](https://t.me/tachyon_chat) -[![AI Assistant](https://img.shields.io/badge/Telegram-Tachyon%20%7C%20AI%20Assistant-2CA5E0?logo=telegram&logoColor=white)](https://t.me/tachyon_aibot) > **Tachyon** — это форк проекта **Forkop** (ранее известного как **Podkop Plus**). Проект переименован и развивается как независимое решение для OpenWrt на базе оригинального [Podkop](https://github.com/itdoginfo/podkop). @@ -13,6 +11,10 @@ sh <(wget -O - https://raw.githubusercontent.com/Dushnilin/tachyon/main/install.sh) ``` +> [!NOTE] +> Конфигурация от **Forkop** (или **Podkop Plus**) полностью совместима и автоматически перенесется и переименуется в `/etc/config/tachyon` во время установки! + + ### Что нового в этом форке * **Поддержка подписок**: автоматическое управление узлами и их регулярное обновление. @@ -29,12 +31,6 @@ sh <(wget -O - https://raw.githubusercontent.com/Dushnilin/tachyon/main/install. * **Интеграция средств обхода**: встроенная поддержка `Zapret`, `Zapret2` и `ByeDPI` как индивидуальных действий для каждого правила. * **Современный бэкенд**: вся логика службы полностью переписана на `ucode`. -### Документация и поддержка - -Отдельной документации со всеми деталями пока нет. Задать вопрос, сообщить об ошибке или обсудить проект можно в [Telegram-чате](https://t.me/tachyon_chat). - -Для быстрых ответов на вопросы о настройке и работе проекта вы можете использовать бесплатного AI-ассистента [@tachyon_aibot](https://t.me/tachyon_aibot) в Telegram. - ### Поддержать проект * 💳 **Карты РФ / СБП / Tinkoff Pay:** [Донат на Dalink](https://dalink.to/dushnilin) diff --git a/build.sh b/build.sh index b5afce66..65913dd3 100644 --- a/build.sh +++ b/build.sh @@ -22,22 +22,22 @@ if [[ ! "$RELEASE_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then fi APK_INTERNAL_VERSION="$RELEASE_VERSION" -WSL_NATIVE_ROOT="${WSL_NATIVE_ROOT:-$DEFAULT_BUILD_HOME/build/forkop}" +WSL_NATIVE_ROOT="${WSL_NATIVE_ROOT:-$DEFAULT_BUILD_HOME/build/tachyon}" WORK_DIR="${WORK_DIR:-$ROOT_DIR/.wsl-build}" SDK_WORK_DIR="${SDK_WORK_DIR:-$WORK_DIR/sdk}" -SDK_CACHE_DIR="${SDK_CACHE_DIR:-$DEFAULT_BUILD_HOME/.cache/forkop/openwrt-sdk}" +SDK_CACHE_DIR="${SDK_CACHE_DIR:-$DEFAULT_BUILD_HOME/.cache/tachyon/openwrt-sdk}" IPK_SDK_URL="${IPK_SDK_URL:-https://downloads.openwrt.org/releases/24.10.6/targets/x86/64/openwrt-sdk-24.10.6-x86-64_gcc-13.3.0_musl.Linux-x86_64.tar.zst}" APK_SDK_URL="${APK_SDK_URL:-https://downloads.openwrt.org/releases/25.12.3/targets/x86/64/openwrt-sdk-25.12.3-x86-64_gcc-14.3.0_musl.Linux-x86_64.tar.zst}" -BACKEND_DESCRIPTION="Rule-based Forkop backend with hybrid sing-box + zapret orchestration" -APP_DESCRIPTION="Rule-based Forkop LuCI app with hybrid sing-box + zapret orchestration" -I18N_DESCRIPTION="Translation for luci-app-forkop - Русский (Russian)" +BACKEND_DESCRIPTION="Rule-based Tachyon backend with hybrid sing-box + zapret orchestration" +APP_DESCRIPTION="Rule-based Tachyon LuCI app with hybrid sing-box + zapret orchestration" +I18N_DESCRIPTION="Translation for luci-app-tachyon - Русский (Russian)" MAINTAINER="Dushnilin " PROJECT_URL="https://github.com/Dushnilin/tachyon" BACKEND_DEPENDS_IPK="libc, ca-bundle, kmod-inet-diag, kmod-netlink-diag, kmod-tun, curl, ucode, ucode-mod-fs, ucode-mod-uci, kmod-nft-tproxy, coreutils-base64, coreutils-sort, bind-dig, nftables, kmod-nft-nat, ip-full" BACKEND_DEPENDS_APK="bind-dig ca-bundle coreutils-base64 coreutils-sort curl ip-full kmod-inet-diag kmod-netlink-diag kmod-nft-nat kmod-nft-tproxy kmod-tun libc nftables ucode ucode-mod-fs ucode-mod-uci" -APP_DEPENDS_IPK="libc, luci-base, forkop" -APP_DEPENDS_APK="libc luci-base forkop" +APP_DEPENDS_IPK="libc, luci-base, tachyon" +APP_DEPENDS_APK="libc luci-base tachyon" APT_PACKAGES=( build-essential @@ -70,14 +70,14 @@ copy_to_native_root() { --exclude "dist" \ --exclude ".idea" \ --exclude "sandbox" \ - --exclude "fe-app-forkop/node_modules" \ - --exclude "fe-app-forkop/tests" \ + --exclude "fe-app-tachyon/node_modules" \ + --exclude "fe-app-tachyon/tests" \ "$ROOT_DIR/" "$target_root/" rm -rf \ "$target_root/.idea" \ "$target_root/sandbox" \ - "$target_root/fe-app-forkop/node_modules" \ - "$target_root/fe-app-forkop/tests" + "$target_root/fe-app-tachyon/node_modules" \ + "$target_root/fe-app-tachyon/tests" if [[ -n "$OUTPUT_DIR_INPUT" ]]; then target_output="$OUTPUT_DIR_INPUT" @@ -172,7 +172,7 @@ extract_sdk() { local archive_path="$2" local sdk_url="$3" local destination="$SDK_WORK_DIR/$kind" - local marker_file="$destination/.forkop-sdk-url" + local marker_file="$destination/.tachyon-sdk-url" local temp_dir local extracted_root @@ -235,18 +235,18 @@ build_backend_root() { make_dir "$output_root/etc/init.d" make_dir "$output_root/etc/config" make_dir "$output_root/usr/bin" - make_dir "$output_root/usr/lib/forkop" + make_dir "$output_root/usr/lib/tachyon" - install -m 0755 "$ROOT_DIR/forkop/files/etc/init.d/forkop" "$output_root/etc/init.d/forkop" - install -m 0644 "$ROOT_DIR/forkop/files/etc/config/forkop" "$output_root/etc/config/forkop" - install -m 0755 "$ROOT_DIR/forkop/files/usr/bin/forkop" "$output_root/usr/bin/forkop" - cp -a "$ROOT_DIR/forkop/files/usr/lib/." "$output_root/usr/lib/forkop/" + install -m 0755 "$ROOT_DIR/tachyon/files/etc/init.d/tachyon" "$output_root/etc/init.d/tachyon" + install -m 0644 "$ROOT_DIR/tachyon/files/etc/config/tachyon" "$output_root/etc/config/tachyon" + install -m 0755 "$ROOT_DIR/tachyon/files/usr/bin/tachyon" "$output_root/usr/bin/tachyon" + cp -a "$ROOT_DIR/tachyon/files/usr/lib/." "$output_root/usr/lib/tachyon/" sed -i -e "s/__COMPILED_VERSION_VARIABLE__/${RELEASE_VERSION}/g" \ - "$output_root/usr/lib/forkop/core/constants.uc" + "$output_root/usr/lib/tachyon/core/constants.uc" normalize_package_root_modes "$output_root" - chmod 0755 "$output_root/etc/init.d/forkop" "$output_root/usr/bin/forkop" + chmod 0755 "$output_root/etc/init.d/tachyon" "$output_root/usr/bin/tachyon" } build_app_root() { @@ -255,17 +255,17 @@ build_app_root() { rm -rf "$output_root" make_dir "$output_root/www" - if [[ -d "$ROOT_DIR/luci-app-forkop/htdocs" ]]; then - cp -a "$ROOT_DIR/luci-app-forkop/htdocs/." "$output_root/www/" + if [[ -d "$ROOT_DIR/luci-app-tachyon/htdocs" ]]; then + cp -a "$ROOT_DIR/luci-app-tachyon/htdocs/." "$output_root/www/" fi - if [[ -d "$ROOT_DIR/luci-app-forkop/root" ]]; then - cp -a "$ROOT_DIR/luci-app-forkop/root/." "$output_root/" + if [[ -d "$ROOT_DIR/luci-app-tachyon/root" ]]; then + cp -a "$ROOT_DIR/luci-app-tachyon/root/." "$output_root/" fi - if [[ -f "$output_root/www/luci-static/resources/view/forkop/main.js" ]]; then + if [[ -f "$output_root/www/luci-static/resources/view/tachyon/main.js" ]]; then sed -i -e "s/__COMPILED_VERSION_VARIABLE__/${RELEASE_VERSION}/g" \ - "$output_root/www/luci-static/resources/view/forkop/main.js" + "$output_root/www/luci-static/resources/view/tachyon/main.js" fi normalize_package_root_modes "$output_root" @@ -275,17 +275,17 @@ build_app_root() { build_i18n_root() { local output_root="$1" local po2lmo_bin="$2" - local lmo_path="$output_root/usr/lib/lua/luci/i18n/forkop.ru.lmo" + local lmo_path="$output_root/usr/lib/lua/luci/i18n/tachyon.ru.lmo" rm -rf "$output_root" make_dir "$output_root/etc/uci-defaults" make_dir "$(dirname "$lmo_path")" - cat > "$output_root/etc/uci-defaults/luci-i18n-forkop-ru" <<'EOF' + cat > "$output_root/etc/uci-defaults/luci-i18n-tachyon-ru" <<'EOF' uci set luci.languages.ru='Русский (Russian)'; uci commit luci EOF - "$po2lmo_bin" "$ROOT_DIR/luci-app-forkop/po/ru/forkop.po" "$lmo_path" + "$po2lmo_bin" "$ROOT_DIR/luci-app-tachyon/po/ru/tachyon.po" "$lmo_path" normalize_package_root_modes "$output_root" find "$output_root/etc/uci-defaults" -type f -exec chmod 0755 {} + 2>/dev/null || true @@ -326,7 +326,7 @@ write_backend_ipk_control() { make_dir "$control_dir" cat > "$control_dir/control" < "$control_dir/conffiles" <<'EOF' -/etc/config/forkop +/etc/config/tachyon EOF cat > "$control_dir/postinst" <<'EOF' #!/bin/sh [ -n "${IPKG_INSTROOT}" ] && exit 0 -FORKOP_LIB=/usr/lib/forkop ucode -L /usr/lib/forkop /usr/lib/forkop/config/migration.uc migrate +TACHYON_LIB=/usr/lib/tachyon ucode -L /usr/lib/tachyon /usr/lib/tachyon/config/migration.uc migrate EOF cat > "$control_dir/prerm" <<'EOF' #!/usr/bin/ucode if (getenv("IPKG_INSTROOT") == null || getenv("IPKG_INSTROOT") == "") - system("/usr/bin/forkop package_prerm >/dev/null 2>&1"); + system("/usr/bin/tachyon package_prerm >/dev/null 2>&1"); exit(0); EOF @@ -368,7 +368,7 @@ write_app_ipk_control() { make_dir "$control_dir" cat > "$control_dir/control" < "$control_dir/postinst-pkg" <<'EOF' -[ -n "${IPKG_INSTROOT}" ] || /usr/bin/forkop luci_postinst >/dev/null 2>&1 || true +[ -n "${IPKG_INSTROOT}" ] || /usr/bin/tachyon luci_postinst >/dev/null 2>&1 || true EOF cat > "$control_dir/prerm" <<'EOF' @@ -410,9 +410,9 @@ write_i18n_ipk_control() { make_dir "$control_dir" cat > "$control_dir/control" < "$scripts_dir/backend-post-install.sh" <<'EOF' #!/usr/bin/ucode if (getenv("IPKG_INSTROOT") == null || getenv("IPKG_INSTROOT") == "") - exit(system("FORKOP_LIB=/usr/lib/forkop ucode -L /usr/lib/forkop /usr/lib/forkop/config/migration.uc migrate")); + exit(system("TACHYON_LIB=/usr/lib/tachyon ucode -L /usr/lib/tachyon /usr/lib/tachyon/config/migration.uc migrate")); exit(0); EOF @@ -502,7 +502,7 @@ EOF #!/usr/bin/ucode if (getenv("IPKG_INSTROOT") == null || getenv("IPKG_INSTROOT") == "") - system("/usr/bin/forkop package_prerm >/dev/null 2>&1"); + system("/usr/bin/tachyon package_prerm >/dev/null 2>&1"); exit(0); EOF @@ -515,7 +515,7 @@ EOF cat > "$scripts_dir/backend-post-upgrade.sh" <<'EOF' #!/usr/bin/ucode if (getenv("IPKG_INSTROOT") == null || getenv("IPKG_INSTROOT") == "") - exit(system("FORKOP_LIB=/usr/lib/forkop ucode -L /usr/lib/forkop /usr/lib/forkop/config/migration.uc migrate")); + exit(system("TACHYON_LIB=/usr/lib/tachyon ucode -L /usr/lib/tachyon /usr/lib/tachyon/config/migration.uc migrate")); exit(0); EOF @@ -538,10 +538,10 @@ EOF [ -s ${IPKG_INSTROOT}/lib/functions.sh ] || exit 0 . ${IPKG_INSTROOT}/lib/functions.sh export root="${IPKG_INSTROOT}" -export pkgname="luci-app-forkop" +export pkgname="luci-app-tachyon" add_group_and_user default_postinst -[ -n "${IPKG_INSTROOT}" ] || /usr/bin/forkop luci_postinst >/dev/null 2>&1 || true +[ -n "${IPKG_INSTROOT}" ] || /usr/bin/tachyon luci_postinst >/dev/null 2>&1 || true EOF cat > "$scripts_dir/app-pre-deinstall.sh" <<'EOF' @@ -549,7 +549,7 @@ EOF [ -s ${IPKG_INSTROOT}/lib/functions.sh ] || exit 0 . ${IPKG_INSTROOT}/lib/functions.sh export root="${IPKG_INSTROOT}" -export pkgname="luci-app-forkop" +export pkgname="luci-app-tachyon" default_prerm exit 0 EOF @@ -566,10 +566,10 @@ export PKG_UPGRADE=1 [ -s ${IPKG_INSTROOT}/lib/functions.sh ] || exit 0 . ${IPKG_INSTROOT}/lib/functions.sh export root="${IPKG_INSTROOT}" -export pkgname="luci-app-forkop" +export pkgname="luci-app-tachyon" add_group_and_user default_postinst -[ -n "${IPKG_INSTROOT}" ] || /usr/bin/forkop luci_postinst >/dev/null 2>&1 || true +[ -n "${IPKG_INSTROOT}" ] || /usr/bin/tachyon luci_postinst >/dev/null 2>&1 || true EOF chmod 0755 "$scripts_dir"/app-*.sh @@ -591,7 +591,7 @@ EOF [ -s ${IPKG_INSTROOT}/lib/functions.sh ] || exit 0 . ${IPKG_INSTROOT}/lib/functions.sh export root="${IPKG_INSTROOT}" -export pkgname="luci-i18n-forkop-ru" +export pkgname="luci-i18n-tachyon-ru" add_group_and_user default_postinst EOF @@ -601,7 +601,7 @@ EOF [ -s ${IPKG_INSTROOT}/lib/functions.sh ] || exit 0 . ${IPKG_INSTROOT}/lib/functions.sh export root="${IPKG_INSTROOT}" -export pkgname="luci-i18n-forkop-ru" +export pkgname="luci-i18n-tachyon-ru" default_prerm EOF @@ -617,7 +617,7 @@ export PKG_UPGRADE=1 [ -s ${IPKG_INSTROOT}/lib/functions.sh ] || exit 0 . ${IPKG_INSTROOT}/lib/functions.sh export root="${IPKG_INSTROOT}" -export pkgname="luci-i18n-forkop-ru" +export pkgname="luci-i18n-tachyon-ru" add_group_and_user default_postinst EOF @@ -654,7 +654,7 @@ build_apk_package() { -I "description:${description}" \ -I "arch:noarch" \ -I "license:GPL-2.0-or-later" \ - -I "origin:forkop" \ + -I "origin:tachyon" \ -I "maintainer:${maintainer}" \ -I "url:${PROJECT_URL}" \ -I "depends:${depends}" \ @@ -673,7 +673,7 @@ build_apk_package() { -I "description:${description}" \ -I "arch:noarch" \ -I "license:GPL-2.0-or-later" \ - -I "origin:forkop" \ + -I "origin:tachyon" \ -I "maintainer:${maintainer}" \ -I "url:${PROJECT_URL}" \ -I "depends:${depends}" \ @@ -695,7 +695,7 @@ build_apk_package() { -I 'description:${description}' \ -I 'arch:noarch' \ -I 'license:GPL-2.0-or-later' \ - -I 'origin:forkop' \ + -I 'origin:tachyon' \ -I 'maintainer:${maintainer}' \ -I 'url:${PROJECT_URL}' \ -I 'depends:${depends}' \ @@ -717,7 +717,7 @@ build_apk_package() { -I 'description:${description}' \ -I 'arch:noarch' \ -I 'license:GPL-2.0-or-later' \ - -I 'origin:forkop' \ + -I 'origin:tachyon' \ -I 'maintainer:${maintainer}' \ -I 'url:${PROJECT_URL}' \ -I 'depends:${depends}' \ @@ -798,17 +798,17 @@ sync_artifacts_to_windows() { fi rm -f \ - "$WINDOWS_ARTIFACTS_DIR"/forkop_* \ - "$WINDOWS_ARTIFACTS_DIR"/luci-app-forkop_* \ - "$WINDOWS_ARTIFACTS_DIR"/luci-i18n-forkop-ru_* + "$WINDOWS_ARTIFACTS_DIR"/tachyon_* \ + "$WINDOWS_ARTIFACTS_DIR"/luci-app-tachyon_* \ + "$WINDOWS_ARTIFACTS_DIR"/luci-i18n-tachyon-ru_* cp -f \ - "$output_dir"/forkop_"${RELEASE_VERSION}".ipk \ - "$output_dir"/luci-app-forkop_"${RELEASE_VERSION}".ipk \ - "$output_dir"/luci-i18n-forkop-ru_"${RELEASE_VERSION}".ipk \ - "$output_dir"/forkop_"${RELEASE_VERSION}".apk \ - "$output_dir"/luci-app-forkop_"${RELEASE_VERSION}".apk \ - "$output_dir"/luci-i18n-forkop-ru_"${RELEASE_VERSION}".apk \ + "$output_dir"/tachyon_"${RELEASE_VERSION}".ipk \ + "$output_dir"/luci-app-tachyon_"${RELEASE_VERSION}".ipk \ + "$output_dir"/luci-i18n-tachyon-ru_"${RELEASE_VERSION}".ipk \ + "$output_dir"/tachyon_"${RELEASE_VERSION}".apk \ + "$output_dir"/luci-app-tachyon_"${RELEASE_VERSION}".apk \ + "$output_dir"/luci-i18n-tachyon-ru_"${RELEASE_VERSION}".apk \ "$WINDOWS_ARTIFACTS_DIR"/ echo "Synced artifacts to Windows path: $WINDOWS_ARTIFACTS_DIR" >&2 @@ -853,7 +853,7 @@ main() { mkdir -p "$WORK_DIR" output_dir="${OUTPUT_DIR_INPUT:-$ROOT_DIR/dist/release-final}" mkdir -p "$output_dir" - rm -f "$output_dir"/forkop_* "$output_dir"/luci-app-forkop_* "$output_dir"/luci-i18n-forkop-ru_* + rm -f "$output_dir"/tachyon_* "$output_dir"/luci-app-tachyon_* "$output_dir"/luci-i18n-tachyon-ru_* ipk_archive="$(download_sdk_archive "$IPK_SDK_URL")" apk_archive="$(download_sdk_archive "$APK_SDK_URL")" @@ -880,74 +880,74 @@ main() { build_ipk_package \ "$ipkg_build_bin" \ - "forkop" \ + "tachyon" \ "$backend_root" \ "$backend_control" \ - "$output_dir/forkop_${RELEASE_VERSION}.ipk" + "$output_dir/tachyon_${RELEASE_VERSION}.ipk" build_ipk_package \ "$ipkg_build_bin" \ - "luci-app-forkop" \ + "luci-app-tachyon" \ "$app_root" \ "$app_control" \ - "$output_dir/luci-app-forkop_${RELEASE_VERSION}.ipk" + "$output_dir/luci-app-tachyon_${RELEASE_VERSION}.ipk" build_ipk_package \ "$ipkg_build_bin" \ - "luci-i18n-forkop-ru" \ + "luci-i18n-tachyon-ru" \ "$i18n_root" \ "$i18n_control" \ - "$output_dir/luci-i18n-forkop-ru_${RELEASE_VERSION}.ipk" + "$output_dir/luci-i18n-tachyon-ru_${RELEASE_VERSION}.ipk" - generate_apk_metadata_files "forkop" "$backend_root" "/etc/config/forkop" - generate_apk_metadata_files "luci-app-forkop" "$app_root" - generate_apk_metadata_files "luci-i18n-forkop-ru" "$i18n_root" + generate_apk_metadata_files "tachyon" "$backend_root" "/etc/config/tachyon" + generate_apk_metadata_files "luci-app-tachyon" "$app_root" + generate_apk_metadata_files "luci-i18n-tachyon-ru" "$i18n_root" write_backend_apk_scripts "$apk_scripts" write_app_apk_scripts "$apk_scripts" write_i18n_apk_scripts "$apk_scripts" build_apk_package \ "$apk_bin" \ - "forkop" \ + "tachyon" \ "$APK_INTERNAL_VERSION" \ "$BACKEND_DESCRIPTION" \ "$BACKEND_DEPENDS_APK" \ "$backend_root" \ "$apk_scripts" \ "backend" \ - "$output_dir/forkop_${RELEASE_VERSION}.apk" \ + "$output_dir/tachyon_${RELEASE_VERSION}.apk" \ "$MAINTAINER" build_apk_package \ "$apk_bin" \ - "luci-app-forkop" \ + "luci-app-tachyon" \ "$APK_INTERNAL_VERSION" \ "$APP_DESCRIPTION" \ "$APP_DEPENDS_APK" \ "$app_root" \ "$apk_scripts" \ "app" \ - "$output_dir/luci-app-forkop_${RELEASE_VERSION}.apk" \ + "$output_dir/luci-app-tachyon_${RELEASE_VERSION}.apk" \ "$MAINTAINER" build_apk_package \ "$apk_bin" \ - "luci-i18n-forkop-ru" \ + "luci-i18n-tachyon-ru" \ "$APK_INTERNAL_VERSION" \ "$I18N_DESCRIPTION" \ - "libc luci-app-forkop" \ + "libc luci-app-tachyon" \ "$i18n_root" \ "$apk_scripts" \ "i18n" \ - "$output_dir/luci-i18n-forkop-ru_${RELEASE_VERSION}.apk" \ + "$output_dir/luci-i18n-tachyon-ru_${RELEASE_VERSION}.apk" \ "$MAINTAINER" - verify_ipk_metadata "$output_dir/forkop_${RELEASE_VERSION}.ipk" "forkop" "$RELEASE_VERSION" - verify_ipk_metadata "$output_dir/luci-app-forkop_${RELEASE_VERSION}.ipk" "luci-app-forkop" "$RELEASE_VERSION" - verify_ipk_metadata "$output_dir/luci-i18n-forkop-ru_${RELEASE_VERSION}.ipk" "luci-i18n-forkop-ru" "$RELEASE_VERSION" - verify_apk_metadata "$apk_bin" "$output_dir/forkop_${RELEASE_VERSION}.apk" "forkop" "$APK_INTERNAL_VERSION" - verify_apk_metadata "$apk_bin" "$output_dir/luci-app-forkop_${RELEASE_VERSION}.apk" "luci-app-forkop" "$APK_INTERNAL_VERSION" - verify_apk_metadata "$apk_bin" "$output_dir/luci-i18n-forkop-ru_${RELEASE_VERSION}.apk" "luci-i18n-forkop-ru" "$APK_INTERNAL_VERSION" + verify_ipk_metadata "$output_dir/tachyon_${RELEASE_VERSION}.ipk" "tachyon" "$RELEASE_VERSION" + verify_ipk_metadata "$output_dir/luci-app-tachyon_${RELEASE_VERSION}.ipk" "luci-app-tachyon" "$RELEASE_VERSION" + verify_ipk_metadata "$output_dir/luci-i18n-tachyon-ru_${RELEASE_VERSION}.ipk" "luci-i18n-tachyon-ru" "$RELEASE_VERSION" + verify_apk_metadata "$apk_bin" "$output_dir/tachyon_${RELEASE_VERSION}.apk" "tachyon" "$APK_INTERNAL_VERSION" + verify_apk_metadata "$apk_bin" "$output_dir/luci-app-tachyon_${RELEASE_VERSION}.apk" "luci-app-tachyon" "$APK_INTERNAL_VERSION" + verify_apk_metadata "$apk_bin" "$output_dir/luci-i18n-tachyon-ru_${RELEASE_VERSION}.apk" "luci-i18n-tachyon-ru" "$APK_INTERNAL_VERSION" cleanup_work_dir sync_artifacts_to_windows "$output_dir" diff --git a/fe-app-tachyon/.env.example b/fe-app-tachyon/.env.example index abeca8ac..790c88c9 100644 --- a/fe-app-tachyon/.env.example +++ b/fe-app-tachyon/.env.example @@ -6,11 +6,11 @@ SFTP_PASS= # you can use key if needed # SFTP_PRIVATE_KEY=~/.ssh/id_rsa -LOCAL_DIR_FE=../luci-app-forkop/htdocs/luci-static/resources/view/forkop -REMOTE_DIR_FE=/www/luci-static/resources/view/forkop +LOCAL_DIR_FE=../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon +REMOTE_DIR_FE=/www/luci-static/resources/view/tachyon -LOCAL_DIR_BIN=../forkop/files/usr/bin/ +LOCAL_DIR_BIN=../tachyon/files/usr/bin/ REMOTE_DIR_BIN=/usr/bin/ -LOCAL_DIR_LIB=../forkop/files/usr/lib/ -REMOTE_DIR_LIB=/usr/lib/forkop/ +LOCAL_DIR_LIB=../tachyon/files/usr/lib/ +REMOTE_DIR_LIB=/usr/lib/tachyon/ diff --git a/fe-app-tachyon/distribute-locales.js b/fe-app-tachyon/distribute-locales.js index b310610f..c66589c0 100644 --- a/fe-app-tachyon/distribute-locales.js +++ b/fe-app-tachyon/distribute-locales.js @@ -6,7 +6,7 @@ const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const sourceDir = path.resolve(__dirname, 'locales'); -const targetRoot = path.resolve(__dirname, '../luci-app-forkop/po'); +const targetRoot = path.resolve(__dirname, '../luci-app-tachyon/po'); async function main() { const files = await fs.readdir(sourceDir); @@ -14,17 +14,17 @@ async function main() { for (const file of files) { const filePath = path.join(sourceDir, file); - if (file === 'forkop.pot') { - const potTarget = path.join(targetRoot, 'templates', 'forkop.pot'); + if (file === 'tachyon.pot') { + const potTarget = path.join(targetRoot, 'templates', 'tachyon.pot'); await fs.mkdir(path.dirname(potTarget), { recursive: true }); await fs.copyFile(filePath, potTarget); console.log(`✅ Copied POT: ${filePath} → ${potTarget}`); } - const match = file.match(/^forkop\.([a-zA-Z_]+)\.po$/); + const match = file.match(/^tachyon\.([a-zA-Z_]+)\.po$/); if (match) { const lang = match[1]; - const poTarget = path.join(targetRoot, lang, 'forkop.po'); + const poTarget = path.join(targetRoot, lang, 'tachyon.po'); await fs.mkdir(path.dirname(poTarget), { recursive: true }); await fs.copyFile(filePath, poTarget); console.log(`✅ Copied ${lang.toUpperCase()}: ${filePath} → ${poTarget}`); diff --git a/fe-app-tachyon/extract-calls.js b/fe-app-tachyon/extract-calls.js index a2e10242..ce874b26 100644 --- a/fe-app-tachyon/extract-calls.js +++ b/fe-app-tachyon/extract-calls.js @@ -19,12 +19,12 @@ function stripIllegalReturn(code) { const files = await glob([ 'src/**/*.ts', - '../luci-app-forkop/htdocs/luci-static/resources/view/forkop/**/*.js', + '../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/**/*.js', ], { ignore: [ '**/*.test.ts', '**/main.js', - '../luci-app-forkop/htdocs/luci-static/resources/view/forkop/main.js', + '../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js', ], absolute: true, }); diff --git a/fe-app-tachyon/generate-po.js b/fe-app-tachyon/generate-po.js index 3564c4c9..d84154be 100644 --- a/fe-app-tachyon/generate-po.js +++ b/fe-app-tachyon/generate-po.js @@ -8,7 +8,7 @@ if (!lang) { } const callsPath = 'locales/calls.json'; -const poPath = `locales/forkop.${lang}.po`; +const poPath = `locales/tachyon.${lang}.po`; function getHeader(lang) { const now = new Date(); @@ -28,14 +28,14 @@ function getHeader(lang) { : 'nplurals=2; plural=(n != 1);'; return [ - `# ${lang.toUpperCase()} translations for FORKOP package.`, - `# Copyright (C) ${now.getFullYear()} THE FORKOP COPYRIGHT HOLDER`, - `# This file is distributed under the same license as the FORKOP package.`, + `# ${lang.toUpperCase()} translations for TACHYON package.`, + `# Copyright (C) ${now.getFullYear()} THE TACHYON COPYRIGHT HOLDER`, + `# This file is distributed under the same license as the TACHYON package.`, `# ${translator}, ${now.getFullYear()}.`, '#', 'msgid ""', 'msgstr ""', - `"Project-Id-Version: FORKOP\\n"`, + `"Project-Id-Version: TACHYON\\n"`, `"Report-Msgid-Bugs-To: \\n"`, `"POT-Creation-Date: ${date} ${time}${tzOffset}\\n"`, `"PO-Revision-Date: ${date} ${time}${tzOffset}\\n"`, diff --git a/fe-app-tachyon/generate-pot.js b/fe-app-tachyon/generate-pot.js index 58c1e231..d51dafd0 100644 --- a/fe-app-tachyon/generate-pot.js +++ b/fe-app-tachyon/generate-pot.js @@ -2,8 +2,8 @@ import fs from 'fs/promises'; import { getGitUser } from './locales-utils.js'; const inputFile = 'locales/calls.json'; -const outputFile = 'locales/forkop.pot'; -const projectId = 'FORKOP'; +const outputFile = 'locales/tachyon.pot'; +const projectId = 'TACHYON'; function getPotHeader({ name, email }) { const now = new Date(); diff --git a/fe-app-tachyon/locales/calls.json b/fe-app-tachyon/locales/calls.json index 75ada69f..fe742afe 100644 --- a/fe-app-tachyon/locales/calls.json +++ b/fe-app-tachyon/locales/calls.json @@ -3,300 +3,300 @@ "call": "-- Select --", "key": "-- Select --", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1792", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2145", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2494", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2509", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2704", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2719" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1792", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2145", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2494", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2509", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2704", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2719" ] }, { "call": "+ Add JSON outbound", "key": "+ Add JSON outbound", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6958" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6958" ] }, { "call": "+ Add level", "key": "+ Add level", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2877" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2877" ] }, { "call": "+ Add priority", "key": "+ Add priority", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7041" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7041" ] }, { "call": "+ Add URLTest", "key": "+ Add URLTest", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6984" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6984" ] }, { "call": "✔ Running", "key": "✔ Running", "places": [ - "src/forkop/tabs/dashboard/initController.ts:1675", - "src/forkop/tabs/dashboard/initController.ts:1686" + "src/tachyon/tabs/dashboard/initController.ts:1675", + "src/tachyon/tabs/dashboard/initController.ts:1686" ] }, { "call": "✘ Stopped", "key": "✘ Stopped", "places": [ - "src/forkop/tabs/dashboard/initController.ts:1676", - "src/forkop/tabs/dashboard/initController.ts:1687" + "src/tachyon/tabs/dashboard/initController.ts:1676", + "src/tachyon/tabs/dashboard/initController.ts:1687" ] }, { "call": "Accept external proxy connections and route them with sing-box.", "key": "Accept external proxy connections and route them with sing-box.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:408" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:408" ] }, { "call": "Accept routes", "key": "Accept routes", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3133" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3133" ] }, { "call": "Action", "key": "Action", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6603", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6632" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6603", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6632" ] }, { "call": "Active", "key": "Active", "places": [ - "src/forkop/tabs/monitoring/initController.ts:667", - "src/forkop/tabs/monitoring/render.ts:20" + "src/tachyon/tabs/monitoring/initController.ts:667", + "src/tachyon/tabs/monitoring/render.ts:20" ] }, { "call": "Active Bootstrap DNS", "key": "Active Bootstrap DNS", "places": [ - "src/forkop/tabs/diagnostic/checks/runDnsCheck.ts:56" + "src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:56" ] }, { "call": "Active Connections", "key": "Active Connections", "places": [ - "src/forkop/tabs/dashboard/initController.ts:1633" + "src/tachyon/tabs/dashboard/initController.ts:1633" ] }, { "call": "Active Main DNS", "key": "Active Main DNS", "places": [ - "src/forkop/tabs/diagnostic/checks/runDnsCheck.ts:67" + "src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:67" ] }, { "call": "Add a section", "key": "Add a section", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:397" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:397" ] }, { "call": "Add a server inbound", "key": "Add a server inbound", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:414" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:414" ] }, { "call": "Add at least one DNS server", "key": "Add at least one DNS server", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:119" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:119" ] }, { "call": "Add prefix to nodes", "key": "Add prefix to nodes", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2194" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2194" ] }, { "call": "Add URLs or local paths to .lst lists. Only domain rules are supported.", "key": "Add URLs or local paths to .lst lists. Only domain rules are supported.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7493" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7493" ] }, { "call": "Add URLs or local paths to .srs / .json lists. Only domain rules are supported.", "key": "Add URLs or local paths to .srs / .json lists. Only domain rules are supported.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7442", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7469" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7442", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7469" ] }, { "call": "Additional marking rules found", "key": "Additional marking rules found", "places": [ - "src/forkop/tabs/diagnostic/checks/runNftCheck.ts:106" + "src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:106" ] }, { "call": "Additionally exclude servers by protocol, transport, and security. Exclude only servers matching the specified parameters.", "key": "Additionally exclude servers by protocol, transport, and security. Exclude only servers matching the specified parameters.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2424", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2631" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2424", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2631" ] }, { "call": "Additionally filter servers by protocol, transport, and security. Add only servers matching the specified parameters.", "key": "Additionally filter servers by protocol, transport, and security. Add only servers matching the specified parameters.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2407", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2613" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2407", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2613" ] }, { "call": "Address", "key": "Address", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1653" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1653" ] }, { "call": "Advertise exit node", "key": "Advertise exit node", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3116" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3116" ] }, { "call": "Advertise routes", "key": "Advertise routes", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3126" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3126" ] }, { "call": "All", "key": "All", "places": [ - "src/forkop/tabs/monitoring/initController.ts:626", - "src/forkop/tabs/monitoring/render.ts:39" + "src/tachyon/tabs/monitoring/initController.ts:626", + "src/tachyon/tabs/monitoring/render.ts:39" ] }, { "call": "All except selected", "key": "All except selected", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1689" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1689" ] }, { "call": "All remaining except selected", "key": "All remaining except selected", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1699" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1699" ] }, { "call": "All remaining servers", "key": "All remaining servers", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1697" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1697" ] }, { "call": "All remaining servers means every server not already assigned to a higher-priority level.", "key": "All remaining servers means every server not already assigned to a higher-priority level.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2587" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2587" ] }, { "call": "All servers", "key": "All servers", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1688" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1688" ] }, { "call": "All traffic from these IP addresses will be routed through the section unconditionally, ignoring all other conditions.", "key": "All traffic from these IP addresses will be routed through the section unconditionally, ignoring all other conditions.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7517" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7517" ] }, { "call": "Allowed domain prefixes are full:, keyword:, and regex:", "key": "Allowed domain prefixes are full:, keyword:, and regex:", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4721" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4721" ] }, { "call": "Allows access to YACD from the WAN. Make sure to open the appropriate port in your firewall.", "key": "Allows access to YACD from the WAN. Make sure to open the appropriate port in your firewall.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:423" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:423" ] }, { "call": "Allows limiting the list of servers for URLTest", "key": "Allows limiting the list of servers for URLTest", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2384" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2384" ] }, { "call": "ALPN", "key": "ALPN", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2645" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2645" ] }, { "call": "Alter ID", "key": "Alter ID", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2879" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2879" ] }, { "call": "Apply section rules only to the specified local IP addresses", "key": "Apply section rules only to the specified local IP addresses", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7508" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7508" ] }, { "call": "At least one valid domain must be specified.", "key": "At least one valid domain must be specified.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4752" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4752" ] }, { "call": "At least one valid IP or subnet must be specified.", "key": "At least one valid IP or subnet must be specified.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4834" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4834" ] }, { @@ -310,338 +310,338 @@ "call": "Auto update", "key": "Auto update", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3036" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3036" ] }, { "call": "Auto-generate HWID", "key": "Auto-generate HWID", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2161" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2161" ] }, { "call": "Automatic component update checks", "key": "Automatic component update checks", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:501" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:501" ] }, { "call": "Automatic User-Agent selection", "key": "Automatic User-Agent selection", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2130" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2130" ] }, { "call": "Automatically add text to the name of each server from this subscription for convenient filtering.", "key": "Automatically add text to the name of each server from this subscription for convenient filtering.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2195" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2195" ] }, { "call": "Automatically check installed components for new versions", "key": "Automatically check installed components for new versions", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:502" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:502" ] }, { "call": "Automatically select the fastest node in the current level", "key": "Automatically select the fastest node in the current level", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2818", - "src/forkop/tabs/dashboard/initController.ts:1155" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2818", + "src/tachyon/tabs/dashboard/initController.ts:1155" ] }, { "call": "Available actions", "key": "Available actions", "places": [ - "src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:43" + "src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:43" ] }, { "call": "Backend validation failed: %s", "key": "Backend validation failed: %s", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4967", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5412", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5824" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4967", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5412", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5824" ] }, { "call": "Bootstrap DNS", "key": "Bootstrap DNS", "places": [ - "src/forkop/tabs/diagnostic/checks/runDnsCheck.ts:57" + "src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:57" ] }, { "call": "Bootstrap DNS Servers", "key": "Bootstrap DNS Servers", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:182" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:182" ] }, { "call": "Browser FakeIP check could not be completed", "key": "Browser FakeIP check could not be completed", "places": [ - "src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:51", - "src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:79" + "src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:51", + "src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:79" ] }, { "call": "Browser is not using FakeIP", "key": "Browser is not using FakeIP", "places": [ - "src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:82" + "src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:82" ] }, { "call": "Browser is using FakeIP correctly", "key": "Browser is using FakeIP correctly", "places": [ - "src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:81" + "src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:81" ] }, { "call": "Built-in rule sets", "key": "Built-in rule sets", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7341" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7341" ] }, { "call": "By flag emoji from name", "key": "By flag emoji from name", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1706" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1706" ] }, { - "call": "ByeDPI listen address and port are assigned by Forkop and must not be set in the strategy.", - "key": "ByeDPI listen address and port are assigned by Forkop and must not be set in the strategy.", + "call": "ByeDPI listen address and port are assigned by Tachyon and must not be set in the strategy.", + "key": "ByeDPI listen address and port are assigned by Tachyon and must not be set in the strategy.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5893" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5893" ] }, { "call": "ByeDPI option does not accept a compact value: %s", "key": "ByeDPI option does not accept a compact value: %s", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6070" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6070" ] }, { "call": "ByeDPI option does not accept a value: %s", "key": "ByeDPI option does not accept a value: %s", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5999" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5999" ] }, { "call": "ByeDPI option requires a value: %s", "key": "ByeDPI option requires a value: %s", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5991", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6017", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6051", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6060" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5991", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6017", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6051", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6060" ] }, { "call": "ByeDPI package is installed", "key": "ByeDPI package is installed", "places": [ - "src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:71" + "src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:71" ] }, { "call": "ByeDPI package is not installed", "key": "ByeDPI package is not installed", "places": [ - "src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:72" + "src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:72" ] }, { "call": "ByeDPI provider binary is available", "key": "ByeDPI provider binary is available", "places": [ - "src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:64" + "src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:64" ] }, { "call": "ByeDPI provider binary is not available", "key": "ByeDPI provider binary is not available", "places": [ - "src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:65" + "src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:65" ] }, { "call": "ByeDPI sing-box outbound is configured", "key": "ByeDPI sing-box outbound is configured", "places": [ - "src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:107" + "src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:107" ] }, { "call": "ByeDPI sing-box outbound is not configured", "key": "ByeDPI sing-box outbound is not configured", "places": [ - "src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:108" + "src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:108" ] }, { "call": "ByeDPI Strategy", "key": "ByeDPI Strategy", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6804" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6804" ] }, { "call": "ByeDPI strategy cannot be empty", "key": "ByeDPI strategy cannot be empty", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6096" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6096" ] }, { "call": "Cache File Path", "key": "Cache File Path", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:623" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:623" ] }, { "call": "Cache file path cannot be empty", "key": "Cache file path cannot be empty", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:637" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:637" ] }, { "call": "Cannot receive checks result", "key": "Cannot receive checks result", "places": [ - "src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:26", - "src/forkop/tabs/diagnostic/checks/runDnsCheck.ts:27", - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:172", - "src/forkop/tabs/diagnostic/checks/runNftCheck.ts:28", - "src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts:48", - "src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:25", - "src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:26", - "src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:26" + "src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:26", + "src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:27", + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:172", + "src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:28", + "src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:48", + "src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:25", + "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:26", + "src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:26" ] }, { "call": "Cannot save server", "key": "Cannot save server", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2241" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2241" ] }, { "call": "Cascade connection", "key": "Cascade connection", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7072" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7072" ] }, { "call": "Certificate path", "key": "Certificate path", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2655" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2655" ] }, { "call": "Certificate pin is unavailable. Apply or restart the server to generate the default certificate, then open this dialog again.", "key": "Certificate pin is unavailable. Apply or restart the server to generate the default certificate, then open this dialog again.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1598" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1598" ] }, { "call": "Check interval", "key": "Check interval", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2301", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2769", - "src/forkop/tabs/dashboard/initController.ts:1142" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2301", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2769", + "src/tachyon/tabs/dashboard/initController.ts:1142" ] }, { "call": "Check timeout after which the server is considered dead", "key": "Check timeout after which the server is considered dead", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2782" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2782" ] }, { "call": "Check update", "key": "Check update", "places": [ - "src/forkop/tabs/updates/initController.ts:740" + "src/tachyon/tabs/updates/initController.ts:740" ] }, { "call": "Check URL", "key": "Check URL", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2327", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2756", - "src/forkop/tabs/dashboard/initController.ts:1140" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2327", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2756", + "src/tachyon/tabs/dashboard/initController.ts:1140" ] }, { "call": "Checking, please wait", "key": "Checking, please wait", "places": [ - "src/forkop/tabs/diagnostic/initController.ts:1022", - "src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:14", - "src/forkop/tabs/diagnostic/checks/runDnsCheck.ts:15", - "src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:15", - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:160", - "src/forkop/tabs/diagnostic/checks/runNftCheck.ts:13", - "src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts:34", - "src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:13", - "src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:14", - "src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:14" + "src/tachyon/tabs/diagnostic/initController.ts:1022", + "src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:14", + "src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:15", + "src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:15", + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:160", + "src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:13", + "src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:34", + "src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:13", + "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:14", + "src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:14" ] }, { "call": "checks", "key": "checks", "places": [ - "src/forkop/tabs/diagnostic/helpers/getCheckTitle.ts:2" + "src/tachyon/tabs/diagnostic/helpers/getCheckTitle.ts:2" ] }, { "call": "Checks failed", "key": "Checks failed", "places": [ - "src/forkop/tabs/diagnostic/checks/getCheckItemsMeta.ts:10", - "src/forkop/tabs/diagnostic/helpers/getMeta.ts:26" + "src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:10", + "src/tachyon/tabs/diagnostic/helpers/getMeta.ts:26" ] }, { "call": "Checks passed", "key": "Checks passed", "places": [ - "src/forkop/tabs/diagnostic/checks/getCheckItemsMeta.ts:23", - "src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:43", - "src/forkop/tabs/diagnostic/helpers/getMeta.ts:13" + "src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:23", + "src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:43", + "src/tachyon/tabs/diagnostic/helpers/getMeta.ts:13" ] }, { "call": "Checks passed with manual DHCP", "key": "Checks passed with manual DHCP", "places": [ - "src/forkop/tabs/diagnostic/checks/getDnsCheckPresentation.ts:27" + "src/tachyon/tabs/diagnostic/checks/getDnsCheckPresentation.ts:27" ] }, { @@ -655,163 +655,163 @@ "call": "Client fingerprint", "key": "Client fingerprint", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2753" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2753" ] }, { "call": "Client link", "key": "Client link", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1670" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1670" ] }, { "call": "Client link is not available yet", "key": "Client link is not available yet", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1578" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1578" ] }, { "call": "Client link QR code", "key": "Client link QR code", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1611" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1611" ] }, { "call": "Close", "key": "Close", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3071", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1718", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3071", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1718", "src/partials/modal/renderModal.ts:263", - "src/forkop/tabs/dashboard/initController.ts:1027", - "src/forkop/tabs/dashboard/initController.ts:1283", - "src/forkop/tabs/monitoring/initController.ts:832", - "src/forkop/tabs/monitoring/initController.ts:882" + "src/tachyon/tabs/dashboard/initController.ts:1027", + "src/tachyon/tabs/dashboard/initController.ts:1283", + "src/tachyon/tabs/monitoring/initController.ts:832", + "src/tachyon/tabs/monitoring/initController.ts:882" ] }, { "call": "Close all connections", "key": "Close all connections", "places": [ - "src/forkop/tabs/monitoring/render.ts:58", - "src/forkop/tabs/monitoring/render.ts:59" + "src/tachyon/tabs/monitoring/render.ts:58", + "src/tachyon/tabs/monitoring/render.ts:59" ] }, { "call": "Close connection", "key": "Close connection", "places": [ - "src/forkop/tabs/monitoring/initController.ts:799", - "src/forkop/tabs/monitoring/initController.ts:800" + "src/tachyon/tabs/monitoring/initController.ts:799", + "src/tachyon/tabs/monitoring/initController.ts:800" ] }, { "call": "Closed", "key": "Closed", "places": [ - "src/forkop/tabs/monitoring/initController.ts:674", - "src/forkop/tabs/monitoring/render.ts:29" + "src/tachyon/tabs/monitoring/initController.ts:674", + "src/tachyon/tabs/monitoring/render.ts:29" ] }, { "call": "Component update available", "key": "Component update available", "places": [ - "src/forkop/services/core.service.ts:43" + "src/tachyon/services/core.service.ts:43" ] }, { "call": "Component update check interval", "key": "Component update check interval", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:510" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:510" ] }, { "call": "Components", "key": "Components", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:473" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:473" ] }, { "call": "compressed", "key": "compressed", "places": [ - "src/forkop/helpers/singBoxVariant.ts:51" + "src/tachyon/helpers/singBoxVariant.ts:51" ] }, { "call": "Concurrency", "key": "Concurrency", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2988" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2988" ] }, { "call": "Conditions", "key": "Conditions", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6591" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6591" ] }, { "call": "Config File Path", "key": "Config File Path", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:610" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:610" ] }, { - "call": "Configuration for Forkop service", - "key": "Configuration for Forkop service", + "call": "Configuration for Tachyon service", + "key": "Configuration for Tachyon service", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:343" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:343" ] }, { "call": "Configure User-Agent in the item settings", "key": "Configure User-Agent in the item settings", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4063" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4063" ] }, { "call": "Connect through", "key": "Connect through", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7110" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7110" ] }, { "call": "Connection URL", "key": "Connection URL", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6842" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6842" ] }, { "call": "Connections are unavailable", "key": "Connections are unavailable", "places": [ - "src/forkop/tabs/monitoring/initController.ts:946" + "src/tachyon/tabs/monitoring/initController.ts:946" ] }, { "call": "Connectivity probe failed", "key": "Connectivity probe failed", "places": [ - "src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts:145" + "src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:145" ] }, { "call": "Copied", "key": "Copied", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1565", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1565", "src/helpers/copyToClipboard.ts:10" ] }, @@ -819,7 +819,7 @@ "call": "Copy", "key": "Copy", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1694", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1694", "src/partials/modal/renderModal.ts:258" ] }, @@ -827,95 +827,95 @@ "call": "Copy proxy link", "key": "Copy proxy link", "places": [ - "src/forkop/tabs/dashboard/initController.ts:997", - "src/forkop/tabs/dashboard/initController.ts:1253", - "src/forkop/tabs/dashboard/partials/renderSections.ts:366", - "src/forkop/tabs/dashboard/partials/renderSections.ts:367" + "src/tachyon/tabs/dashboard/initController.ts:997", + "src/tachyon/tabs/dashboard/initController.ts:1253", + "src/tachyon/tabs/dashboard/partials/renderSections.ts:366", + "src/tachyon/tabs/dashboard/partials/renderSections.ts:367" ] }, { "call": "Could not compare FakeIP and control public IPs", "key": "Could not compare FakeIP and control public IPs", "places": [ - "src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:89" + "src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:89" ] }, { "call": "Current section cannot be used as its own transit section", "key": "Current section cannot be used as its own transit section", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7127" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7127" ] }, { "call": "Current section cannot download its own subscription", "key": "Current section cannot download its own subscription", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2122" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2122" ] }, { "call": "Currently unavailable", "key": "Currently unavailable", "places": [ - "src/forkop/tabs/dashboard/partials/renderWidget.ts:22" + "src/tachyon/tabs/dashboard/partials/renderWidget.ts:22" ] }, { "call": "Custom outbound configurations in JSON format", "key": "Custom outbound configurations in JSON format", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6953" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6953" ] }, { "call": "Dashboard", "key": "Dashboard", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:449" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:449" ] }, { "call": "Dashboard currently unavailable", "key": "Dashboard currently unavailable", "places": [ - "src/forkop/tabs/dashboard/partials/renderSections.ts:47" + "src/tachyon/tabs/dashboard/partials/renderSections.ts:47" ] }, { "call": "Default address for checking server availability and latency. URLTest uses its own address.", "key": "Default address for checking server availability and latency. URLTest uses its own address.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:546" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:546" ] }, { - "call": "Delay in milliseconds before reloading Forkop after interface UP", - "key": "Delay in milliseconds before reloading Forkop after interface UP", + "call": "Delay in milliseconds before reloading Tachyon after interface UP", + "key": "Delay in milliseconds before reloading Tachyon after interface UP", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:398" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:398" ] }, { "call": "Delay value cannot be empty", "key": "Delay value cannot be empty", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:405" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:405" ] }, { "call": "Delete", "key": "Delete", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1745" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1745" ] }, { "call": "Detect server country", "key": "Detect server country", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2394", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2600" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2394", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2600" ] }, { @@ -929,168 +929,168 @@ "call": "Device filter", "key": "Device filter", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7507" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7507" ] }, { "call": "Device or IP", "key": "Device or IP", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6359" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6359" ] }, { "call": "DHCP has DNS server", "key": "DHCP has DNS server", "places": [ - "src/forkop/tabs/diagnostic/checks/getDnsCheckPresentation.ts:37" + "src/tachyon/tabs/diagnostic/checks/getDnsCheckPresentation.ts:37" ] }, { "call": "DHCP is managed manually", "key": "DHCP is managed manually", "places": [ - "src/forkop/tabs/diagnostic/checks/getDnsCheckPresentation.ts:36" + "src/tachyon/tabs/diagnostic/checks/getDnsCheckPresentation.ts:36" ] }, { "call": "Diagnostics", "key": "Diagnostics", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:437" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:437" ] }, { "call": "Direct", "key": "Direct", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2563" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2563" ] }, { "call": "Direct connection", "key": "Direct connection", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2577" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2577" ] }, { "call": "Disable autostart", "key": "Disable autostart", "places": [ - "src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:79" + "src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:79" ] }, { "call": "Disable QUIC", "key": "Disable QUIC", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:445" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:445" ] }, { "call": "Disable the QUIC protocol to improve compatibility or fix issues with video streaming", "key": "Disable the QUIC protocol to improve compatibility or fix issues with video streaming", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:446" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:446" ] }, { - "call": "Disabling interception is incompatible with action=zapret2 because Forkop sends matched traffic through NFQUEUE.", - "key": "Disabling interception is incompatible with action=zapret2 because Forkop sends matched traffic through NFQUEUE.", + "call": "Disabling interception is incompatible with action=zapret2 because Tachyon sends matched traffic through NFQUEUE.", + "key": "Disabling interception is incompatible with action=zapret2 because Tachyon sends matched traffic through NFQUEUE.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5494" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5494" ] }, { "call": "Display name", "key": "Display name", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2283", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2745" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2283", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2745" ] }, { "call": "DNS Check Interval", "key": "DNS Check Interval", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:196" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:196" ] }, { "call": "DNS on router", "key": "DNS on router", "places": [ - "src/forkop/tabs/diagnostic/checks/runDnsCheck.ts:75" + "src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:75" ] }, { "call": "DNS over HTTPS (DoH)", "key": "DNS over HTTPS (DoH)", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1574", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:163" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1574", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:163" ] }, { "call": "DNS over TLS (DoT)", "key": "DNS over TLS (DoT)", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1575", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:164" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1575", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:164" ] }, { "call": "DNS protocol", "key": "DNS protocol", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2250", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6653" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2250", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6653" ] }, { "call": "DNS Protocol Type", "key": "DNS Protocol Type", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:160" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:160" ] }, { "call": "DNS protocol used by the resolver", "key": "DNS protocol used by the resolver", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2251", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6654" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2251", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6654" ] }, { "call": "DNS requests through section", "key": "DNS requests through section", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6697", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:259" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6697", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:259" ] }, { "call": "DNS Rewrite TTL", "key": "DNS Rewrite TTL", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:222" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:222" ] }, { "call": "DNS server", "key": "DNS server", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2260", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6666" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2260", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6666" ] }, { "call": "DNS server address cannot be empty", "key": "DNS server address cannot be empty", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6675", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6675", "src/validators/validateDns.ts:8" ] }, @@ -1098,142 +1098,142 @@ "call": "DNS server used by the resolver", "key": "DNS server used by the resolver", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2261", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6667" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2261", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6667" ] }, { "call": "DNS server used to obtain IP addresses for upstream DNS and proxies. If multiple servers are selected, a timeout switches to a backup.", "key": "DNS server used to obtain IP addresses for upstream DNS and proxies. If multiple servers are selected, a timeout switches to a backup.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:183" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:183" ] }, { "call": "DNS Servers", "key": "DNS Servers", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:172" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:172" ] }, { "call": "DNS Strategy", "key": "DNS Strategy", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:240" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:240" ] }, { "call": "DNS through proxy", "key": "DNS through proxy", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:251" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:251" ] }, { "call": "DNS through section", "key": "DNS through section", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6685" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6685" ] }, { "call": "DNS Unavailability Timeout", "key": "DNS Unavailability Timeout", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:212" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:212" ] }, { "call": "Do not panic, everything can be fixed, just...", "key": "Do not panic, everything can be fixed, just...", "places": [ - "src/forkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts:26" + "src/tachyon/tabs/diagnostic/partials/renderWikiDisclaimer.ts:26" ] }, { "call": "Do not test servers from these countries.", "key": "Do not test servers from these countries.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2467" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2467" ] }, { "call": "Do not test servers whose names match the expression.", "key": "Do not test servers whose names match the expression.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2483" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2483" ] }, { "call": "Do not test servers with one of the selected protocols.", "key": "Do not test servers with one of the selected protocols.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2428" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2428" ] }, { "call": "Do not test servers with one of the selected security types.", "key": "Do not test servers with one of the selected security types.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2434" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2434" ] }, { "call": "Do not test servers with one of the selected transports.", "key": "Do not test servers with one of the selected transports.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2431" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2431" ] }, { "call": "Do not test specified servers.", "key": "Do not test specified servers.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2475" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2475" ] }, { "call": "Does not resolve", "key": "Does not resolve", "places": [ - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:54" + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:54" ] }, { "call": "Domain lists", "key": "Domain lists", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7492" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7492" ] }, { "call": "Domain Resolver", "key": "Domain Resolver", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2241" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2241" ] }, { "call": "Domains", "key": "Domains", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7302" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7302" ] }, { "call": "Dont Touch My DHCP!", "key": "Dont Touch My DHCP!", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:601" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:601" ] }, { "call": "Downlink", "key": "Downlink", "places": [ - "src/forkop/tabs/dashboard/initController.ts:1559", - "src/forkop/tabs/dashboard/initController.ts:1597" + "src/tachyon/tabs/dashboard/initController.ts:1559", + "src/tachyon/tabs/dashboard/initController.ts:1597" ] }, { @@ -1247,78 +1247,78 @@ "call": "Download component packages via the selected section", "key": "Download component packages via the selected section", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:582" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:582" ] }, { "call": "Download components through", "key": "Download components through", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:589" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:589" ] }, { "call": "Download components through a section", "key": "Download components through a section", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:581" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:581" ] }, { "call": "Download lists through", "key": "Download lists through", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:569" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:569" ] }, { "call": "Download lists through a section", "key": "Download lists through a section", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:561" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:561" ] }, { "call": "Download remote lists and rule sets via the selected section", "key": "Download remote lists and rule sets via the selected section", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:562" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:562" ] }, { "call": "Download subscription through a section", "key": "Download subscription through a section", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2096" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2096" ] }, { "call": "Download subscriptions via the selected section", "key": "Download subscriptions via the selected section", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2097" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2097" ] }, { "call": "Download through", "key": "Download through", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2105" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2105" ] }, { "call": "Downloaded", "key": "Downloaded", "places": [ - "src/forkop/tabs/monitoring/initController.ts:825", - "src/forkop/tabs/monitoring/initController.ts:879" + "src/tachyon/tabs/monitoring/initController.ts:825", + "src/tachyon/tabs/monitoring/initController.ts:879" ] }, { "call": "Drag rows to change priority. The rule at the top is checked first.", "key": "Drag rows to change priority. The rule at the top is checked first.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:391" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:391" ] }, { @@ -1332,280 +1332,280 @@ "call": "Duplicate value", "key": "Duplicate value", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4158", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4173", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4193" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4158", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4173", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4193" ] }, { "call": "Edit rule action", "key": "Edit rule action", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:68", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1738" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1738", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:68" ] }, { "call": "Enable", "key": "Enable", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6593", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2480" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6593", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2480" ] }, { "call": "Enable authentication", "key": "Enable authentication", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2840" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2840" ] }, { "call": "Enable automatic updates for remote lists and rule sets", "key": "Enable automatic updates for remote lists and rule sets", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:457" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:457" ] }, { "call": "Enable autostart", "key": "Enable autostart", "places": [ - "src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:89" + "src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:89" ] }, { "call": "Enable built-in DNS resolver for domains handled by this section", "key": "Enable built-in DNS resolver for domains handled by this section", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2242" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2242" ] }, { "call": "Enable list updates", "key": "Enable list updates", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:456" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:456" ] }, { "call": "Enable Mixed Proxy", "key": "Enable Mixed Proxy", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7148" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7148" ] }, { "call": "Enable Mixed Proxy Authentication", "key": "Enable Mixed Proxy Authentication", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7189" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7189" ] }, { "call": "Enable Output Network Interface", "key": "Enable Output Network Interface", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:304" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:304" ] }, { "call": "Enable YACD", "key": "Enable YACD", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:413" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:413" ] }, { "call": "Enable YACD WAN Access", "key": "Enable YACD WAN Access", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:422" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:422" ] }, { "call": "Enter a complete sing-box inbound object", "key": "Enter a complete sing-box inbound object", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2586" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2586" ] }, { "call": "Enter a complete sing-box outbound object", "key": "Enter a complete sing-box outbound object", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3405" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3405" ] }, { "call": "Enter a display name", "key": "Enter a display name", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2295", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2750", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3360", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3376" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2295", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2750", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3360", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3376" ] }, { "call": "Enter a level name", "key": "Enter a level name", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2550", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2571" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2550", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2571" ] }, { "call": "Enter a valid DNS server address", "key": "Enter a valid DNS server address", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6678" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6678" ] }, { "call": "Enter HWID", "key": "Enter HWID", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2179" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2179" ] }, { "call": "Enter the HWID sent with subscription requests", "key": "Enter the HWID sent with subscription requests", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2171" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2171" ] }, { "call": "Enter the subscription URL", "key": "Enter the subscription URL", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6865" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6865" ] }, { "call": "Exclude by proxy parameters", "key": "Exclude by proxy parameters", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2423", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2630" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2423", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2630" ] }, { "call": "Exclude by regular expression", "key": "Exclude by regular expression", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2482", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2692" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2482", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2692" ] }, { "call": "Exclude countries", "key": "Exclude countries", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2466", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2676" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2466", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2676" ] }, { "call": "Exclude NTP", "key": "Exclude NTP", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:675" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:675" ] }, { "call": "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN", "key": "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:676" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:676" ] }, { "call": "Exclude servers", "key": "Exclude servers", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2474", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2684" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2474", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2684" ] }, { "call": "Exclude servers with one of the selected protocols from this level.", "key": "Exclude servers with one of the selected protocols from this level.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2638" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2638" ] }, { "call": "Exclude servers with one of the selected security types from this level.", "key": "Exclude servers with one of the selected security types from this level.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2644" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2644" ] }, { "call": "Exclude servers with one of the selected transports from this level.", "key": "Exclude servers with one of the selected transports from this level.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2641" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2641" ] }, { "call": "Expecting: %s", "key": "Expecting: %s", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:54" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:54" ] }, { "call": "Expires", "key": "Expires", "places": [ - "src/forkop/tabs/dashboard/partials/renderSections.ts:134" + "src/tachyon/tabs/dashboard/partials/renderSections.ts:134" ] }, { "call": "Expose this section as a local HTTP+SOCKS proxy", "key": "Expose this section as a local HTTP+SOCKS proxy", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7149" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7149" ] }, { - "call": "External nfqws config files bypass Forkop queue management and explicit validation.", - "key": "External nfqws config files bypass Forkop queue management and explicit validation.", + "call": "External nfqws config files bypass Tachyon queue management and explicit validation.", + "key": "External nfqws config files bypass Tachyon queue management and explicit validation.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5028" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5028" ] }, { - "call": "External nfqws2 config files bypass Forkop queue management and explicit validation.", - "key": "External nfqws2 config files bypass Forkop queue management and explicit validation.", + "call": "External nfqws2 config files bypass Tachyon queue management and explicit validation.", + "key": "External nfqws2 config files bypass Tachyon queue management and explicit validation.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5473" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5473" ] }, { "call": "Failed to close connection", "key": "Failed to close connection", "places": [ - "src/forkop/tabs/monitoring/initController.ts:1213", - "src/forkop/tabs/monitoring/initController.ts:1228" + "src/tachyon/tabs/monitoring/initController.ts:1213", + "src/tachyon/tabs/monitoring/initController.ts:1228" ] }, { "call": "Failed to close connections", "key": "Failed to close connections", "places": [ - "src/forkop/tabs/monitoring/initController.ts:1247", - "src/forkop/tabs/monitoring/initController.ts:1260" + "src/tachyon/tabs/monitoring/initController.ts:1247", + "src/tachyon/tabs/monitoring/initController.ts:1260" ] }, { "call": "Failed to copy!", "key": "Failed to copy!", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1567", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1567", "src/helpers/copyToClipboard.ts:12" ] }, @@ -1613,349 +1613,216 @@ "call": "Failed to execute", "key": "Failed to execute", "places": [ - "src/forkop/methods/shell/index.ts:170", - "src/forkop/methods/shell/index.ts:177", - "src/forkop/tabs/updates/initController.ts:508", - "src/forkop/tabs/updates/initController.ts:509", - "src/forkop/tabs/updates/initController.ts:569", - "src/forkop/tabs/updates/initController.ts:719" + "src/tachyon/methods/shell/index.ts:170", + "src/tachyon/methods/shell/index.ts:177", + "src/tachyon/tabs/updates/initController.ts:508", + "src/tachyon/tabs/updates/initController.ts:509", + "src/tachyon/tabs/updates/initController.ts:569", + "src/tachyon/tabs/updates/initController.ts:719" ] }, { "call": "Failed to update subscriptions", "key": "Failed to update subscriptions", "places": [ - "src/forkop/tabs/dashboard/initController.ts:275", - "src/forkop/tabs/dashboard/initController.ts:276", - "src/forkop/tabs/dashboard/initController.ts:295", - "src/forkop/tabs/dashboard/initController.ts:341", - "src/forkop/tabs/dashboard/initController.ts:345", - "src/forkop/tabs/dashboard/initController.ts:1341", - "src/forkop/tabs/dashboard/initController.ts:1345" + "src/tachyon/tabs/dashboard/initController.ts:275", + "src/tachyon/tabs/dashboard/initController.ts:276", + "src/tachyon/tabs/dashboard/initController.ts:295", + "src/tachyon/tabs/dashboard/initController.ts:341", + "src/tachyon/tabs/dashboard/initController.ts:345", + "src/tachyon/tabs/dashboard/initController.ts:1341", + "src/tachyon/tabs/dashboard/initController.ts:1345" ] }, { "call": "FakeIP and control checks use different public IPs", "key": "FakeIP and control checks use different public IPs", "places": [ - "src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:91" + "src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:91" ] }, { "call": "FakeIP and control checks use the same public IP", "key": "FakeIP and control checks use the same public IP", "places": [ - "src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:92" + "src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:92" ] }, { "call": "FakeIP works; public IP comparison is inconclusive", "key": "FakeIP works; public IP comparison is inconclusive", "places": [ - "src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:46" + "src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:46" ] }, { "call": "FakeTLS host", "key": "FakeTLS host", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2963" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2963" ] }, { "call": "Fallback on unknown DC", "key": "Fallback on unknown DC", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3045" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3045" ] }, { "call": "Faster server search interval", "key": "Faster server search interval", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2829", - "src/forkop/tabs/dashboard/initController.ts:1161" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2829", + "src/tachyon/tabs/dashboard/initController.ts:1161" ] }, { "call": "Fastest", "key": "Fastest", "places": [ - "src/forkop/methods/custom/getDashboardSections.ts:646" + "src/tachyon/methods/custom/getDashboardSections.ts:646" ] }, { "call": "Firewall WAN port", "key": "Firewall WAN port", "places": [ - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:136" + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:136" ] }, { "call": "Fix the highlighted fields and save again.", "key": "Fix the highlighted fields and save again.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2242" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2242" ] }, { "call": "Forced device routing", "key": "Forced device routing", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7516" - ] - }, - { - "call": "Forkop Error", - "key": "Forkop Error", - "places": [ - "src/forkop/services/core.service.ts:52" - ] - }, - { - "call": "Forkop manages ciadpi pid files itself, so pidfile options are not allowed here.", - "key": "Forkop manages ciadpi pid files itself, so pidfile options are not allowed here.", - "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5902" - ] - }, - { - "call": "Forkop manages the ciadpi process lifecycle itself, so daemon mode is not allowed here.", - "key": "Forkop manages the ciadpi process lifecycle itself, so daemon mode is not allowed here.", - "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5899" - ] - }, - { - "call": "Forkop manages the nfqws process lifecycle itself, so daemon mode is not allowed here.", - "key": "Forkop manages the nfqws process lifecycle itself, so daemon mode is not allowed here.", - "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5046" - ] - }, - { - "call": "Forkop manages the nfqws2 process lifecycle itself, so daemon mode is not allowed here.", - "key": "Forkop manages the nfqws2 process lifecycle itself, so daemon mode is not allowed here.", - "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5497" - ] - }, - { - "call": "Forkop service is stopped. Start the service to display connections.", - "key": "Forkop service is stopped. Start the service to display connections.", - "places": [ - "src/forkop/tabs/monitoring/initController.ts:925" - ] - }, - { - "call": "Forkop service is stopped. Start the service to display the dashboard.", - "key": "Forkop service is stopped. Start the service to display the dashboard.", - "places": [ - "src/forkop/tabs/dashboard/render.ts:17" - ] - }, - { - "call": "Forkop Settings", - "key": "Forkop Settings", - "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:342" - ] - }, - { - "call": "Forkop will not modify your DHCP configuration", - "key": "Forkop will not modify your DHCP configuration", - "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:602" - ] - }, - { - "call": "Forkop-managed ciadpi runtime has restarted", - "key": "Forkop-managed ciadpi runtime has restarted", - "places": [ - "src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:91" - ] - }, - { - "call": "Forkop-managed ciadpi runtime is not ready", - "key": "Forkop-managed ciadpi runtime is not ready", - "places": [ - "src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:94" - ] - }, - { - "call": "Forkop-managed ciadpi runtime is not running", - "key": "Forkop-managed ciadpi runtime is not running", - "places": [ - "src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:97" - ] - }, - { - "call": "Forkop-managed ciadpi runtime is ready", - "key": "Forkop-managed ciadpi runtime is ready", - "places": [ - "src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:93" - ] - }, - { - "call": "Forkop-managed nfqws runtime is not ready", - "key": "Forkop-managed nfqws runtime is not ready", - "places": [ - "src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:87" - ] - }, - { - "call": "Forkop-managed nfqws runtime is not running", - "key": "Forkop-managed nfqws runtime is not running", - "places": [ - "src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:90" - ] - }, - { - "call": "Forkop-managed nfqws runtime is ready", - "key": "Forkop-managed nfqws runtime is ready", - "places": [ - "src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:86" - ] - }, - { - "call": "Forkop-managed nfqws2 runtime is not ready", - "key": "Forkop-managed nfqws2 runtime is not ready", - "places": [ - "src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:90" - ] - }, - { - "call": "Forkop-managed nfqws2 runtime is not running", - "key": "Forkop-managed nfqws2 runtime is not running", - "places": [ - "src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:93" - ] - }, - { - "call": "Forkop-managed nfqws2 runtime is ready", - "key": "Forkop-managed nfqws2 runtime is ready", - "places": [ - "src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:89" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7516" ] }, { "call": "Fronting IP", "key": "Fronting IP", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3008" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3008" ] }, { "call": "Fronting port", "key": "Fronting port", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2997" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2997" ] }, { "call": "Fronting proxy protocol", "key": "Fronting proxy protocol", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3018" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3018" ] }, { - "call": "Fuzzing is not supported here because Forkop needs deterministic runtime validation.", - "key": "Fuzzing is not supported here because Forkop needs deterministic runtime validation.", + "call": "Fuzzing is not supported here because Tachyon needs deterministic runtime validation.", + "key": "Fuzzing is not supported here because Tachyon needs deterministic runtime validation.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5491" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5491" ] }, { "call": "Generate HWID from router hardware information for this subscription", "key": "Generate HWID from router hardware information for this subscription", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2162" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2162" ] }, { "call": "Generated inbound", "key": "Generated inbound", "places": [ - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:89" + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:89" ] }, { "call": "Get global check", "key": "Get global check", "places": [ - "src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:98" + "src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:98" ] }, { "call": "Global check", "key": "Global check", "places": [ - "src/forkop/tabs/diagnostic/initController.ts:682" + "src/tachyon/tabs/diagnostic/initController.ts:682" ] }, { "call": "gRPC service", "key": "gRPC service", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2820" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2820" ] }, { "call": "Handshake timeout", "key": "Handshake timeout", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3073" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3073" ] }, { "call": "Hide added servers", "key": "Hide added servers", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2374", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2863" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2374", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2863" ] }, { "call": "Hide cascade connection nodes", "key": "Hide cascade connection nodes", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2230" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2230" ] }, { "call": "Hide dashboard servers added to Priority", "key": "Hide dashboard servers added to Priority", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2864" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2864" ] }, { "call": "Hide dashboard servers added to URLTest", "key": "Hide dashboard servers added to URLTest", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2375" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2375" ] }, { "call": "Hide individual nodes that are already included in imported subscription URLTest groups", "key": "Hide individual nodes that are already included in imported subscription URLTest groups", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2219" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2219" ] }, { "call": "Hide intermediate nodes used as detours by other subscription nodes", "key": "Hide intermediate nodes used as detours by other subscription nodes", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2231" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2231" ] }, { "call": "Hide URLTest group nodes", "key": "Hide URLTest group nodes", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2218" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2218" ] }, { @@ -1969,243 +1836,243 @@ "call": "Higher-level check interval", "key": "Higher-level check interval", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2793", - "src/forkop/tabs/dashboard/initController.ts:1147" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2793", + "src/tachyon/tabs/dashboard/initController.ts:1147" ] }, { "call": "Higher-priority DNS Check", "key": "Higher-priority DNS Check", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:204" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:204" ] }, { "call": "Host", "key": "Host", "places": [ - "src/forkop/tabs/monitoring/initController.ts:815", - "src/forkop/tabs/monitoring/initController.ts:875" + "src/tachyon/tabs/monitoring/initController.ts:815", + "src/tachyon/tabs/monitoring/initController.ts:875" ] }, { "call": "How often higher priority levels are checked while a lower level is active", "key": "How often higher priority levels are checked while a lower level is active", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2794" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2794" ] }, { "call": "How often the currently selected server is checked", "key": "How often the currently selected server is checked", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2770" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2770" ] }, { "call": "How often to check the active DNS servers.", "key": "How often to check the active DNS servers.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:197" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:197" ] }, { "call": "How often to check whether a higher-priority DNS server has recovered.", "key": "How often to check whether a higher-priority DNS server has recovered.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:205" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:205" ] }, { "call": "HTTP error", "key": "HTTP error", "places": [ - "src/forkop/api.ts:27" + "src/tachyon/api.ts:27" ] }, { "call": "HTTP hosts", "key": "HTTP hosts", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2813" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2813" ] }, { "call": "HWID", "key": "HWID", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2170" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2170" ] }, { "call": "Idle timeout", "key": "Idle timeout", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2340", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3063", - "src/forkop/tabs/dashboard/initController.ts:916" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2340", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3063", + "src/tachyon/tabs/dashboard/initController.ts:916" ] }, { "call": "Import subscription URLTest groups", "key": "Import subscription URLTest groups", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2209" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2209" ] }, { "call": "Import URLTest groups returned by this subscription provider", "key": "Import URLTest groups returned by this subscription provider", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2210" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2210" ] }, { "call": "Inbound JSON", "key": "Inbound JSON", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2585" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2585" ] }, { "call": "Inbound JSON cannot be empty", "key": "Inbound JSON cannot be empty", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1971" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1971" ] }, { "call": "Inbound JSON must be an object with a type field", "key": "Inbound JSON must be an object with a type field", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1982" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1982" ] }, { "call": "Include by proxy parameters", "key": "Include by proxy parameters", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2406", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2612" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2406", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2612" ] }, { "call": "Include by regular expression", "key": "Include by regular expression", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2458", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2668" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2458", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2668" ] }, { "call": "Include countries", "key": "Include countries", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2442", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2652" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2442", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2652" ] }, { "call": "Include IP addresses and subnets", "key": "Include IP addresses and subnets", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3480" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3480" ] }, { "call": "Include servers", "key": "Include servers", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2450", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2660" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2450", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2660" ] }, { "call": "Information", "key": "Information", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1746" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1746" ] }, { "call": "Install", "key": "Install", "places": [ - "src/forkop/tabs/updates/initController.ts:754" + "src/tachyon/tabs/updates/initController.ts:754" ] }, { "call": "Install another build:", "key": "Install another build:", "places": [ - "src/forkop/tabs/updates/initController.ts:1159" + "src/tachyon/tabs/updates/initController.ts:1159" ] }, { "call": "Installed version is newer than release", "key": "Installed version is newer than release", "places": [ - "src/forkop/tabs/updates/initController.ts:291", - "src/forkop/tabs/updates/initController.ts:1017" + "src/tachyon/tabs/updates/initController.ts:291", + "src/tachyon/tabs/updates/initController.ts:1017" ] }, { "call": "Interface Monitoring", "key": "Interface Monitoring", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:365" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:365" ] }, { "call": "Interface Monitoring Delay", "key": "Interface Monitoring Delay", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:397" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:397" ] }, { "call": "Interface monitoring for Bad WAN", "key": "Interface monitoring for Bad WAN", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:366" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:366" ] }, { "call": "Interrupt existing connections", "key": "Interrupt existing connections", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2354", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2845", - "src/forkop/tabs/dashboard/initController.ts:918", - "src/forkop/tabs/dashboard/initController.ts:1167" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2354", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2845", + "src/tachyon/tabs/dashboard/initController.ts:918", + "src/tachyon/tabs/dashboard/initController.ts:1167" ] }, { "call": "Interrupt existing connections when priority failover switches server", "key": "Interrupt existing connections when priority failover switches server", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2846" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2846" ] }, { "call": "Interrupt existing connections when URLTest switches the selected server", "key": "Interrupt existing connections when URLTest switches the selected server", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2355" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2355" ] }, { "call": "Interval", "key": "Interval", "places": [ - "src/forkop/tabs/dashboard/initController.ts:914" + "src/tachyon/tabs/dashboard/initController.ts:914" ] }, { "call": "Invalid ByeDPI strategy", "key": "Invalid ByeDPI strategy", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6825" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6825" ] }, { @@ -2226,7 +2093,7 @@ "call": "Invalid domain address", "key": "Invalid domain address", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4701", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4701", "src/validators/validateDomain.ts:67", "src/validators/validateDomain.ts:73" ] @@ -2427,7 +2294,7 @@ "call": "Invalid JSON format", "key": "Invalid JSON format", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1984", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1984", "src/validators/validateOutboundJson.ts:58" ] }, @@ -2435,7 +2302,7 @@ "call": "Invalid NFQWS2 strategy", "key": "Invalid NFQWS2 strategy", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6782" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6782" ] }, { @@ -2449,7 +2316,7 @@ "call": "Invalid port number. Must be between 1 and 65535", "key": "Invalid port number. Must be between 1 and 65535", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7182", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7182", "src/validators/validateShadowsocksUrl.ts:93" ] }, @@ -2457,14 +2324,14 @@ "call": "Invalid port or range. Use 80 or 1000-2000", "key": "Invalid port or range. Use 80 or 1000-2000", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4850" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4850" ] }, { "call": "Invalid regular expression", "key": "Invalid regular expression", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3974" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3974" ] }, { @@ -2655,39 +2522,39 @@ "call": "IPs", "key": "IPs", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7331" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7331" ] }, { "call": "IPv4 only", "key": "IPv4 only", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:242" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:242" ] }, { "call": "IPv6 only", "key": "IPv6 only", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:244" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:244" ] }, { "call": "Issues detected", "key": "Issues detected", "places": [ - "src/forkop/tabs/diagnostic/checks/getCheckItemsMeta.ts:17", - "src/forkop/tabs/diagnostic/helpers/getMeta.ts:20" + "src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:17", + "src/tachyon/tabs/diagnostic/helpers/getMeta.ts:20" ] }, { "call": "JSON outbound", "key": "JSON outbound", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1034", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3404", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3640", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6952" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1034", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3404", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3640", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6952" ] }, { @@ -2722,588 +2589,588 @@ "call": "JSON outbound settings", "key": "JSON outbound settings", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3428" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3428" ] }, { "call": "Keep Priority before latency-sorted servers", "key": "Keep Priority before latency-sorted servers", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2855" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2855" ] }, { "call": "Keep URLTest before latency-sorted servers", "key": "Keep URLTest before latency-sorted servers", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2366" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2366" ] }, { "call": "Key path", "key": "Key path", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2670" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2670" ] }, { "call": "Keyword must not contain spaces or commas", "key": "Keyword must not contain spaces or commas", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3984" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3984" ] }, { "call": "Latency test failed", "key": "Latency test failed", "places": [ - "src/forkop/methods/shell/index.ts:462", - "src/forkop/methods/shell/index.ts:483" + "src/tachyon/methods/shell/index.ts:462", + "src/tachyon/methods/shell/index.ts:483" ] }, { "call": "Latency test URL", "key": "Latency test URL", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:545" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:545" ] }, { "call": "Latest version is installed", "key": "Latest version is installed", "places": [ - "src/forkop/tabs/updates/initController.ts:294", - "src/forkop/tabs/updates/initController.ts:1015" + "src/tachyon/tabs/updates/initController.ts:294", + "src/tachyon/tabs/updates/initController.ts:1015" ] }, { "call": "Latest version:", "key": "Latest version:", "places": [ - "src/forkop/tabs/updates/initController.ts:1017" + "src/tachyon/tabs/updates/initController.ts:1017" ] }, { "call": "Level", "key": "Level", "places": [ - "src/forkop/tabs/dashboard/initController.ts:1100" + "src/tachyon/tabs/dashboard/initController.ts:1100" ] }, { "call": "Level name", "key": "Level name", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2566" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2566" ] }, { "call": "List must be an HTTP(S) URL or a local .lst path", "key": "List must be an HTTP(S) URL or a local .lst path", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6524" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6524" ] }, { "call": "List Update Frequency", "key": "List Update Frequency", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:465" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:465" ] }, { "call": "Listen address", "key": "Listen address", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2535" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2535" ] }, { "call": "Listen port", "key": "Listen port", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2542" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2542" ] }, { "call": "Listening port", "key": "Listening port", "places": [ - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:125" + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:125" ] }, { "call": "Loading client link...", "key": "Loading client link...", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1703" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1703" ] }, { "call": "Loading connections", "key": "Loading connections", "places": [ - "src/forkop/tabs/monitoring/initController.ts:936", - "src/forkop/tabs/monitoring/render.ts:88" + "src/tachyon/tabs/monitoring/initController.ts:936", + "src/tachyon/tabs/monitoring/render.ts:88" ] }, { "call": "Loading...", "key": "Loading...", "places": [ - "src/forkop/tabs/updates/initController.ts:905", - "src/forkop/tabs/updates/initController.ts:916", - "src/forkop/tabs/updates/initController.ts:927", - "src/forkop/tabs/updates/initController.ts:940", - "src/forkop/tabs/updates/initController.ts:953" + "src/tachyon/tabs/updates/initController.ts:905", + "src/tachyon/tabs/updates/initController.ts:916", + "src/tachyon/tabs/updates/initController.ts:927", + "src/tachyon/tabs/updates/initController.ts:940", + "src/tachyon/tabs/updates/initController.ts:953" ] }, { "call": "Log Level", "key": "Log Level", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:659" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:659" ] }, { "call": "Main DNS", "key": "Main DNS", "places": [ - "src/forkop/tabs/diagnostic/checks/runDnsCheck.ts:67" + "src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:67" ] }, { "call": "Main DNS server. If multiple servers are selected, a timeout switches to a backup.", "key": "Main DNS server. If multiple servers are selected, a timeout switches to a backup.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:173" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:173" ] }, { "call": "Match destination IPs or subnets", "key": "Match destination IPs or subnets", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7332" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7332" ] }, { "call": "Match destination ports. Use a single port or a range", "key": "Match destination ports. Use a single port or a range", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7526" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7526" ] }, { "call": "Maximum time to wait for example.com to resolve during a DNS health check.", "key": "Maximum time to wait for example.com to resolve during a DNS health check.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:213" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:213" ] }, { "call": "Memory Usage", "key": "Memory Usage", "places": [ - "src/forkop/tabs/dashboard/initController.ts:1637" + "src/tachyon/tabs/dashboard/initController.ts:1637" ] }, { "call": "Method", "key": "Method", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2827" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2827" ] }, { "call": "Minimum latency difference in milliseconds that triggers switching to a faster server.", "key": "Minimum latency difference in milliseconds that triggers switching to a faster server.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2314" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2314" ] }, { "call": "Mixed Proxy Password", "key": "Mixed Proxy Password", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7240" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7240" ] }, { "call": "Mixed Proxy Port", "key": "Mixed Proxy Port", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7163" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7163" ] }, { "call": "Mixed Proxy Username", "key": "Mixed Proxy Username", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7204" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7204" ] }, { "call": "Monitored Interfaces", "key": "Monitored Interfaces", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:374" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:374" ] }, { "call": "Monitoring", "key": "Monitoring", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:461" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:461" ] }, { "call": "Must be a number in the range of 0 - 10000", "key": "Must be a number in the range of 0 - 10000", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1804", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1819" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1804", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1819" ] }, { "call": "Name displayed on the dashboard", "key": "Name displayed on the dashboard", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2284", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2746" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2284", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2746" ] }, { "call": "Name shown in the priority level list", "key": "Name shown in the priority level list", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2567" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2567" ] }, { "call": "Network Interface", "key": "Network Interface", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1619", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6912" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1619", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6912" ] }, { "call": "Network interface settings", "key": "Network interface settings", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3195" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3195" ] }, { "call": "New version %s is available for %s", "key": "New version %s is available for %s", "places": [ - "src/forkop/services/core.service.ts:38" + "src/tachyon/services/core.service.ts:38" ] }, { "call": "NFQUEUE range is available", "key": "NFQUEUE range is available", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:100", - "src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:97" + "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:100", + "src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:97" ] }, { "call": "NFQUEUE range overlaps with another rule", "key": "NFQUEUE range overlaps with another rule", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:99", - "src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:96" + "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:99", + "src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:96" ] }, { "call": "NFQWS Strategy", "key": "NFQWS Strategy", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6714" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6714" ] }, { "call": "NFQWS strategy cannot be empty", "key": "NFQWS strategy cannot be empty", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5158" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5158" ] }, { "call": "NFQWS2 Strategy", "key": "NFQWS2 Strategy", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6761" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6761" ] }, { "call": "NFQWS2 strategy cannot be empty", "key": "NFQWS2 strategy cannot be empty", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5632" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5632" ] }, { "call": "No", "key": "No", "places": [ - "src/forkop/tabs/dashboard/initController.ts:762", - "src/forkop/tabs/dashboard/initController.ts:766", - "src/forkop/tabs/dashboard/initController.ts:842", - "src/forkop/tabs/dashboard/initController.ts:1055" + "src/tachyon/tabs/dashboard/initController.ts:762", + "src/tachyon/tabs/dashboard/initController.ts:766", + "src/tachyon/tabs/dashboard/initController.ts:842", + "src/tachyon/tabs/dashboard/initController.ts:1055" ] }, { "call": "No active connections", "key": "No active connections", "places": [ - "src/forkop/tabs/monitoring/initController.ts:960" + "src/tachyon/tabs/monitoring/initController.ts:960" ] }, { "call": "No closed connections", "key": "No closed connections", "places": [ - "src/forkop/tabs/monitoring/initController.ts:961" + "src/tachyon/tabs/monitoring/initController.ts:961" ] }, { "call": "No conflict detected", "key": "No conflict detected", "places": [ - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:32" + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:32" ] }, { "call": "No enabled server inbounds configured", "key": "No enabled server inbounds configured", "places": [ - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:187" + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:187" ] }, { "call": "No other marking rules found", "key": "No other marking rules found", "places": [ - "src/forkop/tabs/diagnostic/checks/runNftCheck.ts:105" + "src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:105" ] }, { "call": "No public firewall port required", "key": "No public firewall port required", "places": [ - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:99" + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:99" ] }, { "call": "No rules use ByeDPI", "key": "No rules use ByeDPI", "places": [ - "src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:79" + "src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:79" ] }, { "call": "No rules use Zapret", "key": "No rules use Zapret", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:79" + "src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:79" ] }, { "call": "No rules use Zapret2", "key": "No rules use Zapret2", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:82" + "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:82" ] }, { "call": "Node list is empty", "key": "Node list is empty", "places": [ - "src/forkop/tabs/dashboard/initController.ts:1012", - "src/forkop/tabs/dashboard/initController.ts:1268" + "src/tachyon/tabs/dashboard/initController.ts:1012", + "src/tachyon/tabs/dashboard/initController.ts:1268" ] }, { "call": "Nodes", "key": "Nodes", "places": [ - "src/forkop/tabs/dashboard/initController.ts:942", - "src/forkop/tabs/dashboard/initController.ts:1191" + "src/tachyon/tabs/dashboard/initController.ts:942", + "src/tachyon/tabs/dashboard/initController.ts:1191" ] }, { "call": "None", "key": "None", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:446", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2600", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2892", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2901" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:446", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2600", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2892", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2901" ] }, { "call": "Not configured", "key": "Not configured", "places": [ - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:46" + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:46" ] }, { "call": "Not detected", "key": "Not detected", "places": [ - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:70", - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:199" + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:70", + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:199" ] }, { "call": "Not implement yet", "key": "Not implement yet", "places": [ - "src/forkop/tabs/diagnostic/partials/renderCheckSection.ts:189" + "src/tachyon/tabs/diagnostic/partials/renderCheckSection.ts:189" ] }, { "call": "Not installed", "key": "Not installed", "places": [ - "src/forkop/helpers/singBoxVariant.ts:29", - "src/forkop/helpers/singBoxVariant.ts:37", - "src/forkop/tabs/updates/initController.ts:930", - "src/forkop/tabs/updates/initController.ts:943", - "src/forkop/tabs/updates/initController.ts:956" + "src/tachyon/helpers/singBoxVariant.ts:29", + "src/tachyon/helpers/singBoxVariant.ts:37", + "src/tachyon/tabs/updates/initController.ts:930", + "src/tachyon/tabs/updates/initController.ts:943", + "src/tachyon/tabs/updates/initController.ts:956" ] }, { "call": "Not public", "key": "Not public", "places": [ - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:62" + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:62" ] }, { "call": "Not required for this listen address", "key": "Not required for this listen address", "places": [ - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:139" + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:139" ] }, { "call": "Not responding", "key": "Not responding", "places": [ - "src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts:90", - "src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts:117", - "src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts:123", - "src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts:151" + "src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:90", + "src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:117", + "src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:123", + "src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:151" ] }, { "call": "Not running", "key": "Not running", "places": [ - "src/forkop/tabs/diagnostic/diagnostic.store.ts:125", - "src/forkop/tabs/diagnostic/initController.ts:116", - "src/forkop/tabs/diagnostic/initController.ts:346", - "src/forkop/tabs/diagnostic/initController.ts:403", - "src/forkop/tabs/diagnostic/initController.ts:489" + "src/tachyon/tabs/diagnostic/diagnostic.store.ts:125", + "src/tachyon/tabs/diagnostic/initController.ts:116", + "src/tachyon/tabs/diagnostic/initController.ts:346", + "src/tachyon/tabs/diagnostic/initController.ts:403", + "src/tachyon/tabs/diagnostic/initController.ts:489" ] }, { "call": "Obfuscation", "key": "Obfuscation", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2900" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2900" ] }, { "call": "Obfuscation password", "key": "Obfuscation password", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2923" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2923" ] }, { "call": "Only from the specified countries.", "key": "Only from the specified countries.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2653" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2653" ] }, { "call": "Only selected", "key": "Only selected", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1690", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1698" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1690", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1698" ] }, { "call": "Only selected except exclusions", "key": "Only selected except exclusions", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1691", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1700" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1691", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1700" ] }, { "call": "Only servers whose names match the expression.", "key": "Only servers whose names match the expression.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2669" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2669" ] }, { "call": "Only servers with one of the selected protocols.", "key": "Only servers with one of the selected protocols.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2620" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2620" ] }, { "call": "Only servers with one of the selected security types.", "key": "Only servers with one of the selected security types.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2624" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2624" ] }, { "call": "Only servers with one of the selected transports.", "key": "Only servers with one of the selected transports.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2621" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2621" ] }, { "call": "Only the specified servers.", "key": "Only the specified servers.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2661" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2661" ] }, { "call": "Open", "key": "Open", "places": [ - "src/forkop/tabs/updates/initController.ts:1008", - "src/forkop/tabs/updates/initController.ts:1030" + "src/tachyon/tabs/updates/initController.ts:1008", + "src/tachyon/tabs/updates/initController.ts:1030" ] }, { "call": "Open priority settings and enter a display name", "key": "Open priority settings and enter a display name", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3372" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3372" ] }, { "call": "Open Project Page", "key": "Open Project Page", "places": [ - "src/forkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts:31" + "src/tachyon/tabs/diagnostic/partials/renderWikiDisclaimer.ts:31" ] }, { @@ -3311,31 +3178,31 @@ "key": "Operation timed out", "places": [ "src/helpers/withTimeout.ts:7", - "src/forkop/methods/shell/index.ts:432", - "src/forkop/methods/shell/index.ts:520" + "src/tachyon/methods/shell/index.ts:432", + "src/tachyon/methods/shell/index.ts:520" ] }, { "call": "Option \"%s\" contains an invalid input value.", "key": "Option \"%s\" contains an invalid input value.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1344", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4092", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6234" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1344", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4092", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6234" ] }, { "call": "Optional values must be attached with '=' here; a separate token would be ignored by nfqws.", "key": "Optional values must be attached with '=' here; a separate token would be ignored by nfqws.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5236" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5236" ] }, { "call": "Optional values must be attached with '=' here; a separate token would be ignored by nfqws2.", "key": "Optional values must be attached with '=' here; a separate token would be ignored by nfqws2.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5710" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5710" ] }, { @@ -3349,28 +3216,28 @@ "call": "Output Network Interface", "key": "Output Network Interface", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:313" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:313" ] }, { "call": "Padding", "key": "Padding", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2982" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2982" ] }, { "call": "Password", "key": "Password", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2863" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2863" ] }, { "call": "Password cannot be empty", "key": "Password cannot be empty", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7266" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7266" ] }, { @@ -3384,692 +3251,692 @@ "call": "Path must be absolute (start with /)", "key": "Path must be absolute (start with /)", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:641" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:641" ] }, { "call": "Path must contain at least one directory (like /tmp/cache.db)", "key": "Path must contain at least one directory (like /tmp/cache.db)", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:650" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:650" ] }, { "call": "Path must end with cache.db", "key": "Path must end with cache.db", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:645" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:645" ] }, { "call": "Pause updates", "key": "Pause updates", "places": [ - "src/forkop/tabs/monitoring/initController.ts:691", - "src/forkop/tabs/monitoring/render.ts:70", - "src/forkop/tabs/monitoring/render.ts:71" + "src/tachyon/tabs/monitoring/initController.ts:691", + "src/tachyon/tabs/monitoring/render.ts:70", + "src/tachyon/tabs/monitoring/render.ts:71" ] }, { "call": "Pending", "key": "Pending", "places": [ - "src/forkop/tabs/diagnostic/diagnostic.store.ts:63" + "src/tachyon/tabs/diagnostic/diagnostic.store.ts:63" ] }, { "call": "Periodically check the current level and switch to a faster server even when the current one works.", "key": "Periodically check the current level and switch to a faster server even when the current one works.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2819" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2819" ] }, { "call": "Pin on dashboard", "key": "Pin on dashboard", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2365", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2854" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2365", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2854" ] }, { "call": "Port cannot be empty", "key": "Port cannot be empty", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7174" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7174" ] }, { "call": "Port conflict", "key": "Port conflict", "places": [ - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:19" + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:19" ] }, { "call": "Port for the local mixed proxy of this section", "key": "Port for the local mixed proxy of this section", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7164" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7164" ] }, { "call": "Port must be between 1 and 65535", "key": "Port must be between 1 and 65535", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4857", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1814" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4857", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1814" ] }, { "call": "Port range start must be less than or equal to end", "key": "Port range start must be less than or equal to end", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4861" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4861" ] }, { "call": "Ports", "key": "Ports", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7525" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7525" ] }, { "call": "Prefer IPv4", "key": "Prefer IPv4", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:241" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:241" ] }, { "call": "Prefer IPv6", "key": "Prefer IPv6", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:243" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:243" ] }, { "call": "Preferred IP", "key": "Preferred IP", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3025" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3025" ] }, { "call": "Prefix text", "key": "Prefix text", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2202" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2202" ] }, { "call": "Priority", "key": "Priority", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7035" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7035" ] }, { "call": "Priority details", "key": "Priority details", "places": [ - "src/forkop/tabs/dashboard/initController.ts:1298", - "src/forkop/tabs/dashboard/partials/renderSections.ts:404", - "src/forkop/tabs/dashboard/partials/renderSections.ts:405" + "src/tachyon/tabs/dashboard/initController.ts:1298", + "src/tachyon/tabs/dashboard/partials/renderSections.ts:404", + "src/tachyon/tabs/dashboard/partials/renderSections.ts:405" ] }, { "call": "Priority details are unavailable", "key": "Priority details are unavailable", "places": [ - "src/forkop/tabs/dashboard/initController.ts:1128" + "src/tachyon/tabs/dashboard/initController.ts:1128" ] }, { "call": "Priority level settings", "key": "Priority level settings", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3259", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3260" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3259", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3260" ] }, { "call": "Priority levels", "key": "Priority levels", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2872" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2872" ] }, { "call": "Priority settings", "key": "Priority settings", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3317", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3322", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3323" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3317", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3322", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3323" ] }, { "call": "Protocol", "key": "Protocol", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1760", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2486", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2520" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1760", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2486", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2520" ] }, { "call": "Proxy link is unavailable", "key": "Proxy link is unavailable", "places": [ - "src/forkop/tabs/dashboard/initController.ts:757" + "src/tachyon/tabs/dashboard/initController.ts:757" ] }, { "call": "Public host", "key": "Public host", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2549", - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:40" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2549", + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:40" ] }, { "call": "QR code is too large", "key": "QR code is too large", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1613" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1613" ] }, { "call": "Reality fake site", "key": "Reality fake site", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2688" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2688" ] }, { "call": "Reality fake site port", "key": "Reality fake site port", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2699" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2699" ] }, { "call": "Reality max time difference", "key": "Reality max time difference", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2742" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2742" ] }, { "call": "Reality private key", "key": "Reality private key", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2710" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2710" ] }, { "call": "Reality public key", "key": "Reality public key", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2717" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2717" ] }, { "call": "Reality short ID", "key": "Reality short ID", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2723" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2723" ] }, { "call": "Reality short ID must contain 1-8 hex digits", "key": "Reality short ID must contain 1-8 hex digits", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2095" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2095" ] }, { "call": "Refill", "key": "Refill", "places": [ - "src/forkop/tabs/dashboard/partials/renderSections.ts:135" + "src/tachyon/tabs/dashboard/partials/renderSections.ts:135" ] }, { "call": "Regional options cannot be used together", "key": "Regional options cannot be used together", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7386" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7386" ] }, { "call": "Regular expression must not contain spaces or commas", "key": "Regular expression must not contain spaces or commas", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4743" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4743" ] }, { "call": "Remove", "key": "Remove", "places": [ - "src/forkop/tabs/updates/initController.ts:799" + "src/tachyon/tabs/updates/initController.ts:799" ] }, { "call": "Remove servers from the specified countries from this level.", "key": "Remove servers from the specified countries from this level.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2677" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2677" ] }, { "call": "Remove servers whose names match the expression from this level.", "key": "Remove servers whose names match the expression from this level.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2693" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2693" ] }, { "call": "Remove the specified servers from this level.", "key": "Remove the specified servers from this level.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2685" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2685" ] }, { "call": "Require a username and password for the local mixed proxy", "key": "Require a username and password for the local mixed proxy", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7190" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7190" ] }, { "call": "Resolve domain names before routing so sing-box can use real destination IPs.", "key": "Resolve domain names before routing so sing-box can use real destination IPs.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7277" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7277" ] }, { "call": "Resolve real IP for routing", "key": "Resolve real IP for routing", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7276" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7276" ] }, { "call": "Resource selection by hostname inside nfqws is not supported here; sing-box selects resources before NFQUEUE.", "key": "Resource selection by hostname inside nfqws is not supported here; sing-box selects resources before NFQUEUE.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5031" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5031" ] }, { "call": "Resource selection by hostname inside nfqws2 is not supported here; sing-box selects resources before NFQUEUE.", "key": "Resource selection by hostname inside nfqws2 is not supported here; sing-box selects resources before NFQUEUE.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5476" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5476" ] }, { "call": "Resource selection by IP or CIDR inside nfqws is not supported here; sing-box selects resources before NFQUEUE.", "key": "Resource selection by IP or CIDR inside nfqws is not supported here; sing-box selects resources before NFQUEUE.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5034" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5034" ] }, { "call": "Resource selection by IP or CIDR inside nfqws2 is not supported here; sing-box selects resources before NFQUEUE.", "key": "Resource selection by IP or CIDR inside nfqws2 is not supported here; sing-box selects resources before NFQUEUE.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5479" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5479" ] }, { - "call": "Restart Forkop", - "key": "Restart Forkop", + "call": "Restart Tachyon", + "key": "Restart Tachyon", "places": [ - "src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:49" + "src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:49" ] }, { "call": "Resume updates", "key": "Resume updates", "places": [ - "src/forkop/tabs/monitoring/initController.ts:691" + "src/tachyon/tabs/monitoring/initController.ts:691" ] }, { "call": "Route", "key": "Route", "places": [ - "src/forkop/tabs/monitoring/initController.ts:819", - "src/forkop/tabs/monitoring/initController.ts:877" + "src/tachyon/tabs/monitoring/initController.ts:819", + "src/tachyon/tabs/monitoring/initController.ts:877" ] }, { "call": "Route main DNS requests through the selected section.", "key": "Route main DNS requests through the selected section.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:252" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:252" ] }, { "call": "Route requests to this DNS server through another section.", "key": "Route requests to this DNS server through another section.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6686" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6686" ] }, { "call": "Routing mode", "key": "Routing mode", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2561" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2561" ] }, { "call": "Routing rules", "key": "Routing rules", "places": [ - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:103", - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:114", - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:144" + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:103", + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:114", + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:144" ] }, { "call": "Routing section", "key": "Routing section", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2570" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2570" ] }, { "call": "Rule set must be an HTTP(S) URL or a local .srs / .json path", "key": "Rule set must be an HTTP(S) URL or a local .srs / .json path", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6515" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6515" ] }, { "call": "Rule set settings", "key": "Rule set settings", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3487" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3487" ] }, { "call": "Rule sets", "key": "Rule sets", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7441", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7468" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7441", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7468" ] }, { "call": "Rules", "key": "Rules", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2562" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2562" ] }, { "call": "Rules mangle counters", "key": "Rules mangle counters", "places": [ - "src/forkop/tabs/diagnostic/checks/runNftCheck.ts:79" + "src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:79" ] }, { "call": "Rules mangle exist", "key": "Rules mangle exist", "places": [ - "src/forkop/tabs/diagnostic/checks/runNftCheck.ts:74" + "src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:74" ] }, { "call": "Rules mangle output counters", "key": "Rules mangle output counters", "places": [ - "src/forkop/tabs/diagnostic/checks/runNftCheck.ts:89" + "src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:89" ] }, { "call": "Rules mangle output exist", "key": "Rules mangle output exist", "places": [ - "src/forkop/tabs/diagnostic/checks/runNftCheck.ts:84" + "src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:84" ] }, { "call": "Rules proxy counters", "key": "Rules proxy counters", "places": [ - "src/forkop/tabs/diagnostic/checks/runNftCheck.ts:99" + "src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:99" ] }, { "call": "Rules proxy exist", "key": "Rules proxy exist", "places": [ - "src/forkop/tabs/diagnostic/checks/runNftCheck.ts:94" + "src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:94" ] }, { "call": "Run Diagnostic", "key": "Run Diagnostic", "places": [ - "src/forkop/tabs/diagnostic/partials/renderRunAction.ts:17" + "src/tachyon/tabs/diagnostic/partials/renderRunAction.ts:17" ] }, { "call": "Russia inside restrictions", "key": "Russia inside restrictions", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7405" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7405" ] }, { "call": "Save", "key": "Save", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3080" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3080" ] }, { "call": "Search", "key": "Search", "places": [ - "src/forkop/tabs/monitoring/render.ts:47" + "src/tachyon/tabs/monitoring/render.ts:47" ] }, { "call": "Secret", "key": "Secret", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2939" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2939" ] }, { "call": "Secret key for authenticating remote access to YACD when WAN access is enabled.", "key": "Secret key for authenticating remote access to YACD when WAN access is enabled.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:435" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:435" ] }, { "call": "Section", "key": "Section", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:396" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:396" ] }, { "call": "Section name", "key": "Section name", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6619" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6619" ] }, { "call": "Sections", "key": "Sections", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:390" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:390" ] }, { "call": "Security", "key": "Security", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1772", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2597" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1772", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2597" ] }, { "call": "Select a common client profile or enter a custom User-Agent", "key": "Select a common client profile or enter a custom User-Agent", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2142" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2142" ] }, { "call": "Select a network interface", "key": "Select a network interface", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6918" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6918" ] }, { "call": "Select a predefined domain list", "key": "Select a predefined domain list", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7342" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7342" ] }, { "call": "Select a section", "key": "Select a section", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6707", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:84" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6707", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:84" ] }, { "call": "Select a section for downloading this subscription", "key": "Select a section for downloading this subscription", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2119" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2119" ] }, { "call": "Select a transit section", "key": "Select a transit section", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7111" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7111" ] }, { "call": "Select an existing network interface", "key": "Select an existing network interface", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1670" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1670" ] }, { "call": "Select an intermediate section", "key": "Select an intermediate section", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7124" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7124" ] }, { "call": "Select DNS protocol to use", "key": "Select DNS protocol to use", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:161" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:161" ] }, { "call": "Select network interface for VPN connection", "key": "Select network interface for VPN connection", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6913" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6913" ] }, { "call": "Select or enter a User-Agent", "key": "Select or enter a User-Agent", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2155" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2155" ] }, { "call": "Select or enter path for sing-box cache file. Change this ONLY if you know what you are doing", "key": "Select or enter path for sing-box cache file. Change this ONLY if you know what you are doing", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:624" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:624" ] }, { "call": "Select path for sing-box config file. Change this ONLY if you know what you are doing", "key": "Select path for sing-box config file. Change this ONLY if you know what you are doing", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:611" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:611" ] }, { "call": "Select the fastest node", "key": "Select the fastest node", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2807", - "src/forkop/tabs/dashboard/initController.ts:1151" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2807", + "src/tachyon/tabs/dashboard/initController.ts:1151" ] }, { "call": "Select the log level for sing-box", "key": "Select the log level for sing-box", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:660" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:660" ] }, { "call": "Select the network interface from which the traffic will originate", "key": "Select the network interface from which the traffic will originate", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:268" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:268" ] }, { "call": "Select the network interface to which the traffic will originate", "key": "Select the network interface to which the traffic will originate", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:314" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:314" ] }, { "call": "Select the WAN interfaces to be monitored", "key": "Select the WAN interfaces to be monitored", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:375" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:375" ] }, { "call": "Selected", "key": "Selected", "places": [ - "src/forkop/tabs/dashboard/initController.ts:910", - "src/forkop/tabs/dashboard/initController.ts:1137" + "src/tachyon/tabs/dashboard/initController.ts:910", + "src/tachyon/tabs/dashboard/initController.ts:1137" ] }, { "call": "Selected section", "key": "Selected section", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2564" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2564" ] }, { @@ -4083,51 +3950,51 @@ "call": "Server", "key": "Server", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:413" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:413" ] }, { "call": "Server filtering", "key": "Server filtering", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2383", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2586" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2383", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2586" ] }, { "call": "Server group for automatic lowest-latency selection", "key": "Server group for automatic lowest-latency selection", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6979" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6979" ] }, { "call": "Server group for priority failover", "key": "Server group for priority failover", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7036" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7036" ] }, { "call": "Server information", "key": "Server information", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1707" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1707" ] }, { "call": "Server name", "key": "Server name", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1623", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2497" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1623", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2497" ] }, { "call": "Server name / SNI", "key": "Server name / SNI", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2626" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2626" ] }, { @@ -4155,813 +4022,946 @@ "call": "Servers", "key": "Servers", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:407" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:407" ] }, { "call": "Service action failed", "key": "Service action failed", "places": [ - "src/forkop/methods/shell/index.ts:383", - "src/forkop/methods/shell/index.ts:404", - "src/forkop/tabs/diagnostic/initController.ts:594" + "src/tachyon/methods/shell/index.ts:383", + "src/tachyon/methods/shell/index.ts:404", + "src/tachyon/tabs/diagnostic/initController.ts:594" ] }, { "call": "Service list", "key": "Service list", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7345" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7345" ] }, { "call": "Services info", "key": "Services info", "places": [ - "src/forkop/tabs/dashboard/initController.ts:1670" + "src/tachyon/tabs/dashboard/initController.ts:1670" ] }, { "call": "Settings", "key": "Settings", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:425", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1095", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6590" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1095", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6590", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:425" ] }, { "call": "Show metadata on dashboard", "key": "Show metadata on dashboard", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2185" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2185" ] }, { "call": "Show sing-box config", "key": "Show sing-box config", "places": [ - "src/forkop/tabs/diagnostic/initController.ts:751", - "src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:116" + "src/tachyon/tabs/diagnostic/initController.ts:751", + "src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:116" ] }, { "call": "Show subscription metadata for this source on the dashboard", "key": "Show subscription metadata for this source on the dashboard", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2186" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2186" ] }, { "call": "Sing-box autostart disabled", "key": "Sing-box autostart disabled", "places": [ - "src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:77" + "src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:77" ] }, { "call": "Sing-box FakeIP DNS does not work", "key": "Sing-box FakeIP DNS does not work", "places": [ - "src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:69" + "src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:69" ] }, { "call": "Sing-box FakeIP DNS works", "key": "Sing-box FakeIP DNS works", "places": [ - "src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:68" + "src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:68" ] }, { "call": "Sing-box installed", "key": "Sing-box installed", "places": [ - "src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:62" + "src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:62" ] }, { "call": "Sing-box listening ports", "key": "Sing-box listening ports", "places": [ - "src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:87" + "src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:87" ] }, { "call": "Sing-box process running", "key": "Sing-box process running", "places": [ - "src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:82" + "src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:82" ] }, { "call": "Sing-box service exist", "key": "Sing-box service exist", "places": [ - "src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:72" + "src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:72" ] }, { "call": "Sing-box version is compatible (newer than 1.12.4)", "key": "Sing-box version is compatible (newer than 1.12.4)", "places": [ - "src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:67" + "src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:67" ] }, { "call": "Sort by latency", "key": "Sort by latency", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7136" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7136" ] }, { "call": "Sorts servers in this section by lowest latency in the dashboard.", "key": "Sorts servers in this section by lowest latency in the dashboard.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7137" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7137" ] }, { "call": "Source", "key": "Source", "places": [ - "src/forkop/tabs/monitoring/initController.ts:831", - "src/forkop/tabs/monitoring/initController.ts:881" + "src/tachyon/tabs/monitoring/initController.ts:831", + "src/tachyon/tabs/monitoring/initController.ts:881" ] }, { "call": "Source Network Interface", "key": "Source Network Interface", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:267" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:267" ] }, { "call": "Specify a file path", "key": "Specify a file path", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1930" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1930" ] }, { "call": "Specify different files", "key": "Specify different files", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1941", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1953" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1941", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1953" ] }, { "call": "Standalone ByeDPI autostart is enabled", "key": "Standalone ByeDPI autostart is enabled", "places": [ - "src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:122" + "src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:122" ] }, { - "call": "Standalone ByeDPI is active together with Forkop ByeDPI rules", - "key": "Standalone ByeDPI is active together with Forkop ByeDPI rules", + "call": "Standalone ByeDPI is active together with Tachyon ByeDPI rules", + "key": "Standalone ByeDPI is active together with Tachyon ByeDPI rules", "places": [ - "src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:119" + "src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:119" ] }, { "call": "Standalone ByeDPI service is active", "key": "Standalone ByeDPI service is active", "places": [ - "src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:120" + "src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:120" ] }, { "call": "Standalone ByeDPI service is inactive", "key": "Standalone ByeDPI service is inactive", "places": [ - "src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:123" + "src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:123" ] }, { - "call": "Standalone Zapret is active together with Forkop Zapret rules", - "key": "Standalone Zapret is active together with Forkop Zapret rules", + "call": "Standalone Zapret is active together with Tachyon Zapret rules", + "key": "Standalone Zapret is active together with Tachyon Zapret rules", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:111" + "src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:111" ] }, { "call": "Standalone Zapret service is active", "key": "Standalone Zapret service is active", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:112" + "src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:112" ] }, { "call": "Standalone Zapret service is inactive", "key": "Standalone Zapret service is inactive", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:113" + "src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:113" ] }, { "call": "Standalone Zapret2 autostart is enabled", "key": "Standalone Zapret2 autostart is enabled", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:121" + "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:121" ] }, { - "call": "Standalone Zapret2 is active together with Forkop Zapret2 rules", - "key": "Standalone Zapret2 is active together with Forkop Zapret2 rules", + "call": "Standalone Zapret2 is active together with Tachyon Zapret2 rules", + "key": "Standalone Zapret2 is active together with Tachyon Zapret2 rules", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:118" + "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:118" ] }, { "call": "Standalone Zapret2 service is active", "key": "Standalone Zapret2 service is active", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:119" + "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:119" ] }, { "call": "Standalone Zapret2 service is inactive", "key": "Standalone Zapret2 service is inactive", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:122" + "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:122" ] }, { - "call": "Start Forkop", - "key": "Start Forkop", + "call": "Start Tachyon", + "key": "Start Tachyon", "places": [ - "src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:69" + "src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:69" ] }, { "call": "Stop checking when URLTest group is not used. Use sing-box duration format like 1d, 12h or 30m.", "key": "Stop checking when URLTest group is not used. Use sing-box duration format like 1d, 12h or 30m.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2341" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2341" ] }, { - "call": "Stop Forkop", - "key": "Stop Forkop", + "call": "Stop Tachyon", + "key": "Stop Tachyon", "places": [ - "src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:59" + "src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:59" ] }, { "call": "Subnets from the list will be extracted and added to nftables", "key": "Subnets from the list will be extracted and added to nftables", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3481" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3481" ] }, { "call": "Subscription auto update", "key": "Subscription auto update", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2073" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2073" ] }, { "call": "Subscription info:", "key": "Subscription info:", "places": [ - "src/forkop/tabs/dashboard/partials/renderSections.ts:149" + "src/tachyon/tabs/dashboard/partials/renderSections.ts:149" ] }, { "call": "Subscription update failed", "key": "Subscription update failed", "places": [ - "src/forkop/methods/shell/index.ts:720", - "src/forkop/methods/shell/index.ts:740" + "src/tachyon/methods/shell/index.ts:720", + "src/tachyon/methods/shell/index.ts:740" ] }, { "call": "Subscription update interval", "key": "Subscription update interval", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2082" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2082" ] }, { "call": "Subscription URL", "key": "Subscription URL", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6864" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6864" ] }, { "call": "Subscription URL cannot be empty", "key": "Subscription URL cannot be empty", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4103" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4103" ] }, { "call": "Subscription URL settings", "key": "Subscription URL settings", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3184" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3184" ] }, { "call": "Subscriptions updated", "key": "Subscriptions updated", "places": [ - "src/forkop/tabs/dashboard/initController.ts:301" + "src/tachyon/tabs/dashboard/initController.ts:301" ] }, { "call": "System info", "key": "System info", "places": [ - "src/forkop/tabs/dashboard/initController.ts:1630" + "src/tachyon/tabs/dashboard/initController.ts:1630" ] }, { "call": "System information", "key": "System information", "places": [ - "src/forkop/tabs/diagnostic/partials/renderSystemInfo.ts:21" + "src/tachyon/tabs/diagnostic/partials/renderSystemInfo.ts:21" ] }, { "call": "Table exist", "key": "Table exist", "places": [ - "src/forkop/tabs/diagnostic/checks/runNftCheck.ts:69" + "src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:69" + ] + }, + { + "call": "Tachyon Error", + "key": "Tachyon Error", + "places": [ + "src/tachyon/services/core.service.ts:52" + ] + }, + { + "call": "Tachyon manages ciadpi pid files itself, so pidfile options are not allowed here.", + "key": "Tachyon manages ciadpi pid files itself, so pidfile options are not allowed here.", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5902" + ] + }, + { + "call": "Tachyon manages the ciadpi process lifecycle itself, so daemon mode is not allowed here.", + "key": "Tachyon manages the ciadpi process lifecycle itself, so daemon mode is not allowed here.", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5899" + ] + }, + { + "call": "Tachyon manages the nfqws process lifecycle itself, so daemon mode is not allowed here.", + "key": "Tachyon manages the nfqws process lifecycle itself, so daemon mode is not allowed here.", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5046" + ] + }, + { + "call": "Tachyon manages the nfqws2 process lifecycle itself, so daemon mode is not allowed here.", + "key": "Tachyon manages the nfqws2 process lifecycle itself, so daemon mode is not allowed here.", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5497" + ] + }, + { + "call": "Tachyon service is stopped. Start the service to display connections.", + "key": "Tachyon service is stopped. Start the service to display connections.", + "places": [ + "src/tachyon/tabs/monitoring/initController.ts:925" + ] + }, + { + "call": "Tachyon service is stopped. Start the service to display the dashboard.", + "key": "Tachyon service is stopped. Start the service to display the dashboard.", + "places": [ + "src/tachyon/tabs/dashboard/render.ts:17" + ] + }, + { + "call": "Tachyon Settings", + "key": "Tachyon Settings", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:342" + ] + }, + { + "call": "Tachyon will not modify your DHCP configuration", + "key": "Tachyon will not modify your DHCP configuration", + "places": [ + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:602" + ] + }, + { + "call": "Tachyon-managed ciadpi runtime has restarted", + "key": "Tachyon-managed ciadpi runtime has restarted", + "places": [ + "src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:91" + ] + }, + { + "call": "Tachyon-managed ciadpi runtime is not ready", + "key": "Tachyon-managed ciadpi runtime is not ready", + "places": [ + "src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:94" + ] + }, + { + "call": "Tachyon-managed ciadpi runtime is not running", + "key": "Tachyon-managed ciadpi runtime is not running", + "places": [ + "src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:97" + ] + }, + { + "call": "Tachyon-managed ciadpi runtime is ready", + "key": "Tachyon-managed ciadpi runtime is ready", + "places": [ + "src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:93" + ] + }, + { + "call": "Tachyon-managed nfqws runtime is not ready", + "key": "Tachyon-managed nfqws runtime is not ready", + "places": [ + "src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:87" + ] + }, + { + "call": "Tachyon-managed nfqws runtime is not running", + "key": "Tachyon-managed nfqws runtime is not running", + "places": [ + "src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:90" + ] + }, + { + "call": "Tachyon-managed nfqws runtime is ready", + "key": "Tachyon-managed nfqws runtime is ready", + "places": [ + "src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:86" + ] + }, + { + "call": "Tachyon-managed nfqws2 runtime is not ready", + "key": "Tachyon-managed nfqws2 runtime is not ready", + "places": [ + "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:90" + ] + }, + { + "call": "Tachyon-managed nfqws2 runtime is not running", + "key": "Tachyon-managed nfqws2 runtime is not running", + "places": [ + "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:93" + ] + }, + { + "call": "Tachyon-managed nfqws2 runtime is ready", + "key": "Tachyon-managed nfqws2 runtime is ready", + "places": [ + "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:89" ] }, { "call": "Tailscale auth key", "key": "Tailscale auth key", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3081" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3081" ] }, { "call": "Tailscale control URL", "key": "Tailscale control URL", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3090" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3090" ] }, { "call": "Tailscale endpoint", "key": "Tailscale endpoint", "places": [ - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:98" + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:98" ] }, { "call": "Tailscale hostname", "key": "Tailscale hostname", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3098" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3098" ] }, { "call": "Test latency", "key": "Test latency", "places": [ - "src/forkop/tabs/dashboard/partials/renderSections.ts:242", - "src/forkop/tabs/dashboard/partials/renderSections.ts:250", - "src/forkop/tabs/dashboard/partials/renderSections.ts:491" + "src/tachyon/tabs/dashboard/partials/renderSections.ts:242", + "src/tachyon/tabs/dashboard/partials/renderSections.ts:250", + "src/tachyon/tabs/dashboard/partials/renderSections.ts:491" ] }, { "call": "Test only selected servers.", "key": "Test only selected servers.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2451" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2451" ] }, { "call": "Test only servers with one of the selected protocols.", "key": "Test only servers with one of the selected protocols.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2411" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2411" ] }, { "call": "Test only servers with one of the selected security types.", "key": "Test only servers with one of the selected security types.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2417" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2417" ] }, { "call": "Test only servers with one of the selected transports.", "key": "Test only servers with one of the selected transports.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2414" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2414" ] }, { "call": "Test servers only from the specified countries.", "key": "Test servers only from the specified countries.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2443" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2443" ] }, { "call": "Test servers whose names match the expression.", "key": "Test servers whose names match the expression.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2459" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2459" ] }, { "call": "Testing URL", "key": "Testing URL", "places": [ - "src/forkop/tabs/dashboard/initController.ts:913" + "src/tachyon/tabs/dashboard/initController.ts:913" ] }, { - "call": "The desync fwmark is managed by Forkop for loop prevention and must not be overridden here.", - "key": "The desync fwmark is managed by Forkop for loop prevention and must not be overridden here.", + "call": "The desync fwmark is managed by Tachyon for loop prevention and must not be overridden here.", + "key": "The desync fwmark is managed by Tachyon for loop prevention and must not be overridden here.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5043", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5488" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5043", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5488" ] }, { - "call": "The NFQUEUE number is assigned by Forkop for each rule and must not be overridden here.", - "key": "The NFQUEUE number is assigned by Forkop for each rule and must not be overridden here.", + "call": "The NFQUEUE number is assigned by Tachyon for each rule and must not be overridden here.", + "key": "The NFQUEUE number is assigned by Tachyon for each rule and must not be overridden here.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5040", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5485" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5040", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5485" ] }, { "call": "The rule applies to the domain and all its subdomains. Use full:, keyword:, or regex: prefixes for exact match, keyword match, or regular expression.", "key": "The rule applies to the domain and all its subdomains. Use full:, keyword:, or regex: prefixes for exact match, keyword match, or regular expression.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7303" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7303" ] }, { "call": "There are rules using ByeDPI", "key": "There are rules using ByeDPI", "places": [ - "src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:78" + "src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:78" ] }, { "call": "There are rules using Zapret", "key": "There are rules using Zapret", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:78" + "src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:78" ] }, { "call": "There are rules using Zapret2", "key": "There are rules using Zapret2", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:81" + "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:81" ] }, { "call": "This field is required", "key": "This field is required", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1829", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1834", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1924", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2086", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2886" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1829", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1834", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1924", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2086", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2886" ] }, { "call": "This field must start a working ciadpi strategy; help/version options exit immediately and are not allowed here.", "key": "This field must start a working ciadpi strategy; help/version options exit immediately and are not allowed here.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5905" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5905" ] }, { "call": "This field must start a working nfqws strategy; --dry-run exits immediately and is not allowed here.", "key": "This field must start a working nfqws strategy; --dry-run exits immediately and is not allowed here.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5049" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5049" ] }, { "call": "This field must start a working nfqws strategy; --version exits immediately and is not allowed here.", "key": "This field must start a working nfqws strategy; --version exits immediately and is not allowed here.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5052" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5052" ] }, { "call": "This field must start a working nfqws2 strategy; --dry-run exits immediately and is not allowed here.", "key": "This field must start a working nfqws2 strategy; --dry-run exits immediately and is not allowed here.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5500" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5500" ] }, { "call": "This field must start a working nfqws2 strategy; --version exits immediately and is not allowed here.", "key": "This field must start a working nfqws2 strategy; --version exits immediately and is not allowed here.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5503" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5503" ] }, { "call": "This flag does not accept a value.", "key": "This flag does not accept a value.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5221", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5695" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5221", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5695" ] }, { "call": "This option requires a value.", "key": "This option requires a value.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5252", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5726" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5252", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5726" ] }, { "call": "Time", "key": "Time", "places": [ - "src/forkop/tabs/monitoring/initController.ts:822", - "src/forkop/tabs/monitoring/initController.ts:878" + "src/tachyon/tabs/monitoring/initController.ts:822", + "src/tachyon/tabs/monitoring/initController.ts:878" ] }, { "call": "Time in seconds for DNS record caching (default: 60)", "key": "Time in seconds for DNS record caching (default: 60)", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:223" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:223" ] }, { "call": "Time skew tolerance", "key": "Time skew tolerance", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3055" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3055" ] }, { "call": "tiny", "key": "tiny", "places": [ - "src/forkop/helpers/singBoxVariant.ts:53" + "src/tachyon/helpers/singBoxVariant.ts:53" ] }, { "call": "Tolerance", "key": "Tolerance", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2313", - "src/forkop/tabs/dashboard/initController.ts:915" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2313", + "src/tachyon/tabs/dashboard/initController.ts:915" ] }, { "call": "Top level has the highest priority; lower levels are used as fallback", "key": "Top level has the highest priority; lower levels are used as fallback", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2873" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2873" ] }, { "call": "Traffic", "key": "Traffic", "places": [ - "src/forkop/tabs/dashboard/initController.ts:1556", - "src/forkop/tabs/dashboard/partials/renderSections.ts:130" + "src/tachyon/tabs/dashboard/initController.ts:1556", + "src/tachyon/tabs/dashboard/partials/renderSections.ts:130" ] }, { "call": "Traffic for this level goes directly.", "key": "Traffic for this level goes directly.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2578" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2578" ] }, { "call": "Traffic Total", "key": "Traffic Total", "places": [ - "src/forkop/tabs/dashboard/initController.ts:1590" + "src/tachyon/tabs/dashboard/initController.ts:1590" ] }, { - "call": "Transparent proxy mode is incompatible with action=byedpi because Forkop connects to ciadpi through SOCKS.", - "key": "Transparent proxy mode is incompatible with action=byedpi because Forkop connects to ciadpi through SOCKS.", + "call": "Transparent proxy mode is incompatible with action=byedpi because Tachyon connects to ciadpi through SOCKS.", + "key": "Transparent proxy mode is incompatible with action=byedpi because Tachyon connects to ciadpi through SOCKS.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5896" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5896" ] }, { "call": "Transport", "key": "Transport", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1766", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2764" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1766", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2764" ] }, { "call": "Transport host", "key": "Transport host", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2788" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2788" ] }, { "call": "Transport path", "key": "Transport path", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2772" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2772" ] }, { "call": "Transport path must start with /", "key": "Transport path must start with /", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2007" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2007" ] }, { "call": "Troubleshooting", "key": "Troubleshooting", "places": [ - "src/forkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts:25" + "src/tachyon/tabs/diagnostic/partials/renderWikiDisclaimer.ts:25" ] }, { "call": "Try compatible User-Agent profiles automatically when downloading this subscription", "key": "Try compatible User-Agent profiles automatically when downloading this subscription", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2131" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2131" ] }, { "call": "TTL must be a positive number", "key": "TTL must be a positive number", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:234" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:234" ] }, { "call": "TTL value cannot be empty", "key": "TTL value cannot be empty", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:229" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:229" ] }, { "call": "Type", "key": "Type", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1638", - "src/forkop/tabs/monitoring/initController.ts:816", - "src/forkop/tabs/monitoring/initController.ts:876" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1638", + "src/tachyon/tabs/monitoring/initController.ts:816", + "src/tachyon/tabs/monitoring/initController.ts:876" ] }, { "call": "UDP (Unprotected DNS)", "key": "UDP (Unprotected DNS)", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:165" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:165" ] }, { "call": "Unable to validate the ByeDPI strategy through the backend parser.", "key": "Unable to validate the ByeDPI strategy through the backend parser.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5820" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5820" ] }, { "call": "Unable to validate the NFQWS strategy through the backend parser.", "key": "Unable to validate the NFQWS strategy through the backend parser.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4963", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6298", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6741" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4963", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6298", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6741" ] }, { "call": "Unable to validate the NFQWS2 strategy through the backend parser.", "key": "Unable to validate the NFQWS2 strategy through the backend parser.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5408", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6307" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5408", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6307" ] }, { "call": "Unavailability timeout", "key": "Unavailability timeout", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2781", - "src/forkop/tabs/dashboard/initController.ts:1145" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2781", + "src/tachyon/tabs/dashboard/initController.ts:1145" ] }, { "call": "Unexpected ByeDPI strategy argument: %s", "key": "Unexpected ByeDPI strategy argument: %s", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6037", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6086" - ] - }, - { - "call": "Unexpected Forkop-managed ciadpi runtime is running", - "key": "Unexpected Forkop-managed ciadpi runtime is running", - "places": [ - "src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:96" - ] - }, - { - "call": "Unexpected Forkop-managed nfqws runtime is running", - "key": "Unexpected Forkop-managed nfqws runtime is running", - "places": [ - "src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:89" - ] - }, - { - "call": "Unexpected Forkop-managed nfqws2 runtime is running", - "key": "Unexpected Forkop-managed nfqws2 runtime is running", - "places": [ - "src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:92" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6037", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6086" ] }, { "call": "Unexpected standalone token. Use explicit flags such as --name or --name=value.", "key": "Unexpected standalone token. Use explicit flags such as --name or --name=value.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5201", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5675" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5201", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5675" + ] + }, + { + "call": "Unexpected Tachyon-managed ciadpi runtime is running", + "key": "Unexpected Tachyon-managed ciadpi runtime is running", + "places": [ + "src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:96" + ] + }, + { + "call": "Unexpected Tachyon-managed nfqws runtime is running", + "key": "Unexpected Tachyon-managed nfqws runtime is running", + "places": [ + "src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:89" + ] + }, + { + "call": "Unexpected Tachyon-managed nfqws2 runtime is running", + "key": "Unexpected Tachyon-managed nfqws2 runtime is running", + "places": [ + "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:92" ] }, { "call": "unique UCI identifier", "key": "unique UCI identifier", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:54" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:54" ] }, { "call": "unknown", "key": "unknown", "places": [ - "src/forkop/helpers/singBoxVariant.ts:28", - "src/forkop/services/systemInfo.service.ts:10", - "src/forkop/services/systemInfo.service.ts:11", - "src/forkop/services/systemInfo.service.ts:12", - "src/forkop/services/systemInfo.service.ts:13", - "src/forkop/services/systemInfo.service.ts:18", - "src/forkop/services/systemInfo.service.ts:20", - "src/forkop/services/systemInfo.service.ts:22", - "src/forkop/services/systemInfo.service.ts:25", - "src/forkop/services/systemInfo.service.ts:26", - "src/forkop/tabs/updates/initController.ts:329", - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:25" + "src/tachyon/helpers/singBoxVariant.ts:28", + "src/tachyon/services/systemInfo.service.ts:10", + "src/tachyon/services/systemInfo.service.ts:11", + "src/tachyon/services/systemInfo.service.ts:12", + "src/tachyon/services/systemInfo.service.ts:13", + "src/tachyon/services/systemInfo.service.ts:18", + "src/tachyon/services/systemInfo.service.ts:20", + "src/tachyon/services/systemInfo.service.ts:22", + "src/tachyon/services/systemInfo.service.ts:25", + "src/tachyon/services/systemInfo.service.ts:26", + "src/tachyon/tabs/updates/initController.ts:329", + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:25" ] }, { "call": "Unknown ByeDPI option: %s", "key": "Unknown ByeDPI option: %s", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6006", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6028", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6079" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6006", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6028", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6079" ] }, { "call": "Unknown country", "key": "Unknown country", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:576" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:576" ] }, { "call": "Unknown error", "key": "Unknown error", "places": [ - "src/forkop/api.ts:40" + "src/tachyon/api.ts:40" ] }, { "call": "Unknown NFQWS flag.", "key": "Unknown NFQWS flag.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5212" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5212" ] }, { "call": "Unknown NFQWS2 flag.", "key": "Unknown NFQWS2 flag.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5686" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5686" ] }, { @@ -4975,60 +4975,60 @@ "call": "Unsupported security mode for this protocol", "key": "Unsupported security mode for this protocol", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2120" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2120" ] }, { "call": "Update", "key": "Update", "places": [ - "src/forkop/tabs/updates/initController.ts:754" + "src/tachyon/tabs/updates/initController.ts:754" ] }, { "call": "Update is available", "key": "Update is available", "places": [ - "src/forkop/tabs/updates/initController.ts:287" + "src/tachyon/tabs/updates/initController.ts:287" ] }, { "call": "Update is available:", "key": "Update is available:", "places": [ - "src/forkop/tabs/updates/initController.ts:994" + "src/tachyon/tabs/updates/initController.ts:994" ] }, { "call": "Update subscriptions", "key": "Update subscriptions", "places": [ - "src/forkop/tabs/dashboard/partials/renderSections.ts:219", - "src/forkop/tabs/dashboard/partials/renderSections.ts:232", - "src/forkop/tabs/dashboard/partials/renderSections.ts:233" + "src/tachyon/tabs/dashboard/partials/renderSections.ts:219", + "src/tachyon/tabs/dashboard/partials/renderSections.ts:232", + "src/tachyon/tabs/dashboard/partials/renderSections.ts:233" ] }, { "call": "Update this subscription automatically", "key": "Update this subscription automatically", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2074" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2074" ] }, { "call": "Uplink", "key": "Uplink", "places": [ - "src/forkop/tabs/dashboard/initController.ts:1558", - "src/forkop/tabs/dashboard/initController.ts:1593" + "src/tachyon/tabs/dashboard/initController.ts:1558", + "src/tachyon/tabs/dashboard/initController.ts:1593" ] }, { "call": "Uploaded", "key": "Uploaded", "places": [ - "src/forkop/tabs/monitoring/initController.ts:828", - "src/forkop/tabs/monitoring/initController.ts:880" + "src/tachyon/tabs/monitoring/initController.ts:828", + "src/tachyon/tabs/monitoring/initController.ts:880" ] }, { @@ -5049,193 +5049,193 @@ "call": "URL used to check whether a server is alive", "key": "URL used to check whether a server is alive", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2757" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2757" ] }, { "call": "URL used to test server latency", "key": "URL used to test server latency", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2328" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2328" ] }, { "call": "URLTest", "key": "URLTest", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6978" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6978" ] }, { "call": "URLTest details", "key": "URLTest details", "places": [ - "src/forkop/tabs/dashboard/initController.ts:1042", - "src/forkop/tabs/dashboard/partials/renderSections.ts:385", - "src/forkop/tabs/dashboard/partials/renderSections.ts:386" + "src/tachyon/tabs/dashboard/initController.ts:1042", + "src/tachyon/tabs/dashboard/partials/renderSections.ts:385", + "src/tachyon/tabs/dashboard/partials/renderSections.ts:386" ] }, { "call": "URLTest details are unavailable", "key": "URLTest details are unavailable", "places": [ - "src/forkop/tabs/dashboard/initController.ts:901" + "src/tachyon/tabs/dashboard/initController.ts:901" ] }, { "call": "URLTest settings", "key": "URLTest settings", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3216", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3217" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3216", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3217" ] }, { "call": "Use 32 hex characters", "key": "Use 32 hex characters", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2104" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2104" ] }, { "call": "Use a domain name or IP address", "key": "Use a domain name or IP address", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1894", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1900", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2016" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1894", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1900", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2016" ] }, { "call": "Use a duration like 30s, 5m, or 1h30m", "key": "Use a duration like 30s, 5m, or 1h30m", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1995" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1995" ] }, { "call": "Use a non-negative integer", "key": "Use a non-negative integer", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2001", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2888" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2001", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2888" ] }, { "call": "Use a non-zero secret", "key": "Use a non-zero secret", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2107" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2107" ] }, { "call": "Use an HTTP or HTTPS URL", "key": "Use an HTTP or HTTPS URL", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1963", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1965" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1963", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1965" ] }, { "call": "Use an IP address", "key": "Use an IP address", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1917" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1917" ] }, { "call": "Use an IP listen address", "key": "Use an IP listen address", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1910" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1910" ] }, { "call": "Use another section as an intermediate hop to connect to servers in this section. Does not apply to network interfaces or JSON outbounds.", "key": "Use another section as an intermediate hop to connect to servers in this section. Does not apply to network interfaces or JSON outbounds.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7073" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7073" ] }, { "call": "Use CIDR prefixes like 192.168.1.0/24 or 2001:db8::/32", "key": "Use CIDR prefixes like 192.168.1.0/24 or 2001:db8::/32", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2064" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2064" ] }, { "call": "Use CIDR prefixes or IP addresses like 192.168.1.0/24, 192.168.1.10, or 2001:db8::1", "key": "Use CIDR prefixes or IP addresses like 192.168.1.0/24, 192.168.1.10, or 2001:db8::1", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2078" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2078" ] }, { "call": "Use letters, digits, dots, underscores, or hyphens", "key": "Use letters, digits, dots, underscores, or hyphens", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2022" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2022" ] }, { "call": "Use sing-box duration format like 10s, 1m or 2m30s", "key": "Use sing-box duration format like 10s, 1m or 2m30s", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:149" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:149" ] }, { "call": "Use sing-box duration format like 1d, 12h or 30m", "key": "Use sing-box duration format like 1d, 12h or 30m", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2083", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2302", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2830", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4036", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4043", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4050", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:466", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:488", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:495", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:511", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:539" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2083", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2302", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2830", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4036", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4043", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4050", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:466", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:488", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:495", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:511", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:539" ] }, { "call": "Used by", "key": "Used by", "places": [ - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:25" + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:25" ] }, { "call": "User-Agent", "key": "User-Agent", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2141" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2141" ] }, { "call": "Username", "key": "Username", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2847" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2847" ] }, { "call": "Username cannot be empty", "key": "Username cannot be empty", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7230" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7230" ] }, { "call": "Valid", "key": "Valid", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4736", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4749", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4736", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4749", "src/validators/validateDns.ts:21", "src/validators/validateDns.ts:25", "src/validators/validateDomain.ts:57", @@ -5260,227 +5260,227 @@ "call": "Validation errors:", "key": "Validation errors:", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4165", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4185", - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4189" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4165", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4185", + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4189" ] }, { "call": "Value cannot be empty", "key": "Value cannot be empty", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4726" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4726" ] }, { "call": "Value must not contain control characters", "key": "Value must not contain control characters", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1838" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1838" ] }, { "call": "Via country.is", "key": "Via country.is", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1707" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1707" ] }, { "call": "View logs", "key": "View logs", "places": [ - "src/forkop/tabs/diagnostic/initController.ts:717", - "src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:107" + "src/tachyon/tabs/diagnostic/initController.ts:717", + "src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:107" ] }, { "call": "Visible name of this section", "key": "Visible name of this section", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6620" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6620" ] }, { "call": "VLESS flow", "key": "VLESS flow", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2891" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2891" ] }, { "call": "vless://, vmess://, ss://, trojan://, socks4/5://, http(s)://, hy2/hysteria2:// links", "key": "vless://, vmess://, ss://, trojan://, socks4/5://, http(s)://, hy2/hysteria2:// links", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6843" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6843" ] }, { "call": "WAN", "key": "WAN", "places": [ - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:70" + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:70" ] }, { "call": "WAN public IP", "key": "WAN public IP", "places": [ - "src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:198" + "src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:198" ] }, { "call": "Warning: %s cannot be used together with %s. Previous selections have been removed.", "key": "Warning: %s cannot be used together with %s. Previous selections have been removed.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7388" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7388" ] }, { "call": "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection.", "key": "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7407" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7407" ] }, { - "call": "What Forkop should do when this section matches", - "key": "What Forkop should do when this section matches", + "call": "What Tachyon should do when this section matches", + "key": "What Tachyon should do when this section matches", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6633" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6633" ] }, { "call": "When switching to another level, test every server and select the fastest instead of the first working one.", "key": "When switching to another level, test every server and select the fastest instead of the first working one.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2808" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2808" ] }, { "call": "XHTTP mode", "key": "XHTTP mode", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2801" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2801" ] }, { "call": "YACD Secret Key", "key": "YACD Secret Key", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:434" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:434" ] }, { "call": "Yes", "key": "Yes", "places": [ - "src/forkop/tabs/dashboard/initController.ts:762" + "src/tachyon/tabs/dashboard/initController.ts:762" ] }, { "call": "You can select Output Network Interface, by default autodetect", "key": "You can select Output Network Interface, by default autodetect", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:305" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:305" ] }, { - "call": "Zapret hostlist templates are not supported here because Forkop does not expand them for per-rule NFQWS strategies.", - "key": "Zapret hostlist templates are not supported here because Forkop does not expand them for per-rule NFQWS strategies.", + "call": "Zapret hostlist templates are not supported here because Tachyon does not expand them for per-rule NFQWS strategies.", + "key": "Zapret hostlist templates are not supported here because Tachyon does not expand them for per-rule NFQWS strategies.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5037" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5037" ] }, { "call": "Zapret package is installed", "key": "Zapret package is installed", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:71" + "src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:71" ] }, { "call": "Zapret package is not installed", "key": "Zapret package is not installed", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:72" + "src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:72" ] }, { "call": "Zapret provider binary is available", "key": "Zapret provider binary is available", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:60" + "src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:60" ] }, { "call": "Zapret provider binary is not available", "key": "Zapret provider binary is not available", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:61" + "src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:61" ] }, { "call": "Zapret sing-box outbound is configured", "key": "Zapret sing-box outbound is configured", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:103" + "src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:103" ] }, { "call": "Zapret sing-box outbound is not configured", "key": "Zapret sing-box outbound is not configured", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:104" + "src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:104" ] }, { - "call": "Zapret2 hostlist templates are not supported here because Forkop does not expand them for per-rule NFQWS2 strategies.", - "key": "Zapret2 hostlist templates are not supported here because Forkop does not expand them for per-rule NFQWS2 strategies.", + "call": "Zapret2 hostlist templates are not supported here because Tachyon does not expand them for per-rule NFQWS2 strategies.", + "key": "Zapret2 hostlist templates are not supported here because Tachyon does not expand them for per-rule NFQWS2 strategies.", "places": [ - "../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5482" + "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5482" ] }, { "call": "Zapret2 package is installed", "key": "Zapret2 package is installed", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:74" + "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:74" ] }, { "call": "Zapret2 package is not installed", "key": "Zapret2 package is not installed", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:75" + "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:75" ] }, { "call": "Zapret2 provider binary is available", "key": "Zapret2 provider binary is available", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:63" + "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:63" ] }, { "call": "Zapret2 provider binary is not available", "key": "Zapret2 provider binary is not available", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:64" + "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:64" ] }, { "call": "Zapret2 sing-box outbound is configured", "key": "Zapret2 sing-box outbound is configured", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:106" + "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:106" ] }, { "call": "Zapret2 sing-box outbound is not configured", "key": "Zapret2 sing-box outbound is not configured", "places": [ - "src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:107" + "src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:107" ] } ] \ No newline at end of file diff --git a/fe-app-tachyon/locales/tachyon.pot b/fe-app-tachyon/locales/tachyon.pot index b4ce84b3..2c9f02c4 100644 --- a/fe-app-tachyon/locales/tachyon.pot +++ b/fe-app-tachyon/locales/tachyon.pot @@ -1,195 +1,195 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) 2026 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the FORKOP package. -# ushan0v , 2026. +# This file is distributed under the same license as the TACHYON package. +# Dushnilin , 2026. #, fuzzy msgid "" msgstr "" -"Project-Id-Version: FORKOP\n" +"Project-Id-Version: TACHYON\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-13 00:22+0300\n" -"PO-Revision-Date: 2026-07-13 00:22+0300\n" -"Last-Translator: ushan0v \n" +"POT-Creation-Date: 2026-07-13 10:18+0300\n" +"PO-Revision-Date: 2026-07-13 10:18+0300\n" +"Last-Translator: Dushnilin \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1792 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2145 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2494 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2509 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2704 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2719 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1792 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2145 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2494 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2509 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2704 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2719 msgid "-- Select --" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6958 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6958 msgid "+ Add JSON outbound" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2877 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2877 msgid "+ Add level" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7041 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7041 msgid "+ Add priority" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6984 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6984 msgid "+ Add URLTest" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1675 -#: src/forkop/tabs/dashboard/initController.ts:1686 +#: src/tachyon/tabs/dashboard/initController.ts:1675 +#: src/tachyon/tabs/dashboard/initController.ts:1686 msgid "✔ Running" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1676 -#: src/forkop/tabs/dashboard/initController.ts:1687 +#: src/tachyon/tabs/dashboard/initController.ts:1676 +#: src/tachyon/tabs/dashboard/initController.ts:1687 msgid "✘ Stopped" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:408 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:408 msgid "Accept external proxy connections and route them with sing-box." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3133 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3133 msgid "Accept routes" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6603 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6632 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6603 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6632 msgid "Action" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:667 -#: src/forkop/tabs/monitoring/render.ts:20 +#: src/tachyon/tabs/monitoring/initController.ts:667 +#: src/tachyon/tabs/monitoring/render.ts:20 msgid "Active" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runDnsCheck.ts:56 +#: src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:56 msgid "Active Bootstrap DNS" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1633 +#: src/tachyon/tabs/dashboard/initController.ts:1633 msgid "Active Connections" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runDnsCheck.ts:67 +#: src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:67 msgid "Active Main DNS" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:397 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:397 msgid "Add a section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:414 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:414 msgid "Add a server inbound" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:119 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:119 msgid "Add at least one DNS server" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2194 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2194 msgid "Add prefix to nodes" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7493 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7493 msgid "Add URLs or local paths to .lst lists. Only domain rules are supported." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7442 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7469 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7442 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7469 msgid "Add URLs or local paths to .srs / .json lists. Only domain rules are supported." msgstr "" -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:106 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:106 msgid "Additional marking rules found" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2424 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2631 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2424 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2631 msgid "Additionally exclude servers by protocol, transport, and security. Exclude only servers matching the specified parameters." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2407 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2613 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2407 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2613 msgid "Additionally filter servers by protocol, transport, and security. Add only servers matching the specified parameters." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1653 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1653 msgid "Address" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3116 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3116 msgid "Advertise exit node" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3126 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3126 msgid "Advertise routes" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:626 -#: src/forkop/tabs/monitoring/render.ts:39 +#: src/tachyon/tabs/monitoring/initController.ts:626 +#: src/tachyon/tabs/monitoring/render.ts:39 msgid "All" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1689 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1689 msgid "All except selected" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1699 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1699 msgid "All remaining except selected" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1697 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1697 msgid "All remaining servers" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2587 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2587 msgid "All remaining servers means every server not already assigned to a higher-priority level." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1688 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1688 msgid "All servers" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7517 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7517 msgid "All traffic from these IP addresses will be routed through the section unconditionally, ignoring all other conditions." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4721 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4721 msgid "Allowed domain prefixes are full:, keyword:, and regex:" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:423 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:423 msgid "Allows access to YACD from the WAN. Make sure to open the appropriate port in your firewall." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2384 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2384 msgid "Allows limiting the list of servers for URLTest" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2645 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2645 msgid "ALPN" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2879 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2879 msgid "Alter ID" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7508 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7508 msgid "Apply section rules only to the specified local IP addresses" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4752 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4752 msgid "At least one valid domain must be specified." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4834 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4834 msgid "At least one valid IP or subnet must be specified." msgstr "" @@ -197,209 +197,209 @@ msgstr "" msgid "Auto refresh" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3036 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3036 msgid "Auto update" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2161 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2161 msgid "Auto-generate HWID" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:501 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:501 msgid "Automatic component update checks" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2130 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2130 msgid "Automatic User-Agent selection" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2195 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2195 msgid "Automatically add text to the name of each server from this subscription for convenient filtering." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:502 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:502 msgid "Automatically check installed components for new versions" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2818 -#: src/forkop/tabs/dashboard/initController.ts:1155 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2818 +#: src/tachyon/tabs/dashboard/initController.ts:1155 msgid "Automatically select the fastest node in the current level" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:43 +#: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:43 msgid "Available actions" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4967 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5412 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5824 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4967 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5412 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5824 msgid "Backend validation failed: %s" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runDnsCheck.ts:57 +#: src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:57 msgid "Bootstrap DNS" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:182 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:182 msgid "Bootstrap DNS Servers" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:51 -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:79 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:51 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:79 msgid "Browser FakeIP check could not be completed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:82 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:82 msgid "Browser is not using FakeIP" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:81 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:81 msgid "Browser is using FakeIP correctly" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7341 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7341 msgid "Built-in rule sets" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1706 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1706 msgid "By flag emoji from name" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5893 -msgid "ByeDPI listen address and port are assigned by Forkop and must not be set in the strategy." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5893 +msgid "ByeDPI listen address and port are assigned by Tachyon and must not be set in the strategy." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6070 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6070 msgid "ByeDPI option does not accept a compact value: %s" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5999 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5999 msgid "ByeDPI option does not accept a value: %s" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5991 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6017 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6051 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6060 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5991 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6017 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6051 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6060 msgid "ByeDPI option requires a value: %s" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:71 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:71 msgid "ByeDPI package is installed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:72 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:72 msgid "ByeDPI package is not installed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:64 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:64 msgid "ByeDPI provider binary is available" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:65 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:65 msgid "ByeDPI provider binary is not available" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:107 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:107 msgid "ByeDPI sing-box outbound is configured" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:108 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:108 msgid "ByeDPI sing-box outbound is not configured" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6804 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6804 msgid "ByeDPI Strategy" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6096 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6096 msgid "ByeDPI strategy cannot be empty" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:623 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:623 msgid "Cache File Path" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:637 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:637 msgid "Cache file path cannot be empty" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:26 -#: src/forkop/tabs/diagnostic/checks/runDnsCheck.ts:27 -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:172 -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:28 -#: src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts:48 -#: src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:25 -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:26 -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:26 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:26 +#: src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:27 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:172 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:28 +#: src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:48 +#: src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:25 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:26 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:26 msgid "Cannot receive checks result" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2241 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2241 msgid "Cannot save server" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7072 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7072 msgid "Cascade connection" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2655 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2655 msgid "Certificate path" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1598 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1598 msgid "Certificate pin is unavailable. Apply or restart the server to generate the default certificate, then open this dialog again." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2301 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2769 -#: src/forkop/tabs/dashboard/initController.ts:1142 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2301 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2769 +#: src/tachyon/tabs/dashboard/initController.ts:1142 msgid "Check interval" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2782 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2782 msgid "Check timeout after which the server is considered dead" msgstr "" -#: src/forkop/tabs/updates/initController.ts:740 +#: src/tachyon/tabs/updates/initController.ts:740 msgid "Check update" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2327 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2756 -#: src/forkop/tabs/dashboard/initController.ts:1140 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2327 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2756 +#: src/tachyon/tabs/dashboard/initController.ts:1140 msgid "Check URL" msgstr "" -#: src/forkop/tabs/diagnostic/initController.ts:1022 -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:14 -#: src/forkop/tabs/diagnostic/checks/runDnsCheck.ts:15 -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:15 -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:160 -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:13 -#: src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts:34 -#: src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:13 -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:14 -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:14 +#: src/tachyon/tabs/diagnostic/initController.ts:1022 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:14 +#: src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:15 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:15 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:160 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:13 +#: src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:34 +#: src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:13 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:14 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:14 msgid "Checking, please wait" msgstr "" -#: src/forkop/tabs/diagnostic/helpers/getCheckTitle.ts:2 +#: src/tachyon/tabs/diagnostic/helpers/getCheckTitle.ts:2 msgid "checks" msgstr "" -#: src/forkop/tabs/diagnostic/checks/getCheckItemsMeta.ts:10 -#: src/forkop/tabs/diagnostic/helpers/getMeta.ts:26 +#: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:10 +#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:26 msgid "Checks failed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/getCheckItemsMeta.ts:23 -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:43 -#: src/forkop/tabs/diagnostic/helpers/getMeta.ts:13 +#: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:23 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:43 +#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:13 msgid "Checks passed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/getDnsCheckPresentation.ts:27 +#: src/tachyon/tabs/diagnostic/checks/getDnsCheckPresentation.ts:27 msgid "Checks passed with manual DHCP" msgstr "" @@ -407,162 +407,162 @@ msgstr "" msgid "CIDR must be between 0 and 32 for IPv4 or 0 and 128 for IPv6" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2753 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2753 msgid "Client fingerprint" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1670 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1670 msgid "Client link" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1578 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1578 msgid "Client link is not available yet" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1611 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1611 msgid "Client link QR code" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3071 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1718 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3071 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1718 #: src/partials/modal/renderModal.ts:263 -#: src/forkop/tabs/dashboard/initController.ts:1027 -#: src/forkop/tabs/dashboard/initController.ts:1283 -#: src/forkop/tabs/monitoring/initController.ts:832 -#: src/forkop/tabs/monitoring/initController.ts:882 +#: src/tachyon/tabs/dashboard/initController.ts:1027 +#: src/tachyon/tabs/dashboard/initController.ts:1283 +#: src/tachyon/tabs/monitoring/initController.ts:832 +#: src/tachyon/tabs/monitoring/initController.ts:882 msgid "Close" msgstr "" -#: src/forkop/tabs/monitoring/render.ts:58 -#: src/forkop/tabs/monitoring/render.ts:59 +#: src/tachyon/tabs/monitoring/render.ts:58 +#: src/tachyon/tabs/monitoring/render.ts:59 msgid "Close all connections" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:799 -#: src/forkop/tabs/monitoring/initController.ts:800 +#: src/tachyon/tabs/monitoring/initController.ts:799 +#: src/tachyon/tabs/monitoring/initController.ts:800 msgid "Close connection" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:674 -#: src/forkop/tabs/monitoring/render.ts:29 +#: src/tachyon/tabs/monitoring/initController.ts:674 +#: src/tachyon/tabs/monitoring/render.ts:29 msgid "Closed" msgstr "" -#: src/forkop/services/core.service.ts:43 +#: src/tachyon/services/core.service.ts:43 msgid "Component update available" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:510 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:510 msgid "Component update check interval" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:473 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:473 msgid "Components" msgstr "" -#: src/forkop/helpers/singBoxVariant.ts:51 +#: src/tachyon/helpers/singBoxVariant.ts:51 msgid "compressed" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2988 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2988 msgid "Concurrency" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6591 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6591 msgid "Conditions" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:610 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:610 msgid "Config File Path" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:343 -msgid "Configuration for Forkop service" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:343 +msgid "Configuration for Tachyon service" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4063 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4063 msgid "Configure User-Agent in the item settings" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7110 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7110 msgid "Connect through" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6842 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6842 msgid "Connection URL" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:946 +#: src/tachyon/tabs/monitoring/initController.ts:946 msgid "Connections are unavailable" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts:145 +#: src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:145 msgid "Connectivity probe failed" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1565 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1565 #: src/helpers/copyToClipboard.ts:10 msgid "Copied" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1694 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1694 #: src/partials/modal/renderModal.ts:258 msgid "Copy" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:997 -#: src/forkop/tabs/dashboard/initController.ts:1253 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:366 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:367 +#: src/tachyon/tabs/dashboard/initController.ts:997 +#: src/tachyon/tabs/dashboard/initController.ts:1253 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:366 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:367 msgid "Copy proxy link" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:89 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:89 msgid "Could not compare FakeIP and control public IPs" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7127 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7127 msgid "Current section cannot be used as its own transit section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2122 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2122 msgid "Current section cannot download its own subscription" msgstr "" -#: src/forkop/tabs/dashboard/partials/renderWidget.ts:22 +#: src/tachyon/tabs/dashboard/partials/renderWidget.ts:22 msgid "Currently unavailable" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6953 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6953 msgid "Custom outbound configurations in JSON format" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:449 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:449 msgid "Dashboard" msgstr "" -#: src/forkop/tabs/dashboard/partials/renderSections.ts:47 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:47 msgid "Dashboard currently unavailable" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:546 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:546 msgid "Default address for checking server availability and latency. URLTest uses its own address." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:398 -msgid "Delay in milliseconds before reloading Forkop after interface UP" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:398 +msgid "Delay in milliseconds before reloading Tachyon after interface UP" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:405 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:405 msgid "Delay value cannot be empty" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1745 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1745 msgid "Delete" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2394 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2600 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2394 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2600 msgid "Detect server country" msgstr "" @@ -570,185 +570,185 @@ msgstr "" msgid "detour must be a non-empty string" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7507 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7507 msgid "Device filter" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6359 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6359 msgid "Device or IP" msgstr "" -#: src/forkop/tabs/diagnostic/checks/getDnsCheckPresentation.ts:37 +#: src/tachyon/tabs/diagnostic/checks/getDnsCheckPresentation.ts:37 msgid "DHCP has DNS server" msgstr "" -#: src/forkop/tabs/diagnostic/checks/getDnsCheckPresentation.ts:36 +#: src/tachyon/tabs/diagnostic/checks/getDnsCheckPresentation.ts:36 msgid "DHCP is managed manually" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:437 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:437 msgid "Diagnostics" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2563 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2563 msgid "Direct" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2577 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2577 msgid "Direct connection" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:79 +#: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:79 msgid "Disable autostart" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:445 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:445 msgid "Disable QUIC" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:446 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:446 msgid "Disable the QUIC protocol to improve compatibility or fix issues with video streaming" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5494 -msgid "Disabling interception is incompatible with action=zapret2 because Forkop sends matched traffic through NFQUEUE." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5494 +msgid "Disabling interception is incompatible with action=zapret2 because Tachyon sends matched traffic through NFQUEUE." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2283 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2745 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2283 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2745 msgid "Display name" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:196 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:196 msgid "DNS Check Interval" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runDnsCheck.ts:75 +#: src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:75 msgid "DNS on router" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1574 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:163 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1574 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:163 msgid "DNS over HTTPS (DoH)" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1575 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:164 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1575 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:164 msgid "DNS over TLS (DoT)" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2250 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6653 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2250 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6653 msgid "DNS protocol" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:160 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:160 msgid "DNS Protocol Type" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2251 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6654 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2251 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6654 msgid "DNS protocol used by the resolver" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6697 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:259 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6697 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:259 msgid "DNS requests through section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:222 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:222 msgid "DNS Rewrite TTL" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2260 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6666 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2260 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6666 msgid "DNS server" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6675 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6675 #: src/validators/validateDns.ts:8 msgid "DNS server address cannot be empty" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2261 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6667 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2261 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6667 msgid "DNS server used by the resolver" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:183 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:183 msgid "DNS server used to obtain IP addresses for upstream DNS and proxies. If multiple servers are selected, a timeout switches to a backup." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:172 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:172 msgid "DNS Servers" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:240 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:240 msgid "DNS Strategy" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:251 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:251 msgid "DNS through proxy" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6685 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6685 msgid "DNS through section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:212 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:212 msgid "DNS Unavailability Timeout" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts:26 +#: src/tachyon/tabs/diagnostic/partials/renderWikiDisclaimer.ts:26 msgid "Do not panic, everything can be fixed, just..." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2467 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2467 msgid "Do not test servers from these countries." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2483 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2483 msgid "Do not test servers whose names match the expression." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2428 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2428 msgid "Do not test servers with one of the selected protocols." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2434 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2434 msgid "Do not test servers with one of the selected security types." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2431 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2431 msgid "Do not test servers with one of the selected transports." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2475 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2475 msgid "Do not test specified servers." msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:54 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:54 msgid "Does not resolve" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7492 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7492 msgid "Domain lists" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2241 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2241 msgid "Domain Resolver" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7302 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7302 msgid "Domains" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:601 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:601 msgid "Dont Touch My DHCP!" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1559 -#: src/forkop/tabs/dashboard/initController.ts:1597 +#: src/tachyon/tabs/dashboard/initController.ts:1559 +#: src/tachyon/tabs/dashboard/initController.ts:1597 msgid "Downlink" msgstr "" @@ -756,48 +756,48 @@ msgstr "" msgid "Download" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:582 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:582 msgid "Download component packages via the selected section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:589 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:589 msgid "Download components through" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:581 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:581 msgid "Download components through a section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:569 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:569 msgid "Download lists through" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:561 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:561 msgid "Download lists through a section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:562 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:562 msgid "Download remote lists and rule sets via the selected section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2096 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2096 msgid "Download subscription through a section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2097 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2097 msgid "Download subscriptions via the selected section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2105 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2105 msgid "Download through" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:825 -#: src/forkop/tabs/monitoring/initController.ts:879 +#: src/tachyon/tabs/monitoring/initController.ts:825 +#: src/tachyon/tabs/monitoring/initController.ts:879 msgid "Downloaded" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:391 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:391 msgid "Drag rows to change priority. The rule at the top is checked first." msgstr "" @@ -805,375 +805,299 @@ msgstr "" msgid "Duplicate JSON outbound tag" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4158 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4173 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4193 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4158 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4173 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4193 msgid "Duplicate value" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:68 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1738 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1738 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:68 msgid "Edit rule action" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6593 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2480 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6593 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2480 msgid "Enable" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2840 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2840 msgid "Enable authentication" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:457 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:457 msgid "Enable automatic updates for remote lists and rule sets" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:89 +#: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:89 msgid "Enable autostart" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2242 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2242 msgid "Enable built-in DNS resolver for domains handled by this section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:456 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:456 msgid "Enable list updates" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7148 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7148 msgid "Enable Mixed Proxy" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7189 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7189 msgid "Enable Mixed Proxy Authentication" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:304 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:304 msgid "Enable Output Network Interface" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:413 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:413 msgid "Enable YACD" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:422 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:422 msgid "Enable YACD WAN Access" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2586 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2586 msgid "Enter a complete sing-box inbound object" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3405 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3405 msgid "Enter a complete sing-box outbound object" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2295 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2750 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3360 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3376 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2295 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2750 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3360 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3376 msgid "Enter a display name" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2550 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2571 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2550 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2571 msgid "Enter a level name" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6678 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6678 msgid "Enter a valid DNS server address" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2179 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2179 msgid "Enter HWID" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2171 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2171 msgid "Enter the HWID sent with subscription requests" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6865 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6865 msgid "Enter the subscription URL" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2423 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2630 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2423 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2630 msgid "Exclude by proxy parameters" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2482 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2692 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2482 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2692 msgid "Exclude by regular expression" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2466 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2676 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2466 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2676 msgid "Exclude countries" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:675 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:675 msgid "Exclude NTP" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:676 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:676 msgid "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2474 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2684 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2474 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2684 msgid "Exclude servers" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2638 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2638 msgid "Exclude servers with one of the selected protocols from this level." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2644 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2644 msgid "Exclude servers with one of the selected security types from this level." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2641 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2641 msgid "Exclude servers with one of the selected transports from this level." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:54 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:54 msgid "Expecting: %s" msgstr "" -#: src/forkop/tabs/dashboard/partials/renderSections.ts:134 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:134 msgid "Expires" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7149 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7149 msgid "Expose this section as a local HTTP+SOCKS proxy" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5028 -msgid "External nfqws config files bypass Forkop queue management and explicit validation." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5028 +msgid "External nfqws config files bypass Tachyon queue management and explicit validation." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5473 -msgid "External nfqws2 config files bypass Forkop queue management and explicit validation." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5473 +msgid "External nfqws2 config files bypass Tachyon queue management and explicit validation." msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:1213 -#: src/forkop/tabs/monitoring/initController.ts:1228 +#: src/tachyon/tabs/monitoring/initController.ts:1213 +#: src/tachyon/tabs/monitoring/initController.ts:1228 msgid "Failed to close connection" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:1247 -#: src/forkop/tabs/monitoring/initController.ts:1260 +#: src/tachyon/tabs/monitoring/initController.ts:1247 +#: src/tachyon/tabs/monitoring/initController.ts:1260 msgid "Failed to close connections" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1567 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1567 #: src/helpers/copyToClipboard.ts:12 msgid "Failed to copy!" msgstr "" -#: src/forkop/methods/shell/index.ts:170 -#: src/forkop/methods/shell/index.ts:177 -#: src/forkop/tabs/updates/initController.ts:508 -#: src/forkop/tabs/updates/initController.ts:509 -#: src/forkop/tabs/updates/initController.ts:569 -#: src/forkop/tabs/updates/initController.ts:719 +#: src/tachyon/methods/shell/index.ts:170 +#: src/tachyon/methods/shell/index.ts:177 +#: src/tachyon/tabs/updates/initController.ts:508 +#: src/tachyon/tabs/updates/initController.ts:509 +#: src/tachyon/tabs/updates/initController.ts:569 +#: src/tachyon/tabs/updates/initController.ts:719 msgid "Failed to execute" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:275 -#: src/forkop/tabs/dashboard/initController.ts:276 -#: src/forkop/tabs/dashboard/initController.ts:295 -#: src/forkop/tabs/dashboard/initController.ts:341 -#: src/forkop/tabs/dashboard/initController.ts:345 -#: src/forkop/tabs/dashboard/initController.ts:1341 -#: src/forkop/tabs/dashboard/initController.ts:1345 +#: src/tachyon/tabs/dashboard/initController.ts:275 +#: src/tachyon/tabs/dashboard/initController.ts:276 +#: src/tachyon/tabs/dashboard/initController.ts:295 +#: src/tachyon/tabs/dashboard/initController.ts:341 +#: src/tachyon/tabs/dashboard/initController.ts:345 +#: src/tachyon/tabs/dashboard/initController.ts:1341 +#: src/tachyon/tabs/dashboard/initController.ts:1345 msgid "Failed to update subscriptions" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:91 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:91 msgid "FakeIP and control checks use different public IPs" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:92 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:92 msgid "FakeIP and control checks use the same public IP" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:46 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:46 msgid "FakeIP works; public IP comparison is inconclusive" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2963 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2963 msgid "FakeTLS host" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3045 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3045 msgid "Fallback on unknown DC" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2829 -#: src/forkop/tabs/dashboard/initController.ts:1161 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2829 +#: src/tachyon/tabs/dashboard/initController.ts:1161 msgid "Faster server search interval" msgstr "" -#: src/forkop/methods/custom/getDashboardSections.ts:646 +#: src/tachyon/methods/custom/getDashboardSections.ts:646 msgid "Fastest" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:136 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:136 msgid "Firewall WAN port" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2242 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2242 msgid "Fix the highlighted fields and save again." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7516 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7516 msgid "Forced device routing" msgstr "" -#: src/forkop/services/core.service.ts:52 -msgid "Forkop Error" -msgstr "" - -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5902 -msgid "Forkop manages ciadpi pid files itself, so pidfile options are not allowed here." -msgstr "" - -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5899 -msgid "Forkop manages the ciadpi process lifecycle itself, so daemon mode is not allowed here." -msgstr "" - -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5046 -msgid "Forkop manages the nfqws process lifecycle itself, so daemon mode is not allowed here." -msgstr "" - -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5497 -msgid "Forkop manages the nfqws2 process lifecycle itself, so daemon mode is not allowed here." -msgstr "" - -#: src/forkop/tabs/monitoring/initController.ts:925 -msgid "Forkop service is stopped. Start the service to display connections." -msgstr "" - -#: src/forkop/tabs/dashboard/render.ts:17 -msgid "Forkop service is stopped. Start the service to display the dashboard." -msgstr "" - -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:342 -msgid "Forkop Settings" -msgstr "" - -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:602 -msgid "Forkop will not modify your DHCP configuration" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:91 -msgid "Forkop-managed ciadpi runtime has restarted" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:94 -msgid "Forkop-managed ciadpi runtime is not ready" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:97 -msgid "Forkop-managed ciadpi runtime is not running" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:93 -msgid "Forkop-managed ciadpi runtime is ready" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:87 -msgid "Forkop-managed nfqws runtime is not ready" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:90 -msgid "Forkop-managed nfqws runtime is not running" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:86 -msgid "Forkop-managed nfqws runtime is ready" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:90 -msgid "Forkop-managed nfqws2 runtime is not ready" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:93 -msgid "Forkop-managed nfqws2 runtime is not running" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:89 -msgid "Forkop-managed nfqws2 runtime is ready" -msgstr "" - -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3008 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3008 msgid "Fronting IP" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2997 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2997 msgid "Fronting port" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3018 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3018 msgid "Fronting proxy protocol" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5491 -msgid "Fuzzing is not supported here because Forkop needs deterministic runtime validation." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5491 +msgid "Fuzzing is not supported here because Tachyon needs deterministic runtime validation." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2162 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2162 msgid "Generate HWID from router hardware information for this subscription" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:89 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:89 msgid "Generated inbound" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:98 +#: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:98 msgid "Get global check" msgstr "" -#: src/forkop/tabs/diagnostic/initController.ts:682 +#: src/tachyon/tabs/diagnostic/initController.ts:682 msgid "Global check" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2820 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2820 msgid "gRPC service" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3073 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3073 msgid "Handshake timeout" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2374 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2863 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2374 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2863 msgid "Hide added servers" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2230 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2230 msgid "Hide cascade connection nodes" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2864 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2864 msgid "Hide dashboard servers added to Priority" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2375 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2375 msgid "Hide dashboard servers added to URLTest" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2219 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2219 msgid "Hide individual nodes that are already included in imported subscription URLTest groups" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2231 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2231 msgid "Hide intermediate nodes used as detours by other subscription nodes" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2218 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2218 msgid "Hide URLTest group nodes" msgstr "" @@ -1181,147 +1105,147 @@ msgstr "" msgid "Hide values" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2793 -#: src/forkop/tabs/dashboard/initController.ts:1147 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2793 +#: src/tachyon/tabs/dashboard/initController.ts:1147 msgid "Higher-level check interval" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:204 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:204 msgid "Higher-priority DNS Check" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:815 -#: src/forkop/tabs/monitoring/initController.ts:875 +#: src/tachyon/tabs/monitoring/initController.ts:815 +#: src/tachyon/tabs/monitoring/initController.ts:875 msgid "Host" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2794 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2794 msgid "How often higher priority levels are checked while a lower level is active" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2770 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2770 msgid "How often the currently selected server is checked" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:197 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:197 msgid "How often to check the active DNS servers." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:205 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:205 msgid "How often to check whether a higher-priority DNS server has recovered." msgstr "" -#: src/forkop/api.ts:27 +#: src/tachyon/api.ts:27 msgid "HTTP error" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2813 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2813 msgid "HTTP hosts" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2170 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2170 msgid "HWID" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2340 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3063 -#: src/forkop/tabs/dashboard/initController.ts:916 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2340 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3063 +#: src/tachyon/tabs/dashboard/initController.ts:916 msgid "Idle timeout" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2209 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2209 msgid "Import subscription URLTest groups" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2210 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2210 msgid "Import URLTest groups returned by this subscription provider" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2585 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2585 msgid "Inbound JSON" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1971 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1971 msgid "Inbound JSON cannot be empty" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1982 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1982 msgid "Inbound JSON must be an object with a type field" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2406 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2612 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2406 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2612 msgid "Include by proxy parameters" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2458 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2668 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2458 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2668 msgid "Include by regular expression" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2442 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2652 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2442 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2652 msgid "Include countries" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3480 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3480 msgid "Include IP addresses and subnets" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2450 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2660 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2450 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2660 msgid "Include servers" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1746 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1746 msgid "Information" msgstr "" -#: src/forkop/tabs/updates/initController.ts:754 +#: src/tachyon/tabs/updates/initController.ts:754 msgid "Install" msgstr "" -#: src/forkop/tabs/updates/initController.ts:1159 +#: src/tachyon/tabs/updates/initController.ts:1159 msgid "Install another build:" msgstr "" -#: src/forkop/tabs/updates/initController.ts:291 -#: src/forkop/tabs/updates/initController.ts:1017 +#: src/tachyon/tabs/updates/initController.ts:291 +#: src/tachyon/tabs/updates/initController.ts:1017 msgid "Installed version is newer than release" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:365 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:365 msgid "Interface Monitoring" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:397 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:397 msgid "Interface Monitoring Delay" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:366 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:366 msgid "Interface monitoring for Bad WAN" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2354 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2845 -#: src/forkop/tabs/dashboard/initController.ts:918 -#: src/forkop/tabs/dashboard/initController.ts:1167 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2354 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2845 +#: src/tachyon/tabs/dashboard/initController.ts:918 +#: src/tachyon/tabs/dashboard/initController.ts:1167 msgid "Interrupt existing connections" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2846 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2846 msgid "Interrupt existing connections when priority failover switches server" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2355 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2355 msgid "Interrupt existing connections when URLTest switches the selected server" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:914 +#: src/tachyon/tabs/dashboard/initController.ts:914 msgid "Interval" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6825 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6825 msgid "Invalid ByeDPI strategy" msgstr "" @@ -1333,7 +1257,7 @@ msgstr "" msgid "Invalid DNS server format. Examples: 8.8.8.8 or dns.example.com or dns.example.com/nicedns for DoH" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4701 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4701 #: src/validators/validateDomain.ts:67 #: src/validators/validateDomain.ts:73 msgid "Invalid domain address" @@ -1450,12 +1374,12 @@ msgstr "" msgid "Invalid IP address" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1984 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1984 #: src/validators/validateOutboundJson.ts:58 msgid "Invalid JSON format" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6782 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6782 msgid "Invalid NFQWS2 strategy" msgstr "" @@ -1463,16 +1387,16 @@ msgstr "" msgid "Invalid path format. Path must start with \"/\" and contain valid characters" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7182 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7182 #: src/validators/validateShadowsocksUrl.ts:93 msgid "Invalid port number. Must be between 1 and 65535" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4850 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4850 msgid "Invalid port or range. Use 80 or 1000-2000" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3974 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3974 msgid "Invalid regular expression" msgstr "" @@ -1582,27 +1506,27 @@ msgstr "" msgid "Invalid VMess URL: parsing failed" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7331 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7331 msgid "IPs" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:242 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:242 msgid "IPv4 only" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:244 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:244 msgid "IPv6 only" msgstr "" -#: src/forkop/tabs/diagnostic/checks/getCheckItemsMeta.ts:17 -#: src/forkop/tabs/diagnostic/helpers/getMeta.ts:20 +#: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:17 +#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:20 msgid "Issues detected" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1034 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3404 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3640 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6952 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1034 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3404 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3640 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6952 msgid "JSON outbound" msgstr "" @@ -1622,374 +1546,374 @@ msgstr "" msgid "JSON outbound must contain a non-empty type field" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3428 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3428 msgid "JSON outbound settings" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2855 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2855 msgid "Keep Priority before latency-sorted servers" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2366 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2366 msgid "Keep URLTest before latency-sorted servers" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2670 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2670 msgid "Key path" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3984 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3984 msgid "Keyword must not contain spaces or commas" msgstr "" -#: src/forkop/methods/shell/index.ts:462 -#: src/forkop/methods/shell/index.ts:483 +#: src/tachyon/methods/shell/index.ts:462 +#: src/tachyon/methods/shell/index.ts:483 msgid "Latency test failed" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:545 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:545 msgid "Latency test URL" msgstr "" -#: src/forkop/tabs/updates/initController.ts:294 -#: src/forkop/tabs/updates/initController.ts:1015 +#: src/tachyon/tabs/updates/initController.ts:294 +#: src/tachyon/tabs/updates/initController.ts:1015 msgid "Latest version is installed" msgstr "" -#: src/forkop/tabs/updates/initController.ts:1017 +#: src/tachyon/tabs/updates/initController.ts:1017 msgid "Latest version:" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1100 +#: src/tachyon/tabs/dashboard/initController.ts:1100 msgid "Level" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2566 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2566 msgid "Level name" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6524 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6524 msgid "List must be an HTTP(S) URL or a local .lst path" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:465 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:465 msgid "List Update Frequency" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2535 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2535 msgid "Listen address" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2542 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2542 msgid "Listen port" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:125 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:125 msgid "Listening port" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1703 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1703 msgid "Loading client link..." msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:936 -#: src/forkop/tabs/monitoring/render.ts:88 +#: src/tachyon/tabs/monitoring/initController.ts:936 +#: src/tachyon/tabs/monitoring/render.ts:88 msgid "Loading connections" msgstr "" -#: src/forkop/tabs/updates/initController.ts:905 -#: src/forkop/tabs/updates/initController.ts:916 -#: src/forkop/tabs/updates/initController.ts:927 -#: src/forkop/tabs/updates/initController.ts:940 -#: src/forkop/tabs/updates/initController.ts:953 +#: src/tachyon/tabs/updates/initController.ts:905 +#: src/tachyon/tabs/updates/initController.ts:916 +#: src/tachyon/tabs/updates/initController.ts:927 +#: src/tachyon/tabs/updates/initController.ts:940 +#: src/tachyon/tabs/updates/initController.ts:953 msgid "Loading..." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:659 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:659 msgid "Log Level" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runDnsCheck.ts:67 +#: src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:67 msgid "Main DNS" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:173 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:173 msgid "Main DNS server. If multiple servers are selected, a timeout switches to a backup." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7332 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7332 msgid "Match destination IPs or subnets" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7526 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7526 msgid "Match destination ports. Use a single port or a range" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:213 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:213 msgid "Maximum time to wait for example.com to resolve during a DNS health check." msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1637 +#: src/tachyon/tabs/dashboard/initController.ts:1637 msgid "Memory Usage" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2827 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2827 msgid "Method" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2314 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2314 msgid "Minimum latency difference in milliseconds that triggers switching to a faster server." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7240 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7240 msgid "Mixed Proxy Password" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7163 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7163 msgid "Mixed Proxy Port" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7204 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7204 msgid "Mixed Proxy Username" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:374 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:374 msgid "Monitored Interfaces" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:461 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:461 msgid "Monitoring" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1804 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1819 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1804 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1819 msgid "Must be a number in the range of 0 - 10000" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2284 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2746 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2284 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2746 msgid "Name displayed on the dashboard" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2567 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2567 msgid "Name shown in the priority level list" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1619 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6912 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1619 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6912 msgid "Network Interface" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3195 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3195 msgid "Network interface settings" msgstr "" -#: src/forkop/services/core.service.ts:38 +#: src/tachyon/services/core.service.ts:38 msgid "New version %s is available for %s" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:100 -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:97 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:100 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:97 msgid "NFQUEUE range is available" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:99 -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:96 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:99 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:96 msgid "NFQUEUE range overlaps with another rule" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6714 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6714 msgid "NFQWS Strategy" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5158 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5158 msgid "NFQWS strategy cannot be empty" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6761 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6761 msgid "NFQWS2 Strategy" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5632 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5632 msgid "NFQWS2 strategy cannot be empty" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:762 -#: src/forkop/tabs/dashboard/initController.ts:766 -#: src/forkop/tabs/dashboard/initController.ts:842 -#: src/forkop/tabs/dashboard/initController.ts:1055 +#: src/tachyon/tabs/dashboard/initController.ts:762 +#: src/tachyon/tabs/dashboard/initController.ts:766 +#: src/tachyon/tabs/dashboard/initController.ts:842 +#: src/tachyon/tabs/dashboard/initController.ts:1055 msgid "No" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:960 +#: src/tachyon/tabs/monitoring/initController.ts:960 msgid "No active connections" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:961 +#: src/tachyon/tabs/monitoring/initController.ts:961 msgid "No closed connections" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:32 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:32 msgid "No conflict detected" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:187 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:187 msgid "No enabled server inbounds configured" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:105 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:105 msgid "No other marking rules found" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:99 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:99 msgid "No public firewall port required" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:79 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:79 msgid "No rules use ByeDPI" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:79 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:79 msgid "No rules use Zapret" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:82 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:82 msgid "No rules use Zapret2" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1012 -#: src/forkop/tabs/dashboard/initController.ts:1268 +#: src/tachyon/tabs/dashboard/initController.ts:1012 +#: src/tachyon/tabs/dashboard/initController.ts:1268 msgid "Node list is empty" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:942 -#: src/forkop/tabs/dashboard/initController.ts:1191 +#: src/tachyon/tabs/dashboard/initController.ts:942 +#: src/tachyon/tabs/dashboard/initController.ts:1191 msgid "Nodes" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:446 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2600 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2892 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2901 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:446 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2600 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2892 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2901 msgid "None" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:46 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:46 msgid "Not configured" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:70 -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:199 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:70 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:199 msgid "Not detected" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderCheckSection.ts:189 +#: src/tachyon/tabs/diagnostic/partials/renderCheckSection.ts:189 msgid "Not implement yet" msgstr "" -#: src/forkop/helpers/singBoxVariant.ts:29 -#: src/forkop/helpers/singBoxVariant.ts:37 -#: src/forkop/tabs/updates/initController.ts:930 -#: src/forkop/tabs/updates/initController.ts:943 -#: src/forkop/tabs/updates/initController.ts:956 +#: src/tachyon/helpers/singBoxVariant.ts:29 +#: src/tachyon/helpers/singBoxVariant.ts:37 +#: src/tachyon/tabs/updates/initController.ts:930 +#: src/tachyon/tabs/updates/initController.ts:943 +#: src/tachyon/tabs/updates/initController.ts:956 msgid "Not installed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:62 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:62 msgid "Not public" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:139 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:139 msgid "Not required for this listen address" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts:90 -#: src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts:117 -#: src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts:123 -#: src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts:151 +#: src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:90 +#: src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:117 +#: src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:123 +#: src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:151 msgid "Not responding" msgstr "" -#: src/forkop/tabs/diagnostic/diagnostic.store.ts:125 -#: src/forkop/tabs/diagnostic/initController.ts:116 -#: src/forkop/tabs/diagnostic/initController.ts:346 -#: src/forkop/tabs/diagnostic/initController.ts:403 -#: src/forkop/tabs/diagnostic/initController.ts:489 +#: src/tachyon/tabs/diagnostic/diagnostic.store.ts:125 +#: src/tachyon/tabs/diagnostic/initController.ts:116 +#: src/tachyon/tabs/diagnostic/initController.ts:346 +#: src/tachyon/tabs/diagnostic/initController.ts:403 +#: src/tachyon/tabs/diagnostic/initController.ts:489 msgid "Not running" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2900 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2900 msgid "Obfuscation" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2923 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2923 msgid "Obfuscation password" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2653 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2653 msgid "Only from the specified countries." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1690 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1698 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1690 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1698 msgid "Only selected" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1691 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1700 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1691 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1700 msgid "Only selected except exclusions" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2669 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2669 msgid "Only servers whose names match the expression." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2620 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2620 msgid "Only servers with one of the selected protocols." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2624 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2624 msgid "Only servers with one of the selected security types." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2621 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2621 msgid "Only servers with one of the selected transports." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2661 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2661 msgid "Only the specified servers." msgstr "" -#: src/forkop/tabs/updates/initController.ts:1008 -#: src/forkop/tabs/updates/initController.ts:1030 +#: src/tachyon/tabs/updates/initController.ts:1008 +#: src/tachyon/tabs/updates/initController.ts:1030 msgid "Open" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3372 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3372 msgid "Open priority settings and enter a display name" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts:31 +#: src/tachyon/tabs/diagnostic/partials/renderWikiDisclaimer.ts:31 msgid "Open Project Page" msgstr "" #: src/helpers/withTimeout.ts:7 -#: src/forkop/methods/shell/index.ts:432 -#: src/forkop/methods/shell/index.ts:520 +#: src/tachyon/methods/shell/index.ts:432 +#: src/tachyon/methods/shell/index.ts:520 msgid "Operation timed out" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1344 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4092 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6234 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1344 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4092 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6234 msgid "Option \"%s\" contains an invalid input value." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5236 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5236 msgid "Optional values must be attached with '=' here; a separate token would be ignored by nfqws." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5710 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5710 msgid "Optional values must be attached with '=' here; a separate token would be ignored by nfqws2." msgstr "" @@ -1997,19 +1921,19 @@ msgstr "" msgid "outbounds must be a non-empty array of strings" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:313 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:313 msgid "Output Network Interface" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2982 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2982 msgid "Padding" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2863 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2863 msgid "Password" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7266 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7266 msgid "Password cannot be empty" msgstr "" @@ -2017,407 +1941,407 @@ msgstr "" msgid "Path cannot be empty" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:641 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:641 msgid "Path must be absolute (start with /)" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:650 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:650 msgid "Path must contain at least one directory (like /tmp/cache.db)" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:645 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:645 msgid "Path must end with cache.db" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:691 -#: src/forkop/tabs/monitoring/render.ts:70 -#: src/forkop/tabs/monitoring/render.ts:71 +#: src/tachyon/tabs/monitoring/initController.ts:691 +#: src/tachyon/tabs/monitoring/render.ts:70 +#: src/tachyon/tabs/monitoring/render.ts:71 msgid "Pause updates" msgstr "" -#: src/forkop/tabs/diagnostic/diagnostic.store.ts:63 +#: src/tachyon/tabs/diagnostic/diagnostic.store.ts:63 msgid "Pending" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2819 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2819 msgid "Periodically check the current level and switch to a faster server even when the current one works." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2365 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2854 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2365 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2854 msgid "Pin on dashboard" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7174 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7174 msgid "Port cannot be empty" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:19 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:19 msgid "Port conflict" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7164 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7164 msgid "Port for the local mixed proxy of this section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4857 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1814 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4857 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1814 msgid "Port must be between 1 and 65535" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4861 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4861 msgid "Port range start must be less than or equal to end" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7525 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7525 msgid "Ports" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:241 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:241 msgid "Prefer IPv4" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:243 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:243 msgid "Prefer IPv6" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3025 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3025 msgid "Preferred IP" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2202 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2202 msgid "Prefix text" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7035 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7035 msgid "Priority" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1298 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:404 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:405 +#: src/tachyon/tabs/dashboard/initController.ts:1298 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:404 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:405 msgid "Priority details" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1128 +#: src/tachyon/tabs/dashboard/initController.ts:1128 msgid "Priority details are unavailable" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3259 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3260 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3259 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3260 msgid "Priority level settings" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2872 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2872 msgid "Priority levels" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3317 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3322 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3323 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3317 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3322 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3323 msgid "Priority settings" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1760 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2486 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2520 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1760 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2486 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2520 msgid "Protocol" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:757 +#: src/tachyon/tabs/dashboard/initController.ts:757 msgid "Proxy link is unavailable" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2549 -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:40 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2549 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:40 msgid "Public host" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1613 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1613 msgid "QR code is too large" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2688 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2688 msgid "Reality fake site" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2699 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2699 msgid "Reality fake site port" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2742 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2742 msgid "Reality max time difference" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2710 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2710 msgid "Reality private key" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2717 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2717 msgid "Reality public key" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2723 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2723 msgid "Reality short ID" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2095 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2095 msgid "Reality short ID must contain 1-8 hex digits" msgstr "" -#: src/forkop/tabs/dashboard/partials/renderSections.ts:135 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:135 msgid "Refill" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7386 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7386 msgid "Regional options cannot be used together" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4743 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4743 msgid "Regular expression must not contain spaces or commas" msgstr "" -#: src/forkop/tabs/updates/initController.ts:799 +#: src/tachyon/tabs/updates/initController.ts:799 msgid "Remove" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2677 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2677 msgid "Remove servers from the specified countries from this level." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2693 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2693 msgid "Remove servers whose names match the expression from this level." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2685 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2685 msgid "Remove the specified servers from this level." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7190 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7190 msgid "Require a username and password for the local mixed proxy" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7277 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7277 msgid "Resolve domain names before routing so sing-box can use real destination IPs." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7276 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7276 msgid "Resolve real IP for routing" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5031 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5031 msgid "Resource selection by hostname inside nfqws is not supported here; sing-box selects resources before NFQUEUE." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5476 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5476 msgid "Resource selection by hostname inside nfqws2 is not supported here; sing-box selects resources before NFQUEUE." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5034 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5034 msgid "Resource selection by IP or CIDR inside nfqws is not supported here; sing-box selects resources before NFQUEUE." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5479 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5479 msgid "Resource selection by IP or CIDR inside nfqws2 is not supported here; sing-box selects resources before NFQUEUE." msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:49 -msgid "Restart Forkop" +#: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:49 +msgid "Restart Tachyon" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:691 +#: src/tachyon/tabs/monitoring/initController.ts:691 msgid "Resume updates" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:819 -#: src/forkop/tabs/monitoring/initController.ts:877 +#: src/tachyon/tabs/monitoring/initController.ts:819 +#: src/tachyon/tabs/monitoring/initController.ts:877 msgid "Route" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:252 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:252 msgid "Route main DNS requests through the selected section." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6686 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6686 msgid "Route requests to this DNS server through another section." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2561 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2561 msgid "Routing mode" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:103 -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:114 -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:144 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:103 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:114 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:144 msgid "Routing rules" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2570 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2570 msgid "Routing section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6515 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6515 msgid "Rule set must be an HTTP(S) URL or a local .srs / .json path" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3487 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3487 msgid "Rule set settings" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7441 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7468 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7441 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7468 msgid "Rule sets" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2562 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2562 msgid "Rules" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:79 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:79 msgid "Rules mangle counters" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:74 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:74 msgid "Rules mangle exist" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:89 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:89 msgid "Rules mangle output counters" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:84 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:84 msgid "Rules mangle output exist" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:99 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:99 msgid "Rules proxy counters" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:94 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:94 msgid "Rules proxy exist" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderRunAction.ts:17 +#: src/tachyon/tabs/diagnostic/partials/renderRunAction.ts:17 msgid "Run Diagnostic" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7405 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7405 msgid "Russia inside restrictions" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3080 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3080 msgid "Save" msgstr "" -#: src/forkop/tabs/monitoring/render.ts:47 +#: src/tachyon/tabs/monitoring/render.ts:47 msgid "Search" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2939 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2939 msgid "Secret" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:435 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:435 msgid "Secret key for authenticating remote access to YACD when WAN access is enabled." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:396 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:396 msgid "Section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6619 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6619 msgid "Section name" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:390 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:390 msgid "Sections" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1772 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2597 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1772 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2597 msgid "Security" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2142 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2142 msgid "Select a common client profile or enter a custom User-Agent" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6918 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6918 msgid "Select a network interface" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7342 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7342 msgid "Select a predefined domain list" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6707 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:84 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6707 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:84 msgid "Select a section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2119 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2119 msgid "Select a section for downloading this subscription" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7111 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7111 msgid "Select a transit section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1670 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1670 msgid "Select an existing network interface" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7124 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7124 msgid "Select an intermediate section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:161 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:161 msgid "Select DNS protocol to use" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6913 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6913 msgid "Select network interface for VPN connection" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2155 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2155 msgid "Select or enter a User-Agent" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:624 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:624 msgid "Select or enter path for sing-box cache file. Change this ONLY if you know what you are doing" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:611 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:611 msgid "Select path for sing-box config file. Change this ONLY if you know what you are doing" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2807 -#: src/forkop/tabs/dashboard/initController.ts:1151 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2807 +#: src/tachyon/tabs/dashboard/initController.ts:1151 msgid "Select the fastest node" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:660 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:660 msgid "Select the log level for sing-box" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:268 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:268 msgid "Select the network interface from which the traffic will originate" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:314 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:314 msgid "Select the network interface to which the traffic will originate" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:375 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:375 msgid "Select the WAN interfaces to be monitored" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:910 -#: src/forkop/tabs/dashboard/initController.ts:1137 +#: src/tachyon/tabs/dashboard/initController.ts:910 +#: src/tachyon/tabs/dashboard/initController.ts:1137 msgid "Selected" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2564 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2564 msgid "Selected section" msgstr "" @@ -2425,33 +2349,33 @@ msgstr "" msgid "Selector and URLTest outbounds must contain a non-empty outbounds array" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:413 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:413 msgid "Server" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2383 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2586 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2383 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2586 msgid "Server filtering" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6979 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6979 msgid "Server group for automatic lowest-latency selection" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7036 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7036 msgid "Server group for priority failover" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1707 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1707 msgid "Server information" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1623 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2497 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1623 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2497 msgid "Server name" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2626 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2626 msgid "Server name / SNI" msgstr "" @@ -2467,486 +2391,562 @@ msgstr "" msgid "server_port must be a number from 1 to 65535" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:407 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:407 msgid "Servers" msgstr "" -#: src/forkop/methods/shell/index.ts:383 -#: src/forkop/methods/shell/index.ts:404 -#: src/forkop/tabs/diagnostic/initController.ts:594 +#: src/tachyon/methods/shell/index.ts:383 +#: src/tachyon/methods/shell/index.ts:404 +#: src/tachyon/tabs/diagnostic/initController.ts:594 msgid "Service action failed" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7345 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7345 msgid "Service list" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1670 +#: src/tachyon/tabs/dashboard/initController.ts:1670 msgid "Services info" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:425 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1095 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6590 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1095 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6590 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:425 msgid "Settings" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2185 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2185 msgid "Show metadata on dashboard" msgstr "" -#: src/forkop/tabs/diagnostic/initController.ts:751 -#: src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:116 +#: src/tachyon/tabs/diagnostic/initController.ts:751 +#: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:116 msgid "Show sing-box config" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2186 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2186 msgid "Show subscription metadata for this source on the dashboard" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:77 +#: src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:77 msgid "Sing-box autostart disabled" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:69 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:69 msgid "Sing-box FakeIP DNS does not work" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:68 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:68 msgid "Sing-box FakeIP DNS works" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:62 +#: src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:62 msgid "Sing-box installed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:87 +#: src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:87 msgid "Sing-box listening ports" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:82 +#: src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:82 msgid "Sing-box process running" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:72 +#: src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:72 msgid "Sing-box service exist" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:67 +#: src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:67 msgid "Sing-box version is compatible (newer than 1.12.4)" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7136 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7136 msgid "Sort by latency" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7137 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7137 msgid "Sorts servers in this section by lowest latency in the dashboard." msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:831 -#: src/forkop/tabs/monitoring/initController.ts:881 +#: src/tachyon/tabs/monitoring/initController.ts:831 +#: src/tachyon/tabs/monitoring/initController.ts:881 msgid "Source" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:267 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:267 msgid "Source Network Interface" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1930 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1930 msgid "Specify a file path" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1941 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1953 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1941 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1953 msgid "Specify different files" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:122 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:122 msgid "Standalone ByeDPI autostart is enabled" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:119 -msgid "Standalone ByeDPI is active together with Forkop ByeDPI rules" +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:119 +msgid "Standalone ByeDPI is active together with Tachyon ByeDPI rules" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:120 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:120 msgid "Standalone ByeDPI service is active" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:123 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:123 msgid "Standalone ByeDPI service is inactive" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:111 -msgid "Standalone Zapret is active together with Forkop Zapret rules" +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:111 +msgid "Standalone Zapret is active together with Tachyon Zapret rules" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:112 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:112 msgid "Standalone Zapret service is active" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:113 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:113 msgid "Standalone Zapret service is inactive" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:121 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:121 msgid "Standalone Zapret2 autostart is enabled" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:118 -msgid "Standalone Zapret2 is active together with Forkop Zapret2 rules" +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:118 +msgid "Standalone Zapret2 is active together with Tachyon Zapret2 rules" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:119 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:119 msgid "Standalone Zapret2 service is active" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:122 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:122 msgid "Standalone Zapret2 service is inactive" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:69 -msgid "Start Forkop" +#: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:69 +msgid "Start Tachyon" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2341 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2341 msgid "Stop checking when URLTest group is not used. Use sing-box duration format like 1d, 12h or 30m." msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:59 -msgid "Stop Forkop" +#: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:59 +msgid "Stop Tachyon" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3481 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3481 msgid "Subnets from the list will be extracted and added to nftables" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2073 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2073 msgid "Subscription auto update" msgstr "" -#: src/forkop/tabs/dashboard/partials/renderSections.ts:149 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:149 msgid "Subscription info:" msgstr "" -#: src/forkop/methods/shell/index.ts:720 -#: src/forkop/methods/shell/index.ts:740 +#: src/tachyon/methods/shell/index.ts:720 +#: src/tachyon/methods/shell/index.ts:740 msgid "Subscription update failed" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2082 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2082 msgid "Subscription update interval" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6864 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6864 msgid "Subscription URL" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4103 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4103 msgid "Subscription URL cannot be empty" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3184 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3184 msgid "Subscription URL settings" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:301 +#: src/tachyon/tabs/dashboard/initController.ts:301 msgid "Subscriptions updated" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1630 +#: src/tachyon/tabs/dashboard/initController.ts:1630 msgid "System info" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderSystemInfo.ts:21 +#: src/tachyon/tabs/diagnostic/partials/renderSystemInfo.ts:21 msgid "System information" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:69 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:69 msgid "Table exist" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3081 +#: src/tachyon/services/core.service.ts:52 +msgid "Tachyon Error" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5902 +msgid "Tachyon manages ciadpi pid files itself, so pidfile options are not allowed here." +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5899 +msgid "Tachyon manages the ciadpi process lifecycle itself, so daemon mode is not allowed here." +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5046 +msgid "Tachyon manages the nfqws process lifecycle itself, so daemon mode is not allowed here." +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5497 +msgid "Tachyon manages the nfqws2 process lifecycle itself, so daemon mode is not allowed here." +msgstr "" + +#: src/tachyon/tabs/monitoring/initController.ts:925 +msgid "Tachyon service is stopped. Start the service to display connections." +msgstr "" + +#: src/tachyon/tabs/dashboard/render.ts:17 +msgid "Tachyon service is stopped. Start the service to display the dashboard." +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:342 +msgid "Tachyon Settings" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:602 +msgid "Tachyon will not modify your DHCP configuration" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:91 +msgid "Tachyon-managed ciadpi runtime has restarted" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:94 +msgid "Tachyon-managed ciadpi runtime is not ready" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:97 +msgid "Tachyon-managed ciadpi runtime is not running" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:93 +msgid "Tachyon-managed ciadpi runtime is ready" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:87 +msgid "Tachyon-managed nfqws runtime is not ready" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:90 +msgid "Tachyon-managed nfqws runtime is not running" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:86 +msgid "Tachyon-managed nfqws runtime is ready" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:90 +msgid "Tachyon-managed nfqws2 runtime is not ready" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:93 +msgid "Tachyon-managed nfqws2 runtime is not running" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:89 +msgid "Tachyon-managed nfqws2 runtime is ready" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3081 msgid "Tailscale auth key" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3090 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3090 msgid "Tailscale control URL" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:98 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:98 msgid "Tailscale endpoint" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3098 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3098 msgid "Tailscale hostname" msgstr "" -#: src/forkop/tabs/dashboard/partials/renderSections.ts:242 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:250 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:491 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:242 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:250 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:491 msgid "Test latency" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2451 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2451 msgid "Test only selected servers." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2411 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2411 msgid "Test only servers with one of the selected protocols." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2417 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2417 msgid "Test only servers with one of the selected security types." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2414 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2414 msgid "Test only servers with one of the selected transports." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2443 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2443 msgid "Test servers only from the specified countries." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2459 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2459 msgid "Test servers whose names match the expression." msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:913 +#: src/tachyon/tabs/dashboard/initController.ts:913 msgid "Testing URL" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5043 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5488 -msgid "The desync fwmark is managed by Forkop for loop prevention and must not be overridden here." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5043 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5488 +msgid "The desync fwmark is managed by Tachyon for loop prevention and must not be overridden here." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5040 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5485 -msgid "The NFQUEUE number is assigned by Forkop for each rule and must not be overridden here." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5040 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5485 +msgid "The NFQUEUE number is assigned by Tachyon for each rule and must not be overridden here." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7303 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7303 msgid "The rule applies to the domain and all its subdomains. Use full:, keyword:, or regex: prefixes for exact match, keyword match, or regular expression." msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:78 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:78 msgid "There are rules using ByeDPI" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:78 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:78 msgid "There are rules using Zapret" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:81 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:81 msgid "There are rules using Zapret2" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1829 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1834 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1924 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2086 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2886 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1829 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1834 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1924 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2086 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2886 msgid "This field is required" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5905 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5905 msgid "This field must start a working ciadpi strategy; help/version options exit immediately and are not allowed here." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5049 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5049 msgid "This field must start a working nfqws strategy; --dry-run exits immediately and is not allowed here." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5052 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5052 msgid "This field must start a working nfqws strategy; --version exits immediately and is not allowed here." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5500 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5500 msgid "This field must start a working nfqws2 strategy; --dry-run exits immediately and is not allowed here." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5503 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5503 msgid "This field must start a working nfqws2 strategy; --version exits immediately and is not allowed here." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5221 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5695 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5221 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5695 msgid "This flag does not accept a value." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5252 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5726 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5252 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5726 msgid "This option requires a value." msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:822 -#: src/forkop/tabs/monitoring/initController.ts:878 +#: src/tachyon/tabs/monitoring/initController.ts:822 +#: src/tachyon/tabs/monitoring/initController.ts:878 msgid "Time" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:223 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:223 msgid "Time in seconds for DNS record caching (default: 60)" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3055 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3055 msgid "Time skew tolerance" msgstr "" -#: src/forkop/helpers/singBoxVariant.ts:53 +#: src/tachyon/helpers/singBoxVariant.ts:53 msgid "tiny" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2313 -#: src/forkop/tabs/dashboard/initController.ts:915 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2313 +#: src/tachyon/tabs/dashboard/initController.ts:915 msgid "Tolerance" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2873 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2873 msgid "Top level has the highest priority; lower levels are used as fallback" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1556 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:130 +#: src/tachyon/tabs/dashboard/initController.ts:1556 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:130 msgid "Traffic" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2578 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2578 msgid "Traffic for this level goes directly." msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1590 +#: src/tachyon/tabs/dashboard/initController.ts:1590 msgid "Traffic Total" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5896 -msgid "Transparent proxy mode is incompatible with action=byedpi because Forkop connects to ciadpi through SOCKS." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5896 +msgid "Transparent proxy mode is incompatible with action=byedpi because Tachyon connects to ciadpi through SOCKS." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1766 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2764 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1766 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2764 msgid "Transport" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2788 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2788 msgid "Transport host" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2772 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2772 msgid "Transport path" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2007 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2007 msgid "Transport path must start with /" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts:25 +#: src/tachyon/tabs/diagnostic/partials/renderWikiDisclaimer.ts:25 msgid "Troubleshooting" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2131 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2131 msgid "Try compatible User-Agent profiles automatically when downloading this subscription" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:234 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:234 msgid "TTL must be a positive number" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:229 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:229 msgid "TTL value cannot be empty" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1638 -#: src/forkop/tabs/monitoring/initController.ts:816 -#: src/forkop/tabs/monitoring/initController.ts:876 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1638 +#: src/tachyon/tabs/monitoring/initController.ts:816 +#: src/tachyon/tabs/monitoring/initController.ts:876 msgid "Type" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:165 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:165 msgid "UDP (Unprotected DNS)" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5820 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5820 msgid "Unable to validate the ByeDPI strategy through the backend parser." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4963 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6298 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6741 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4963 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6298 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6741 msgid "Unable to validate the NFQWS strategy through the backend parser." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5408 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6307 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5408 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6307 msgid "Unable to validate the NFQWS2 strategy through the backend parser." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2781 -#: src/forkop/tabs/dashboard/initController.ts:1145 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2781 +#: src/tachyon/tabs/dashboard/initController.ts:1145 msgid "Unavailability timeout" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6037 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6086 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6037 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6086 msgid "Unexpected ByeDPI strategy argument: %s" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:96 -msgid "Unexpected Forkop-managed ciadpi runtime is running" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:89 -msgid "Unexpected Forkop-managed nfqws runtime is running" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:92 -msgid "Unexpected Forkop-managed nfqws2 runtime is running" -msgstr "" - -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5201 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5675 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5201 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5675 msgid "Unexpected standalone token. Use explicit flags such as --name or --name=value." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:54 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:96 +msgid "Unexpected Tachyon-managed ciadpi runtime is running" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:89 +msgid "Unexpected Tachyon-managed nfqws runtime is running" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:92 +msgid "Unexpected Tachyon-managed nfqws2 runtime is running" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:54 msgid "unique UCI identifier" msgstr "" -#: src/forkop/helpers/singBoxVariant.ts:28 -#: src/forkop/services/systemInfo.service.ts:10 -#: src/forkop/services/systemInfo.service.ts:11 -#: src/forkop/services/systemInfo.service.ts:12 -#: src/forkop/services/systemInfo.service.ts:13 -#: src/forkop/services/systemInfo.service.ts:18 -#: src/forkop/services/systemInfo.service.ts:20 -#: src/forkop/services/systemInfo.service.ts:22 -#: src/forkop/services/systemInfo.service.ts:25 -#: src/forkop/services/systemInfo.service.ts:26 -#: src/forkop/tabs/updates/initController.ts:329 -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:25 +#: src/tachyon/helpers/singBoxVariant.ts:28 +#: src/tachyon/services/systemInfo.service.ts:10 +#: src/tachyon/services/systemInfo.service.ts:11 +#: src/tachyon/services/systemInfo.service.ts:12 +#: src/tachyon/services/systemInfo.service.ts:13 +#: src/tachyon/services/systemInfo.service.ts:18 +#: src/tachyon/services/systemInfo.service.ts:20 +#: src/tachyon/services/systemInfo.service.ts:22 +#: src/tachyon/services/systemInfo.service.ts:25 +#: src/tachyon/services/systemInfo.service.ts:26 +#: src/tachyon/tabs/updates/initController.ts:329 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:25 msgid "unknown" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6006 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6028 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6079 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6006 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6028 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6079 msgid "Unknown ByeDPI option: %s" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:576 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:576 msgid "Unknown country" msgstr "" -#: src/forkop/api.ts:40 +#: src/tachyon/api.ts:40 msgid "Unknown error" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5212 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5212 msgid "Unknown NFQWS flag." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5686 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5686 msgid "Unknown NFQWS2 flag." msgstr "" @@ -2954,39 +2954,39 @@ msgstr "" msgid "Unspecified IP address is not allowed" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2120 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2120 msgid "Unsupported security mode for this protocol" msgstr "" -#: src/forkop/tabs/updates/initController.ts:754 +#: src/tachyon/tabs/updates/initController.ts:754 msgid "Update" msgstr "" -#: src/forkop/tabs/updates/initController.ts:287 +#: src/tachyon/tabs/updates/initController.ts:287 msgid "Update is available" msgstr "" -#: src/forkop/tabs/updates/initController.ts:994 +#: src/tachyon/tabs/updates/initController.ts:994 msgid "Update is available:" msgstr "" -#: src/forkop/tabs/dashboard/partials/renderSections.ts:219 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:232 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:233 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:219 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:232 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:233 msgid "Update subscriptions" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2074 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2074 msgid "Update this subscription automatically" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1558 -#: src/forkop/tabs/dashboard/initController.ts:1593 +#: src/tachyon/tabs/dashboard/initController.ts:1558 +#: src/tachyon/tabs/dashboard/initController.ts:1593 msgid "Uplink" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:828 -#: src/forkop/tabs/monitoring/initController.ts:880 +#: src/tachyon/tabs/monitoring/initController.ts:828 +#: src/tachyon/tabs/monitoring/initController.ts:880 msgid "Uploaded" msgstr "" @@ -2998,121 +2998,121 @@ msgstr "" msgid "URL must use one of the following protocols:" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2757 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2757 msgid "URL used to check whether a server is alive" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2328 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2328 msgid "URL used to test server latency" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6978 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6978 msgid "URLTest" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1042 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:385 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:386 +#: src/tachyon/tabs/dashboard/initController.ts:1042 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:385 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:386 msgid "URLTest details" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:901 +#: src/tachyon/tabs/dashboard/initController.ts:901 msgid "URLTest details are unavailable" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3216 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3217 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3216 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3217 msgid "URLTest settings" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2104 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2104 msgid "Use 32 hex characters" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1894 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1900 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2016 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1894 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1900 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2016 msgid "Use a domain name or IP address" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1995 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1995 msgid "Use a duration like 30s, 5m, or 1h30m" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2001 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2888 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2001 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2888 msgid "Use a non-negative integer" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2107 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2107 msgid "Use a non-zero secret" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1963 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1965 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1963 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1965 msgid "Use an HTTP or HTTPS URL" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1917 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1917 msgid "Use an IP address" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1910 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1910 msgid "Use an IP listen address" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7073 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7073 msgid "Use another section as an intermediate hop to connect to servers in this section. Does not apply to network interfaces or JSON outbounds." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2064 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2064 msgid "Use CIDR prefixes like 192.168.1.0/24 or 2001:db8::/32" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2078 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2078 msgid "Use CIDR prefixes or IP addresses like 192.168.1.0/24, 192.168.1.10, or 2001:db8::1" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2022 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2022 msgid "Use letters, digits, dots, underscores, or hyphens" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:149 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:149 msgid "Use sing-box duration format like 10s, 1m or 2m30s" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2083 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2302 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2830 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4036 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4043 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4050 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:466 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:488 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:495 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:511 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:539 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2083 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2302 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2830 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4036 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4043 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4050 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:466 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:488 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:495 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:511 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:539 msgid "Use sing-box duration format like 1d, 12h or 30m" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:25 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:25 msgid "Used by" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2141 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2141 msgid "User-Agent" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2847 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2847 msgid "Username" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7230 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7230 msgid "Username cannot be empty" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4736 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4749 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4736 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4749 #: src/validators/validateDns.ts:21 #: src/validators/validateDns.ts:25 #: src/validators/validateDomain.ts:57 @@ -3134,133 +3134,133 @@ msgstr "" msgid "Valid" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4165 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4185 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4189 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4165 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4185 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4189 msgid "Validation errors:" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4726 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4726 msgid "Value cannot be empty" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1838 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1838 msgid "Value must not contain control characters" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1707 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1707 msgid "Via country.is" msgstr "" -#: src/forkop/tabs/diagnostic/initController.ts:717 -#: src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:107 +#: src/tachyon/tabs/diagnostic/initController.ts:717 +#: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:107 msgid "View logs" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6620 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6620 msgid "Visible name of this section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2891 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2891 msgid "VLESS flow" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6843 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6843 msgid "vless://, vmess://, ss://, trojan://, socks4/5://, http(s)://, hy2/hysteria2:// links" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:70 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:70 msgid "WAN" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:198 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:198 msgid "WAN public IP" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7388 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7388 msgid "Warning: %s cannot be used together with %s. Previous selections have been removed." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7407 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7407 msgid "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6633 -msgid "What Forkop should do when this section matches" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6633 +msgid "What Tachyon should do when this section matches" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2808 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2808 msgid "When switching to another level, test every server and select the fastest instead of the first working one." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2801 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2801 msgid "XHTTP mode" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:434 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:434 msgid "YACD Secret Key" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:762 +#: src/tachyon/tabs/dashboard/initController.ts:762 msgid "Yes" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:305 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:305 msgid "You can select Output Network Interface, by default autodetect" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5037 -msgid "Zapret hostlist templates are not supported here because Forkop does not expand them for per-rule NFQWS strategies." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5037 +msgid "Zapret hostlist templates are not supported here because Tachyon does not expand them for per-rule NFQWS strategies." msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:71 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:71 msgid "Zapret package is installed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:72 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:72 msgid "Zapret package is not installed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:60 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:60 msgid "Zapret provider binary is available" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:61 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:61 msgid "Zapret provider binary is not available" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:103 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:103 msgid "Zapret sing-box outbound is configured" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:104 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:104 msgid "Zapret sing-box outbound is not configured" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5482 -msgid "Zapret2 hostlist templates are not supported here because Forkop does not expand them for per-rule NFQWS2 strategies." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5482 +msgid "Zapret2 hostlist templates are not supported here because Tachyon does not expand them for per-rule NFQWS2 strategies." msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:74 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:74 msgid "Zapret2 package is installed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:75 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:75 msgid "Zapret2 package is not installed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:63 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:63 msgid "Zapret2 provider binary is available" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:64 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:64 msgid "Zapret2 provider binary is not available" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:106 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:106 msgid "Zapret2 sing-box outbound is configured" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:107 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:107 msgid "Zapret2 sing-box outbound is not configured" msgstr "" diff --git a/fe-app-tachyon/locales/tachyon.ru.po b/fe-app-tachyon/locales/tachyon.ru.po index 0653cd9d..e59e18c1 100644 --- a/fe-app-tachyon/locales/tachyon.ru.po +++ b/fe-app-tachyon/locales/tachyon.ru.po @@ -1,15 +1,15 @@ -# RU translations for FORKOP package. -# Copyright (C) 2026 THE FORKOP COPYRIGHT HOLDER -# This file is distributed under the same license as the FORKOP package. -# ushan0v, 2026. +# RU translations for TACHYON package. +# Copyright (C) 2026 THE TACHYON COPYRIGHT HOLDER +# This file is distributed under the same license as the TACHYON package. +# Dushnilin, 2026. # msgid "" msgstr "" -"Project-Id-Version: FORKOP\n" +"Project-Id-Version: TACHYON\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-13 03:22+0300\n" -"PO-Revision-Date: 2026-07-13 03:22+0300\n" -"Last-Translator: ushan0v\n" +"POT-Creation-Date: 2026-07-13 13:18+0300\n" +"PO-Revision-Date: 2026-07-13 13:18+0300\n" +"Last-Translator: Dushnilin\n" "Language-Team: none\n" "Language: ru\n" "MIME-Version: 1.0\n" @@ -191,8 +191,8 @@ msgstr "Встроенные наборы правил" msgid "By flag emoji from name" msgstr "По эмодзи флага из названия" -msgid "ByeDPI listen address and port are assigned by Forkop and must not be set in the strategy." -msgstr "Адрес и порт прослушивания ByeDPI назначаются Forkop и не должны задаваться в стратегии." +msgid "ByeDPI listen address and port are assigned by Tachyon and must not be set in the strategy." +msgstr "Адрес и порт прослушивания ByeDPI назначаются Tachyon и не должны задаваться в стратегии." msgid "ByeDPI option does not accept a compact value: %s" msgstr "Опция ByeDPI не принимает компактное значение: %s" @@ -323,8 +323,8 @@ msgstr "Условия" msgid "Config File Path" msgstr "Путь к файлу конфигурации" -msgid "Configuration for Forkop service" -msgstr "Настройки сервиса Forkop" +msgid "Configuration for Tachyon service" +msgstr "Настройки сервиса Tachyon" msgid "Configure User-Agent in the item settings" msgstr "Настройте User-Agent в настройках элемента" @@ -374,8 +374,8 @@ msgstr "Дашборд сейчас недоступен" msgid "Default address for checking server availability and latency. URLTest uses its own address." msgstr "Адрес по умолчанию для проверки доступности и задержки серверов. Для URLTest используется собственный адрес." -msgid "Delay in milliseconds before reloading Forkop after interface UP" -msgstr "Задержка в миллисекундах перед перезапуском Forkop после поднятия интерфейса" +msgid "Delay in milliseconds before reloading Tachyon after interface UP" +msgstr "Задержка в миллисекундах перед перезапуском Tachyon после поднятия интерфейса" msgid "Delay value cannot be empty" msgstr "Значение задержки не может быть пустым" @@ -419,8 +419,8 @@ msgstr "Отключить QUIC" msgid "Disable the QUIC protocol to improve compatibility or fix issues with video streaming" msgstr "Отключить QUIC протокол для улучшения совместимости или исправления видео стриминга" -msgid "Disabling interception is incompatible with action=zapret2 because Forkop sends matched traffic through NFQUEUE." -msgstr "Отключение перехвата несовместимо с action=zapret2, потому что Forkop отправляет совпавший трафик через NFQUEUE." +msgid "Disabling interception is incompatible with action=zapret2 because Tachyon sends matched traffic through NFQUEUE." +msgstr "Отключение перехвата несовместимо с action=zapret2, потому что Tachyon отправляет совпавший трафик через NFQUEUE." msgid "Display name" msgstr "Отображаемое имя" @@ -656,11 +656,11 @@ msgstr "Истекает" msgid "Expose this section as a local HTTP+SOCKS proxy" msgstr "Открыть эту секцию как локальный HTTP+SOCKS прокси" -msgid "External nfqws config files bypass Forkop queue management and explicit validation." -msgstr "Внешние конфиги nfqws обходят управление очередями и явную валидацию Forkop." +msgid "External nfqws config files bypass Tachyon queue management and explicit validation." +msgstr "Внешние конфиги nfqws обходят управление очередями и явную валидацию Tachyon." -msgid "External nfqws2 config files bypass Forkop queue management and explicit validation." -msgstr "Внешние конфиги nfqws2 обходят управление очередями и явную валидацию Forkop." +msgid "External nfqws2 config files bypass Tachyon queue management and explicit validation." +msgstr "Внешние конфиги nfqws2 обходят управление очередями и явную валидацию Tachyon." msgid "Failed to close connection" msgstr "Не удалось закрыть подключение" @@ -707,63 +707,6 @@ msgstr "Исправьте подсвеченные поля и сохранит msgid "Forced device routing" msgstr "Принудительная маршрутизация устройств" -msgid "Forkop Error" -msgstr "Ошибка Forkop" - -msgid "Forkop manages ciadpi pid files itself, so pidfile options are not allowed here." -msgstr "Forkop сам управляет pid-файлами ciadpi, поэтому параметры pidfile здесь запрещены." - -msgid "Forkop manages the ciadpi process lifecycle itself, so daemon mode is not allowed here." -msgstr "Forkop сам управляет жизненным циклом ciadpi, поэтому режим daemon здесь запрещён." - -msgid "Forkop manages the nfqws process lifecycle itself, so daemon mode is not allowed here." -msgstr "Forkop сам управляет жизненным циклом nfqws, поэтому режим daemon здесь запрещён." - -msgid "Forkop manages the nfqws2 process lifecycle itself, so daemon mode is not allowed here." -msgstr "Forkop сам управляет жизненным циклом nfqws2, поэтому режим daemon здесь запрещён." - -msgid "Forkop service is stopped. Start the service to display connections." -msgstr "Служба Forkop остановлена. Запустите сервис для отображения подключений." - -msgid "Forkop service is stopped. Start the service to display the dashboard." -msgstr "Служба Forkop остановлена. Запустите сервис для отображения дашборда." - -msgid "Forkop Settings" -msgstr "Настройки Forkop" - -msgid "Forkop will not modify your DHCP configuration" -msgstr "Forkop не будет изменять вашу конфигурацию DHCP" - -msgid "Forkop-managed ciadpi runtime has restarted" -msgstr "ciadpi Forkop перезапускался" - -msgid "Forkop-managed ciadpi runtime is not ready" -msgstr "ciadpi Forkop не готов" - -msgid "Forkop-managed ciadpi runtime is not running" -msgstr "ciadpi Forkop не запущен" - -msgid "Forkop-managed ciadpi runtime is ready" -msgstr "ciadpi Forkop готов" - -msgid "Forkop-managed nfqws runtime is not ready" -msgstr "NFQWS Forkop не готов" - -msgid "Forkop-managed nfqws runtime is not running" -msgstr "NFQWS Forkop не запущен" - -msgid "Forkop-managed nfqws runtime is ready" -msgstr "NFQWS Forkop готов" - -msgid "Forkop-managed nfqws2 runtime is not ready" -msgstr "NFQWS2 Forkop не готов" - -msgid "Forkop-managed nfqws2 runtime is not running" -msgstr "NFQWS2 Forkop не запущен" - -msgid "Forkop-managed nfqws2 runtime is ready" -msgstr "NFQWS2 Forkop готов" - msgid "Fronting IP" msgstr "IP фронтинга" @@ -773,8 +716,8 @@ msgstr "Порт фронтинга" msgid "Fronting proxy protocol" msgstr "Proxy protocol для фронтинга" -msgid "Fuzzing is not supported here because Forkop needs deterministic runtime validation." -msgstr "Fuzzing здесь не поддерживается, потому что Forkop нужна предсказуемая runtime-валидация." +msgid "Fuzzing is not supported here because Tachyon needs deterministic runtime validation." +msgstr "Fuzzing здесь не поддерживается, потому что Tachyon нужна предсказуемая runtime-валидация." msgid "Generate HWID from router hardware information for this subscription" msgstr "Генерировать HWID из аппаратной информации роутера для этой подписки" @@ -1541,8 +1484,8 @@ msgstr "Выбор ресурсов по IP или CIDR внутри nfqws зд msgid "Resource selection by IP or CIDR inside nfqws2 is not supported here; sing-box selects resources before NFQUEUE." msgstr "Выбор ресурсов по IP или CIDR внутри nfqws2 здесь не поддерживается; sing-box выбирает ресурсы до NFQUEUE." -msgid "Restart Forkop" -msgstr "Перезапустить Forkop" +msgid "Restart Tachyon" +msgstr "Перезапустить Tachyon" msgid "Resume updates" msgstr "Продолжить обновление" @@ -1787,8 +1730,8 @@ msgstr "Укажите разные файлы" msgid "Standalone ByeDPI autostart is enabled" msgstr "Автозапуск отдельной службы ByeDPI включен" -msgid "Standalone ByeDPI is active together with Forkop ByeDPI rules" -msgstr "Отдельная служба ByeDPI активна вместе с правилами ByeDPI в Forkop" +msgid "Standalone ByeDPI is active together with Tachyon ByeDPI rules" +msgstr "Отдельная служба ByeDPI активна вместе с правилами ByeDPI в Tachyon" msgid "Standalone ByeDPI service is active" msgstr "Отдельная служба ByeDPI активна" @@ -1796,8 +1739,8 @@ msgstr "Отдельная служба ByeDPI активна" msgid "Standalone ByeDPI service is inactive" msgstr "Отдельная служба ByeDPI неактивна" -msgid "Standalone Zapret is active together with Forkop Zapret rules" -msgstr "Отдельная служба Zapret активна вместе с правилами Zapret в Forkop" +msgid "Standalone Zapret is active together with Tachyon Zapret rules" +msgstr "Отдельная служба Zapret активна вместе с правилами Zapret в Tachyon" msgid "Standalone Zapret service is active" msgstr "Отдельная служба Zapret активна" @@ -1808,8 +1751,8 @@ msgstr "Отдельная служба Zapret неактивна" msgid "Standalone Zapret2 autostart is enabled" msgstr "Автозапуск отдельной службы Zapret2 включён" -msgid "Standalone Zapret2 is active together with Forkop Zapret2 rules" -msgstr "Отдельная служба Zapret2 активна вместе с правилами Zapret2 в Forkop" +msgid "Standalone Zapret2 is active together with Tachyon Zapret2 rules" +msgstr "Отдельная служба Zapret2 активна вместе с правилами Zapret2 в Tachyon" msgid "Standalone Zapret2 service is active" msgstr "Отдельная служба Zapret2 активна" @@ -1817,14 +1760,14 @@ msgstr "Отдельная служба Zapret2 активна" msgid "Standalone Zapret2 service is inactive" msgstr "Отдельная служба Zapret2 неактивна" -msgid "Start Forkop" -msgstr "Запустить Forkop" +msgid "Start Tachyon" +msgstr "Запустить Tachyon" msgid "Stop checking when URLTest group is not used. Use sing-box duration format like 1d, 12h or 30m." msgstr "Останавливать проверку если URLTest группа не используется. Используйте формат длительности sing-box, например 1d, 12h или 30m." -msgid "Stop Forkop" -msgstr "Остановить Forkop" +msgid "Stop Tachyon" +msgstr "Остановить Tachyon" msgid "Subnets from the list will be extracted and added to nftables" msgstr "IP-адреса и подсети из списка будут извлечены и добавлены в nftables" @@ -1862,6 +1805,63 @@ msgstr "Системная информация" msgid "Table exist" msgstr "Таблица существует" +msgid "Tachyon Error" +msgstr "Ошибка Tachyon" + +msgid "Tachyon manages ciadpi pid files itself, so pidfile options are not allowed here." +msgstr "Tachyon сам управляет pid-файлами ciadpi, поэтому параметры pidfile здесь запрещены." + +msgid "Tachyon manages the ciadpi process lifecycle itself, so daemon mode is not allowed here." +msgstr "Tachyon сам управляет жизненным циклом ciadpi, поэтому режим daemon здесь запрещён." + +msgid "Tachyon manages the nfqws process lifecycle itself, so daemon mode is not allowed here." +msgstr "Tachyon сам управляет жизненным циклом nfqws, поэтому режим daemon здесь запрещён." + +msgid "Tachyon manages the nfqws2 process lifecycle itself, so daemon mode is not allowed here." +msgstr "Tachyon сам управляет жизненным циклом nfqws2, поэтому режим daemon здесь запрещён." + +msgid "Tachyon service is stopped. Start the service to display connections." +msgstr "Служба Tachyon остановлена. Запустите сервис для отображения подключений." + +msgid "Tachyon service is stopped. Start the service to display the dashboard." +msgstr "Служба Tachyon остановлена. Запустите сервис для отображения дашборда." + +msgid "Tachyon Settings" +msgstr "Настройки Tachyon" + +msgid "Tachyon will not modify your DHCP configuration" +msgstr "Tachyon не будет изменять вашу конфигурацию DHCP" + +msgid "Tachyon-managed ciadpi runtime has restarted" +msgstr "ciadpi Tachyon перезапускался" + +msgid "Tachyon-managed ciadpi runtime is not ready" +msgstr "ciadpi Tachyon не готов" + +msgid "Tachyon-managed ciadpi runtime is not running" +msgstr "ciadpi Tachyon не запущен" + +msgid "Tachyon-managed ciadpi runtime is ready" +msgstr "ciadpi Tachyon готов" + +msgid "Tachyon-managed nfqws runtime is not ready" +msgstr "NFQWS Tachyon не готов" + +msgid "Tachyon-managed nfqws runtime is not running" +msgstr "NFQWS Tachyon не запущен" + +msgid "Tachyon-managed nfqws runtime is ready" +msgstr "NFQWS Tachyon готов" + +msgid "Tachyon-managed nfqws2 runtime is not ready" +msgstr "NFQWS2 Tachyon не готов" + +msgid "Tachyon-managed nfqws2 runtime is not running" +msgstr "NFQWS2 Tachyon не запущен" + +msgid "Tachyon-managed nfqws2 runtime is ready" +msgstr "NFQWS2 Tachyon готов" + msgid "Tailscale auth key" msgstr "Ключ авторизации Tailscale" @@ -1898,11 +1898,11 @@ msgstr "Тестировать серверы, имена которых сов msgid "Testing URL" msgstr "URL проверки" -msgid "The desync fwmark is managed by Forkop for loop prevention and must not be overridden here." -msgstr "Desync fwmark управляется Forkop для защиты от циклов и не должен переопределяться здесь." +msgid "The desync fwmark is managed by Tachyon for loop prevention and must not be overridden here." +msgstr "Desync fwmark управляется Tachyon для защиты от циклов и не должен переопределяться здесь." -msgid "The NFQUEUE number is assigned by Forkop for each rule and must not be overridden here." -msgstr "Номер NFQUEUE назначается Forkop для каждого правила и не должен переопределяться здесь." +msgid "The NFQUEUE number is assigned by Tachyon for each rule and must not be overridden here." +msgstr "Номер NFQUEUE назначается Tachyon для каждого правила и не должен переопределяться здесь." msgid "The rule applies to the domain and all its subdomains. Use full:, keyword:, or regex: prefixes for exact match, keyword match, or regular expression." msgstr "Правило применяется к домену и всем его поддоменам. Для полного совпадения, совпадению по слову или регулярному выражению используйте префиксы full:, keyword: или regex:." @@ -1967,8 +1967,8 @@ msgstr "Трафик этого уровня пойдёт напрямую." msgid "Traffic Total" msgstr "Всего трафика" -msgid "Transparent proxy mode is incompatible with action=byedpi because Forkop connects to ciadpi through SOCKS." -msgstr "Режим прозрачного прокси несовместим с action=byedpi, потому что Forkop подключается к ciadpi через SOCKS." +msgid "Transparent proxy mode is incompatible with action=byedpi because Tachyon connects to ciadpi through SOCKS." +msgstr "Режим прозрачного прокси несовместим с action=byedpi, потому что Tachyon подключается к ciadpi через SOCKS." msgid "Transport" msgstr "Транспорт" @@ -2015,18 +2015,18 @@ msgstr "Таймаут недоступности" msgid "Unexpected ByeDPI strategy argument: %s" msgstr "Неожиданный аргумент стратегии ByeDPI: %s" -msgid "Unexpected Forkop-managed ciadpi runtime is running" -msgstr "Обнаружен лишний ciadpi Forkop" - -msgid "Unexpected Forkop-managed nfqws runtime is running" -msgstr "Обнаружен лишний NFQWS Forkop" - -msgid "Unexpected Forkop-managed nfqws2 runtime is running" -msgstr "Обнаружен лишний NFQWS2 Forkop" - msgid "Unexpected standalone token. Use explicit flags such as --name or --name=value." msgstr "Неожиданный отдельный токен. Используйте явные флаги вида --имя или --имя=значение." +msgid "Unexpected Tachyon-managed ciadpi runtime is running" +msgstr "Обнаружен лишний ciadpi Tachyon" + +msgid "Unexpected Tachyon-managed nfqws runtime is running" +msgstr "Обнаружен лишний NFQWS Tachyon" + +msgid "Unexpected Tachyon-managed nfqws2 runtime is running" +msgstr "Обнаружен лишний NFQWS2 Tachyon" + msgid "unique UCI identifier" msgstr "уникальный идентификатор UCI" @@ -2192,8 +2192,8 @@ msgstr "Предупреждение: %s нельзя использовать msgid "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection." msgstr "Предупреждение: Russia inside может быть использован только с %s. %s уже есть в Russia inside и будет удален из выбранных." -msgid "What Forkop should do when this section matches" -msgstr "Что Forkop должен делать при совпадении этой секции" +msgid "What Tachyon should do when this section matches" +msgstr "Что Tachyon должен делать при совпадении этой секции" msgid "When switching to another level, test every server and select the fastest instead of the first working one." msgstr "При переходе на другой уровень тестировать все сервера и выбирать самый быстрый, а не первый работающий." @@ -2210,8 +2210,8 @@ msgstr "Да" msgid "You can select Output Network Interface, by default autodetect" msgstr "Вы можете выбрать выходной сетевой интерфейс, по умолчанию он определяется автоматически." -msgid "Zapret hostlist templates are not supported here because Forkop does not expand them for per-rule NFQWS strategies." -msgstr "Шаблоны hostlist zapret здесь не поддерживаются, потому что Forkop не разворачивает их для per-rule стратегий NFQWS." +msgid "Zapret hostlist templates are not supported here because Tachyon does not expand them for per-rule NFQWS strategies." +msgstr "Шаблоны hostlist zapret здесь не поддерживаются, потому что Tachyon не разворачивает их для per-rule стратегий NFQWS." msgid "Zapret package is installed" msgstr "Пакет Zapret установлен" @@ -2231,8 +2231,8 @@ msgstr "sing-box outbound для Zapret настроен" msgid "Zapret sing-box outbound is not configured" msgstr "sing-box outbound для Zapret не настроен" -msgid "Zapret2 hostlist templates are not supported here because Forkop does not expand them for per-rule NFQWS2 strategies." -msgstr "Шаблоны hostlist Zapret2 здесь не поддерживаются, потому что Forkop не разворачивает их для per-rule стратегий NFQWS2." +msgid "Zapret2 hostlist templates are not supported here because Tachyon does not expand them for per-rule NFQWS2 strategies." +msgstr "Шаблоны hostlist Zapret2 здесь не поддерживаются, потому что Tachyon не разворачивает их для per-rule стратегий NFQWS2." msgid "Zapret2 package is installed" msgstr "Пакет Zapret2 установлен" diff --git a/fe-app-tachyon/src/constants.ts b/fe-app-tachyon/src/constants.ts index 787e0272..e2df4189 100644 --- a/fe-app-tachyon/src/constants.ts +++ b/fe-app-tachyon/src/constants.ts @@ -1,7 +1,7 @@ -export const FORKOP_UCI_PACKAGE = 'forkop'; -export const FORKOP_LUCI_APP_VERSION = '__COMPILED_VERSION_VARIABLE__'; -export const FORKOP_ACTION_PROVIDERS_AVAILABILITY_EVENT = - 'forkop:action-providers-availability'; +export const TACHYON_UCI_PACKAGE = 'tachyon'; +export const TACHYON_LUCI_APP_VERSION = '__COMPILED_VERSION_VARIABLE__'; +export const TACHYON_ACTION_PROVIDERS_AVAILABILITY_EVENT = + 'tachyon:action-providers-availability'; export const FAKEIP_CHECK_DOMAIN = 'fakeip.podkop.fyi'; export const IP_CHECK_DOMAIN = 'ip.podkop.fyi'; export const DEFAULT_LATENCY_TEST_URL = 'https://www.gstatic.com/generate_204'; diff --git a/fe-app-tachyon/src/helpers/injectGlobalStyles.ts b/fe-app-tachyon/src/helpers/injectGlobalStyles.ts index d2c62183..56c03bdc 100644 --- a/fe-app-tachyon/src/helpers/injectGlobalStyles.ts +++ b/fe-app-tachyon/src/helpers/injectGlobalStyles.ts @@ -1,16 +1,16 @@ import { GlobalStyles } from '../styles'; -const FORKOP_GLOBAL_STYLES_ID = 'forkop-global-styles'; +const TACHYON_GLOBAL_STYLES_ID = 'tachyon-global-styles'; export function injectGlobalStyles() { - if (document.getElementById(FORKOP_GLOBAL_STYLES_ID)) { + if (document.getElementById(TACHYON_GLOBAL_STYLES_ID)) { return; } document.head.insertAdjacentHTML( 'beforeend', ` - `, diff --git a/fe-app-tachyon/src/helpers/tests/serverHysteria2Link.test.js b/fe-app-tachyon/src/helpers/tests/serverHysteria2Link.test.js index cb0ce6f6..75f5fb96 100644 --- a/fe-app-tachyon/src/helpers/tests/serverHysteria2Link.test.js +++ b/fe-app-tachyon/src/helpers/tests/serverHysteria2Link.test.js @@ -7,7 +7,7 @@ import { describe, expect, it } from 'vitest'; const testDir = path.dirname(fileURLToPath(import.meta.url)); const serverViewPath = path.resolve( testDir, - '../../../../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js', + '../../../../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js', ); function loadBuildHysteria2Link(values) { @@ -52,7 +52,7 @@ function loadBuildHysteria2Link(values) { }, }; - return factory(uci, 'forkop', { location: { hostname: 'router.lan' } }); + return factory(uci, 'tachyon', { location: { hostname: 'router.lan' } }); } describe('buildHysteria2Link', () => { diff --git a/fe-app-tachyon/src/helpers/withTimeout.ts b/fe-app-tachyon/src/helpers/withTimeout.ts index 9f723c07..d108309b 100644 --- a/fe-app-tachyon/src/helpers/withTimeout.ts +++ b/fe-app-tachyon/src/helpers/withTimeout.ts @@ -1,4 +1,4 @@ -import { logger } from '../forkop/services/logger.service'; +import { logger } from '../tachyon/services/logger.service'; export async function withTimeout( promise: Promise, diff --git a/fe-app-tachyon/src/main.ts b/fe-app-tachyon/src/main.ts index 3bea32d3..3eb339b2 100644 --- a/fe-app-tachyon/src/main.ts +++ b/fe-app-tachyon/src/main.ts @@ -25,14 +25,14 @@ export { getProxyUrlName } from './helpers/getProxyUrlName'; export { injectGlobalStyles } from './helpers/injectGlobalStyles'; export { showToast } from './helpers/showToast'; export { getClashUIUrl } from './helpers/getClashApiUrl'; -export { ForkopShellMethods } from './forkop/methods/shell'; -export { coreService } from './forkop/services/core.service'; -export { store } from './forkop/services/store.service'; -export { applyUiStateToStore } from './forkop/services/uiState.service'; -export { DashboardTab } from './forkop/tabs/dashboard'; -export { DiagnosticTab } from './forkop/tabs/diagnostic'; -export { MonitoringTab } from './forkop/tabs/monitoring'; -export { UpdatesTab } from './forkop/tabs/updates'; +export { TachyonShellMethods } from './tachyon/methods/shell'; +export { coreService } from './tachyon/services/core.service'; +export { store } from './tachyon/services/store.service'; +export { applyUiStateToStore } from './tachyon/services/uiState.service'; +export { DashboardTab } from './tachyon/tabs/dashboard'; +export { DiagnosticTab } from './tachyon/tabs/diagnostic'; +export { MonitoringTab } from './tachyon/tabs/monitoring'; +export { UpdatesTab } from './tachyon/tabs/updates'; export { ALLOWED_WITH_RUSSIA_INSIDE, BOOTSTRAP_DNS_SERVER_OPTIONS, @@ -40,7 +40,7 @@ export { DNS_SERVER_OPTIONS, DOMAIN_LIST_OPTIONS, LATENCY_TEST_URL_OPTIONS, - FORKOP_ACTION_PROVIDERS_AVAILABILITY_EVENT, - FORKOP_UCI_PACKAGE, + TACHYON_ACTION_PROVIDERS_AVAILABILITY_EVENT, + TACHYON_UCI_PACKAGE, REGIONAL_OPTIONS, } from './constants'; diff --git a/fe-app-tachyon/src/styles.ts b/fe-app-tachyon/src/styles.ts index 5f43d988..3fc475a1 100644 --- a/fe-app-tachyon/src/styles.ts +++ b/fe-app-tachyon/src/styles.ts @@ -1,10 +1,10 @@ // language=CSS -import { DashboardTab } from './forkop/tabs/dashboard'; -import { DiagnosticTab } from './forkop/tabs/diagnostic'; -import { MonitoringTab } from './forkop/tabs/monitoring'; -import { UpdatesTab } from './forkop/tabs/updates'; +import { DashboardTab } from './tachyon/tabs/dashboard'; +import { DiagnosticTab } from './tachyon/tabs/diagnostic'; +import { MonitoringTab } from './tachyon/tabs/monitoring'; +import { UpdatesTab } from './tachyon/tabs/updates'; import { PartialStyles } from './partials'; -import { FORKOP_UCI_PACKAGE as FORKOP_CBI_PREFIX } from './constants'; +import { TACHYON_UCI_PACKAGE as TACHYON_CBI_PREFIX } from './constants'; export const GlobalStyles = ` ${DashboardTab.styles} @@ -15,49 +15,49 @@ ${PartialStyles} /* Hide extra H3 for settings tab */ -#cbi-${FORKOP_CBI_PREFIX}-settings > h3 { +#cbi-${TACHYON_CBI_PREFIX}-settings > h3 { display: none; } /* Hide extra H3 for rules tab */ -#cbi-${FORKOP_CBI_PREFIX}-section > h3:nth-child(1) { +#cbi-${TACHYON_CBI_PREFIX}-section > h3:nth-child(1) { display: none; } /* Vertical align for remove rule action button */ -#cbi-${FORKOP_CBI_PREFIX}-section > .cbi-section-remove { +#cbi-${TACHYON_CBI_PREFIX}-section > .cbi-section-remove { margin-bottom: -32px; } -#cbi-${FORKOP_CBI_PREFIX}-section .cbi-section-actions > div { +#cbi-${TACHYON_CBI_PREFIX}-section .cbi-section-actions > div { display: inline-flex; align-items: center; gap: 4px; } -#cbi-${FORKOP_CBI_PREFIX}-section .cbi-section-actions { +#cbi-${TACHYON_CBI_PREFIX}-section .cbi-section-actions { text-align: right; } /* Rule reorder visuals */ -#cbi-${FORKOP_CBI_PREFIX}-section { +#cbi-${TACHYON_CBI_PREFIX}-section { position: relative; } -#cbi-${FORKOP_CBI_PREFIX}-section .cbi-section-table-row { +#cbi-${TACHYON_CBI_PREFIX}-section .cbi-section-table-row { position: relative; } -#cbi-${FORKOP_CBI_PREFIX}-section .cbi-section-table-row.placeholder { +#cbi-${TACHYON_CBI_PREFIX}-section .cbi-section-table-row.placeholder { opacity: 1; } -#cbi-${FORKOP_CBI_PREFIX}-section .cbi-section-table-row.placeholder em { +#cbi-${TACHYON_CBI_PREFIX}-section .cbi-section-table-row.placeholder em { font-style: italic; } -#cbi-${FORKOP_CBI_PREFIX}-section .cbi-section-table-row.drag-over-above::after, -#cbi-${FORKOP_CBI_PREFIX}-section .cbi-section-table-row.drag-over-below::after { +#cbi-${TACHYON_CBI_PREFIX}-section .cbi-section-table-row.drag-over-above::after, +#cbi-${TACHYON_CBI_PREFIX}-section .cbi-section-table-row.drag-over-below::after { content: ''; position: absolute; left: 10px; @@ -69,11 +69,11 @@ ${PartialStyles} z-index: 2; } -#cbi-${FORKOP_CBI_PREFIX}-section .cbi-section-table-row.drag-over-above::after { +#cbi-${TACHYON_CBI_PREFIX}-section .cbi-section-table-row.drag-over-above::after { top: -1px; } -#cbi-${FORKOP_CBI_PREFIX}-section .cbi-section-table-row.drag-over-below::after { +#cbi-${TACHYON_CBI_PREFIX}-section .cbi-section-table-row.drag-over-below::after { bottom: -1px; } diff --git a/fe-app-tachyon/src/tachyon/fetchers/fetchServicesInfo.ts b/fe-app-tachyon/src/tachyon/fetchers/fetchServicesInfo.ts index 11128ef4..f0c33202 100644 --- a/fe-app-tachyon/src/tachyon/fetchers/fetchServicesInfo.ts +++ b/fe-app-tachyon/src/tachyon/fetchers/fetchServicesInfo.ts @@ -1,15 +1,15 @@ -import { ForkopShellMethods } from '../methods'; +import { TachyonShellMethods } from '../methods'; import { logger } from '../services/logger.service'; import { store } from '../services/store.service'; import { refreshRuntimeUiState } from '../services/runtimeUiState.service'; -import { Forkop } from '../types'; +import { Tachyon } from '../types'; let latestServicesInfoRequestId = 0; function getSettledMethodResponse( scope: string, - result: PromiseSettledResult>, -): Forkop.MethodResponse { + result: PromiseSettledResult>, +): Tachyon.MethodResponse { if (result.status === 'fulfilled') { return result.value; } @@ -34,34 +34,34 @@ export async function fetchServicesInfo() { return uiState; } - const [forkopResult, singboxResult] = await Promise.allSettled([ - ForkopShellMethods.getStatus(), - ForkopShellMethods.getSingBoxStatus(), + const [tachyonResult, singboxResult] = await Promise.allSettled([ + TachyonShellMethods.getStatus(), + TachyonShellMethods.getSingBoxStatus(), ]); if (requestId !== latestServicesInfoRequestId) { return; } - const forkop = getSettledMethodResponse('getStatus', forkopResult); + const tachyon = getSettledMethodResponse('getStatus', tachyonResult); const singbox = getSettledMethodResponse('getSingBoxStatus', singboxResult); const previousData = store.get().servicesInfoWidget.data; store.set({ servicesInfoWidget: { loading: false, - failed: !forkop.success || !singbox.success, + failed: !tachyon.success || !singbox.success, data: { singbox: singbox.success ? singbox.data.running : previousData.singbox, - forkopRunning: forkop.success - ? forkop.data.running - : previousData.forkopRunning, - forkopEnabled: forkop.success - ? forkop.data.enabled - : previousData.forkopEnabled, - forkopStatus: forkop.success - ? forkop.data.status - : previousData.forkopStatus, + tachyonRunning: tachyon.success + ? tachyon.data.running + : previousData.tachyonRunning, + tachyonEnabled: tachyon.success + ? tachyon.data.enabled + : previousData.tachyonEnabled, + tachyonStatus: tachyon.success + ? tachyon.data.status + : previousData.tachyonStatus, }, }, }); diff --git a/fe-app-tachyon/src/tachyon/fetchers/tests/fetchServicesInfo.test.ts b/fe-app-tachyon/src/tachyon/fetchers/tests/fetchServicesInfo.test.ts index f0566915..b912dfb0 100644 --- a/fe-app-tachyon/src/tachyon/fetchers/tests/fetchServicesInfo.test.ts +++ b/fe-app-tachyon/src/tachyon/fetchers/tests/fetchServicesInfo.test.ts @@ -20,7 +20,7 @@ describe('fetchServicesInfo', () => { it('returns the fast UI state after applying it to the shared store', async () => { const uiState = { service: { - forkop: { + tachyon: { running: 1, enabled: 1, status: 'restarting', @@ -67,7 +67,7 @@ describe('fetchServicesInfo', () => { const state = store.get(); - expect(state.servicesInfoWidget.data.forkopStatus).toBe('restarting'); + expect(state.servicesInfoWidget.data.tachyonStatus).toBe('restarting'); expect(state.diagnosticsActions.restart.loading).toBe(true); }); @@ -78,9 +78,9 @@ describe('fetchServicesInfo', () => { failed: false, data: { singbox: 1, - forkopRunning: 1, - forkopEnabled: 1, - forkopStatus: 'running & enabled', + tachyonRunning: 1, + tachyonEnabled: 1, + tachyonStatus: 'running & enabled', }, }, }); @@ -113,9 +113,9 @@ describe('fetchServicesInfo', () => { expect(state.servicesInfoWidget.failed).toBe(true); expect(state.servicesInfoWidget.data).toEqual({ singbox: 0, - forkopRunning: 1, - forkopEnabled: 1, - forkopStatus: 'running & enabled', + tachyonRunning: 1, + tachyonEnabled: 1, + tachyonStatus: 'running & enabled', }); }); }); diff --git a/fe-app-tachyon/src/tachyon/helpers/getComponentActionKey.ts b/fe-app-tachyon/src/tachyon/helpers/getComponentActionKey.ts index 3f831f7d..a2b660ae 100644 --- a/fe-app-tachyon/src/tachyon/helpers/getComponentActionKey.ts +++ b/fe-app-tachyon/src/tachyon/helpers/getComponentActionKey.ts @@ -1,11 +1,11 @@ import type { StoreType } from '../services/store.service'; -import type { Forkop } from '../types'; +import type { Tachyon } from '../types'; export type UpdatesActionKey = keyof StoreType['updatesActions']; const componentActionKeyMap: Record = { - 'forkop:check_update': 'forkopCheck', - 'forkop:install': 'forkopInstall', + 'tachyon:check_update': 'tachyonCheck', + 'tachyon:install': 'tachyonInstall', 'sing_box:check_update': 'singBoxCheck', 'sing_box:install': 'singBoxInstall', 'sing_box:install_extended': 'singBoxInstallExtended', @@ -24,8 +24,8 @@ const componentActionKeyMap: Record = { }; export function getComponentActionKey( - component: Forkop.ComponentName, - action: Forkop.ComponentAction, + component: Tachyon.ComponentName, + action: Tachyon.ComponentAction, ): UpdatesActionKey | undefined { return componentActionKeyMap[`${component}:${action}`]; } diff --git a/fe-app-tachyon/src/tachyon/methods/custom/getConfigSections.ts b/fe-app-tachyon/src/tachyon/methods/custom/getConfigSections.ts index 4530e2a6..aa678fc9 100644 --- a/fe-app-tachyon/src/tachyon/methods/custom/getConfigSections.ts +++ b/fe-app-tachyon/src/tachyon/methods/custom/getConfigSections.ts @@ -1,8 +1,8 @@ -import { Forkop } from '../../types'; -import { FORKOP_UCI_PACKAGE } from '../../../constants'; +import { Tachyon } from '../../types'; +import { TACHYON_UCI_PACKAGE } from '../../../constants'; -export async function getConfigSections(): Promise { +export async function getConfigSections(): Promise { return uci - .load(FORKOP_UCI_PACKAGE) - .then(() => uci.sections(FORKOP_UCI_PACKAGE)); + .load(TACHYON_UCI_PACKAGE) + .then(() => uci.sections(TACHYON_UCI_PACKAGE)); } diff --git a/fe-app-tachyon/src/tachyon/methods/custom/getDashboardSections.ts b/fe-app-tachyon/src/tachyon/methods/custom/getDashboardSections.ts index 17658e4b..6e078a6b 100644 --- a/fe-app-tachyon/src/tachyon/methods/custom/getDashboardSections.ts +++ b/fe-app-tachyon/src/tachyon/methods/custom/getDashboardSections.ts @@ -1,5 +1,5 @@ import { getConfigSections } from './getConfigSections'; -import { ClashAPI, Forkop } from '../../types'; +import { ClashAPI, Tachyon } from '../../types'; import { canUseDirectClashApi, getClashHttpUrl, @@ -7,11 +7,11 @@ import { isCopyableProxyLink, } from '../../../helpers'; import { getOutboundTagBySection } from '../../runtimeTags'; -import { ForkopShellMethods } from '../shell'; +import { TachyonShellMethods } from '../shell'; interface IGetDashboardSectionsResponse { success: boolean; - data: Forkop.OutboundGroup[]; + data: Tachyon.OutboundGroup[]; } interface IGetDashboardSectionsOptions { @@ -28,12 +28,12 @@ type DashboardSectionCache = { section?: string; links?: Record; linkRefs?: Record; - outboundMetadata?: Forkop.GetOutboundMetadata; + outboundMetadata?: Tachyon.GetOutboundMetadata; urltestGroups?: Record; priorityGroups?: Record; subscriptionMetadata?: - | Forkop.SubscriptionMetadata - | Forkop.SubscriptionMetadata[]; + | Tachyon.SubscriptionMetadata + | Tachyon.SubscriptionMetadata[]; }; type UrlTestCacheGroup = { @@ -130,21 +130,21 @@ type ChildType = | 'priority_group' | 'priority_level'; -const DASHBOARD_SECTION_CACHE_DIR = '/var/run/forkop/section-cache'; +const DASHBOARD_SECTION_CACHE_DIR = '/var/run/tachyon/section-cache'; -function getDisplayName(section: Forkop.ConfigSection) { +function getDisplayName(section: Tachyon.ConfigSection) { return section.label || section['.name']; } -function getSectionAction(section: Forkop.ConfigSection) { +function getSectionAction(section: Tachyon.ConfigSection) { return section.action || ''; } -function getSettingsSection(configSections: Forkop.ConfigSection[]) { +function getSettingsSection(configSections: Tachyon.ConfigSection[]) { return configSections.find((section) => section['.type'] === 'settings'); } -function getClashApiSecret(configSections: Forkop.ConfigSection[]) { +function getClashApiSecret(configSections: Tachyon.ConfigSection[]) { return getSettingsSection(configSections)?.yacd_secret_key || ''; } @@ -153,8 +153,8 @@ function canFetchClashApiDirectly() { } async function getClashApiProxies( - configSections: Forkop.ConfigSection[], -): Promise> { + configSections: Tachyon.ConfigSection[], +): Promise> { if (canFetchClashApiDirectly()) { const secret = getClashApiSecret(configSections); @@ -174,7 +174,7 @@ async function getClashApiProxies( } } - return ForkopShellMethods.getClashApiProxies(); + return TachyonShellMethods.getClashApiProxies(); } function getListValues(value?: string[] | string) { @@ -193,25 +193,25 @@ function getListValues(value?: string[] | string) { } function childSections( - configSections: Forkop.ConfigSection[], + configSections: Tachyon.ConfigSection[], type: ChildType, ) { return configSections.filter((section) => section['.type'] === type); } function ownedChildSections( - parent: Forkop.ConfigSection, - children: Forkop.ConfigSection[], + parent: Tachyon.ConfigSection, + children: Tachyon.ConfigSection[], ) { return children.filter( - (section): section is Forkop.ConfigSection => + (section): section is Tachyon.ConfigSection => section.section === parent['.name'], ); } function childSectionsByOwner( - children: Forkop.ConfigSection[], - ownerKey: keyof Forkop.ConfigSection, + children: Tachyon.ConfigSection[], + ownerKey: keyof Tachyon.ConfigSection, ownerValue: string, ) { return children.filter((section) => section[ownerKey] === ownerValue); @@ -221,7 +221,7 @@ function compactSettingsMap(settings: Record) { return Object.keys(settings).length ? JSON.stringify(settings) : undefined; } -function hydrateConfigSections(configSections: Forkop.ConfigSection[]) { +function hydrateConfigSections(configSections: Tachyon.ConfigSection[]) { const subscriptionUrls = childSections(configSections, 'subscription_url'); const interfaces = childSections(configSections, 'section_interface'); const urltests = childSections(configSections, 'urltest'); @@ -233,7 +233,7 @@ function hydrateConfigSections(configSections: Forkop.ConfigSection[]) { return section; } - const next: Forkop.ConfigSection = { ...section }; + const next: Tachyon.ConfigSection = { ...section }; const subscriptionUrlItems = ownedChildSections(next, subscriptionUrls); const interfaceItems = ownedChildSections(next, interfaces); const urltestItems = ownedChildSections(next, urltests); @@ -350,16 +350,16 @@ function hydrateConfigSections(configSections: Forkop.ConfigSection[]) { }); } -function getManualProxyLinks(section: Forkop.ConfigSection) { +function getManualProxyLinks(section: Tachyon.ConfigSection) { return getListValues(section.selector_proxy_links); } -function getConnectionInterfaces(section: Forkop.ConfigSection) { +function getConnectionInterfaces(section: Tachyon.ConfigSection) { const values = getListValues(section.interfaces); return values.length ? values : getListValues(section.interface); } -function getJsonOutbounds(section: Forkop.ConfigSection) { +function getJsonOutbounds(section: Tachyon.ConfigSection) { const values = getListValues(section.outbound_jsons); return values.length ? values : getListValues(section.outbound_json); } @@ -368,27 +368,27 @@ function isConnectionAction(action: string) { return ['connection', 'proxy', 'outbound', 'vpn'].includes(action); } -function hasSubscriptionSources(section: Forkop.ConfigSection) { +function hasSubscriptionSources(section: Tachyon.ConfigSection) { return getSubscriptionSourceCount(section) > 0; } -function getSubscriptionSourceCount(section: Forkop.ConfigSection) { +function getSubscriptionSourceCount(section: Tachyon.ConfigSection) { return getListValues(section.subscription_urls).length; } -function shouldSortByLatency(section: Forkop.ConfigSection) { +function shouldSortByLatency(section: Tachyon.ConfigSection) { return section.sort_by_latency === '1'; } -function hasConfiguredUrlTestList(section: Forkop.ConfigSection) { +function hasConfiguredUrlTestList(section: Tachyon.ConfigSection) { return getListValues(section.urltests).length > 0; } -function hasConfiguredPriorityList(section: Forkop.ConfigSection) { +function hasConfiguredPriorityList(section: Tachyon.ConfigSection) { return getListValues(section.priority_groups).length > 0; } -function getUrlTestIds(section: Forkop.ConfigSection) { +function getUrlTestIds(section: Tachyon.ConfigSection) { const values = getListValues(section.urltests); return values.length ? values @@ -397,11 +397,11 @@ function getUrlTestIds(section: Forkop.ConfigSection) { : []; } -function isUrlTestEnabled(section: Forkop.ConfigSection) { +function isUrlTestEnabled(section: Tachyon.ConfigSection) { return getUrlTestIds(section).length > 0; } -function shouldUseProxyGroup(section: Forkop.ConfigSection) { +function shouldUseProxyGroup(section: Tachyon.ConfigSection) { return ( getManualProxyLinks(section).length > 0 || hasSubscriptionSources(section) || @@ -412,7 +412,7 @@ function shouldUseProxyGroup(section: Forkop.ConfigSection) { ); } -function getSectionProxyConfigType(section: Forkop.ConfigSection) { +function getSectionProxyConfigType(section: Tachyon.ConfigSection) { if (hasSubscriptionSources(section)) { return 'subscription' as const; } @@ -440,7 +440,7 @@ function getSectionProxyConfigType(section: Forkop.ConfigSection) { return undefined; } -function getJsonOutboundDisplayName(section: Forkop.ConfigSection) { +function getJsonOutboundDisplayName(section: Tachyon.ConfigSection) { try { const parsedOutbound = JSON.parse(section.outbound_json || '{}'); return parsedOutbound?.tag ? decodeURIComponent(parsedOutbound.tag) : ''; @@ -449,7 +449,7 @@ function getJsonOutboundDisplayName(section: Forkop.ConfigSection) { } } -function buildManualLinkByCode(section: Forkop.ConfigSection) { +function buildManualLinkByCode(section: Tachyon.ConfigSection) { const sectionName = section['.name']; return new Map( @@ -468,7 +468,7 @@ function uniqueCodes(codes: string[]) { return Array.from(new Set(codes.filter(Boolean))); } -function isSelectorOutbound(outbound: Forkop.Outbound) { +function isSelectorOutbound(outbound: Tachyon.Outbound) { return outbound.type?.toLowerCase() === 'selector'; } @@ -485,7 +485,7 @@ function getLatencySortValue(outbound: { latency: number }) { } function sortOutboundsForDashboard( - outbounds: Forkop.Outbound[], + outbounds: Tachyon.Outbound[], options: { pinnedCode?: string; pinnedCodes?: string[]; @@ -536,7 +536,7 @@ function sortOutboundsForDashboard( .map((item) => item.outbound); } -function sortUrlTestMembers(outbounds: Forkop.UrlTestMember[]) { +function sortUrlTestMembers(outbounds: Tachyon.UrlTestMember[]) { return outbounds .map((outbound, index) => ({ outbound, index })) .sort((left, right) => { @@ -636,7 +636,7 @@ function getPriorityTag(sectionName: string, id: string) { } function getUrlTestDisplayName( - section: Forkop.ConfigSection, + section: Tachyon.ConfigSection, id: string, settings: ItemSettings | undefined, ) { @@ -647,7 +647,7 @@ function getUrlTestDisplayName( ); } -function getUrlTestConfigs(section: Forkop.ConfigSection): UrlTestConfig[] { +function getUrlTestConfigs(section: Tachyon.ConfigSection): UrlTestConfig[] { const settingsMap = itemSettingsMap(section.urltest_settings); const sectionName = section['.name']; @@ -730,11 +730,11 @@ function priorityLevelConfigsFromSettings( ); } -function getPriorityGroupIds(section: Forkop.ConfigSection) { +function getPriorityGroupIds(section: Tachyon.ConfigSection) { return getListValues(section.priority_groups); } -function getPriorityConfigs(section: Forkop.ConfigSection): PriorityConfig[] { +function getPriorityConfigs(section: Tachyon.ConfigSection): PriorityConfig[] { const settingsMap = itemSettingsMap(section.priority_group_settings); const sectionName = section['.name']; @@ -840,7 +840,7 @@ function getOutboundDisplayName( code: string, entry: ClashProxyEntry | undefined, link: string, - outboundMetadata?: Forkop.GetOutboundMetadata, + outboundMetadata?: Tachyon.GetOutboundMetadata, preferMetadata = false, ) { const metadataName = outboundMetadata?.names?.[code]; @@ -872,10 +872,10 @@ function buildUrlTestInfo({ proxyByCode: Map; manualLinkByCode: Map; cachedProxyLinks: Map; - outboundMetadata?: Forkop.GetOutboundMetadata; + outboundMetadata?: Tachyon.GetOutboundMetadata; subscriptionCopyableCodes: Set; showDetectedCountries: boolean; -}): Forkop.UrlTestInfo { +}): Tachyon.UrlTestInfo { const childCodes = uniqueCodes( groupCache?.outbounds?.length ? groupCache.outbounds @@ -949,10 +949,10 @@ function buildPriorityInfo({ proxyByCode: Map; manualLinkByCode: Map; cachedProxyLinks: Map; - outboundMetadata?: Forkop.GetOutboundMetadata; + outboundMetadata?: Tachyon.GetOutboundMetadata; subscriptionCopyableCodes: Set; showDetectedCountries: boolean; -}): Forkop.PriorityInfo { +}): Tachyon.PriorityInfo { const selectedCode = entry?.value.now || ''; const cacheLevels = Array.isArray(groupCache?.levels) ? groupCache.levels @@ -1076,9 +1076,9 @@ function buildPriorityInfo({ } function buildProxyGroupOutbounds( - section: Forkop.ConfigSection, + section: Tachyon.ConfigSection, proxies: ClashProxyEntry[], - outboundMetadata?: Forkop.GetOutboundMetadata, + outboundMetadata?: Tachyon.GetOutboundMetadata, urltestGroups: Record = {}, priorityGroups: Record = {}, subscriptionCopyableCodes: Set = new Set(), @@ -1261,9 +1261,9 @@ function buildProxyGroupOutbounds( function metadataMatchesCurrentSource( sectionName: string, sourceCount: number, - metadata: Forkop.SubscriptionMetadata, + metadata: Tachyon.SubscriptionMetadata, ) { - const legacyMetadata = metadata as Forkop.SubscriptionMetadata & { + const legacyMetadata = metadata as Tachyon.SubscriptionMetadata & { source_index?: number; source_section?: string; }; @@ -1315,9 +1315,9 @@ function metadataMatchesCurrentSource( function getSubscriptionMetadataSourceIndex( sectionName: string, sourceCount: number, - metadata: Forkop.SubscriptionMetadata, + metadata: Tachyon.SubscriptionMetadata, ) { - const legacyMetadata = metadata as Forkop.SubscriptionMetadata & { + const legacyMetadata = metadata as Tachyon.SubscriptionMetadata & { source_index?: number; source_section?: string; }; @@ -1340,9 +1340,9 @@ function getSubscriptionMetadataSourceIndex( } function isSubscriptionMetadataVisible( - section: Forkop.ConfigSection, + section: Tachyon.ConfigSection, sourceCount: number, - metadata: Forkop.SubscriptionMetadata, + metadata: Tachyon.SubscriptionMetadata, ) { const sourceIndex = getSubscriptionMetadataSourceIndex( section['.name'], @@ -1363,7 +1363,7 @@ function isSubscriptionMetadataVisible( } function getSubscriptionMetadata( - section: Forkop.ConfigSection, + section: Tachyon.ConfigSection, sourceCount: number, dashboardCache?: DashboardSectionCache, ) { diff --git a/fe-app-tachyon/src/tachyon/methods/custom/index.ts b/fe-app-tachyon/src/tachyon/methods/custom/index.ts index 4a28000e..31667c79 100644 --- a/fe-app-tachyon/src/tachyon/methods/custom/index.ts +++ b/fe-app-tachyon/src/tachyon/methods/custom/index.ts @@ -2,7 +2,7 @@ import { getConfigSections } from './getConfigSections'; import { getDashboardSections } from './getDashboardSections'; import { getClashApiSecret } from './getClashApiSecret'; -export const CustomForkopMethods = { +export const CustomTachyonMethods = { getConfigSections, getDashboardSections, getClashApiSecret, diff --git a/fe-app-tachyon/src/tachyon/methods/custom/tests/getDashboardSections.test.ts b/fe-app-tachyon/src/tachyon/methods/custom/tests/getDashboardSections.test.ts index fa598010..3ce7273b 100644 --- a/fe-app-tachyon/src/tachyon/methods/custom/tests/getDashboardSections.test.ts +++ b/fe-app-tachyon/src/tachyon/methods/custom/tests/getDashboardSections.test.ts @@ -12,7 +12,7 @@ vi.mock('../getConfigSections', () => ({ })); vi.mock('../../shell', () => ({ - ForkopShellMethods: { + TachyonShellMethods: { getClashApiProxies: mocks.getClashApiProxies, }, })); @@ -26,7 +26,7 @@ vi.mock('../../../../helpers', () => ({ })); import { getDashboardSections } from '../getDashboardSections'; -import { ClashAPI, Forkop } from '../../../types'; +import { ClashAPI, Tachyon } from '../../../types'; function proxy( type: string, @@ -43,8 +43,8 @@ function proxy( } function proxySection( - options: Partial = {}, -): Forkop.ConfigSection { + options: Partial = {}, +): Tachyon.ConfigSection { return { '.name': 'main', '.type': 'section', @@ -71,8 +71,8 @@ function urlTestSettings( function priorityGroup( id: string, - options: Partial = {}, -): Forkop.ConfigSection { + options: Partial = {}, +): Tachyon.ConfigSection { return { '.name': id, '.type': 'priority_group', @@ -94,8 +94,8 @@ function priorityGroup( function priorityLevel( id: string, - options: Partial = {}, -): Forkop.ConfigSection { + options: Partial = {}, +): Tachyon.ConfigSection { return { '.name': id, '.type': 'priority_level', diff --git a/fe-app-tachyon/src/tachyon/methods/shell/callBaseMethod.ts b/fe-app-tachyon/src/tachyon/methods/shell/callBaseMethod.ts index 0ec1b00e..95372eef 100644 --- a/fe-app-tachyon/src/tachyon/methods/shell/callBaseMethod.ts +++ b/fe-app-tachyon/src/tachyon/methods/shell/callBaseMethod.ts @@ -1,5 +1,5 @@ import { executeShellCommand } from '../../../helpers'; -import { Forkop } from '../../types'; +import { Tachyon } from '../../types'; interface CallBaseMethodOptions { allowNonZeroWithStdout?: boolean; @@ -7,11 +7,11 @@ interface CallBaseMethodOptions { } export async function callBaseMethod( - method: Forkop.AvailableMethods, + method: Tachyon.AvailableMethods, args: string[] = [], - command: string = '/usr/bin/forkop', + command: string = '/usr/bin/tachyon', options: CallBaseMethodOptions = {}, -): Promise> { +): Promise> { try { const response = await executeShellCommand({ command, diff --git a/fe-app-tachyon/src/tachyon/methods/shell/index.ts b/fe-app-tachyon/src/tachyon/methods/shell/index.ts index abf3a739..c0524312 100644 --- a/fe-app-tachyon/src/tachyon/methods/shell/index.ts +++ b/fe-app-tachyon/src/tachyon/methods/shell/index.ts @@ -1,5 +1,5 @@ import { callBaseMethod } from './callBaseMethod'; -import { ClashAPI, Forkop } from '../../types'; +import { ClashAPI, Tachyon } from '../../types'; import { executeShellCommand } from '../../../helpers'; import { isTransientRpcError } from '../../helpers/isTransientRpcError'; @@ -16,7 +16,7 @@ const COMPONENT_ACTION_POLL_INTERVAL_MS = 1500; const COMPONENT_ACTION_STATUS_REFRESH_INTERVAL_MS = 15000; const COMPONENT_ACTION_SELF_UPDATE_SETTLE_MS = 30000; const COMPONENT_ACTION_TRANSIENT_RPC_GRACE_MS = 30000; -const COMPONENT_ACTION_STATE_DIR = '/var/run/forkop/component-actions'; +const COMPONENT_ACTION_STATE_DIR = '/var/run/tachyon/component-actions'; const GET_UI_STATE_RPC_TIMEOUT_MS = 3000; function sleep(ms: number) { @@ -50,7 +50,7 @@ function parseJsonObjectOutput(output: string): T | null { } function parseComponentActionOutput(output: string) { - return parseJsonObjectOutput(output); + return parseJsonObjectOutput(output); } function parseComponentActionResult( @@ -68,13 +68,13 @@ function parseComponentActionStartResult( return null; } - return parsedResponse as unknown as Forkop.ComponentActionStartResult; + return parsedResponse as unknown as Tachyon.ComponentActionStartResult; } function parseSubscriptionUpdateStartResult( response: Awaited>, ) { - return parseJsonObjectOutput( + return parseJsonObjectOutput( response.stdout, ); } @@ -82,7 +82,7 @@ function parseSubscriptionUpdateStartResult( function parseSubscriptionUpdateJobState( response: Awaited>, ) { - return parseJsonObjectOutput( + return parseJsonObjectOutput( response.stdout, ); } @@ -90,19 +90,19 @@ function parseSubscriptionUpdateJobState( function parseUiActionStartResult( response: Awaited>, ) { - return parseJsonObjectOutput(response.stdout); + return parseJsonObjectOutput(response.stdout); } function parseServiceActionState( response: Awaited>, ) { - return parseJsonObjectOutput(response.stdout); + return parseJsonObjectOutput(response.stdout); } function parseLatencyActionState( response: Awaited>, ) { - return parseJsonObjectOutput(response.stdout); + return parseJsonObjectOutput(response.stdout); } function isComponentActionJobId(jobId: string) { @@ -123,9 +123,9 @@ async function readComponentActionState(jobId: string) { } } -async function readForkopVersion() { +async function readTachyonVersion() { const response = await executeShellCommand({ - command: '/usr/bin/forkop', + command: '/usr/bin/tachyon', args: ['show_version'], timeout: COMPONENT_ACTION_RPC_TIMEOUT_MS, }); @@ -139,13 +139,13 @@ async function readForkopVersion() { async function isComponentActionStillRunning( jobId: string, - component: Forkop.ComponentName, - action: Forkop.ComponentAction, + component: Tachyon.ComponentName, + action: Tachyon.ComponentAction, ) { - const response = await callBaseMethod( - Forkop.AvailableMethods.GET_UI_STATE, + const response = await callBaseMethod( + Tachyon.AvailableMethods.GET_UI_STATE, [], - '/usr/bin/forkop', + '/usr/bin/tachyon', { timeout: GET_UI_STATE_RPC_TIMEOUT_MS }, ); @@ -163,12 +163,12 @@ async function isComponentActionStillRunning( function componentActionFailure( response: Awaited>, - parsedResponse?: Pick | null, + parsedResponse?: Pick | null, ) { return { success: false, error: parsedResponse?.message || response.stderr || _('Failed to execute'), - } as Forkop.MethodFailureResponse; + } as Tachyon.MethodFailureResponse; } function uiActionFailure( @@ -179,7 +179,7 @@ function uiActionFailure( return { success: false, error: parsedResponse?.message || response.stderr || fallback, - } as Forkop.MethodFailureResponse; + } as Tachyon.MethodFailureResponse; } function createTransientRpcGraceTracker(graceMs: number) { @@ -204,170 +204,170 @@ function createTransientRpcGraceTracker(graceMs: number) { }; } -export const ForkopShellMethods = { +export const TachyonShellMethods = { checkDNSAvailable: async () => - callBaseMethod( - Forkop.AvailableMethods.CHECK_DNS_AVAILABLE, + callBaseMethod( + Tachyon.AvailableMethods.CHECK_DNS_AVAILABLE, ), checkFakeIP: async () => - callBaseMethod( - Forkop.AvailableMethods.CHECK_FAKEIP, + callBaseMethod( + Tachyon.AvailableMethods.CHECK_FAKEIP, ), checkNftRules: async () => - callBaseMethod( - Forkop.AvailableMethods.CHECK_NFT_RULES, + callBaseMethod( + Tachyon.AvailableMethods.CHECK_NFT_RULES, ), checkZapretRuntime: async () => - callBaseMethod( - Forkop.AvailableMethods.CHECK_ZAPRET_RUNTIME, + callBaseMethod( + Tachyon.AvailableMethods.CHECK_ZAPRET_RUNTIME, ), checkZapret2Runtime: async () => - callBaseMethod( - Forkop.AvailableMethods.CHECK_ZAPRET2_RUNTIME, + callBaseMethod( + Tachyon.AvailableMethods.CHECK_ZAPRET2_RUNTIME, ), checkByedpiRuntime: async () => - callBaseMethod( - Forkop.AvailableMethods.CHECK_BYEDPI_RUNTIME, + callBaseMethod( + Tachyon.AvailableMethods.CHECK_BYEDPI_RUNTIME, ), checkInboundsConfig: async () => - callBaseMethod( - Forkop.AvailableMethods.CHECK_INBOUNDS_CONFIG, + callBaseMethod( + Tachyon.AvailableMethods.CHECK_INBOUNDS_CONFIG, ), getStatus: async () => - callBaseMethod(Forkop.AvailableMethods.GET_STATUS), + callBaseMethod(Tachyon.AvailableMethods.GET_STATUS), getOutboundLink: async (section: string, tag: string) => - callBaseMethod( - Forkop.AvailableMethods.GET_OUTBOUND_LINK, + callBaseMethod( + Tachyon.AvailableMethods.GET_OUTBOUND_LINK, [section, tag], ), getOutboundLinkStates: async (section: string) => - callBaseMethod( - Forkop.AvailableMethods.GET_OUTBOUND_LINK_STATES, + callBaseMethod( + Tachyon.AvailableMethods.GET_OUTBOUND_LINK_STATES, [section], ), getOutboundMetadata: async (section: string) => - callBaseMethod( - Forkop.AvailableMethods.GET_OUTBOUND_METADATA, + callBaseMethod( + Tachyon.AvailableMethods.GET_OUTBOUND_METADATA, [section], ), getSubscriptionMetadata: async (section: string) => - callBaseMethod( - Forkop.AvailableMethods.GET_SUBSCRIPTION_METADATA, + callBaseMethod( + Tachyon.AvailableMethods.GET_SUBSCRIPTION_METADATA, [section], ), checkSingBox: async () => - callBaseMethod( - Forkop.AvailableMethods.CHECK_SING_BOX, + callBaseMethod( + Tachyon.AvailableMethods.CHECK_SING_BOX, ), checkInbounds: async () => - callBaseMethod( - Forkop.AvailableMethods.CHECK_INBOUNDS, + callBaseMethod( + Tachyon.AvailableMethods.CHECK_INBOUNDS, ), getSingBoxStatus: async () => - callBaseMethod( - Forkop.AvailableMethods.GET_SING_BOX_STATUS, + callBaseMethod( + Tachyon.AvailableMethods.GET_SING_BOX_STATUS, ), getZapretStatus: async () => - callBaseMethod( - Forkop.AvailableMethods.GET_ZAPRET_STATUS, + callBaseMethod( + Tachyon.AvailableMethods.GET_ZAPRET_STATUS, ), getZapret2Status: async () => - callBaseMethod( - Forkop.AvailableMethods.GET_ZAPRET2_STATUS, + callBaseMethod( + Tachyon.AvailableMethods.GET_ZAPRET2_STATUS, ), getByedpiStatus: async () => - callBaseMethod( - Forkop.AvailableMethods.GET_BYEDPI_STATUS, + callBaseMethod( + Tachyon.AvailableMethods.GET_BYEDPI_STATUS, ), getClashApiProxies: async () => - callBaseMethod(Forkop.AvailableMethods.CLASH_API, [ - Forkop.AvailableClashAPIMethods.GET_PROXIES, + callBaseMethod(Tachyon.AvailableMethods.CLASH_API, [ + Tachyon.AvailableClashAPIMethods.GET_PROXIES, ]), getClashApiConnections: async () => - callBaseMethod(Forkop.AvailableMethods.CLASH_API, [ - Forkop.AvailableClashAPIMethods.GET_CONNECTIONS, + callBaseMethod(Tachyon.AvailableMethods.CLASH_API, [ + Tachyon.AvailableClashAPIMethods.GET_CONNECTIONS, ]), getClashApiProxyLatency: async (tag: string, timeout = '5000') => - callBaseMethod( - Forkop.AvailableMethods.CLASH_API, - [Forkop.AvailableClashAPIMethods.GET_PROXY_LATENCY, tag, timeout], + callBaseMethod( + Tachyon.AvailableMethods.CLASH_API, + [Tachyon.AvailableClashAPIMethods.GET_PROXY_LATENCY, tag, timeout], ), getClashApiProxyLatencies: async (tags: string[]) => - callBaseMethod( - Forkop.AvailableMethods.CLASH_API, + callBaseMethod( + Tachyon.AvailableMethods.CLASH_API, [ - Forkop.AvailableClashAPIMethods.GET_PROXY_LATENCIES, + Tachyon.AvailableClashAPIMethods.GET_PROXY_LATENCIES, JSON.stringify(tags), '5000', ], ), getClashApiGroupLatency: async (tag: string) => - callBaseMethod( - Forkop.AvailableMethods.CLASH_API, - [Forkop.AvailableClashAPIMethods.GET_GROUP_LATENCY, tag, '10000'], + callBaseMethod( + Tachyon.AvailableMethods.CLASH_API, + [Tachyon.AvailableClashAPIMethods.GET_GROUP_LATENCY, tag, '10000'], ), setClashApiGroupProxy: async (group: string, proxy: string) => - callBaseMethod(Forkop.AvailableMethods.CLASH_API, [ - Forkop.AvailableClashAPIMethods.SET_GROUP_PROXY, + callBaseMethod(Tachyon.AvailableMethods.CLASH_API, [ + Tachyon.AvailableClashAPIMethods.SET_GROUP_PROXY, group, proxy, ]), closeClashApiConnection: async (connectionId: string) => - callBaseMethod(Forkop.AvailableMethods.CLASH_API, [ - Forkop.AvailableClashAPIMethods.CLOSE_CONNECTION, + callBaseMethod(Tachyon.AvailableMethods.CLASH_API, [ + Tachyon.AvailableClashAPIMethods.CLOSE_CONNECTION, connectionId, ]), closeAllClashApiConnections: async () => - callBaseMethod(Forkop.AvailableMethods.CLASH_API, [ - Forkop.AvailableClashAPIMethods.CLOSE_ALL_CONNECTIONS, + callBaseMethod(Tachyon.AvailableMethods.CLASH_API, [ + Tachyon.AvailableClashAPIMethods.CLOSE_ALL_CONNECTIONS, ]), enable: async () => callBaseMethod( - Forkop.AvailableMethods.ENABLE, + Tachyon.AvailableMethods.ENABLE, [], - '/etc/init.d/forkop', + '/etc/init.d/tachyon', ), disable: async () => callBaseMethod( - Forkop.AvailableMethods.DISABLE, + Tachyon.AvailableMethods.DISABLE, [], - '/etc/init.d/forkop', + '/etc/init.d/tachyon', ), globalCheck: async (masked = true) => - callBaseMethod(Forkop.AvailableMethods.GLOBAL_CHECK, [ + callBaseMethod(Tachyon.AvailableMethods.GLOBAL_CHECK, [ masked ? 'masked' : 'raw', ]), showSingBoxConfig: async (masked = true) => - callBaseMethod(Forkop.AvailableMethods.SHOW_SING_BOX_CONFIG, [ + callBaseMethod(Tachyon.AvailableMethods.SHOW_SING_BOX_CONFIG, [ masked ? 'masked' : 'raw', ]), checkLogs: async () => - callBaseMethod(Forkop.AvailableMethods.CHECK_LOGS), + callBaseMethod(Tachyon.AvailableMethods.CHECK_LOGS), checkSingBoxLogs: async () => - callBaseMethod(Forkop.AvailableMethods.CHECK_SING_BOX_LOGS), + callBaseMethod(Tachyon.AvailableMethods.CHECK_SING_BOX_LOGS), getSystemInfo: async () => - callBaseMethod( - Forkop.AvailableMethods.GET_SYSTEM_INFO, + callBaseMethod( + Tachyon.AvailableMethods.GET_SYSTEM_INFO, ), getServerCapabilities: async () => - callBaseMethod( - Forkop.AvailableMethods.GET_SERVER_CAPABILITIES, + callBaseMethod( + Tachyon.AvailableMethods.GET_SERVER_CAPABILITIES, ), getUiCapabilities: async () => - callBaseMethod( - Forkop.AvailableMethods.GET_UI_CAPABILITIES, + callBaseMethod( + Tachyon.AvailableMethods.GET_UI_CAPABILITIES, ), getUiState: async () => - callBaseMethod( - Forkop.AvailableMethods.GET_UI_STATE, + callBaseMethod( + Tachyon.AvailableMethods.GET_UI_STATE, [], - '/usr/bin/forkop', + '/usr/bin/tachyon', { timeout: GET_UI_STATE_RPC_TIMEOUT_MS }, ), - serviceActionStart: async (action: Forkop.ServiceAction) => { + serviceActionStart: async (action: Tachyon.ServiceAction) => { const response = await executeShellCommand({ - command: '/usr/bin/forkop', - args: [Forkop.AvailableMethods.SERVICE_ACTION_ASYNC, action], + command: '/usr/bin/tachyon', + args: [Tachyon.AvailableMethods.SERVICE_ACTION_ASYNC, action], timeout: UI_ACTION_RPC_TIMEOUT_MS, }); const parsedResponse = parseUiActionStartResult(response); @@ -387,12 +387,12 @@ export const ForkopShellMethods = { return { success: true, data: parsedResponse, - } as Forkop.MethodSuccessResponse; + } as Tachyon.MethodSuccessResponse; }, serviceActionStatus: async (jobId: string) => { const response = await executeShellCommand({ - command: '/usr/bin/forkop', - args: [Forkop.AvailableMethods.SERVICE_ACTION_STATUS, jobId], + command: '/usr/bin/tachyon', + args: [Tachyon.AvailableMethods.SERVICE_ACTION_STATUS, jobId], timeout: UI_ACTION_RPC_TIMEOUT_MS, }); const parsedResponse = parseServiceActionState(response); @@ -408,13 +408,13 @@ export const ForkopShellMethods = { return { success: true, data: parsedResponse, - } as Forkop.MethodSuccessResponse; + } as Tachyon.MethodSuccessResponse; }, waitServiceActionJob: async (jobId: string, startedAt = Date.now()) => { while (Date.now() - startedAt < SERVICE_ACTION_TIMEOUT_MS) { await sleep(SERVICE_ACTION_POLL_INTERVAL_MS); - const response = await ForkopShellMethods.serviceActionStatus(jobId); + const response = await TachyonShellMethods.serviceActionStatus(jobId); if (!response.success) { return response; @@ -430,18 +430,18 @@ export const ForkopShellMethods = { return { success: false, error: _('Operation timed out'), - } as Forkop.MethodFailureResponse; + } as Tachyon.MethodFailureResponse; }, latencyTestStart: async ( - latencyType: Forkop.LatencyActionState['latency_type'], + latencyType: Tachyon.LatencyActionState['latency_type'], section: string, tag: string, timeout?: string, ) => { const response = await executeShellCommand({ - command: '/usr/bin/forkop', + command: '/usr/bin/tachyon', args: [ - Forkop.AvailableMethods.LATENCY_TEST_ASYNC, + Tachyon.AvailableMethods.LATENCY_TEST_ASYNC, latencyType, section, tag, @@ -466,12 +466,12 @@ export const ForkopShellMethods = { return { success: true, data: parsedResponse, - } as Forkop.MethodSuccessResponse; + } as Tachyon.MethodSuccessResponse; }, latencyTestStatus: async (jobId: string) => { const response = await executeShellCommand({ - command: '/usr/bin/forkop', - args: [Forkop.AvailableMethods.LATENCY_TEST_STATUS, jobId], + command: '/usr/bin/tachyon', + args: [Tachyon.AvailableMethods.LATENCY_TEST_STATUS, jobId], timeout: UI_ACTION_RPC_TIMEOUT_MS, }); const parsedResponse = parseLatencyActionState(response); @@ -487,7 +487,7 @@ export const ForkopShellMethods = { return { success: true, data: parsedResponse, - } as Forkop.MethodSuccessResponse; + } as Tachyon.MethodSuccessResponse; }, waitLatencyTestJob: async (jobId: string, startedAt = Date.now()) => { const transientRpc = createTransientRpcGraceTracker( @@ -497,7 +497,7 @@ export const ForkopShellMethods = { while (Date.now() - startedAt < LATENCY_TEST_TIMEOUT_MS) { await sleep(LATENCY_TEST_POLL_INTERVAL_MS); - const response = await ForkopShellMethods.latencyTestStatus(jobId); + const response = await TachyonShellMethods.latencyTestStatus(jobId); if (!response.success) { if (transientRpc.shouldContinue(response.error)) { @@ -518,15 +518,15 @@ export const ForkopShellMethods = { return { success: false, error: _('Operation timed out'), - } as Forkop.MethodFailureResponse; + } as Tachyon.MethodFailureResponse; }, uiActionAck: async ( kind: 'service' | 'latency' | 'component' | 'subscription', jobId: string, ) => { const response = await executeShellCommand({ - command: '/usr/bin/forkop', - args: [Forkop.AvailableMethods.UI_ACTION_ACK, kind, jobId], + command: '/usr/bin/tachyon', + args: [Tachyon.AvailableMethods.UI_ACTION_ACK, kind, jobId], timeout: UI_ACTION_RPC_TIMEOUT_MS, }); const parsedResponse = parseUiActionStartResult(response); @@ -538,15 +538,15 @@ export const ForkopShellMethods = { return { success: true, data: parsedResponse, - } as Forkop.MethodSuccessResponse; + } as Tachyon.MethodSuccessResponse; }, componentActionStart: async ( - component: Forkop.ComponentName, - action: Forkop.ComponentAction, + component: Tachyon.ComponentName, + action: Tachyon.ComponentAction, ) => { const response = await executeShellCommand({ - command: '/usr/bin/forkop', - args: [Forkop.AvailableMethods.COMPONENT_ACTION_ASYNC, component, action], + command: '/usr/bin/tachyon', + args: [Tachyon.AvailableMethods.COMPONENT_ACTION_ASYNC, component, action], timeout: COMPONENT_ACTION_RPC_TIMEOUT_MS, }); const parsedResponse = parseComponentActionStartResult(response); @@ -562,12 +562,12 @@ export const ForkopShellMethods = { return { success: true, data: parsedResponse, - } as Forkop.MethodSuccessResponse; + } as Tachyon.MethodSuccessResponse; }, componentActionStatus: async (jobId: string) => { const response = await executeShellCommand({ - command: '/usr/bin/forkop', - args: [Forkop.AvailableMethods.COMPONENT_ACTION_STATUS, jobId], + command: '/usr/bin/tachyon', + args: [Tachyon.AvailableMethods.COMPONENT_ACTION_STATUS, jobId], timeout: COMPONENT_ACTION_RPC_TIMEOUT_MS, }); const parsedResponse = parseComponentActionResult(response); @@ -579,16 +579,16 @@ export const ForkopShellMethods = { return { success: true, data: parsedResponse, - } as Forkop.MethodSuccessResponse; + } as Tachyon.MethodSuccessResponse; }, componentUpdateCheckCache: async () => - callBaseMethod( - Forkop.AvailableMethods.COMPONENT_UPDATE_CHECK_CACHE, + callBaseMethod( + Tachyon.AvailableMethods.COMPONENT_UPDATE_CHECK_CACHE, ), waitComponentActionJob: async ( jobId: string, - component: Forkop.ComponentName, - action: Forkop.ComponentAction, + component: Tachyon.ComponentName, + action: Tachyon.ComponentAction, expectedLatestVersion?: string, ) => { let selfUpdateVersionMatchedAt = 0; @@ -608,7 +608,7 @@ export const ForkopShellMethods = { return { success: true, data: stateResponse, - } as Forkop.MethodSuccessResponse; + } as Tachyon.MethodSuccessResponse; } if ( @@ -621,8 +621,8 @@ export const ForkopShellMethods = { lastStatusRefreshAt = Date.now(); const statusResponse = await executeShellCommand({ - command: '/usr/bin/forkop', - args: [Forkop.AvailableMethods.COMPONENT_ACTION_STATUS, jobId], + command: '/usr/bin/tachyon', + args: [Tachyon.AvailableMethods.COMPONENT_ACTION_STATUS, jobId], timeout: COMPONENT_ACTION_RPC_TIMEOUT_MS, }); const parsedResponse = parseComponentActionResult(statusResponse); @@ -644,9 +644,9 @@ export const ForkopShellMethods = { continue; } - if (component === 'forkop' && action === 'install') { + if (component === 'tachyon' && action === 'install') { const installedVersion = expectedLatestVersion - ? await readForkopVersion() + ? await readTachyonVersion() : ''; if ( @@ -667,13 +667,13 @@ export const ForkopShellMethods = { success: true, component, action, - message: translate('Forkop has been installed'), + message: translate('Tachyon has been installed'), current_version: installedVersion, latest_version: expectedLatestVersion, changed: true, status: 'latest', }, - } as Forkop.MethodSuccessResponse; + } as Tachyon.MethodSuccessResponse; } } @@ -691,17 +691,17 @@ export const ForkopShellMethods = { return { success: true, data: parsedResponse, - } as Forkop.MethodSuccessResponse; + } as Tachyon.MethodSuccessResponse; } }, subscriptionUpdateStart: async (section?: string, sourceIndex?: number) => { const startArgs = [ - Forkop.AvailableMethods.SUBSCRIPTION_UPDATE_ASYNC, + Tachyon.AvailableMethods.SUBSCRIPTION_UPDATE_ASYNC, ...(section ? [section] : []), ...(section && sourceIndex !== undefined ? [String(sourceIndex)] : []), ]; const response = await executeShellCommand({ - command: '/usr/bin/forkop', + command: '/usr/bin/tachyon', args: startArgs, timeout: SUBSCRIPTION_UPDATE_RPC_TIMEOUT_MS, }); @@ -718,18 +718,18 @@ export const ForkopShellMethods = { parsedResponse?.message || response.stderr || _('Subscription update failed'), - } as Forkop.MethodFailureResponse; + } as Tachyon.MethodFailureResponse; } return { success: true, data: parsedResponse, - } as Forkop.MethodSuccessResponse; + } as Tachyon.MethodSuccessResponse; }, subscriptionUpdateStatus: async (jobId: string) => { const response = await executeShellCommand({ - command: '/usr/bin/forkop', - args: [Forkop.AvailableMethods.SUBSCRIPTION_UPDATE_STATUS, jobId], + command: '/usr/bin/tachyon', + args: [Tachyon.AvailableMethods.SUBSCRIPTION_UPDATE_STATUS, jobId], timeout: SUBSCRIPTION_UPDATE_RPC_TIMEOUT_MS, }); const parsedResponse = parseSubscriptionUpdateJobState(response); @@ -738,13 +738,13 @@ export const ForkopShellMethods = { return { success: false, error: response.stderr || _('Subscription update failed'), - } as Forkop.MethodFailureResponse; + } as Tachyon.MethodFailureResponse; } return { success: true, data: parsedResponse, - } as Forkop.MethodSuccessResponse; + } as Tachyon.MethodSuccessResponse; }, waitSubscriptionUpdateJob: async (jobId: string) => { const transientRpc = createTransientRpcGraceTracker( @@ -754,7 +754,7 @@ export const ForkopShellMethods = { while (true) { await sleep(SUBSCRIPTION_UPDATE_POLL_INTERVAL_MS); - const response = await ForkopShellMethods.subscriptionUpdateStatus(jobId); + const response = await TachyonShellMethods.subscriptionUpdateStatus(jobId); if (!response.success) { if (transientRpc.shouldContinue(response.error)) { diff --git a/fe-app-tachyon/src/tachyon/methods/shell/tests/callBaseMethod.test.ts b/fe-app-tachyon/src/tachyon/methods/shell/tests/callBaseMethod.test.ts index c22fd409..b1d3758d 100644 --- a/fe-app-tachyon/src/tachyon/methods/shell/tests/callBaseMethod.test.ts +++ b/fe-app-tachyon/src/tachyon/methods/shell/tests/callBaseMethod.test.ts @@ -8,7 +8,7 @@ vi.mock('../../../../helpers', () => ({ executeShellCommand: mocks.executeShellCommand, })); -import { Forkop } from '../../../types'; +import { Tachyon } from '../../../types'; import { callBaseMethod } from '../callBaseMethod'; describe('callBaseMethod', () => { @@ -24,7 +24,7 @@ describe('callBaseMethod', () => { }); const response = await callBaseMethod( - Forkop.AvailableMethods.CHECK_DNS_AVAILABLE, + Tachyon.AvailableMethods.CHECK_DNS_AVAILABLE, ); expect(response).toEqual({ @@ -41,9 +41,9 @@ describe('callBaseMethod', () => { }); const response = await callBaseMethod( - Forkop.AvailableMethods.GLOBAL_CHECK, + Tachyon.AvailableMethods.GLOBAL_CHECK, [], - '/usr/bin/forkop', + '/usr/bin/tachyon', { allowNonZeroWithStdout: true }, ); @@ -61,14 +61,14 @@ describe('callBaseMethod', () => { }); await callBaseMethod( - Forkop.AvailableMethods.GLOBAL_CHECK, + Tachyon.AvailableMethods.GLOBAL_CHECK, [], - '/usr/bin/forkop', + '/usr/bin/tachyon', { timeout: 60000 }, ); expect(mocks.executeShellCommand).toHaveBeenCalledWith({ - command: '/usr/bin/forkop', + command: '/usr/bin/tachyon', args: ['global_check'], timeout: 60000, }); diff --git a/fe-app-tachyon/src/tachyon/methods/shell/tests/componentAction.test.ts b/fe-app-tachyon/src/tachyon/methods/shell/tests/componentAction.test.ts index 5ffec57b..806d7224 100644 --- a/fe-app-tachyon/src/tachyon/methods/shell/tests/componentAction.test.ts +++ b/fe-app-tachyon/src/tachyon/methods/shell/tests/componentAction.test.ts @@ -9,9 +9,9 @@ vi.mock('../../../../helpers', () => ({ executeShellCommand: mocks.executeShellCommand, })); -import { ForkopShellMethods } from '../index'; +import { TachyonShellMethods } from '../index'; -describe('ForkopShellMethods.componentAction', () => { +describe('TachyonShellMethods.componentAction', () => { beforeEach(() => { vi.useFakeTimers(); mocks.executeShellCommand.mockReset(); @@ -26,7 +26,7 @@ describe('ForkopShellMethods.componentAction', () => { vi.unstubAllGlobals(); }); - it('does not fail Forkop self-update when status polling disappears after package replacement', async () => { + it('does not fail Tachyon self-update when status polling disappears after package replacement', async () => { mocks.fsRead.mockRejectedValue(new Error('Access denied')); mocks.executeShellCommand.mockImplementation(({ args }) => { if (args[0] === 'component_action_status') { @@ -52,9 +52,9 @@ describe('ForkopShellMethods.componentAction', () => { }); }); - const responsePromise = ForkopShellMethods.waitComponentActionJob( + const responsePromise = TachyonShellMethods.waitComponentActionJob( 'job-1', - 'forkop', + 'tachyon', 'install', '0.7.17.11', ); @@ -65,9 +65,9 @@ describe('ForkopShellMethods.componentAction', () => { success: true, data: { success: true, - component: 'forkop', + component: 'tachyon', action: 'install', - message: 'Forkop has been installed', + message: 'Tachyon has been installed', current_version: '0.7.17.11', latest_version: '0.7.17.11', changed: true, @@ -87,7 +87,7 @@ describe('ForkopShellMethods.componentAction', () => { }); await expect( - ForkopShellMethods.componentActionStart('zapret', 'install'), + TachyonShellMethods.componentActionStart('zapret', 'install'), ).resolves.toEqual({ success: false, error: 'Another component action is already running', @@ -147,7 +147,7 @@ describe('ForkopShellMethods.componentAction', () => { }); }); - const responsePromise = ForkopShellMethods.waitComponentActionJob( + const responsePromise = TachyonShellMethods.waitComponentActionJob( 'job-1', 'sing_box', 'check_update', @@ -201,7 +201,7 @@ describe('ForkopShellMethods.componentAction', () => { return Promise.resolve({ stdout: JSON.stringify({ service: { - forkop: { + tachyon: { running: 0, enabled: 1, status: 'stopped but enabled', @@ -251,7 +251,7 @@ describe('ForkopShellMethods.componentAction', () => { }); }); - const responsePromise = ForkopShellMethods.waitComponentActionJob( + const responsePromise = TachyonShellMethods.waitComponentActionJob( 'job-1', 'sing_box', 'install_extended', @@ -274,7 +274,7 @@ describe('ForkopShellMethods.componentAction', () => { }, }); expect(mocks.executeShellCommand).toHaveBeenCalledWith({ - command: '/usr/bin/forkop', + command: '/usr/bin/tachyon', args: ['get_ui_state'], timeout: 3000, }); @@ -321,7 +321,7 @@ describe('ForkopShellMethods.componentAction', () => { }); }); - const responsePromise = ForkopShellMethods.waitComponentActionJob( + const responsePromise = TachyonShellMethods.waitComponentActionJob( 'job-1', 'zapret', 'check_update', diff --git a/fe-app-tachyon/src/tachyon/methods/shell/tests/latencyAction.test.ts b/fe-app-tachyon/src/tachyon/methods/shell/tests/latencyAction.test.ts index 606ffffa..00909c32 100644 --- a/fe-app-tachyon/src/tachyon/methods/shell/tests/latencyAction.test.ts +++ b/fe-app-tachyon/src/tachyon/methods/shell/tests/latencyAction.test.ts @@ -8,9 +8,9 @@ vi.mock('../../../../helpers', () => ({ executeShellCommand: mocks.executeShellCommand, })); -import { ForkopShellMethods } from '../index'; +import { TachyonShellMethods } from '../index'; -describe('ForkopShellMethods.latencyAction', () => { +describe('TachyonShellMethods.latencyAction', () => { beforeEach(() => { vi.useFakeTimers(); mocks.executeShellCommand.mockReset(); @@ -52,7 +52,7 @@ describe('ForkopShellMethods.latencyAction', () => { }); }); - const responsePromise = ForkopShellMethods.waitLatencyTestJob('job-1'); + const responsePromise = TachyonShellMethods.waitLatencyTestJob('job-1'); await vi.advanceTimersByTimeAsync(2000); @@ -76,7 +76,7 @@ describe('ForkopShellMethods.latencyAction', () => { code: 0, }); - await ForkopShellMethods.latencyTestStart( + await TachyonShellMethods.latencyTestStart( 'proxy', 'AWG', 'AWG-out', @@ -84,7 +84,7 @@ describe('ForkopShellMethods.latencyAction', () => { ); expect(mocks.executeShellCommand).toHaveBeenCalledWith({ - command: '/usr/bin/forkop', + command: '/usr/bin/tachyon', args: ['latency_test_async', 'proxy', 'AWG', 'AWG-out', '10000'], timeout: 15000, }); diff --git a/fe-app-tachyon/src/tachyon/methods/shell/tests/serviceAction.test.ts b/fe-app-tachyon/src/tachyon/methods/shell/tests/serviceAction.test.ts index 3289d5c9..9985bb70 100644 --- a/fe-app-tachyon/src/tachyon/methods/shell/tests/serviceAction.test.ts +++ b/fe-app-tachyon/src/tachyon/methods/shell/tests/serviceAction.test.ts @@ -8,9 +8,9 @@ vi.mock('../../../../helpers', () => ({ executeShellCommand: mocks.executeShellCommand, })); -import { ForkopShellMethods } from '../index'; +import { TachyonShellMethods } from '../index'; -describe('ForkopShellMethods.serviceAction', () => { +describe('TachyonShellMethods.serviceAction', () => { beforeEach(() => { vi.useFakeTimers(); mocks.executeShellCommand.mockReset(); @@ -44,7 +44,7 @@ describe('ForkopShellMethods.serviceAction', () => { }); }); - const responsePromise = ForkopShellMethods.waitServiceActionJob('job-1'); + const responsePromise = TachyonShellMethods.waitServiceActionJob('job-1'); await vi.advanceTimersByTimeAsync(1000); @@ -72,7 +72,7 @@ describe('ForkopShellMethods.serviceAction', () => { }); await expect( - ForkopShellMethods.serviceActionStart('restart'), + TachyonShellMethods.serviceActionStart('restart'), ).resolves.toEqual({ success: false, error: 'Another service action is already running', diff --git a/fe-app-tachyon/src/tachyon/methods/shell/tests/subscriptionUpdate.test.ts b/fe-app-tachyon/src/tachyon/methods/shell/tests/subscriptionUpdate.test.ts index 48a88fad..144db464 100644 --- a/fe-app-tachyon/src/tachyon/methods/shell/tests/subscriptionUpdate.test.ts +++ b/fe-app-tachyon/src/tachyon/methods/shell/tests/subscriptionUpdate.test.ts @@ -8,9 +8,9 @@ vi.mock('../../../../helpers', () => ({ executeShellCommand: mocks.executeShellCommand, })); -import { ForkopShellMethods } from '../index'; +import { TachyonShellMethods } from '../index'; -describe('ForkopShellMethods.subscriptionUpdate', () => { +describe('TachyonShellMethods.subscriptionUpdate', () => { beforeEach(() => { vi.useFakeTimers(); mocks.executeShellCommand.mockReset(); @@ -55,7 +55,7 @@ describe('ForkopShellMethods.subscriptionUpdate', () => { }); await expect( - ForkopShellMethods.subscriptionUpdateStart('main'), + TachyonShellMethods.subscriptionUpdateStart('main'), ).resolves.toEqual({ success: true, data: { @@ -66,7 +66,7 @@ describe('ForkopShellMethods.subscriptionUpdate', () => { }); const responsePromise = - ForkopShellMethods.waitSubscriptionUpdateJob('job-1'); + TachyonShellMethods.waitSubscriptionUpdateJob('job-1'); await vi.advanceTimersByTimeAsync(1500); @@ -80,12 +80,12 @@ describe('ForkopShellMethods.subscriptionUpdate', () => { }, }); expect(mocks.executeShellCommand).toHaveBeenNthCalledWith(1, { - command: '/usr/bin/forkop', + command: '/usr/bin/tachyon', args: ['subscription_update_async', 'main'], timeout: 15000, }); expect(mocks.executeShellCommand).toHaveBeenNthCalledWith(2, { - command: '/usr/bin/forkop', + command: '/usr/bin/tachyon', args: ['subscription_update_status', 'job-1'], timeout: 15000, }); @@ -102,7 +102,7 @@ describe('ForkopShellMethods.subscriptionUpdate', () => { }); await expect( - ForkopShellMethods.subscriptionUpdateStart('main'), + TachyonShellMethods.subscriptionUpdateStart('main'), ).resolves.toEqual({ success: false, error: 'Subscription update is already running', @@ -134,7 +134,7 @@ describe('ForkopShellMethods.subscriptionUpdate', () => { }); const responsePromise = - ForkopShellMethods.waitSubscriptionUpdateJob('job-1'); + TachyonShellMethods.waitSubscriptionUpdateJob('job-1'); await vi.advanceTimersByTimeAsync(1500); @@ -189,7 +189,7 @@ describe('ForkopShellMethods.subscriptionUpdate', () => { }); const responsePromise = - ForkopShellMethods.waitSubscriptionUpdateJob('job-1'); + TachyonShellMethods.waitSubscriptionUpdateJob('job-1'); await vi.advanceTimersByTimeAsync(10 * 60 * 1000 + 3000); @@ -239,7 +239,7 @@ describe('ForkopShellMethods.subscriptionUpdate', () => { }); const responsePromise = - ForkopShellMethods.waitSubscriptionUpdateJob('job-1'); + TachyonShellMethods.waitSubscriptionUpdateJob('job-1'); await vi.advanceTimersByTimeAsync(3000); diff --git a/fe-app-tachyon/src/tachyon/services/core.service.ts b/fe-app-tachyon/src/tachyon/services/core.service.ts index ae96673f..8a84b088 100644 --- a/fe-app-tachyon/src/tachyon/services/core.service.ts +++ b/fe-app-tachyon/src/tachyon/services/core.service.ts @@ -1,13 +1,13 @@ import { TabServiceInstance } from './tab.service'; import { store } from './store.service'; import { logger } from './logger.service'; -import { ForkopLogWatcher } from './forkopLogWatcher.service'; +import { TachyonLogWatcher } from './tachyonLogWatcher.service'; import { - getForkopLogNotification, + getTachyonLogNotification, LogNotificationDeduper, - ForkopLogNotification, + TachyonLogNotification, } from './logNotificationDeduper.service'; -import { ForkopShellMethods } from '../methods'; +import { TachyonShellMethods } from '../methods'; import { registerRuntimeStateResumeRefresh, startRuntimeUiStatePolling, @@ -23,7 +23,7 @@ const LOG_WATCHER_START_DELAY_MS = 5000; function componentDisplayName(component: string) { const names: Record = { - forkop: 'Forkop', + tachyon: 'Tachyon', sing_box: 'sing-box', zapret: 'Zapret', zapret2: 'Zapret2', @@ -33,7 +33,7 @@ function componentDisplayName(component: string) { return names[component] || component; } -function showLogNotification(notification: ForkopLogNotification) { +function showLogNotification(notification: TachyonLogNotification) { if (notification.kind === 'component-update') { const message = _('New version %s is available for %s') .replace('%s', notification.version) @@ -49,7 +49,7 @@ function showLogNotification(notification: ForkopLogNotification) { } ui.addNotification( - _('Forkop Error'), + _('Tachyon Error'), E('div', {}, notification.line), 'error', 'fkp-log-error-notification', @@ -67,12 +67,12 @@ export function coreService(options: CoreServiceOptions = {}) { }); }); - const watcher = ForkopLogWatcher.getInstance(); + const watcher = TachyonLogWatcher.getInstance(); const logNotificationDeduper = new LogNotificationDeduper(); watcher.init( async () => { - const logs = await ForkopShellMethods.checkLogs(); + const logs = await TachyonShellMethods.checkLogs(); if (logs.success) { return logs.data as string; @@ -84,7 +84,7 @@ export function coreService(options: CoreServiceOptions = {}) { intervalMs: LOG_WATCHER_INTERVAL_MS, onNewLog: (line) => { if (logNotificationDeduper.shouldNotify(line)) { - const notification = getForkopLogNotification(line); + const notification = getTachyonLogNotification(line); if (notification) { showLogNotification(notification); } diff --git a/fe-app-tachyon/src/tachyon/services/logNotificationDeduper.service.ts b/fe-app-tachyon/src/tachyon/services/logNotificationDeduper.service.ts index c5ab9fe5..b1b2fc38 100644 --- a/fe-app-tachyon/src/tachyon/services/logNotificationDeduper.service.ts +++ b/fe-app-tachyon/src/tachyon/services/logNotificationDeduper.service.ts @@ -1,7 +1,7 @@ -const LOG_NOTIFICATION_STORAGE_KEY = 'forkop:shown-log-error-notifications:v1'; +const LOG_NOTIFICATION_STORAGE_KEY = 'tachyon:shown-log-error-notifications:v1'; const MAX_STORED_LOG_NOTIFICATIONS = 500; -export type ForkopLogNotification = +export type TachyonLogNotification = | { kind: 'error'; line: string } | { kind: 'component-update'; @@ -60,15 +60,15 @@ export function isErrorLogLine(line: string) { return lower.includes('[error]') || lower.includes('[fatal]'); } -export function getForkopLogNotification( +export function getTachyonLogNotification( line: string, -): ForkopLogNotification | null { +): TachyonLogNotification | null { if (isErrorLogLine(line)) { return { kind: 'error', line }; } const update = line.match( - /\[component-update\]\s+(forkop|sing_box|zapret|zapret2|byedpi)\s+(\S+)/i, + /\[component-update\]\s+(tachyon|sing_box|zapret|zapret2|byedpi)\s+(\S+)/i, ); if (!update) { @@ -97,7 +97,7 @@ export class LogNotificationDeduper { } shouldNotify(line: string) { - if (!getForkopLogNotification(line)) { + if (!getTachyonLogNotification(line)) { return false; } diff --git a/fe-app-tachyon/src/tachyon/services/runtimeUiState.service.ts b/fe-app-tachyon/src/tachyon/services/runtimeUiState.service.ts index f39de1f6..71ec466d 100644 --- a/fe-app-tachyon/src/tachyon/services/runtimeUiState.service.ts +++ b/fe-app-tachyon/src/tachyon/services/runtimeUiState.service.ts @@ -1,17 +1,17 @@ -import { ForkopShellMethods } from '../methods'; -import { Forkop } from '../types'; +import { TachyonShellMethods } from '../methods'; +import { Tachyon } from '../types'; import { logger } from './logger.service'; import { applyUiStateToStore } from './uiState.service'; const RUNTIME_UI_STATE_REFRESH_MIN_INTERVAL_MS = 500; const RUNTIME_UI_STATE_IDLE_POLL_INTERVAL_MS = 1000; const RUNTIME_UI_STATE_ACTIVE_POLL_INTERVAL_MS = 500; -type RuntimeUiStateListener = (uiState: Forkop.UiState) => void; +type RuntimeUiStateListener = (uiState: Tachyon.UiState) => void; -let runtimeUiStateRefreshPromise: Promise | null = +let runtimeUiStateRefreshPromise: Promise | null = null; let lastRuntimeUiStateRefreshAt = 0; -let lastRuntimeUiState: Forkop.UiState | undefined; +let lastRuntimeUiState: Tachyon.UiState | undefined; let runtimeStateResumeRefreshRegistered = false; let runtimeStatePollTimer: ReturnType | null = null; let runtimeStatePollingStarted = false; @@ -26,7 +26,7 @@ function isDocumentVisible() { ); } -function hasRunningAction(uiState: Forkop.UiState) { +function hasRunningAction(uiState: Tachyon.UiState) { return Object.values(uiState.actions).some((actions) => actions.some((action) => action.running), ); @@ -57,7 +57,7 @@ function scheduleRuntimeUiStatePoll(delay = getNextPollDelay()) { }, delay); } -function notifyRuntimeUiStateListeners(uiState: Forkop.UiState) { +function notifyRuntimeUiStateListeners(uiState: Tachyon.UiState) { for (const listener of runtimeUiStateListeners) { try { listener(uiState); @@ -69,7 +69,7 @@ function notifyRuntimeUiStateListeners(uiState: Forkop.UiState) { export async function refreshRuntimeUiState({ force = false, -}: { force?: boolean } = {}): Promise { +}: { force?: boolean } = {}): Promise { if (!isDocumentVisible()) { return undefined; } @@ -88,7 +88,7 @@ export async function refreshRuntimeUiState({ lastRuntimeUiStateRefreshAt = now; - const promise = ForkopShellMethods.getUiState() + const promise = TachyonShellMethods.getUiState() .then((response) => { if (!response.success) { return undefined; diff --git a/fe-app-tachyon/src/tachyon/services/store.service.ts b/fe-app-tachyon/src/tachyon/services/store.service.ts index 929a0a92..eaa43b4d 100644 --- a/fe-app-tachyon/src/tachyon/services/store.service.ts +++ b/fe-app-tachyon/src/tachyon/services/store.service.ts @@ -1,4 +1,4 @@ -import { Forkop } from '../types'; +import { Tachyon } from '../types'; import { initialDiagnosticStore } from '../tabs/diagnostic/diagnostic.store'; function jsonStableStringify(obj: T): string { @@ -158,17 +158,17 @@ export interface StoreType { failed: boolean; data: { singbox: number; - forkopRunning: number; - forkopEnabled: number; - forkopStatus: string; + tachyonRunning: number; + tachyonEnabled: number; + tachyonStatus: string; }; }; sectionsWidget: { loading: boolean; failed: boolean; - data: Forkop.OutboundGroup[]; + data: Tachyon.OutboundGroup[]; latencyFetchingSections: Record; - latencyProgressSections: Record; + latencyProgressSections: Record; selectorSwitchingSections: Record; subscriptionUpdatingSections: Record; }; @@ -190,8 +190,8 @@ export interface StoreType { loading: boolean; loaded: boolean; providerInfoLoaded: boolean; - forkop_version: string; - forkop_latest_version: string; + tachyon_version: string; + tachyon_latest_version: string; luci_app_version: string; sing_box_version: string; sing_box_extended: number; @@ -209,8 +209,8 @@ export interface StoreType { device_model: string; }; updatesActions: { - forkopCheck: { loading: boolean }; - forkopInstall: { loading: boolean }; + tachyonCheck: { loading: boolean }; + tachyonInstall: { loading: boolean }; singBoxCheck: { loading: boolean }; singBoxInstall: { loading: boolean }; singBoxInstallExtended: { loading: boolean }; @@ -228,7 +228,7 @@ export interface StoreType { byedpiRemove: { loading: boolean }; }; updatesChecks: Record< - Forkop.ComponentName, + Tachyon.ComponentName, { status: 'latest' | 'outdated' | 'dev' | null; latest_version: string; @@ -262,9 +262,9 @@ const initialStore: StoreType = { failed: false, data: { singbox: 0, - forkopRunning: 0, - forkopEnabled: 0, - forkopStatus: '', + tachyonRunning: 0, + tachyonEnabled: 0, + tachyonStatus: '', }, }, sectionsWidget: { diff --git a/fe-app-tachyon/src/tachyon/services/systemInfo.service.ts b/fe-app-tachyon/src/tachyon/services/systemInfo.service.ts index 95489197..e364ca51 100644 --- a/fe-app-tachyon/src/tachyon/services/systemInfo.service.ts +++ b/fe-app-tachyon/src/tachyon/services/systemInfo.service.ts @@ -1,4 +1,4 @@ -import { ForkopShellMethods } from '../methods'; +import { TachyonShellMethods } from '../methods'; import { normalizeSingBoxVariantFields } from '../helpers/singBoxVariant'; import { logger } from './logger.service'; import { store, StoreType } from './store.service'; @@ -7,8 +7,8 @@ const UNKNOWN_SYSTEM_INFO: StoreType['diagnosticsSystemInfo'] = { loading: false, loaded: false, providerInfoLoaded: false, - forkop_version: _('unknown'), - forkop_latest_version: _('unknown'), + tachyon_version: _('unknown'), + tachyon_latest_version: _('unknown'), luci_app_version: _('unknown'), sing_box_version: _('unknown'), sing_box_extended: 0, @@ -65,7 +65,7 @@ export async function ensureSystemInfo({ const promise = (async () => { try { - const systemInfo = await ForkopShellMethods.getSystemInfo(); + const systemInfo = await TachyonShellMethods.getSystemInfo(); if (requestId !== latestSystemInfoRequestId) { return store.get().diagnosticsSystemInfo; diff --git a/fe-app-tachyon/src/tachyon/services/tachyonLogWatcher.service.ts b/fe-app-tachyon/src/tachyon/services/tachyonLogWatcher.service.ts index 524ea738..73ab150b 100644 --- a/fe-app-tachyon/src/tachyon/services/tachyonLogWatcher.service.ts +++ b/fe-app-tachyon/src/tachyon/services/tachyonLogWatcher.service.ts @@ -2,14 +2,14 @@ import { logger } from './logger.service'; type LogFetcher = () => Promise | string; -interface ForkopLogWatcherOptions { +interface TachyonLogWatcherOptions { intervalMs?: number; onNewLog?: (line: string) => void; maxTrackedLines?: number; } -export class ForkopLogWatcher { - private static instance: ForkopLogWatcher; +export class TachyonLogWatcher { + private static instance: TachyonLogWatcher; private fetcher?: LogFetcher; private onNewLog?: (line: string) => void; private intervalMs = 5000; @@ -29,21 +29,21 @@ export class ForkopLogWatcher { } } - static getInstance(): ForkopLogWatcher { - if (!ForkopLogWatcher.instance) { - ForkopLogWatcher.instance = new ForkopLogWatcher(); + static getInstance(): TachyonLogWatcher { + if (!TachyonLogWatcher.instance) { + TachyonLogWatcher.instance = new TachyonLogWatcher(); } - return ForkopLogWatcher.instance; + return TachyonLogWatcher.instance; } - init(fetcher: LogFetcher, options?: ForkopLogWatcherOptions): void { + init(fetcher: LogFetcher, options?: TachyonLogWatcherOptions): void { this.fetcher = fetcher; this.onNewLog = options?.onNewLog; this.intervalMs = options?.intervalMs ?? 5000; this.maxTrackedLines = options?.maxTrackedLines ?? 500; this.lastLines = new Set(); logger.info( - '[ForkopLogWatcher]', + '[TachyonLogWatcher]', `initialized (interval: ${this.intervalMs}ms)`, ); } @@ -54,18 +54,18 @@ export class ForkopLogWatcher { async checkOnce(): Promise { if (!this.fetcher) { - logger.warn('[ForkopLogWatcher]', 'fetcher not found'); + logger.warn('[TachyonLogWatcher]', 'fetcher not found'); return; } if (this.paused) { - logger.debug('[ForkopLogWatcher]', 'skipped check — tab not visible'); + logger.debug('[TachyonLogWatcher]', 'skipped check — tab not visible'); return; } if (this.checking) { logger.debug( - '[ForkopLogWatcher]', + '[TachyonLogWatcher]', 'skipped check — previous check is running', ); return; @@ -92,7 +92,7 @@ export class ForkopLogWatcher { ); } } catch (err) { - logger.error('[ForkopLogWatcher]', 'failed to read logs:', err); + logger.error('[TachyonLogWatcher]', 'failed to read logs:', err); } finally { this.checking = false; } @@ -101,7 +101,7 @@ export class ForkopLogWatcher { start(): void { if (this.running) return; if (!this.fetcher) { - logger.warn('[ForkopLogWatcher]', 'attempted to start without fetcher'); + logger.warn('[TachyonLogWatcher]', 'attempted to start without fetcher'); return; } @@ -109,7 +109,7 @@ export class ForkopLogWatcher { void this.checkOnce(); this.timer = setInterval(() => this.checkOnce(), this.intervalMs); logger.info( - '[ForkopLogWatcher]', + '[TachyonLogWatcher]', `started (interval: ${this.intervalMs}ms)`, ); } @@ -118,25 +118,25 @@ export class ForkopLogWatcher { if (!this.running) return; this.running = false; if (this.timer) clearInterval(this.timer); - logger.info('[ForkopLogWatcher]', 'stopped'); + logger.info('[TachyonLogWatcher]', 'stopped'); } pause(): void { if (!this.running || this.paused) return; this.paused = true; - logger.info('[ForkopLogWatcher]', 'paused (tab not visible)'); + logger.info('[TachyonLogWatcher]', 'paused (tab not visible)'); } resume(): void { if (!this.running || !this.paused) return; this.paused = false; - logger.info('[ForkopLogWatcher]', 'resumed (tab active)'); + logger.info('[TachyonLogWatcher]', 'resumed (tab active)'); void this.checkOnce(); } reset(): void { this.lastLines = new Set(); this.checking = false; - logger.info('[ForkopLogWatcher]', 'log history reset'); + logger.info('[TachyonLogWatcher]', 'log history reset'); } } diff --git a/fe-app-tachyon/src/tachyon/services/tests/logNotificationDeduper.service.test.ts b/fe-app-tachyon/src/tachyon/services/tests/logNotificationDeduper.service.test.ts index 05e1996a..0a28c489 100644 --- a/fe-app-tachyon/src/tachyon/services/tests/logNotificationDeduper.service.test.ts +++ b/fe-app-tachyon/src/tachyon/services/tests/logNotificationDeduper.service.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from 'vitest'; import { getLogNotificationKey, - getForkopLogNotification, + getTachyonLogNotification, isErrorLogLine, LogNotificationDeduper, } from '../logNotificationDeduper.service'; @@ -37,44 +37,44 @@ class MemoryStorage implements Storage { describe('LogNotificationDeduper', () => { it('accepts error, fatal, and component update log lines', () => { - expect(isErrorLogLine('forkop: [info] ok')).toBe(false); - expect(isErrorLogLine('forkop: [error] failed')).toBe(true); - expect(isErrorLogLine('forkop: [fatal] failed')).toBe(true); + expect(isErrorLogLine('tachyon: [info] ok')).toBe(false); + expect(isErrorLogLine('tachyon: [error] failed')).toBe(true); + expect(isErrorLogLine('tachyon: [fatal] failed')).toBe(true); expect( - getForkopLogNotification( - 'forkop: [info] [component-update] zapret2 v1.2.3', + getTachyonLogNotification( + 'tachyon: [info] [component-update] zapret2 v1.2.3', ), ).toEqual({ kind: 'component-update', - line: 'forkop: [info] [component-update] zapret2 v1.2.3', + line: 'tachyon: [info] [component-update] zapret2 v1.2.3', component: 'zapret2', version: 'v1.2.3', }); - expect(getForkopLogNotification('forkop: [info] ok')).toBeNull(); + expect(getTachyonLogNotification('tachyon: [info] ok')).toBeNull(); }); it('dedupes already shown log lines through session storage', () => { const storage = new MemoryStorage(); const first = new LogNotificationDeduper(storage); - expect(first.shouldNotify('forkop: [error] failed')).toBe(true); - expect(first.shouldNotify('forkop: [error] failed')).toBe(false); - expect(first.shouldNotify('forkop: [error] another failure')).toBe(true); + expect(first.shouldNotify('tachyon: [error] failed')).toBe(true); + expect(first.shouldNotify('tachyon: [error] failed')).toBe(false); + expect(first.shouldNotify('tachyon: [error] another failure')).toBe(true); expect( - first.shouldNotify('forkop: [info] [component-update] forkop 1.2.3'), + first.shouldNotify('tachyon: [info] [component-update] tachyon 1.2.3'), ).toBe(true); const afterReload = new LogNotificationDeduper(storage); - expect(afterReload.shouldNotify('forkop: [error] failed')).toBe(false); - expect(afterReload.shouldNotify('forkop: [fatal] fatal failure')).toBe( + expect(afterReload.shouldNotify('tachyon: [error] failed')).toBe(false); + expect(afterReload.shouldNotify('tachyon: [fatal] fatal failure')).toBe( true, ); }); it('keeps the full log line as the replay key', () => { - expect(getLogNotificationKey(' Jun 06 forkop: [error] failed ')).toBe( - 'Jun 06 forkop: [error] failed', + expect(getLogNotificationKey(' Jun 06 tachyon: [error] failed ')).toBe( + 'Jun 06 tachyon: [error] failed', ); }); }); diff --git a/fe-app-tachyon/src/tachyon/services/tests/runtimeUiState.service.test.ts b/fe-app-tachyon/src/tachyon/services/tests/runtimeUiState.service.test.ts index a31892ad..de311500 100644 --- a/fe-app-tachyon/src/tachyon/services/tests/runtimeUiState.service.test.ts +++ b/fe-app-tachyon/src/tachyon/services/tests/runtimeUiState.service.test.ts @@ -8,7 +8,7 @@ vi.mock('../../../helpers', () => ({ executeShellCommand: mocks.executeShellCommand, })); -import { Forkop } from '../../types'; +import { Tachyon } from '../../types'; import { store } from '../store.service'; import { getCachedRuntimeUiState, @@ -19,10 +19,10 @@ import { function createUiState( status = 'running & enabled', running = 1, -): Forkop.UiState { +): Tachyon.UiState { return { service: { - forkop: { + tachyon: { running, enabled: 1, status, @@ -73,14 +73,14 @@ describe('refreshRuntimeUiState', () => { ); expect(mocks.executeShellCommand).toHaveBeenCalledWith({ - command: '/usr/bin/forkop', + command: '/usr/bin/tachyon', args: ['get_ui_state'], timeout: 3000, }); expect(store.get().servicesInfoWidget.data).toMatchObject({ - forkopRunning: 0, - forkopEnabled: 1, - forkopStatus: 'stopped but enabled', + tachyonRunning: 0, + tachyonEnabled: 1, + tachyonStatus: 'stopped but enabled', }); }); diff --git a/fe-app-tachyon/src/tachyon/services/tests/tachyonLogWatcher.service.test.ts b/fe-app-tachyon/src/tachyon/services/tests/tachyonLogWatcher.service.test.ts index 4adfb190..f9cf690f 100644 --- a/fe-app-tachyon/src/tachyon/services/tests/tachyonLogWatcher.service.test.ts +++ b/fe-app-tachyon/src/tachyon/services/tests/tachyonLogWatcher.service.test.ts @@ -1,9 +1,9 @@ import { beforeEach, describe, expect, it } from 'vitest'; -import { ForkopLogWatcher } from '../forkopLogWatcher.service'; +import { TachyonLogWatcher } from '../tachyonLogWatcher.service'; -describe('ForkopLogWatcher', () => { - const watcher = ForkopLogWatcher.getInstance(); +describe('TachyonLogWatcher', () => { + const watcher = TachyonLogWatcher.getInstance(); let rawLogs = ''; let seenLines: string[] = []; diff --git a/fe-app-tachyon/src/tachyon/services/tests/uiState.service.test.ts b/fe-app-tachyon/src/tachyon/services/tests/uiState.service.test.ts index 8831d83b..e62b363c 100644 --- a/fe-app-tachyon/src/tachyon/services/tests/uiState.service.test.ts +++ b/fe-app-tachyon/src/tachyon/services/tests/uiState.service.test.ts @@ -1,7 +1,7 @@ import { beforeEach, describe, expect, it } from 'vitest'; import { applyUiStateToStore } from '../uiState.service'; import { store } from '../store.service'; -import { Forkop } from '../../types'; +import { Tachyon } from '../../types'; import { clearLocalActionOverlay, setLocalComponentAction, @@ -11,12 +11,12 @@ import { } from '../localActionOverlay.service'; function createUiState( - actions: Partial = {}, - capabilities: Partial = {}, -): Forkop.UiState { + actions: Partial = {}, + capabilities: Partial = {}, +): Tachyon.UiState { return { service: { - forkop: { + tachyon: { running: 0, enabled: 1, status: 'starting', @@ -114,9 +114,9 @@ describe('applyUiStateToStore', () => { loading: false, failed: false, data: { - forkopEnabled: 1, - forkopRunning: 0, - forkopStatus: 'starting', + tachyonEnabled: 1, + tachyonRunning: 0, + tachyonStatus: 'starting', }, }); expect(state.diagnosticsSystemInfo).toMatchObject({ diff --git a/fe-app-tachyon/src/tachyon/services/uiActionNotification.service.ts b/fe-app-tachyon/src/tachyon/services/uiActionNotification.service.ts index 8d1d8186..876cb9e4 100644 --- a/fe-app-tachyon/src/tachyon/services/uiActionNotification.service.ts +++ b/fe-app-tachyon/src/tachyon/services/uiActionNotification.service.ts @@ -1,5 +1,5 @@ const UI_ACTION_NOTIFICATION_STORAGE_KEY = - 'forkop:owned-ui-action-notifications:v1'; + 'tachyon:owned-ui-action-notifications:v1'; const MAX_STORED_UI_ACTION_NOTIFICATIONS = 100; export type UiActionNotificationKind = 'component' | 'subscription'; diff --git a/fe-app-tachyon/src/tachyon/services/uiState.service.ts b/fe-app-tachyon/src/tachyon/services/uiState.service.ts index 014061d9..c016bdbe 100644 --- a/fe-app-tachyon/src/tachyon/services/uiState.service.ts +++ b/fe-app-tachyon/src/tachyon/services/uiState.service.ts @@ -1,11 +1,11 @@ import { getComponentActionKey } from '../helpers/getComponentActionKey'; import { normalizeSingBoxVariantFields } from '../helpers/singBoxVariant'; -import type { Forkop } from '../types'; +import type { Tachyon } from '../types'; import { getLocalActionOverlay } from './localActionOverlay.service'; import { store } from './store.service'; import type { StoreType } from './store.service'; -type UiActionMap = Partial; +type UiActionMap = Partial; function isRunningAction(state: { running?: boolean }) { return state.running === true; @@ -13,8 +13,8 @@ function isRunningAction(state: { running?: boolean }) { function getEmptyUpdatesActions(): StoreType['updatesActions'] { return { - forkopCheck: { loading: false }, - forkopInstall: { loading: false }, + tachyonCheck: { loading: false }, + tachyonInstall: { loading: false }, singBoxCheck: { loading: false }, singBoxInstall: { loading: false }, singBoxInstallExtended: { loading: false }, @@ -43,8 +43,8 @@ function getEmptyDiagnosticsActions(): StoreType['diagnosticsActions'] { } function normalizeLatencyProgress( - progress?: Forkop.LatencyActionProgress, -): Forkop.LatencyActionProgress | undefined { + progress?: Tachyon.LatencyActionProgress, +): Tachyon.LatencyActionProgress | undefined { const total = Math.trunc(Number(progress?.total ?? 0)); if (!Number.isFinite(total) || total <= 0) { @@ -65,7 +65,7 @@ function normalizeLatencyProgress( }; } -function applyServiceState(uiState: Forkop.UiState) { +function applyServiceState(uiState: Tachyon.UiState) { const currentSystemInfo = store.get().diagnosticsSystemInfo; const nextSystemInfo = { ...currentSystemInfo, @@ -88,9 +88,9 @@ function applyServiceState(uiState: Forkop.UiState) { failed: false, data: { singbox: uiState.service.sing_box.running, - forkopRunning: uiState.service.forkop.running, - forkopEnabled: uiState.service.forkop.enabled, - forkopStatus: uiState.service.forkop.status, + tachyonRunning: uiState.service.tachyon.running, + tachyonEnabled: uiState.service.tachyon.enabled, + tachyonStatus: uiState.service.tachyon.status, }, }, diagnosticsSystemInfo: normalizeSingBoxVariantFields(nextSystemInfo), @@ -104,7 +104,7 @@ function applyActionState(actions: UiActionMap = {}) { current.sectionsWidget.latencyProgressSections; const subscriptionUpdatingSections: Record = {}; const latencyFetchingSections: Record = {}; - const latencyProgressSections: Record = + const latencyProgressSections: Record = {}; const updatesActions = getEmptyUpdatesActions(); const diagnosticsActions = getEmptyDiagnosticsActions(); @@ -188,7 +188,7 @@ function applyActionState(actions: UiActionMap = {}) { }); } -export function applyUiStateToStore(uiState: Forkop.UiState) { +export function applyUiStateToStore(uiState: Tachyon.UiState) { applyServiceState(uiState); applyActionState(uiState.actions); } diff --git a/fe-app-tachyon/src/tachyon/tabs/dashboard/initController.ts b/fe-app-tachyon/src/tachyon/tabs/dashboard/initController.ts index bd20cfb3..2af6eb0c 100644 --- a/fe-app-tachyon/src/tachyon/tabs/dashboard/initController.ts +++ b/fe-app-tachyon/src/tachyon/tabs/dashboard/initController.ts @@ -8,7 +8,7 @@ import { copyToClipboard } from '../../../helpers/copyToClipboard'; import { showToast } from '../../../helpers/showToast'; import { prettyBytes } from '../../../helpers/prettyBytes'; import { renderCopyIcon24 } from '../../../icons'; -import { CustomForkopMethods, ForkopShellMethods } from '../../methods'; +import { CustomTachyonMethods, TachyonShellMethods } from '../../methods'; import { logger, markUiActionOwned, @@ -22,7 +22,7 @@ import { import { getLatencyTestLabel, renderSections, renderWidget } from './partials'; import { fetchServicesInfo } from '../../fetchers/fetchServicesInfo'; import { getClashApiSecret } from '../../methods/custom/getClashApiSecret'; -import { Forkop } from '../../types'; +import { Tachyon } from '../../types'; import { getCachedRuntimeUiState, refreshRuntimeUiState, @@ -79,7 +79,7 @@ async function fetchDashboardSectionsOnce(mountId: number) { }); try { - const { data, success } = await CustomForkopMethods.getDashboardSections(); + const { data, success } = await CustomTachyonMethods.getDashboardSections(); if ( !dashboardMounted || @@ -219,7 +219,7 @@ function setLatencyFetching( sectionName: string, fetching: boolean, local = false, - progress?: Forkop.LatencyActionProgress, + progress?: Tachyon.LatencyActionProgress, ) { if (local || !fetching) { setLocalLatencyAction(sectionName, fetching && local); @@ -255,7 +255,7 @@ function setLatencyFetching( async function completeSubscriptionUpdateJob( jobId: string, sectionName: string, - response: Forkop.MethodResponse, + response: Tachyon.MethodResponse, ) { if (pageUnloading) { setSubscriptionUpdating(sectionName, false); @@ -287,7 +287,7 @@ async function completeSubscriptionUpdateJob( setSubscriptionUpdating(sectionName, false); if (jobId && response.success) { - void ForkopShellMethods.uiActionAck('subscription', jobId); + void TachyonShellMethods.uiActionAck('subscription', jobId); } if (failed) { @@ -305,7 +305,7 @@ async function completeSubscriptionUpdateJob( } async function followSubscriptionUpdateState( - state: Forkop.SubscriptionUpdateJobState, + state: Tachyon.SubscriptionUpdateJobState, ) { const jobId = state.job_id; const sectionName = state.section || ''; @@ -325,11 +325,11 @@ async function followSubscriptionUpdateState( try { const response = state.running - ? await ForkopShellMethods.waitSubscriptionUpdateJob(jobId) + ? await TachyonShellMethods.waitSubscriptionUpdateJob(jobId) : ({ success: true, data: state, - } as Forkop.MethodSuccessResponse); + } as Tachyon.MethodSuccessResponse); await completeSubscriptionUpdateJob(jobId, sectionName, response); } catch (error) { @@ -366,13 +366,13 @@ async function completeLatencyTestJob(jobId: string, sectionName: string) { } if (jobId) { - void ForkopShellMethods.uiActionAck('latency', jobId); + void TachyonShellMethods.uiActionAck('latency', jobId); } void fetchDashboardSections({ force: true }); } -async function followLatencyTestState(state: Forkop.LatencyActionState) { +async function followLatencyTestState(state: Tachyon.LatencyActionState) { const jobId = state.job_id; const sectionName = state.section || ''; @@ -391,7 +391,7 @@ async function followLatencyTestState(state: Forkop.LatencyActionState) { try { if (state.running) { - await ForkopShellMethods.waitLatencyTestJob(jobId); + await TachyonShellMethods.waitLatencyTestJob(jobId); } await completeLatencyTestJob(jobId, sectionName); @@ -405,13 +405,13 @@ async function followLatencyTestState(state: Forkop.LatencyActionState) { } } -function followDashboardActionsFromUiState(uiState: Forkop.UiState) { +function followDashboardActionsFromUiState(uiState: Tachyon.UiState) { for (const state of uiState.actions.subscription || []) { if (state.running || (state.job_id && state.section)) { void followSubscriptionUpdateState(state); } else if (state.job_id && !handledSubscriptionJobs.has(state.job_id)) { handledSubscriptionJobs.add(state.job_id); - void ForkopShellMethods.uiActionAck('subscription', state.job_id); + void TachyonShellMethods.uiActionAck('subscription', state.job_id); } } @@ -420,7 +420,7 @@ function followDashboardActionsFromUiState(uiState: Forkop.UiState) { void followLatencyTestState(state); } else if (state.job_id && !handledLatencyJobs.has(state.job_id)) { handledLatencyJobs.add(state.job_id); - void ForkopShellMethods.uiActionAck('latency', state.job_id); + void TachyonShellMethods.uiActionAck('latency', state.job_id); } } } @@ -571,7 +571,7 @@ function getDashboardServiceAvailability() { return getServiceAvailability({ loading: service.loading, failed: service.failed, - running: service.data.forkopRunning, + running: service.data.tachyonRunning, }); } @@ -646,7 +646,7 @@ async function handleChooseOutbound( setSelectorSwitching(sectionName, tag); try { - await ForkopShellMethods.setClashApiGroupProxy(selector, tag); + await TachyonShellMethods.setClashApiGroupProxy(selector, tag); await fetchDashboardSections({ force: true }); } finally { setSelectorSwitching(sectionName); @@ -654,9 +654,9 @@ async function handleChooseOutbound( } function getInitialLatencyProgress( - latencyType: Forkop.LatencyActionState['latency_type'], + latencyType: Tachyon.LatencyActionState['latency_type'], tag: string, -): Forkop.LatencyActionProgress | undefined { +): Tachyon.LatencyActionProgress | undefined { if (latencyType !== 'proxy_list') { return undefined; } @@ -678,7 +678,7 @@ function getInitialLatencyProgress( } async function handleTestLatency( - latencyType: Forkop.LatencyActionState['latency_type'], + latencyType: Tachyon.LatencyActionState['latency_type'], sectionName: string, tag: string, timeout?: string, @@ -698,7 +698,7 @@ async function handleTestLatency( let completed = false; try { - const startResponse = await ForkopShellMethods.latencyTestStart( + const startResponse = await TachyonShellMethods.latencyTestStart( latencyType, sectionName, tag, @@ -717,7 +717,7 @@ async function handleTestLatency( followedLatencyJobs.add(jobId); ownsJobFollow = true; - await ForkopShellMethods.waitLatencyTestJob(jobId); + await TachyonShellMethods.waitLatencyTestJob(jobId); await completeLatencyTestJob(jobId, sectionName); completed = true; } catch (error) { @@ -734,8 +734,8 @@ async function handleTestLatency( } async function handleCopyOutbound( - section: Forkop.OutboundGroup, - outbound: Forkop.Outbound, + section: Tachyon.OutboundGroup, + outbound: Tachyon.Outbound, ) { const link = outbound.link; @@ -744,7 +744,7 @@ async function handleCopyOutbound( return; } - const response = await ForkopShellMethods.getOutboundLink( + const response = await TachyonShellMethods.getOutboundLink( section.sectionName, outbound.code, ); @@ -817,7 +817,7 @@ function getDetectedCountryFlag(country?: string) { ); } -function renderDetailsMemberName(member: Forkop.UrlTestMember) { +function renderDetailsMemberName(member: Tachyon.UrlTestMember) { const countryFlag = getDetectedCountryFlag(member.country); if (!countryFlag) { return member.displayName; @@ -833,7 +833,7 @@ function renderDetailsMemberName(member: Forkop.UrlTestMember) { ]; } -function renderUrlTestSelectedValue(info: Forkop.UrlTestInfo) { +function renderUrlTestSelectedValue(info: Tachyon.UrlTestInfo) { const selectedMember = info.outbounds.find((member) => member.selected); const selectedName = selectedMember?.displayName || info.selectedName || info.selectedCode || ''; @@ -892,8 +892,8 @@ function renderUrlTestCopyButton( } function renderUrlTestInfoModal( - section: Forkop.OutboundGroup, - outbound: Forkop.Outbound, + section: Tachyon.OutboundGroup, + outbound: Tachyon.Outbound, ) { const info = outbound.urlTestInfo; @@ -1031,8 +1031,8 @@ function renderUrlTestInfoModal( } function handleShowUrlTestInfo( - section: Forkop.OutboundGroup, - outbound: Forkop.Outbound, + section: Tachyon.OutboundGroup, + outbound: Tachyon.Outbound, ) { if (!outbound.urlTestInfo) { return; @@ -1046,7 +1046,7 @@ function handleShowUrlTestInfo( ); } -function renderPrioritySelectedValue(info: Forkop.PriorityInfo) { +function renderPrioritySelectedValue(info: Tachyon.PriorityInfo) { const selectedMember = info.outbounds.find((member) => member.selected); const selectedName = selectedMember?.displayName || info.selectedName || info.selectedCode || ''; @@ -1096,7 +1096,7 @@ function renderPrioritySelectedValue(info: Forkop.PriorityInfo) { ); } -function renderPriorityMemberName(member: Forkop.PriorityMember) { +function renderPriorityMemberName(member: Tachyon.PriorityMember) { const levelName = member.levelName || _('Level'); return [ @@ -1119,8 +1119,8 @@ function renderPriorityMemberName(member: Forkop.PriorityMember) { } function renderPriorityInfoModal( - section: Forkop.OutboundGroup, - outbound: Forkop.Outbound, + section: Tachyon.OutboundGroup, + outbound: Tachyon.Outbound, ) { const info = outbound.priorityInfo; @@ -1287,8 +1287,8 @@ function renderPriorityInfoModal( } function handleShowPriorityInfo( - section: Forkop.OutboundGroup, - outbound: Forkop.Outbound, + section: Tachyon.OutboundGroup, + outbound: Tachyon.Outbound, ) { if (!outbound.priorityInfo) { return; @@ -1302,7 +1302,7 @@ function handleShowPriorityInfo( ); } -async function handleUpdateSubscription(section: Forkop.OutboundGroup) { +async function handleUpdateSubscription(section: Tachyon.OutboundGroup) { if ( store.get().sectionsWidget.subscriptionUpdatingSections[section.sectionName] ) { @@ -1314,7 +1314,7 @@ async function handleUpdateSubscription(section: Forkop.OutboundGroup) { let ownsJobFollow = false; try { - const startResponse = await ForkopShellMethods.subscriptionUpdateStart( + const startResponse = await TachyonShellMethods.subscriptionUpdateStart( section.sectionName, ); @@ -1330,7 +1330,7 @@ async function handleUpdateSubscription(section: Forkop.OutboundGroup) { followedSubscriptionJobs.add(jobId); ownsJobFollow = true; - const response = await ForkopShellMethods.waitSubscriptionUpdateJob(jobId); + const response = await TachyonShellMethods.waitSubscriptionUpdateJob(jobId); await completeSubscriptionUpdateJob(jobId, section.sectionName, response); } catch (error) { logger.error('[DASHBOARD]', 'handleUpdateSubscription: failed', error); @@ -1670,12 +1670,12 @@ async function renderServicesInfoWidget() { title: _('Services info'), items: [ { - key: 'Forkop', - value: servicesInfoWidget.data.forkopRunning + key: 'Tachyon', + value: servicesInfoWidget.data.tachyonRunning ? _('✔ Running') : _('✘ Stopped'), attributes: { - class: servicesInfoWidget.data.forkopRunning + class: servicesInfoWidget.data.tachyonRunning ? 'fkp_dashboard-page__widgets-section__item__row--success' : 'fkp_dashboard-page__widgets-section__item__row--error', }, diff --git a/fe-app-tachyon/src/tachyon/tabs/dashboard/partials/renderSections.ts b/fe-app-tachyon/src/tachyon/tabs/dashboard/partials/renderSections.ts index 97e20753..9bfa2dbd 100644 --- a/fe-app-tachyon/src/tachyon/tabs/dashboard/partials/renderSections.ts +++ b/fe-app-tachyon/src/tachyon/tabs/dashboard/partials/renderSections.ts @@ -6,12 +6,12 @@ import { } from '../../../../icons'; import { isCopyableProxyLink, svgEl } from '../../../../helpers'; import { prettyBytes } from '../../../../helpers/prettyBytes'; -import { Forkop } from '../../../types'; +import { Tachyon } from '../../../types'; interface IRenderSectionsProps { loading: boolean; failed: boolean; - section: Forkop.OutboundGroup; + section: Tachyon.OutboundGroup; onTestLatency: (tag: string | string[]) => void; onChooseOutbound: ( sectionName: string, @@ -19,20 +19,20 @@ interface IRenderSectionsProps { tag: string, ) => void; onCopyOutbound: ( - section: Forkop.OutboundGroup, - outbound: Forkop.Outbound, + section: Tachyon.OutboundGroup, + outbound: Tachyon.Outbound, ) => void; onShowUrlTestInfo: ( - section: Forkop.OutboundGroup, - outbound: Forkop.Outbound, + section: Tachyon.OutboundGroup, + outbound: Tachyon.Outbound, ) => void; onShowPriorityInfo: ( - section: Forkop.OutboundGroup, - outbound: Forkop.Outbound, + section: Tachyon.OutboundGroup, + outbound: Tachyon.Outbound, ) => void; - onUpdateSubscription: (section: Forkop.OutboundGroup) => void; + onUpdateSubscription: (section: Tachyon.OutboundGroup) => void; latencyFetching: boolean; - latencyProgress?: Forkop.LatencyActionProgress; + latencyProgress?: Tachyon.LatencyActionProgress; subscriptionUpdating: boolean; selectorSwitchingTag?: string; } @@ -109,7 +109,7 @@ function renderMetadataAction(label: string, url?: string) { } function renderSubscriptionMetadata( - metadata: Forkop.SubscriptionMetadata | undefined, + metadata: Tachyon.SubscriptionMetadata | undefined, ) { if (!metadata || Object.keys(metadata).length <= 1) { return undefined; @@ -203,9 +203,9 @@ function renderSubscriptionMetadata( } function renderSubscriptionUpdateAction( - section: Forkop.OutboundGroup, + section: Tachyon.OutboundGroup, subscriptionUpdating: boolean, - onUpdateSubscription: (section: Forkop.OutboundGroup) => void, + onUpdateSubscription: (section: Tachyon.OutboundGroup) => void, ) { if (!section.subscriptionSourceCount) { return undefined; @@ -235,7 +235,7 @@ function renderSubscriptionUpdateAction( } export function getLatencyTestLabel( - latencyProgress?: Forkop.LatencyActionProgress, + latencyProgress?: Tachyon.LatencyActionProgress, ) { const total = Math.trunc(Number(latencyProgress?.total ?? 0)); if (!Number.isFinite(total) || total <= 0) { @@ -280,7 +280,7 @@ function renderDefaultState({ } } - function renderOutbound(outbound: Forkop.Outbound) { + function renderOutbound(outbound: Tachyon.Outbound) { function getLatencyClass() { if (!outbound.latency) { return 'fkp_dashboard-page__outbound-grid__item__latency--empty'; diff --git a/fe-app-tachyon/src/tachyon/tabs/dashboard/render.ts b/fe-app-tachyon/src/tachyon/tabs/dashboard/render.ts index 54806bc1..d6f27a28 100644 --- a/fe-app-tachyon/src/tachyon/tabs/dashboard/render.ts +++ b/fe-app-tachyon/src/tachyon/tabs/dashboard/render.ts @@ -15,7 +15,7 @@ export function render() { role: 'status', }, _( - 'Forkop service is stopped. Start the service to display the dashboard.', + 'Tachyon service is stopped. Start the service to display the dashboard.', ), ), E('div', { class: 'fkp_dashboard-page__content' }, [ diff --git a/fe-app-tachyon/src/tachyon/tabs/dashboard/styles.ts b/fe-app-tachyon/src/tachyon/tabs/dashboard/styles.ts index 1abe31e1..6c354fb9 100644 --- a/fe-app-tachyon/src/tachyon/tabs/dashboard/styles.ts +++ b/fe-app-tachyon/src/tachyon/tabs/dashboard/styles.ts @@ -1,21 +1,21 @@ // language=CSS -import { FORKOP_UCI_PACKAGE as FORKOP_CBI_PREFIX } from '../../../constants'; +import { TACHYON_UCI_PACKAGE as TACHYON_CBI_PREFIX } from '../../../constants'; export const styles = ` -#cbi-${FORKOP_CBI_PREFIX}-dashboard-_mount_node > .cbi-value-title { +#cbi-${TACHYON_CBI_PREFIX}-dashboard-_mount_node > .cbi-value-title { display: none; } -#cbi-${FORKOP_CBI_PREFIX}-dashboard-_mount_node > .cbi-value-field { +#cbi-${TACHYON_CBI_PREFIX}-dashboard-_mount_node > .cbi-value-field { margin-left: 0; width: 100%; } -#cbi-${FORKOP_CBI_PREFIX}-dashboard-_mount_node > div { +#cbi-${TACHYON_CBI_PREFIX}-dashboard-_mount_node > div { width: 100%; } -#cbi-${FORKOP_CBI_PREFIX}-dashboard > h3 { +#cbi-${TACHYON_CBI_PREFIX}-dashboard > h3 { display: none; } diff --git a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/getDnsCheckPresentation.ts b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/getDnsCheckPresentation.ts index a291ac4d..f34d8a85 100644 --- a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/getDnsCheckPresentation.ts +++ b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/getDnsCheckPresentation.ts @@ -1,9 +1,9 @@ -import type { Forkop } from '../../../types'; +import type { Tachyon } from '../../../types'; import { getMeta } from '../helpers/getMeta'; type DnsCheckState = 'error' | 'success' | 'warning'; -export function getDnsCheckPresentation(data: Forkop.DnsCheckResult) { +export function getDnsCheckPresentation(data: Tachyon.DnsCheckResult) { const dhcpManagedManually = Boolean(data.dont_touch_dhcp); const dhcpCheckOk = dhcpManagedManually || Boolean(data.dhcp_config_status); diff --git a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts index f517e64e..6682d417 100644 --- a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts +++ b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts @@ -1,5 +1,5 @@ import { DIAGNOSTICS_CHECKS_MAP } from './contstants'; -import { ForkopShellMethods } from '../../../methods'; +import { TachyonShellMethods } from '../../../methods'; import { updateCheckStore } from './updateCheckStore'; import { IDiagnosticsChecksItem } from '../../../services'; import { getCheckItemsMeta } from './getCheckItemsMeta'; @@ -16,7 +16,7 @@ export async function runByedpiCheck() { items: [], }); - const byedpiStatus = await ForkopShellMethods.getByedpiStatus(); + const byedpiStatus = await TachyonShellMethods.getByedpiStatus(); if (!byedpiStatus.success) { updateCheckStore({ @@ -40,7 +40,7 @@ export async function runByedpiCheck() { const supervisorProcesses = Number(data.supervisor_process_count || 0); const restartCount = Number(data.restart_count || 0); const runtimeUnstable = Boolean(data.runtime_unstable); - const forkopRuntimeReady = + const tachyonRuntimeReady = !hasByedpiRules || (runningProcesses === expectedProcesses && supervisorProcesses === expectedProcesses); @@ -81,20 +81,20 @@ export async function runByedpiCheck() { }, { state: - unexpectedRuntime || !forkopRuntimeReady + unexpectedRuntime || !tachyonRuntimeReady ? 'error' : runtimeUnstable ? 'warning' : 'success', key: hasByedpiRules ? runtimeUnstable - ? _('Forkop-managed ciadpi runtime has restarted') - : forkopRuntimeReady - ? _('Forkop-managed ciadpi runtime is ready') - : _('Forkop-managed ciadpi runtime is not ready') + ? _('Tachyon-managed ciadpi runtime has restarted') + : tachyonRuntimeReady + ? _('Tachyon-managed ciadpi runtime is ready') + : _('Tachyon-managed ciadpi runtime is not ready') : unexpectedRuntime - ? _('Unexpected Forkop-managed ciadpi runtime is running') - : _('Forkop-managed ciadpi runtime is not running'), + ? _('Unexpected Tachyon-managed ciadpi runtime is running') + : _('Tachyon-managed ciadpi runtime is not running'), value: hasByedpiRules ? runtimeUnstable ? `${restartCount}` @@ -116,7 +116,7 @@ export async function runByedpiCheck() { : 'success', key: standaloneServiceRunning ? hasByedpiRules - ? _('Standalone ByeDPI is active together with Forkop ByeDPI rules') + ? _('Standalone ByeDPI is active together with Tachyon ByeDPI rules') : _('Standalone ByeDPI service is active') : standaloneAutostartRisk ? _('Standalone ByeDPI autostart is enabled') diff --git a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts index fc9b281a..23fc88e7 100644 --- a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts +++ b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts @@ -1,6 +1,6 @@ import { insertIf } from '../../../../helpers'; import { DIAGNOSTICS_CHECKS_MAP } from './contstants'; -import { ForkopShellMethods } from '../../../methods'; +import { TachyonShellMethods } from '../../../methods'; import type { IDiagnosticsChecksItem } from '../../../services'; import { updateCheckStore } from './updateCheckStore'; import { getDnsCheckPresentation } from './getDnsCheckPresentation'; @@ -17,7 +17,7 @@ export async function runDnsCheck() { items: [], }); - const dnsChecks = await ForkopShellMethods.checkDNSAvailable(); + const dnsChecks = await TachyonShellMethods.checkDNSAvailable(); if (!dnsChecks.success) { updateCheckStore({ diff --git a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts index 96dcc2ac..c02e5c29 100644 --- a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts +++ b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts @@ -1,6 +1,6 @@ import { insertIf } from '../../../../helpers'; import { DIAGNOSTICS_CHECKS_MAP } from './contstants'; -import { ForkopShellMethods, RemoteFakeIPMethods } from '../../../methods'; +import { TachyonShellMethods, RemoteFakeIPMethods } from '../../../methods'; import type { IDiagnosticsChecksItem } from '../../../services'; import { updateCheckStore } from './updateCheckStore'; import { getMeta } from '../helpers/getMeta'; @@ -17,7 +17,7 @@ export async function runFakeIPCheck() { items: [], }); - const routerFakeIPResponse = await ForkopShellMethods.checkFakeIP(); + const routerFakeIPResponse = await TachyonShellMethods.checkFakeIP(); const checkFakeIPResponse = await RemoteFakeIPMethods.getFakeIpCheck(); const checkIPResponse = await RemoteFakeIPMethods.getIpCheck(); const browserFakeIPCheckUnavailable = !checkFakeIPResponse.success; diff --git a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts index 3f1bbdf8..3d931467 100644 --- a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts +++ b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts @@ -1,20 +1,20 @@ import { DIAGNOSTICS_CHECKS_MAP } from './contstants'; -import { ForkopShellMethods } from '../../../methods'; +import { TachyonShellMethods } from '../../../methods'; import { updateCheckStore } from './updateCheckStore'; import { getMeta } from '../helpers/getMeta'; import { IDiagnosticsChecksItem } from '../../../services'; -import { Forkop } from '../../../types'; +import { Tachyon } from '../../../types'; -function serverPrefix(item: Forkop.InboundCheckItem) { +function serverPrefix(item: Tachyon.InboundCheckItem) { return `${item.label}:`; } -function formatListen(item: Forkop.InboundCheckItem) { +function formatListen(item: Tachyon.InboundCheckItem) { return `${item.listen}:${Number(item.listen_port || 0)} [${item.required_proto}]`; } function getPortConflictItem( - item: Forkop.InboundCheckItem, + item: Tachyon.InboundCheckItem, ): IDiagnosticsChecksItem { const key = `${serverPrefix(item)} ${_('Port conflict')}`; @@ -34,7 +34,7 @@ function getPortConflictItem( } function getPublicHostItem( - item: Forkop.InboundCheckItem, + item: Tachyon.InboundCheckItem, wanIp: string, ): IDiagnosticsChecksItem { const key = `${serverPrefix(item)} ${_('Public host')}`; @@ -79,7 +79,7 @@ function getPublicHostItem( } function getServerItems( - item: Forkop.InboundCheckItem, + item: Tachyon.InboundCheckItem, wanIp: string, ): IDiagnosticsChecksItem[] { const prefix = serverPrefix(item); @@ -162,7 +162,7 @@ export async function runInboundsCheck() { items: [], }); - const inboundsChecks = await ForkopShellMethods.checkInbounds(); + const inboundsChecks = await TachyonShellMethods.checkInbounds(); if (!inboundsChecks.success) { updateCheckStore({ diff --git a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runNftCheck.ts b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runNftCheck.ts index 700d0144..6edc82d2 100644 --- a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runNftCheck.ts +++ b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runNftCheck.ts @@ -1,5 +1,5 @@ import { DIAGNOSTICS_CHECKS_MAP } from './contstants'; -import { RemoteFakeIPMethods, ForkopShellMethods } from '../../../methods'; +import { RemoteFakeIPMethods, TachyonShellMethods } from '../../../methods'; import { updateCheckStore } from './updateCheckStore'; import { getMeta } from '../helpers/getMeta'; @@ -18,7 +18,7 @@ export async function runNftCheck() { await RemoteFakeIPMethods.getFakeIpCheck(); await RemoteFakeIPMethods.getIpCheck(); - const nftablesChecks = await ForkopShellMethods.checkNftRules(); + const nftablesChecks = await TachyonShellMethods.checkNftRules(); if (!nftablesChecks.success) { updateCheckStore({ diff --git a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts index 4683cdaa..5bbb680a 100644 --- a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts +++ b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts @@ -1,5 +1,5 @@ import { DIAGNOSTICS_CHECKS_MAP } from './contstants'; -import { ForkopShellMethods } from '../../../methods'; +import { TachyonShellMethods } from '../../../methods'; import { updateCheckStore } from './updateCheckStore'; import { getMeta } from '../helpers/getMeta'; import { getDashboardSections } from '../../../methods/custom/getDashboardSections'; @@ -71,7 +71,7 @@ export async function runSectionsCheck() { const isSubscription = section.proxyConfigType === 'subscription'; if (selectedOutbound?.code) { - const latencyProxy = await ForkopShellMethods.getClashApiProxyLatency( + const latencyProxy = await TachyonShellMethods.getClashApiProxyLatency( selectedOutbound.code, section.latencyTestTimeout, ); @@ -91,7 +91,7 @@ export async function runSectionsCheck() { }; } - const latencyGroup = await ForkopShellMethods.getClashApiGroupLatency( + const latencyGroup = await TachyonShellMethods.getClashApiGroupLatency( section.code, ); const success = latencyGroup.success && !latencyGroup.data.message; @@ -125,7 +125,7 @@ export async function runSectionsCheck() { } const selectedOutbound = section.outbounds[0]; - const latencyProxy = await ForkopShellMethods.getClashApiProxyLatency( + const latencyProxy = await TachyonShellMethods.getClashApiProxyLatency( section.code, section.latencyTestTimeout, ); diff --git a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts index 732aa05c..bf7ba82d 100644 --- a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts +++ b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts @@ -1,5 +1,5 @@ import { DIAGNOSTICS_CHECKS_MAP } from './contstants'; -import { ForkopShellMethods } from '../../../methods'; +import { TachyonShellMethods } from '../../../methods'; import { updateCheckStore } from './updateCheckStore'; import { getMeta } from '../helpers/getMeta'; @@ -15,7 +15,7 @@ export async function runSingBoxCheck() { items: [], }); - const singBoxChecks = await ForkopShellMethods.checkSingBox(); + const singBoxChecks = await TachyonShellMethods.checkSingBox(); if (!singBoxChecks.success) { updateCheckStore({ diff --git a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts index d03f5291..669cd9ca 100644 --- a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts +++ b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts @@ -1,5 +1,5 @@ import { DIAGNOSTICS_CHECKS_MAP } from './contstants'; -import { ForkopShellMethods } from '../../../methods'; +import { TachyonShellMethods } from '../../../methods'; import { updateCheckStore } from './updateCheckStore'; import { IDiagnosticsChecksItem } from '../../../services'; import { getCheckItemsMeta } from './getCheckItemsMeta'; @@ -16,7 +16,7 @@ export async function runZapret2Check() { items: [], }); - const zapret2Status = await ForkopShellMethods.getZapret2Status(); + const zapret2Status = await TachyonShellMethods.getZapret2Status(); if (!zapret2Status.success) { updateCheckStore({ @@ -39,7 +39,7 @@ export async function runZapret2Check() { const expectedProcesses = Number(data.expected_process_count || 0); const runningProcesses = Number(data.running_process_count || 0); const supervisorProcesses = Number(data.supervisor_process_count || 0); - const forkopRuntimeReady = + const tachyonRuntimeReady = !hasZapret2Rules || (runningProcesses === expectedProcesses && supervisorProcesses === expectedProcesses); @@ -83,14 +83,14 @@ export async function runZapret2Check() { value: '', }, { - state: unexpectedRuntime || !forkopRuntimeReady ? 'error' : 'success', + state: unexpectedRuntime || !tachyonRuntimeReady ? 'error' : 'success', key: hasZapret2Rules - ? forkopRuntimeReady - ? _('Forkop-managed nfqws2 runtime is ready') - : _('Forkop-managed nfqws2 runtime is not ready') + ? tachyonRuntimeReady + ? _('Tachyon-managed nfqws2 runtime is ready') + : _('Tachyon-managed nfqws2 runtime is not ready') : unexpectedRuntime - ? _('Unexpected Forkop-managed nfqws2 runtime is running') - : _('Forkop-managed nfqws2 runtime is not running'), + ? _('Unexpected Tachyon-managed nfqws2 runtime is running') + : _('Tachyon-managed nfqws2 runtime is not running'), value: hasZapret2Rules ? `${runningProcesses}/${expectedProcesses}` : '', }, { @@ -115,7 +115,7 @@ export async function runZapret2Check() { : 'success', key: standaloneServiceRunning ? hasZapret2Rules - ? _('Standalone Zapret2 is active together with Forkop Zapret2 rules') + ? _('Standalone Zapret2 is active together with Tachyon Zapret2 rules') : _('Standalone Zapret2 service is active') : standaloneAutostartRisk ? _('Standalone Zapret2 autostart is enabled') diff --git a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts index 0528b108..3fc23b84 100644 --- a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts +++ b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts @@ -1,5 +1,5 @@ import { DIAGNOSTICS_CHECKS_MAP } from './contstants'; -import { ForkopShellMethods } from '../../../methods'; +import { TachyonShellMethods } from '../../../methods'; import { updateCheckStore } from './updateCheckStore'; import { IDiagnosticsChecksItem } from '../../../services'; import { getCheckItemsMeta } from './getCheckItemsMeta'; @@ -16,7 +16,7 @@ export async function runZapretCheck() { items: [], }); - const zapretStatus = await ForkopShellMethods.getZapretStatus(); + const zapretStatus = await TachyonShellMethods.getZapretStatus(); if (!zapretStatus.success) { updateCheckStore({ @@ -41,7 +41,7 @@ export async function runZapretCheck() { const expectedProcesses = Number(data.expected_process_count || 0); const runningProcesses = Number(data.running_process_count || 0); const supervisorProcesses = Number(data.supervisor_process_count || 0); - const forkopRuntimeReady = + const tachyonRuntimeReady = !hasZapretRules || (runningProcesses === expectedProcesses && supervisorProcesses === expectedProcesses); @@ -80,14 +80,14 @@ export async function runZapretCheck() { value: '', }, { - state: unexpectedRuntime || !forkopRuntimeReady ? 'error' : 'success', + state: unexpectedRuntime || !tachyonRuntimeReady ? 'error' : 'success', key: hasZapretRules - ? forkopRuntimeReady - ? _('Forkop-managed nfqws runtime is ready') - : _('Forkop-managed nfqws runtime is not ready') + ? tachyonRuntimeReady + ? _('Tachyon-managed nfqws runtime is ready') + : _('Tachyon-managed nfqws runtime is not ready') : unexpectedRuntime - ? _('Unexpected Forkop-managed nfqws runtime is running') - : _('Forkop-managed nfqws runtime is not running'), + ? _('Unexpected Tachyon-managed nfqws runtime is running') + : _('Tachyon-managed nfqws runtime is not running'), value: hasZapretRules ? `${runningProcesses}/${expectedProcesses}` : '', }, { @@ -108,7 +108,7 @@ export async function runZapretCheck() { state: standaloneConflict ? 'warning' : 'success', key: standaloneServiceRunning ? hasZapretRules - ? _('Standalone Zapret is active together with Forkop Zapret rules') + ? _('Standalone Zapret is active together with Tachyon Zapret rules') : _('Standalone Zapret service is active') : _('Standalone Zapret service is inactive'), value: '', diff --git a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/tests/runProviderChecks.test.ts b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/tests/runProviderChecks.test.ts index 8b72ff45..56537176 100644 --- a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/tests/runProviderChecks.test.ts +++ b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/tests/runProviderChecks.test.ts @@ -8,7 +8,7 @@ const mocks = vi.hoisted(() => ({ })); vi.mock('../../../../methods', () => ({ - ForkopShellMethods: { + TachyonShellMethods: { getZapretStatus: mocks.getZapretStatus, getZapret2Status: mocks.getZapret2Status, getByedpiStatus: mocks.getByedpiStatus, diff --git a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/tests/runSectionsCheck.test.ts b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/tests/runSectionsCheck.test.ts index 45ea74ab..746e0a96 100644 --- a/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/tests/runSectionsCheck.test.ts +++ b/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/tests/runSectionsCheck.test.ts @@ -12,7 +12,7 @@ vi.mock('../../../../methods/custom/getDashboardSections', () => ({ })); vi.mock('../../../../methods', () => ({ - ForkopShellMethods: { + TachyonShellMethods: { getClashApiProxyLatency: mocks.getClashApiProxyLatency, getClashApiGroupLatency: mocks.getClashApiGroupLatency, }, diff --git a/fe-app-tachyon/src/tachyon/tabs/diagnostic/diagnostic.store.ts b/fe-app-tachyon/src/tachyon/tabs/diagnostic/diagnostic.store.ts index 148de746..331c70b6 100644 --- a/fe-app-tachyon/src/tachyon/tabs/diagnostic/diagnostic.store.ts +++ b/fe-app-tachyon/src/tachyon/tabs/diagnostic/diagnostic.store.ts @@ -77,8 +77,8 @@ export const initialDiagnosticStore: Pick< loading: true, loaded: false, providerInfoLoaded: false, - forkop_version: 'loading', - forkop_latest_version: 'loading', + tachyon_version: 'loading', + tachyon_latest_version: 'loading', luci_app_version: 'loading', sing_box_version: 'loading', sing_box_extended: 0, @@ -124,8 +124,8 @@ export const initialDiagnosticStore: Pick< diagnosticsRunAction: { loading: false }, diagnosticsChecks: getDiagnosticsChecks(_('Not running')), updatesActions: { - forkopCheck: { loading: false }, - forkopInstall: { loading: false }, + tachyonCheck: { loading: false }, + tachyonInstall: { loading: false }, singBoxCheck: { loading: false }, singBoxInstall: { loading: false }, singBoxInstallExtended: { loading: false }, @@ -143,7 +143,7 @@ export const initialDiagnosticStore: Pick< byedpiRemove: { loading: false }, }, updatesChecks: { - forkop: { status: null, latest_version: '', release_url: '' }, + tachyon: { status: null, latest_version: '', release_url: '' }, sing_box: { status: null, latest_version: '', release_url: '' }, zapret: { status: null, latest_version: '', release_url: '' }, zapret2: { status: null, latest_version: '', release_url: '' }, diff --git a/fe-app-tachyon/src/tachyon/tabs/diagnostic/diagnosticRunPersistence.ts b/fe-app-tachyon/src/tachyon/tabs/diagnostic/diagnosticRunPersistence.ts index 8bfc2c85..f97c7d6d 100644 --- a/fe-app-tachyon/src/tachyon/tabs/diagnostic/diagnosticRunPersistence.ts +++ b/fe-app-tachyon/src/tachyon/tabs/diagnostic/diagnosticRunPersistence.ts @@ -2,7 +2,7 @@ import type { StoreType } from '../../services'; import type { DiagnosticsProviderOptions } from './diagnostic.store'; import { DIAGNOSTICS_CHECKS } from './checks/contstants'; -const DIAGNOSTIC_RUN_STORAGE_KEY = 'forkop:diagnostic-run:v1'; +const DIAGNOSTIC_RUN_STORAGE_KEY = 'tachyon:diagnostic-run:v1'; const DIAGNOSTIC_RUN_TTL_MS = 30 * 60 * 1000; const CHECK_STATES = ['loading', 'warning', 'success', 'error', 'skipped']; const CHECK_ITEM_STATES = ['error', 'warning', 'success']; diff --git a/fe-app-tachyon/src/tachyon/tabs/diagnostic/helpers/maskDiagnostics.ts b/fe-app-tachyon/src/tachyon/tabs/diagnostic/helpers/maskDiagnostics.ts index 02e3ff55..d22c014d 100644 --- a/fe-app-tachyon/src/tachyon/tabs/diagnostic/helpers/maskDiagnostics.ts +++ b/fe-app-tachyon/src/tachyon/tabs/diagnostic/helpers/maskDiagnostics.ts @@ -28,7 +28,7 @@ const SING_BOX_MASKED_KEYS = new Set([ 'source_ip_cidr', ]); -const FORKOP_MASK_AFTER_TOKEN = [ +const TACHYON_MASK_AFTER_TOKEN = [ 'option proxy_string', 'option subscription_url', 'list subscription_urls', @@ -47,7 +47,7 @@ const FORKOP_MASK_AFTER_TOKEN = [ 'option yacd_secret_key', ]; -const FORKOP_MASK_AFTER_TOKEN_SPACE = [ +const TACHYON_MASK_AFTER_TOKEN_SPACE = [ 'option outbound_json', 'list domain', 'list domain_suffix', @@ -149,11 +149,11 @@ function maskOptionPath(line: string, token: string) { function maskGlobalCheckLine(line: string) { let maskedLine = line; - for (const token of FORKOP_MASK_AFTER_TOKEN) { + for (const token of TACHYON_MASK_AFTER_TOKEN) { maskedLine = maskAfterToken(maskedLine, token); } - for (const token of FORKOP_MASK_AFTER_TOKEN_SPACE) { + for (const token of TACHYON_MASK_AFTER_TOKEN_SPACE) { maskedLine = maskAfterTokenSpace(maskedLine, token); } diff --git a/fe-app-tachyon/src/tachyon/tabs/diagnostic/initController.ts b/fe-app-tachyon/src/tachyon/tabs/diagnostic/initController.ts index d0cf5178..932916b5 100644 --- a/fe-app-tachyon/src/tachyon/tabs/diagnostic/initController.ts +++ b/fe-app-tachyon/src/tachyon/tabs/diagnostic/initController.ts @@ -32,14 +32,14 @@ import { renderRunAction, renderSystemInfo, } from './partials'; -import { ForkopShellMethods } from '../../methods'; +import { TachyonShellMethods } from '../../methods'; import { fetchServicesInfo } from '../../fetchers/fetchServicesInfo'; import { normalizeCompiledVersion } from '../../../helpers/normalizeCompiledVersion'; import { renderModal } from '../../../partials'; -import { FORKOP_LUCI_APP_VERSION } from '../../../constants'; +import { TACHYON_LUCI_APP_VERSION } from '../../../constants'; import { renderWikiDisclaimer } from './partials/renderWikiDisclaimer'; import { runSectionsCheck } from './checks/runSectionsCheck'; -import { Forkop } from '../../types'; +import { Tachyon } from '../../types'; import { getAvailableActionsDisabledState, getServiceTransition, @@ -156,11 +156,11 @@ function isLocalMutatingServiceActionLoading() { function isMutatingServiceActionLoading() { return ( isLocalMutatingServiceActionLoading() || - isServiceTransitionStatus(store.get().servicesInfoWidget.data.forkopStatus) + isServiceTransitionStatus(store.get().servicesInfoWidget.data.tachyonStatus) ); } -function getForkopStatusText(running: boolean, enabled: boolean) { +function getTachyonStatusText(running: boolean, enabled: boolean) { if (running) { return enabled ? 'running & enabled' : 'running but disabled'; } @@ -168,9 +168,9 @@ function getForkopStatusText(running: boolean, enabled: boolean) { return enabled ? 'stopped but enabled' : 'stopped & disabled'; } -function setDisplayedForkopRunning(running: boolean) { +function setDisplayedTachyonRunning(running: boolean) { const servicesInfoWidget = store.get().servicesInfoWidget; - const enabled = Boolean(servicesInfoWidget.data.forkopEnabled); + const enabled = Boolean(servicesInfoWidget.data.tachyonEnabled); store.set({ servicesInfoWidget: { @@ -178,8 +178,8 @@ function setDisplayedForkopRunning(running: boolean) { loading: false, data: { ...servicesInfoWidget.data, - forkopRunning: running ? 1 : 0, - forkopStatus: getForkopStatusText(running, enabled), + tachyonRunning: running ? 1 : 0, + tachyonStatus: getTachyonStatusText(running, enabled), }, }, }); @@ -232,17 +232,17 @@ async function refreshDiagnosticServicesInfo({ return promise; } -async function waitForForkopRunningState(expectedRunning: boolean) { +async function waitForTachyonRunningState(expectedRunning: boolean) { const startedAt = Date.now(); while (Date.now() - startedAt < SERVICE_ACTION_STATUS_TIMEOUT_MS) { await refreshDiagnosticServicesInfo({ force: true, allowInactive: true }); - const forkopRunning = Boolean( - store.get().servicesInfoWidget.data.forkopRunning, + const tachyonRunning = Boolean( + store.get().servicesInfoWidget.data.tachyonRunning, ); - if (forkopRunning === expectedRunning) { + if (tachyonRunning === expectedRunning) { return true; } @@ -274,13 +274,13 @@ function stopServiceActionStateWatcher() { } function isVisibleServiceRuntimeAction( - action: Forkop.ServiceActionState['action'], + action: Tachyon.ServiceActionState['action'], ): action is ServiceRuntimeAction { return action === 'restart' || action === 'start' || action === 'stop'; } function setServiceActionStateLoading( - state: Forkop.ServiceActionState, + state: Tachyon.ServiceActionState, loading: boolean, ) { if (!isVisibleServiceRuntimeAction(state.action)) { @@ -290,7 +290,7 @@ function setServiceActionStateLoading( setDiagnosticActionLoading(state.action, loading); } -async function followServiceActionState(state: Forkop.ServiceActionState) { +async function followServiceActionState(state: Tachyon.ServiceActionState) { const jobId = state.job_id; if (!jobId || followedServiceActionJobs.has(jobId)) { @@ -308,7 +308,7 @@ async function followServiceActionState(state: Forkop.ServiceActionState) { try { if (state.running) { - await ForkopShellMethods.waitServiceActionJob(jobId); + await TachyonShellMethods.waitServiceActionJob(jobId); } } catch (error) { logger.error('[DIAGNOSTIC]', 'followServiceActionState failed', error); @@ -316,13 +316,13 @@ async function followServiceActionState(state: Forkop.ServiceActionState) { handledServiceActionJobs.add(jobId); setServiceActionStateLoading(state, false); await refreshDiagnosticServicesInfo({ force: true, allowInactive: true }); - void ForkopShellMethods.uiActionAck('service', jobId); + void TachyonShellMethods.uiActionAck('service', jobId); followedServiceActionJobs.delete(jobId); resetDiagnosticsChecks(); } } -function followServiceActionsFromUiState(uiState?: Forkop.UiState) { +function followServiceActionsFromUiState(uiState?: Tachyon.UiState) { if (!uiState) { return; } @@ -411,10 +411,10 @@ async function fetchDiagnosticsProviderInfo({ const [zapretRuntime, zapret2Runtime, byedpiRuntime, inboundsConfig] = await Promise.all([ - ForkopShellMethods.checkZapretRuntime(), - ForkopShellMethods.checkZapret2Runtime(), - ForkopShellMethods.checkByedpiRuntime(), - ForkopShellMethods.checkInboundsConfig(), + TachyonShellMethods.checkZapretRuntime(), + TachyonShellMethods.checkZapret2Runtime(), + TachyonShellMethods.checkByedpiRuntime(), + TachyonShellMethods.checkInboundsConfig(), ]); if (requestId !== latestProviderInfoRequestId) { @@ -532,7 +532,7 @@ function renderDiagnosticRunActionWidget() { const providerInfoLoaded = store.get().diagnosticsSystemInfo.providerInfoLoaded; const servicesInfoWidget = store.get().servicesInfoWidget; - const forkopRunning = Boolean(servicesInfoWidget.data.forkopRunning); + const tachyonRunning = Boolean(servicesInfoWidget.data.tachyonRunning); const container = document.getElementById('fkp_diagnostic-page-run-check'); const renderedAction = renderRunAction({ @@ -540,7 +540,7 @@ function renderDiagnosticRunActionWidget() { disabled: shouldDisableDiagnosticRunAction({ providerInfoLoaded, servicesInfoLoading: servicesInfoWidget.loading, - forkopRunning, + tachyonRunning, mutatingServiceActionLoading: isMutatingServiceActionLoading(), }), click: () => runChecks(), @@ -566,11 +566,11 @@ async function handleServiceRuntimeAction({ let delegatedToWatcher = false; if (optimisticRunning !== undefined) { - setDisplayedForkopRunning(optimisticRunning); + setDisplayedTachyonRunning(optimisticRunning); } try { - const startResponse = await ForkopShellMethods.serviceActionStart(action); + const startResponse = await TachyonShellMethods.serviceActionStart(action); if (!startResponse.success) { throw new Error(startResponse.error); @@ -584,7 +584,7 @@ async function handleServiceRuntimeAction({ followedServiceActionJobs.add(jobId); ownsJobFollow = true; - const result = await ForkopShellMethods.waitServiceActionJob(jobId); + const result = await TachyonShellMethods.waitServiceActionJob(jobId); if (!result.success) { throw new Error(result.error); @@ -594,7 +594,7 @@ async function handleServiceRuntimeAction({ throw new Error(result.data.message || _('Service action failed')); } - await waitForForkopRunningState(expectedRunning); + await waitForTachyonRunningState(expectedRunning); } catch (e) { logger.error('[DIAGNOSTIC]', `handleServiceRuntimeAction(${action})`, e); } finally { @@ -607,7 +607,7 @@ async function handleServiceRuntimeAction({ await refreshDiagnosticServicesInfo({ force: true, allowInactive: true }); if (jobId) { handledServiceActionJobs.add(jobId); - void ForkopShellMethods.uiActionAck('service', jobId); + void TachyonShellMethods.uiActionAck('service', jobId); } resetDiagnosticsChecks(); } @@ -640,7 +640,7 @@ async function handleEnable() { setDiagnosticActionLoading('enable', true); try { - await ForkopShellMethods.enable(); + await TachyonShellMethods.enable(); } catch (e) { logger.error('[DIAGNOSTIC]', 'handleEnable - e', e); } finally { @@ -656,7 +656,7 @@ async function handleDisable() { setDiagnosticActionLoading('disable', true); try { - await ForkopShellMethods.disable(); + await TachyonShellMethods.disable(); } catch (e) { logger.error('[DIAGNOSTIC]', 'handleDisable - e', e); } finally { @@ -672,7 +672,7 @@ async function handleShowGlobalCheck() { setDiagnosticActionLoading('globalCheck', true); try { - const globalCheck = await ForkopShellMethods.globalCheck(false); + const globalCheck = await TachyonShellMethods.globalCheck(false); if (globalCheck.success) { const rawGlobalCheckText = (globalCheck.data as string) ?? ''; @@ -700,11 +700,11 @@ async function handleViewLogs() { setDiagnosticActionLoading('viewLogs', true); try { - const viewLogs = await ForkopShellMethods.checkLogs(); + const viewLogs = await TachyonShellMethods.checkLogs(); if (viewLogs.success) { const getLatestLogs = async () => { - const latestLogs = await ForkopShellMethods.checkLogs(); + const latestLogs = await TachyonShellMethods.checkLogs(); if (!latestLogs.success) { throw latestLogs; @@ -737,7 +737,7 @@ async function handleShowSingBoxConfig() { setDiagnosticActionLoading('showSingBoxConfig', true); try { - const showSingBoxConfig = await ForkopShellMethods.showSingBoxConfig(false); + const showSingBoxConfig = await TachyonShellMethods.showSingBoxConfig(false); if (showSingBoxConfig.success) { const rawSingBoxConfigText = stringifySingBoxConfig( @@ -799,10 +799,10 @@ function renderDiagnosticAvailableActionsWidget() { const servicesInfoWidget = store.get().servicesInfoWidget; logger.debug('[DIAGNOSTIC]', 'renderDiagnosticAvailableActionsWidget'); - const forkopEnabled = Boolean(servicesInfoWidget.data.forkopEnabled); - const forkopRunning = Boolean(servicesInfoWidget.data.forkopRunning); + const tachyonEnabled = Boolean(servicesInfoWidget.data.tachyonEnabled); + const tachyonRunning = Boolean(servicesInfoWidget.data.tachyonRunning); const serviceTransition = getServiceTransition( - servicesInfoWidget.data.forkopStatus, + servicesInfoWidget.data.tachyonStatus, ); const restartLoading = diagnosticsActions.restart.loading || serviceTransition.restarting; @@ -824,13 +824,13 @@ function renderDiagnosticAvailableActionsWidget() { componentActionLoading, }); const startVisible = shouldShowStartAction({ - forkopRunning, + tachyonRunning, restartLoading, startLoading, stopLoading, }); const stopVisible = shouldShowStopAction({ - forkopRunning, + tachyonRunning, restartLoading, startLoading, stopLoading, @@ -842,7 +842,7 @@ function renderDiagnosticAvailableActionsWidget() { restart: { loading: restartLoading, visible: shouldShowRestartAction({ - forkopRunning, + tachyonRunning, restartLoading, startLoading, stopLoading, @@ -864,13 +864,13 @@ function renderDiagnosticAvailableActionsWidget() { }, enable: { loading: diagnosticsActions.enable.loading, - visible: !forkopEnabled, + visible: !tachyonEnabled, onClick: handleEnable, disabled: serviceControlsDisabled, }, disable: { loading: diagnosticsActions.disable.loading, - visible: forkopEnabled, + visible: tachyonEnabled, onClick: handleDisable, disabled: serviceControlsDisabled, }, @@ -907,12 +907,12 @@ function renderDiagnosticSystemInfoWidget() { const items = [ { - key: 'Forkop', - value: normalizeCompiledVersion(diagnosticsSystemInfo.forkop_version), + key: 'Tachyon', + value: normalizeCompiledVersion(diagnosticsSystemInfo.tachyon_version), }, { key: 'Luci App', - value: normalizeCompiledVersion(FORKOP_LUCI_APP_VERSION), + value: normalizeCompiledVersion(TACHYON_LUCI_APP_VERSION), }, { key: 'Sing-box', diff --git a/fe-app-tachyon/src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts b/fe-app-tachyon/src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts index 276eb152..7c8d8cdf 100644 --- a/fe-app-tachyon/src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts +++ b/fe-app-tachyon/src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts @@ -46,7 +46,7 @@ export function renderAvailableActions({ classNames: ['cbi-button-apply'], onClick: restart.onClick, icon: renderRotateCcwIcon24, - text: _('Restart Forkop'), + text: _('Restart Tachyon'), loading: restart.loading, disabled: restart.disabled, }), @@ -56,7 +56,7 @@ export function renderAvailableActions({ classNames: ['cbi-button-remove'], onClick: stop.onClick, icon: renderCircleStopIcon24, - text: _('Stop Forkop'), + text: _('Stop Tachyon'), loading: stop.loading, disabled: stop.disabled, }), @@ -66,7 +66,7 @@ export function renderAvailableActions({ classNames: ['cbi-button-save'], onClick: start.onClick, icon: renderCirclePlayIcon24, - text: _('Start Forkop'), + text: _('Start Tachyon'), loading: start.loading, disabled: start.disabled, }), diff --git a/fe-app-tachyon/src/tachyon/tabs/diagnostic/serviceTransition.ts b/fe-app-tachyon/src/tachyon/tabs/diagnostic/serviceTransition.ts index c4b2b4ad..ebeb54a5 100644 --- a/fe-app-tachyon/src/tachyon/tabs/diagnostic/serviceTransition.ts +++ b/fe-app-tachyon/src/tachyon/tabs/diagnostic/serviceTransition.ts @@ -59,18 +59,18 @@ export function shouldResetDiagnosticsChecks({ export function shouldDisableDiagnosticRunAction({ providerInfoLoaded, servicesInfoLoading, - forkopRunning, + tachyonRunning, mutatingServiceActionLoading, }: { providerInfoLoaded: boolean; servicesInfoLoading: boolean; - forkopRunning: boolean; + tachyonRunning: boolean; mutatingServiceActionLoading: boolean; }) { return ( !providerInfoLoaded || servicesInfoLoading || - !forkopRunning || + !tachyonRunning || mutatingServiceActionLoading ); } @@ -100,43 +100,43 @@ export function getAvailableActionsDisabledState({ } export function shouldShowRestartAction({ - forkopRunning, + tachyonRunning, restartLoading, startLoading, stopLoading, }: { - forkopRunning: boolean; + tachyonRunning: boolean; restartLoading: boolean; startLoading: boolean; stopLoading: boolean; }) { - return restartLoading || (forkopRunning && !startLoading && !stopLoading); + return restartLoading || (tachyonRunning && !startLoading && !stopLoading); } export function shouldShowStartAction({ - forkopRunning, + tachyonRunning, restartLoading, startLoading, stopLoading, }: { - forkopRunning: boolean; + tachyonRunning: boolean; restartLoading: boolean; startLoading: boolean; stopLoading: boolean; }) { - return startLoading || (!restartLoading && !forkopRunning && !stopLoading); + return startLoading || (!restartLoading && !tachyonRunning && !stopLoading); } export function shouldShowStopAction({ - forkopRunning, + tachyonRunning, restartLoading, startLoading, stopLoading, }: { - forkopRunning: boolean; + tachyonRunning: boolean; restartLoading: boolean; startLoading: boolean; stopLoading: boolean; }) { - return stopLoading || restartLoading || (forkopRunning && !startLoading); + return stopLoading || restartLoading || (tachyonRunning && !startLoading); } diff --git a/fe-app-tachyon/src/tachyon/tabs/diagnostic/styles.ts b/fe-app-tachyon/src/tachyon/tabs/diagnostic/styles.ts index 8c56da20..906372bd 100644 --- a/fe-app-tachyon/src/tachyon/tabs/diagnostic/styles.ts +++ b/fe-app-tachyon/src/tachyon/tabs/diagnostic/styles.ts @@ -1,13 +1,13 @@ // language=CSS -import { FORKOP_UCI_PACKAGE as FORKOP_CBI_PREFIX } from '../../../constants'; +import { TACHYON_UCI_PACKAGE as TACHYON_CBI_PREFIX } from '../../../constants'; export const styles = ` -#cbi-${FORKOP_CBI_PREFIX}-diagnostic-_mount_node > div { +#cbi-${TACHYON_CBI_PREFIX}-diagnostic-_mount_node > div { width: 100%; } -#cbi-${FORKOP_CBI_PREFIX}-diagnostic > h3 { +#cbi-${TACHYON_CBI_PREFIX}-diagnostic > h3 { display: none; } diff --git a/fe-app-tachyon/src/tachyon/tabs/diagnostic/tests/diagnosticRunPersistence.test.ts b/fe-app-tachyon/src/tachyon/tabs/diagnostic/tests/diagnosticRunPersistence.test.ts index bed4377d..2416b9ac 100644 --- a/fe-app-tachyon/src/tachyon/tabs/diagnostic/tests/diagnosticRunPersistence.test.ts +++ b/fe-app-tachyon/src/tachyon/tabs/diagnostic/tests/diagnosticRunPersistence.test.ts @@ -91,7 +91,7 @@ describe('diagnostic run persistence', () => { it('removes invalid snapshots', () => { const storage = new MemoryStorage(); - storage.setItem('forkop:diagnostic-run:v1', '{broken'); + storage.setItem('tachyon:diagnostic-run:v1', '{broken'); expect(readPersistedDiagnosticRun(storage)).toBeNull(); expect(storage.length).toBe(0); @@ -118,7 +118,7 @@ describe('diagnostic run persistence', () => { const storage = new MemoryStorage(); storage.setItem( - 'forkop:diagnostic-run:v1', + 'tachyon:diagnostic-run:v1', JSON.stringify({ nextRunnerIndex: 0, providerOptions: {}, @@ -144,7 +144,7 @@ describe('diagnostic run persistence', () => { const storage = new MemoryStorage(); storage.setItem( - 'forkop:diagnostic-run:v1', + 'tachyon:diagnostic-run:v1', JSON.stringify({ nextRunnerIndex: 0, providerOptions: {}, diff --git a/fe-app-tachyon/src/tachyon/tabs/diagnostic/tests/serviceTransition.test.ts b/fe-app-tachyon/src/tachyon/tabs/diagnostic/tests/serviceTransition.test.ts index 360729b5..704bb82a 100644 --- a/fe-app-tachyon/src/tachyon/tabs/diagnostic/tests/serviceTransition.test.ts +++ b/fe-app-tachyon/src/tachyon/tabs/diagnostic/tests/serviceTransition.test.ts @@ -94,7 +94,7 @@ describe('diagnostic service transitions', () => { it('shows restart while the service is running even when autostart is disabled', () => { expect( shouldShowRestartAction({ - forkopRunning: true, + tachyonRunning: true, restartLoading: false, startLoading: false, stopLoading: false, @@ -102,7 +102,7 @@ describe('diagnostic service transitions', () => { ).toBe(true); expect( shouldShowRestartAction({ - forkopRunning: false, + tachyonRunning: false, restartLoading: false, startLoading: false, stopLoading: false, @@ -110,7 +110,7 @@ describe('diagnostic service transitions', () => { ).toBe(false); expect( shouldShowRestartAction({ - forkopRunning: false, + tachyonRunning: false, restartLoading: true, startLoading: false, stopLoading: false, @@ -121,7 +121,7 @@ describe('diagnostic service transitions', () => { it('does not show restart from transient running state while start or stop is active', () => { expect( shouldShowRestartAction({ - forkopRunning: true, + tachyonRunning: true, restartLoading: false, startLoading: true, stopLoading: false, @@ -129,7 +129,7 @@ describe('diagnostic service transitions', () => { ).toBe(false); expect( shouldShowRestartAction({ - forkopRunning: true, + tachyonRunning: true, restartLoading: false, startLoading: false, stopLoading: true, @@ -142,7 +142,7 @@ describe('diagnostic service transitions', () => { shouldDisableDiagnosticRunAction({ providerInfoLoaded: true, servicesInfoLoading: false, - forkopRunning: true, + tachyonRunning: true, mutatingServiceActionLoading: false, }), ).toBe(false); @@ -150,7 +150,7 @@ describe('diagnostic service transitions', () => { shouldDisableDiagnosticRunAction({ providerInfoLoaded: true, servicesInfoLoading: false, - forkopRunning: false, + tachyonRunning: false, mutatingServiceActionLoading: false, }), ).toBe(true); @@ -159,7 +159,7 @@ describe('diagnostic service transitions', () => { it('detects running component actions', () => { expect( hasComponentActionLoading({ - forkopCheck: { loading: false }, + tachyonCheck: { loading: false }, zapretInstall: { loading: true }, }), ).toBe(true); @@ -196,7 +196,7 @@ describe('diagnostic service transitions', () => { it('keeps the lower service action visible while restart is running', () => { expect( shouldShowStopAction({ - forkopRunning: false, + tachyonRunning: false, restartLoading: true, startLoading: false, stopLoading: false, @@ -204,7 +204,7 @@ describe('diagnostic service transitions', () => { ).toBe(true); expect( shouldShowStartAction({ - forkopRunning: false, + tachyonRunning: false, restartLoading: true, startLoading: false, stopLoading: false, @@ -215,7 +215,7 @@ describe('diagnostic service transitions', () => { it('keeps the normal start and stop visibility outside restart', () => { expect( shouldShowStartAction({ - forkopRunning: false, + tachyonRunning: false, restartLoading: false, startLoading: false, stopLoading: false, @@ -223,7 +223,7 @@ describe('diagnostic service transitions', () => { ).toBe(true); expect( shouldShowStopAction({ - forkopRunning: false, + tachyonRunning: false, restartLoading: false, startLoading: false, stopLoading: false, @@ -231,7 +231,7 @@ describe('diagnostic service transitions', () => { ).toBe(false); expect( shouldShowStopAction({ - forkopRunning: true, + tachyonRunning: true, restartLoading: false, startLoading: false, stopLoading: false, diff --git a/fe-app-tachyon/src/tachyon/tabs/monitoring/initController.ts b/fe-app-tachyon/src/tachyon/tabs/monitoring/initController.ts index 8e233a5a..cfdacb0b 100644 --- a/fe-app-tachyon/src/tachyon/tabs/monitoring/initController.ts +++ b/fe-app-tachyon/src/tachyon/tabs/monitoring/initController.ts @@ -7,11 +7,11 @@ import { renderSearchIcon24, renderXIcon24, } from '../../../icons'; -import { CustomForkopMethods, ForkopShellMethods } from '../../methods'; +import { CustomTachyonMethods, TachyonShellMethods } from '../../methods'; import { getOutboundTagBySection } from '../../runtimeTags'; import { getClashApiSecret } from '../../methods/custom/getClashApiSecret'; import { logger, socket, store, StoreType } from '../../services'; -import { Forkop } from '../../types'; +import { Tachyon } from '../../types'; import { getCachedRuntimeUiState, refreshRuntimeUiState, @@ -127,7 +127,7 @@ function getListValues(value?: string[] | string) { .filter(Boolean); } -function getUrlTestIds(section: Forkop.ConfigSection) { +function getUrlTestIds(section: Tachyon.ConfigSection) { const values = getListValues(section.urltests); return values.length ? values @@ -167,11 +167,11 @@ function formatEndpoint(address?: string, port?: string | number): string { return `${normalizedAddress}:${normalizedPort}`; } -function getDisplayName(section: Forkop.ConfigSection) { +function getDisplayName(section: Tachyon.ConfigSection) { return normalizeString(section.label) || section['.name']; } -function buildRouteDisplayNames(sections: Forkop.ConfigSection[]) { +function buildRouteDisplayNames(sections: Tachyon.ConfigSection[]) { const map: Record = { 'bypass-out': 'Bypass', 'direct-out': 'direct', @@ -923,7 +923,7 @@ function renderConnections(options: { force?: boolean } = {}) { container.replaceChildren( renderConnectionsTable([], { text: _( - 'Forkop service is stopped. Start the service to display connections.', + 'Tachyon service is stopped. Start the service to display connections.', ), }), ); @@ -1207,7 +1207,7 @@ async function closeConnection(connectionId: string) { try { const response = - await ForkopShellMethods.closeClashApiConnection(connectionId); + await TachyonShellMethods.closeClashApiConnection(connectionId); if (!response.success) { showToast(_('Failed to close connection'), 'error'); @@ -1241,7 +1241,7 @@ async function closeAllConnections() { renderControls(); try { - const response = await ForkopShellMethods.closeAllClashApiConnections(); + const response = await TachyonShellMethods.closeAllClashApiConnections(); if (!response.success) { showToast(_('Failed to close connections'), 'error'); @@ -1343,7 +1343,7 @@ async function loadLocalDevices() { async function loadRouteDisplayNames() { try { - buildRouteDisplayNames(await CustomForkopMethods.getConfigSections()); + buildRouteDisplayNames(await CustomTachyonMethods.getConfigSections()); } catch (error) { logger.warn('[MONITORING]', 'loadRouteDisplayNames: failed', error); buildRouteDisplayNames([]); @@ -1367,7 +1367,7 @@ async function pollConnectionsSnapshot() { pollingConnections = true; try { - const response = await ForkopShellMethods.getClashApiConnections(); + const response = await TachyonShellMethods.getClashApiConnections(); if ( !monitoringMounted || @@ -1532,7 +1532,7 @@ function watchServiceState() { getServiceAvailability({ loading: false, failed: false, - running: uiState.service.forkop.running, + running: uiState.service.tachyon.running, }), ); }); diff --git a/fe-app-tachyon/src/tachyon/tabs/monitoring/styles.ts b/fe-app-tachyon/src/tachyon/tabs/monitoring/styles.ts index cb3e9b2b..015f92c0 100644 --- a/fe-app-tachyon/src/tachyon/tabs/monitoring/styles.ts +++ b/fe-app-tachyon/src/tachyon/tabs/monitoring/styles.ts @@ -1,26 +1,26 @@ // language=CSS -import { FORKOP_UCI_PACKAGE as FORKOP_CBI_PREFIX } from '../../../constants'; +import { TACHYON_UCI_PACKAGE as TACHYON_CBI_PREFIX } from '../../../constants'; export const styles = ` -#cbi-${FORKOP_CBI_PREFIX}-monitoring-_mount_node { +#cbi-${TACHYON_CBI_PREFIX}-monitoring-_mount_node { margin: 16px 0 22px; padding: 0; } -#cbi-${FORKOP_CBI_PREFIX}-monitoring-_mount_node > .cbi-value-title { +#cbi-${TACHYON_CBI_PREFIX}-monitoring-_mount_node > .cbi-value-title { display: none; } -#cbi-${FORKOP_CBI_PREFIX}-monitoring-_mount_node > .cbi-value-field { +#cbi-${TACHYON_CBI_PREFIX}-monitoring-_mount_node > .cbi-value-field { margin-left: 0; width: 100%; } -#cbi-${FORKOP_CBI_PREFIX}-monitoring-_mount_node > div { +#cbi-${TACHYON_CBI_PREFIX}-monitoring-_mount_node > div { width: 100%; } -#cbi-${FORKOP_CBI_PREFIX}-monitoring > h3 { +#cbi-${TACHYON_CBI_PREFIX}-monitoring > h3 { display: none; } diff --git a/fe-app-tachyon/src/tachyon/tabs/updates/checkResultLifecycle.ts b/fe-app-tachyon/src/tachyon/tabs/updates/checkResultLifecycle.ts index f464fc35..afc01679 100644 --- a/fe-app-tachyon/src/tachyon/tabs/updates/checkResultLifecycle.ts +++ b/fe-app-tachyon/src/tachyon/tabs/updates/checkResultLifecycle.ts @@ -1,10 +1,10 @@ -import type { Forkop } from '../../types'; +import type { Tachyon } from '../../types'; export function shouldPreserveCompletedCheckResultOnNextMount({ action, mounted, }: { - action: Forkop.ComponentAction; + action: Tachyon.ComponentAction; mounted: boolean; }) { return action === 'check_update' && !mounted; @@ -27,7 +27,7 @@ export function shouldResetCheckResultsOnMount({ } export function shouldRefreshComponentStateBeforeRender( - uiState?: Pick, + uiState?: Pick, ) { return Boolean( uiState?.actions.component.some((state) => state.running === true), diff --git a/fe-app-tachyon/src/tachyon/tabs/updates/componentActionCompletion.ts b/fe-app-tachyon/src/tachyon/tabs/updates/componentActionCompletion.ts index 2912a7c7..c01412cb 100644 --- a/fe-app-tachyon/src/tachyon/tabs/updates/componentActionCompletion.ts +++ b/fe-app-tachyon/src/tachyon/tabs/updates/componentActionCompletion.ts @@ -1,7 +1,7 @@ -import type { Forkop } from '../../types'; +import type { Tachyon } from '../../types'; export function shouldApplyCompletedComponentActionResult( - result: Pick, + result: Pick, notify: boolean, ) { return result.action !== 'check_update' || notify; diff --git a/fe-app-tachyon/src/tachyon/tabs/updates/initController.ts b/fe-app-tachyon/src/tachyon/tabs/updates/initController.ts index d3c24ce7..d78af5bd 100644 --- a/fe-app-tachyon/src/tachyon/tabs/updates/initController.ts +++ b/fe-app-tachyon/src/tachyon/tabs/updates/initController.ts @@ -1,5 +1,5 @@ import { onMount, preserveScrollForPage } from '../../../helpers'; -import { FORKOP_ACTION_PROVIDERS_AVAILABILITY_EVENT } from '../../../constants'; +import { TACHYON_ACTION_PROVIDERS_AVAILABILITY_EVENT } from '../../../constants'; import { normalizeCompiledVersion } from '../../../helpers/normalizeCompiledVersion'; import { showToast } from '../../../helpers/showToast'; import { @@ -29,7 +29,7 @@ import { shouldRefreshComponentStateBeforeRender, shouldResetCheckResultsOnMount, } from './checkResultLifecycle'; -import { ForkopShellMethods } from '../../methods'; +import { TachyonShellMethods } from '../../methods'; import { logger, markUiActionOwned, @@ -44,20 +44,20 @@ import { refreshRuntimeUiState, subscribeRuntimeUiState, } from '../../services/runtimeUiState.service'; -import { Forkop } from '../../types'; +import { Tachyon } from '../../types'; -type UpdateStatus = StoreType['updatesChecks'][Forkop.ComponentName]['status']; +type UpdateStatus = StoreType['updatesChecks'][Tachyon.ComponentName]['status']; interface ComponentActionButton { key: UpdatesActionKey; text: string; icon: () => SVGSVGElement; - component: Forkop.ComponentName; - action: Forkop.ComponentAction; + component: Tachyon.ComponentName; + action: Tachyon.ComponentAction; } interface ComponentCard { - component: Forkop.ComponentName; + component: Tachyon.ComponentName; column: 0 | 1; title: string; version: string; @@ -73,9 +73,9 @@ let updatesMountId = 0; let pageUnloading = false; let preserveCheckResultsOnNextMount = false; let componentUpdateCheckCacheResolved = false; -let componentUpdateCheckCacheSnapshot: Forkop.ComponentUpdateCheckCache | null = +let componentUpdateCheckCacheSnapshot: Tachyon.ComponentUpdateCheckCache | null = null; -let componentUpdateCheckCachePromise: Promise | null = +let componentUpdateCheckCachePromise: Promise | null = null; let componentActionStateUnsubscribe: (() => void) | null = null; let componentActionStateRefreshPromise: Promise | null = null; @@ -95,13 +95,13 @@ function isNotInstalled(version: string | undefined) { return !version || version === 'not installed'; } -function shouldShowInstallAfterCheck(component: Forkop.ComponentName) { +function shouldShowInstallAfterCheck(component: Tachyon.ComponentName) { const status = getVisibleCheckResult(component)?.status; return status === 'outdated' || status === 'dev'; } -function getVisibleCheckResult(component: Forkop.ComponentName) { +function getVisibleCheckResult(component: Tachyon.ComponentName) { if ( !shouldExposeCheckResults({ mounted: updatesMounted, @@ -114,7 +114,7 @@ function getVisibleCheckResult(component: Forkop.ComponentName) { return store.get().updatesChecks[component]; } -function getLatestVersion(component: Forkop.ComponentName) { +function getLatestVersion(component: Tachyon.ComponentName) { const checkResult = getVisibleCheckResult(component); if (!checkResult || !shouldShowInstallAfterCheck(component)) { @@ -124,7 +124,7 @@ function getLatestVersion(component: Forkop.ComponentName) { return checkResult.latest_version || undefined; } -function getGitHubReleaseUrl(component: Forkop.ComponentName) { +function getGitHubReleaseUrl(component: Tachyon.ComponentName) { const checkResult = getVisibleCheckResult(component); if ( @@ -147,7 +147,7 @@ function isServiceRuntimeActionLoading() { return ( hasLocalMutatingServiceActionLoading(state.diagnosticsActions) || - isServiceTransitionStatus(state.servicesInfoWidget.data.forkopStatus) + isServiceTransitionStatus(state.servicesInfoWidget.data.tachyonStatus) ); } @@ -186,7 +186,7 @@ function beginComponentAction(button: ComponentActionButton) { } function setCheckResult( - component: Forkop.ComponentName, + component: Tachyon.ComponentName, status: UpdateStatus, latestVersion: string, releaseUrl: string = '', @@ -205,11 +205,11 @@ function setCheckResult( }); } -function resetCheckResult(component: Forkop.ComponentName) { +function resetCheckResult(component: Tachyon.ComponentName) { setCheckResult(component, null, ''); } -function applyCachedCheckResults(results: Forkop.ComponentActionResult[]) { +function applyCachedCheckResults(results: Tachyon.ComponentActionResult[]) { results.forEach((result) => { const status = result.status || null; @@ -233,14 +233,14 @@ function loadComponentUpdateCheckCache({ force = false } = {}) { return componentUpdateCheckCachePromise; } - const promise = ForkopShellMethods.componentUpdateCheckCache() + const promise = TachyonShellMethods.componentUpdateCheckCache() .then((response) => response.success ? response.data : ({ enabled: false, results: [], - } satisfies Forkop.ComponentUpdateCheckCache), + } satisfies Tachyon.ComponentUpdateCheckCache), ) .then((cache) => { componentUpdateCheckCacheSnapshot = cache; @@ -262,7 +262,7 @@ function getErrorMessage(error: unknown, fallback: string) { async function ackComponentActionJob(jobId: string) { try { - const response = await ForkopShellMethods.uiActionAck('component', jobId); + const response = await TachyonShellMethods.uiActionAck('component', jobId); if (!response.success) { logger.debug('[UPDATES]', 'component action ack failed', response.error); @@ -273,7 +273,7 @@ async function ackComponentActionJob(jobId: string) { } function getExpectedLatestVersionForAction(button: ComponentActionButton) { - if (button.component !== 'forkop' || button.action !== 'install') { + if (button.component !== 'tachyon' || button.action !== 'install') { return undefined; } @@ -306,7 +306,7 @@ function notifyActionProvidersAvailabilityChanged( } window.dispatchEvent( - new CustomEvent(FORKOP_ACTION_PROVIDERS_AVAILABILITY_EVENT, { + new CustomEvent(TACHYON_ACTION_PROVIDERS_AVAILABILITY_EVENT, { detail: { zapretInstalled: Boolean(systemInfo.zapret_installed), zapret2Installed: Boolean(systemInfo.zapret2_installed), @@ -316,20 +316,20 @@ function notifyActionProvidersAvailabilityChanged( ); } -function reloadPageAfterForkopUpdate() { +function reloadPageAfterTachyonUpdate() { window.setTimeout(() => { window.location.reload(); }, 1200); } -function patchSystemInfoAfterMutation(result: Forkop.ComponentActionResult) { +function patchSystemInfoAfterMutation(result: Tachyon.ComponentActionResult) { const systemInfo = store.get().diagnosticsSystemInfo; const nextSystemInfo = { ...systemInfo, loading: false, loaded: true }; const version = result.current_version || result.latest_version || _('unknown'); - if (result.component === 'forkop' && result.action === 'install') { - nextSystemInfo.forkop_version = version; + if (result.component === 'tachyon' && result.action === 'install') { + nextSystemInfo.tachyon_version = version; } if (result.component === 'sing_box') { @@ -421,7 +421,7 @@ async function applyCompletedComponentAction({ notify, }: { key: UpdatesActionKey; - result: Forkop.ComponentActionResult; + result: Tachyon.ComponentActionResult; notify: boolean; }) { if (result.action === 'check_update') { @@ -466,13 +466,13 @@ async function applyCompletedComponentAction({ patchSystemInfoAfterMutation(result); setActionLoading(key, false); - if (result.component === 'forkop' && result.action === 'install') { + if (result.component === 'tachyon' && result.action === 'install') { if (notify && result.message) { showToast(result.message, 'success', 1200); } if (notify) { - reloadPageAfterForkopUpdate(); + reloadPageAfterTachyonUpdate(); } return; } @@ -487,7 +487,7 @@ async function applyCompletedComponentAction({ async function completeComponentActionJob( key: UpdatesActionKey, jobId: string, - response: Forkop.MethodResponse, + response: Tachyon.MethodResponse, ) { if (pageUnloading) { setActionLoading(key, false); @@ -532,7 +532,7 @@ async function completeComponentActionJob( }); } -async function followComponentActionState(state: Forkop.ComponentActionResult) { +async function followComponentActionState(state: Tachyon.ComponentActionResult) { const jobId = state.job_id; const key = getComponentActionKey(state.component, state.action); @@ -551,7 +551,7 @@ async function followComponentActionState(state: Forkop.ComponentActionResult) { try { const response = state.running - ? await ForkopShellMethods.waitComponentActionJob( + ? await TachyonShellMethods.waitComponentActionJob( jobId, state.component, state.action, @@ -560,7 +560,7 @@ async function followComponentActionState(state: Forkop.ComponentActionResult) { : ({ success: true, data: state, - } as Forkop.MethodSuccessResponse); + } as Tachyon.MethodSuccessResponse); await completeComponentActionJob(key, jobId, response); } catch (error) { @@ -611,7 +611,7 @@ function isComponentActionAlreadyRunningError(message: string | undefined) { ); } -function handleComponentUiState(uiState: Forkop.UiState) { +function handleComponentUiState(uiState: Tachyon.UiState) { for (const state of uiState.actions.component || []) { void followComponentActionState(state); } @@ -671,7 +671,7 @@ async function handleComponentAction(button: ComponentActionButton) { let ownsJobFollow = false; try { - const startResponse = await ForkopShellMethods.componentActionStart( + const startResponse = await TachyonShellMethods.componentActionStart( button.component, button.action, ); @@ -705,7 +705,7 @@ async function handleComponentAction(button: ComponentActionButton) { followedComponentJobs.add(jobId); ownsJobFollow = true; - const response = await ForkopShellMethods.waitComponentActionJob( + const response = await TachyonShellMethods.waitComponentActionJob( jobId, button.component, button.action, @@ -732,7 +732,7 @@ async function handleComponentAction(button: ComponentActionButton) { } function getCheckAction( - component: Forkop.ComponentName, + component: Tachyon.ComponentName, key: UpdatesActionKey, ): ComponentActionButton { return { @@ -745,7 +745,7 @@ function getCheckAction( } function getInstallAction( - component: Forkop.ComponentName, + component: Tachyon.ComponentName, key: UpdatesActionKey, installed: boolean, ): ComponentActionButton { @@ -759,7 +759,7 @@ function getInstallAction( } function getInstalledUpdateActions( - component: Forkop.ComponentName, + component: Tachyon.ComponentName, checkKey: UpdatesActionKey, installKey: UpdatesActionKey, installed = true, @@ -824,10 +824,10 @@ function getComponentCards(): ComponentCard[] { Boolean(systemInfo.sing_box_compressed); const singBoxTiny = Boolean(systemInfo.sing_box_tiny); - const forkopActions = getInstalledUpdateActions( - 'forkop', - 'forkopCheck', - 'forkopInstall', + const tachyonActions = getInstalledUpdateActions( + 'tachyon', + 'tachyonCheck', + 'tachyonInstall', ); const singBoxActions = getInstalledUpdateActions( 'sing_box', @@ -898,15 +898,15 @@ function getComponentCards(): ComponentCard[] { return [ { - component: 'forkop', + component: 'tachyon', column: 0, - title: 'Forkop', + title: 'Tachyon', version: systemInfoLoading ? _('Loading...') - : normalizeCompiledVersion(systemInfo.forkop_version), - latestVersion: getLatestVersion('forkop'), - releaseUrl: getGitHubReleaseUrl('forkop'), - actions: forkopActions, + : normalizeCompiledVersion(systemInfo.tachyon_version), + latestVersion: getLatestVersion('tachyon'), + releaseUrl: getGitHubReleaseUrl('tachyon'), + actions: tachyonActions, }, { component: 'sing_box', @@ -1228,7 +1228,7 @@ function onStoreUpdate( } function applyComponentUpdateCheckCache( - componentUpdateCheckCache: Forkop.ComponentUpdateCheckCache, + componentUpdateCheckCache: Tachyon.ComponentUpdateCheckCache, ) { componentUpdateCheckCacheResolved = true; diff --git a/fe-app-tachyon/src/tachyon/tabs/updates/styles.ts b/fe-app-tachyon/src/tachyon/tabs/updates/styles.ts index 6265a3ae..5d129652 100644 --- a/fe-app-tachyon/src/tachyon/tabs/updates/styles.ts +++ b/fe-app-tachyon/src/tachyon/tabs/updates/styles.ts @@ -1,12 +1,12 @@ // language=CSS -import { FORKOP_UCI_PACKAGE as FORKOP_CBI_PREFIX } from '../../../constants'; +import { TACHYON_UCI_PACKAGE as TACHYON_CBI_PREFIX } from '../../../constants'; export const styles = ` -#cbi-${FORKOP_CBI_PREFIX}-updates-_mount_node > div { +#cbi-${TACHYON_CBI_PREFIX}-updates-_mount_node > div { width: 100%; } -#cbi-${FORKOP_CBI_PREFIX}-updates > h3 { +#cbi-${TACHYON_CBI_PREFIX}-updates > h3 { display: none; } diff --git a/fe-app-tachyon/src/tachyon/types.ts b/fe-app-tachyon/src/tachyon/types.ts index 9a80de11..e1f62b49 100644 --- a/fe-app-tachyon/src/tachyon/types.ts +++ b/fe-app-tachyon/src/tachyon/types.ts @@ -20,16 +20,16 @@ export namespace ClashAPI { } // eslint-disable-next-line @typescript-eslint/no-namespace -export namespace Forkop { +export namespace Tachyon { // Available commands: - // start Start forkop service - // stop Stop forkop service - // reload Reload forkop configuration - // restart Restart forkop service - // enable Enable forkop autostart - // disable Disable forkop autostart - // uninstall Remove forkop files installed outside opkg/apk - // main Run main forkop process + // start Start tachyon service + // stop Stop tachyon service + // reload Reload tachyon configuration + // restart Restart tachyon service + // enable Enable tachyon autostart + // disable Disable tachyon autostart + // uninstall Remove tachyon files installed outside opkg/apk + // main Run main tachyon process // list_update Update domain lists // check_proxy Check proxy connectivity // check_nft Check NFT rules @@ -37,15 +37,15 @@ export namespace Forkop { // check_sing_box Check sing-box installation and status // check_inbounds_config Check whether enabled server inbounds are configured // check_inbounds Check server inbounds from the Servers tab - // check_logs Show forkop logs from system journal + // check_logs Show tachyon logs from system journal // check_sing_box_logs Show sing-box logs // check_fakeip Test sing-box FakeIP DNS // clash_api Clash API interface for managing proxies and groups - // show_config Display current forkop configuration - // show_version Show forkop version + // show_config Display current tachyon configuration + // show_version Show tachyon version // show_sing_box_config Show sing-box configuration // show_sing_box_version Show sing-box version - // get_status Get forkop service status + // get_status Get tachyon service status // get_sing_box_status Get sing-box service status // get_ui_capabilities Get lightweight UI capabilities // check_dns_available Check DNS server availability @@ -455,8 +455,8 @@ export namespace Forkop { } export interface GetSystemInfo { - forkop_version: string; - forkop_latest_version: string; + tachyon_version: string; + tachyon_latest_version: string; luci_app_version: string; sing_box_version: string; sing_box_extended: 0 | 1; @@ -527,7 +527,7 @@ export namespace Forkop { export interface UiState { service: { - forkop: GetStatus; + tachyon: GetStatus; sing_box: GetSingBoxStatus; }; capabilities: GetUiCapabilities; @@ -540,7 +540,7 @@ export namespace Forkop { } export type ComponentName = - | 'forkop' + | 'tachyon' | 'sing_box' | 'zapret' | 'zapret2' diff --git a/fe-app-tachyon/src/validators/tests/validateUrl.test.js b/fe-app-tachyon/src/validators/tests/validateUrl.test.js index 6ca17c78..4c7b3ab3 100644 --- a/fe-app-tachyon/src/validators/tests/validateUrl.test.js +++ b/fe-app-tachyon/src/validators/tests/validateUrl.test.js @@ -8,7 +8,7 @@ const validUrls = [ ['With query', 'https://example.com/?q=test'], ['With port', 'http://example.com:8080'], ['With subdomain', 'https://sub.example.com'], - ['IPv4 host', 'http://127.0.0.1/forkop-subscription-test.json'], + ['IPv4 host', 'http://127.0.0.1/tachyon-subscription-test.json'], ['IPv4 host with port', 'http://192.168.1.1:8080/sub'], ['IPv6 host', 'https://[2001:db8::1]/sub'], ['IPv6 host with port', 'https://[2001:db8::1]:8443/sub'], diff --git a/fe-app-tachyon/tsup.config.ts b/fe-app-tachyon/tsup.config.ts index e37b6cf8..5c37760b 100644 --- a/fe-app-tachyon/tsup.config.ts +++ b/fe-app-tachyon/tsup.config.ts @@ -5,7 +5,7 @@ import path from 'path'; export default defineConfig({ entry: ['src/main.ts'], format: ['esm'], // пусть tsup генерит export {...} - outDir: '../luci-app-forkop/htdocs/luci-static/resources/view/forkop', + outDir: '../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon', outExtension: () => ({ js: '.js' }), dts: false, clean: false, @@ -18,7 +18,7 @@ export default defineConfig({ }, onSuccess: () => { const outDir = - '../luci-app-forkop/htdocs/luci-static/resources/view/forkop'; + '../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon'; const file = path.join(outDir, 'main.js'); let code = fs.readFileSync(file, 'utf8'); diff --git a/fe-app-tachyon/watch-upload.js b/fe-app-tachyon/watch-upload.js index 3412565c..76798b0e 100644 --- a/fe-app-tachyon/watch-upload.js +++ b/fe-app-tachyon/watch-upload.js @@ -18,19 +18,19 @@ const config = { const syncDirs = [ { - local: path.resolve(process.env.LOCAL_DIR_FE ?? '../luci-app-forkop/htdocs/luci-static/resources/view/forkop'), - remote: process.env.REMOTE_DIR_FE ?? '/www/luci-static/resources/view/forkop', + local: path.resolve(process.env.LOCAL_DIR_FE ?? '../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon'), + remote: process.env.REMOTE_DIR_FE ?? '/www/luci-static/resources/view/tachyon', }, { - local: path.resolve(process.env.LOCAL_DIR_BIN ?? '../forkop/files/usr/bin/'), + local: path.resolve(process.env.LOCAL_DIR_BIN ?? '../tachyon/files/usr/bin/'), remote: process.env.REMOTE_DIR_BIN ?? '/usr/bin/', }, { - local: path.resolve(process.env.LOCAL_DIR_LIB ?? '../forkop/files/usr/lib/'), - remote: process.env.REMOTE_DIR_LIB ?? '/usr/lib/forkop/', + local: path.resolve(process.env.LOCAL_DIR_LIB ?? '../tachyon/files/usr/lib/'), + remote: process.env.REMOTE_DIR_LIB ?? '/usr/lib/tachyon/', }, { - local: path.resolve(process.env.LOCAL_DIR_INIT ?? '../forkop/files/etc/init.d/'), + local: path.resolve(process.env.LOCAL_DIR_INIT ?? '../tachyon/files/etc/init.d/'), remote: process.env.REMOTE_DIR_INIT ?? '/etc/init.d/', } ]; diff --git a/install.sh b/install.sh index 81868b1b..662910b7 100755 --- a/install.sh +++ b/install.sh @@ -12,25 +12,26 @@ DOWNLOAD_TIMEOUT_SECONDS=600 PKG_IS_APK=0 FETCHER="" TMP_DIR="" -FORKOP_WAS_ENABLED=0 -FORKOP_WAS_RUNNING=0 -FORKOP_LEGACY_DETECTED=0 -FORKOP_I18N_REQUESTED=0 +TACHYON_WAS_ENABLED=0 +TACHYON_WAS_RUNNING=0 +TACHYON_LEGACY_DETECTED=0 +TACHYON_FORKOP_MIGRATION=0 +TACHYON_I18N_REQUESTED=0 INSTALLER_LANG="en" SING_BOX_INSTALL_VARIANT="" -FORKOP_RELEASE_JSON="" -FORKOP_RELEASE_TAG="" -FORKOP_BACKEND_URL="" -FORKOP_BACKEND_NAME="" -FORKOP_BACKEND_FILE="" -FORKOP_APP_URL="" -FORKOP_APP_NAME="" -FORKOP_APP_FILE="" -FORKOP_I18N_URL="" -FORKOP_I18N_NAME="" -FORKOP_I18N_FILE="" -FORKOP_PACKAGE_VERSION="" +TACHYON_RELEASE_JSON="" +TACHYON_RELEASE_TAG="" +TACHYON_BACKEND_URL="" +TACHYON_BACKEND_NAME="" +TACHYON_BACKEND_FILE="" +TACHYON_APP_URL="" +TACHYON_APP_NAME="" +TACHYON_APP_FILE="" +TACHYON_I18N_URL="" +TACHYON_I18N_NAME="" +TACHYON_I18N_FILE="" +TACHYON_PACKAGE_VERSION="" LEGACY_BRAND="$(printf '\160\157\144\153\157\160')" LEGACY_BACKEND_PACKAGE="${LEGACY_BRAND}-plus" LEGACY_CONFIG_PACKAGE_ALT="${LEGACY_BRAND}_plus" @@ -55,10 +56,10 @@ usage() { cat </dev/null || true; exit 0' TERM INT - sleep "$forkop_deadline_seconds" & - forkop_deadline_sleep_pid=$! - wait "$forkop_deadline_sleep_pid" - kill "$forkop_deadline_command_pid" 2>/dev/null || true + trap 'kill "$tachyon_deadline_sleep_pid" 2>/dev/null || true; exit 0' TERM INT + sleep "$tachyon_deadline_seconds" & + tachyon_deadline_sleep_pid=$! + wait "$tachyon_deadline_sleep_pid" + kill "$tachyon_deadline_command_pid" 2>/dev/null || true ) & - forkop_deadline_watchdog_pid=$! + tachyon_deadline_watchdog_pid=$! - wait "$forkop_deadline_command_pid" - forkop_deadline_status=$? - kill "$forkop_deadline_watchdog_pid" 2>/dev/null || true - wait "$forkop_deadline_watchdog_pid" 2>/dev/null || true - return "$forkop_deadline_status" + wait "$tachyon_deadline_command_pid" + tachyon_deadline_status=$? + kill "$tachyon_deadline_watchdog_pid" 2>/dev/null || true + wait "$tachyon_deadline_watchdog_pid" 2>/dev/null || true + return "$tachyon_deadline_status" } http_get() { @@ -436,53 +437,53 @@ function env(name, fallback) { return as_string(value); } -const INSTALLER_FORKOP_INIT = env("FORKOP_INSTALLER_INIT", "/etc/init.d/forkop"); -const INSTALLER_FORKOP_BIN = env("FORKOP_INSTALLER_BIN", "/usr/bin/forkop"); -const INSTALLER_FORKOP_LIB = env("FORKOP_INSTALLER_LIB", "/usr/lib/forkop"); -const INSTALLER_FORKOP_PERSISTENT_DIR = env("FORKOP_INSTALLER_PERSISTENT_DIR", "/etc/forkop"); -const INSTALLER_FORKOP_UCI_DEFAULTS = env("FORKOP_INSTALLER_UCI_DEFAULTS", "/etc/uci-defaults/50_luci-forkop"); -const INSTALLER_FORKOP_LUCI_VIEW = env("FORKOP_INSTALLER_LUCI_VIEW", "/www/luci-static/resources/view/forkop"); -const INSTALLER_MENU_JSON = env("FORKOP_INSTALLER_MENU_JSON", "/usr/share/luci/menu.d/luci-app-forkop.json"); -const INSTALLER_ACL_JSON = env("FORKOP_INSTALLER_ACL_JSON", "/usr/share/rpcd/acl.d/luci-app-forkop.json"); -const INSTALLER_RU_LMO = env("FORKOP_INSTALLER_RU_LMO", "/usr/lib/lua/luci/i18n/forkop.ru.lmo"); -const INSTALLER_EN_LMO = env("FORKOP_INSTALLER_EN_LMO", "/usr/lib/lua/luci/i18n/forkop.en.lmo"); -const INSTALLER_RU_LUA = env("FORKOP_INSTALLER_RU_LUA", "/usr/lib/lua/luci/i18n/forkop.ru.lua"); -const INSTALLER_EN_LUA = env("FORKOP_INSTALLER_EN_LUA", "/usr/lib/lua/luci/i18n/forkop.en.lua"); -const INSTALLER_RPCD_INIT = env("FORKOP_INSTALLER_RPCD_INIT", "/etc/init.d/rpcd"); -const LEGACY_BRAND = env("FORKOP_INSTALLER_LEGACY_BRAND", ""); -const LEGACY_BACKEND_PACKAGE = env("FORKOP_INSTALLER_LEGACY_BACKEND", LEGACY_BRAND + "-plus"); -const LEGACY_CONFIG_PACKAGE_ALT = env("FORKOP_INSTALLER_LEGACY_CONFIG_ALT", LEGACY_BRAND + "_plus"); -const INSTALLER_LEGACY_INIT = env("FORKOP_INSTALLER_LEGACY_INIT", "/etc/init.d/" + LEGACY_BACKEND_PACKAGE); -const INSTALLER_LEGACY_BASE_INIT = env("FORKOP_INSTALLER_LEGACY_BASE_INIT", "/etc/init.d/" + LEGACY_BRAND); -const INSTALLER_LEGACY_BASE_BIN = env("FORKOP_INSTALLER_LEGACY_BASE_BIN", "/usr/bin/" + LEGACY_BRAND); -const INSTALLER_LEGACY_BASE_LIB = env("FORKOP_INSTALLER_LEGACY_BASE_LIB", "/usr/lib/" + LEGACY_BRAND); -const INSTALLER_LEGACY_BASE_UCI_DEFAULTS = env("FORKOP_INSTALLER_LEGACY_BASE_UCI_DEFAULTS", "/etc/uci-defaults/50_luci-" + LEGACY_BRAND); -const INSTALLER_LEGACY_BASE_LUCI_VIEW = env("FORKOP_INSTALLER_LEGACY_BASE_LUCI_VIEW", "/www/luci-static/resources/view/" + LEGACY_BRAND); -const INSTALLER_LEGACY_BASE_MENU_JSON = env("FORKOP_INSTALLER_LEGACY_BASE_MENU_JSON", "/usr/share/luci/menu.d/luci-app-" + LEGACY_BRAND); -const INSTALLER_LEGACY_BASE_ACL_JSON = env("FORKOP_INSTALLER_LEGACY_BASE_ACL_JSON", "/usr/share/rpcd/acl.d/luci-app-" + LEGACY_BRAND); -const INSTALLER_LEGACY_BASE_I18N = env("FORKOP_INSTALLER_LEGACY_BASE_I18N", "/usr/lib/lua/luci/i18n/" + LEGACY_BRAND); -const INSTALLER_LEGACY_BASE_CONFIG = env("FORKOP_INSTALLER_LEGACY_BASE_CONFIG", "/etc/config/" + LEGACY_BRAND); -const INSTALLER_LEGACY_BASE_PERSISTENT_DIR = env("FORKOP_INSTALLER_LEGACY_BASE_PERSISTENT_DIR", "/etc/" + LEGACY_BRAND); -const INSTALLER_LEGACY_BASE_RUNTIME_DIR = env("FORKOP_INSTALLER_LEGACY_BASE_RUNTIME_DIR", "/var/run/" + LEGACY_BRAND); -const INSTALLER_LEGACY_BASE_TMP_DIR = env("FORKOP_INSTALLER_LEGACY_BASE_TMP_DIR", "/tmp/" + LEGACY_BRAND); -const INSTALLER_LEGACY_TMP_PACKAGE_GLOB = env("FORKOP_INSTALLER_LEGACY_TMP_PACKAGE_GLOB", "/tmp/*" + LEGACY_BRAND + "*"); -const INSTALLER_LEGACY_SCAN_ROOTS = env("FORKOP_INSTALLER_LEGACY_SCAN_ROOTS", "/tmp /var/run /etc /usr/lib /usr/share/luci /usr/share/rpcd /www/luci-static/resources/view"); -const INSTALLER_LEGACY_BIN = env("FORKOP_INSTALLER_LEGACY_BIN", "/usr/bin/" + LEGACY_BACKEND_PACKAGE); -const INSTALLER_LEGACY_LIB = env("FORKOP_INSTALLER_LEGACY_LIB", "/usr/lib/" + LEGACY_BACKEND_PACKAGE); -const INSTALLER_LEGACY_UCI_DEFAULTS = env("FORKOP_INSTALLER_LEGACY_UCI_DEFAULTS", "/etc/uci-defaults/50_luci-" + LEGACY_BACKEND_PACKAGE); -const INSTALLER_LEGACY_LUCI_VIEW = env("FORKOP_INSTALLER_LEGACY_LUCI_VIEW", "/www/luci-static/resources/view/" + LEGACY_CONFIG_PACKAGE_ALT); -const INSTALLER_LEGACY_MENU_JSON = env("FORKOP_INSTALLER_LEGACY_MENU_JSON", "/usr/share/luci/menu.d/luci-app-" + LEGACY_BACKEND_PACKAGE + ".json"); -const INSTALLER_LEGACY_ACL_JSON = env("FORKOP_INSTALLER_LEGACY_ACL_JSON", "/usr/share/rpcd/acl.d/luci-app-" + LEGACY_BACKEND_PACKAGE + ".json"); -const INSTALLER_LEGACY_CONFIG = env("FORKOP_INSTALLER_LEGACY_CONFIG", "/etc/config/" + LEGACY_BACKEND_PACKAGE); -const INSTALLER_LEGACY_CONFIG_ALT = env("FORKOP_INSTALLER_LEGACY_CONFIG_FILE_ALT", "/etc/config/" + LEGACY_CONFIG_PACKAGE_ALT); -const INSTALLER_LEGACY_PERSISTENT_DIR = env("FORKOP_INSTALLER_LEGACY_PERSISTENT_DIR", "/etc/" + LEGACY_BACKEND_PACKAGE); -const INSTALLER_LEGACY_RUNTIME_DIR = env("FORKOP_INSTALLER_LEGACY_RUNTIME_DIR", "/var/run/" + LEGACY_BACKEND_PACKAGE); -const INSTALLER_LEGACY_TMP_DIR = env("FORKOP_INSTALLER_LEGACY_TMP_DIR", "/tmp/" + LEGACY_BACKEND_PACKAGE); -const INSTALLER_LEGACY_TMP_ALT_DIR = env("FORKOP_INSTALLER_LEGACY_TMP_ALT_DIR", "/tmp/" + LEGACY_CONFIG_PACKAGE_ALT); +const INSTALLER_TACHYON_INIT = env("TACHYON_INSTALLER_INIT", "/etc/init.d/tachyon"); +const INSTALLER_TACHYON_BIN = env("TACHYON_INSTALLER_BIN", "/usr/bin/tachyon"); +const INSTALLER_TACHYON_LIB = env("TACHYON_INSTALLER_LIB", "/usr/lib/tachyon"); +const INSTALLER_TACHYON_PERSISTENT_DIR = env("TACHYON_INSTALLER_PERSISTENT_DIR", "/etc/tachyon"); +const INSTALLER_TACHYON_UCI_DEFAULTS = env("TACHYON_INSTALLER_UCI_DEFAULTS", "/etc/uci-defaults/50_luci-tachyon"); +const INSTALLER_TACHYON_LUCI_VIEW = env("TACHYON_INSTALLER_LUCI_VIEW", "/www/luci-static/resources/view/tachyon"); +const INSTALLER_MENU_JSON = env("TACHYON_INSTALLER_MENU_JSON", "/usr/share/luci/menu.d/luci-app-tachyon.json"); +const INSTALLER_ACL_JSON = env("TACHYON_INSTALLER_ACL_JSON", "/usr/share/rpcd/acl.d/luci-app-tachyon.json"); +const INSTALLER_RU_LMO = env("TACHYON_INSTALLER_RU_LMO", "/usr/lib/lua/luci/i18n/tachyon.ru.lmo"); +const INSTALLER_EN_LMO = env("TACHYON_INSTALLER_EN_LMO", "/usr/lib/lua/luci/i18n/tachyon.en.lmo"); +const INSTALLER_RU_LUA = env("TACHYON_INSTALLER_RU_LUA", "/usr/lib/lua/luci/i18n/tachyon.ru.lua"); +const INSTALLER_EN_LUA = env("TACHYON_INSTALLER_EN_LUA", "/usr/lib/lua/luci/i18n/tachyon.en.lua"); +const INSTALLER_RPCD_INIT = env("TACHYON_INSTALLER_RPCD_INIT", "/etc/init.d/rpcd"); +const LEGACY_BRAND = env("TACHYON_INSTALLER_LEGACY_BRAND", ""); +const LEGACY_BACKEND_PACKAGE = env("TACHYON_INSTALLER_LEGACY_BACKEND", LEGACY_BRAND + "-plus"); +const LEGACY_CONFIG_PACKAGE_ALT = env("TACHYON_INSTALLER_LEGACY_CONFIG_ALT", LEGACY_BRAND + "_plus"); +const INSTALLER_LEGACY_INIT = env("TACHYON_INSTALLER_LEGACY_INIT", "/etc/init.d/" + LEGACY_BACKEND_PACKAGE); +const INSTALLER_LEGACY_BASE_INIT = env("TACHYON_INSTALLER_LEGACY_BASE_INIT", "/etc/init.d/" + LEGACY_BRAND); +const INSTALLER_LEGACY_BASE_BIN = env("TACHYON_INSTALLER_LEGACY_BASE_BIN", "/usr/bin/" + LEGACY_BRAND); +const INSTALLER_LEGACY_BASE_LIB = env("TACHYON_INSTALLER_LEGACY_BASE_LIB", "/usr/lib/" + LEGACY_BRAND); +const INSTALLER_LEGACY_BASE_UCI_DEFAULTS = env("TACHYON_INSTALLER_LEGACY_BASE_UCI_DEFAULTS", "/etc/uci-defaults/50_luci-" + LEGACY_BRAND); +const INSTALLER_LEGACY_BASE_LUCI_VIEW = env("TACHYON_INSTALLER_LEGACY_BASE_LUCI_VIEW", "/www/luci-static/resources/view/" + LEGACY_BRAND); +const INSTALLER_LEGACY_BASE_MENU_JSON = env("TACHYON_INSTALLER_LEGACY_BASE_MENU_JSON", "/usr/share/luci/menu.d/luci-app-" + LEGACY_BRAND); +const INSTALLER_LEGACY_BASE_ACL_JSON = env("TACHYON_INSTALLER_LEGACY_BASE_ACL_JSON", "/usr/share/rpcd/acl.d/luci-app-" + LEGACY_BRAND); +const INSTALLER_LEGACY_BASE_I18N = env("TACHYON_INSTALLER_LEGACY_BASE_I18N", "/usr/lib/lua/luci/i18n/" + LEGACY_BRAND); +const INSTALLER_LEGACY_BASE_CONFIG = env("TACHYON_INSTALLER_LEGACY_BASE_CONFIG", "/etc/config/" + LEGACY_BRAND); +const INSTALLER_LEGACY_BASE_PERSISTENT_DIR = env("TACHYON_INSTALLER_LEGACY_BASE_PERSISTENT_DIR", "/etc/" + LEGACY_BRAND); +const INSTALLER_LEGACY_BASE_RUNTIME_DIR = env("TACHYON_INSTALLER_LEGACY_BASE_RUNTIME_DIR", "/var/run/" + LEGACY_BRAND); +const INSTALLER_LEGACY_BASE_TMP_DIR = env("TACHYON_INSTALLER_LEGACY_BASE_TMP_DIR", "/tmp/" + LEGACY_BRAND); +const INSTALLER_LEGACY_TMP_PACKAGE_GLOB = env("TACHYON_INSTALLER_LEGACY_TMP_PACKAGE_GLOB", "/tmp/*" + LEGACY_BRAND + "*"); +const INSTALLER_LEGACY_SCAN_ROOTS = env("TACHYON_INSTALLER_LEGACY_SCAN_ROOTS", "/tmp /var/run /etc /usr/lib /usr/share/luci /usr/share/rpcd /www/luci-static/resources/view"); +const INSTALLER_LEGACY_BIN = env("TACHYON_INSTALLER_LEGACY_BIN", "/usr/bin/" + LEGACY_BACKEND_PACKAGE); +const INSTALLER_LEGACY_LIB = env("TACHYON_INSTALLER_LEGACY_LIB", "/usr/lib/" + LEGACY_BACKEND_PACKAGE); +const INSTALLER_LEGACY_UCI_DEFAULTS = env("TACHYON_INSTALLER_LEGACY_UCI_DEFAULTS", "/etc/uci-defaults/50_luci-" + LEGACY_BACKEND_PACKAGE); +const INSTALLER_LEGACY_LUCI_VIEW = env("TACHYON_INSTALLER_LEGACY_LUCI_VIEW", "/www/luci-static/resources/view/" + LEGACY_CONFIG_PACKAGE_ALT); +const INSTALLER_LEGACY_MENU_JSON = env("TACHYON_INSTALLER_LEGACY_MENU_JSON", "/usr/share/luci/menu.d/luci-app-" + LEGACY_BACKEND_PACKAGE + ".json"); +const INSTALLER_LEGACY_ACL_JSON = env("TACHYON_INSTALLER_LEGACY_ACL_JSON", "/usr/share/rpcd/acl.d/luci-app-" + LEGACY_BACKEND_PACKAGE + ".json"); +const INSTALLER_LEGACY_CONFIG = env("TACHYON_INSTALLER_LEGACY_CONFIG", "/etc/config/" + LEGACY_BACKEND_PACKAGE); +const INSTALLER_LEGACY_CONFIG_ALT = env("TACHYON_INSTALLER_LEGACY_CONFIG_FILE_ALT", "/etc/config/" + LEGACY_CONFIG_PACKAGE_ALT); +const INSTALLER_LEGACY_PERSISTENT_DIR = env("TACHYON_INSTALLER_LEGACY_PERSISTENT_DIR", "/etc/" + LEGACY_BACKEND_PACKAGE); +const INSTALLER_LEGACY_RUNTIME_DIR = env("TACHYON_INSTALLER_LEGACY_RUNTIME_DIR", "/var/run/" + LEGACY_BACKEND_PACKAGE); +const INSTALLER_LEGACY_TMP_DIR = env("TACHYON_INSTALLER_LEGACY_TMP_DIR", "/tmp/" + LEGACY_BACKEND_PACKAGE); +const INSTALLER_LEGACY_TMP_ALT_DIR = env("TACHYON_INSTALLER_LEGACY_TMP_ALT_DIR", "/tmp/" + LEGACY_CONFIG_PACKAGE_ALT); -let dns_owner_config = "forkop"; -let dns_owner_section = "forkop"; -let dns_owner_option_prefix = "forkop_"; +let dns_owner_config = "tachyon"; +let dns_owner_section = "tachyon"; +let dns_owner_option_prefix = "tachyon_"; function path_exists(path) { return fs.stat(as_string(path)) != null; @@ -667,9 +668,9 @@ function select_dns_owner(legacy) { dns_owner_option_prefix = LEGACY_BRAND + "_"; } else { - dns_owner_config = "forkop"; - dns_owner_section = "forkop"; - dns_owner_option_prefix = "forkop_"; + dns_owner_config = "tachyon"; + dns_owner_section = "tachyon"; + dns_owner_option_prefix = "tachyon_"; } } @@ -686,21 +687,21 @@ function installer_deactivate_legacy_base() { return; if (installer_service_running(INSTALLER_LEGACY_BASE_INIT)) { - warn("Detected a running legacy service. Stopping it before installing Forkop.\n"); + warn("Detected a running legacy service. Stopping it before installing Tachyon.\n"); run_args([ INSTALLER_LEGACY_BASE_INIT, "stop" ]); } if (installer_service_enabled(INSTALLER_LEGACY_BASE_INIT)) { - warn("Detected an enabled legacy autostart. Disabling it before installing Forkop.\n"); + warn("Detected an enabled legacy autostart. Disabling it before installing Tachyon.\n"); run_args([ INSTALLER_LEGACY_BASE_INIT, "disable" ]); } } function installer_cleanup_legacy() { - let forkop_installed = installer_package_installed("forkop"); + let tachyon_installed = installer_package_installed("tachyon"); let legacy_installed = LEGACY_BRAND != "" && installer_package_installed(LEGACY_BACKEND_PACKAGE); - let active_init = legacy_installed ? INSTALLER_LEGACY_INIT : INSTALLER_FORKOP_INIT; - let active_bin = legacy_installed ? INSTALLER_LEGACY_BIN : INSTALLER_FORKOP_BIN; + let active_init = legacy_installed ? INSTALLER_LEGACY_INIT : INSTALLER_TACHYON_INIT; + let active_bin = legacy_installed ? INSTALLER_LEGACY_BIN : INSTALLER_TACHYON_BIN; let was_enabled = installer_service_enabled(active_init); let was_running = installer_service_running(active_init) || installer_backend_status_running(active_bin); @@ -732,9 +733,18 @@ function installer_cleanup_legacy() { packages_removed = false; } - if (!installer_remove_package_prefix("luci-i18n-forkop")) + if (installer_package_installed("forkop")) { + if (!installer_remove_package_prefix("luci-i18n-forkop")) + packages_removed = false; + if (!installer_remove_package("luci-app-forkop")) + packages_removed = false; + if (!installer_remove_package("forkop")) + packages_removed = false; + } + + if (!installer_remove_package_prefix("luci-i18n-tachyon")) packages_removed = false; - if (!installer_remove_package("luci-app-forkop")) + if (!installer_remove_package("luci-app-tachyon")) packages_removed = false; if (!packages_removed) { @@ -755,17 +765,17 @@ function installer_cleanup_legacy() { remove_path(path); } - if (!forkop_installed) { - remove_path(INSTALLER_FORKOP_LIB); - remove_path(INSTALLER_FORKOP_INIT); - remove_path(INSTALLER_FORKOP_BIN); + if (!tachyon_installed) { + remove_path(INSTALLER_TACHYON_LIB); + remove_path(INSTALLER_TACHYON_INIT); + remove_path(INSTALLER_TACHYON_BIN); } for (let path in [ - INSTALLER_FORKOP_LUCI_VIEW, + INSTALLER_TACHYON_LUCI_VIEW, INSTALLER_MENU_JSON, INSTALLER_ACL_JSON, - INSTALLER_FORKOP_UCI_DEFAULTS, + INSTALLER_TACHYON_UCI_DEFAULTS, INSTALLER_RU_LMO, INSTALLER_EN_LMO, INSTALLER_RU_LUA, @@ -773,9 +783,9 @@ function installer_cleanup_legacy() { ]) remove_path(path); - print("FORKOP_WAS_ENABLED=", was_enabled ? "1" : "0", "\n"); - print("FORKOP_WAS_RUNNING=", was_running ? "1" : "0", "\n"); - print("FORKOP_LEGACY_DETECTED=", legacy_installed ? "1" : "0", "\n"); + print("TACHYON_WAS_ENABLED=", was_enabled ? "1" : "0", "\n"); + print("TACHYON_WAS_RUNNING=", was_running ? "1" : "0", "\n"); + print("TACHYON_LEGACY_DETECTED=", legacy_installed ? "1" : "0", "\n"); return true; } @@ -786,8 +796,8 @@ function installer_finalize_legacy() { let legacy_tailscale_dir = INSTALLER_LEGACY_PERSISTENT_DIR + "/tailscale"; if (path_exists(legacy_tailscale_dir)) { let entries = fs.lsdir(legacy_tailscale_dir); - let forkop_tailscale_dir = INSTALLER_FORKOP_PERSISTENT_DIR + "/tailscale"; - if (type(entries) != "array" || !run_args([ "mkdir", "-p", forkop_tailscale_dir ])) { + let tachyon_tailscale_dir = INSTALLER_TACHYON_PERSISTENT_DIR + "/tailscale"; + if (type(entries) != "array" || !run_args([ "mkdir", "-p", tachyon_tailscale_dir ])) { warn("Failed to prepare legacy Tailscale state migration; the legacy directory was preserved.\n"); return false; } @@ -795,11 +805,11 @@ function installer_finalize_legacy() { for (let entry in entries) { entry = as_string(entry); let source = legacy_tailscale_dir + "/" + entry; - let target = forkop_tailscale_dir + "/" + entry; + let target = tachyon_tailscale_dir + "/" + entry; if (path_exists(target)) continue; - let temporary = forkop_tailscale_dir + "/." + entry + ".forkop-migrate"; + let temporary = tachyon_tailscale_dir + "/." + entry + ".tachyon-migrate"; if (!remove_path(temporary) || !run_args([ "cp", "-a", source, temporary ]) || !run_args([ "mv", temporary, target ])) { @@ -863,26 +873,26 @@ function installer_finalize_legacy() { } function installer_post_install() { - remove_globs(env("FORKOP_INSTALLER_LUCI_CACHE_GLOBS", "/var/luci-indexcache* /tmp/luci-indexcache*")); + remove_globs(env("TACHYON_INSTALLER_LUCI_CACHE_GLOBS", "/var/luci-indexcache* /tmp/luci-indexcache*")); for (let path in [ - env("FORKOP_INSTALLER_LATEST_VERSION_CACHE", "/tmp/forkop.latest-version.cache"), - env("FORKOP_INSTALLER_SYSTEM_INFO_CACHE", "/var/run/forkop/system-info.json"), - env("FORKOP_INSTALLER_SERVER_COUNTRY_CACHE", "/var/run/forkop/server-country-cache.json"), - env("FORKOP_INSTALLER_SING_BOX_VERSION_CACHE", "/var/run/forkop/ui-state/sing-box-version"), - env("FORKOP_INSTALLER_TMP_SYSTEM_INFO_CACHE", "/tmp/forkop/system-info.json") + env("TACHYON_INSTALLER_LATEST_VERSION_CACHE", "/tmp/tachyon.latest-version.cache"), + env("TACHYON_INSTALLER_SYSTEM_INFO_CACHE", "/var/run/tachyon/system-info.json"), + env("TACHYON_INSTALLER_SERVER_COUNTRY_CACHE", "/var/run/tachyon/server-country-cache.json"), + env("TACHYON_INSTALLER_SING_BOX_VERSION_CACHE", "/var/run/tachyon/ui-state/sing-box-version"), + env("TACHYON_INSTALLER_TMP_SYSTEM_INFO_CACHE", "/tmp/tachyon/system-info.json") ]) remove_path(path); if (path_executable(INSTALLER_RPCD_INIT)) run_args([ INSTALLER_RPCD_INIT, "reload" ]); - if (env("FORKOP_WAS_ENABLED", "0") == "1" && path_executable(INSTALLER_FORKOP_INIT)) - run_args([ INSTALLER_FORKOP_INIT, "enable" ]); + if (env("TACHYON_WAS_ENABLED", "0") == "1" && path_executable(INSTALLER_TACHYON_INIT)) + run_args([ INSTALLER_TACHYON_INIT, "enable" ]); - if (env("FORKOP_WAS_RUNNING", "0") == "1" && path_executable(INSTALLER_FORKOP_INIT)) { - if (!run_args([ INSTALLER_FORKOP_INIT, "start" ]) && - !run_args([ INSTALLER_FORKOP_INIT, "restart" ])) - warn("Failed to start Forkop after upgrade.\n"); + if (env("TACHYON_WAS_RUNNING", "0") == "1" && path_executable(INSTALLER_TACHYON_INIT)) { + if (!run_args([ INSTALLER_TACHYON_INIT, "start" ]) && + !run_args([ INSTALLER_TACHYON_INIT, "restart" ])) + warn("Failed to start Tachyon after upgrade.\n"); } return true; @@ -1024,11 +1034,11 @@ function asset_matches(name, kind, ext, version) { return false; if (kind == "backend") - return name == "forkop_" + version + "." + ext; + return name == "tachyon_" + version + "." + ext; if (kind == "app") - return name == "luci-app-forkop_" + version + "." + ext; + return name == "luci-app-tachyon_" + version + "." + ext; if (kind == "i18n") - return name == "luci-i18n-forkop-ru_" + version + "." + ext; + return name == "luci-i18n-tachyon-ru_" + version + "." + ext; return false; } @@ -1092,9 +1102,9 @@ EOF install_json_ucode() { - FORKOP_INSTALLER_LEGACY_BRAND="$LEGACY_BRAND" \ - FORKOP_INSTALLER_LEGACY_BACKEND="$LEGACY_BACKEND_PACKAGE" \ - FORKOP_INSTALLER_LEGACY_CONFIG_ALT="$LEGACY_CONFIG_PACKAGE_ALT" \ + TACHYON_INSTALLER_LEGACY_BRAND="$LEGACY_BRAND" \ + TACHYON_INSTALLER_LEGACY_BACKEND="$LEGACY_BACKEND_PACKAGE" \ + TACHYON_INSTALLER_LEGACY_CONFIG_ALT="$LEGACY_CONFIG_PACKAGE_ALT" \ ucode "$(install_json_helper_path)" "$@" } @@ -1244,7 +1254,7 @@ check_system() { major="$(printf '%s' "$release" | sed 's/[^0-9].*$//' | cut -d. -f1)" if [ -n "$major" ] && [ "$major" -lt 24 ]; then - fail "Forkop requires OpenWrt 24.10 or newer" + fail "Tachyon requires OpenWrt 24.10 or newer" fi available_space="$(df /overlay 2>/dev/null | awk 'NR==2 {print $4}')" @@ -1302,7 +1312,7 @@ detect_installer_language() { luci_lang="$(get_luci_main_lang)" INSTALLER_LANG="en" - if pkg_is_installed "luci-i18n-forkop-ru"; then + if pkg_is_installed "luci-i18n-tachyon-ru"; then INSTALLER_LANG="ru" return 0 fi @@ -1357,14 +1367,14 @@ extract_package_version() { package_name="$1" case "$package_name" in - forkop_*.ipk|forkop_*.apk) - printf '%s\n' "$package_name" | sed 's/^forkop_//;s/\.ipk$//;s/\.apk$//' + tachyon_*.ipk|tachyon_*.apk) + printf '%s\n' "$package_name" | sed 's/^tachyon_//;s/\.ipk$//;s/\.apk$//' ;; - luci-app-forkop_*.ipk|luci-app-forkop_*.apk) - printf '%s\n' "$package_name" | sed 's/^luci-app-forkop_//;s/\.ipk$//;s/\.apk$//' + luci-app-tachyon_*.ipk|luci-app-tachyon_*.apk) + printf '%s\n' "$package_name" | sed 's/^luci-app-tachyon_//;s/\.ipk$//;s/\.apk$//' ;; - luci-i18n-forkop-ru_*.ipk|luci-i18n-forkop-ru_*.apk) - printf '%s\n' "$package_name" | sed 's/^luci-i18n-forkop-ru_//;s/\.ipk$//;s/\.apk$//' + luci-i18n-tachyon-ru_*.ipk|luci-i18n-tachyon-ru_*.apk) + printf '%s\n' "$package_name" | sed 's/^luci-i18n-tachyon-ru_//;s/\.ipk$//;s/\.apk$//' ;; *) printf '%s\n' "$package_name" @@ -1396,32 +1406,32 @@ fetch_github_latest_release_json() { printf '%s' "$response" } -resolve_forkop_release() { +resolve_tachyon_release() { asset_ext="ipk" [ "$PKG_IS_APK" -eq 1 ] && asset_ext="apk" - FORKOP_RELEASE_JSON="$(fetch_github_latest_release_json "$REPO_OWNER" "$REPO_NAME")" - FORKOP_RELEASE_TAG="$(printf '%s' "$FORKOP_RELEASE_JSON" | install_json_ucode release-tag 2>/dev/null)" - [ -n "$FORKOP_RELEASE_TAG" ] || fail "Failed to detect the Forkop release tag" + TACHYON_RELEASE_JSON="$(fetch_github_latest_release_json "$REPO_OWNER" "$REPO_NAME")" + TACHYON_RELEASE_TAG="$(printf '%s' "$TACHYON_RELEASE_JSON" | install_json_ucode release-tag 2>/dev/null)" + [ -n "$TACHYON_RELEASE_TAG" ] || fail "Failed to detect the Tachyon release tag" - FORKOP_BACKEND_URL="$(printf '%s' "$FORKOP_RELEASE_JSON" | install_json_ucode release-asset-url backend "$asset_ext" 2>/dev/null)" - [ -n "$FORKOP_BACKEND_URL" ] || fail "The Forkop release does not contain a forkop .$asset_ext package" + TACHYON_BACKEND_URL="$(printf '%s' "$TACHYON_RELEASE_JSON" | install_json_ucode release-asset-url backend "$asset_ext" 2>/dev/null)" + [ -n "$TACHYON_BACKEND_URL" ] || fail "The Tachyon release does not contain a tachyon .$asset_ext package" - FORKOP_APP_URL="$(printf '%s' "$FORKOP_RELEASE_JSON" | install_json_ucode release-asset-url app "$asset_ext" 2>/dev/null)" - [ -n "$FORKOP_APP_URL" ] || fail "The Forkop release does not contain a luci-app-forkop .$asset_ext package" + TACHYON_APP_URL="$(printf '%s' "$TACHYON_RELEASE_JSON" | install_json_ucode release-asset-url app "$asset_ext" 2>/dev/null)" + [ -n "$TACHYON_APP_URL" ] || fail "The Tachyon release does not contain a luci-app-tachyon .$asset_ext package" - FORKOP_BACKEND_NAME="$(basename "$FORKOP_BACKEND_URL")" - FORKOP_APP_NAME="$(basename "$FORKOP_APP_URL")" - FORKOP_PACKAGE_VERSION="$(extract_package_version "$FORKOP_BACKEND_NAME")" + TACHYON_BACKEND_NAME="$(basename "$TACHYON_BACKEND_URL")" + TACHYON_APP_NAME="$(basename "$TACHYON_APP_URL")" + TACHYON_PACKAGE_VERSION="$(extract_package_version "$TACHYON_BACKEND_NAME")" - FORKOP_I18N_URL="" - FORKOP_I18N_NAME="" + TACHYON_I18N_URL="" + TACHYON_I18N_NAME="" - if [ "$FORKOP_I18N_REQUESTED" -eq 1 ]; then - FORKOP_I18N_URL="$(printf '%s' "$FORKOP_RELEASE_JSON" | install_json_ucode release-asset-url i18n "$asset_ext" 2>/dev/null)" - [ -n "$FORKOP_I18N_URL" ] || fail "The Forkop release does not contain a luci-i18n-forkop-ru .$asset_ext package" - FORKOP_I18N_NAME="$(basename "$FORKOP_I18N_URL")" + if [ "$TACHYON_I18N_REQUESTED" -eq 1 ]; then + TACHYON_I18N_URL="$(printf '%s' "$TACHYON_RELEASE_JSON" | install_json_ucode release-asset-url i18n "$asset_ext" 2>/dev/null)" + [ -n "$TACHYON_I18N_URL" ] || fail "The Tachyon release does not contain a luci-i18n-tachyon-ru .$asset_ext package" + TACHYON_I18N_NAME="$(basename "$TACHYON_I18N_URL")" fi } @@ -1436,11 +1446,11 @@ select_sing_box_installation() { answer="" default_choice=1 - if [ "$FORKOP_LEGACY_DETECTED" -eq 1 ] && + if [ "$TACHYON_LEGACY_DETECTED" -eq 1 ] && [ -r /etc/init.d/sing-box ] && grep -Fq 'managed sing-box service for binary variants' /etc/init.d/sing-box; then SING_BOX_INSTALL_VARIANT="extended-compressed" - msg "The legacy binary-managed sing-box variant will be reinstalled for Forkop" + msg "The legacy binary-managed sing-box variant will be reinstalled for Tachyon" return 0 fi @@ -1499,9 +1509,9 @@ install_selected_sing_box() { ;; esac - [ -x /usr/bin/forkop ] || fail "forkop backend must be installed before sing-box component action" - msg "Installing selected sing-box variant through Forkop ucode backend" - if ! /usr/bin/forkop component_action sing_box "$action" >"$output_file" 2>&1; then + [ -x /usr/bin/tachyon ] || fail "tachyon backend must be installed before sing-box component action" + msg "Installing selected sing-box variant through Tachyon ucode backend" + if ! /usr/bin/tachyon component_action sing_box "$action" >"$output_file" 2>&1; then cat "$output_file" >&2 2>/dev/null || true fail "Failed to install selected sing-box variant" fi @@ -1511,31 +1521,53 @@ cleanup_legacy_installation() { state_file="$TMP_DIR/install-state.env" install_json_ucode installer-cleanup-legacy >"$state_file" || - fail "Failed to prepare the system before Forkop package installation" + fail "Failed to prepare the system before Tachyon package installation" # shellcheck disable=SC1090 . "$state_file" } detect_legacy_installation() { - FORKOP_LEGACY_DETECTED=0 + TACHYON_LEGACY_DETECTED=0 + TACHYON_FORKOP_MIGRATION=0 LEGACY_CONFIG_BACKUP="" - pkg_is_installed "$LEGACY_BACKEND_PACKAGE" || return 0 + if pkg_is_installed "forkop" || pkg_is_installed "luci-app-forkop"; then + TACHYON_LEGACY_DETECTED=1 + TACHYON_FORKOP_MIGRATION=1 + fi - FORKOP_LEGACY_DETECTED=1 - for legacy_config_path in \ - "/etc/config/$LEGACY_BACKEND_PACKAGE" \ - "/etc/config/$LEGACY_CONFIG_PACKAGE_ALT"; do + for legacy_config_path in "/etc/config/forkop" "/etc/config/forkop_plus"; do if [ -r "$legacy_config_path" ]; then LEGACY_CONFIG_BACKUP="$TMP_DIR/legacy-config.backup" cp "$legacy_config_path" "$LEGACY_CONFIG_BACKUP" || fail "Failed to back up the legacy configuration" + TACHYON_LEGACY_DETECTED=1 + TACHYON_FORKOP_MIGRATION=1 break fi done - msg "Legacy installation detected; its packages will be removed and its configuration will be upgraded" + if [ "$TACHYON_LEGACY_DETECTED" -eq 0 ]; then + if pkg_is_installed "$LEGACY_BACKEND_PACKAGE"; then + TACHYON_LEGACY_DETECTED=1 + fi + for legacy_config_path in \ + "/etc/config/$LEGACY_BACKEND_PACKAGE" \ + "/etc/config/$LEGACY_CONFIG_PACKAGE_ALT"; do + if [ -r "$legacy_config_path" ]; then + LEGACY_CONFIG_BACKUP="$TMP_DIR/legacy-config.backup" + cp "$legacy_config_path" "$LEGACY_CONFIG_BACKUP" || + fail "Failed to back up the legacy configuration" + TACHYON_LEGACY_DETECTED=1 + break + fi + done + fi + + if [ "$TACHYON_LEGACY_DETECTED" -eq 1 ]; then + msg "Legacy installation detected; its packages will be removed and its configuration will be upgraded" + fi } decide_i18n_installation() { @@ -1543,22 +1575,22 @@ decide_i18n_installation() { detect_installer_language - if pkg_is_installed "luci-i18n-forkop-ru"; then - FORKOP_I18N_REQUESTED=1 + if pkg_is_installed "luci-i18n-tachyon-ru"; then + TACHYON_I18N_REQUESTED=1 msg "$(installer_text i18n_installed)" return 0 fi - if [ "$FORKOP_LEGACY_DETECTED" -eq 1 ] && + if [ "$TACHYON_LEGACY_DETECTED" -eq 1 ] && pkg_is_installed "luci-i18n-${LEGACY_BACKEND_PACKAGE}-ru"; then - FORKOP_I18N_REQUESTED=1 + TACHYON_I18N_REQUESTED=1 msg "$(installer_text i18n_installed)" return 0 fi case "$luci_lang" in ru|ru_*|ru-*) - FORKOP_I18N_REQUESTED=1 + TACHYON_I18N_REQUESTED=1 INSTALLER_LANG="ru" msg "$(installer_text luci_ru)" return 0 @@ -1566,7 +1598,7 @@ decide_i18n_installation() { esac if confirm_prompt "$(installer_text i18n_prompt)"; then - FORKOP_I18N_REQUESTED=1 + TACHYON_I18N_REQUESTED=1 INSTALLER_LANG="ru" return 0 fi @@ -1574,42 +1606,47 @@ decide_i18n_installation() { warn "$(installer_text i18n_skip)" } -download_forkop_packages() { - FORKOP_BACKEND_FILE="$TMP_DIR/$FORKOP_BACKEND_NAME" - FORKOP_APP_FILE="$TMP_DIR/$FORKOP_APP_NAME" - FORKOP_I18N_FILE="" +download_tachyon_packages() { + TACHYON_BACKEND_FILE="$TMP_DIR/$TACHYON_BACKEND_NAME" + TACHYON_APP_FILE="$TMP_DIR/$TACHYON_APP_NAME" + TACHYON_I18N_FILE="" - download_with_retry "$FORKOP_BACKEND_URL" "$FORKOP_BACKEND_FILE" "$FORKOP_BACKEND_NAME" || fail "Failed to download $FORKOP_BACKEND_NAME" - download_with_retry "$FORKOP_APP_URL" "$FORKOP_APP_FILE" "$FORKOP_APP_NAME" || fail "Failed to download $FORKOP_APP_NAME" + download_with_retry "$TACHYON_BACKEND_URL" "$TACHYON_BACKEND_FILE" "$TACHYON_BACKEND_NAME" || fail "Failed to download $TACHYON_BACKEND_NAME" + download_with_retry "$TACHYON_APP_URL" "$TACHYON_APP_FILE" "$TACHYON_APP_NAME" || fail "Failed to download $TACHYON_APP_NAME" - if [ -n "$FORKOP_I18N_URL" ]; then - FORKOP_I18N_FILE="$TMP_DIR/$FORKOP_I18N_NAME" - download_with_retry "$FORKOP_I18N_URL" "$FORKOP_I18N_FILE" "$FORKOP_I18N_NAME" || fail "Failed to download $FORKOP_I18N_NAME" + if [ -n "$TACHYON_I18N_URL" ]; then + TACHYON_I18N_FILE="$TMP_DIR/$TACHYON_I18N_NAME" + download_with_retry "$TACHYON_I18N_URL" "$TACHYON_I18N_FILE" "$TACHYON_I18N_NAME" || fail "Failed to download $TACHYON_I18N_NAME" fi } install_backend_package() { - pkg_install_files "$FORKOP_BACKEND_FILE" || fail "forkop installation failed" + pkg_install_files "$TACHYON_BACKEND_FILE" || fail "tachyon installation failed" } migrate_legacy_configuration() { - [ "$FORKOP_LEGACY_DETECTED" -eq 1 ] || return 0 + [ "$TACHYON_LEGACY_DETECTED" -eq 1 ] || return 0 if [ -n "$LEGACY_CONFIG_BACKUP" ]; then - cp "$LEGACY_CONFIG_BACKUP" /etc/config/forkop || + cp "$LEGACY_CONFIG_BACKUP" /etc/config/tachyon || fail "Failed to restore the legacy configuration for migration" - chmod 0644 /etc/config/forkop || - fail "Failed to set permissions on the Forkop configuration" + chmod 0644 /etc/config/tachyon || + fail "Failed to set permissions on the Tachyon configuration" - msg "Migrating the legacy configuration to Forkop" - if ! FORKOP_CONFIG_NAME="forkop" \ - FORKOP_LIB="/usr/lib/forkop" \ - ucode -L /usr/lib/forkop /usr/lib/forkop/config/migration.uc migrate-podkop; then - cp "$LEGACY_CONFIG_BACKUP" /etc/config/forkop 2>/dev/null || true + msg "Migrating the legacy configuration to Tachyon" + local migration_mode="migrate-podkop" + if [ "$TACHYON_FORKOP_MIGRATION" -eq 1 ]; then + migration_mode="migrate" + fi + + if ! TACHYON_CONFIG_NAME="tachyon" \ + TACHYON_LIB="/usr/lib/tachyon" \ + ucode -L /usr/lib/tachyon /usr/lib/tachyon/config/migration.uc "$migration_mode"; then + cp "$LEGACY_CONFIG_BACKUP" /etc/config/tachyon 2>/dev/null || true fail "Legacy configuration migration failed; the original configuration was restored" fi else - warn "The legacy package had no readable configuration; Forkop defaults will be used" + warn "The legacy package had no readable configuration; Tachyon defaults will be used" fi install_json_ucode installer-finalize-legacy || @@ -1617,17 +1654,17 @@ migrate_legacy_configuration() { } install_ui_packages() { - pkg_install_files "$FORKOP_APP_FILE" || fail "luci-app-forkop installation failed" + pkg_install_files "$TACHYON_APP_FILE" || fail "luci-app-tachyon installation failed" - if [ -n "$FORKOP_I18N_FILE" ]; then - pkg_install_files "$FORKOP_I18N_FILE" || fail "luci-i18n-forkop-ru installation failed" + if [ -n "$TACHYON_I18N_FILE" ]; then + pkg_install_files "$TACHYON_I18N_FILE" || fail "luci-i18n-tachyon-ru installation failed" fi } post_install() { - FORKOP_WAS_ENABLED="$FORKOP_WAS_ENABLED" FORKOP_WAS_RUNNING="$FORKOP_WAS_RUNNING" \ + TACHYON_WAS_ENABLED="$TACHYON_WAS_ENABLED" TACHYON_WAS_RUNNING="$TACHYON_WAS_RUNNING" \ install_json_ucode installer-post-install || - fail "Failed to complete Forkop post-install actions" + fail "Failed to complete Tachyon post-install actions" } main() { @@ -1647,8 +1684,8 @@ main() { pkg_list_update || fail "Failed to update package lists" ensure_bootstrap_ucode_runtime - resolve_forkop_release - download_forkop_packages + resolve_tachyon_release + download_tachyon_packages cleanup_legacy_installation install_backend_package @@ -1657,9 +1694,9 @@ main() { install_selected_sing_box post_install - msg "Forkop $FORKOP_PACKAGE_VERSION has been installed successfully" - msg "Source release: ${REPO_OWNER}/${REPO_NAME}@${FORKOP_RELEASE_TAG}" - warn "Open LuCI and review your rules before enabling Forkop" + msg "Tachyon $TACHYON_PACKAGE_VERSION has been installed successfully" + msg "Source release: ${REPO_OWNER}/${REPO_NAME}@${TACHYON_RELEASE_TAG}" + warn "Open LuCI and review your rules before enabling Tachyon" } main "$@" diff --git a/luci-app-tachyon/Makefile b/luci-app-tachyon/Makefile index b65c1f3e..04f1bd78 100644 --- a/luci-app-tachyon/Makefile +++ b/luci-app-tachyon/Makefile @@ -1,34 +1,34 @@ include $(TOPDIR)/rules.mk -PKG_NAME:=luci-app-forkop +PKG_NAME:=luci-app-tachyon -FORKOP_SOURCE_VERSION:=$(or $(FORKOP_PACKAGE_VERSION),$(FORKOP_VERSION)) -FORKOP_HAS_RELEASE_VERSION:=$(if $(filter dev,$(FORKOP_SOURCE_VERSION)),,$(FORKOP_SOURCE_VERSION)) -FORKOP_COMPILED_VERSION:=$(if $(FORKOP_HAS_RELEASE_VERSION),$(FORKOP_SOURCE_VERSION),$(or $(FORKOP_SOURCE_VERSION),dev)) -FORKOP_RELEASE_VERSION_VALID:=$(if $(FORKOP_HAS_RELEASE_VERSION),$(shell printf '%s\n' '$(FORKOP_SOURCE_VERSION)' | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$$' && printf '1'),1) +TACHYON_SOURCE_VERSION:=$(or $(TACHYON_PACKAGE_VERSION),$(TACHYON_VERSION)) +TACHYON_HAS_RELEASE_VERSION:=$(if $(filter dev,$(TACHYON_SOURCE_VERSION)),,$(TACHYON_SOURCE_VERSION)) +TACHYON_COMPILED_VERSION:=$(if $(TACHYON_HAS_RELEASE_VERSION),$(TACHYON_SOURCE_VERSION),$(or $(TACHYON_SOURCE_VERSION),dev)) +TACHYON_RELEASE_VERSION_VALID:=$(if $(TACHYON_HAS_RELEASE_VERSION),$(shell printf '%s\n' '$(TACHYON_SOURCE_VERSION)' | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$$' && printf '1'),1) -ifeq ($(FORKOP_RELEASE_VERSION_VALID),) -$(error FORKOP_PACKAGE_VERSION and FORKOP_VERSION must use x.y.z format) +ifeq ($(TACHYON_RELEASE_VERSION_VALID),) +$(error TACHYON_PACKAGE_VERSION and TACHYON_VERSION must use x.y.z format) endif -PKG_VERSION:=$(or $(FORKOP_HAS_RELEASE_VERSION),0.0.0) +PKG_VERSION:=$(or $(TACHYON_HAS_RELEASE_VERSION),0.0.0) PKG_RELEASE:= PKG_PO_VERSION:=$(PKG_VERSION) -LUCI_TITLE:=LuCI Forkop app -LUCI_DEPENDS:=+luci-base +forkop +LUCI_TITLE:=LuCI Tachyon app +LUCI_DEPENDS:=+luci-base +tachyon LUCI_PKGARCH:=all LUCI_LANG.ru:=Русский (Russian) LUCI_LANG.en:=English LUCI_MAINTAINER:=Dushnilin -LUCI_DESCRIPTION:=Rule-based Forkop LuCI app with hybrid sing-box + zapret orchestration +LUCI_DESCRIPTION:=Rule-based Tachyon LuCI app with hybrid sing-box + zapret orchestration LUCI_MINIFY_JS:=0 PKG_LICENSE:=GPL-2.0-or-later LUCI_LANGUAGES:=en ru define Build/Prepare/$(PKG_NAME) - sed -i -e 's/__COMPILED_VERSION_VARIABLE__/$(FORKOP_COMPILED_VERSION)/g' $(PKG_BUILD_DIR)/htdocs/luci-static/resources/view/forkop/main.js || true + sed -i -e 's/__COMPILED_VERSION_VARIABLE__/$(TACHYON_COMPILED_VERSION)/g' $(PKG_BUILD_DIR)/htdocs/luci-static/resources/view/tachyon/main.js || true endef include $(TOPDIR)/feeds/luci/luci.mk diff --git a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/dashboard.js b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/dashboard.js index f9cf659f..bb47ad49 100644 --- a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/dashboard.js +++ b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/dashboard.js @@ -4,7 +4,7 @@ "require ui"; "require uci"; "require fs"; -"require view.forkop.main as main"; +"require view.tachyon.main as main"; function createDashboardContent(section) { const o = section.option(form.DummyValue, "_mount_node"); diff --git a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/diagnostic.js b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/diagnostic.js index 7f203d6a..b2e06268 100644 --- a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/diagnostic.js +++ b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/diagnostic.js @@ -4,7 +4,7 @@ "require ui"; "require uci"; "require fs"; -"require view.forkop.main as main"; +"require view.tachyon.main as main"; function createDiagnosticContent(section) { const o = section.option(form.DummyValue, "_mount_node"); diff --git a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/local_devices.js b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/local_devices.js index 0454c831..b9d32c67 100644 --- a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/local_devices.js +++ b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/local_devices.js @@ -2,7 +2,7 @@ "require baseclass"; "require rpc"; "require ui"; -"require view.forkop.main as main"; +"require view.tachyon.main as main"; const callHostHints = rpc.declare({ object: "luci-rpc", diff --git a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js index 3c0f5432..38aec562 100644 --- a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js +++ b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/main.js @@ -979,7 +979,7 @@ function downloadAsTxt(text, filename) { URL.revokeObjectURL(link.href); } -// src/forkop/services/logger.service.ts +// src/tachyon/services/logger.service.ts var Logger = class { constructor() { this.logs = []; @@ -1051,9 +1051,9 @@ async function withTimeout(promise, timeoutMs, operationName, timeoutMessage = _ } // src/constants.ts -var FORKOP_UCI_PACKAGE = "forkop"; -var FORKOP_LUCI_APP_VERSION = "__COMPILED_VERSION_VARIABLE__"; -var FORKOP_ACTION_PROVIDERS_AVAILABILITY_EVENT = "forkop:action-providers-availability"; +var TACHYON_UCI_PACKAGE = "tachyon"; +var TACHYON_LUCI_APP_VERSION = "__COMPILED_VERSION_VARIABLE__"; +var TACHYON_ACTION_PROVIDERS_AVAILABILITY_EVENT = "tachyon:action-providers-availability"; var FAKEIP_CHECK_DOMAIN = "fakeip.podkop.fyi"; var IP_CHECK_DOMAIN = "ip.podkop.fyi"; var DEFAULT_LATENCY_TEST_URL = "https://www.gstatic.com/generate_204"; @@ -1897,7 +1897,7 @@ function prettyBytes(n) { return n + " " + unit; } -// src/forkop/tabs/dashboard/partials/renderSections.ts +// src/tachyon/tabs/dashboard/partials/renderSections.ts function renderFailedState() { return E( "div", @@ -2277,7 +2277,7 @@ function renderSections(props) { return renderDefaultState(props); } -// src/forkop/tabs/dashboard/partials/renderWidget.ts +// src/tachyon/tabs/dashboard/partials/renderWidget.ts function renderFailedState2() { return E( "div", @@ -2339,7 +2339,7 @@ function renderWidget(props) { return renderDefaultState2(props); } -// src/forkop/tabs/dashboard/render.ts +// src/tachyon/tabs/dashboard/render.ts function render() { return E( "div", @@ -2355,7 +2355,7 @@ function render() { role: "status" }, _( - "Forkop service is stopped. Start the service to display the dashboard." + "Tachyon service is stopped. Start the service to display the dashboard." ) ), E("div", { class: "fkp_dashboard-page__content" }, [ @@ -2474,12 +2474,12 @@ function copyToClipboard(text) { document.body.removeChild(textarea); } -// src/forkop/methods/custom/getConfigSections.ts +// src/tachyon/methods/custom/getConfigSections.ts async function getConfigSections() { - return uci.load(FORKOP_UCI_PACKAGE).then(() => uci.sections(FORKOP_UCI_PACKAGE)); + return uci.load(TACHYON_UCI_PACKAGE).then(() => uci.sections(TACHYON_UCI_PACKAGE)); } -// src/forkop/runtimeTags.ts +// src/tachyon/runtimeTags.ts var RESERVED_RUNTIME_TAGS = /* @__PURE__ */ new Set([ "dns-server", "fakeip-server", @@ -2507,8 +2507,8 @@ function getOutboundTagBySection(sectionName) { return allocateRuntimeTag(sectionName, "out"); } -// src/forkop/methods/shell/callBaseMethod.ts -async function callBaseMethod(method, args = [], command = "/usr/bin/forkop", options = {}) { +// src/tachyon/methods/shell/callBaseMethod.ts +async function callBaseMethod(method, args = [], command = "/usr/bin/tachyon", options = {}) { try { const response = await executeShellCommand({ command, @@ -2547,9 +2547,9 @@ async function callBaseMethod(method, args = [], command = "/usr/bin/forkop", op } } -// src/forkop/types.ts -var Forkop; -((Forkop2) => { +// src/tachyon/types.ts +var Tachyon; +((Tachyon2) => { let AvailableMethods; ((AvailableMethods2) => { AvailableMethods2["CHECK_DNS_AVAILABLE"] = "check_dns_available"; @@ -2591,7 +2591,7 @@ var Forkop; AvailableMethods2["COMPONENT_UPDATE_CHECK_CACHE"] = "component_update_check_cache"; AvailableMethods2["SUBSCRIPTION_UPDATE_ASYNC"] = "subscription_update_async"; AvailableMethods2["SUBSCRIPTION_UPDATE_STATUS"] = "subscription_update_status"; - })(AvailableMethods = Forkop2.AvailableMethods || (Forkop2.AvailableMethods = {})); + })(AvailableMethods = Tachyon2.AvailableMethods || (Tachyon2.AvailableMethods = {})); let AvailableClashAPIMethods; ((AvailableClashAPIMethods2) => { AvailableClashAPIMethods2["GET_PROXIES"] = "get_proxies"; @@ -2602,10 +2602,10 @@ var Forkop; AvailableClashAPIMethods2["SET_GROUP_PROXY"] = "set_group_proxy"; AvailableClashAPIMethods2["CLOSE_CONNECTION"] = "close_connection"; AvailableClashAPIMethods2["CLOSE_ALL_CONNECTIONS"] = "close_all_connections"; - })(AvailableClashAPIMethods = Forkop2.AvailableClashAPIMethods || (Forkop2.AvailableClashAPIMethods = {})); -})(Forkop || (Forkop = {})); + })(AvailableClashAPIMethods = Tachyon2.AvailableClashAPIMethods || (Tachyon2.AvailableClashAPIMethods = {})); +})(Tachyon || (Tachyon = {})); -// src/forkop/helpers/isTransientRpcError.ts +// src/tachyon/helpers/isTransientRpcError.ts var TRANSIENT_RPC_ERROR_PATTERNS = [ "no related rpc reply", "request aborted", @@ -2621,7 +2621,7 @@ function isTransientRpcError(message) { ); } -// src/forkop/methods/shell/index.ts +// src/tachyon/methods/shell/index.ts var SUBSCRIPTION_UPDATE_RPC_TIMEOUT_MS = 15e3; var SUBSCRIPTION_UPDATE_POLL_INTERVAL_MS = 1500; var UI_ACTION_RPC_TIMEOUT_MS = 15e3; @@ -2635,7 +2635,7 @@ var COMPONENT_ACTION_POLL_INTERVAL_MS = 1500; var COMPONENT_ACTION_STATUS_REFRESH_INTERVAL_MS = 15e3; var COMPONENT_ACTION_SELF_UPDATE_SETTLE_MS = 3e4; var COMPONENT_ACTION_TRANSIENT_RPC_GRACE_MS = 3e4; -var COMPONENT_ACTION_STATE_DIR = "/var/run/forkop/component-actions"; +var COMPONENT_ACTION_STATE_DIR = "/var/run/tachyon/component-actions"; var GET_UI_STATE_RPC_TIMEOUT_MS = 3e3; function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); @@ -2708,9 +2708,9 @@ async function readComponentActionState(jobId) { return null; } } -async function readForkopVersion() { +async function readTachyonVersion() { const response = await executeShellCommand({ - command: "/usr/bin/forkop", + command: "/usr/bin/tachyon", args: ["show_version"], timeout: COMPONENT_ACTION_RPC_TIMEOUT_MS }); @@ -2721,9 +2721,9 @@ async function readForkopVersion() { } async function isComponentActionStillRunning(jobId, component, action) { const response = await callBaseMethod( - Forkop.AvailableMethods.GET_UI_STATE, + Tachyon.AvailableMethods.GET_UI_STATE, [], - "/usr/bin/forkop", + "/usr/bin/tachyon", { timeout: GET_UI_STATE_RPC_TIMEOUT_MS } ); return response.success && response.data.actions.component.some( @@ -2760,134 +2760,134 @@ function createTransientRpcGraceTracker(graceMs) { } }; } -var ForkopShellMethods = { +var TachyonShellMethods = { checkDNSAvailable: async () => callBaseMethod( - Forkop.AvailableMethods.CHECK_DNS_AVAILABLE + Tachyon.AvailableMethods.CHECK_DNS_AVAILABLE ), checkFakeIP: async () => callBaseMethod( - Forkop.AvailableMethods.CHECK_FAKEIP + Tachyon.AvailableMethods.CHECK_FAKEIP ), checkNftRules: async () => callBaseMethod( - Forkop.AvailableMethods.CHECK_NFT_RULES + Tachyon.AvailableMethods.CHECK_NFT_RULES ), checkZapretRuntime: async () => callBaseMethod( - Forkop.AvailableMethods.CHECK_ZAPRET_RUNTIME + Tachyon.AvailableMethods.CHECK_ZAPRET_RUNTIME ), checkZapret2Runtime: async () => callBaseMethod( - Forkop.AvailableMethods.CHECK_ZAPRET2_RUNTIME + Tachyon.AvailableMethods.CHECK_ZAPRET2_RUNTIME ), checkByedpiRuntime: async () => callBaseMethod( - Forkop.AvailableMethods.CHECK_BYEDPI_RUNTIME + Tachyon.AvailableMethods.CHECK_BYEDPI_RUNTIME ), checkInboundsConfig: async () => callBaseMethod( - Forkop.AvailableMethods.CHECK_INBOUNDS_CONFIG + Tachyon.AvailableMethods.CHECK_INBOUNDS_CONFIG ), - getStatus: async () => callBaseMethod(Forkop.AvailableMethods.GET_STATUS), + getStatus: async () => callBaseMethod(Tachyon.AvailableMethods.GET_STATUS), getOutboundLink: async (section, tag) => callBaseMethod( - Forkop.AvailableMethods.GET_OUTBOUND_LINK, + Tachyon.AvailableMethods.GET_OUTBOUND_LINK, [section, tag] ), getOutboundLinkStates: async (section) => callBaseMethod( - Forkop.AvailableMethods.GET_OUTBOUND_LINK_STATES, + Tachyon.AvailableMethods.GET_OUTBOUND_LINK_STATES, [section] ), getOutboundMetadata: async (section) => callBaseMethod( - Forkop.AvailableMethods.GET_OUTBOUND_METADATA, + Tachyon.AvailableMethods.GET_OUTBOUND_METADATA, [section] ), getSubscriptionMetadata: async (section) => callBaseMethod( - Forkop.AvailableMethods.GET_SUBSCRIPTION_METADATA, + Tachyon.AvailableMethods.GET_SUBSCRIPTION_METADATA, [section] ), checkSingBox: async () => callBaseMethod( - Forkop.AvailableMethods.CHECK_SING_BOX + Tachyon.AvailableMethods.CHECK_SING_BOX ), checkInbounds: async () => callBaseMethod( - Forkop.AvailableMethods.CHECK_INBOUNDS + Tachyon.AvailableMethods.CHECK_INBOUNDS ), getSingBoxStatus: async () => callBaseMethod( - Forkop.AvailableMethods.GET_SING_BOX_STATUS + Tachyon.AvailableMethods.GET_SING_BOX_STATUS ), getZapretStatus: async () => callBaseMethod( - Forkop.AvailableMethods.GET_ZAPRET_STATUS + Tachyon.AvailableMethods.GET_ZAPRET_STATUS ), getZapret2Status: async () => callBaseMethod( - Forkop.AvailableMethods.GET_ZAPRET2_STATUS + Tachyon.AvailableMethods.GET_ZAPRET2_STATUS ), getByedpiStatus: async () => callBaseMethod( - Forkop.AvailableMethods.GET_BYEDPI_STATUS + Tachyon.AvailableMethods.GET_BYEDPI_STATUS ), - getClashApiProxies: async () => callBaseMethod(Forkop.AvailableMethods.CLASH_API, [ - Forkop.AvailableClashAPIMethods.GET_PROXIES + getClashApiProxies: async () => callBaseMethod(Tachyon.AvailableMethods.CLASH_API, [ + Tachyon.AvailableClashAPIMethods.GET_PROXIES ]), - getClashApiConnections: async () => callBaseMethod(Forkop.AvailableMethods.CLASH_API, [ - Forkop.AvailableClashAPIMethods.GET_CONNECTIONS + getClashApiConnections: async () => callBaseMethod(Tachyon.AvailableMethods.CLASH_API, [ + Tachyon.AvailableClashAPIMethods.GET_CONNECTIONS ]), getClashApiProxyLatency: async (tag, timeout = "5000") => callBaseMethod( - Forkop.AvailableMethods.CLASH_API, - [Forkop.AvailableClashAPIMethods.GET_PROXY_LATENCY, tag, timeout] + Tachyon.AvailableMethods.CLASH_API, + [Tachyon.AvailableClashAPIMethods.GET_PROXY_LATENCY, tag, timeout] ), getClashApiProxyLatencies: async (tags) => callBaseMethod( - Forkop.AvailableMethods.CLASH_API, + Tachyon.AvailableMethods.CLASH_API, [ - Forkop.AvailableClashAPIMethods.GET_PROXY_LATENCIES, + Tachyon.AvailableClashAPIMethods.GET_PROXY_LATENCIES, JSON.stringify(tags), "5000" ] ), getClashApiGroupLatency: async (tag) => callBaseMethod( - Forkop.AvailableMethods.CLASH_API, - [Forkop.AvailableClashAPIMethods.GET_GROUP_LATENCY, tag, "10000"] + Tachyon.AvailableMethods.CLASH_API, + [Tachyon.AvailableClashAPIMethods.GET_GROUP_LATENCY, tag, "10000"] ), - setClashApiGroupProxy: async (group, proxy) => callBaseMethod(Forkop.AvailableMethods.CLASH_API, [ - Forkop.AvailableClashAPIMethods.SET_GROUP_PROXY, + setClashApiGroupProxy: async (group, proxy) => callBaseMethod(Tachyon.AvailableMethods.CLASH_API, [ + Tachyon.AvailableClashAPIMethods.SET_GROUP_PROXY, group, proxy ]), - closeClashApiConnection: async (connectionId) => callBaseMethod(Forkop.AvailableMethods.CLASH_API, [ - Forkop.AvailableClashAPIMethods.CLOSE_CONNECTION, + closeClashApiConnection: async (connectionId) => callBaseMethod(Tachyon.AvailableMethods.CLASH_API, [ + Tachyon.AvailableClashAPIMethods.CLOSE_CONNECTION, connectionId ]), - closeAllClashApiConnections: async () => callBaseMethod(Forkop.AvailableMethods.CLASH_API, [ - Forkop.AvailableClashAPIMethods.CLOSE_ALL_CONNECTIONS + closeAllClashApiConnections: async () => callBaseMethod(Tachyon.AvailableMethods.CLASH_API, [ + Tachyon.AvailableClashAPIMethods.CLOSE_ALL_CONNECTIONS ]), enable: async () => callBaseMethod( - Forkop.AvailableMethods.ENABLE, + Tachyon.AvailableMethods.ENABLE, [], - "/etc/init.d/forkop" + "/etc/init.d/tachyon" ), disable: async () => callBaseMethod( - Forkop.AvailableMethods.DISABLE, + Tachyon.AvailableMethods.DISABLE, [], - "/etc/init.d/forkop" + "/etc/init.d/tachyon" ), - globalCheck: async (masked = true) => callBaseMethod(Forkop.AvailableMethods.GLOBAL_CHECK, [ + globalCheck: async (masked = true) => callBaseMethod(Tachyon.AvailableMethods.GLOBAL_CHECK, [ masked ? "masked" : "raw" ]), - showSingBoxConfig: async (masked = true) => callBaseMethod(Forkop.AvailableMethods.SHOW_SING_BOX_CONFIG, [ + showSingBoxConfig: async (masked = true) => callBaseMethod(Tachyon.AvailableMethods.SHOW_SING_BOX_CONFIG, [ masked ? "masked" : "raw" ]), - checkLogs: async () => callBaseMethod(Forkop.AvailableMethods.CHECK_LOGS), - checkSingBoxLogs: async () => callBaseMethod(Forkop.AvailableMethods.CHECK_SING_BOX_LOGS), + checkLogs: async () => callBaseMethod(Tachyon.AvailableMethods.CHECK_LOGS), + checkSingBoxLogs: async () => callBaseMethod(Tachyon.AvailableMethods.CHECK_SING_BOX_LOGS), getSystemInfo: async () => callBaseMethod( - Forkop.AvailableMethods.GET_SYSTEM_INFO + Tachyon.AvailableMethods.GET_SYSTEM_INFO ), getServerCapabilities: async () => callBaseMethod( - Forkop.AvailableMethods.GET_SERVER_CAPABILITIES + Tachyon.AvailableMethods.GET_SERVER_CAPABILITIES ), getUiCapabilities: async () => callBaseMethod( - Forkop.AvailableMethods.GET_UI_CAPABILITIES + Tachyon.AvailableMethods.GET_UI_CAPABILITIES ), getUiState: async () => callBaseMethod( - Forkop.AvailableMethods.GET_UI_STATE, + Tachyon.AvailableMethods.GET_UI_STATE, [], - "/usr/bin/forkop", + "/usr/bin/tachyon", { timeout: GET_UI_STATE_RPC_TIMEOUT_MS } ), serviceActionStart: async (action) => { const response = await executeShellCommand({ - command: "/usr/bin/forkop", - args: [Forkop.AvailableMethods.SERVICE_ACTION_ASYNC, action], + command: "/usr/bin/tachyon", + args: [Tachyon.AvailableMethods.SERVICE_ACTION_ASYNC, action], timeout: UI_ACTION_RPC_TIMEOUT_MS }); const parsedResponse = parseUiActionStartResult(response); @@ -2905,8 +2905,8 @@ var ForkopShellMethods = { }, serviceActionStatus: async (jobId) => { const response = await executeShellCommand({ - command: "/usr/bin/forkop", - args: [Forkop.AvailableMethods.SERVICE_ACTION_STATUS, jobId], + command: "/usr/bin/tachyon", + args: [Tachyon.AvailableMethods.SERVICE_ACTION_STATUS, jobId], timeout: UI_ACTION_RPC_TIMEOUT_MS }); const parsedResponse = parseServiceActionState(response); @@ -2925,7 +2925,7 @@ var ForkopShellMethods = { waitServiceActionJob: async (jobId, startedAt = Date.now()) => { while (Date.now() - startedAt < SERVICE_ACTION_TIMEOUT_MS) { await sleep(SERVICE_ACTION_POLL_INTERVAL_MS); - const response = await ForkopShellMethods.serviceActionStatus(jobId); + const response = await TachyonShellMethods.serviceActionStatus(jobId); if (!response.success) { return response; } @@ -2941,9 +2941,9 @@ var ForkopShellMethods = { }, latencyTestStart: async (latencyType, section, tag, timeout) => { const response = await executeShellCommand({ - command: "/usr/bin/forkop", + command: "/usr/bin/tachyon", args: [ - Forkop.AvailableMethods.LATENCY_TEST_ASYNC, + Tachyon.AvailableMethods.LATENCY_TEST_ASYNC, latencyType, section, tag, @@ -2966,8 +2966,8 @@ var ForkopShellMethods = { }, latencyTestStatus: async (jobId) => { const response = await executeShellCommand({ - command: "/usr/bin/forkop", - args: [Forkop.AvailableMethods.LATENCY_TEST_STATUS, jobId], + command: "/usr/bin/tachyon", + args: [Tachyon.AvailableMethods.LATENCY_TEST_STATUS, jobId], timeout: UI_ACTION_RPC_TIMEOUT_MS }); const parsedResponse = parseLatencyActionState(response); @@ -2989,7 +2989,7 @@ var ForkopShellMethods = { ); while (Date.now() - startedAt < LATENCY_TEST_TIMEOUT_MS) { await sleep(LATENCY_TEST_POLL_INTERVAL_MS); - const response = await ForkopShellMethods.latencyTestStatus(jobId); + const response = await TachyonShellMethods.latencyTestStatus(jobId); if (!response.success) { if (transientRpc.shouldContinue(response.error)) { continue; @@ -3009,8 +3009,8 @@ var ForkopShellMethods = { }, uiActionAck: async (kind, jobId) => { const response = await executeShellCommand({ - command: "/usr/bin/forkop", - args: [Forkop.AvailableMethods.UI_ACTION_ACK, kind, jobId], + command: "/usr/bin/tachyon", + args: [Tachyon.AvailableMethods.UI_ACTION_ACK, kind, jobId], timeout: UI_ACTION_RPC_TIMEOUT_MS }); const parsedResponse = parseUiActionStartResult(response); @@ -3024,8 +3024,8 @@ var ForkopShellMethods = { }, componentActionStart: async (component, action) => { const response = await executeShellCommand({ - command: "/usr/bin/forkop", - args: [Forkop.AvailableMethods.COMPONENT_ACTION_ASYNC, component, action], + command: "/usr/bin/tachyon", + args: [Tachyon.AvailableMethods.COMPONENT_ACTION_ASYNC, component, action], timeout: COMPONENT_ACTION_RPC_TIMEOUT_MS }); const parsedResponse = parseComponentActionStartResult(response); @@ -3039,8 +3039,8 @@ var ForkopShellMethods = { }, componentActionStatus: async (jobId) => { const response = await executeShellCommand({ - command: "/usr/bin/forkop", - args: [Forkop.AvailableMethods.COMPONENT_ACTION_STATUS, jobId], + command: "/usr/bin/tachyon", + args: [Tachyon.AvailableMethods.COMPONENT_ACTION_STATUS, jobId], timeout: COMPONENT_ACTION_RPC_TIMEOUT_MS }); const parsedResponse = parseComponentActionResult(response); @@ -3053,7 +3053,7 @@ var ForkopShellMethods = { }; }, componentUpdateCheckCache: async () => callBaseMethod( - Forkop.AvailableMethods.COMPONENT_UPDATE_CHECK_CACHE + Tachyon.AvailableMethods.COMPONENT_UPDATE_CHECK_CACHE ), waitComponentActionJob: async (jobId, component, action, expectedLatestVersion) => { let selfUpdateVersionMatchedAt = 0; @@ -3078,8 +3078,8 @@ var ForkopShellMethods = { } lastStatusRefreshAt = Date.now(); const statusResponse = await executeShellCommand({ - command: "/usr/bin/forkop", - args: [Forkop.AvailableMethods.COMPONENT_ACTION_STATUS, jobId], + command: "/usr/bin/tachyon", + args: [Tachyon.AvailableMethods.COMPONENT_ACTION_STATUS, jobId], timeout: COMPONENT_ACTION_RPC_TIMEOUT_MS }); const parsedResponse = parseComponentActionResult(statusResponse); @@ -3096,8 +3096,8 @@ var ForkopShellMethods = { if (transientRpc.shouldContinue(failure.error)) { continue; } - if (component === "forkop" && action === "install") { - const installedVersion = expectedLatestVersion ? await readForkopVersion() : ""; + if (component === "tachyon" && action === "install") { + const installedVersion = expectedLatestVersion ? await readTachyonVersion() : ""; if (expectedLatestVersion && installedVersion === expectedLatestVersion) { if (!selfUpdateVersionMatchedAt) { selfUpdateVersionMatchedAt = Date.now(); @@ -3109,7 +3109,7 @@ var ForkopShellMethods = { success: true, component, action, - message: translate("Forkop has been installed"), + message: translate("Tachyon has been installed"), current_version: installedVersion, latest_version: expectedLatestVersion, changed: true, @@ -3134,12 +3134,12 @@ var ForkopShellMethods = { }, subscriptionUpdateStart: async (section, sourceIndex) => { const startArgs = [ - Forkop.AvailableMethods.SUBSCRIPTION_UPDATE_ASYNC, + Tachyon.AvailableMethods.SUBSCRIPTION_UPDATE_ASYNC, ...section ? [section] : [], ...section && sourceIndex !== void 0 ? [String(sourceIndex)] : [] ]; const response = await executeShellCommand({ - command: "/usr/bin/forkop", + command: "/usr/bin/tachyon", args: startArgs, timeout: SUBSCRIPTION_UPDATE_RPC_TIMEOUT_MS }); @@ -3157,8 +3157,8 @@ var ForkopShellMethods = { }, subscriptionUpdateStatus: async (jobId) => { const response = await executeShellCommand({ - command: "/usr/bin/forkop", - args: [Forkop.AvailableMethods.SUBSCRIPTION_UPDATE_STATUS, jobId], + command: "/usr/bin/tachyon", + args: [Tachyon.AvailableMethods.SUBSCRIPTION_UPDATE_STATUS, jobId], timeout: SUBSCRIPTION_UPDATE_RPC_TIMEOUT_MS }); const parsedResponse = parseSubscriptionUpdateJobState(response); @@ -3179,7 +3179,7 @@ var ForkopShellMethods = { ); while (true) { await sleep(SUBSCRIPTION_UPDATE_POLL_INTERVAL_MS); - const response = await ForkopShellMethods.subscriptionUpdateStatus(jobId); + const response = await TachyonShellMethods.subscriptionUpdateStatus(jobId); if (!response.success) { if (transientRpc.shouldContinue(response.error)) { continue; @@ -3195,8 +3195,8 @@ var ForkopShellMethods = { } }; -// src/forkop/methods/custom/getDashboardSections.ts -var DASHBOARD_SECTION_CACHE_DIR = "/var/run/forkop/section-cache"; +// src/tachyon/methods/custom/getDashboardSections.ts +var DASHBOARD_SECTION_CACHE_DIR = "/var/run/tachyon/section-cache"; function getDisplayName(section) { return section.label || section[".name"]; } @@ -3228,7 +3228,7 @@ async function getClashApiProxies(configSections) { } catch (_error) { } } - return ForkopShellMethods.getClashApiProxies(); + return TachyonShellMethods.getClashApiProxies(); } function getListValues(value) { if (!value) { @@ -4211,21 +4211,21 @@ async function getDashboardSections(options = {}) { }; } -// src/forkop/methods/custom/getClashApiSecret.ts +// src/tachyon/methods/custom/getClashApiSecret.ts async function getClashApiSecret2() { const sections = await getConfigSections(); const settings = sections.find((section) => section[".type"] === "settings"); return settings?.yacd_secret_key || ""; } -// src/forkop/methods/custom/index.ts -var CustomForkopMethods = { +// src/tachyon/methods/custom/index.ts +var CustomTachyonMethods = { getConfigSections, getDashboardSections, getClashApiSecret: getClashApiSecret2 }; -// src/forkop/api.ts +// src/tachyon/api.ts async function createBaseApiRequest(fetchFn, options) { const wrappedFn = () => options?.timeoutMs && options?.operationName ? withTimeout( fetchFn(), @@ -4254,7 +4254,7 @@ async function createBaseApiRequest(fetchFn, options) { } } -// src/forkop/methods/fakeip/getFakeIpCheck.ts +// src/tachyon/methods/fakeip/getFakeIpCheck.ts async function getFakeIpCheck() { return createBaseApiRequest( () => fetch(`https://${FAKEIP_CHECK_DOMAIN}/check`, { @@ -4268,7 +4268,7 @@ async function getFakeIpCheck() { ); } -// src/forkop/methods/fakeip/getIpCheck.ts +// src/tachyon/methods/fakeip/getIpCheck.ts async function getIpCheck() { return createBaseApiRequest( () => fetch(`https://${IP_CHECK_DOMAIN}/check`, { @@ -4282,13 +4282,13 @@ async function getIpCheck() { ); } -// src/forkop/methods/fakeip/index.ts +// src/tachyon/methods/fakeip/index.ts var RemoteFakeIPMethods = { getFakeIpCheck, getIpCheck }; -// src/forkop/services/tab.service.ts +// src/tachyon/services/tab.service.ts var TabService = class _TabService { constructor() { this.observer = null; @@ -4345,12 +4345,12 @@ var TabService = class _TabService { }; var TabServiceInstance = TabService.getInstance(); -// src/forkop/tabs/diagnostic/helpers/getCheckTitle.ts +// src/tachyon/tabs/diagnostic/helpers/getCheckTitle.ts function getCheckTitle(name) { return `${name} ${_("checks")}`; } -// src/forkop/tabs/diagnostic/checks/contstants.ts +// src/tachyon/tabs/diagnostic/checks/contstants.ts var DIAGNOSTICS_CHECKS = /* @__PURE__ */ ((DIAGNOSTICS_CHECKS2) => { DIAGNOSTICS_CHECKS2["DNS"] = "DNS"; DIAGNOSTICS_CHECKS2["SINGBOX"] = "SINGBOX"; @@ -4411,7 +4411,7 @@ var DIAGNOSTICS_CHECKS_MAP = { } }; -// src/forkop/tabs/diagnostic/diagnostic.store.ts +// src/tachyon/tabs/diagnostic/diagnostic.store.ts function createDiagnosticCheck(code, description) { const meta = DIAGNOSTICS_CHECKS_MAP[code]; return { @@ -4451,8 +4451,8 @@ var initialDiagnosticStore = { loading: true, loaded: false, providerInfoLoaded: false, - forkop_version: "loading", - forkop_latest_version: "loading", + tachyon_version: "loading", + tachyon_latest_version: "loading", luci_app_version: "loading", sing_box_version: "loading", sing_box_extended: 0, @@ -4498,8 +4498,8 @@ var initialDiagnosticStore = { diagnosticsRunAction: { loading: false }, diagnosticsChecks: getDiagnosticsChecks(_("Not running")), updatesActions: { - forkopCheck: { loading: false }, - forkopInstall: { loading: false }, + tachyonCheck: { loading: false }, + tachyonInstall: { loading: false }, singBoxCheck: { loading: false }, singBoxInstall: { loading: false }, singBoxInstallExtended: { loading: false }, @@ -4517,7 +4517,7 @@ var initialDiagnosticStore = { byedpiRemove: { loading: false } }, updatesChecks: { - forkop: { status: null, latest_version: "", release_url: "" }, + tachyon: { status: null, latest_version: "", release_url: "" }, sing_box: { status: null, latest_version: "", release_url: "" }, zapret: { status: null, latest_version: "", release_url: "" }, zapret2: { status: null, latest_version: "", release_url: "" }, @@ -4525,7 +4525,7 @@ var initialDiagnosticStore = { } }; -// src/forkop/services/store.service.ts +// src/tachyon/services/store.service.ts function jsonStableStringify(obj) { return JSON.stringify(obj, (_2, value) => { if (value && typeof value === "object" && !Array.isArray(value)) { @@ -4638,9 +4638,9 @@ var initialStore = { failed: false, data: { singbox: 0, - forkopRunning: 0, - forkopEnabled: 0, - forkopStatus: "" + tachyonRunning: 0, + tachyonEnabled: 0, + tachyonStatus: "" } }, sectionsWidget: { @@ -4656,8 +4656,8 @@ var initialStore = { }; var store = new StoreService(initialStore); -// src/forkop/services/forkopLogWatcher.service.ts -var ForkopLogWatcher = class _ForkopLogWatcher { +// src/tachyon/services/tachyonLogWatcher.service.ts +var TachyonLogWatcher = class _TachyonLogWatcher { constructor() { this.intervalMs = 5e3; this.lastLines = /* @__PURE__ */ new Set(); @@ -4673,10 +4673,10 @@ var ForkopLogWatcher = class _ForkopLogWatcher { } } static getInstance() { - if (!_ForkopLogWatcher.instance) { - _ForkopLogWatcher.instance = new _ForkopLogWatcher(); + if (!_TachyonLogWatcher.instance) { + _TachyonLogWatcher.instance = new _TachyonLogWatcher(); } - return _ForkopLogWatcher.instance; + return _TachyonLogWatcher.instance; } init(fetcher, options) { this.fetcher = fetcher; @@ -4685,7 +4685,7 @@ var ForkopLogWatcher = class _ForkopLogWatcher { this.maxTrackedLines = options?.maxTrackedLines ?? 500; this.lastLines = /* @__PURE__ */ new Set(); logger.info( - "[ForkopLogWatcher]", + "[TachyonLogWatcher]", `initialized (interval: ${this.intervalMs}ms)` ); } @@ -4694,16 +4694,16 @@ var ForkopLogWatcher = class _ForkopLogWatcher { } async checkOnce() { if (!this.fetcher) { - logger.warn("[ForkopLogWatcher]", "fetcher not found"); + logger.warn("[TachyonLogWatcher]", "fetcher not found"); return; } if (this.paused) { - logger.debug("[ForkopLogWatcher]", "skipped check \u2014 tab not visible"); + logger.debug("[TachyonLogWatcher]", "skipped check \u2014 tab not visible"); return; } if (this.checking) { logger.debug( - "[ForkopLogWatcher]", + "[TachyonLogWatcher]", "skipped check \u2014 previous check is running" ); return; @@ -4725,7 +4725,7 @@ var ForkopLogWatcher = class _ForkopLogWatcher { ); } } catch (err) { - logger.error("[ForkopLogWatcher]", "failed to read logs:", err); + logger.error("[TachyonLogWatcher]", "failed to read logs:", err); } finally { this.checking = false; } @@ -4733,14 +4733,14 @@ var ForkopLogWatcher = class _ForkopLogWatcher { start() { if (this.running) return; if (!this.fetcher) { - logger.warn("[ForkopLogWatcher]", "attempted to start without fetcher"); + logger.warn("[TachyonLogWatcher]", "attempted to start without fetcher"); return; } this.running = true; void this.checkOnce(); this.timer = setInterval(() => this.checkOnce(), this.intervalMs); logger.info( - "[ForkopLogWatcher]", + "[TachyonLogWatcher]", `started (interval: ${this.intervalMs}ms)` ); } @@ -4748,28 +4748,28 @@ var ForkopLogWatcher = class _ForkopLogWatcher { if (!this.running) return; this.running = false; if (this.timer) clearInterval(this.timer); - logger.info("[ForkopLogWatcher]", "stopped"); + logger.info("[TachyonLogWatcher]", "stopped"); } pause() { if (!this.running || this.paused) return; this.paused = true; - logger.info("[ForkopLogWatcher]", "paused (tab not visible)"); + logger.info("[TachyonLogWatcher]", "paused (tab not visible)"); } resume() { if (!this.running || !this.paused) return; this.paused = false; - logger.info("[ForkopLogWatcher]", "resumed (tab active)"); + logger.info("[TachyonLogWatcher]", "resumed (tab active)"); void this.checkOnce(); } reset() { this.lastLines = /* @__PURE__ */ new Set(); this.checking = false; - logger.info("[ForkopLogWatcher]", "log history reset"); + logger.info("[TachyonLogWatcher]", "log history reset"); } }; -// src/forkop/services/logNotificationDeduper.service.ts -var LOG_NOTIFICATION_STORAGE_KEY = "forkop:shown-log-error-notifications:v1"; +// src/tachyon/services/logNotificationDeduper.service.ts +var LOG_NOTIFICATION_STORAGE_KEY = "tachyon:shown-log-error-notifications:v1"; var MAX_STORED_LOG_NOTIFICATIONS = 500; function getSessionStorage() { if (typeof window === "undefined") { @@ -4810,12 +4810,12 @@ function isErrorLogLine(line) { const lower = line.toLowerCase(); return lower.includes("[error]") || lower.includes("[fatal]"); } -function getForkopLogNotification(line) { +function getTachyonLogNotification(line) { if (isErrorLogLine(line)) { return { kind: "error", line }; } const update = line.match( - /\[component-update\]\s+(forkop|sing_box|zapret|zapret2|byedpi)\s+(\S+)/i + /\[component-update\]\s+(tachyon|sing_box|zapret|zapret2|byedpi)\s+(\S+)/i ); if (!update) { return null; @@ -4836,7 +4836,7 @@ var LogNotificationDeduper = class { this.seenKeys = new Set(readStoredKeys(storage)); } shouldNotify(line) { - if (!getForkopLogNotification(line)) { + if (!getTachyonLogNotification(line)) { return false; } const key = getLogNotificationKey(line); @@ -4849,10 +4849,10 @@ var LogNotificationDeduper = class { } }; -// src/forkop/helpers/getComponentActionKey.ts +// src/tachyon/helpers/getComponentActionKey.ts var componentActionKeyMap = { - "forkop:check_update": "forkopCheck", - "forkop:install": "forkopInstall", + "tachyon:check_update": "tachyonCheck", + "tachyon:install": "tachyonInstall", "sing_box:check_update": "singBoxCheck", "sing_box:install": "singBoxInstall", "sing_box:install_extended": "singBoxInstallExtended", @@ -4873,7 +4873,7 @@ function getComponentActionKey(component, action) { return componentActionKeyMap[`${component}:${action}`]; } -// src/forkop/helpers/singBoxVariant.ts +// src/tachyon/helpers/singBoxVariant.ts function isExtendedSingBoxVersion(version) { return String(version || "").includes("extended"); } @@ -4913,7 +4913,7 @@ function normalizeSingBoxVariantFields(value) { }; } -// src/forkop/services/localActionOverlay.service.ts +// src/tachyon/services/localActionOverlay.service.ts var componentActions = /* @__PURE__ */ new Set(); var subscriptionSections = /* @__PURE__ */ new Set(); var latencySections = /* @__PURE__ */ new Set(); @@ -4952,14 +4952,14 @@ function getLocalActionOverlay() { }; } -// src/forkop/services/uiState.service.ts +// src/tachyon/services/uiState.service.ts function isRunningAction(state) { return state.running === true; } function getEmptyUpdatesActions() { return { - forkopCheck: { loading: false }, - forkopInstall: { loading: false }, + tachyonCheck: { loading: false }, + tachyonInstall: { loading: false }, singBoxCheck: { loading: false }, singBoxInstall: { loading: false }, singBoxInstallExtended: { loading: false }, @@ -5020,9 +5020,9 @@ function applyServiceState(uiState) { failed: false, data: { singbox: uiState.service.sing_box.running, - forkopRunning: uiState.service.forkop.running, - forkopEnabled: uiState.service.forkop.enabled, - forkopStatus: uiState.service.forkop.status + tachyonRunning: uiState.service.tachyon.running, + tachyonEnabled: uiState.service.tachyon.enabled, + tachyonStatus: uiState.service.tachyon.status } }, diagnosticsSystemInfo: normalizeSingBoxVariantFields(nextSystemInfo) @@ -5105,7 +5105,7 @@ function applyUiStateToStore(uiState) { applyActionState(uiState.actions); } -// src/forkop/services/runtimeUiState.service.ts +// src/tachyon/services/runtimeUiState.service.ts var RUNTIME_UI_STATE_REFRESH_MIN_INTERVAL_MS = 500; var RUNTIME_UI_STATE_IDLE_POLL_INTERVAL_MS = 1e3; var RUNTIME_UI_STATE_ACTIVE_POLL_INTERVAL_MS = 500; @@ -5162,7 +5162,7 @@ async function refreshRuntimeUiState({ return void 0; } lastRuntimeUiStateRefreshAt = now; - const promise = ForkopShellMethods.getUiState().then((response) => { + const promise = TachyonShellMethods.getUiState().then((response) => { if (!response.success) { return void 0; } @@ -5223,12 +5223,12 @@ function startRuntimeUiStatePolling() { }); } -// src/forkop/services/core.service.ts +// src/tachyon/services/core.service.ts var LOG_WATCHER_INTERVAL_MS = 1e4; var LOG_WATCHER_START_DELAY_MS = 5e3; function componentDisplayName(component) { const names = { - forkop: "Forkop", + tachyon: "Tachyon", sing_box: "sing-box", zapret: "Zapret", zapret2: "Zapret2", @@ -5248,7 +5248,7 @@ function showLogNotification(notification) { return; } ui.addNotification( - _("Forkop Error"), + _("Tachyon Error"), E("div", {}, notification.line), "error", "fkp-log-error-notification" @@ -5264,11 +5264,11 @@ function coreService(options = {}) { } }); }); - const watcher = ForkopLogWatcher.getInstance(); + const watcher = TachyonLogWatcher.getInstance(); const logNotificationDeduper = new LogNotificationDeduper(); watcher.init( async () => { - const logs = await ForkopShellMethods.checkLogs(); + const logs = await TachyonShellMethods.checkLogs(); if (logs.success) { return logs.data; } @@ -5278,7 +5278,7 @@ function coreService(options = {}) { intervalMs: LOG_WATCHER_INTERVAL_MS, onNewLog: (line) => { if (logNotificationDeduper.shouldNotify(line)) { - const notification = getForkopLogNotification(line); + const notification = getTachyonLogNotification(line); if (notification) { showLogNotification(notification); } @@ -5304,7 +5304,7 @@ function coreService(options = {}) { startRuntimeUiStatePolling(); } -// src/forkop/services/socket.service.ts +// src/tachyon/services/socket.service.ts var SocketManager = class _SocketManager { constructor() { this.sockets = /* @__PURE__ */ new Map(); @@ -5443,8 +5443,8 @@ var SocketManager = class _SocketManager { }; var socket = SocketManager.getInstance(); -// src/forkop/services/uiActionNotification.service.ts -var UI_ACTION_NOTIFICATION_STORAGE_KEY = "forkop:owned-ui-action-notifications:v1"; +// src/tachyon/services/uiActionNotification.service.ts +var UI_ACTION_NOTIFICATION_STORAGE_KEY = "tachyon:owned-ui-action-notifications:v1"; var MAX_STORED_UI_ACTION_NOTIFICATIONS = 100; function getSessionStorage2() { if (typeof window === "undefined") { @@ -5550,7 +5550,7 @@ function shouldNotifyOwnedUiAction(kind, jobId) { return uiActionNotifications.shouldNotify(kind, jobId); } -// src/forkop/fetchers/fetchServicesInfo.ts +// src/tachyon/fetchers/fetchServicesInfo.ts var latestServicesInfoRequestId = 0; function getSettledMethodResponse(scope, result) { if (result.status === "fulfilled") { @@ -5571,32 +5571,32 @@ async function fetchServicesInfo() { if (uiState) { return uiState; } - const [forkopResult, singboxResult] = await Promise.allSettled([ - ForkopShellMethods.getStatus(), - ForkopShellMethods.getSingBoxStatus() + const [tachyonResult, singboxResult] = await Promise.allSettled([ + TachyonShellMethods.getStatus(), + TachyonShellMethods.getSingBoxStatus() ]); if (requestId !== latestServicesInfoRequestId) { return; } - const forkop = getSettledMethodResponse("getStatus", forkopResult); + const tachyon = getSettledMethodResponse("getStatus", tachyonResult); const singbox = getSettledMethodResponse("getSingBoxStatus", singboxResult); const previousData = store.get().servicesInfoWidget.data; store.set({ servicesInfoWidget: { loading: false, - failed: !forkop.success || !singbox.success, + failed: !tachyon.success || !singbox.success, data: { singbox: singbox.success ? singbox.data.running : previousData.singbox, - forkopRunning: forkop.success ? forkop.data.running : previousData.forkopRunning, - forkopEnabled: forkop.success ? forkop.data.enabled : previousData.forkopEnabled, - forkopStatus: forkop.success ? forkop.data.status : previousData.forkopStatus + tachyonRunning: tachyon.success ? tachyon.data.running : previousData.tachyonRunning, + tachyonEnabled: tachyon.success ? tachyon.data.enabled : previousData.tachyonEnabled, + tachyonStatus: tachyon.success ? tachyon.data.status : previousData.tachyonStatus } } }); return void 0; } -// src/forkop/helpers/isActiveLuciTab.ts +// src/tachyon/helpers/isActiveLuciTab.ts function isActiveLuciTab(tabId) { if (typeof document === "undefined") { return false; @@ -5608,12 +5608,12 @@ function isActiveLuciTab(tabId) { ); } -// src/forkop/helpers/restoredActionLoading.ts +// src/tachyon/helpers/restoredActionLoading.ts function shouldShowLoadingForRestoredAction(state) { return state.running === true; } -// src/forkop/helpers/serviceAvailability.ts +// src/tachyon/helpers/serviceAvailability.ts function getServiceAvailability({ loading: loading2, failed: failed2, @@ -5628,7 +5628,7 @@ function getServiceAvailability({ return running ? "running" : "stopped"; } -// src/forkop/tabs/dashboard/initController.ts +// src/tachyon/tabs/dashboard/initController.ts var SECTIONS_REFRESH_INTERVAL_MS = 1e4; var LATENCY_TEST_BUTTON_CLASS = "dashboard-sections-grid-item-test-latency"; var LATENCY_TEST_BUTTON_LABEL_CLASS = "dashboard-sections-grid-item-test-latency__label"; @@ -5667,7 +5667,7 @@ async function fetchDashboardSectionsOnce(mountId) { } }); try { - const { data, success } = await CustomForkopMethods.getDashboardSections(); + const { data, success } = await CustomTachyonMethods.getDashboardSections(); if (!dashboardMounted || mountId !== dashboardMountId || getDashboardServiceAvailability() === "stopped") { return false; } @@ -5812,7 +5812,7 @@ async function completeSubscriptionUpdateJob(jobId, sectionName, response) { } setSubscriptionUpdating(sectionName, false); if (jobId && response.success) { - void ForkopShellMethods.uiActionAck("subscription", jobId); + void TachyonShellMethods.uiActionAck("subscription", jobId); } if (failed2) { if (shouldNotify) { @@ -5840,7 +5840,7 @@ async function followSubscriptionUpdateState(state) { setSubscriptionUpdating(sectionName, true); } try { - const response = state.running ? await ForkopShellMethods.waitSubscriptionUpdateJob(jobId) : { + const response = state.running ? await TachyonShellMethods.waitSubscriptionUpdateJob(jobId) : { success: true, data: state }; @@ -5870,7 +5870,7 @@ async function completeLatencyTestJob(jobId, sectionName) { handledLatencyJobs.add(jobId); } if (jobId) { - void ForkopShellMethods.uiActionAck("latency", jobId); + void TachyonShellMethods.uiActionAck("latency", jobId); } void fetchDashboardSections({ force: true }); } @@ -5889,7 +5889,7 @@ async function followLatencyTestState(state) { } try { if (state.running) { - await ForkopShellMethods.waitLatencyTestJob(jobId); + await TachyonShellMethods.waitLatencyTestJob(jobId); } await completeLatencyTestJob(jobId, sectionName); } catch (error) { @@ -5907,7 +5907,7 @@ function followDashboardActionsFromUiState(uiState) { void followSubscriptionUpdateState(state); } else if (state.job_id && !handledSubscriptionJobs.has(state.job_id)) { handledSubscriptionJobs.add(state.job_id); - void ForkopShellMethods.uiActionAck("subscription", state.job_id); + void TachyonShellMethods.uiActionAck("subscription", state.job_id); } } for (const state of uiState.actions.latency || []) { @@ -5915,7 +5915,7 @@ function followDashboardActionsFromUiState(uiState) { void followLatencyTestState(state); } else if (state.job_id && !handledLatencyJobs.has(state.job_id)) { handledLatencyJobs.add(state.job_id); - void ForkopShellMethods.uiActionAck("latency", state.job_id); + void TachyonShellMethods.uiActionAck("latency", state.job_id); } } } @@ -6033,7 +6033,7 @@ function getDashboardServiceAvailability() { return getServiceAvailability({ loading: service.loading, failed: service.failed, - running: service.data.forkopRunning + running: service.data.tachyonRunning }); } function stopDashboardDataUpdates() { @@ -6081,7 +6081,7 @@ async function handleChooseOutbound(sectionName, selector, tag) { } setSelectorSwitching(sectionName, tag); try { - await ForkopShellMethods.setClashApiGroupProxy(selector, tag); + await TachyonShellMethods.setClashApiGroupProxy(selector, tag); await fetchDashboardSections({ force: true }); } finally { setSelectorSwitching(sectionName); @@ -6118,7 +6118,7 @@ async function handleTestLatency(latencyType, sectionName, tag, timeout) { let ownsJobFollow = false; let completed = false; try { - const startResponse = await ForkopShellMethods.latencyTestStart( + const startResponse = await TachyonShellMethods.latencyTestStart( latencyType, sectionName, tag, @@ -6134,7 +6134,7 @@ async function handleTestLatency(latencyType, sectionName, tag, timeout) { } followedLatencyJobs.add(jobId); ownsJobFollow = true; - await ForkopShellMethods.waitLatencyTestJob(jobId); + await TachyonShellMethods.waitLatencyTestJob(jobId); await completeLatencyTestJob(jobId, sectionName); completed = true; } catch (error) { @@ -6154,7 +6154,7 @@ async function handleCopyOutbound(section, outbound) { copyToClipboard(link); return; } - const response = await ForkopShellMethods.getOutboundLink( + const response = await TachyonShellMethods.getOutboundLink( section.sectionName, outbound.code ); @@ -6613,7 +6613,7 @@ async function handleUpdateSubscription(section) { let jobId = ""; let ownsJobFollow = false; try { - const startResponse = await ForkopShellMethods.subscriptionUpdateStart( + const startResponse = await TachyonShellMethods.subscriptionUpdateStart( section.sectionName ); if (!startResponse.success) { @@ -6626,7 +6626,7 @@ async function handleUpdateSubscription(section) { } followedSubscriptionJobs.add(jobId); ownsJobFollow = true; - const response = await ForkopShellMethods.waitSubscriptionUpdateJob(jobId); + const response = await TachyonShellMethods.waitSubscriptionUpdateJob(jobId); await completeSubscriptionUpdateJob(jobId, section.sectionName, response); } catch (error) { logger.error("[DASHBOARD]", "handleUpdateSubscription: failed", error); @@ -6901,10 +6901,10 @@ async function renderServicesInfoWidget() { title: _("Services info"), items: [ { - key: "Forkop", - value: servicesInfoWidget.data.forkopRunning ? _("\u2714 Running") : _("\u2718 Stopped"), + key: "Tachyon", + value: servicesInfoWidget.data.tachyonRunning ? _("\u2714 Running") : _("\u2718 Stopped"), attributes: { - class: servicesInfoWidget.data.forkopRunning ? "fkp_dashboard-page__widgets-section__item__row--success" : "fkp_dashboard-page__widgets-section__item__row--error" + class: servicesInfoWidget.data.tachyonRunning ? "fkp_dashboard-page__widgets-section__item__row--success" : "fkp_dashboard-page__widgets-section__item__row--error" } }, { @@ -7027,22 +7027,22 @@ async function initController() { }); } -// src/forkop/tabs/dashboard/styles.ts +// src/tachyon/tabs/dashboard/styles.ts var styles = ` -#cbi-${FORKOP_UCI_PACKAGE}-dashboard-_mount_node > .cbi-value-title { +#cbi-${TACHYON_UCI_PACKAGE}-dashboard-_mount_node > .cbi-value-title { display: none; } -#cbi-${FORKOP_UCI_PACKAGE}-dashboard-_mount_node > .cbi-value-field { +#cbi-${TACHYON_UCI_PACKAGE}-dashboard-_mount_node > .cbi-value-field { margin-left: 0; width: 100%; } -#cbi-${FORKOP_UCI_PACKAGE}-dashboard-_mount_node > div { +#cbi-${TACHYON_UCI_PACKAGE}-dashboard-_mount_node > div { width: 100%; } -#cbi-${FORKOP_UCI_PACKAGE}-dashboard > h3 { +#cbi-${TACHYON_UCI_PACKAGE}-dashboard > h3 { display: none; } @@ -7704,14 +7704,14 @@ var styles = ` `; -// src/forkop/tabs/dashboard/index.ts +// src/tachyon/tabs/dashboard/index.ts var DashboardTab = { render, initController, styles }; -// src/forkop/tabs/diagnostic/renderDiagnostic.ts +// src/tachyon/tabs/diagnostic/renderDiagnostic.ts function render2() { return E("div", { id: "diagnostic-status", class: "fkp_diagnostic-page" }, [ E("div", { class: "fkp_diagnostic-page__left-bar" }, [ @@ -7729,7 +7729,7 @@ function render2() { ]); } -// src/forkop/tabs/diagnostic/checks/updateCheckStore.ts +// src/tachyon/tabs/diagnostic/checks/updateCheckStore.ts function updateCheckStore(check, minified) { const diagnosticsChecks = store.get().diagnosticsChecks; const other = diagnosticsChecks.filter((item) => item.code !== check.code); @@ -7743,7 +7743,7 @@ function updateCheckStore(check, minified) { }); } -// src/forkop/tabs/diagnostic/helpers/getMeta.ts +// src/tachyon/tabs/diagnostic/helpers/getMeta.ts function getMeta({ allGood, atLeastOneGood }) { if (allGood) { return { @@ -7763,7 +7763,7 @@ function getMeta({ allGood, atLeastOneGood }) { }; } -// src/forkop/tabs/diagnostic/checks/getDnsCheckPresentation.ts +// src/tachyon/tabs/diagnostic/checks/getDnsCheckPresentation.ts function getDnsCheckPresentation(data) { const dhcpManagedManually = Boolean(data.dont_touch_dhcp); const dhcpCheckOk = dhcpManagedManually || Boolean(data.dhcp_config_status); @@ -7782,7 +7782,7 @@ function getDnsCheckPresentation(data) { }; } -// src/forkop/tabs/diagnostic/checks/runDnsCheck.ts +// src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts async function runDnsCheck() { const { order, title, code } = DIAGNOSTICS_CHECKS_MAP.DNS; updateCheckStore({ @@ -7793,7 +7793,7 @@ async function runDnsCheck() { state: "loading", items: [] }); - const dnsChecks = await ForkopShellMethods.checkDNSAvailable(); + const dnsChecks = await TachyonShellMethods.checkDNSAvailable(); if (!dnsChecks.success) { updateCheckStore({ order, @@ -7846,7 +7846,7 @@ async function runDnsCheck() { } } -// src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts +// src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts async function runSingBoxCheck() { const { order, title, code } = DIAGNOSTICS_CHECKS_MAP.SINGBOX; updateCheckStore({ @@ -7857,7 +7857,7 @@ async function runSingBoxCheck() { state: "loading", items: [] }); - const singBoxChecks = await ForkopShellMethods.checkSingBox(); + const singBoxChecks = await TachyonShellMethods.checkSingBox(); if (!singBoxChecks.success) { updateCheckStore({ order, @@ -7917,7 +7917,7 @@ async function runSingBoxCheck() { } } -// src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts +// src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts function serverPrefix(item) { return `${item.label}:`; } @@ -8038,7 +8038,7 @@ async function runInboundsCheck() { state: "loading", items: [] }); - const inboundsChecks = await ForkopShellMethods.checkInbounds(); + const inboundsChecks = await TachyonShellMethods.checkInbounds(); if (!inboundsChecks.success) { updateCheckStore({ order, @@ -8088,7 +8088,7 @@ async function runInboundsCheck() { } } -// src/forkop/tabs/diagnostic/checks/runNftCheck.ts +// src/tachyon/tabs/diagnostic/checks/runNftCheck.ts async function runNftCheck() { const { order, title, code } = DIAGNOSTICS_CHECKS_MAP.NFT; updateCheckStore({ @@ -8101,7 +8101,7 @@ async function runNftCheck() { }); await RemoteFakeIPMethods.getFakeIpCheck(); await RemoteFakeIPMethods.getIpCheck(); - const nftablesChecks = await ForkopShellMethods.checkNftRules(); + const nftablesChecks = await TachyonShellMethods.checkNftRules(); if (!nftablesChecks.success) { updateCheckStore({ order, @@ -8171,7 +8171,7 @@ async function runNftCheck() { } } -// src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts +// src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts async function runFakeIPCheck() { const { order, title, code } = DIAGNOSTICS_CHECKS_MAP.FAKEIP; updateCheckStore({ @@ -8182,7 +8182,7 @@ async function runFakeIPCheck() { state: "loading", items: [] }); - const routerFakeIPResponse = await ForkopShellMethods.checkFakeIP(); + const routerFakeIPResponse = await TachyonShellMethods.checkFakeIP(); const checkFakeIPResponse = await RemoteFakeIPMethods.getFakeIpCheck(); const checkIPResponse = await RemoteFakeIPMethods.getIpCheck(); const browserFakeIPCheckUnavailable = !checkFakeIPResponse.success; @@ -8232,7 +8232,7 @@ async function runFakeIPCheck() { }); } -// src/forkop/tabs/diagnostic/checks/getCheckItemsMeta.ts +// src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts function getCheckItemsMeta(items) { if (items.some((item) => item.state === "error")) { return { @@ -8252,7 +8252,7 @@ function getCheckItemsMeta(items) { }; } -// src/forkop/tabs/diagnostic/checks/runZapretCheck.ts +// src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts async function runZapretCheck() { const { order, title, code } = DIAGNOSTICS_CHECKS_MAP.ZAPRET; updateCheckStore({ @@ -8263,7 +8263,7 @@ async function runZapretCheck() { state: "loading", items: [] }); - const zapretStatus = await ForkopShellMethods.getZapretStatus(); + const zapretStatus = await TachyonShellMethods.getZapretStatus(); if (!zapretStatus.success) { updateCheckStore({ order, @@ -8285,7 +8285,7 @@ async function runZapretCheck() { const expectedProcesses = Number(data.expected_process_count || 0); const runningProcesses = Number(data.running_process_count || 0); const supervisorProcesses = Number(data.supervisor_process_count || 0); - const forkopRuntimeReady = !hasZapretRules || runningProcesses === expectedProcesses && supervisorProcesses === expectedProcesses; + const tachyonRuntimeReady = !hasZapretRules || runningProcesses === expectedProcesses && supervisorProcesses === expectedProcesses; const unexpectedRuntime = !hasZapretRules && (runningProcesses > 0 || supervisorProcesses > 0); const outboundsConfigured = Boolean(data.outbounds_configured); const items = [ @@ -8305,8 +8305,8 @@ async function runZapretCheck() { value: "" }, { - state: unexpectedRuntime || !forkopRuntimeReady ? "error" : "success", - key: hasZapretRules ? forkopRuntimeReady ? _("Forkop-managed nfqws runtime is ready") : _("Forkop-managed nfqws runtime is not ready") : unexpectedRuntime ? _("Unexpected Forkop-managed nfqws runtime is running") : _("Forkop-managed nfqws runtime is not running"), + state: unexpectedRuntime || !tachyonRuntimeReady ? "error" : "success", + key: hasZapretRules ? tachyonRuntimeReady ? _("Tachyon-managed nfqws runtime is ready") : _("Tachyon-managed nfqws runtime is not ready") : unexpectedRuntime ? _("Unexpected Tachyon-managed nfqws runtime is running") : _("Tachyon-managed nfqws runtime is not running"), value: hasZapretRules ? `${runningProcesses}/${expectedProcesses}` : "" }, { @@ -8321,7 +8321,7 @@ async function runZapretCheck() { }, { state: standaloneConflict ? "warning" : "success", - key: standaloneServiceRunning ? hasZapretRules ? _("Standalone Zapret is active together with Forkop Zapret rules") : _("Standalone Zapret service is active") : _("Standalone Zapret service is inactive"), + key: standaloneServiceRunning ? hasZapretRules ? _("Standalone Zapret is active together with Tachyon Zapret rules") : _("Standalone Zapret service is active") : _("Standalone Zapret service is inactive"), value: "" } ]; @@ -8336,7 +8336,7 @@ async function runZapretCheck() { }); } -// src/forkop/tabs/diagnostic/checks/runZapret2Check.ts +// src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts async function runZapret2Check() { const { order, title, code } = DIAGNOSTICS_CHECKS_MAP.ZAPRET2; updateCheckStore({ @@ -8347,7 +8347,7 @@ async function runZapret2Check() { state: "loading", items: [] }); - const zapret2Status = await ForkopShellMethods.getZapret2Status(); + const zapret2Status = await TachyonShellMethods.getZapret2Status(); if (!zapret2Status.success) { updateCheckStore({ order, @@ -8367,7 +8367,7 @@ async function runZapret2Check() { const expectedProcesses = Number(data.expected_process_count || 0); const runningProcesses = Number(data.running_process_count || 0); const supervisorProcesses = Number(data.supervisor_process_count || 0); - const forkopRuntimeReady = !hasZapret2Rules || runningProcesses === expectedProcesses && supervisorProcesses === expectedProcesses; + const tachyonRuntimeReady = !hasZapret2Rules || runningProcesses === expectedProcesses && supervisorProcesses === expectedProcesses; const unexpectedRuntime = !hasZapret2Rules && (runningProcesses > 0 || supervisorProcesses > 0); const outboundsConfigured = Boolean(data.outbounds_configured); const standaloneServiceEnabled = Boolean(data.standalone_service_enabled); @@ -8391,8 +8391,8 @@ async function runZapret2Check() { value: "" }, { - state: unexpectedRuntime || !forkopRuntimeReady ? "error" : "success", - key: hasZapret2Rules ? forkopRuntimeReady ? _("Forkop-managed nfqws2 runtime is ready") : _("Forkop-managed nfqws2 runtime is not ready") : unexpectedRuntime ? _("Unexpected Forkop-managed nfqws2 runtime is running") : _("Forkop-managed nfqws2 runtime is not running"), + state: unexpectedRuntime || !tachyonRuntimeReady ? "error" : "success", + key: hasZapret2Rules ? tachyonRuntimeReady ? _("Tachyon-managed nfqws2 runtime is ready") : _("Tachyon-managed nfqws2 runtime is not ready") : unexpectedRuntime ? _("Unexpected Tachyon-managed nfqws2 runtime is running") : _("Tachyon-managed nfqws2 runtime is not running"), value: hasZapret2Rules ? `${runningProcesses}/${expectedProcesses}` : "" }, { @@ -8407,7 +8407,7 @@ async function runZapret2Check() { }, { state: standaloneConflict ? "error" : standaloneAutostartRisk ? "warning" : "success", - key: standaloneServiceRunning ? hasZapret2Rules ? _("Standalone Zapret2 is active together with Forkop Zapret2 rules") : _("Standalone Zapret2 service is active") : standaloneAutostartRisk ? _("Standalone Zapret2 autostart is enabled") : _("Standalone Zapret2 service is inactive"), + key: standaloneServiceRunning ? hasZapret2Rules ? _("Standalone Zapret2 is active together with Tachyon Zapret2 rules") : _("Standalone Zapret2 service is active") : standaloneAutostartRisk ? _("Standalone Zapret2 autostart is enabled") : _("Standalone Zapret2 service is inactive"), value: "" } ]; @@ -8422,7 +8422,7 @@ async function runZapret2Check() { }); } -// src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts +// src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts async function runByedpiCheck() { const { order, title, code } = DIAGNOSTICS_CHECKS_MAP.BYEDPI; updateCheckStore({ @@ -8433,7 +8433,7 @@ async function runByedpiCheck() { state: "loading", items: [] }); - const byedpiStatus = await ForkopShellMethods.getByedpiStatus(); + const byedpiStatus = await TachyonShellMethods.getByedpiStatus(); if (!byedpiStatus.success) { updateCheckStore({ order, @@ -8454,7 +8454,7 @@ async function runByedpiCheck() { const supervisorProcesses = Number(data.supervisor_process_count || 0); const restartCount = Number(data.restart_count || 0); const runtimeUnstable = Boolean(data.runtime_unstable); - const forkopRuntimeReady = !hasByedpiRules || runningProcesses === expectedProcesses && supervisorProcesses === expectedProcesses; + const tachyonRuntimeReady = !hasByedpiRules || runningProcesses === expectedProcesses && supervisorProcesses === expectedProcesses; const unexpectedRuntime = !hasByedpiRules && (runningProcesses > 0 || supervisorProcesses > 0); const outboundsConfigured = Boolean(data.outbounds_configured); const standaloneServiceEnabled = Boolean(data.standalone_service_enabled); @@ -8478,8 +8478,8 @@ async function runByedpiCheck() { value: "" }, { - state: unexpectedRuntime || !forkopRuntimeReady ? "error" : runtimeUnstable ? "warning" : "success", - key: hasByedpiRules ? runtimeUnstable ? _("Forkop-managed ciadpi runtime has restarted") : forkopRuntimeReady ? _("Forkop-managed ciadpi runtime is ready") : _("Forkop-managed ciadpi runtime is not ready") : unexpectedRuntime ? _("Unexpected Forkop-managed ciadpi runtime is running") : _("Forkop-managed ciadpi runtime is not running"), + state: unexpectedRuntime || !tachyonRuntimeReady ? "error" : runtimeUnstable ? "warning" : "success", + key: hasByedpiRules ? runtimeUnstable ? _("Tachyon-managed ciadpi runtime has restarted") : tachyonRuntimeReady ? _("Tachyon-managed ciadpi runtime is ready") : _("Tachyon-managed ciadpi runtime is not ready") : unexpectedRuntime ? _("Unexpected Tachyon-managed ciadpi runtime is running") : _("Tachyon-managed ciadpi runtime is not running"), value: hasByedpiRules ? runtimeUnstable ? `${restartCount}` : `${runningProcesses}/${expectedProcesses}` : "" }, { @@ -8489,7 +8489,7 @@ async function runByedpiCheck() { }, { state: standaloneConflict ? "error" : standaloneAutostartRisk ? "warning" : "success", - key: standaloneServiceRunning ? hasByedpiRules ? _("Standalone ByeDPI is active together with Forkop ByeDPI rules") : _("Standalone ByeDPI service is active") : standaloneAutostartRisk ? _("Standalone ByeDPI autostart is enabled") : _("Standalone ByeDPI service is inactive"), + key: standaloneServiceRunning ? hasByedpiRules ? _("Standalone ByeDPI is active together with Tachyon ByeDPI rules") : _("Standalone ByeDPI service is active") : standaloneAutostartRisk ? _("Standalone ByeDPI autostart is enabled") : _("Standalone ByeDPI service is inactive"), value: "" } ]; @@ -8504,13 +8504,13 @@ async function runByedpiCheck() { }); } -// src/forkop/services/systemInfo.service.ts +// src/tachyon/services/systemInfo.service.ts var UNKNOWN_SYSTEM_INFO = { loading: false, loaded: false, providerInfoLoaded: false, - forkop_version: _("unknown"), - forkop_latest_version: _("unknown"), + tachyon_version: _("unknown"), + tachyon_latest_version: _("unknown"), luci_app_version: _("unknown"), sing_box_version: _("unknown"), sing_box_extended: 0, @@ -8555,7 +8555,7 @@ async function ensureSystemInfo({ } const promise = (async () => { try { - const systemInfo = await ForkopShellMethods.getSystemInfo(); + const systemInfo = await TachyonShellMethods.getSystemInfo(); if (requestId !== latestSystemInfoRequestId) { return store.get().diagnosticsSystemInfo; } @@ -8994,7 +8994,7 @@ ${styles2} ${styles3} `; -// src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts +// src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts function renderAvailableActions({ restart, start, @@ -9012,7 +9012,7 @@ function renderAvailableActions({ classNames: ["cbi-button-apply"], onClick: restart.onClick, icon: renderRotateCcwIcon24, - text: _("Restart Forkop"), + text: _("Restart Tachyon"), loading: restart.loading, disabled: restart.disabled }) @@ -9022,7 +9022,7 @@ function renderAvailableActions({ classNames: ["cbi-button-remove"], onClick: stop.onClick, icon: renderCircleStopIcon24, - text: _("Stop Forkop"), + text: _("Stop Tachyon"), loading: stop.loading, disabled: stop.disabled }) @@ -9032,7 +9032,7 @@ function renderAvailableActions({ classNames: ["cbi-button-save"], onClick: start.onClick, icon: renderCirclePlayIcon24, - text: _("Start Forkop"), + text: _("Start Tachyon"), loading: start.loading, disabled: start.disabled }) @@ -9087,7 +9087,7 @@ function renderAvailableActions({ ]); } -// src/forkop/tabs/diagnostic/partials/renderCheckSection.ts +// src/tachyon/tabs/diagnostic/partials/renderCheckSection.ts function renderCheckSummary(items) { if (!items.length) { return E("div", {}, ""); @@ -9242,7 +9242,7 @@ function renderCheckSection(props) { return E("div", {}, _("Not implement yet")); } -// src/forkop/tabs/diagnostic/partials/renderRunAction.ts +// src/tachyon/tabs/diagnostic/partials/renderRunAction.ts function renderRunAction({ loading: loading2, disabled, @@ -9260,7 +9260,7 @@ function renderRunAction({ ]); } -// src/forkop/tabs/diagnostic/partials/renderSystemInfo.ts +// src/tachyon/tabs/diagnostic/partials/renderSystemInfo.ts function renderSystemInfo({ items }) { return E("div", { class: "fkp_diagnostic-page__right-bar__system-info" }, [ E( @@ -9304,7 +9304,7 @@ function normalizeCompiledVersion(version) { return version; } -// src/forkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts +// src/tachyon/tabs/diagnostic/partials/renderWikiDisclaimer.ts function renderWikiDisclaimer(kind) { const iconWrap = E("span", { class: "fkp_diagnostic-page__right-bar__wiki__icon" @@ -9339,7 +9339,7 @@ function renderWikiDisclaimer(kind) { ]); } -// src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts +// src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts function getSubscriptionLatencyState(latencyValues) { const hasAvailableLatency = latencyValues.some((item) => Boolean(item)); const hasUnavailableLatency = latencyValues.some((item) => !item); @@ -9384,7 +9384,7 @@ async function runSectionsCheck() { ) ?? section.outbounds[0]; const isSubscription = section.proxyConfigType === "subscription"; if (selectedOutbound2?.code) { - const latencyProxy2 = await ForkopShellMethods.getClashApiProxyLatency( + const latencyProxy2 = await TachyonShellMethods.getClashApiProxyLatency( selectedOutbound2.code, section.latencyTestTimeout ); @@ -9400,7 +9400,7 @@ async function runSectionsCheck() { latency: `[${selectedOutbound2.displayName ?? ""}] ${_("Not responding")}` }; } - const latencyGroup = await ForkopShellMethods.getClashApiGroupLatency( + const latencyGroup = await TachyonShellMethods.getClashApiGroupLatency( section.code ); const success2 = latencyGroup.success && !latencyGroup.data.message; @@ -9425,7 +9425,7 @@ async function runSectionsCheck() { }; } const selectedOutbound = section.outbounds[0]; - const latencyProxy = await ForkopShellMethods.getClashApiProxyLatency( + const latencyProxy = await TachyonShellMethods.getClashApiProxyLatency( section.code, section.latencyTestTimeout ); @@ -9470,7 +9470,7 @@ async function runSectionsCheck() { } } -// src/forkop/tabs/diagnostic/serviceTransition.ts +// src/tachyon/tabs/diagnostic/serviceTransition.ts function isServiceTransitionStatus(status) { return ["starting", "stopping", "restarting", "reloading"].includes(status); } @@ -9499,10 +9499,10 @@ function shouldResetDiagnosticsChecks({ function shouldDisableDiagnosticRunAction({ providerInfoLoaded, servicesInfoLoading, - forkopRunning, + tachyonRunning, mutatingServiceActionLoading }) { - return !providerInfoLoaded || servicesInfoLoading || !forkopRunning || mutatingServiceActionLoading; + return !providerInfoLoaded || servicesInfoLoading || !tachyonRunning || mutatingServiceActionLoading; } function hasComponentActionLoading(actions) { return Object.values(actions).some((action) => action.loading); @@ -9519,32 +9519,32 @@ function getAvailableActionsDisabledState({ }; } function shouldShowRestartAction({ - forkopRunning, + tachyonRunning, restartLoading, startLoading, stopLoading }) { - return restartLoading || forkopRunning && !startLoading && !stopLoading; + return restartLoading || tachyonRunning && !startLoading && !stopLoading; } function shouldShowStartAction({ - forkopRunning, + tachyonRunning, restartLoading, startLoading, stopLoading }) { - return startLoading || !restartLoading && !forkopRunning && !stopLoading; + return startLoading || !restartLoading && !tachyonRunning && !stopLoading; } function shouldShowStopAction({ - forkopRunning, + tachyonRunning, restartLoading, startLoading, stopLoading }) { - return stopLoading || restartLoading || forkopRunning && !startLoading; + return stopLoading || restartLoading || tachyonRunning && !startLoading; } -// src/forkop/tabs/diagnostic/diagnosticRunPersistence.ts -var DIAGNOSTIC_RUN_STORAGE_KEY = "forkop:diagnostic-run:v1"; +// src/tachyon/tabs/diagnostic/diagnosticRunPersistence.ts +var DIAGNOSTIC_RUN_STORAGE_KEY = "tachyon:diagnostic-run:v1"; var DIAGNOSTIC_RUN_TTL_MS = 30 * 60 * 1e3; var CHECK_STATES = ["loading", "warning", "success", "error", "skipped"]; var CHECK_ITEM_STATES = ["error", "warning", "success"]; @@ -9630,7 +9630,7 @@ function clearPersistedDiagnosticRun(storage = getSessionStorage3()) { } } -// src/forkop/tabs/diagnostic/helpers/maskDiagnostics.ts +// src/tachyon/tabs/diagnostic/helpers/maskDiagnostics.ts var MASKED_VALUE = "MASKED"; var SING_BOX_MASKED_KEYS = /* @__PURE__ */ new Set([ "auth_key", @@ -9659,7 +9659,7 @@ var SING_BOX_MASKED_KEYS = /* @__PURE__ */ new Set([ "ip_cidr", "source_ip_cidr" ]); -var FORKOP_MASK_AFTER_TOKEN = [ +var TACHYON_MASK_AFTER_TOKEN = [ "option proxy_string", "option subscription_url", "list subscription_urls", @@ -9677,7 +9677,7 @@ var FORKOP_MASK_AFTER_TOKEN = [ "list reality_short_id", "option yacd_secret_key" ]; -var FORKOP_MASK_AFTER_TOKEN_SPACE = [ +var TACHYON_MASK_AFTER_TOKEN_SPACE = [ "option outbound_json", "list domain", "list domain_suffix", @@ -9755,10 +9755,10 @@ function maskOptionPath(line, token) { } function maskGlobalCheckLine(line) { let maskedLine = line; - for (const token of FORKOP_MASK_AFTER_TOKEN) { + for (const token of TACHYON_MASK_AFTER_TOKEN) { maskedLine = maskAfterToken(maskedLine, token); } - for (const token of FORKOP_MASK_AFTER_TOKEN_SPACE) { + for (const token of TACHYON_MASK_AFTER_TOKEN_SPACE) { maskedLine = maskAfterTokenSpace(maskedLine, token); } maskedLine = maskOptionPath(maskedLine, "option dns_server '"); @@ -9817,7 +9817,7 @@ function maskGlobalCheckText(text = "") { }).join("\n"); } -// src/forkop/tabs/diagnostic/initController.ts +// src/tachyon/tabs/diagnostic/initController.ts var SERVICE_STATUS_REFRESH_INTERVAL_MS = 2e3; var SERVICE_ACTION_STATUS_TIMEOUT_MS = 45e3; var latestProviderInfoRequestId = 0; @@ -9872,25 +9872,25 @@ function isLocalMutatingServiceActionLoading() { return hasLocalMutatingServiceActionLoading(actions); } function isMutatingServiceActionLoading() { - return isLocalMutatingServiceActionLoading() || isServiceTransitionStatus(store.get().servicesInfoWidget.data.forkopStatus); + return isLocalMutatingServiceActionLoading() || isServiceTransitionStatus(store.get().servicesInfoWidget.data.tachyonStatus); } -function getForkopStatusText(running, enabled) { +function getTachyonStatusText(running, enabled) { if (running) { return enabled ? "running & enabled" : "running but disabled"; } return enabled ? "stopped but enabled" : "stopped & disabled"; } -function setDisplayedForkopRunning(running) { +function setDisplayedTachyonRunning(running) { const servicesInfoWidget = store.get().servicesInfoWidget; - const enabled = Boolean(servicesInfoWidget.data.forkopEnabled); + const enabled = Boolean(servicesInfoWidget.data.tachyonEnabled); store.set({ servicesInfoWidget: { ...servicesInfoWidget, loading: false, data: { ...servicesInfoWidget.data, - forkopRunning: running ? 1 : 0, - forkopStatus: getForkopStatusText(running, enabled) + tachyonRunning: running ? 1 : 0, + tachyonStatus: getTachyonStatusText(running, enabled) } } }); @@ -9928,14 +9928,14 @@ async function refreshDiagnosticServicesInfo({ servicesInfoRefreshPromise = promise; return promise; } -async function waitForForkopRunningState(expectedRunning) { +async function waitForTachyonRunningState(expectedRunning) { const startedAt = Date.now(); while (Date.now() - startedAt < SERVICE_ACTION_STATUS_TIMEOUT_MS) { await refreshDiagnosticServicesInfo({ force: true, allowInactive: true }); - const forkopRunning = Boolean( - store.get().servicesInfoWidget.data.forkopRunning + const tachyonRunning = Boolean( + store.get().servicesInfoWidget.data.tachyonRunning ); - if (forkopRunning === expectedRunning) { + if (tachyonRunning === expectedRunning) { return true; } await sleep2(SERVICE_STATUS_REFRESH_INTERVAL_MS); @@ -9982,7 +9982,7 @@ async function followServiceActionState(state) { } try { if (state.running) { - await ForkopShellMethods.waitServiceActionJob(jobId); + await TachyonShellMethods.waitServiceActionJob(jobId); } } catch (error) { logger.error("[DIAGNOSTIC]", "followServiceActionState failed", error); @@ -9990,7 +9990,7 @@ async function followServiceActionState(state) { handledServiceActionJobs.add(jobId); setServiceActionStateLoading(state, false); await refreshDiagnosticServicesInfo({ force: true, allowInactive: true }); - void ForkopShellMethods.uiActionAck("service", jobId); + void TachyonShellMethods.uiActionAck("service", jobId); followedServiceActionJobs.delete(jobId); resetDiagnosticsChecks(); } @@ -10065,10 +10065,10 @@ async function fetchDiagnosticsProviderInfo({ return; } const [zapretRuntime, zapret2Runtime, byedpiRuntime, inboundsConfig] = await Promise.all([ - ForkopShellMethods.checkZapretRuntime(), - ForkopShellMethods.checkZapret2Runtime(), - ForkopShellMethods.checkByedpiRuntime(), - ForkopShellMethods.checkInboundsConfig() + TachyonShellMethods.checkZapretRuntime(), + TachyonShellMethods.checkZapret2Runtime(), + TachyonShellMethods.checkByedpiRuntime(), + TachyonShellMethods.checkInboundsConfig() ]); if (requestId !== latestProviderInfoRequestId) { return; @@ -10156,14 +10156,14 @@ function renderDiagnosticRunActionWidget() { const { loading: loading2 } = store.get().diagnosticsRunAction; const providerInfoLoaded = store.get().diagnosticsSystemInfo.providerInfoLoaded; const servicesInfoWidget = store.get().servicesInfoWidget; - const forkopRunning = Boolean(servicesInfoWidget.data.forkopRunning); + const tachyonRunning = Boolean(servicesInfoWidget.data.tachyonRunning); const container = document.getElementById("fkp_diagnostic-page-run-check"); const renderedAction = renderRunAction({ loading: loading2, disabled: shouldDisableDiagnosticRunAction({ providerInfoLoaded, servicesInfoLoading: servicesInfoWidget.loading, - forkopRunning, + tachyonRunning, mutatingServiceActionLoading: isMutatingServiceActionLoading() }), click: () => runChecks() @@ -10182,10 +10182,10 @@ async function handleServiceRuntimeAction({ let ownsJobFollow = false; let delegatedToWatcher = false; if (optimisticRunning !== void 0) { - setDisplayedForkopRunning(optimisticRunning); + setDisplayedTachyonRunning(optimisticRunning); } try { - const startResponse = await ForkopShellMethods.serviceActionStart(action); + const startResponse = await TachyonShellMethods.serviceActionStart(action); if (!startResponse.success) { throw new Error(startResponse.error); } @@ -10196,14 +10196,14 @@ async function handleServiceRuntimeAction({ } followedServiceActionJobs.add(jobId); ownsJobFollow = true; - const result = await ForkopShellMethods.waitServiceActionJob(jobId); + const result = await TachyonShellMethods.waitServiceActionJob(jobId); if (!result.success) { throw new Error(result.error); } if (result.data.success === false) { throw new Error(result.data.message || _("Service action failed")); } - await waitForForkopRunningState(expectedRunning); + await waitForTachyonRunningState(expectedRunning); } catch (e) { logger.error("[DIAGNOSTIC]", `handleServiceRuntimeAction(${action})`, e); } finally { @@ -10215,7 +10215,7 @@ async function handleServiceRuntimeAction({ await refreshDiagnosticServicesInfo({ force: true, allowInactive: true }); if (jobId) { handledServiceActionJobs.add(jobId); - void ForkopShellMethods.uiActionAck("service", jobId); + void TachyonShellMethods.uiActionAck("service", jobId); } resetDiagnosticsChecks(); } @@ -10243,7 +10243,7 @@ async function handleStop() { async function handleEnable() { setDiagnosticActionLoading("enable", true); try { - await ForkopShellMethods.enable(); + await TachyonShellMethods.enable(); } catch (e) { logger.error("[DIAGNOSTIC]", "handleEnable - e", e); } finally { @@ -10257,7 +10257,7 @@ async function handleEnable() { async function handleDisable() { setDiagnosticActionLoading("disable", true); try { - await ForkopShellMethods.disable(); + await TachyonShellMethods.disable(); } catch (e) { logger.error("[DIAGNOSTIC]", "handleDisable - e", e); } finally { @@ -10271,7 +10271,7 @@ async function handleDisable() { async function handleShowGlobalCheck() { setDiagnosticActionLoading("globalCheck", true); try { - const globalCheck = await ForkopShellMethods.globalCheck(false); + const globalCheck = await TachyonShellMethods.globalCheck(false); if (globalCheck.success) { const rawGlobalCheckText = globalCheck.data ?? ""; const maskedGlobalCheckText = maskGlobalCheckText(rawGlobalCheckText); @@ -10295,10 +10295,10 @@ async function handleShowGlobalCheck() { async function handleViewLogs() { setDiagnosticActionLoading("viewLogs", true); try { - const viewLogs = await ForkopShellMethods.checkLogs(); + const viewLogs = await TachyonShellMethods.checkLogs(); if (viewLogs.success) { const getLatestLogs = async () => { - const latestLogs = await ForkopShellMethods.checkLogs(); + const latestLogs = await TachyonShellMethods.checkLogs(); if (!latestLogs.success) { throw latestLogs; } @@ -10326,7 +10326,7 @@ async function handleViewLogs() { async function handleShowSingBoxConfig() { setDiagnosticActionLoading("showSingBoxConfig", true); try { - const showSingBoxConfig = await ForkopShellMethods.showSingBoxConfig(false); + const showSingBoxConfig = await TachyonShellMethods.showSingBoxConfig(false); if (showSingBoxConfig.success) { const rawSingBoxConfigText = stringifySingBoxConfig( showSingBoxConfig.data @@ -10377,10 +10377,10 @@ function renderDiagnosticAvailableActionsWidget() { const updatesActions = store.get().updatesActions; const servicesInfoWidget = store.get().servicesInfoWidget; logger.debug("[DIAGNOSTIC]", "renderDiagnosticAvailableActionsWidget"); - const forkopEnabled = Boolean(servicesInfoWidget.data.forkopEnabled); - const forkopRunning = Boolean(servicesInfoWidget.data.forkopRunning); + const tachyonEnabled = Boolean(servicesInfoWidget.data.tachyonEnabled); + const tachyonRunning = Boolean(servicesInfoWidget.data.tachyonRunning); const serviceTransition = getServiceTransition( - servicesInfoWidget.data.forkopStatus + servicesInfoWidget.data.tachyonStatus ); const restartLoading = diagnosticsActions.restart.loading || serviceTransition.restarting; const startLoading = diagnosticsActions.start.loading || serviceTransition.starting; @@ -10393,13 +10393,13 @@ function renderDiagnosticAvailableActionsWidget() { componentActionLoading }); const startVisible = shouldShowStartAction({ - forkopRunning, + tachyonRunning, restartLoading, startLoading, stopLoading }); const stopVisible = shouldShowStopAction({ - forkopRunning, + tachyonRunning, restartLoading, startLoading, stopLoading @@ -10409,7 +10409,7 @@ function renderDiagnosticAvailableActionsWidget() { restart: { loading: restartLoading, visible: shouldShowRestartAction({ - forkopRunning, + tachyonRunning, restartLoading, startLoading, stopLoading @@ -10431,13 +10431,13 @@ function renderDiagnosticAvailableActionsWidget() { }, enable: { loading: diagnosticsActions.enable.loading, - visible: !forkopEnabled, + visible: !tachyonEnabled, onClick: handleEnable, disabled: serviceControlsDisabled }, disable: { loading: diagnosticsActions.disable.loading, - visible: forkopEnabled, + visible: tachyonEnabled, onClick: handleDisable, disabled: serviceControlsDisabled }, @@ -10470,12 +10470,12 @@ function renderDiagnosticSystemInfoWidget() { const container = document.getElementById("fkp_diagnostic-page-system-info"); const items = [ { - key: "Forkop", - value: normalizeCompiledVersion(diagnosticsSystemInfo.forkop_version) + key: "Tachyon", + value: normalizeCompiledVersion(diagnosticsSystemInfo.tachyon_version) }, { key: "Luci App", - value: normalizeCompiledVersion(FORKOP_LUCI_APP_VERSION) + value: normalizeCompiledVersion(TACHYON_LUCI_APP_VERSION) }, { key: "Sing-box", @@ -10762,14 +10762,14 @@ async function initController2() { }); } -// src/forkop/tabs/diagnostic/styles.ts +// src/tachyon/tabs/diagnostic/styles.ts var styles4 = ` -#cbi-${FORKOP_UCI_PACKAGE}-diagnostic-_mount_node > div { +#cbi-${TACHYON_UCI_PACKAGE}-diagnostic-_mount_node > div { width: 100%; } -#cbi-${FORKOP_UCI_PACKAGE}-diagnostic > h3 { +#cbi-${TACHYON_UCI_PACKAGE}-diagnostic > h3 { display: none; } @@ -10964,14 +10964,14 @@ var styles4 = ` } `; -// src/forkop/tabs/diagnostic/index.ts +// src/tachyon/tabs/diagnostic/index.ts var DiagnosticTab = { render: render2, initController: initController2, styles: styles4 }; -// src/forkop/tabs/monitoring/render.ts +// src/tachyon/tabs/monitoring/render.ts function render3() { return E( "div", @@ -11066,7 +11066,7 @@ function render3() { ); } -// src/forkop/tabs/monitoring/initController.ts +// src/tachyon/tabs/monitoring/initController.ts function normalizeConnectionsPayload(value) { if (!value || typeof value !== "object" || Array.isArray(value)) { return {}; @@ -11730,7 +11730,7 @@ function renderConnections(options = {}) { container.replaceChildren( renderConnectionsTable([], { text: _( - "Forkop service is stopped. Start the service to display connections." + "Tachyon service is stopped. Start the service to display connections." ) }) ); @@ -11932,7 +11932,7 @@ async function closeConnection(connectionId) { closingConnectionIds.add(connectionId); renderConnections(); try { - const response = await ForkopShellMethods.closeClashApiConnection(connectionId); + const response = await TachyonShellMethods.closeClashApiConnection(connectionId); if (!response.success) { showToast(_("Failed to close connection"), "error"); return; @@ -11961,7 +11961,7 @@ async function closeAllConnections() { closingAll = true; renderControls(); try { - const response = await ForkopShellMethods.closeAllClashApiConnections(); + const response = await TachyonShellMethods.closeAllClashApiConnections(); if (!response.success) { showToast(_("Failed to close connections"), "error"); return; @@ -12050,7 +12050,7 @@ async function loadLocalDevices() { } async function loadRouteDisplayNames() { try { - buildRouteDisplayNames(await CustomForkopMethods.getConfigSections()); + buildRouteDisplayNames(await CustomTachyonMethods.getConfigSections()); } catch (error) { logger.warn("[MONITORING]", "loadRouteDisplayNames: failed", error); buildRouteDisplayNames([]); @@ -12066,7 +12066,7 @@ async function pollConnectionsSnapshot() { const mountId = monitoringMountId; pollingConnections = true; try { - const response = await ForkopShellMethods.getClashApiConnections(); + const response = await TachyonShellMethods.getClashApiConnections(); if (!monitoringMounted || mountId !== monitoringMountId || serviceAvailability !== "running") { return; } @@ -12185,7 +12185,7 @@ function watchServiceState() { getServiceAvailability({ loading: false, failed: false, - running: uiState.service.forkop.running + running: uiState.service.tachyon.running }) ); }); @@ -12293,27 +12293,27 @@ async function initController3(controllerDependencies = {}) { }); } -// src/forkop/tabs/monitoring/styles.ts +// src/tachyon/tabs/monitoring/styles.ts var styles5 = ` -#cbi-${FORKOP_UCI_PACKAGE}-monitoring-_mount_node { +#cbi-${TACHYON_UCI_PACKAGE}-monitoring-_mount_node { margin: 16px 0 22px; padding: 0; } -#cbi-${FORKOP_UCI_PACKAGE}-monitoring-_mount_node > .cbi-value-title { +#cbi-${TACHYON_UCI_PACKAGE}-monitoring-_mount_node > .cbi-value-title { display: none; } -#cbi-${FORKOP_UCI_PACKAGE}-monitoring-_mount_node > .cbi-value-field { +#cbi-${TACHYON_UCI_PACKAGE}-monitoring-_mount_node > .cbi-value-field { margin-left: 0; width: 100%; } -#cbi-${FORKOP_UCI_PACKAGE}-monitoring-_mount_node > div { +#cbi-${TACHYON_UCI_PACKAGE}-monitoring-_mount_node > div { width: 100%; } -#cbi-${FORKOP_UCI_PACKAGE}-monitoring > h3 { +#cbi-${TACHYON_UCI_PACKAGE}-monitoring > h3 { display: none; } @@ -12926,14 +12926,14 @@ var styles5 = ` } `; -// src/forkop/tabs/monitoring/index.ts +// src/tachyon/tabs/monitoring/index.ts var MonitoringTab = { render: render3, initController: initController3, styles: styles5 }; -// src/forkop/tabs/updates/render.ts +// src/tachyon/tabs/updates/render.ts function render4() { return E("div", { id: "updates-status", class: "fkp_updates-page" }, [ E("div", { @@ -12943,12 +12943,12 @@ function render4() { ]); } -// src/forkop/tabs/updates/componentActionCompletion.ts +// src/tachyon/tabs/updates/componentActionCompletion.ts function shouldApplyCompletedComponentActionResult(result, notify) { return result.action !== "check_update" || notify; } -// src/forkop/tabs/updates/checkResultLifecycle.ts +// src/tachyon/tabs/updates/checkResultLifecycle.ts function shouldPreserveCompletedCheckResultOnNextMount({ action, mounted @@ -12974,7 +12974,7 @@ function shouldExposeCheckResults({ return mounted && cacheResolved; } -// src/forkop/tabs/updates/initController.ts +// src/tachyon/tabs/updates/initController.ts var updatesLifecycleRegistered = false; var updatesControllerInitialized = false; var updatesMounted = false; @@ -13031,7 +13031,7 @@ function isAnyActionLoading() { } function isServiceRuntimeActionLoading() { const state = store.get(); - return hasLocalMutatingServiceActionLoading(state.diagnosticsActions) || isServiceTransitionStatus(state.servicesInfoWidget.data.forkopStatus); + return hasLocalMutatingServiceActionLoading(state.diagnosticsActions) || isServiceTransitionStatus(state.servicesInfoWidget.data.tachyonStatus); } function isSystemInfoLoading() { const systemInfo = store.get().diagnosticsSystemInfo; @@ -13092,7 +13092,7 @@ function loadComponentUpdateCheckCache({ force = false } = {}) { if (componentUpdateCheckCachePromise) { return componentUpdateCheckCachePromise; } - const promise = ForkopShellMethods.componentUpdateCheckCache().then( + const promise = TachyonShellMethods.componentUpdateCheckCache().then( (response) => response.success ? response.data : { enabled: false, results: [] @@ -13113,7 +13113,7 @@ function getErrorMessage(error, fallback) { } async function ackComponentActionJob(jobId) { try { - const response = await ForkopShellMethods.uiActionAck("component", jobId); + const response = await TachyonShellMethods.uiActionAck("component", jobId); if (!response.success) { logger.debug("[UPDATES]", "component action ack failed", response.error); } @@ -13122,7 +13122,7 @@ async function ackComponentActionJob(jobId) { } } function getExpectedLatestVersionForAction(button) { - if (button.component !== "forkop" || button.action !== "install") { + if (button.component !== "tachyon" || button.action !== "install") { return void 0; } return store.get().updatesChecks[button.component].latest_version || void 0; @@ -13144,7 +13144,7 @@ function notifyActionProvidersAvailabilityChanged(systemInfo) { return; } window.dispatchEvent( - new CustomEvent(FORKOP_ACTION_PROVIDERS_AVAILABILITY_EVENT, { + new CustomEvent(TACHYON_ACTION_PROVIDERS_AVAILABILITY_EVENT, { detail: { zapretInstalled: Boolean(systemInfo.zapret_installed), zapret2Installed: Boolean(systemInfo.zapret2_installed), @@ -13153,7 +13153,7 @@ function notifyActionProvidersAvailabilityChanged(systemInfo) { }) ); } -function reloadPageAfterForkopUpdate() { +function reloadPageAfterTachyonUpdate() { window.setTimeout(() => { window.location.reload(); }, 1200); @@ -13162,8 +13162,8 @@ function patchSystemInfoAfterMutation(result) { const systemInfo = store.get().diagnosticsSystemInfo; const nextSystemInfo = { ...systemInfo, loading: false, loaded: true }; const version = result.current_version || result.latest_version || _("unknown"); - if (result.component === "forkop" && result.action === "install") { - nextSystemInfo.forkop_version = version; + if (result.component === "tachyon" && result.action === "install") { + nextSystemInfo.tachyon_version = version; } if (result.component === "sing_box") { nextSystemInfo.sing_box_version = version; @@ -13267,12 +13267,12 @@ async function applyCompletedComponentAction({ } patchSystemInfoAfterMutation(result); setActionLoading(key, false); - if (result.component === "forkop" && result.action === "install") { + if (result.component === "tachyon" && result.action === "install") { if (notify && result.message) { showToast(result.message, "success", 1200); } if (notify) { - reloadPageAfterForkopUpdate(); + reloadPageAfterTachyonUpdate(); } return; } @@ -13329,7 +13329,7 @@ async function followComponentActionState(state) { setActionLoading(key, true); } try { - const response = state.running ? await ForkopShellMethods.waitComponentActionJob( + const response = state.running ? await TachyonShellMethods.waitComponentActionJob( jobId, state.component, state.action, @@ -13421,7 +13421,7 @@ async function handleComponentAction(button) { let jobId = ""; let ownsJobFollow = false; try { - const startResponse = await ForkopShellMethods.componentActionStart( + const startResponse = await TachyonShellMethods.componentActionStart( button.component, button.action ); @@ -13449,7 +13449,7 @@ async function handleComponentAction(button) { } followedComponentJobs.add(jobId); ownsJobFollow = true; - const response = await ForkopShellMethods.waitComponentActionJob( + const response = await TachyonShellMethods.waitComponentActionJob( jobId, button.component, button.action, @@ -13534,10 +13534,10 @@ function getComponentCards() { const singBoxExtended = Boolean(systemInfo.sing_box_extended) && !systemInfo.sing_box_compressed; const singBoxExtendedCompressed = Boolean(systemInfo.sing_box_extended) && Boolean(systemInfo.sing_box_compressed); const singBoxTiny = Boolean(systemInfo.sing_box_tiny); - const forkopActions = getInstalledUpdateActions( - "forkop", - "forkopCheck", - "forkopInstall" + const tachyonActions = getInstalledUpdateActions( + "tachyon", + "tachyonCheck", + "tachyonInstall" ); const singBoxActions = getInstalledUpdateActions( "sing_box", @@ -13604,13 +13604,13 @@ function getComponentCards() { }); return [ { - component: "forkop", + component: "tachyon", column: 0, - title: "Forkop", - version: systemInfoLoading ? _("Loading...") : normalizeCompiledVersion(systemInfo.forkop_version), - latestVersion: getLatestVersion("forkop"), - releaseUrl: getGitHubReleaseUrl("forkop"), - actions: forkopActions + title: "Tachyon", + version: systemInfoLoading ? _("Loading...") : normalizeCompiledVersion(systemInfo.tachyon_version), + latestVersion: getLatestVersion("tachyon"), + releaseUrl: getGitHubReleaseUrl("tachyon"), + actions: tachyonActions }, { component: "sing_box", @@ -13944,13 +13944,13 @@ async function initController4() { }); } -// src/forkop/tabs/updates/styles.ts +// src/tachyon/tabs/updates/styles.ts var styles6 = ` -#cbi-${FORKOP_UCI_PACKAGE}-updates-_mount_node > div { +#cbi-${TACHYON_UCI_PACKAGE}-updates-_mount_node > div { width: 100%; } -#cbi-${FORKOP_UCI_PACKAGE}-updates > h3 { +#cbi-${TACHYON_UCI_PACKAGE}-updates > h3 { display: none; } @@ -14106,7 +14106,7 @@ var styles6 = ` } `; -// src/forkop/tabs/updates/index.ts +// src/tachyon/tabs/updates/index.ts var UpdatesTab = { render: render4, initController: initController4, @@ -14123,49 +14123,49 @@ ${PartialStyles} /* Hide extra H3 for settings tab */ -#cbi-${FORKOP_UCI_PACKAGE}-settings > h3 { +#cbi-${TACHYON_UCI_PACKAGE}-settings > h3 { display: none; } /* Hide extra H3 for rules tab */ -#cbi-${FORKOP_UCI_PACKAGE}-section > h3:nth-child(1) { +#cbi-${TACHYON_UCI_PACKAGE}-section > h3:nth-child(1) { display: none; } /* Vertical align for remove rule action button */ -#cbi-${FORKOP_UCI_PACKAGE}-section > .cbi-section-remove { +#cbi-${TACHYON_UCI_PACKAGE}-section > .cbi-section-remove { margin-bottom: -32px; } -#cbi-${FORKOP_UCI_PACKAGE}-section .cbi-section-actions > div { +#cbi-${TACHYON_UCI_PACKAGE}-section .cbi-section-actions > div { display: inline-flex; align-items: center; gap: 4px; } -#cbi-${FORKOP_UCI_PACKAGE}-section .cbi-section-actions { +#cbi-${TACHYON_UCI_PACKAGE}-section .cbi-section-actions { text-align: right; } /* Rule reorder visuals */ -#cbi-${FORKOP_UCI_PACKAGE}-section { +#cbi-${TACHYON_UCI_PACKAGE}-section { position: relative; } -#cbi-${FORKOP_UCI_PACKAGE}-section .cbi-section-table-row { +#cbi-${TACHYON_UCI_PACKAGE}-section .cbi-section-table-row { position: relative; } -#cbi-${FORKOP_UCI_PACKAGE}-section .cbi-section-table-row.placeholder { +#cbi-${TACHYON_UCI_PACKAGE}-section .cbi-section-table-row.placeholder { opacity: 1; } -#cbi-${FORKOP_UCI_PACKAGE}-section .cbi-section-table-row.placeholder em { +#cbi-${TACHYON_UCI_PACKAGE}-section .cbi-section-table-row.placeholder em { font-style: italic; } -#cbi-${FORKOP_UCI_PACKAGE}-section .cbi-section-table-row.drag-over-above::after, -#cbi-${FORKOP_UCI_PACKAGE}-section .cbi-section-table-row.drag-over-below::after { +#cbi-${TACHYON_UCI_PACKAGE}-section .cbi-section-table-row.drag-over-above::after, +#cbi-${TACHYON_UCI_PACKAGE}-section .cbi-section-table-row.drag-over-below::after { content: ''; position: absolute; left: 10px; @@ -14177,11 +14177,11 @@ ${PartialStyles} z-index: 2; } -#cbi-${FORKOP_UCI_PACKAGE}-section .cbi-section-table-row.drag-over-above::after { +#cbi-${TACHYON_UCI_PACKAGE}-section .cbi-section-table-row.drag-over-above::after { top: -1px; } -#cbi-${FORKOP_UCI_PACKAGE}-section .cbi-section-table-row.drag-over-below::after { +#cbi-${TACHYON_UCI_PACKAGE}-section .cbi-section-table-row.drag-over-below::after { bottom: -1px; } @@ -14274,15 +14274,15 @@ ${PartialStyles} `; // src/helpers/injectGlobalStyles.ts -var FORKOP_GLOBAL_STYLES_ID = "forkop-global-styles"; +var TACHYON_GLOBAL_STYLES_ID = "tachyon-global-styles"; function injectGlobalStyles() { - if (document.getElementById(FORKOP_GLOBAL_STYLES_ID)) { + if (document.getElementById(TACHYON_GLOBAL_STYLES_ID)) { return; } document.head.insertAdjacentHTML( "beforeend", ` - ` @@ -14300,12 +14300,12 @@ return baseclass.extend({ DOMAIN_LIST_OPTIONS, DashboardTab, DiagnosticTab, - FORKOP_ACTION_PROVIDERS_AVAILABILITY_EVENT, - FORKOP_UCI_PACKAGE, - ForkopShellMethods, LATENCY_TEST_URL_OPTIONS, MonitoringTab, REGIONAL_OPTIONS, + TACHYON_ACTION_PROVIDERS_AVAILABILITY_EVENT, + TACHYON_UCI_PACKAGE, + TachyonShellMethods, UpdatesTab, applyUiStateToStore, bulkValidate, diff --git a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/monitoring.js b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/monitoring.js index ef28077c..22bd8603 100644 --- a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/monitoring.js +++ b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/monitoring.js @@ -1,8 +1,8 @@ "use strict"; "require baseclass"; "require form"; -"require view.forkop.local_devices as localDevices"; -"require view.forkop.main as main"; +"require view.tachyon.local_devices as localDevices"; +"require view.tachyon.main as main"; function createMonitoringContent(section) { const o = section.option(form.DummyValue, "_mount_node"); diff --git a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js index 172830cd..228929fb 100644 --- a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js +++ b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js @@ -5,13 +5,13 @@ "require network"; "require ui"; "require uci"; -"require view.forkop.local_devices as localDevices"; -"require view.forkop.main as main"; +"require view.tachyon.local_devices as localDevices"; +"require view.tachyon.main as main"; -const UCI_PACKAGE = main.FORKOP_UCI_PACKAGE; +const UCI_PACKAGE = main.TACHYON_UCI_PACKAGE; const ACTION_PROVIDERS_AVAILABILITY_EVENT = - main.FORKOP_ACTION_PROVIDERS_AVAILABILITY_EVENT || - "forkop:action-providers-availability"; + main.TACHYON_ACTION_PROVIDERS_AVAILABILITY_EVENT || + "tachyon:action-providers-availability"; const RULE_SET_ITEM_SETTINGS_KEY = "rule_set_settings"; const ROUTING_ACTIONS = [ "connection", @@ -165,7 +165,7 @@ const BYEDPI_DEFAULT_CMD_OPTS = "-o 2 --auto=t,r,a,s -d 2"; const ANNOTATED_TEXTAREA_STYLE_ID = "fkp-annotated-textarea-styles"; const CONNECTIONS_DYNLIST_STYLE_ID = "fkp-connections-dynlist-styles"; const NFQWS_REMOTE_VALIDATION_DEBOUNCE_MS = 500; -const NFQWS_VALIDATION_COMMAND = "/usr/bin/forkop"; +const NFQWS_VALIDATION_COMMAND = "/usr/bin/tachyon"; const nfqwsRemoteValidationCache = new Map(); const nfqwsRemoteValidationInflight = new Map(); const nfqws2RemoteValidationCache = new Map(); @@ -431,7 +431,7 @@ let actionProvidersAvailabilityLoader = null; const outboundNameChoicesCache = new Map(); const outboundNameChoicesInflight = new Map(); const outboundNameSourceOptions = new Map(); -const SECTION_CACHE_DIR = "/var/run/forkop/section-cache"; +const SECTION_CACHE_DIR = "/var/run/tachyon/section-cache"; const COUNTRY_CODES = "AD AE AF AG AI AL AM AO AQ AR AS AT AU AW AX AZ BA BB BD BE BF BG BH BI BJ BL BM BN BO BQ BR BS BT BV BW BY BZ CA CC CD CF CG CH CI CK CL CM CN CO CR CU CV CW CX CY CZ DE DJ DK DM DO DZ EC EE EG EH ER ES ET FI FJ FK FM FO FR GA GB GD GE GF GG GH GI GL GM GN GP GQ GR GS GT GU GW GY HK HM HN HR HT HU ID IE IL IM IN IO IQ IR IS IT JE JM JO JP KE KG KH KI KM KN KP KR KW KY KZ LA LB LC LI LK LR LS LT LU LV LY MA MC MD ME MF MG MH MK ML MM MN MO MP MQ MR MS MT MU MV MW MX MY MZ NA NC NE NF NG NI NL NO NP NR NU NZ OM PA PE PF PG PH PK PL PM PN PR PS PT PW PY QA RE RO RS RU RW SA SB SC SD SE SG SH SI SJ SK SL SM SN SO SR SS ST SV SX SY SZ TC TD TF TG TH TJ TK TL TM TN TO TR TT TV TW TZ UA UG UM US UY UZ VA VC VE VG VI VN VU WF WS YE YT ZA ZM ZW XK".split( " ", @@ -3550,9 +3550,9 @@ function ensureActionProvidersAvailabilityLoaded() { } actionProvidersAvailabilityPromise = Promise.allSettled([ - main.ForkopShellMethods.checkZapretRuntime(), - main.ForkopShellMethods.checkZapret2Runtime(), - main.ForkopShellMethods.checkByedpiRuntime(), + main.TachyonShellMethods.checkZapretRuntime(), + main.TachyonShellMethods.checkZapret2Runtime(), + main.TachyonShellMethods.checkByedpiRuntime(), ]) .then(([zapretResult, zapret2Result, byedpiResult]) => { const zapret = @@ -4441,9 +4441,9 @@ function attachAnnotatedTextarea(textarea, analyzer) { ensureAnnotatedTextareaStyles(); - if (textarea.__forkopAnnotatedTextareaController) { - textarea.__forkopAnnotatedTextareaController.analyzer = analyzer; - textarea.__forkopAnnotatedTextareaController.update(); + if (textarea.__tachyonAnnotatedTextareaController) { + textarea.__tachyonAnnotatedTextareaController.analyzer = analyzer; + textarea.__tachyonAnnotatedTextareaController.update(); return; } @@ -4474,7 +4474,7 @@ function attachAnnotatedTextarea(textarea, analyzer) { }, }; - textarea.__forkopAnnotatedTextareaController = controller; + textarea.__tachyonAnnotatedTextareaController = controller; const updateAnnotatedTextarea = () => controller.update(); textarea.addEventListener("input", updateAnnotatedTextarea); @@ -4500,21 +4500,21 @@ function refreshAnnotatedTextareaValidation(option, section_id, textarea) { if ( textarea && - textarea.__forkopAnnotatedTextareaController && - typeof textarea.__forkopAnnotatedTextareaController.update === "function" + textarea.__tachyonAnnotatedTextareaController && + typeof textarea.__tachyonAnnotatedTextareaController.update === "function" ) { - textarea.__forkopAnnotatedTextareaController.update(); + textarea.__tachyonAnnotatedTextareaController.update(); } } function attachNfqwsRemoteValidation(option, section_id, textarea) { - if (!textarea || textarea.__forkopNfqwsRemoteValidationAttached) { + if (!textarea || textarea.__tachyonNfqwsRemoteValidationAttached) { return; } - textarea.__forkopNfqwsRemoteValidationAttached = true; - textarea.__forkopNfqwsRemoteValidationRequestId = 0; - textarea.__forkopNfqwsRemoteValidationTimer = null; + textarea.__tachyonNfqwsRemoteValidationAttached = true; + textarea.__tachyonNfqwsRemoteValidationRequestId = 0; + textarea.__tachyonNfqwsRemoteValidationTimer = null; const runValidation = () => { const value = textarea.value; @@ -4525,11 +4525,11 @@ function attachNfqwsRemoteValidation(option, section_id, textarea) { } const requestId = - (textarea.__forkopNfqwsRemoteValidationRequestId || 0) + 1; - textarea.__forkopNfqwsRemoteValidationRequestId = requestId; + (textarea.__tachyonNfqwsRemoteValidationRequestId || 0) + 1; + textarea.__tachyonNfqwsRemoteValidationRequestId = requestId; validateNfqwsStrategyRemotely(value).then(() => { - if (textarea.__forkopNfqwsRemoteValidationRequestId !== requestId) { + if (textarea.__tachyonNfqwsRemoteValidationRequestId !== requestId) { return; } @@ -4538,12 +4538,12 @@ function attachNfqwsRemoteValidation(option, section_id, textarea) { }; const scheduleValidation = (delay = NFQWS_REMOTE_VALIDATION_DEBOUNCE_MS) => { - if (textarea.__forkopNfqwsRemoteValidationTimer) { - window.clearTimeout(textarea.__forkopNfqwsRemoteValidationTimer); + if (textarea.__tachyonNfqwsRemoteValidationTimer) { + window.clearTimeout(textarea.__tachyonNfqwsRemoteValidationTimer); } - textarea.__forkopNfqwsRemoteValidationTimer = window.setTimeout(() => { - textarea.__forkopNfqwsRemoteValidationTimer = null; + textarea.__tachyonNfqwsRemoteValidationTimer = window.setTimeout(() => { + textarea.__tachyonNfqwsRemoteValidationTimer = null; runValidation(); }, delay); }; @@ -4556,13 +4556,13 @@ function attachNfqwsRemoteValidation(option, section_id, textarea) { } function attachNfqws2RemoteValidation(option, section_id, textarea) { - if (!textarea || textarea.__forkopNfqws2RemoteValidationAttached) { + if (!textarea || textarea.__tachyonNfqws2RemoteValidationAttached) { return; } - textarea.__forkopNfqws2RemoteValidationAttached = true; - textarea.__forkopNfqws2RemoteValidationRequestId = 0; - textarea.__forkopNfqws2RemoteValidationTimer = null; + textarea.__tachyonNfqws2RemoteValidationAttached = true; + textarea.__tachyonNfqws2RemoteValidationRequestId = 0; + textarea.__tachyonNfqws2RemoteValidationTimer = null; const runValidation = () => { const value = textarea.value; @@ -4573,11 +4573,11 @@ function attachNfqws2RemoteValidation(option, section_id, textarea) { } const requestId = - (textarea.__forkopNfqws2RemoteValidationRequestId || 0) + 1; - textarea.__forkopNfqws2RemoteValidationRequestId = requestId; + (textarea.__tachyonNfqws2RemoteValidationRequestId || 0) + 1; + textarea.__tachyonNfqws2RemoteValidationRequestId = requestId; validateNfqws2StrategyRemotely(value).then(() => { - if (textarea.__forkopNfqws2RemoteValidationRequestId !== requestId) { + if (textarea.__tachyonNfqws2RemoteValidationRequestId !== requestId) { return; } @@ -4586,12 +4586,12 @@ function attachNfqws2RemoteValidation(option, section_id, textarea) { }; const scheduleValidation = (delay = NFQWS_REMOTE_VALIDATION_DEBOUNCE_MS) => { - if (textarea.__forkopNfqws2RemoteValidationTimer) { - window.clearTimeout(textarea.__forkopNfqws2RemoteValidationTimer); + if (textarea.__tachyonNfqws2RemoteValidationTimer) { + window.clearTimeout(textarea.__tachyonNfqws2RemoteValidationTimer); } - textarea.__forkopNfqws2RemoteValidationTimer = window.setTimeout(() => { - textarea.__forkopNfqws2RemoteValidationTimer = null; + textarea.__tachyonNfqws2RemoteValidationTimer = window.setTimeout(() => { + textarea.__tachyonNfqws2RemoteValidationTimer = null; runValidation(); }, delay); }; @@ -5026,7 +5026,7 @@ function validateNfqwsStrategyRemotely(value) { function getNfqwsForbiddenTokenInfo(token, index) { const configFileMessage = _( - "External nfqws config files bypass Forkop queue management and explicit validation.", + "External nfqws config files bypass Tachyon queue management and explicit validation.", ); const hostSelectionMessage = _( "Resource selection by hostname inside nfqws is not supported here; sing-box selects resources before NFQUEUE.", @@ -5035,16 +5035,16 @@ function getNfqwsForbiddenTokenInfo(token, index) { "Resource selection by IP or CIDR inside nfqws is not supported here; sing-box selects resources before NFQUEUE.", ); const placeholderMessage = _( - "Zapret hostlist templates are not supported here because Forkop does not expand them for per-rule NFQWS strategies.", + "Zapret hostlist templates are not supported here because Tachyon does not expand them for per-rule NFQWS strategies.", ); const queueMessage = _( - "The NFQUEUE number is assigned by Forkop for each rule and must not be overridden here.", + "The NFQUEUE number is assigned by Tachyon for each rule and must not be overridden here.", ); const fwmarkMessage = _( - "The desync fwmark is managed by Forkop for loop prevention and must not be overridden here.", + "The desync fwmark is managed by Tachyon for loop prevention and must not be overridden here.", ); const daemonMessage = _( - "Forkop manages the nfqws process lifecycle itself, so daemon mode is not allowed here.", + "Tachyon manages the nfqws process lifecycle itself, so daemon mode is not allowed here.", ); const dryRunMessage = _( "This field must start a working nfqws strategy; --dry-run exits immediately and is not allowed here.", @@ -5471,7 +5471,7 @@ function validateNfqws2StrategyRemotely(value) { function getNfqws2ForbiddenTokenInfo(token, index, nextToken) { const configFileMessage = _( - "External nfqws2 config files bypass Forkop queue management and explicit validation.", + "External nfqws2 config files bypass Tachyon queue management and explicit validation.", ); const hostSelectionMessage = _( "Resource selection by hostname inside nfqws2 is not supported here; sing-box selects resources before NFQUEUE.", @@ -5480,22 +5480,22 @@ function getNfqws2ForbiddenTokenInfo(token, index, nextToken) { "Resource selection by IP or CIDR inside nfqws2 is not supported here; sing-box selects resources before NFQUEUE.", ); const placeholderMessage = _( - "Zapret2 hostlist templates are not supported here because Forkop does not expand them for per-rule NFQWS2 strategies.", + "Zapret2 hostlist templates are not supported here because Tachyon does not expand them for per-rule NFQWS2 strategies.", ); const queueMessage = _( - "The NFQUEUE number is assigned by Forkop for each rule and must not be overridden here.", + "The NFQUEUE number is assigned by Tachyon for each rule and must not be overridden here.", ); const fwmarkMessage = _( - "The desync fwmark is managed by Forkop for loop prevention and must not be overridden here.", + "The desync fwmark is managed by Tachyon for loop prevention and must not be overridden here.", ); const fuzzMessage = _( - "Fuzzing is not supported here because Forkop needs deterministic runtime validation.", + "Fuzzing is not supported here because Tachyon needs deterministic runtime validation.", ); const interceptMessage = _( - "Disabling interception is incompatible with action=zapret2 because Forkop sends matched traffic through NFQUEUE.", + "Disabling interception is incompatible with action=zapret2 because Tachyon sends matched traffic through NFQUEUE.", ); const daemonMessage = _( - "Forkop manages the nfqws2 process lifecycle itself, so daemon mode is not allowed here.", + "Tachyon manages the nfqws2 process lifecycle itself, so daemon mode is not allowed here.", ); const dryRunMessage = _( "This field must start a working nfqws2 strategy; --dry-run exits immediately and is not allowed here.", @@ -5891,16 +5891,16 @@ function byedpiTokenLooksLikeOption(token) { function getByedpiControlledTokenInfo(token) { const listenMessage = _( - "ByeDPI listen address and port are assigned by Forkop and must not be set in the strategy.", + "ByeDPI listen address and port are assigned by Tachyon and must not be set in the strategy.", ); const transparentMessage = _( - "Transparent proxy mode is incompatible with action=byedpi because Forkop connects to ciadpi through SOCKS.", + "Transparent proxy mode is incompatible with action=byedpi because Tachyon connects to ciadpi through SOCKS.", ); const daemonMessage = _( - "Forkop manages the ciadpi process lifecycle itself, so daemon mode is not allowed here.", + "Tachyon manages the ciadpi process lifecycle itself, so daemon mode is not allowed here.", ); const pidfileMessage = _( - "Forkop manages ciadpi pid files itself, so pidfile options are not allowed here.", + "Tachyon manages ciadpi pid files itself, so pidfile options are not allowed here.", ); const exitMessage = _( "This field must start a working ciadpi strategy; help/version options exit immediately and are not allowed here.", @@ -6630,7 +6630,7 @@ function createSectionContent(section) { form.ListValue, "action", _("Action"), - _("What Forkop should do when this section matches"), + _("What Tachyon should do when this section matches"), ); populateActionOptionValues(o); o.default = "connection"; diff --git a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js index 9788f202..b56b9735 100644 --- a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js +++ b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js @@ -6,9 +6,9 @@ "require rpc"; "require uci"; "require ui"; -"require view.forkop.main as main"; +"require view.tachyon.main as main"; -const UCI_PACKAGE = main.FORKOP_UCI_PACKAGE; +const UCI_PACKAGE = main.TACHYON_UCI_PACKAGE; const ROUTING_SECTION_ACTIONS = [ "connection", "proxy", @@ -385,7 +385,7 @@ function qrSvgDataUri(text) { return `data:image/svg+xml,${encodeURIComponent(svg)}`; } -const SERVER_STYLE_ID = "forkop-server-styles"; +const SERVER_STYLE_ID = "tachyon-server-styles"; const DEFAULT_SERVER_PROTOCOL = "tailscale"; const FALLBACK_SERVER_PROTOCOL = "vless"; const STREAM_PROTOCOLS = ["vless", "vmess", "trojan"]; @@ -938,15 +938,15 @@ function serverSafeName(sectionId) { } function defaultTlsCertificatePath(sectionId) { - return `/etc/forkop/server-certs/${serverSafeName(sectionId)}.crt`; + return `/etc/tachyon/server-certs/${serverSafeName(sectionId)}.crt`; } function defaultTlsKeyPath(sectionId) { - return `/etc/forkop/server-certs/${serverSafeName(sectionId)}.key`; + return `/etc/tachyon/server-certs/${serverSafeName(sectionId)}.key`; } function defaultTailscaleHostname(sectionId) { - return `forkop-${serverSafeName(sectionId)}`; + return `tachyon-${serverSafeName(sectionId)}`; } function setDefault(sectionId, key, value) { @@ -1356,7 +1356,7 @@ function loadGeneratedTlsCertificatePin(sectionId) { } return fs - .exec("/usr/bin/forkop", ["get_tls_certificate_sha256", sectionId]) + .exec("/usr/bin/tachyon", ["get_tls_certificate_sha256", sectionId]) .then((response) => { if ((response.code ?? 0) !== 0 || !response.stdout) { throw new Error(response.stderr || response.stdout || ""); @@ -2262,7 +2262,7 @@ function hasRealityKeypair(sectionId) { function generateRealityKeypair(sectionId) { return fs - .exec("/usr/bin/forkop", ["generate_reality_keypair"]) + .exec("/usr/bin/tachyon", ["generate_reality_keypair"]) .then((response) => { if ((response.code ?? 0) !== 0 || !response.stdout) { throw new Error(response.stderr || response.stdout || ""); diff --git a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js index ab13f3f9..527ae378 100644 --- a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js +++ b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js @@ -3,9 +3,9 @@ "require uci"; "require baseclass"; "require tools.widgets as widgets"; -"require view.forkop.main as main"; +"require view.tachyon.main as main"; -const UCI_PACKAGE = main.FORKOP_UCI_PACKAGE; +const UCI_PACKAGE = main.TACHYON_UCI_PACKAGE; function isSingBoxDuration(value) { return /^([0-9]+(?:\.[0-9]+)?(?:ns|us|ms|s|m|h|d))+$/.test(value); @@ -124,8 +124,8 @@ function configureDnsList(option, choices, defaultValue) { } function configureDnsFailoverVisibility(option, dnsOption, bootstrapOption) { - option.depends("dns_server", "__forkop_multiple_dns__"); - option.depends("bootstrap_dns_server", "__forkop_multiple_dns__"); + option.depends("dns_server", "__tachyon_multiple_dns__"); + option.depends("bootstrap_dns_server", "__tachyon_multiple_dns__"); option.retain = true; option.checkDepends = function (section_id) { return ( @@ -395,7 +395,7 @@ function createSettingsContent(section, capabilities) { form.Value, "badwan_reload_delay", _("Interface Monitoring Delay"), - _("Delay in milliseconds before reloading Forkop after interface UP"), + _("Delay in milliseconds before reloading Tachyon after interface UP"), ); o.depends("enable_badwan_interface_monitoring", "1"); o.default = "2000"; @@ -599,7 +599,7 @@ function createSettingsContent(section, capabilities) { form.Flag, "dont_touch_dhcp", _("Dont Touch My DHCP!"), - _("Forkop will not modify your DHCP configuration"), + _("Tachyon will not modify your DHCP configuration"), ); o.default = "0"; o.rmempty = false; diff --git a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js index 94b48724..28b8d695 100644 --- a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js +++ b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js @@ -4,30 +4,30 @@ "require baseclass"; "require uci"; "require ui"; -"require view.forkop.main as main"; +"require view.tachyon.main as main"; // Global settings -"require view.forkop.settings as settings"; +"require view.tachyon.settings as settings"; // Sections -"require view.forkop.section as section"; +"require view.tachyon.section as section"; // Server -"require view.forkop.server as server"; +"require view.tachyon.server as server"; // Dashboard -"require view.forkop.dashboard as dashboard"; +"require view.tachyon.dashboard as dashboard"; // Monitoring -"require view.forkop.monitoring as monitoring"; +"require view.tachyon.monitoring as monitoring"; // Diagnostic -"require view.forkop.diagnostic as diagnostic"; +"require view.tachyon.diagnostic as diagnostic"; // Updates -"require view.forkop.updates as updates"; +"require view.tachyon.updates as updates"; -const UCI_PACKAGE = main.FORKOP_UCI_PACKAGE; +const UCI_PACKAGE = main.TACHYON_UCI_PACKAGE; const CBI_PREFIX = UCI_PACKAGE; function renderSectionAdd(sectionRef, extra_class) { @@ -121,7 +121,7 @@ const EntryPoint = { if (typeof window !== "undefined") { window.dispatchEvent( - new CustomEvent(main.FORKOP_ACTION_PROVIDERS_AVAILABILITY_EVENT, { + new CustomEvent(main.TACHYON_ACTION_PROVIDERS_AVAILABILITY_EVENT, { detail: { zapretInstalled: uiCapabilities.zapretInstalled, zapret2Installed: uiCapabilities.zapret2Installed, @@ -209,9 +209,9 @@ const EntryPoint = { failed: false, data: { singbox: Number(data.service.sing_box?.running) || 0, - forkopRunning: Number(data.service.forkop?.running) || 0, - forkopEnabled: Number(data.service.forkop?.enabled) || 0, - forkopStatus: data.service.forkop?.status || "", + tachyonRunning: Number(data.service.tachyon?.running) || 0, + tachyonEnabled: Number(data.service.tachyon?.enabled) || 0, + tachyonStatus: data.service.tachyon?.status || "", }, }, }); @@ -222,11 +222,11 @@ const EntryPoint = { const loadFallbackUiCapabilities = function () { return Promise.allSettled([ - main.ForkopShellMethods.getServerCapabilities(), - main.ForkopShellMethods.checkZapretRuntime(), - main.ForkopShellMethods.checkZapret2Runtime(), - main.ForkopShellMethods.checkByedpiRuntime(), - main.ForkopShellMethods.checkInboundsConfig(), + main.TachyonShellMethods.getServerCapabilities(), + main.TachyonShellMethods.checkZapretRuntime(), + main.TachyonShellMethods.checkZapret2Runtime(), + main.TachyonShellMethods.checkByedpiRuntime(), + main.TachyonShellMethods.checkInboundsConfig(), ]).then( ([ serverCapabilitiesResult, @@ -308,7 +308,7 @@ const EntryPoint = { return uiCapabilitiesPromise; } - uiCapabilitiesPromise = main.ForkopShellMethods.getUiCapabilities() + uiCapabilitiesPromise = main.TachyonShellMethods.getUiCapabilities() .then((response) => { if (!response?.success) { throw new Error("UI capabilities request failed"); @@ -317,8 +317,8 @@ const EntryPoint = { return updateUiCapabilities(response.data); }) .catch((error) => { - console.warn("Failed to load Forkop UI capabilities", error); - return main.ForkopShellMethods.getUiState() + console.warn("Failed to load Tachyon UI capabilities", error); + return main.TachyonShellMethods.getUiState() .then((response) => { if (!response?.success) { throw new Error("UI state request failed"); @@ -327,7 +327,7 @@ const EntryPoint = { return applyUiState(response.data); }) .catch((fallbackError) => { - console.warn("Failed to load Forkop UI state", fallbackError); + console.warn("Failed to load Tachyon UI state", fallbackError); return loadFallbackUiCapabilities(); }); }) @@ -337,16 +337,16 @@ const EntryPoint = { return uiCapabilitiesPromise; }; - const forkopMap = new form.Map( + const tachyonMap = new form.Map( UCI_PACKAGE, - _("Forkop Settings"), - _("Configuration for Forkop service"), + _("Tachyon Settings"), + _("Configuration for Tachyon service"), ); - forkopMap.tabbed = true; - const originalHandleSaveApply = forkopMap.handleSaveApply; - forkopMap.handleSaveApply = function (ev, mode) { + tachyonMap.tabbed = true; + const originalHandleSaveApply = tachyonMap.handleSaveApply; + tachyonMap.handleSaveApply = function (ev, mode) { const refreshUiState = function () { - main.ForkopShellMethods.getUiState() + main.TachyonShellMethods.getUiState() .then((response) => { if ( response?.success && @@ -365,7 +365,7 @@ const EntryPoint = { ...servicesInfoWidget, data: { ...servicesInfoWidget.data, - forkopStatus: "reloading", + tachyonStatus: "reloading", }, }, }); @@ -384,7 +384,7 @@ const EntryPoint = { }); }; - const rulesSection = forkopMap.section( + const rulesSection = tachyonMap.section( form.GridSection, "section", _("Sections"), @@ -401,7 +401,7 @@ const EntryPoint = { }); section.createSectionContent(rulesSection); - const serverSection = forkopMap.section( + const serverSection = tachyonMap.section( form.GridSection, "server", _("Servers"), @@ -419,7 +419,7 @@ const EntryPoint = { }); server.createServerContent(serverSection, uiCapabilities); - const settingsSection = forkopMap.section( + const settingsSection = tachyonMap.section( form.TypedSection, "settings", _("Settings"), @@ -431,7 +431,7 @@ const EntryPoint = { }; settings.createSettingsContent(settingsSection, uiCapabilities); - const diagnosticSection = forkopMap.section( + const diagnosticSection = tachyonMap.section( form.TypedSection, "diagnostic", _("Diagnostics"), @@ -443,7 +443,7 @@ const EntryPoint = { }; diagnostic.createDiagnosticContent(diagnosticSection); - const dashboardSection = forkopMap.section( + const dashboardSection = tachyonMap.section( form.TypedSection, "dashboard", _("Dashboard"), @@ -455,7 +455,7 @@ const EntryPoint = { }; dashboard.createDashboardContent(dashboardSection); - const monitoringSection = forkopMap.section( + const monitoringSection = tachyonMap.section( form.TypedSection, "monitoring", _("Monitoring"), @@ -467,7 +467,7 @@ const EntryPoint = { }; monitoring.createMonitoringContent(monitoringSection); - const updatesSection = forkopMap.section( + const updatesSection = tachyonMap.section( form.TypedSection, "updates", _("Components"), @@ -481,7 +481,7 @@ const EntryPoint = { await loadUiCapabilities().catch(() => null); - const rendered = await forkopMap.render(); + const rendered = await tachyonMap.render(); main.coreService({ waitForLogWatcherStart: loadUiCapabilities, logWatcherStartDelayMs: 5000, diff --git a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/updates.js b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/updates.js index fc57fcdc..a1dc500a 100644 --- a/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/updates.js +++ b/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/updates.js @@ -4,7 +4,7 @@ "require ui"; "require uci"; "require fs"; -"require view.forkop.main as main"; +"require view.tachyon.main as main"; function createUpdatesContent(section) { const o = section.option(form.DummyValue, "_mount_node"); diff --git a/luci-app-tachyon/po/ru/tachyon.po b/luci-app-tachyon/po/ru/tachyon.po index 0653cd9d..e59e18c1 100644 --- a/luci-app-tachyon/po/ru/tachyon.po +++ b/luci-app-tachyon/po/ru/tachyon.po @@ -1,15 +1,15 @@ -# RU translations for FORKOP package. -# Copyright (C) 2026 THE FORKOP COPYRIGHT HOLDER -# This file is distributed under the same license as the FORKOP package. -# ushan0v, 2026. +# RU translations for TACHYON package. +# Copyright (C) 2026 THE TACHYON COPYRIGHT HOLDER +# This file is distributed under the same license as the TACHYON package. +# Dushnilin, 2026. # msgid "" msgstr "" -"Project-Id-Version: FORKOP\n" +"Project-Id-Version: TACHYON\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-13 03:22+0300\n" -"PO-Revision-Date: 2026-07-13 03:22+0300\n" -"Last-Translator: ushan0v\n" +"POT-Creation-Date: 2026-07-13 13:18+0300\n" +"PO-Revision-Date: 2026-07-13 13:18+0300\n" +"Last-Translator: Dushnilin\n" "Language-Team: none\n" "Language: ru\n" "MIME-Version: 1.0\n" @@ -191,8 +191,8 @@ msgstr "Встроенные наборы правил" msgid "By flag emoji from name" msgstr "По эмодзи флага из названия" -msgid "ByeDPI listen address and port are assigned by Forkop and must not be set in the strategy." -msgstr "Адрес и порт прослушивания ByeDPI назначаются Forkop и не должны задаваться в стратегии." +msgid "ByeDPI listen address and port are assigned by Tachyon and must not be set in the strategy." +msgstr "Адрес и порт прослушивания ByeDPI назначаются Tachyon и не должны задаваться в стратегии." msgid "ByeDPI option does not accept a compact value: %s" msgstr "Опция ByeDPI не принимает компактное значение: %s" @@ -323,8 +323,8 @@ msgstr "Условия" msgid "Config File Path" msgstr "Путь к файлу конфигурации" -msgid "Configuration for Forkop service" -msgstr "Настройки сервиса Forkop" +msgid "Configuration for Tachyon service" +msgstr "Настройки сервиса Tachyon" msgid "Configure User-Agent in the item settings" msgstr "Настройте User-Agent в настройках элемента" @@ -374,8 +374,8 @@ msgstr "Дашборд сейчас недоступен" msgid "Default address for checking server availability and latency. URLTest uses its own address." msgstr "Адрес по умолчанию для проверки доступности и задержки серверов. Для URLTest используется собственный адрес." -msgid "Delay in milliseconds before reloading Forkop after interface UP" -msgstr "Задержка в миллисекундах перед перезапуском Forkop после поднятия интерфейса" +msgid "Delay in milliseconds before reloading Tachyon after interface UP" +msgstr "Задержка в миллисекундах перед перезапуском Tachyon после поднятия интерфейса" msgid "Delay value cannot be empty" msgstr "Значение задержки не может быть пустым" @@ -419,8 +419,8 @@ msgstr "Отключить QUIC" msgid "Disable the QUIC protocol to improve compatibility or fix issues with video streaming" msgstr "Отключить QUIC протокол для улучшения совместимости или исправления видео стриминга" -msgid "Disabling interception is incompatible with action=zapret2 because Forkop sends matched traffic through NFQUEUE." -msgstr "Отключение перехвата несовместимо с action=zapret2, потому что Forkop отправляет совпавший трафик через NFQUEUE." +msgid "Disabling interception is incompatible with action=zapret2 because Tachyon sends matched traffic through NFQUEUE." +msgstr "Отключение перехвата несовместимо с action=zapret2, потому что Tachyon отправляет совпавший трафик через NFQUEUE." msgid "Display name" msgstr "Отображаемое имя" @@ -656,11 +656,11 @@ msgstr "Истекает" msgid "Expose this section as a local HTTP+SOCKS proxy" msgstr "Открыть эту секцию как локальный HTTP+SOCKS прокси" -msgid "External nfqws config files bypass Forkop queue management and explicit validation." -msgstr "Внешние конфиги nfqws обходят управление очередями и явную валидацию Forkop." +msgid "External nfqws config files bypass Tachyon queue management and explicit validation." +msgstr "Внешние конфиги nfqws обходят управление очередями и явную валидацию Tachyon." -msgid "External nfqws2 config files bypass Forkop queue management and explicit validation." -msgstr "Внешние конфиги nfqws2 обходят управление очередями и явную валидацию Forkop." +msgid "External nfqws2 config files bypass Tachyon queue management and explicit validation." +msgstr "Внешние конфиги nfqws2 обходят управление очередями и явную валидацию Tachyon." msgid "Failed to close connection" msgstr "Не удалось закрыть подключение" @@ -707,63 +707,6 @@ msgstr "Исправьте подсвеченные поля и сохранит msgid "Forced device routing" msgstr "Принудительная маршрутизация устройств" -msgid "Forkop Error" -msgstr "Ошибка Forkop" - -msgid "Forkop manages ciadpi pid files itself, so pidfile options are not allowed here." -msgstr "Forkop сам управляет pid-файлами ciadpi, поэтому параметры pidfile здесь запрещены." - -msgid "Forkop manages the ciadpi process lifecycle itself, so daemon mode is not allowed here." -msgstr "Forkop сам управляет жизненным циклом ciadpi, поэтому режим daemon здесь запрещён." - -msgid "Forkop manages the nfqws process lifecycle itself, so daemon mode is not allowed here." -msgstr "Forkop сам управляет жизненным циклом nfqws, поэтому режим daemon здесь запрещён." - -msgid "Forkop manages the nfqws2 process lifecycle itself, so daemon mode is not allowed here." -msgstr "Forkop сам управляет жизненным циклом nfqws2, поэтому режим daemon здесь запрещён." - -msgid "Forkop service is stopped. Start the service to display connections." -msgstr "Служба Forkop остановлена. Запустите сервис для отображения подключений." - -msgid "Forkop service is stopped. Start the service to display the dashboard." -msgstr "Служба Forkop остановлена. Запустите сервис для отображения дашборда." - -msgid "Forkop Settings" -msgstr "Настройки Forkop" - -msgid "Forkop will not modify your DHCP configuration" -msgstr "Forkop не будет изменять вашу конфигурацию DHCP" - -msgid "Forkop-managed ciadpi runtime has restarted" -msgstr "ciadpi Forkop перезапускался" - -msgid "Forkop-managed ciadpi runtime is not ready" -msgstr "ciadpi Forkop не готов" - -msgid "Forkop-managed ciadpi runtime is not running" -msgstr "ciadpi Forkop не запущен" - -msgid "Forkop-managed ciadpi runtime is ready" -msgstr "ciadpi Forkop готов" - -msgid "Forkop-managed nfqws runtime is not ready" -msgstr "NFQWS Forkop не готов" - -msgid "Forkop-managed nfqws runtime is not running" -msgstr "NFQWS Forkop не запущен" - -msgid "Forkop-managed nfqws runtime is ready" -msgstr "NFQWS Forkop готов" - -msgid "Forkop-managed nfqws2 runtime is not ready" -msgstr "NFQWS2 Forkop не готов" - -msgid "Forkop-managed nfqws2 runtime is not running" -msgstr "NFQWS2 Forkop не запущен" - -msgid "Forkop-managed nfqws2 runtime is ready" -msgstr "NFQWS2 Forkop готов" - msgid "Fronting IP" msgstr "IP фронтинга" @@ -773,8 +716,8 @@ msgstr "Порт фронтинга" msgid "Fronting proxy protocol" msgstr "Proxy protocol для фронтинга" -msgid "Fuzzing is not supported here because Forkop needs deterministic runtime validation." -msgstr "Fuzzing здесь не поддерживается, потому что Forkop нужна предсказуемая runtime-валидация." +msgid "Fuzzing is not supported here because Tachyon needs deterministic runtime validation." +msgstr "Fuzzing здесь не поддерживается, потому что Tachyon нужна предсказуемая runtime-валидация." msgid "Generate HWID from router hardware information for this subscription" msgstr "Генерировать HWID из аппаратной информации роутера для этой подписки" @@ -1541,8 +1484,8 @@ msgstr "Выбор ресурсов по IP или CIDR внутри nfqws зд msgid "Resource selection by IP or CIDR inside nfqws2 is not supported here; sing-box selects resources before NFQUEUE." msgstr "Выбор ресурсов по IP или CIDR внутри nfqws2 здесь не поддерживается; sing-box выбирает ресурсы до NFQUEUE." -msgid "Restart Forkop" -msgstr "Перезапустить Forkop" +msgid "Restart Tachyon" +msgstr "Перезапустить Tachyon" msgid "Resume updates" msgstr "Продолжить обновление" @@ -1787,8 +1730,8 @@ msgstr "Укажите разные файлы" msgid "Standalone ByeDPI autostart is enabled" msgstr "Автозапуск отдельной службы ByeDPI включен" -msgid "Standalone ByeDPI is active together with Forkop ByeDPI rules" -msgstr "Отдельная служба ByeDPI активна вместе с правилами ByeDPI в Forkop" +msgid "Standalone ByeDPI is active together with Tachyon ByeDPI rules" +msgstr "Отдельная служба ByeDPI активна вместе с правилами ByeDPI в Tachyon" msgid "Standalone ByeDPI service is active" msgstr "Отдельная служба ByeDPI активна" @@ -1796,8 +1739,8 @@ msgstr "Отдельная служба ByeDPI активна" msgid "Standalone ByeDPI service is inactive" msgstr "Отдельная служба ByeDPI неактивна" -msgid "Standalone Zapret is active together with Forkop Zapret rules" -msgstr "Отдельная служба Zapret активна вместе с правилами Zapret в Forkop" +msgid "Standalone Zapret is active together with Tachyon Zapret rules" +msgstr "Отдельная служба Zapret активна вместе с правилами Zapret в Tachyon" msgid "Standalone Zapret service is active" msgstr "Отдельная служба Zapret активна" @@ -1808,8 +1751,8 @@ msgstr "Отдельная служба Zapret неактивна" msgid "Standalone Zapret2 autostart is enabled" msgstr "Автозапуск отдельной службы Zapret2 включён" -msgid "Standalone Zapret2 is active together with Forkop Zapret2 rules" -msgstr "Отдельная служба Zapret2 активна вместе с правилами Zapret2 в Forkop" +msgid "Standalone Zapret2 is active together with Tachyon Zapret2 rules" +msgstr "Отдельная служба Zapret2 активна вместе с правилами Zapret2 в Tachyon" msgid "Standalone Zapret2 service is active" msgstr "Отдельная служба Zapret2 активна" @@ -1817,14 +1760,14 @@ msgstr "Отдельная служба Zapret2 активна" msgid "Standalone Zapret2 service is inactive" msgstr "Отдельная служба Zapret2 неактивна" -msgid "Start Forkop" -msgstr "Запустить Forkop" +msgid "Start Tachyon" +msgstr "Запустить Tachyon" msgid "Stop checking when URLTest group is not used. Use sing-box duration format like 1d, 12h or 30m." msgstr "Останавливать проверку если URLTest группа не используется. Используйте формат длительности sing-box, например 1d, 12h или 30m." -msgid "Stop Forkop" -msgstr "Остановить Forkop" +msgid "Stop Tachyon" +msgstr "Остановить Tachyon" msgid "Subnets from the list will be extracted and added to nftables" msgstr "IP-адреса и подсети из списка будут извлечены и добавлены в nftables" @@ -1862,6 +1805,63 @@ msgstr "Системная информация" msgid "Table exist" msgstr "Таблица существует" +msgid "Tachyon Error" +msgstr "Ошибка Tachyon" + +msgid "Tachyon manages ciadpi pid files itself, so pidfile options are not allowed here." +msgstr "Tachyon сам управляет pid-файлами ciadpi, поэтому параметры pidfile здесь запрещены." + +msgid "Tachyon manages the ciadpi process lifecycle itself, so daemon mode is not allowed here." +msgstr "Tachyon сам управляет жизненным циклом ciadpi, поэтому режим daemon здесь запрещён." + +msgid "Tachyon manages the nfqws process lifecycle itself, so daemon mode is not allowed here." +msgstr "Tachyon сам управляет жизненным циклом nfqws, поэтому режим daemon здесь запрещён." + +msgid "Tachyon manages the nfqws2 process lifecycle itself, so daemon mode is not allowed here." +msgstr "Tachyon сам управляет жизненным циклом nfqws2, поэтому режим daemon здесь запрещён." + +msgid "Tachyon service is stopped. Start the service to display connections." +msgstr "Служба Tachyon остановлена. Запустите сервис для отображения подключений." + +msgid "Tachyon service is stopped. Start the service to display the dashboard." +msgstr "Служба Tachyon остановлена. Запустите сервис для отображения дашборда." + +msgid "Tachyon Settings" +msgstr "Настройки Tachyon" + +msgid "Tachyon will not modify your DHCP configuration" +msgstr "Tachyon не будет изменять вашу конфигурацию DHCP" + +msgid "Tachyon-managed ciadpi runtime has restarted" +msgstr "ciadpi Tachyon перезапускался" + +msgid "Tachyon-managed ciadpi runtime is not ready" +msgstr "ciadpi Tachyon не готов" + +msgid "Tachyon-managed ciadpi runtime is not running" +msgstr "ciadpi Tachyon не запущен" + +msgid "Tachyon-managed ciadpi runtime is ready" +msgstr "ciadpi Tachyon готов" + +msgid "Tachyon-managed nfqws runtime is not ready" +msgstr "NFQWS Tachyon не готов" + +msgid "Tachyon-managed nfqws runtime is not running" +msgstr "NFQWS Tachyon не запущен" + +msgid "Tachyon-managed nfqws runtime is ready" +msgstr "NFQWS Tachyon готов" + +msgid "Tachyon-managed nfqws2 runtime is not ready" +msgstr "NFQWS2 Tachyon не готов" + +msgid "Tachyon-managed nfqws2 runtime is not running" +msgstr "NFQWS2 Tachyon не запущен" + +msgid "Tachyon-managed nfqws2 runtime is ready" +msgstr "NFQWS2 Tachyon готов" + msgid "Tailscale auth key" msgstr "Ключ авторизации Tailscale" @@ -1898,11 +1898,11 @@ msgstr "Тестировать серверы, имена которых сов msgid "Testing URL" msgstr "URL проверки" -msgid "The desync fwmark is managed by Forkop for loop prevention and must not be overridden here." -msgstr "Desync fwmark управляется Forkop для защиты от циклов и не должен переопределяться здесь." +msgid "The desync fwmark is managed by Tachyon for loop prevention and must not be overridden here." +msgstr "Desync fwmark управляется Tachyon для защиты от циклов и не должен переопределяться здесь." -msgid "The NFQUEUE number is assigned by Forkop for each rule and must not be overridden here." -msgstr "Номер NFQUEUE назначается Forkop для каждого правила и не должен переопределяться здесь." +msgid "The NFQUEUE number is assigned by Tachyon for each rule and must not be overridden here." +msgstr "Номер NFQUEUE назначается Tachyon для каждого правила и не должен переопределяться здесь." msgid "The rule applies to the domain and all its subdomains. Use full:, keyword:, or regex: prefixes for exact match, keyword match, or regular expression." msgstr "Правило применяется к домену и всем его поддоменам. Для полного совпадения, совпадению по слову или регулярному выражению используйте префиксы full:, keyword: или regex:." @@ -1967,8 +1967,8 @@ msgstr "Трафик этого уровня пойдёт напрямую." msgid "Traffic Total" msgstr "Всего трафика" -msgid "Transparent proxy mode is incompatible with action=byedpi because Forkop connects to ciadpi through SOCKS." -msgstr "Режим прозрачного прокси несовместим с action=byedpi, потому что Forkop подключается к ciadpi через SOCKS." +msgid "Transparent proxy mode is incompatible with action=byedpi because Tachyon connects to ciadpi through SOCKS." +msgstr "Режим прозрачного прокси несовместим с action=byedpi, потому что Tachyon подключается к ciadpi через SOCKS." msgid "Transport" msgstr "Транспорт" @@ -2015,18 +2015,18 @@ msgstr "Таймаут недоступности" msgid "Unexpected ByeDPI strategy argument: %s" msgstr "Неожиданный аргумент стратегии ByeDPI: %s" -msgid "Unexpected Forkop-managed ciadpi runtime is running" -msgstr "Обнаружен лишний ciadpi Forkop" - -msgid "Unexpected Forkop-managed nfqws runtime is running" -msgstr "Обнаружен лишний NFQWS Forkop" - -msgid "Unexpected Forkop-managed nfqws2 runtime is running" -msgstr "Обнаружен лишний NFQWS2 Forkop" - msgid "Unexpected standalone token. Use explicit flags such as --name or --name=value." msgstr "Неожиданный отдельный токен. Используйте явные флаги вида --имя или --имя=значение." +msgid "Unexpected Tachyon-managed ciadpi runtime is running" +msgstr "Обнаружен лишний ciadpi Tachyon" + +msgid "Unexpected Tachyon-managed nfqws runtime is running" +msgstr "Обнаружен лишний NFQWS Tachyon" + +msgid "Unexpected Tachyon-managed nfqws2 runtime is running" +msgstr "Обнаружен лишний NFQWS2 Tachyon" + msgid "unique UCI identifier" msgstr "уникальный идентификатор UCI" @@ -2192,8 +2192,8 @@ msgstr "Предупреждение: %s нельзя использовать msgid "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection." msgstr "Предупреждение: Russia inside может быть использован только с %s. %s уже есть в Russia inside и будет удален из выбранных." -msgid "What Forkop should do when this section matches" -msgstr "Что Forkop должен делать при совпадении этой секции" +msgid "What Tachyon should do when this section matches" +msgstr "Что Tachyon должен делать при совпадении этой секции" msgid "When switching to another level, test every server and select the fastest instead of the first working one." msgstr "При переходе на другой уровень тестировать все сервера и выбирать самый быстрый, а не первый работающий." @@ -2210,8 +2210,8 @@ msgstr "Да" msgid "You can select Output Network Interface, by default autodetect" msgstr "Вы можете выбрать выходной сетевой интерфейс, по умолчанию он определяется автоматически." -msgid "Zapret hostlist templates are not supported here because Forkop does not expand them for per-rule NFQWS strategies." -msgstr "Шаблоны hostlist zapret здесь не поддерживаются, потому что Forkop не разворачивает их для per-rule стратегий NFQWS." +msgid "Zapret hostlist templates are not supported here because Tachyon does not expand them for per-rule NFQWS strategies." +msgstr "Шаблоны hostlist zapret здесь не поддерживаются, потому что Tachyon не разворачивает их для per-rule стратегий NFQWS." msgid "Zapret package is installed" msgstr "Пакет Zapret установлен" @@ -2231,8 +2231,8 @@ msgstr "sing-box outbound для Zapret настроен" msgid "Zapret sing-box outbound is not configured" msgstr "sing-box outbound для Zapret не настроен" -msgid "Zapret2 hostlist templates are not supported here because Forkop does not expand them for per-rule NFQWS2 strategies." -msgstr "Шаблоны hostlist Zapret2 здесь не поддерживаются, потому что Forkop не разворачивает их для per-rule стратегий NFQWS2." +msgid "Zapret2 hostlist templates are not supported here because Tachyon does not expand them for per-rule NFQWS2 strategies." +msgstr "Шаблоны hostlist Zapret2 здесь не поддерживаются, потому что Tachyon не разворачивает их для per-rule стратегий NFQWS2." msgid "Zapret2 package is installed" msgstr "Пакет Zapret2 установлен" diff --git a/luci-app-tachyon/po/templates/tachyon.pot b/luci-app-tachyon/po/templates/tachyon.pot index b4ce84b3..2c9f02c4 100644 --- a/luci-app-tachyon/po/templates/tachyon.pot +++ b/luci-app-tachyon/po/templates/tachyon.pot @@ -1,195 +1,195 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) 2026 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the FORKOP package. -# ushan0v , 2026. +# This file is distributed under the same license as the TACHYON package. +# Dushnilin , 2026. #, fuzzy msgid "" msgstr "" -"Project-Id-Version: FORKOP\n" +"Project-Id-Version: TACHYON\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-13 00:22+0300\n" -"PO-Revision-Date: 2026-07-13 00:22+0300\n" -"Last-Translator: ushan0v \n" +"POT-Creation-Date: 2026-07-13 10:18+0300\n" +"PO-Revision-Date: 2026-07-13 10:18+0300\n" +"Last-Translator: Dushnilin \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1792 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2145 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2494 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2509 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2704 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2719 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1792 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2145 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2494 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2509 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2704 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2719 msgid "-- Select --" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6958 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6958 msgid "+ Add JSON outbound" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2877 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2877 msgid "+ Add level" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7041 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7041 msgid "+ Add priority" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6984 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6984 msgid "+ Add URLTest" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1675 -#: src/forkop/tabs/dashboard/initController.ts:1686 +#: src/tachyon/tabs/dashboard/initController.ts:1675 +#: src/tachyon/tabs/dashboard/initController.ts:1686 msgid "✔ Running" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1676 -#: src/forkop/tabs/dashboard/initController.ts:1687 +#: src/tachyon/tabs/dashboard/initController.ts:1676 +#: src/tachyon/tabs/dashboard/initController.ts:1687 msgid "✘ Stopped" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:408 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:408 msgid "Accept external proxy connections and route them with sing-box." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3133 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3133 msgid "Accept routes" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6603 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6632 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6603 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6632 msgid "Action" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:667 -#: src/forkop/tabs/monitoring/render.ts:20 +#: src/tachyon/tabs/monitoring/initController.ts:667 +#: src/tachyon/tabs/monitoring/render.ts:20 msgid "Active" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runDnsCheck.ts:56 +#: src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:56 msgid "Active Bootstrap DNS" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1633 +#: src/tachyon/tabs/dashboard/initController.ts:1633 msgid "Active Connections" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runDnsCheck.ts:67 +#: src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:67 msgid "Active Main DNS" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:397 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:397 msgid "Add a section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:414 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:414 msgid "Add a server inbound" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:119 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:119 msgid "Add at least one DNS server" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2194 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2194 msgid "Add prefix to nodes" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7493 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7493 msgid "Add URLs or local paths to .lst lists. Only domain rules are supported." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7442 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7469 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7442 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7469 msgid "Add URLs or local paths to .srs / .json lists. Only domain rules are supported." msgstr "" -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:106 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:106 msgid "Additional marking rules found" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2424 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2631 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2424 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2631 msgid "Additionally exclude servers by protocol, transport, and security. Exclude only servers matching the specified parameters." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2407 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2613 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2407 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2613 msgid "Additionally filter servers by protocol, transport, and security. Add only servers matching the specified parameters." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1653 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1653 msgid "Address" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3116 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3116 msgid "Advertise exit node" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3126 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3126 msgid "Advertise routes" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:626 -#: src/forkop/tabs/monitoring/render.ts:39 +#: src/tachyon/tabs/monitoring/initController.ts:626 +#: src/tachyon/tabs/monitoring/render.ts:39 msgid "All" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1689 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1689 msgid "All except selected" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1699 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1699 msgid "All remaining except selected" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1697 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1697 msgid "All remaining servers" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2587 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2587 msgid "All remaining servers means every server not already assigned to a higher-priority level." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1688 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1688 msgid "All servers" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7517 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7517 msgid "All traffic from these IP addresses will be routed through the section unconditionally, ignoring all other conditions." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4721 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4721 msgid "Allowed domain prefixes are full:, keyword:, and regex:" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:423 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:423 msgid "Allows access to YACD from the WAN. Make sure to open the appropriate port in your firewall." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2384 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2384 msgid "Allows limiting the list of servers for URLTest" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2645 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2645 msgid "ALPN" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2879 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2879 msgid "Alter ID" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7508 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7508 msgid "Apply section rules only to the specified local IP addresses" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4752 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4752 msgid "At least one valid domain must be specified." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4834 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4834 msgid "At least one valid IP or subnet must be specified." msgstr "" @@ -197,209 +197,209 @@ msgstr "" msgid "Auto refresh" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3036 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3036 msgid "Auto update" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2161 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2161 msgid "Auto-generate HWID" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:501 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:501 msgid "Automatic component update checks" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2130 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2130 msgid "Automatic User-Agent selection" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2195 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2195 msgid "Automatically add text to the name of each server from this subscription for convenient filtering." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:502 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:502 msgid "Automatically check installed components for new versions" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2818 -#: src/forkop/tabs/dashboard/initController.ts:1155 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2818 +#: src/tachyon/tabs/dashboard/initController.ts:1155 msgid "Automatically select the fastest node in the current level" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:43 +#: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:43 msgid "Available actions" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4967 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5412 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5824 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4967 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5412 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5824 msgid "Backend validation failed: %s" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runDnsCheck.ts:57 +#: src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:57 msgid "Bootstrap DNS" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:182 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:182 msgid "Bootstrap DNS Servers" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:51 -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:79 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:51 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:79 msgid "Browser FakeIP check could not be completed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:82 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:82 msgid "Browser is not using FakeIP" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:81 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:81 msgid "Browser is using FakeIP correctly" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7341 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7341 msgid "Built-in rule sets" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1706 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1706 msgid "By flag emoji from name" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5893 -msgid "ByeDPI listen address and port are assigned by Forkop and must not be set in the strategy." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5893 +msgid "ByeDPI listen address and port are assigned by Tachyon and must not be set in the strategy." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6070 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6070 msgid "ByeDPI option does not accept a compact value: %s" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5999 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5999 msgid "ByeDPI option does not accept a value: %s" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5991 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6017 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6051 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6060 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5991 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6017 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6051 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6060 msgid "ByeDPI option requires a value: %s" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:71 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:71 msgid "ByeDPI package is installed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:72 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:72 msgid "ByeDPI package is not installed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:64 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:64 msgid "ByeDPI provider binary is available" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:65 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:65 msgid "ByeDPI provider binary is not available" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:107 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:107 msgid "ByeDPI sing-box outbound is configured" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:108 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:108 msgid "ByeDPI sing-box outbound is not configured" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6804 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6804 msgid "ByeDPI Strategy" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6096 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6096 msgid "ByeDPI strategy cannot be empty" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:623 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:623 msgid "Cache File Path" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:637 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:637 msgid "Cache file path cannot be empty" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:26 -#: src/forkop/tabs/diagnostic/checks/runDnsCheck.ts:27 -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:172 -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:28 -#: src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts:48 -#: src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:25 -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:26 -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:26 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:26 +#: src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:27 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:172 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:28 +#: src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:48 +#: src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:25 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:26 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:26 msgid "Cannot receive checks result" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2241 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2241 msgid "Cannot save server" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7072 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7072 msgid "Cascade connection" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2655 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2655 msgid "Certificate path" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1598 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1598 msgid "Certificate pin is unavailable. Apply or restart the server to generate the default certificate, then open this dialog again." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2301 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2769 -#: src/forkop/tabs/dashboard/initController.ts:1142 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2301 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2769 +#: src/tachyon/tabs/dashboard/initController.ts:1142 msgid "Check interval" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2782 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2782 msgid "Check timeout after which the server is considered dead" msgstr "" -#: src/forkop/tabs/updates/initController.ts:740 +#: src/tachyon/tabs/updates/initController.ts:740 msgid "Check update" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2327 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2756 -#: src/forkop/tabs/dashboard/initController.ts:1140 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2327 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2756 +#: src/tachyon/tabs/dashboard/initController.ts:1140 msgid "Check URL" msgstr "" -#: src/forkop/tabs/diagnostic/initController.ts:1022 -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:14 -#: src/forkop/tabs/diagnostic/checks/runDnsCheck.ts:15 -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:15 -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:160 -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:13 -#: src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts:34 -#: src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:13 -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:14 -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:14 +#: src/tachyon/tabs/diagnostic/initController.ts:1022 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:14 +#: src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:15 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:15 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:160 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:13 +#: src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:34 +#: src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:13 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:14 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:14 msgid "Checking, please wait" msgstr "" -#: src/forkop/tabs/diagnostic/helpers/getCheckTitle.ts:2 +#: src/tachyon/tabs/diagnostic/helpers/getCheckTitle.ts:2 msgid "checks" msgstr "" -#: src/forkop/tabs/diagnostic/checks/getCheckItemsMeta.ts:10 -#: src/forkop/tabs/diagnostic/helpers/getMeta.ts:26 +#: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:10 +#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:26 msgid "Checks failed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/getCheckItemsMeta.ts:23 -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:43 -#: src/forkop/tabs/diagnostic/helpers/getMeta.ts:13 +#: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:23 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:43 +#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:13 msgid "Checks passed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/getDnsCheckPresentation.ts:27 +#: src/tachyon/tabs/diagnostic/checks/getDnsCheckPresentation.ts:27 msgid "Checks passed with manual DHCP" msgstr "" @@ -407,162 +407,162 @@ msgstr "" msgid "CIDR must be between 0 and 32 for IPv4 or 0 and 128 for IPv6" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2753 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2753 msgid "Client fingerprint" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1670 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1670 msgid "Client link" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1578 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1578 msgid "Client link is not available yet" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1611 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1611 msgid "Client link QR code" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3071 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1718 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3071 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1718 #: src/partials/modal/renderModal.ts:263 -#: src/forkop/tabs/dashboard/initController.ts:1027 -#: src/forkop/tabs/dashboard/initController.ts:1283 -#: src/forkop/tabs/monitoring/initController.ts:832 -#: src/forkop/tabs/monitoring/initController.ts:882 +#: src/tachyon/tabs/dashboard/initController.ts:1027 +#: src/tachyon/tabs/dashboard/initController.ts:1283 +#: src/tachyon/tabs/monitoring/initController.ts:832 +#: src/tachyon/tabs/monitoring/initController.ts:882 msgid "Close" msgstr "" -#: src/forkop/tabs/monitoring/render.ts:58 -#: src/forkop/tabs/monitoring/render.ts:59 +#: src/tachyon/tabs/monitoring/render.ts:58 +#: src/tachyon/tabs/monitoring/render.ts:59 msgid "Close all connections" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:799 -#: src/forkop/tabs/monitoring/initController.ts:800 +#: src/tachyon/tabs/monitoring/initController.ts:799 +#: src/tachyon/tabs/monitoring/initController.ts:800 msgid "Close connection" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:674 -#: src/forkop/tabs/monitoring/render.ts:29 +#: src/tachyon/tabs/monitoring/initController.ts:674 +#: src/tachyon/tabs/monitoring/render.ts:29 msgid "Closed" msgstr "" -#: src/forkop/services/core.service.ts:43 +#: src/tachyon/services/core.service.ts:43 msgid "Component update available" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:510 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:510 msgid "Component update check interval" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:473 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:473 msgid "Components" msgstr "" -#: src/forkop/helpers/singBoxVariant.ts:51 +#: src/tachyon/helpers/singBoxVariant.ts:51 msgid "compressed" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2988 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2988 msgid "Concurrency" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6591 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6591 msgid "Conditions" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:610 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:610 msgid "Config File Path" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:343 -msgid "Configuration for Forkop service" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:343 +msgid "Configuration for Tachyon service" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4063 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4063 msgid "Configure User-Agent in the item settings" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7110 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7110 msgid "Connect through" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6842 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6842 msgid "Connection URL" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:946 +#: src/tachyon/tabs/monitoring/initController.ts:946 msgid "Connections are unavailable" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts:145 +#: src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:145 msgid "Connectivity probe failed" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1565 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1565 #: src/helpers/copyToClipboard.ts:10 msgid "Copied" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1694 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1694 #: src/partials/modal/renderModal.ts:258 msgid "Copy" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:997 -#: src/forkop/tabs/dashboard/initController.ts:1253 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:366 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:367 +#: src/tachyon/tabs/dashboard/initController.ts:997 +#: src/tachyon/tabs/dashboard/initController.ts:1253 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:366 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:367 msgid "Copy proxy link" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:89 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:89 msgid "Could not compare FakeIP and control public IPs" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7127 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7127 msgid "Current section cannot be used as its own transit section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2122 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2122 msgid "Current section cannot download its own subscription" msgstr "" -#: src/forkop/tabs/dashboard/partials/renderWidget.ts:22 +#: src/tachyon/tabs/dashboard/partials/renderWidget.ts:22 msgid "Currently unavailable" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6953 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6953 msgid "Custom outbound configurations in JSON format" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:449 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:449 msgid "Dashboard" msgstr "" -#: src/forkop/tabs/dashboard/partials/renderSections.ts:47 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:47 msgid "Dashboard currently unavailable" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:546 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:546 msgid "Default address for checking server availability and latency. URLTest uses its own address." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:398 -msgid "Delay in milliseconds before reloading Forkop after interface UP" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:398 +msgid "Delay in milliseconds before reloading Tachyon after interface UP" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:405 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:405 msgid "Delay value cannot be empty" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1745 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1745 msgid "Delete" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2394 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2600 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2394 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2600 msgid "Detect server country" msgstr "" @@ -570,185 +570,185 @@ msgstr "" msgid "detour must be a non-empty string" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7507 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7507 msgid "Device filter" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6359 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6359 msgid "Device or IP" msgstr "" -#: src/forkop/tabs/diagnostic/checks/getDnsCheckPresentation.ts:37 +#: src/tachyon/tabs/diagnostic/checks/getDnsCheckPresentation.ts:37 msgid "DHCP has DNS server" msgstr "" -#: src/forkop/tabs/diagnostic/checks/getDnsCheckPresentation.ts:36 +#: src/tachyon/tabs/diagnostic/checks/getDnsCheckPresentation.ts:36 msgid "DHCP is managed manually" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:437 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:437 msgid "Diagnostics" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2563 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2563 msgid "Direct" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2577 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2577 msgid "Direct connection" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:79 +#: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:79 msgid "Disable autostart" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:445 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:445 msgid "Disable QUIC" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:446 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:446 msgid "Disable the QUIC protocol to improve compatibility or fix issues with video streaming" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5494 -msgid "Disabling interception is incompatible with action=zapret2 because Forkop sends matched traffic through NFQUEUE." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5494 +msgid "Disabling interception is incompatible with action=zapret2 because Tachyon sends matched traffic through NFQUEUE." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2283 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2745 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2283 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2745 msgid "Display name" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:196 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:196 msgid "DNS Check Interval" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runDnsCheck.ts:75 +#: src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:75 msgid "DNS on router" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1574 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:163 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1574 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:163 msgid "DNS over HTTPS (DoH)" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1575 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:164 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1575 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:164 msgid "DNS over TLS (DoT)" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2250 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6653 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2250 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6653 msgid "DNS protocol" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:160 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:160 msgid "DNS Protocol Type" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2251 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6654 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2251 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6654 msgid "DNS protocol used by the resolver" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6697 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:259 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6697 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:259 msgid "DNS requests through section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:222 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:222 msgid "DNS Rewrite TTL" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2260 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6666 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2260 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6666 msgid "DNS server" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6675 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6675 #: src/validators/validateDns.ts:8 msgid "DNS server address cannot be empty" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2261 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6667 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2261 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6667 msgid "DNS server used by the resolver" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:183 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:183 msgid "DNS server used to obtain IP addresses for upstream DNS and proxies. If multiple servers are selected, a timeout switches to a backup." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:172 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:172 msgid "DNS Servers" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:240 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:240 msgid "DNS Strategy" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:251 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:251 msgid "DNS through proxy" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6685 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6685 msgid "DNS through section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:212 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:212 msgid "DNS Unavailability Timeout" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts:26 +#: src/tachyon/tabs/diagnostic/partials/renderWikiDisclaimer.ts:26 msgid "Do not panic, everything can be fixed, just..." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2467 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2467 msgid "Do not test servers from these countries." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2483 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2483 msgid "Do not test servers whose names match the expression." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2428 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2428 msgid "Do not test servers with one of the selected protocols." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2434 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2434 msgid "Do not test servers with one of the selected security types." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2431 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2431 msgid "Do not test servers with one of the selected transports." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2475 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2475 msgid "Do not test specified servers." msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:54 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:54 msgid "Does not resolve" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7492 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7492 msgid "Domain lists" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2241 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2241 msgid "Domain Resolver" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7302 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7302 msgid "Domains" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:601 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:601 msgid "Dont Touch My DHCP!" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1559 -#: src/forkop/tabs/dashboard/initController.ts:1597 +#: src/tachyon/tabs/dashboard/initController.ts:1559 +#: src/tachyon/tabs/dashboard/initController.ts:1597 msgid "Downlink" msgstr "" @@ -756,48 +756,48 @@ msgstr "" msgid "Download" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:582 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:582 msgid "Download component packages via the selected section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:589 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:589 msgid "Download components through" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:581 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:581 msgid "Download components through a section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:569 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:569 msgid "Download lists through" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:561 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:561 msgid "Download lists through a section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:562 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:562 msgid "Download remote lists and rule sets via the selected section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2096 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2096 msgid "Download subscription through a section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2097 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2097 msgid "Download subscriptions via the selected section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2105 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2105 msgid "Download through" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:825 -#: src/forkop/tabs/monitoring/initController.ts:879 +#: src/tachyon/tabs/monitoring/initController.ts:825 +#: src/tachyon/tabs/monitoring/initController.ts:879 msgid "Downloaded" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:391 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:391 msgid "Drag rows to change priority. The rule at the top is checked first." msgstr "" @@ -805,375 +805,299 @@ msgstr "" msgid "Duplicate JSON outbound tag" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4158 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4173 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4193 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4158 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4173 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4193 msgid "Duplicate value" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:68 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1738 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1738 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:68 msgid "Edit rule action" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6593 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2480 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6593 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2480 msgid "Enable" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2840 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2840 msgid "Enable authentication" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:457 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:457 msgid "Enable automatic updates for remote lists and rule sets" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:89 +#: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:89 msgid "Enable autostart" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2242 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2242 msgid "Enable built-in DNS resolver for domains handled by this section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:456 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:456 msgid "Enable list updates" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7148 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7148 msgid "Enable Mixed Proxy" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7189 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7189 msgid "Enable Mixed Proxy Authentication" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:304 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:304 msgid "Enable Output Network Interface" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:413 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:413 msgid "Enable YACD" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:422 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:422 msgid "Enable YACD WAN Access" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2586 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2586 msgid "Enter a complete sing-box inbound object" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3405 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3405 msgid "Enter a complete sing-box outbound object" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2295 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2750 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3360 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3376 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2295 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2750 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3360 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3376 msgid "Enter a display name" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2550 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2571 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2550 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2571 msgid "Enter a level name" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6678 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6678 msgid "Enter a valid DNS server address" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2179 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2179 msgid "Enter HWID" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2171 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2171 msgid "Enter the HWID sent with subscription requests" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6865 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6865 msgid "Enter the subscription URL" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2423 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2630 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2423 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2630 msgid "Exclude by proxy parameters" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2482 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2692 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2482 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2692 msgid "Exclude by regular expression" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2466 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2676 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2466 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2676 msgid "Exclude countries" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:675 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:675 msgid "Exclude NTP" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:676 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:676 msgid "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2474 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2684 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2474 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2684 msgid "Exclude servers" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2638 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2638 msgid "Exclude servers with one of the selected protocols from this level." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2644 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2644 msgid "Exclude servers with one of the selected security types from this level." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2641 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2641 msgid "Exclude servers with one of the selected transports from this level." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:54 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:54 msgid "Expecting: %s" msgstr "" -#: src/forkop/tabs/dashboard/partials/renderSections.ts:134 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:134 msgid "Expires" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7149 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7149 msgid "Expose this section as a local HTTP+SOCKS proxy" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5028 -msgid "External nfqws config files bypass Forkop queue management and explicit validation." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5028 +msgid "External nfqws config files bypass Tachyon queue management and explicit validation." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5473 -msgid "External nfqws2 config files bypass Forkop queue management and explicit validation." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5473 +msgid "External nfqws2 config files bypass Tachyon queue management and explicit validation." msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:1213 -#: src/forkop/tabs/monitoring/initController.ts:1228 +#: src/tachyon/tabs/monitoring/initController.ts:1213 +#: src/tachyon/tabs/monitoring/initController.ts:1228 msgid "Failed to close connection" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:1247 -#: src/forkop/tabs/monitoring/initController.ts:1260 +#: src/tachyon/tabs/monitoring/initController.ts:1247 +#: src/tachyon/tabs/monitoring/initController.ts:1260 msgid "Failed to close connections" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1567 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1567 #: src/helpers/copyToClipboard.ts:12 msgid "Failed to copy!" msgstr "" -#: src/forkop/methods/shell/index.ts:170 -#: src/forkop/methods/shell/index.ts:177 -#: src/forkop/tabs/updates/initController.ts:508 -#: src/forkop/tabs/updates/initController.ts:509 -#: src/forkop/tabs/updates/initController.ts:569 -#: src/forkop/tabs/updates/initController.ts:719 +#: src/tachyon/methods/shell/index.ts:170 +#: src/tachyon/methods/shell/index.ts:177 +#: src/tachyon/tabs/updates/initController.ts:508 +#: src/tachyon/tabs/updates/initController.ts:509 +#: src/tachyon/tabs/updates/initController.ts:569 +#: src/tachyon/tabs/updates/initController.ts:719 msgid "Failed to execute" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:275 -#: src/forkop/tabs/dashboard/initController.ts:276 -#: src/forkop/tabs/dashboard/initController.ts:295 -#: src/forkop/tabs/dashboard/initController.ts:341 -#: src/forkop/tabs/dashboard/initController.ts:345 -#: src/forkop/tabs/dashboard/initController.ts:1341 -#: src/forkop/tabs/dashboard/initController.ts:1345 +#: src/tachyon/tabs/dashboard/initController.ts:275 +#: src/tachyon/tabs/dashboard/initController.ts:276 +#: src/tachyon/tabs/dashboard/initController.ts:295 +#: src/tachyon/tabs/dashboard/initController.ts:341 +#: src/tachyon/tabs/dashboard/initController.ts:345 +#: src/tachyon/tabs/dashboard/initController.ts:1341 +#: src/tachyon/tabs/dashboard/initController.ts:1345 msgid "Failed to update subscriptions" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:91 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:91 msgid "FakeIP and control checks use different public IPs" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:92 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:92 msgid "FakeIP and control checks use the same public IP" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:46 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:46 msgid "FakeIP works; public IP comparison is inconclusive" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2963 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2963 msgid "FakeTLS host" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3045 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3045 msgid "Fallback on unknown DC" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2829 -#: src/forkop/tabs/dashboard/initController.ts:1161 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2829 +#: src/tachyon/tabs/dashboard/initController.ts:1161 msgid "Faster server search interval" msgstr "" -#: src/forkop/methods/custom/getDashboardSections.ts:646 +#: src/tachyon/methods/custom/getDashboardSections.ts:646 msgid "Fastest" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:136 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:136 msgid "Firewall WAN port" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2242 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2242 msgid "Fix the highlighted fields and save again." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7516 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7516 msgid "Forced device routing" msgstr "" -#: src/forkop/services/core.service.ts:52 -msgid "Forkop Error" -msgstr "" - -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5902 -msgid "Forkop manages ciadpi pid files itself, so pidfile options are not allowed here." -msgstr "" - -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5899 -msgid "Forkop manages the ciadpi process lifecycle itself, so daemon mode is not allowed here." -msgstr "" - -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5046 -msgid "Forkop manages the nfqws process lifecycle itself, so daemon mode is not allowed here." -msgstr "" - -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5497 -msgid "Forkop manages the nfqws2 process lifecycle itself, so daemon mode is not allowed here." -msgstr "" - -#: src/forkop/tabs/monitoring/initController.ts:925 -msgid "Forkop service is stopped. Start the service to display connections." -msgstr "" - -#: src/forkop/tabs/dashboard/render.ts:17 -msgid "Forkop service is stopped. Start the service to display the dashboard." -msgstr "" - -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:342 -msgid "Forkop Settings" -msgstr "" - -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:602 -msgid "Forkop will not modify your DHCP configuration" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:91 -msgid "Forkop-managed ciadpi runtime has restarted" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:94 -msgid "Forkop-managed ciadpi runtime is not ready" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:97 -msgid "Forkop-managed ciadpi runtime is not running" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:93 -msgid "Forkop-managed ciadpi runtime is ready" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:87 -msgid "Forkop-managed nfqws runtime is not ready" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:90 -msgid "Forkop-managed nfqws runtime is not running" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:86 -msgid "Forkop-managed nfqws runtime is ready" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:90 -msgid "Forkop-managed nfqws2 runtime is not ready" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:93 -msgid "Forkop-managed nfqws2 runtime is not running" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:89 -msgid "Forkop-managed nfqws2 runtime is ready" -msgstr "" - -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3008 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3008 msgid "Fronting IP" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2997 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2997 msgid "Fronting port" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3018 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3018 msgid "Fronting proxy protocol" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5491 -msgid "Fuzzing is not supported here because Forkop needs deterministic runtime validation." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5491 +msgid "Fuzzing is not supported here because Tachyon needs deterministic runtime validation." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2162 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2162 msgid "Generate HWID from router hardware information for this subscription" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:89 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:89 msgid "Generated inbound" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:98 +#: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:98 msgid "Get global check" msgstr "" -#: src/forkop/tabs/diagnostic/initController.ts:682 +#: src/tachyon/tabs/diagnostic/initController.ts:682 msgid "Global check" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2820 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2820 msgid "gRPC service" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3073 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3073 msgid "Handshake timeout" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2374 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2863 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2374 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2863 msgid "Hide added servers" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2230 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2230 msgid "Hide cascade connection nodes" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2864 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2864 msgid "Hide dashboard servers added to Priority" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2375 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2375 msgid "Hide dashboard servers added to URLTest" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2219 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2219 msgid "Hide individual nodes that are already included in imported subscription URLTest groups" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2231 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2231 msgid "Hide intermediate nodes used as detours by other subscription nodes" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2218 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2218 msgid "Hide URLTest group nodes" msgstr "" @@ -1181,147 +1105,147 @@ msgstr "" msgid "Hide values" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2793 -#: src/forkop/tabs/dashboard/initController.ts:1147 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2793 +#: src/tachyon/tabs/dashboard/initController.ts:1147 msgid "Higher-level check interval" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:204 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:204 msgid "Higher-priority DNS Check" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:815 -#: src/forkop/tabs/monitoring/initController.ts:875 +#: src/tachyon/tabs/monitoring/initController.ts:815 +#: src/tachyon/tabs/monitoring/initController.ts:875 msgid "Host" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2794 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2794 msgid "How often higher priority levels are checked while a lower level is active" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2770 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2770 msgid "How often the currently selected server is checked" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:197 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:197 msgid "How often to check the active DNS servers." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:205 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:205 msgid "How often to check whether a higher-priority DNS server has recovered." msgstr "" -#: src/forkop/api.ts:27 +#: src/tachyon/api.ts:27 msgid "HTTP error" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2813 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2813 msgid "HTTP hosts" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2170 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2170 msgid "HWID" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2340 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3063 -#: src/forkop/tabs/dashboard/initController.ts:916 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2340 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3063 +#: src/tachyon/tabs/dashboard/initController.ts:916 msgid "Idle timeout" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2209 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2209 msgid "Import subscription URLTest groups" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2210 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2210 msgid "Import URLTest groups returned by this subscription provider" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2585 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2585 msgid "Inbound JSON" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1971 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1971 msgid "Inbound JSON cannot be empty" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1982 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1982 msgid "Inbound JSON must be an object with a type field" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2406 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2612 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2406 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2612 msgid "Include by proxy parameters" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2458 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2668 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2458 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2668 msgid "Include by regular expression" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2442 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2652 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2442 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2652 msgid "Include countries" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3480 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3480 msgid "Include IP addresses and subnets" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2450 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2660 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2450 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2660 msgid "Include servers" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1746 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1746 msgid "Information" msgstr "" -#: src/forkop/tabs/updates/initController.ts:754 +#: src/tachyon/tabs/updates/initController.ts:754 msgid "Install" msgstr "" -#: src/forkop/tabs/updates/initController.ts:1159 +#: src/tachyon/tabs/updates/initController.ts:1159 msgid "Install another build:" msgstr "" -#: src/forkop/tabs/updates/initController.ts:291 -#: src/forkop/tabs/updates/initController.ts:1017 +#: src/tachyon/tabs/updates/initController.ts:291 +#: src/tachyon/tabs/updates/initController.ts:1017 msgid "Installed version is newer than release" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:365 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:365 msgid "Interface Monitoring" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:397 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:397 msgid "Interface Monitoring Delay" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:366 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:366 msgid "Interface monitoring for Bad WAN" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2354 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2845 -#: src/forkop/tabs/dashboard/initController.ts:918 -#: src/forkop/tabs/dashboard/initController.ts:1167 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2354 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2845 +#: src/tachyon/tabs/dashboard/initController.ts:918 +#: src/tachyon/tabs/dashboard/initController.ts:1167 msgid "Interrupt existing connections" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2846 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2846 msgid "Interrupt existing connections when priority failover switches server" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2355 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2355 msgid "Interrupt existing connections when URLTest switches the selected server" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:914 +#: src/tachyon/tabs/dashboard/initController.ts:914 msgid "Interval" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6825 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6825 msgid "Invalid ByeDPI strategy" msgstr "" @@ -1333,7 +1257,7 @@ msgstr "" msgid "Invalid DNS server format. Examples: 8.8.8.8 or dns.example.com or dns.example.com/nicedns for DoH" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4701 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4701 #: src/validators/validateDomain.ts:67 #: src/validators/validateDomain.ts:73 msgid "Invalid domain address" @@ -1450,12 +1374,12 @@ msgstr "" msgid "Invalid IP address" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1984 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1984 #: src/validators/validateOutboundJson.ts:58 msgid "Invalid JSON format" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6782 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6782 msgid "Invalid NFQWS2 strategy" msgstr "" @@ -1463,16 +1387,16 @@ msgstr "" msgid "Invalid path format. Path must start with \"/\" and contain valid characters" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7182 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7182 #: src/validators/validateShadowsocksUrl.ts:93 msgid "Invalid port number. Must be between 1 and 65535" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4850 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4850 msgid "Invalid port or range. Use 80 or 1000-2000" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3974 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3974 msgid "Invalid regular expression" msgstr "" @@ -1582,27 +1506,27 @@ msgstr "" msgid "Invalid VMess URL: parsing failed" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7331 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7331 msgid "IPs" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:242 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:242 msgid "IPv4 only" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:244 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:244 msgid "IPv6 only" msgstr "" -#: src/forkop/tabs/diagnostic/checks/getCheckItemsMeta.ts:17 -#: src/forkop/tabs/diagnostic/helpers/getMeta.ts:20 +#: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:17 +#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:20 msgid "Issues detected" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1034 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3404 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3640 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6952 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1034 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3404 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3640 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6952 msgid "JSON outbound" msgstr "" @@ -1622,374 +1546,374 @@ msgstr "" msgid "JSON outbound must contain a non-empty type field" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3428 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3428 msgid "JSON outbound settings" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2855 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2855 msgid "Keep Priority before latency-sorted servers" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2366 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2366 msgid "Keep URLTest before latency-sorted servers" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2670 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2670 msgid "Key path" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3984 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3984 msgid "Keyword must not contain spaces or commas" msgstr "" -#: src/forkop/methods/shell/index.ts:462 -#: src/forkop/methods/shell/index.ts:483 +#: src/tachyon/methods/shell/index.ts:462 +#: src/tachyon/methods/shell/index.ts:483 msgid "Latency test failed" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:545 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:545 msgid "Latency test URL" msgstr "" -#: src/forkop/tabs/updates/initController.ts:294 -#: src/forkop/tabs/updates/initController.ts:1015 +#: src/tachyon/tabs/updates/initController.ts:294 +#: src/tachyon/tabs/updates/initController.ts:1015 msgid "Latest version is installed" msgstr "" -#: src/forkop/tabs/updates/initController.ts:1017 +#: src/tachyon/tabs/updates/initController.ts:1017 msgid "Latest version:" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1100 +#: src/tachyon/tabs/dashboard/initController.ts:1100 msgid "Level" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2566 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2566 msgid "Level name" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6524 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6524 msgid "List must be an HTTP(S) URL or a local .lst path" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:465 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:465 msgid "List Update Frequency" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2535 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2535 msgid "Listen address" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2542 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2542 msgid "Listen port" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:125 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:125 msgid "Listening port" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1703 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1703 msgid "Loading client link..." msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:936 -#: src/forkop/tabs/monitoring/render.ts:88 +#: src/tachyon/tabs/monitoring/initController.ts:936 +#: src/tachyon/tabs/monitoring/render.ts:88 msgid "Loading connections" msgstr "" -#: src/forkop/tabs/updates/initController.ts:905 -#: src/forkop/tabs/updates/initController.ts:916 -#: src/forkop/tabs/updates/initController.ts:927 -#: src/forkop/tabs/updates/initController.ts:940 -#: src/forkop/tabs/updates/initController.ts:953 +#: src/tachyon/tabs/updates/initController.ts:905 +#: src/tachyon/tabs/updates/initController.ts:916 +#: src/tachyon/tabs/updates/initController.ts:927 +#: src/tachyon/tabs/updates/initController.ts:940 +#: src/tachyon/tabs/updates/initController.ts:953 msgid "Loading..." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:659 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:659 msgid "Log Level" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runDnsCheck.ts:67 +#: src/tachyon/tabs/diagnostic/checks/runDnsCheck.ts:67 msgid "Main DNS" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:173 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:173 msgid "Main DNS server. If multiple servers are selected, a timeout switches to a backup." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7332 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7332 msgid "Match destination IPs or subnets" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7526 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7526 msgid "Match destination ports. Use a single port or a range" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:213 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:213 msgid "Maximum time to wait for example.com to resolve during a DNS health check." msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1637 +#: src/tachyon/tabs/dashboard/initController.ts:1637 msgid "Memory Usage" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2827 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2827 msgid "Method" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2314 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2314 msgid "Minimum latency difference in milliseconds that triggers switching to a faster server." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7240 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7240 msgid "Mixed Proxy Password" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7163 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7163 msgid "Mixed Proxy Port" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7204 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7204 msgid "Mixed Proxy Username" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:374 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:374 msgid "Monitored Interfaces" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:461 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:461 msgid "Monitoring" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1804 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1819 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1804 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1819 msgid "Must be a number in the range of 0 - 10000" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2284 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2746 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2284 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2746 msgid "Name displayed on the dashboard" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2567 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2567 msgid "Name shown in the priority level list" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1619 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6912 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1619 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6912 msgid "Network Interface" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3195 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3195 msgid "Network interface settings" msgstr "" -#: src/forkop/services/core.service.ts:38 +#: src/tachyon/services/core.service.ts:38 msgid "New version %s is available for %s" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:100 -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:97 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:100 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:97 msgid "NFQUEUE range is available" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:99 -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:96 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:99 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:96 msgid "NFQUEUE range overlaps with another rule" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6714 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6714 msgid "NFQWS Strategy" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5158 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5158 msgid "NFQWS strategy cannot be empty" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6761 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6761 msgid "NFQWS2 Strategy" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5632 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5632 msgid "NFQWS2 strategy cannot be empty" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:762 -#: src/forkop/tabs/dashboard/initController.ts:766 -#: src/forkop/tabs/dashboard/initController.ts:842 -#: src/forkop/tabs/dashboard/initController.ts:1055 +#: src/tachyon/tabs/dashboard/initController.ts:762 +#: src/tachyon/tabs/dashboard/initController.ts:766 +#: src/tachyon/tabs/dashboard/initController.ts:842 +#: src/tachyon/tabs/dashboard/initController.ts:1055 msgid "No" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:960 +#: src/tachyon/tabs/monitoring/initController.ts:960 msgid "No active connections" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:961 +#: src/tachyon/tabs/monitoring/initController.ts:961 msgid "No closed connections" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:32 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:32 msgid "No conflict detected" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:187 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:187 msgid "No enabled server inbounds configured" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:105 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:105 msgid "No other marking rules found" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:99 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:99 msgid "No public firewall port required" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:79 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:79 msgid "No rules use ByeDPI" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:79 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:79 msgid "No rules use Zapret" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:82 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:82 msgid "No rules use Zapret2" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1012 -#: src/forkop/tabs/dashboard/initController.ts:1268 +#: src/tachyon/tabs/dashboard/initController.ts:1012 +#: src/tachyon/tabs/dashboard/initController.ts:1268 msgid "Node list is empty" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:942 -#: src/forkop/tabs/dashboard/initController.ts:1191 +#: src/tachyon/tabs/dashboard/initController.ts:942 +#: src/tachyon/tabs/dashboard/initController.ts:1191 msgid "Nodes" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:446 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2600 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2892 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2901 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:446 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2600 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2892 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2901 msgid "None" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:46 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:46 msgid "Not configured" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:70 -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:199 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:70 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:199 msgid "Not detected" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderCheckSection.ts:189 +#: src/tachyon/tabs/diagnostic/partials/renderCheckSection.ts:189 msgid "Not implement yet" msgstr "" -#: src/forkop/helpers/singBoxVariant.ts:29 -#: src/forkop/helpers/singBoxVariant.ts:37 -#: src/forkop/tabs/updates/initController.ts:930 -#: src/forkop/tabs/updates/initController.ts:943 -#: src/forkop/tabs/updates/initController.ts:956 +#: src/tachyon/helpers/singBoxVariant.ts:29 +#: src/tachyon/helpers/singBoxVariant.ts:37 +#: src/tachyon/tabs/updates/initController.ts:930 +#: src/tachyon/tabs/updates/initController.ts:943 +#: src/tachyon/tabs/updates/initController.ts:956 msgid "Not installed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:62 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:62 msgid "Not public" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:139 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:139 msgid "Not required for this listen address" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts:90 -#: src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts:117 -#: src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts:123 -#: src/forkop/tabs/diagnostic/checks/runSectionsCheck.ts:151 +#: src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:90 +#: src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:117 +#: src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:123 +#: src/tachyon/tabs/diagnostic/checks/runSectionsCheck.ts:151 msgid "Not responding" msgstr "" -#: src/forkop/tabs/diagnostic/diagnostic.store.ts:125 -#: src/forkop/tabs/diagnostic/initController.ts:116 -#: src/forkop/tabs/diagnostic/initController.ts:346 -#: src/forkop/tabs/diagnostic/initController.ts:403 -#: src/forkop/tabs/diagnostic/initController.ts:489 +#: src/tachyon/tabs/diagnostic/diagnostic.store.ts:125 +#: src/tachyon/tabs/diagnostic/initController.ts:116 +#: src/tachyon/tabs/diagnostic/initController.ts:346 +#: src/tachyon/tabs/diagnostic/initController.ts:403 +#: src/tachyon/tabs/diagnostic/initController.ts:489 msgid "Not running" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2900 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2900 msgid "Obfuscation" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2923 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2923 msgid "Obfuscation password" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2653 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2653 msgid "Only from the specified countries." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1690 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1698 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1690 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1698 msgid "Only selected" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1691 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1700 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1691 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1700 msgid "Only selected except exclusions" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2669 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2669 msgid "Only servers whose names match the expression." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2620 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2620 msgid "Only servers with one of the selected protocols." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2624 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2624 msgid "Only servers with one of the selected security types." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2621 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2621 msgid "Only servers with one of the selected transports." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2661 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2661 msgid "Only the specified servers." msgstr "" -#: src/forkop/tabs/updates/initController.ts:1008 -#: src/forkop/tabs/updates/initController.ts:1030 +#: src/tachyon/tabs/updates/initController.ts:1008 +#: src/tachyon/tabs/updates/initController.ts:1030 msgid "Open" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3372 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3372 msgid "Open priority settings and enter a display name" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts:31 +#: src/tachyon/tabs/diagnostic/partials/renderWikiDisclaimer.ts:31 msgid "Open Project Page" msgstr "" #: src/helpers/withTimeout.ts:7 -#: src/forkop/methods/shell/index.ts:432 -#: src/forkop/methods/shell/index.ts:520 +#: src/tachyon/methods/shell/index.ts:432 +#: src/tachyon/methods/shell/index.ts:520 msgid "Operation timed out" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1344 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4092 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6234 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1344 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4092 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6234 msgid "Option \"%s\" contains an invalid input value." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5236 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5236 msgid "Optional values must be attached with '=' here; a separate token would be ignored by nfqws." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5710 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5710 msgid "Optional values must be attached with '=' here; a separate token would be ignored by nfqws2." msgstr "" @@ -1997,19 +1921,19 @@ msgstr "" msgid "outbounds must be a non-empty array of strings" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:313 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:313 msgid "Output Network Interface" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2982 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2982 msgid "Padding" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2863 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2863 msgid "Password" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7266 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7266 msgid "Password cannot be empty" msgstr "" @@ -2017,407 +1941,407 @@ msgstr "" msgid "Path cannot be empty" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:641 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:641 msgid "Path must be absolute (start with /)" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:650 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:650 msgid "Path must contain at least one directory (like /tmp/cache.db)" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:645 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:645 msgid "Path must end with cache.db" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:691 -#: src/forkop/tabs/monitoring/render.ts:70 -#: src/forkop/tabs/monitoring/render.ts:71 +#: src/tachyon/tabs/monitoring/initController.ts:691 +#: src/tachyon/tabs/monitoring/render.ts:70 +#: src/tachyon/tabs/monitoring/render.ts:71 msgid "Pause updates" msgstr "" -#: src/forkop/tabs/diagnostic/diagnostic.store.ts:63 +#: src/tachyon/tabs/diagnostic/diagnostic.store.ts:63 msgid "Pending" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2819 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2819 msgid "Periodically check the current level and switch to a faster server even when the current one works." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2365 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2854 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2365 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2854 msgid "Pin on dashboard" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7174 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7174 msgid "Port cannot be empty" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:19 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:19 msgid "Port conflict" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7164 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7164 msgid "Port for the local mixed proxy of this section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4857 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1814 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4857 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1814 msgid "Port must be between 1 and 65535" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4861 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4861 msgid "Port range start must be less than or equal to end" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7525 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7525 msgid "Ports" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:241 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:241 msgid "Prefer IPv4" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:243 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:243 msgid "Prefer IPv6" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3025 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3025 msgid "Preferred IP" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2202 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2202 msgid "Prefix text" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7035 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7035 msgid "Priority" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1298 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:404 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:405 +#: src/tachyon/tabs/dashboard/initController.ts:1298 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:404 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:405 msgid "Priority details" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1128 +#: src/tachyon/tabs/dashboard/initController.ts:1128 msgid "Priority details are unavailable" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3259 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3260 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3259 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3260 msgid "Priority level settings" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2872 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2872 msgid "Priority levels" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3317 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3322 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3323 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3317 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3322 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3323 msgid "Priority settings" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1760 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2486 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2520 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1760 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2486 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2520 msgid "Protocol" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:757 +#: src/tachyon/tabs/dashboard/initController.ts:757 msgid "Proxy link is unavailable" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2549 -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:40 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2549 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:40 msgid "Public host" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1613 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1613 msgid "QR code is too large" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2688 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2688 msgid "Reality fake site" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2699 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2699 msgid "Reality fake site port" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2742 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2742 msgid "Reality max time difference" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2710 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2710 msgid "Reality private key" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2717 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2717 msgid "Reality public key" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2723 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2723 msgid "Reality short ID" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2095 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2095 msgid "Reality short ID must contain 1-8 hex digits" msgstr "" -#: src/forkop/tabs/dashboard/partials/renderSections.ts:135 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:135 msgid "Refill" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7386 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7386 msgid "Regional options cannot be used together" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4743 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4743 msgid "Regular expression must not contain spaces or commas" msgstr "" -#: src/forkop/tabs/updates/initController.ts:799 +#: src/tachyon/tabs/updates/initController.ts:799 msgid "Remove" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2677 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2677 msgid "Remove servers from the specified countries from this level." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2693 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2693 msgid "Remove servers whose names match the expression from this level." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2685 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2685 msgid "Remove the specified servers from this level." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7190 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7190 msgid "Require a username and password for the local mixed proxy" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7277 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7277 msgid "Resolve domain names before routing so sing-box can use real destination IPs." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7276 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7276 msgid "Resolve real IP for routing" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5031 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5031 msgid "Resource selection by hostname inside nfqws is not supported here; sing-box selects resources before NFQUEUE." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5476 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5476 msgid "Resource selection by hostname inside nfqws2 is not supported here; sing-box selects resources before NFQUEUE." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5034 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5034 msgid "Resource selection by IP or CIDR inside nfqws is not supported here; sing-box selects resources before NFQUEUE." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5479 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5479 msgid "Resource selection by IP or CIDR inside nfqws2 is not supported here; sing-box selects resources before NFQUEUE." msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:49 -msgid "Restart Forkop" +#: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:49 +msgid "Restart Tachyon" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:691 +#: src/tachyon/tabs/monitoring/initController.ts:691 msgid "Resume updates" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:819 -#: src/forkop/tabs/monitoring/initController.ts:877 +#: src/tachyon/tabs/monitoring/initController.ts:819 +#: src/tachyon/tabs/monitoring/initController.ts:877 msgid "Route" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:252 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:252 msgid "Route main DNS requests through the selected section." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6686 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6686 msgid "Route requests to this DNS server through another section." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2561 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2561 msgid "Routing mode" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:103 -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:114 -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:144 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:103 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:114 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:144 msgid "Routing rules" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2570 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2570 msgid "Routing section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6515 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6515 msgid "Rule set must be an HTTP(S) URL or a local .srs / .json path" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3487 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3487 msgid "Rule set settings" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7441 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7468 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7441 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7468 msgid "Rule sets" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2562 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2562 msgid "Rules" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:79 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:79 msgid "Rules mangle counters" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:74 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:74 msgid "Rules mangle exist" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:89 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:89 msgid "Rules mangle output counters" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:84 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:84 msgid "Rules mangle output exist" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:99 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:99 msgid "Rules proxy counters" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:94 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:94 msgid "Rules proxy exist" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderRunAction.ts:17 +#: src/tachyon/tabs/diagnostic/partials/renderRunAction.ts:17 msgid "Run Diagnostic" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7405 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7405 msgid "Russia inside restrictions" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3080 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3080 msgid "Save" msgstr "" -#: src/forkop/tabs/monitoring/render.ts:47 +#: src/tachyon/tabs/monitoring/render.ts:47 msgid "Search" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2939 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2939 msgid "Secret" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:435 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:435 msgid "Secret key for authenticating remote access to YACD when WAN access is enabled." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:396 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:396 msgid "Section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6619 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6619 msgid "Section name" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:390 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:390 msgid "Sections" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1772 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2597 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1772 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2597 msgid "Security" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2142 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2142 msgid "Select a common client profile or enter a custom User-Agent" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6918 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6918 msgid "Select a network interface" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7342 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7342 msgid "Select a predefined domain list" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6707 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:84 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6707 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:84 msgid "Select a section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2119 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2119 msgid "Select a section for downloading this subscription" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7111 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7111 msgid "Select a transit section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1670 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1670 msgid "Select an existing network interface" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7124 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7124 msgid "Select an intermediate section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:161 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:161 msgid "Select DNS protocol to use" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6913 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6913 msgid "Select network interface for VPN connection" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2155 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2155 msgid "Select or enter a User-Agent" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:624 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:624 msgid "Select or enter path for sing-box cache file. Change this ONLY if you know what you are doing" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:611 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:611 msgid "Select path for sing-box config file. Change this ONLY if you know what you are doing" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2807 -#: src/forkop/tabs/dashboard/initController.ts:1151 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2807 +#: src/tachyon/tabs/dashboard/initController.ts:1151 msgid "Select the fastest node" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:660 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:660 msgid "Select the log level for sing-box" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:268 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:268 msgid "Select the network interface from which the traffic will originate" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:314 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:314 msgid "Select the network interface to which the traffic will originate" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:375 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:375 msgid "Select the WAN interfaces to be monitored" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:910 -#: src/forkop/tabs/dashboard/initController.ts:1137 +#: src/tachyon/tabs/dashboard/initController.ts:910 +#: src/tachyon/tabs/dashboard/initController.ts:1137 msgid "Selected" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2564 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2564 msgid "Selected section" msgstr "" @@ -2425,33 +2349,33 @@ msgstr "" msgid "Selector and URLTest outbounds must contain a non-empty outbounds array" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:413 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:413 msgid "Server" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2383 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2586 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2383 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2586 msgid "Server filtering" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6979 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6979 msgid "Server group for automatic lowest-latency selection" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7036 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7036 msgid "Server group for priority failover" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1707 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1707 msgid "Server information" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1623 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2497 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1623 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2497 msgid "Server name" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2626 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2626 msgid "Server name / SNI" msgstr "" @@ -2467,486 +2391,562 @@ msgstr "" msgid "server_port must be a number from 1 to 65535" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:407 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:407 msgid "Servers" msgstr "" -#: src/forkop/methods/shell/index.ts:383 -#: src/forkop/methods/shell/index.ts:404 -#: src/forkop/tabs/diagnostic/initController.ts:594 +#: src/tachyon/methods/shell/index.ts:383 +#: src/tachyon/methods/shell/index.ts:404 +#: src/tachyon/tabs/diagnostic/initController.ts:594 msgid "Service action failed" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7345 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7345 msgid "Service list" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1670 +#: src/tachyon/tabs/dashboard/initController.ts:1670 msgid "Services info" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:425 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1095 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6590 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1095 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6590 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:425 msgid "Settings" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2185 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2185 msgid "Show metadata on dashboard" msgstr "" -#: src/forkop/tabs/diagnostic/initController.ts:751 -#: src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:116 +#: src/tachyon/tabs/diagnostic/initController.ts:751 +#: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:116 msgid "Show sing-box config" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2186 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2186 msgid "Show subscription metadata for this source on the dashboard" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:77 +#: src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:77 msgid "Sing-box autostart disabled" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:69 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:69 msgid "Sing-box FakeIP DNS does not work" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runFakeIPCheck.ts:68 +#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:68 msgid "Sing-box FakeIP DNS works" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:62 +#: src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:62 msgid "Sing-box installed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:87 +#: src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:87 msgid "Sing-box listening ports" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:82 +#: src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:82 msgid "Sing-box process running" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:72 +#: src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:72 msgid "Sing-box service exist" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runSingBoxCheck.ts:67 +#: src/tachyon/tabs/diagnostic/checks/runSingBoxCheck.ts:67 msgid "Sing-box version is compatible (newer than 1.12.4)" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7136 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7136 msgid "Sort by latency" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7137 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7137 msgid "Sorts servers in this section by lowest latency in the dashboard." msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:831 -#: src/forkop/tabs/monitoring/initController.ts:881 +#: src/tachyon/tabs/monitoring/initController.ts:831 +#: src/tachyon/tabs/monitoring/initController.ts:881 msgid "Source" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:267 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:267 msgid "Source Network Interface" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1930 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1930 msgid "Specify a file path" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1941 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1953 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1941 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1953 msgid "Specify different files" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:122 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:122 msgid "Standalone ByeDPI autostart is enabled" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:119 -msgid "Standalone ByeDPI is active together with Forkop ByeDPI rules" +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:119 +msgid "Standalone ByeDPI is active together with Tachyon ByeDPI rules" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:120 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:120 msgid "Standalone ByeDPI service is active" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:123 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:123 msgid "Standalone ByeDPI service is inactive" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:111 -msgid "Standalone Zapret is active together with Forkop Zapret rules" +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:111 +msgid "Standalone Zapret is active together with Tachyon Zapret rules" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:112 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:112 msgid "Standalone Zapret service is active" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:113 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:113 msgid "Standalone Zapret service is inactive" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:121 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:121 msgid "Standalone Zapret2 autostart is enabled" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:118 -msgid "Standalone Zapret2 is active together with Forkop Zapret2 rules" +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:118 +msgid "Standalone Zapret2 is active together with Tachyon Zapret2 rules" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:119 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:119 msgid "Standalone Zapret2 service is active" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:122 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:122 msgid "Standalone Zapret2 service is inactive" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:69 -msgid "Start Forkop" +#: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:69 +msgid "Start Tachyon" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2341 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2341 msgid "Stop checking when URLTest group is not used. Use sing-box duration format like 1d, 12h or 30m." msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:59 -msgid "Stop Forkop" +#: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:59 +msgid "Stop Tachyon" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3481 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3481 msgid "Subnets from the list will be extracted and added to nftables" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2073 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2073 msgid "Subscription auto update" msgstr "" -#: src/forkop/tabs/dashboard/partials/renderSections.ts:149 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:149 msgid "Subscription info:" msgstr "" -#: src/forkop/methods/shell/index.ts:720 -#: src/forkop/methods/shell/index.ts:740 +#: src/tachyon/methods/shell/index.ts:720 +#: src/tachyon/methods/shell/index.ts:740 msgid "Subscription update failed" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2082 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2082 msgid "Subscription update interval" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6864 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6864 msgid "Subscription URL" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4103 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4103 msgid "Subscription URL cannot be empty" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3184 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3184 msgid "Subscription URL settings" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:301 +#: src/tachyon/tabs/dashboard/initController.ts:301 msgid "Subscriptions updated" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1630 +#: src/tachyon/tabs/dashboard/initController.ts:1630 msgid "System info" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderSystemInfo.ts:21 +#: src/tachyon/tabs/diagnostic/partials/renderSystemInfo.ts:21 msgid "System information" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runNftCheck.ts:69 +#: src/tachyon/tabs/diagnostic/checks/runNftCheck.ts:69 msgid "Table exist" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3081 +#: src/tachyon/services/core.service.ts:52 +msgid "Tachyon Error" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5902 +msgid "Tachyon manages ciadpi pid files itself, so pidfile options are not allowed here." +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5899 +msgid "Tachyon manages the ciadpi process lifecycle itself, so daemon mode is not allowed here." +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5046 +msgid "Tachyon manages the nfqws process lifecycle itself, so daemon mode is not allowed here." +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5497 +msgid "Tachyon manages the nfqws2 process lifecycle itself, so daemon mode is not allowed here." +msgstr "" + +#: src/tachyon/tabs/monitoring/initController.ts:925 +msgid "Tachyon service is stopped. Start the service to display connections." +msgstr "" + +#: src/tachyon/tabs/dashboard/render.ts:17 +msgid "Tachyon service is stopped. Start the service to display the dashboard." +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:342 +msgid "Tachyon Settings" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:602 +msgid "Tachyon will not modify your DHCP configuration" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:91 +msgid "Tachyon-managed ciadpi runtime has restarted" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:94 +msgid "Tachyon-managed ciadpi runtime is not ready" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:97 +msgid "Tachyon-managed ciadpi runtime is not running" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:93 +msgid "Tachyon-managed ciadpi runtime is ready" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:87 +msgid "Tachyon-managed nfqws runtime is not ready" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:90 +msgid "Tachyon-managed nfqws runtime is not running" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:86 +msgid "Tachyon-managed nfqws runtime is ready" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:90 +msgid "Tachyon-managed nfqws2 runtime is not ready" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:93 +msgid "Tachyon-managed nfqws2 runtime is not running" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:89 +msgid "Tachyon-managed nfqws2 runtime is ready" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3081 msgid "Tailscale auth key" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3090 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3090 msgid "Tailscale control URL" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:98 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:98 msgid "Tailscale endpoint" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3098 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3098 msgid "Tailscale hostname" msgstr "" -#: src/forkop/tabs/dashboard/partials/renderSections.ts:242 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:250 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:491 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:242 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:250 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:491 msgid "Test latency" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2451 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2451 msgid "Test only selected servers." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2411 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2411 msgid "Test only servers with one of the selected protocols." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2417 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2417 msgid "Test only servers with one of the selected security types." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2414 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2414 msgid "Test only servers with one of the selected transports." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2443 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2443 msgid "Test servers only from the specified countries." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2459 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2459 msgid "Test servers whose names match the expression." msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:913 +#: src/tachyon/tabs/dashboard/initController.ts:913 msgid "Testing URL" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5043 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5488 -msgid "The desync fwmark is managed by Forkop for loop prevention and must not be overridden here." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5043 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5488 +msgid "The desync fwmark is managed by Tachyon for loop prevention and must not be overridden here." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5040 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5485 -msgid "The NFQUEUE number is assigned by Forkop for each rule and must not be overridden here." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5040 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5485 +msgid "The NFQUEUE number is assigned by Tachyon for each rule and must not be overridden here." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7303 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7303 msgid "The rule applies to the domain and all its subdomains. Use full:, keyword:, or regex: prefixes for exact match, keyword match, or regular expression." msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:78 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:78 msgid "There are rules using ByeDPI" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:78 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:78 msgid "There are rules using Zapret" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:81 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:81 msgid "There are rules using Zapret2" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1829 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1834 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1924 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2086 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2886 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1829 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1834 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1924 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2086 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2886 msgid "This field is required" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5905 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5905 msgid "This field must start a working ciadpi strategy; help/version options exit immediately and are not allowed here." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5049 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5049 msgid "This field must start a working nfqws strategy; --dry-run exits immediately and is not allowed here." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5052 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5052 msgid "This field must start a working nfqws strategy; --version exits immediately and is not allowed here." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5500 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5500 msgid "This field must start a working nfqws2 strategy; --dry-run exits immediately and is not allowed here." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5503 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5503 msgid "This field must start a working nfqws2 strategy; --version exits immediately and is not allowed here." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5221 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5695 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5221 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5695 msgid "This flag does not accept a value." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5252 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5726 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5252 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5726 msgid "This option requires a value." msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:822 -#: src/forkop/tabs/monitoring/initController.ts:878 +#: src/tachyon/tabs/monitoring/initController.ts:822 +#: src/tachyon/tabs/monitoring/initController.ts:878 msgid "Time" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:223 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:223 msgid "Time in seconds for DNS record caching (default: 60)" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:3055 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:3055 msgid "Time skew tolerance" msgstr "" -#: src/forkop/helpers/singBoxVariant.ts:53 +#: src/tachyon/helpers/singBoxVariant.ts:53 msgid "tiny" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2313 -#: src/forkop/tabs/dashboard/initController.ts:915 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2313 +#: src/tachyon/tabs/dashboard/initController.ts:915 msgid "Tolerance" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2873 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2873 msgid "Top level has the highest priority; lower levels are used as fallback" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1556 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:130 +#: src/tachyon/tabs/dashboard/initController.ts:1556 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:130 msgid "Traffic" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2578 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2578 msgid "Traffic for this level goes directly." msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1590 +#: src/tachyon/tabs/dashboard/initController.ts:1590 msgid "Traffic Total" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5896 -msgid "Transparent proxy mode is incompatible with action=byedpi because Forkop connects to ciadpi through SOCKS." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5896 +msgid "Transparent proxy mode is incompatible with action=byedpi because Tachyon connects to ciadpi through SOCKS." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1766 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2764 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1766 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2764 msgid "Transport" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2788 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2788 msgid "Transport host" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2772 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2772 msgid "Transport path" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2007 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2007 msgid "Transport path must start with /" msgstr "" -#: src/forkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts:25 +#: src/tachyon/tabs/diagnostic/partials/renderWikiDisclaimer.ts:25 msgid "Troubleshooting" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2131 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2131 msgid "Try compatible User-Agent profiles automatically when downloading this subscription" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:234 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:234 msgid "TTL must be a positive number" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:229 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:229 msgid "TTL value cannot be empty" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1638 -#: src/forkop/tabs/monitoring/initController.ts:816 -#: src/forkop/tabs/monitoring/initController.ts:876 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1638 +#: src/tachyon/tabs/monitoring/initController.ts:816 +#: src/tachyon/tabs/monitoring/initController.ts:876 msgid "Type" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:165 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:165 msgid "UDP (Unprotected DNS)" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5820 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5820 msgid "Unable to validate the ByeDPI strategy through the backend parser." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4963 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6298 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6741 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4963 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6298 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6741 msgid "Unable to validate the NFQWS strategy through the backend parser." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5408 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6307 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5408 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6307 msgid "Unable to validate the NFQWS2 strategy through the backend parser." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2781 -#: src/forkop/tabs/dashboard/initController.ts:1145 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2781 +#: src/tachyon/tabs/dashboard/initController.ts:1145 msgid "Unavailability timeout" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6037 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6086 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6037 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6086 msgid "Unexpected ByeDPI strategy argument: %s" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runByedpiCheck.ts:96 -msgid "Unexpected Forkop-managed ciadpi runtime is running" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:89 -msgid "Unexpected Forkop-managed nfqws runtime is running" -msgstr "" - -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:92 -msgid "Unexpected Forkop-managed nfqws2 runtime is running" -msgstr "" - -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5201 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5675 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5201 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5675 msgid "Unexpected standalone token. Use explicit flags such as --name or --name=value." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/forkop.js:54 +#: src/tachyon/tabs/diagnostic/checks/runByedpiCheck.ts:96 +msgid "Unexpected Tachyon-managed ciadpi runtime is running" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:89 +msgid "Unexpected Tachyon-managed nfqws runtime is running" +msgstr "" + +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:92 +msgid "Unexpected Tachyon-managed nfqws2 runtime is running" +msgstr "" + +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/tachyon.js:54 msgid "unique UCI identifier" msgstr "" -#: src/forkop/helpers/singBoxVariant.ts:28 -#: src/forkop/services/systemInfo.service.ts:10 -#: src/forkop/services/systemInfo.service.ts:11 -#: src/forkop/services/systemInfo.service.ts:12 -#: src/forkop/services/systemInfo.service.ts:13 -#: src/forkop/services/systemInfo.service.ts:18 -#: src/forkop/services/systemInfo.service.ts:20 -#: src/forkop/services/systemInfo.service.ts:22 -#: src/forkop/services/systemInfo.service.ts:25 -#: src/forkop/services/systemInfo.service.ts:26 -#: src/forkop/tabs/updates/initController.ts:329 -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:25 +#: src/tachyon/helpers/singBoxVariant.ts:28 +#: src/tachyon/services/systemInfo.service.ts:10 +#: src/tachyon/services/systemInfo.service.ts:11 +#: src/tachyon/services/systemInfo.service.ts:12 +#: src/tachyon/services/systemInfo.service.ts:13 +#: src/tachyon/services/systemInfo.service.ts:18 +#: src/tachyon/services/systemInfo.service.ts:20 +#: src/tachyon/services/systemInfo.service.ts:22 +#: src/tachyon/services/systemInfo.service.ts:25 +#: src/tachyon/services/systemInfo.service.ts:26 +#: src/tachyon/tabs/updates/initController.ts:329 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:25 msgid "unknown" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6006 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6028 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6079 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6006 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6028 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6079 msgid "Unknown ByeDPI option: %s" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:576 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:576 msgid "Unknown country" msgstr "" -#: src/forkop/api.ts:40 +#: src/tachyon/api.ts:40 msgid "Unknown error" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5212 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5212 msgid "Unknown NFQWS flag." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5686 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5686 msgid "Unknown NFQWS2 flag." msgstr "" @@ -2954,39 +2954,39 @@ msgstr "" msgid "Unspecified IP address is not allowed" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2120 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2120 msgid "Unsupported security mode for this protocol" msgstr "" -#: src/forkop/tabs/updates/initController.ts:754 +#: src/tachyon/tabs/updates/initController.ts:754 msgid "Update" msgstr "" -#: src/forkop/tabs/updates/initController.ts:287 +#: src/tachyon/tabs/updates/initController.ts:287 msgid "Update is available" msgstr "" -#: src/forkop/tabs/updates/initController.ts:994 +#: src/tachyon/tabs/updates/initController.ts:994 msgid "Update is available:" msgstr "" -#: src/forkop/tabs/dashboard/partials/renderSections.ts:219 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:232 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:233 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:219 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:232 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:233 msgid "Update subscriptions" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2074 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2074 msgid "Update this subscription automatically" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1558 -#: src/forkop/tabs/dashboard/initController.ts:1593 +#: src/tachyon/tabs/dashboard/initController.ts:1558 +#: src/tachyon/tabs/dashboard/initController.ts:1593 msgid "Uplink" msgstr "" -#: src/forkop/tabs/monitoring/initController.ts:828 -#: src/forkop/tabs/monitoring/initController.ts:880 +#: src/tachyon/tabs/monitoring/initController.ts:828 +#: src/tachyon/tabs/monitoring/initController.ts:880 msgid "Uploaded" msgstr "" @@ -2998,121 +2998,121 @@ msgstr "" msgid "URL must use one of the following protocols:" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2757 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2757 msgid "URL used to check whether a server is alive" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2328 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2328 msgid "URL used to test server latency" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6978 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6978 msgid "URLTest" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:1042 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:385 -#: src/forkop/tabs/dashboard/partials/renderSections.ts:386 +#: src/tachyon/tabs/dashboard/initController.ts:1042 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:385 +#: src/tachyon/tabs/dashboard/partials/renderSections.ts:386 msgid "URLTest details" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:901 +#: src/tachyon/tabs/dashboard/initController.ts:901 msgid "URLTest details are unavailable" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3216 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:3217 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3216 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:3217 msgid "URLTest settings" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2104 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2104 msgid "Use 32 hex characters" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1894 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1900 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2016 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1894 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1900 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2016 msgid "Use a domain name or IP address" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1995 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1995 msgid "Use a duration like 30s, 5m, or 1h30m" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2001 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2888 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2001 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2888 msgid "Use a non-negative integer" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2107 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2107 msgid "Use a non-zero secret" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1963 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1965 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1963 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1965 msgid "Use an HTTP or HTTPS URL" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1917 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1917 msgid "Use an IP address" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1910 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1910 msgid "Use an IP listen address" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7073 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7073 msgid "Use another section as an intermediate hop to connect to servers in this section. Does not apply to network interfaces or JSON outbounds." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2064 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2064 msgid "Use CIDR prefixes like 192.168.1.0/24 or 2001:db8::/32" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2078 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2078 msgid "Use CIDR prefixes or IP addresses like 192.168.1.0/24, 192.168.1.10, or 2001:db8::1" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2022 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2022 msgid "Use letters, digits, dots, underscores, or hyphens" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:149 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:149 msgid "Use sing-box duration format like 10s, 1m or 2m30s" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2083 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2302 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2830 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4036 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4043 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4050 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:466 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:488 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:495 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:511 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:539 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2083 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2302 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2830 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4036 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4043 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4050 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:466 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:488 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:495 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:511 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:539 msgid "Use sing-box duration format like 1d, 12h or 30m" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:25 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:25 msgid "Used by" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2141 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2141 msgid "User-Agent" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2847 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2847 msgid "Username" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7230 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7230 msgid "Username cannot be empty" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4736 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4749 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4736 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4749 #: src/validators/validateDns.ts:21 #: src/validators/validateDns.ts:25 #: src/validators/validateDomain.ts:57 @@ -3134,133 +3134,133 @@ msgstr "" msgid "Valid" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4165 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4185 -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4189 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4165 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4185 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4189 msgid "Validation errors:" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:4726 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:4726 msgid "Value cannot be empty" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:1838 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:1838 msgid "Value must not contain control characters" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:1707 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1707 msgid "Via country.is" msgstr "" -#: src/forkop/tabs/diagnostic/initController.ts:717 -#: src/forkop/tabs/diagnostic/partials/renderAvailableActions.ts:107 +#: src/tachyon/tabs/diagnostic/initController.ts:717 +#: src/tachyon/tabs/diagnostic/partials/renderAvailableActions.ts:107 msgid "View logs" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6620 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6620 msgid "Visible name of this section" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2891 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2891 msgid "VLESS flow" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6843 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6843 msgid "vless://, vmess://, ss://, trojan://, socks4/5://, http(s)://, hy2/hysteria2:// links" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:70 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:70 msgid "WAN" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runInboundsCheck.ts:198 +#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:198 msgid "WAN public IP" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7388 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7388 msgid "Warning: %s cannot be used together with %s. Previous selections have been removed." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:7407 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7407 msgid "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:6633 -msgid "What Forkop should do when this section matches" +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:6633 +msgid "What Tachyon should do when this section matches" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:2808 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:2808 msgid "When switching to another level, test every server and select the fastest instead of the first working one." msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js:2801 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js:2801 msgid "XHTTP mode" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:434 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:434 msgid "YACD Secret Key" msgstr "" -#: src/forkop/tabs/dashboard/initController.ts:762 +#: src/tachyon/tabs/dashboard/initController.ts:762 msgid "Yes" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/settings.js:305 +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:305 msgid "You can select Output Network Interface, by default autodetect" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5037 -msgid "Zapret hostlist templates are not supported here because Forkop does not expand them for per-rule NFQWS strategies." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5037 +msgid "Zapret hostlist templates are not supported here because Tachyon does not expand them for per-rule NFQWS strategies." msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:71 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:71 msgid "Zapret package is installed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:72 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:72 msgid "Zapret package is not installed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:60 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:60 msgid "Zapret provider binary is available" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:61 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:61 msgid "Zapret provider binary is not available" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:103 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:103 msgid "Zapret sing-box outbound is configured" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapretCheck.ts:104 +#: src/tachyon/tabs/diagnostic/checks/runZapretCheck.ts:104 msgid "Zapret sing-box outbound is not configured" msgstr "" -#: ../luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js:5482 -msgid "Zapret2 hostlist templates are not supported here because Forkop does not expand them for per-rule NFQWS2 strategies." +#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:5482 +msgid "Zapret2 hostlist templates are not supported here because Tachyon does not expand them for per-rule NFQWS2 strategies." msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:74 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:74 msgid "Zapret2 package is installed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:75 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:75 msgid "Zapret2 package is not installed" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:63 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:63 msgid "Zapret2 provider binary is available" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:64 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:64 msgid "Zapret2 provider binary is not available" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:106 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:106 msgid "Zapret2 sing-box outbound is configured" msgstr "" -#: src/forkop/tabs/diagnostic/checks/runZapret2Check.ts:107 +#: src/tachyon/tabs/diagnostic/checks/runZapret2Check.ts:107 msgid "Zapret2 sing-box outbound is not configured" msgstr "" diff --git a/luci-app-tachyon/root/etc/uci-defaults/50_luci-tachyon b/luci-app-tachyon/root/etc/uci-defaults/50_luci-tachyon index 5ad3b509..6a85e462 100644 --- a/luci-app-tachyon/root/etc/uci-defaults/50_luci-tachyon +++ b/luci-app-tachyon/root/etc/uci-defaults/50_luci-tachyon @@ -1,4 +1,4 @@ #!/bin/sh -/usr/bin/forkop luci_postinst >/dev/null 2>&1 || true +/usr/bin/tachyon luci_postinst >/dev/null 2>&1 || true exit 0 diff --git a/luci-app-tachyon/root/usr/share/luci/menu.d/luci-app-tachyon.json b/luci-app-tachyon/root/usr/share/luci/menu.d/luci-app-tachyon.json index 0d9ab5f8..08000176 100644 --- a/luci-app-tachyon/root/usr/share/luci/menu.d/luci-app-tachyon.json +++ b/luci-app-tachyon/root/usr/share/luci/menu.d/luci-app-tachyon.json @@ -1,14 +1,14 @@ { - "admin/services/forkop": { - "title": "Forkop", + "admin/services/tachyon": { + "title": "Tachyon", "order": 42, "action": { "type": "view", - "path": "forkop/forkop" + "path": "tachyon/tachyon" }, "depends": { - "acl": [ "luci-app-forkop" ], - "uci": { "forkop": true } + "acl": [ "luci-app-tachyon" ], + "uci": { "tachyon": true } } } } diff --git a/luci-app-tachyon/root/usr/share/rpcd/acl.d/luci-app-tachyon.json b/luci-app-tachyon/root/usr/share/rpcd/acl.d/luci-app-tachyon.json index 40ca9cee..580a78fd 100644 --- a/luci-app-tachyon/root/usr/share/rpcd/acl.d/luci-app-tachyon.json +++ b/luci-app-tachyon/root/usr/share/rpcd/acl.d/luci-app-tachyon.json @@ -1,27 +1,27 @@ { - "luci-app-forkop": { - "description": "Grant UCI and RPC access to LuCI app Forkop", + "luci-app-tachyon": { + "description": "Grant UCI and RPC access to LuCI app Tachyon", "read": { "file": { - "/etc/init.d/forkop": [ + "/etc/init.d/tachyon": [ "exec" ], - "/var/run/forkop/section-cache/*": [ + "/var/run/tachyon/section-cache/*": [ "read" ], - "/var/run/forkop/component-actions/*": [ + "/var/run/tachyon/component-actions/*": [ "read" ], - "/var/run/forkop/ui-state/*": [ + "/var/run/tachyon/ui-state/*": [ "read" ], - "/var/run/forkop/ui-state/service-actions/*": [ + "/var/run/tachyon/ui-state/service-actions/*": [ "read" ], - "/var/run/forkop/ui-state/latency-actions/*": [ + "/var/run/tachyon/ui-state/latency-actions/*": [ "read" ], - "/usr/bin/forkop": [ + "/usr/bin/tachyon": [ "exec" ] }, @@ -38,23 +38,23 @@ ] }, "uci": [ - "forkop" + "tachyon" ] }, "write": { "file": { - "/var/run/forkop/ui-state/*": [ + "/var/run/tachyon/ui-state/*": [ "write" ], - "/var/run/forkop/ui-state/service-actions/*": [ + "/var/run/tachyon/ui-state/service-actions/*": [ "write" ], - "/var/run/forkop/ui-state/latency-actions/*": [ + "/var/run/tachyon/ui-state/latency-actions/*": [ "write" ] }, "uci": [ - "forkop" + "tachyon" ] } } diff --git a/tachyon/Makefile b/tachyon/Makefile index 58eeb42b..8c757252 100644 --- a/tachyon/Makefile +++ b/tachyon/Makefile @@ -1,17 +1,17 @@ include $(TOPDIR)/rules.mk -PKG_NAME:=forkop +PKG_NAME:=tachyon -FORKOP_SOURCE_VERSION:=$(or $(FORKOP_PACKAGE_VERSION),$(FORKOP_VERSION)) -FORKOP_HAS_RELEASE_VERSION:=$(if $(filter dev,$(FORKOP_SOURCE_VERSION)),,$(FORKOP_SOURCE_VERSION)) -FORKOP_COMPILED_VERSION:=$(if $(FORKOP_HAS_RELEASE_VERSION),$(FORKOP_SOURCE_VERSION),$(or $(FORKOP_SOURCE_VERSION),dev)) -FORKOP_RELEASE_VERSION_VALID:=$(if $(FORKOP_HAS_RELEASE_VERSION),$(shell printf '%s\n' '$(FORKOP_SOURCE_VERSION)' | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$$' && printf '1'),1) +TACHYON_SOURCE_VERSION:=$(or $(TACHYON_PACKAGE_VERSION),$(TACHYON_VERSION)) +TACHYON_HAS_RELEASE_VERSION:=$(if $(filter dev,$(TACHYON_SOURCE_VERSION)),,$(TACHYON_SOURCE_VERSION)) +TACHYON_COMPILED_VERSION:=$(if $(TACHYON_HAS_RELEASE_VERSION),$(TACHYON_SOURCE_VERSION),$(or $(TACHYON_SOURCE_VERSION),dev)) +TACHYON_RELEASE_VERSION_VALID:=$(if $(TACHYON_HAS_RELEASE_VERSION),$(shell printf '%s\n' '$(TACHYON_SOURCE_VERSION)' | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$$' && printf '1'),1) -ifeq ($(FORKOP_RELEASE_VERSION_VALID),) -$(error FORKOP_PACKAGE_VERSION and FORKOP_VERSION must use x.y.z format) +ifeq ($(TACHYON_RELEASE_VERSION_VALID),) +$(error TACHYON_PACKAGE_VERSION and TACHYON_VERSION must use x.y.z format) endif -PKG_VERSION:=$(or $(FORKOP_HAS_RELEASE_VERSION),0.0.0) +PKG_VERSION:=$(or $(TACHYON_HAS_RELEASE_VERSION),0.0.0) PKG_RELEASE:= PKG_MAINTAINER:=Dushnilin @@ -19,18 +19,18 @@ PKG_LICENSE:=GPL-2.0-or-later include $(INCLUDE_DIR)/package.mk -define Package/forkop +define Package/tachyon SECTION:=net CATEGORY:=Network DEPENDS:=+ca-bundle +kmod-inet-diag +kmod-netlink-diag +kmod-tun +curl +ucode +ucode-mod-fs +ucode-mod-uci +kmod-nft-tproxy +coreutils-base64 +coreutils-sort +bind-dig +nftables +kmod-nft-nat +ip-full CONFLICTS:=https-dns-proxy nextdns luci-app-passwall luci-app-passwall2 - TITLE:=Forkop backend service + TITLE:=Tachyon backend service URL:=https://github.com/Dushnilin/tachyon PKGARCH:=all endef -define Package/forkop/description - Rule-based Forkop backend with hybrid sing-box + zapret orchestration +define Package/tachyon/description + Rule-based Tachyon backend with hybrid sing-box + zapret orchestration endef define Build/Configure @@ -39,40 +39,40 @@ endef define Build/Compile endef -define Package/forkop/prerm +define Package/tachyon/prerm #!/usr/bin/ucode if (getenv("IPKG_INSTROOT") == null || getenv("IPKG_INSTROOT") == "") - system("/usr/bin/forkop package_prerm >/dev/null 2>&1"); + system("/usr/bin/tachyon package_prerm >/dev/null 2>&1"); exit(0); endef -define Package/forkop/postinst +define Package/tachyon/postinst #!/bin/sh [ -n "$${IPKG_INSTROOT}" ] && exit 0 -FORKOP_LIB=/usr/lib/forkop ucode -L /usr/lib/forkop /usr/lib/forkop/config/migration.uc migrate +TACHYON_LIB=/usr/lib/tachyon ucode -L /usr/lib/tachyon /usr/lib/tachyon/config/migration.uc migrate endef -define Package/forkop/conffiles -/etc/config/forkop +define Package/tachyon/conffiles +/etc/config/tachyon endef -define Package/forkop/install +define Package/tachyon/install $(INSTALL_DIR) $(1)/etc/init.d - $(INSTALL_BIN) ./files/etc/init.d/forkop $(1)/etc/init.d/forkop + $(INSTALL_BIN) ./files/etc/init.d/tachyon $(1)/etc/init.d/tachyon $(INSTALL_DIR) $(1)/etc/config - $(INSTALL_CONF) ./files/etc/config/forkop $(1)/etc/config/forkop + $(INSTALL_CONF) ./files/etc/config/tachyon $(1)/etc/config/tachyon $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) ./files/usr/bin/forkop $(1)/usr/bin/forkop + $(INSTALL_BIN) ./files/usr/bin/tachyon $(1)/usr/bin/tachyon - $(INSTALL_DIR) $(1)/usr/lib/forkop - $(CP) ./files/usr/lib/. $(1)/usr/lib/forkop/ + $(INSTALL_DIR) $(1)/usr/lib/tachyon + $(CP) ./files/usr/lib/. $(1)/usr/lib/tachyon/ - sed -i -e 's/__COMPILED_VERSION_VARIABLE__/$(FORKOP_COMPILED_VERSION)/g' $(1)/usr/lib/forkop/core/constants.uc + sed -i -e 's/__COMPILED_VERSION_VARIABLE__/$(TACHYON_COMPILED_VERSION)/g' $(1)/usr/lib/tachyon/core/constants.uc endef -$(eval $(call BuildPackage,forkop)) +$(eval $(call BuildPackage,tachyon)) diff --git a/tachyon/files/etc/config/tachyon b/tachyon/files/etc/config/tachyon index 2aebf1ea..e2f84c38 100644 --- a/tachyon/files/etc/config/tachyon +++ b/tachyon/files/etc/config/tachyon @@ -153,7 +153,7 @@ config settings 'settings' # option protocol 'tailscale' # option routing_mode 'rules' # option tailscale_control_url 'https://controlplane.tailscale.com' -# option tailscale_hostname 'forkop-server-tailscale-example' +# option tailscale_hostname 'tachyon-server-tailscale-example' # option tailscale_auth_key 'tskey-auth-...' # option tailscale_accept_routes '0' # option tailscale_advertise_exit_node '1' diff --git a/tachyon/files/etc/init.d/tachyon b/tachyon/files/etc/init.d/tachyon index 41f19bc8..c62d0825 100755 --- a/tachyon/files/etc/init.d/tachyon +++ b/tachyon/files/etc/init.d/tachyon @@ -8,14 +8,14 @@ EXTRA_HELP=" retry_start_on_wan_up Retry failed cold start after WAN come script=$(readlink "$initscript") NAME="$(basename ${script:-$initscript})" -FORKOP_LIB="/usr/lib/forkop" -FORKOP_INITD_UC="$FORKOP_LIB/service/initd.uc" +TACHYON_LIB="/usr/lib/tachyon" +TACHYON_INITD_UC="$TACHYON_LIB/service/initd.uc" initd_ucode() { - [ -r "$FORKOP_INITD_UC" ] || return 1 - FORKOP_LIB="$FORKOP_LIB" \ - FORKOP_SERVICE_NAME="$NAME" \ - ucode -L "$FORKOP_LIB" "$FORKOP_INITD_UC" "$@" + [ -r "$TACHYON_INITD_UC" ] || return 1 + TACHYON_LIB="$TACHYON_LIB" \ + TACHYON_SERVICE_NAME="$NAME" \ + ucode -L "$TACHYON_LIB" "$TACHYON_INITD_UC" "$@" } sync_service_triggers() { @@ -31,12 +31,12 @@ sync_service_triggers_payload() { start_service() { initd_ucode start-service "$1" "$$" - FORKOP_LAST_START_STATUS="$?" - return "$FORKOP_LAST_START_STATUS" + TACHYON_LAST_START_STATUS="$?" + return "$TACHYON_LAST_START_STATUS" } service_started() { - return "${FORKOP_LAST_START_STATUS:-0}" + return "${TACHYON_LAST_START_STATUS:-0}" } stop_service() { diff --git a/tachyon/files/usr/bin/tachyon b/tachyon/files/usr/bin/tachyon index f41365cc..f49af84c 100755 --- a/tachyon/files/usr/bin/tachyon +++ b/tachyon/files/usr/bin/tachyon @@ -6,10 +6,10 @@ function as_string(value) { return value == null ? "" : "" + value; } -const CONFIG_NAME = getenv("FORKOP_CONFIG_NAME") || "forkop"; -const LIB_DIR = getenv("FORKOP_LIB") || "/usr/lib/forkop"; -const BIN_PATH = getenv("FORKOP_BIN") || "/usr/bin/forkop"; -const SERVICE_INIT = getenv("FORKOP_SERVICE_INIT") || "/etc/init.d/forkop"; +const CONFIG_NAME = getenv("TACHYON_CONFIG_NAME") || "tachyon"; +const LIB_DIR = getenv("TACHYON_LIB") || "/usr/lib/tachyon"; +const BIN_PATH = getenv("TACHYON_BIN") || "/usr/bin/tachyon"; +const SERVICE_INIT = getenv("TACHYON_SERVICE_INIT") || "/etc/init.d/tachyon"; function shell_quote(value) { return "'" + replace(as_string(value), /'/g, "'\\''") + "'"; @@ -53,14 +53,14 @@ function restore_dnsmasq_failsafe_on_loader_failure(command) { function show_help() { print("Usage: ", BIN_PATH, " COMMAND\n\n"); print("Available commands:\n"); - print(" start Start Forkop service\n"); - print(" stop Stop Forkop service\n"); - print(" reload Reload Forkop configuration\n"); - print(" restart Restart Forkop service\n"); - print(" enable Enable Forkop autostart\n"); - print(" disable Disable Forkop autostart\n"); - print(" uninstall Remove Forkop files installed outside opkg/apk\n"); - print(" main Run main Forkop process\n"); + print(" start Start Tachyon service\n"); + print(" stop Stop Tachyon service\n"); + print(" reload Reload Tachyon configuration\n"); + print(" restart Restart Tachyon service\n"); + print(" enable Enable Tachyon autostart\n"); + print(" disable Disable Tachyon autostart\n"); + print(" uninstall Remove Tachyon files installed outside opkg/apk\n"); + print(" main Run main Tachyon process\n"); print(" list_update Update remote lists\n"); print(" list_update_if_due Update remote lists only when the configured interval has elapsed\n"); print(" subscription_update [rule] [source_index]\n"); @@ -77,28 +77,28 @@ function show_help() { print(" check_sing_box Check sing-box installation and status\n"); print(" check_inbounds_config Check whether enabled server inbounds are configured\n"); print(" check_inbounds Check server inbounds from the Servers tab\n"); - print(" check_logs Show Forkop logs from system journal\n"); + print(" check_logs Show Tachyon logs from system journal\n"); print(" check_sing_box_logs Show sing-box logs\n"); print(" check_fakeip Test sing-box FakeIP DNS\n"); print(" check_zapret_runtime Check external zapret provider state\n"); print(" check_zapret2_runtime Check external zapret2 provider state\n"); print(" check_byedpi_runtime Check external ByeDPI provider state\n"); print(" neutralize_zapret_defaults\n"); - print(" Compatibility no-op; Forkop does not manage standalone zapret\n"); + print(" Compatibility no-op; Tachyon does not manage standalone zapret\n"); print(" clash_api Clash API interface for managing proxies and groups\n"); - print(" show_config Display current Forkop configuration\n"); - print(" show_version Show Forkop version\n"); + print(" show_config Display current Tachyon configuration\n"); + print(" show_version Show Tachyon version\n"); print(" show_sing_box_config Show sing-box configuration\n"); print(" show_sing_box_version Show sing-box version\n"); - print(" get_status Get Forkop service status\n"); + print(" get_status Get Tachyon service status\n"); print(" get_outbound_link Get source proxy link for a generated outbound\n"); print(" get_outbound_metadata Get generated outbound display names and countries\n"); print(" get_subscription_metadata\n"); print(" Get UI-only metadata for a subscription rule\n"); print(" get_sing_box_status Get sing-box service status\n"); - print(" get_zapret_status Get zapret provider and Forkop-managed nfqws status\n"); - print(" get_zapret2_status Get zapret2 provider and Forkop-managed nfqws2 status\n"); - print(" get_byedpi_status Get ByeDPI provider and Forkop-managed ciadpi status\n"); + print(" get_zapret_status Get zapret provider and Tachyon-managed nfqws status\n"); + print(" get_zapret2_status Get zapret2 provider and Tachyon-managed nfqws2 status\n"); + print(" get_byedpi_status Get ByeDPI provider and Tachyon-managed ciadpi status\n"); print(" get_system_info Get system information in JSON format\n"); print(" get_server_capabilities Get server UI capabilities in JSON format\n"); print(" get_ui_capabilities Get lightweight UI capabilities in JSON format\n"); @@ -112,13 +112,16 @@ function show_help() { print(" Generate a sing-box Reality key pair in JSON format\n"); print(" get_tls_certificate_sha256 [server]\n"); print(" Get a server TLS certificate SHA-256 fingerprint in JSON format\n"); - print(" component_action Manage Forkop, sing-box, zapret, zapret2, and ByeDPI components\n"); + print(" component_action Manage Tachyon, sing-box, zapret, zapret2, and ByeDPI components\n"); print(" component_action_async Start a component action in the background\n"); print(" component_action_status Get background component action status\n"); print(" component_updates_if_due Check installed components for updates when due\n"); print(" component_update_check_cache Get cached component update check results\n"); print(" check_dns_available Check DNS server availability\n"); print(" global_check Run global system check\n"); + print(" doctor Run doctor diagnostics checks\n"); + print(" ai_doctor Run AI doctor diagnostics completions\n"); + print(" watchdog Manage watchdog daemon (start-runtime|stop-runtime|status|push-config)\n"); print(" validate_nfqws_strategy_json\n"); print(" Validate an NFQWS strategy and print JSON result\n"); print(" validate_nfqws2_strategy_json\n"); @@ -191,6 +194,9 @@ function command_spec(command) { component_update_check_cache: [ "components/updates.uc", "component-update-check-cache", 0 ], check_dns_available: [ "diagnostics/runtime.uc", "check-dns-available", 0 ], global_check: [ "diagnostics/runtime.uc", "global-check", 2 ], + doctor: [ "diagnostics/runtime.uc", "doctor", 1 ], + ai_doctor: [ "diagnostics/runtime.uc", "ai-doctor", 0 ], + watchdog: [ "service/watchdog.uc", "", 1 ], validate_nfqws_strategy_json: [ "diagnostics/runtime.uc", "validate-nfqws-strategy-json", 1 ], validate_nfqws2_strategy_json: [ "diagnostics/runtime.uc", "validate-nfqws2-strategy-json", 1 ], validate_byedpi_strategy_json: [ "providers/byedpi/validator.uc", "validate-json", 1 ], diff --git a/tachyon/files/usr/lib/components/action.uc b/tachyon/files/usr/lib/components/action.uc index a506cb20..29b80006 100644 --- a/tachyon/files/usr/lib/components/action.uc +++ b/tachyon/files/usr/lib/components/action.uc @@ -4,24 +4,24 @@ let fs = require("fs"); let constants = require("core.constants"); let uci_core = require("core.uci"); -const CONFIG_NAME = getenv("FORKOP_CONFIG_NAME") || constants.FORKOP_CONFIG_NAME || "forkop"; -const LIB_DIR = getenv("FORKOP_LIB") || "/usr/lib/forkop"; -const BIN_PATH = getenv("FORKOP_BIN") || constants.FORKOP_BIN || "/usr/bin/forkop"; -const SERVICE_INIT = getenv("FORKOP_SERVICE_INIT") || constants.FORKOP_SERVICE_INIT || "/etc/init.d/forkop"; -const FORKOP_VERSION = getenv("FORKOP_VERSION") || constants.FORKOP_VERSION || ""; -const FORKOP_RELEASE_REPO = getenv("FORKOP_RELEASE_REPO") || constants.FORKOP_RELEASE_REPO || "Dushnilin/tachyon"; -const RUNTIME_STATE_DIR = getenv("FORKOP_RUNTIME_STATE_DIR") || "/var/run/forkop"; -const SYSTEM_INFO_CACHE_FILE = getenv("FORKOP_SYSTEM_INFO_CACHE_FILE") || RUNTIME_STATE_DIR + "/system-info.json"; -const COMPONENT_JOB_DIR = getenv("UPDATES_JOB_DIR") || getenv("FORKOP_UI_COMPONENT_ACTION_DIR") || RUNTIME_STATE_DIR + "/component-actions"; +const CONFIG_NAME = getenv("TACHYON_CONFIG_NAME") || constants.TACHYON_CONFIG_NAME || "tachyon"; +const LIB_DIR = getenv("TACHYON_LIB") || "/usr/lib/tachyon"; +const BIN_PATH = getenv("TACHYON_BIN") || constants.TACHYON_BIN || "/usr/bin/tachyon"; +const SERVICE_INIT = getenv("TACHYON_SERVICE_INIT") || constants.TACHYON_SERVICE_INIT || "/etc/init.d/tachyon"; +const TACHYON_VERSION = getenv("TACHYON_VERSION") || constants.TACHYON_VERSION || ""; +const TACHYON_RELEASE_REPO = getenv("TACHYON_RELEASE_REPO") || constants.TACHYON_RELEASE_REPO || "Dushnilin/tachyon"; +const RUNTIME_STATE_DIR = getenv("TACHYON_RUNTIME_STATE_DIR") || "/var/run/tachyon"; +const SYSTEM_INFO_CACHE_FILE = getenv("TACHYON_SYSTEM_INFO_CACHE_FILE") || RUNTIME_STATE_DIR + "/system-info.json"; +const COMPONENT_JOB_DIR = getenv("UPDATES_JOB_DIR") || getenv("TACHYON_UI_COMPONENT_ACTION_DIR") || RUNTIME_STATE_DIR + "/component-actions"; const COMPONENT_LOCK_DIR = getenv("UPDATES_LOCK_DIR") || RUNTIME_STATE_DIR + "/component-action.lock"; const TMP_STALE_TTL_MINUTES = getenv("UPDATES_TMP_STALE_TTL_MINUTES") || "30"; const TMP_FILE_STALE_TTL_MINUTES = getenv("UPDATES_TMP_FILE_STALE_TTL_MINUTES") || "10"; -const SB_MANAGED_SERVICE_MARKER = getenv("SB_MANAGED_SERVICE_MARKER") || constants.SB_MANAGED_SERVICE_MARKER || "Forkop managed sing-box service for binary variants"; +const SB_MANAGED_SERVICE_MARKER = getenv("SB_MANAGED_SERVICE_MARKER") || constants.SB_MANAGED_SERVICE_MARKER || "Tachyon managed sing-box service for binary variants"; let tmp_dir = ""; let lock_held = false; -let forkop_was_running = false; -let forkop_stopped_for_sing_box_change = false; +let tachyon_was_running = false; +let tachyon_stopped_for_sing_box_change = false; let common = require("core.common"); let as_string = common.as_string; @@ -145,7 +145,7 @@ function pid_running(pid) { function log_message(message, level) { level = as_string(level || "info"); - command_success_from_args([ "logger", "-t", "forkop", "[" + level + "] " + as_string(message) ]); + command_success_from_args([ "logger", "-t", "tachyon", "[" + level + "] " + as_string(message) ]); } function updates_log(message, level) { @@ -182,8 +182,8 @@ function helper_success(mode, args) { } function cleanup_stale_tmp_files() { - command_success_from_args([ "find", "/tmp", "-maxdepth", "1", "-type", "d", "-name", "forkop-updates.*", "-mmin", "+" + as_string(TMP_STALE_TTL_MINUTES), "-exec", "rm", "-rf", "{}", "+" ]); - command_success_from_args([ "find", "/tmp", "-maxdepth", "1", "-type", "f", "(", "-name", "forkop-updates-command.*", "-o", "-name", "forkop-updates-http.*", ")", "-mmin", "+" + as_string(TMP_FILE_STALE_TTL_MINUTES), "-delete" ]); + command_success_from_args([ "find", "/tmp", "-maxdepth", "1", "-type", "d", "-name", "tachyon-updates.*", "-mmin", "+" + as_string(TMP_STALE_TTL_MINUTES), "-exec", "rm", "-rf", "{}", "+" ]); + command_success_from_args([ "find", "/tmp", "-maxdepth", "1", "-type", "f", "(", "-name", "tachyon-updates-command.*", "-o", "-name", "tachyon-updates-http.*", ")", "-mmin", "+" + as_string(TMP_FILE_STALE_TTL_MINUTES), "-delete" ]); } function init_tmp_dir() { @@ -191,9 +191,9 @@ function init_tmp_dir() { return true; cleanup_stale_tmp_files(); - tmp_dir = trim(command_output_from_args([ "mktemp", "-d", "/tmp/forkop-updates.XXXXXX" ])); + tmp_dir = trim(command_output_from_args([ "mktemp", "-d", "/tmp/tachyon-updates.XXXXXX" ])); if (tmp_dir == "") { - tmp_dir = "/tmp/forkop-updates." + owner_pid(); + tmp_dir = "/tmp/tachyon-updates." + owner_pid(); if (!ensure_dir(tmp_dir)) { tmp_dir = ""; return false; @@ -204,7 +204,7 @@ function init_tmp_dir() { function make_tmp_file(prefix) { init_tmp_dir(); - let base = tmp_dir != "" ? tmp_dir + "/" + as_string(prefix) + ".XXXXXX" : "/tmp/forkop-updates-" + as_string(prefix) + ".XXXXXX"; + let base = tmp_dir != "" ? tmp_dir + "/" + as_string(prefix) + ".XXXXXX" : "/tmp/tachyon-updates-" + as_string(prefix) + ".XXXXXX"; let path = trim(command_output_from_args([ "mktemp", base ])); if (path == "") { path = (tmp_dir != "" ? tmp_dir : "/tmp") + "/" + as_string(prefix) + "." + owner_pid() + "." + now_seconds(); @@ -300,10 +300,10 @@ function updates_response(success, component, action, message, current_version, }); } -function restart_forkop_after_failed_sing_box_change() { - if (!forkop_stopped_for_sing_box_change || !forkop_was_running || !file_exists(SERVICE_INIT)) +function restart_tachyon_after_failed_sing_box_change() { + if (!tachyon_stopped_for_sing_box_change || !tachyon_was_running || !file_exists(SERVICE_INIT)) return; - updates_log("Restarting Forkop after failed sing-box component change"); + updates_log("Restarting Tachyon after failed sing-box component change"); if (!command_success_from_args([ SERVICE_INIT, "start" ])) command_success_from_args([ SERVICE_INIT, "restart" ]); } @@ -316,7 +316,7 @@ function action_success(component, action, message, current_version, latest_vers function action_fail(component, action, message, current_version, latest_version, status, release_url) { updates_log(message, "error"); - restart_forkop_after_failed_sing_box_change(); + restart_tachyon_after_failed_sing_box_change(); updates_response(false, component, action, message, current_version || "", latest_version || "", 0, status || "", release_url || ""); cleanup_action(); exit(1); @@ -326,7 +326,7 @@ function run_logged(description, command) { init_tmp_dir(); let output_file = make_tmp_file("command"); if (output_file == "") - output_file = "/tmp/forkop-updates-command." + owner_pid(); + output_file = "/tmp/tachyon-updates-command." + owner_pid(); updates_log(description); let status = command_status(as_string(command) + " >" + shell_quote(output_file) + " 2>&1"); @@ -605,31 +605,31 @@ function fetch_github_releases_json(owner, repo, per_page) { return response; } -function latest_forkop_release_json() { - let parts = split(FORKOP_RELEASE_REPO, "/"); +function latest_tachyon_release_json() { + let parts = split(TACHYON_RELEASE_REPO, "/"); if (length(parts) != 2 || as_string(parts[0]) == "" || as_string(parts[1]) == "") return ""; return fetch_github_release_json(parts[0], parts[1]); } -function latest_forkop_version() { - let response = latest_forkop_release_json(); +function latest_tachyon_version() { + let response = latest_tachyon_release_json(); if (response == "") return ""; return trim(helper_output_input(response, "object-get-default", [ "tag_name", "" ])); } -function fetch_forkop_latest_release_metadata() { - let response = latest_forkop_release_json(); +function fetch_tachyon_latest_release_metadata() { + let response = latest_tachyon_release_json(); if (response == "") return ""; return trim(helper_output_input(response, "release-metadata-tsv", [])); } -function write_forkop_latest_version_cache(value, timestamp) { +function write_tachyon_latest_version_cache(value, timestamp) { if (as_string(value) == "") return; - write_file("/tmp/forkop.latest-version.cache", as_string(value) + "\n" + as_string(timestamp) + "\n"); + write_file("/tmp/tachyon.latest-version.cache", as_string(value) + "\n" + as_string(timestamp) + "\n"); } function retry_resolve(description, fn) { @@ -651,9 +651,9 @@ function ensure_package_tool(tool_name, package_name, component, action) { } function clear_version_caches() { - remove_file("/tmp/forkop.latest-version.cache"); + remove_file("/tmp/tachyon.latest-version.cache"); remove_file(SYSTEM_INFO_CACHE_FILE); - remove_file("/tmp/forkop/system-info.json"); + remove_file("/tmp/tachyon/system-info.json"); } function managed_sing_box_service_installed() { @@ -690,7 +690,7 @@ function managed_sing_box_service_text() { } function install_managed_sing_box_service_script() { - let tmp = "/etc/init.d/sing-box.forkop." + owner_pid(); + let tmp = "/etc/init.d/sing-box.tachyon." + owner_pid(); if (!write_file(tmp, managed_sing_box_service_text())) return false; if (!command_success_from_args([ "chmod", "0755", tmp ])) { @@ -732,9 +732,9 @@ function prepare_sing_box_package_service_install() { remove_managed_sing_box_service_script(); } -function forkop_status_running_with_timeout() { +function tachyon_status_running_with_timeout() { init_tmp_dir(); - let output_file = make_tmp_file("forkop-status"); + let output_file = make_tmp_file("tachyon-status"); if (output_file == "") return false; @@ -747,46 +747,46 @@ function forkop_status_running_with_timeout() { return ok; } -function capture_forkop_running_state() { - forkop_was_running = file_exists(BIN_PATH) && forkop_status_running_with_timeout(); +function capture_tachyon_running_state() { + tachyon_was_running = file_exists(BIN_PATH) && tachyon_status_running_with_timeout(); } -function restart_forkop_after_successful_change() { +function restart_tachyon_after_successful_change() { if (!file_exists(SERVICE_INIT)) return; - if (!forkop_was_running) { - updates_log("Forkop was not running before component change; restart skipped"); + if (!tachyon_was_running) { + updates_log("Tachyon was not running before component change; restart skipped"); prepare_sing_box_service_disabled(); return; } - run_logged("Restarting Forkop after successful component change", command_from_args([ SERVICE_INIT, "restart" ])); + run_logged("Restarting Tachyon after successful component change", command_from_args([ SERVICE_INIT, "restart" ])); } -function stop_forkop_before_sing_box_change() { - if (forkop_stopped_for_sing_box_change) +function stop_tachyon_before_sing_box_change() { + if (tachyon_stopped_for_sing_box_change) return; - forkop_stopped_for_sing_box_change = true; + tachyon_stopped_for_sing_box_change = true; - if (forkop_was_running && file_exists(SERVICE_INIT)) - run_logged("Stopping Forkop before sing-box package change", command_from_args([ SERVICE_INIT, "stop" ])); + if (tachyon_was_running && file_exists(SERVICE_INIT)) + run_logged("Stopping Tachyon before sing-box package change", command_from_args([ SERVICE_INIT, "stop" ])); - if (forkop_was_running && file_exists(BIN_PATH)) + if (tachyon_was_running && file_exists(BIN_PATH)) command_success_from_args([ BIN_PATH, "restore_dnsmasq" ]); prepare_sing_box_service_disabled(); } -function wait_forkop_running_after_sing_box_change() { - if (!forkop_was_running) +function wait_tachyon_running_after_sing_box_change() { + if (!tachyon_was_running) return true; if (!file_exists(BIN_PATH)) return false; let waited = 0; while (waited < 60) { - if (forkop_status_running_with_timeout()) { + if (tachyon_status_running_with_timeout()) { command_success_from_args([ "sleep", "8" ]); - if (forkop_status_running_with_timeout()) + if (tachyon_status_running_with_timeout()) return true; } command_success_from_args([ "sleep", "4" ]); @@ -1006,7 +1006,7 @@ function install_zapret_like(component, action, runtime_module, resolve_fn, labe action_fail(component, action, "Failed to install " + label + " package", current_version, pkg.version, "", release.release_url || ""); disable_standalone_service(component); - restart_forkop_after_successful_change(); + restart_tachyon_after_successful_change(); clear_version_caches(); current_version = provider_package_version(runtime_module); if (current_version == "") @@ -1051,7 +1051,7 @@ function install_byedpi(action) { action_fail("byedpi", action, "Failed to install ByeDPI package", current_version, pkg.version); disable_standalone_service("byedpi"); - restart_forkop_after_successful_change(); + restart_tachyon_after_successful_change(); clear_version_caches(); current_version = provider_package_version(runtime_module); if (current_version == "") @@ -1076,7 +1076,7 @@ function remove_optional_component(component, package_name, label, runtime_modul clear_version_caches(); if (provider_installed(runtime_module)) action_fail(component, "remove", label + " package was removed, but provider files are still present", current_version); - restart_forkop_after_successful_change(); + restart_tachyon_after_successful_change(); action_success(component, "remove", label + " package has been removed", current_version, "", 1); } @@ -1101,7 +1101,7 @@ function move_file_portable(source_path, target_path) { if (fs.rename(source_path, target_path)) return true; - let staged_path = as_string(target_path) + ".forkop-move." + owner_pid(); + let staged_path = as_string(target_path) + ".tachyon-move." + owner_pid(); remove_file(staged_path); if (!command_success_from_args([ "cp", "-p", source_path, staged_path ]) || !fs.rename(staged_path, target_path)) { @@ -1113,7 +1113,7 @@ function move_file_portable(source_path, target_path) { } function install_staged_file(source_path, target_path, mode) { - let staged_path = as_string(target_path) + ".forkop-new." + owner_pid(); + let staged_path = as_string(target_path) + ".tachyon-new." + owner_pid(); remove_file(staged_path); if (!command_success_from_args([ "cp", "-f", source_path, staged_path ]) || !command_success_from_args([ "chmod", mode, staged_path ]) || @@ -1409,7 +1409,7 @@ function install_sing_box_extended_package(action) { if (!run_logged("Updating package lists before sing-box-extended package installation", pkg_list_update_command())) action_fail("sing_box", action, "Failed to update package lists", current_version, latest_version); - stop_forkop_before_sing_box_change(); + stop_tachyon_before_sing_box_change(); prepare_sing_box_package_service_install(); let backup_binary = ""; @@ -1417,13 +1417,13 @@ function install_sing_box_extended_package(action) { let cronet_touched = false; if (current_variant == "extended" || current_variant == "extended-compressed") { if (file_exists("/usr/bin/sing-box")) { - backup_binary = "/usr/bin/sing-box.forkop-backup." + owner_pid(); + backup_binary = "/usr/bin/sing-box.tachyon-backup." + owner_pid(); if (!move_file_to_backup("/usr/bin/sing-box", backup_binary)) action_fail("sing_box", action, "Failed to backup current sing-box binary", current_version, latest_version); } if (file_exists("/usr/lib/libcronet.so")) { cronet_touched = true; - backup_cronet = "/usr/lib/libcronet.so.forkop-backup." + owner_pid(); + backup_cronet = "/usr/lib/libcronet.so.tachyon-backup." + owner_pid(); if (!move_file_to_backup("/usr/lib/libcronet.so", backup_cronet)) { restore_sing_box_after_failed_extended_package_install(current_variant, backup_binary, backup_cronet, previous_marker, previous_version_state, package_file, cronet_touched); action_fail("sing_box", action, "Failed to backup current libcronet.so", current_version, latest_version); @@ -1441,7 +1441,7 @@ function install_sing_box_extended_package(action) { } if (backup_binary == "" && file_exists("/usr/bin/sing-box")) { - backup_binary = "/usr/bin/sing-box.forkop-backup." + owner_pid(); + backup_binary = "/usr/bin/sing-box.tachyon-backup." + owner_pid(); if (!move_file_to_backup("/usr/bin/sing-box", backup_binary)) { restore_sing_box_after_failed_extended_package_install(current_variant, backup_binary, backup_cronet, previous_marker, previous_version_state, package_file, cronet_touched); action_fail("sing_box", action, "Failed to backup existing sing-box binary", current_version, latest_version); @@ -1449,7 +1449,7 @@ function install_sing_box_extended_package(action) { } if (!cronet_touched && file_exists("/usr/lib/libcronet.so")) { cronet_touched = true; - backup_cronet = "/usr/lib/libcronet.so.forkop-backup." + owner_pid(); + backup_cronet = "/usr/lib/libcronet.so.tachyon-backup." + owner_pid(); if (!move_file_to_backup("/usr/lib/libcronet.so", backup_cronet)) { restore_sing_box_after_failed_extended_package_install(current_variant, backup_binary, backup_cronet, previous_marker, previous_version_state, package_file, cronet_touched); action_fail("sing_box", action, "Failed to backup current libcronet.so", current_version, latest_version); @@ -1470,17 +1470,17 @@ function install_sing_box_extended_package(action) { } write_sing_box_variant_state("extended", new_version); - restart_forkop_after_successful_change(); - if (!wait_forkop_running_after_sing_box_change()) { + restart_tachyon_after_successful_change(); + if (!wait_tachyon_running_after_sing_box_change()) { updates_log("sing-box-extended package did not start cleanly; restoring previous sing-box variant", "error"); if (file_exists(SERVICE_INIT)) command_success_from_args([ SERVICE_INIT, "stop" ]); if (restore_sing_box_after_failed_extended_package_install(current_variant, backup_binary, backup_cronet, previous_marker, previous_version_state, package_file, cronet_touched)) { remove_file(backup_binary); remove_file(backup_cronet); - action_fail("sing_box", action, "sing-box-extended package was installed but Forkop did not start cleanly; previous sing-box variant was restored", current_version, latest_version); + action_fail("sing_box", action, "sing-box-extended package was installed but Tachyon did not start cleanly; previous sing-box variant was restored", current_version, latest_version); } - action_fail("sing_box", action, "sing-box-extended package was installed but Forkop did not start cleanly and previous sing-box variant could not be restored", current_version, latest_version); + action_fail("sing_box", action, "sing-box-extended package was installed but Tachyon did not start cleanly and previous sing-box variant could not be restored", current_version, latest_version); } remove_file(backup_binary); @@ -1555,7 +1555,7 @@ function install_sing_box_extended(action, compressed) { } remove_file(archive_file); - stop_forkop_before_sing_box_change(); + stop_tachyon_before_sing_box_change(); let new_version = validate_sing_box_extended_binary(tmp_binary, tmp_dir); if (new_version == "") { remove_file(tmp_binary); @@ -1567,7 +1567,7 @@ function install_sing_box_extended(action, compressed) { let backup_cronet = ""; let cronet_touched = false; if (file_exists("/usr/bin/sing-box")) { - backup_binary = "/usr/bin/sing-box.forkop-backup." + owner_pid(); + backup_binary = "/usr/bin/sing-box.tachyon-backup." + owner_pid(); if (!move_file_to_backup("/usr/bin/sing-box", backup_binary)) { remove_file(backup_binary); remove_file(tmp_binary); @@ -1579,7 +1579,7 @@ function install_sing_box_extended(action, compressed) { if (cronet_path != "") { cronet_touched = true; if (file_exists("/usr/lib/libcronet.so")) { - backup_cronet = "/usr/lib/libcronet.so.forkop-backup." + owner_pid(); + backup_cronet = "/usr/lib/libcronet.so.tachyon-backup." + owner_pid(); if (!move_file_to_backup("/usr/lib/libcronet.so", backup_cronet)) { restore_sing_box_after_failed_extended_install(current_variant, backup_binary, backup_cronet, previous_marker, previous_version_state, archive_file, cronet_touched); remove_file(tmp_binary); @@ -1634,17 +1634,17 @@ function install_sing_box_extended(action, compressed) { } write_sing_box_variant_state("extended-compressed", new_version); - restart_forkop_after_successful_change(); - if (!wait_forkop_running_after_sing_box_change()) { + restart_tachyon_after_successful_change(); + if (!wait_tachyon_running_after_sing_box_change()) { updates_log(label + " did not start cleanly; restoring previous sing-box binary", "error"); if (file_exists(SERVICE_INIT)) command_success_from_args([ SERVICE_INIT, "stop" ]); if (restore_sing_box_after_failed_extended_install(current_variant, backup_binary, backup_cronet, previous_marker, previous_version_state, archive_file, cronet_touched)) { remove_file(backup_binary); remove_file(backup_cronet); - action_fail("sing_box", action, label + " was installed but Forkop did not start cleanly; previous sing-box variant was restored", current_version, latest_version); + action_fail("sing_box", action, label + " was installed but Tachyon did not start cleanly; previous sing-box variant was restored", current_version, latest_version); } - action_fail("sing_box", action, label + " was installed but Forkop did not start cleanly and previous sing-box variant could not be restored", current_version, latest_version); + action_fail("sing_box", action, label + " was installed but Tachyon did not start cleanly and previous sing-box variant could not be restored", current_version, latest_version); } remove_file(backup_binary); @@ -1688,22 +1688,22 @@ function install_package_sing_box(action, tiny) { let previous_variant = sing_box_runtime_output("variant", []); let previous_marker = sing_box_runtime_output("read-variant-marker", []); let previous_version_state = sing_box_runtime_output("read-version-state", []); - stop_forkop_before_sing_box_change(); + stop_tachyon_before_sing_box_change(); let backup_binary = ""; let backup_cronet = ""; let cronet_touched = false; let backup_on_tmpfs = previous_variant == "extended-compressed"; if (file_exists("/usr/bin/sing-box")) { - backup_binary = backup_on_tmpfs ? tmp_dir + "/sing-box.forkop-backup" : - "/usr/bin/sing-box.forkop-backup." + owner_pid(); + backup_binary = backup_on_tmpfs ? tmp_dir + "/sing-box.tachyon-backup" : + "/usr/bin/sing-box.tachyon-backup." + owner_pid(); if (!move_file_to_backup("/usr/bin/sing-box", backup_binary)) action_fail("sing_box", action, "Failed to backup current sing-box binary", current_version, latest_version); } if (file_exists("/usr/lib/libcronet.so")) { cronet_touched = true; - backup_cronet = backup_on_tmpfs ? tmp_dir + "/libcronet.so.forkop-backup" : - "/usr/lib/libcronet.so.forkop-backup." + owner_pid(); + backup_cronet = backup_on_tmpfs ? tmp_dir + "/libcronet.so.tachyon-backup" : + "/usr/lib/libcronet.so.tachyon-backup." + owner_pid(); if (!move_file_to_backup("/usr/lib/libcronet.so", backup_cronet)) { restore_sing_box_backup(backup_binary); action_fail("sing_box", action, "Failed to backup current libcronet.so", current_version, latest_version); @@ -1723,9 +1723,9 @@ function install_package_sing_box(action, tiny) { fail_package_sing_box_install(action, tiny, "package was installed, but the active binary is still sing-box-extended", new_version, latest_version, package_name, previous_variant, backup_binary, backup_cronet, previous_marker, previous_version_state, cronet_touched); write_sing_box_variant_state(tiny ? "tiny" : "stable", new_version); - restart_forkop_after_successful_change(); - if (!wait_forkop_running_after_sing_box_change()) - fail_package_sing_box_install(action, tiny, "was installed, but Forkop did not start cleanly", new_version, latest_version, + restart_tachyon_after_successful_change(); + if (!wait_tachyon_running_after_sing_box_change()) + fail_package_sing_box_install(action, tiny, "was installed, but Tachyon did not start cleanly", new_version, latest_version, package_name, previous_variant, backup_binary, backup_cronet, previous_marker, previous_version_state, cronet_touched); remove_file(backup_binary); remove_file(backup_cronet); @@ -1733,45 +1733,45 @@ function install_package_sing_box(action, tiny) { action_success("sing_box", action, label + " has been installed", new_version, latest_version, new_version == current_version ? 0 : 1, "latest"); } -function check_forkop() { - let metadata = fetch_forkop_latest_release_metadata(); +function check_tachyon() { + let metadata = fetch_tachyon_latest_release_metadata(); let fields = split(metadata, "\t"); let latest_version = length(fields) > 0 && as_string(fields[0]) != "" ? as_string(fields[0]) : "unknown"; let release_url = length(fields) > 1 ? as_string(fields[1]) : ""; if (latest_version == "unknown") - action_fail("forkop", "check_update", "Failed to check Forkop updates", FORKOP_VERSION, latest_version); + action_fail("tachyon", "check_update", "Failed to check Tachyon updates", TACHYON_VERSION, latest_version); - write_forkop_latest_version_cache(latest_version, now_seconds()); - if (!helper_success("forkop-release-version-valid", [ FORKOP_VERSION ])) { - updates_log("Forkop current version is not a release version (" + FORKOP_VERSION + ")"); - action_success("forkop", "check_update", "Installed version is newer than release", FORKOP_VERSION, latest_version, 0, "dev", release_url); + write_tachyon_latest_version_cache(latest_version, now_seconds()); + if (!helper_success("tachyon-release-version-valid", [ TACHYON_VERSION ])) { + updates_log("Tachyon current version is not a release version (" + TACHYON_VERSION + ")"); + action_success("tachyon", "check_update", "Installed version is newer than release", TACHYON_VERSION, latest_version, 0, "dev", release_url); } - let compare = trim(helper_output("forkop-release-version-compare", [ FORKOP_VERSION, latest_version ])); + let compare = trim(helper_output("tachyon-release-version-compare", [ TACHYON_VERSION, latest_version ])); if (compare == "") - action_fail("forkop", "check_update", "Failed to compare Forkop versions", FORKOP_VERSION, latest_version); + action_fail("tachyon", "check_update", "Failed to compare Tachyon versions", TACHYON_VERSION, latest_version); let status = status_from_compare(int(compare)); if (status == "") - action_fail("forkop", "check_update", "Failed to compare Forkop versions", FORKOP_VERSION, latest_version); + action_fail("tachyon", "check_update", "Failed to compare Tachyon versions", TACHYON_VERSION, latest_version); if (status == "latest") { - updates_log("Forkop is already up to date (" + FORKOP_VERSION + ")"); - action_success("forkop", "check_update", "Latest version is installed", FORKOP_VERSION, latest_version, 0, status, release_url); + updates_log("Tachyon is already up to date (" + TACHYON_VERSION + ")"); + action_success("tachyon", "check_update", "Latest version is installed", TACHYON_VERSION, latest_version, 0, status, release_url); } if (status == "outdated") { - updates_log("Forkop update found: " + FORKOP_VERSION + " -> " + latest_version); - action_success("forkop", "check_update", "Update is available", FORKOP_VERSION, latest_version, 0, status, release_url); + updates_log("Tachyon update found: " + TACHYON_VERSION + " -> " + latest_version); + action_success("tachyon", "check_update", "Update is available", TACHYON_VERSION, latest_version, 0, status, release_url); } - updates_log("Forkop installed version is newer than upstream release: " + FORKOP_VERSION + " -> " + latest_version); - action_success("forkop", "check_update", "Installed version is newer than release", FORKOP_VERSION, latest_version, 0, status, release_url); + updates_log("Tachyon installed version is newer than upstream release: " + TACHYON_VERSION + " -> " + latest_version); + action_success("tachyon", "check_update", "Installed version is newer than release", TACHYON_VERSION, latest_version, 0, status, release_url); } -function resolve_forkop_release(latest_version) { - let release_json = latest_forkop_release_json(); +function resolve_tachyon_release(latest_version) { + let release_json = latest_tachyon_release_json(); if (release_json == "") return null; let asset_ext = is_apk() ? "apk" : "ipk"; - let i18n_required = pkg_is_installed("luci-i18n-forkop-ru") ? "1" : "0"; - let plan = trim(helper_output_input(release_json, "forkop-release-plan", [ latest_version, asset_ext, i18n_required ])); + let i18n_required = pkg_is_installed("luci-i18n-tachyon-ru") ? "1" : "0"; + let plan = trim(helper_output_input(release_json, "tachyon-release-plan", [ latest_version, asset_ext, i18n_required ])); let fields = split(plan, "\t"); if (length(fields) < 7 || as_string(fields[1]) == "" || as_string(fields[2]) == "" || as_string(fields[3]) == "" || as_string(fields[4]) == "") return null; @@ -1786,19 +1786,19 @@ function resolve_forkop_release(latest_version) { }; } -function install_forkop() { - let latest_version = latest_forkop_version(); +function install_tachyon() { + let latest_version = latest_tachyon_version(); if (latest_version == "") latest_version = "unknown"; if (latest_version == "unknown") - action_fail("forkop", "install", "Failed to resolve Forkop release", FORKOP_VERSION, latest_version); + action_fail("tachyon", "install", "Failed to resolve Tachyon release", TACHYON_VERSION, latest_version); - write_forkop_latest_version_cache(latest_version, now_seconds()); - init_tmp_dir() || action_fail("forkop", "install", "Failed to create temporary directory", FORKOP_VERSION, latest_version); - updates_log("Resolving Forkop release " + latest_version + " packages"); - let release = resolve_forkop_release(latest_version); + write_tachyon_latest_version_cache(latest_version, now_seconds()); + init_tmp_dir() || action_fail("tachyon", "install", "Failed to create temporary directory", TACHYON_VERSION, latest_version); + updates_log("Resolving Tachyon release " + latest_version + " packages"); + let release = resolve_tachyon_release(latest_version); if (release == null) - action_fail("forkop", "install", "Failed to resolve Forkop release packages", FORKOP_VERSION, latest_version); + action_fail("tachyon", "install", "Failed to resolve Tachyon release packages", TACHYON_VERSION, latest_version); let backend_file = tmp_dir + "/" + release.backend_name; let app_file = tmp_dir + "/" + release.app_name; @@ -1806,14 +1806,14 @@ function install_forkop() { if (!download_with_retry(release.backend_url, backend_file, release.backend_name) || !download_with_retry(release.app_url, app_file, release.app_name) || (release.i18n_url != "" && !download_with_retry(release.i18n_url, i18n_file, release.i18n_name))) - action_fail("forkop", "install", "Failed to download Forkop release packages", FORKOP_VERSION, latest_version); + action_fail("tachyon", "install", "Failed to download Tachyon release packages", TACHYON_VERSION, latest_version); if (!run_logged("Installing LuCI app package " + release.app_name, pkg_install_files_command([ app_file ]))) - action_fail("forkop", "install", "Failed to install LuCI app package", FORKOP_VERSION, latest_version); + action_fail("tachyon", "install", "Failed to install LuCI app package", TACHYON_VERSION, latest_version); if (i18n_file != "" && !run_logged("Installing LuCI Russian i18n package " + release.i18n_name, pkg_install_files_command([ i18n_file ]))) - action_fail("forkop", "install", "Failed to install LuCI Russian i18n package", FORKOP_VERSION, latest_version); - if (!run_logged("Installing Forkop package " + release.backend_name, pkg_install_files_command([ backend_file ]))) - action_fail("forkop", "install", "Failed to install Forkop package", FORKOP_VERSION, latest_version); + action_fail("tachyon", "install", "Failed to install LuCI Russian i18n package", TACHYON_VERSION, latest_version); + if (!run_logged("Installing Tachyon package " + release.backend_name, pkg_install_files_command([ backend_file ]))) + action_fail("tachyon", "install", "Failed to install Tachyon package", TACHYON_VERSION, latest_version); remove_file("/var/luci-indexcache"); command_success("rm -f /var/luci-indexcache* /tmp/luci-indexcache* 2>/dev/null"); @@ -1822,13 +1822,13 @@ function install_forkop() { command_success_from_args([ "/etc/init.d/rpcd", "restart" ]); command_success_from_args([ "killall", "-HUP", "rpcd" ]); - restart_forkop_after_successful_change(); + restart_tachyon_after_successful_change(); clear_version_caches(); - let new_version = installed_package_version("forkop"); + let new_version = installed_package_version("tachyon"); if (new_version == "") new_version = latest_version; - updates_log("Forkop updated to " + new_version); - action_success("forkop", "install", "Forkop has been installed", new_version, latest_version, 1, "latest", release.release_url); + updates_log("Tachyon updated to " + new_version); + action_success("tachyon", "install", "Tachyon has been installed", new_version, latest_version, 1, "latest", release.release_url); } function dispatch_sing_box(action) { @@ -1864,8 +1864,8 @@ function normalize_component_name(component) { component = as_string(component); if (component == "sing-box" || component == "singbox") return "sing_box"; - if (component == "forkop") - return "forkop"; + if (component == "tachyon") + return "tachyon"; return component; } @@ -1876,12 +1876,12 @@ function component_action(component, action) { action_fail(component != "" ? component : "unknown", action != "" ? action : "unknown", "Another component action is already running"); if (!init_tmp_dir()) action_fail(component != "" ? component : "unknown", action != "" ? action : "unknown", "Failed to create temporary directory"); - capture_forkop_running_state(); + capture_tachyon_running_state(); - if (component == "forkop" && action == "check_update") - check_forkop(); - else if (component == "forkop" && action == "install") - install_forkop(); + if (component == "tachyon" && action == "check_update") + check_tachyon(); + else if (component == "tachyon" && action == "install") + install_tachyon(); else if (component == "sing_box" && (action == "check_update" || action == "install" || action == "install_extended" || action == "install_extended_compressed" || action == "install_tiny" || action == "install_stable")) @@ -1906,13 +1906,13 @@ let mode = ARGV[0] || ""; if (mode == "component-action") component_action(ARGV[1], ARGV[2]); -else if (mode == "latest-forkop-release-json") - print(latest_forkop_release_json()); -else if (mode == "latest-forkop-version") - print(latest_forkop_version(), "\n"); -else if (mode == "forkop-release-metadata") - print(fetch_forkop_latest_release_metadata(), "\n"); +else if (mode == "latest-tachyon-release-json") + print(latest_tachyon_release_json()); +else if (mode == "latest-tachyon-version") + print(latest_tachyon_version(), "\n"); +else if (mode == "tachyon-release-metadata") + print(fetch_tachyon_latest_release_metadata(), "\n"); else { - warn("Usage: components/action.uc ...\n"); + warn("Usage: components/action.uc ...\n"); exit(1); } diff --git a/tachyon/files/usr/lib/components/updater.uc b/tachyon/files/usr/lib/components/updater.uc index bfacd93b..d342127b 100644 --- a/tachyon/files/usr/lib/components/updater.uc +++ b/tachyon/files/usr/lib/components/updater.uc @@ -247,7 +247,7 @@ function release_asset_pair(release, expected_name) { return null; } -function forkop_release_plan(latest_version, asset_ext, i18n_required) { +function tachyon_release_plan(latest_version, asset_ext, i18n_required) { let release = object_or_empty(read_stdin_json()); if (as_string(release.tag_name || "") != as_string(latest_version)) @@ -256,14 +256,14 @@ function forkop_release_plan(latest_version, asset_ext, i18n_required) { if (match(as_string(latest_version), /^[0-9]+[.][0-9]+[.][0-9]+$/) == null) exit(1); - let backend = release_asset_pair(release, "forkop_" + latest_version + "." + asset_ext); - let app = release_asset_pair(release, "luci-app-forkop_" + latest_version + "." + asset_ext); + let backend = release_asset_pair(release, "tachyon_" + latest_version + "." + asset_ext); + let app = release_asset_pair(release, "luci-app-tachyon_" + latest_version + "." + asset_ext); if (backend == null || app == null) exit(1); let i18n = { name: "", url: "" }; if (arg_bool(i18n_required)) { - i18n = release_asset_pair(release, "luci-i18n-forkop-ru_" + latest_version + "." + asset_ext); + i18n = release_asset_pair(release, "luci-i18n-tachyon-ru_" + latest_version + "." + asset_ext); if (i18n == null) exit(1); } @@ -415,27 +415,27 @@ function updates_normalize_zapret_version(value) { print(first_version_token(value), "\n"); } -function forkop_normalized_release_version(value) { +function tachyon_normalized_release_version(value) { return as_string(value); } -function forkop_release_version_valid(value) { - value = forkop_normalized_release_version(value); +function tachyon_release_version_valid(value) { + value = tachyon_normalized_release_version(value); return match(value, /^[0-9]+[.][0-9]+[.][0-9]+$/) != null; } -function forkop_release_version_parts(value) { - let version = forkop_normalized_release_version(value); - if (!forkop_release_version_valid(version)) +function tachyon_release_version_parts(value) { + let version = tachyon_normalized_release_version(value); + if (!tachyon_release_version_valid(version)) return null; let parts = split(version, "."); return [ int(parts[0]), int(parts[1]), int(parts[2]) ]; } -function forkop_release_version_compare(lhs, rhs) { - let lhs_parts = forkop_release_version_parts(lhs); - let rhs_parts = forkop_release_version_parts(rhs); +function tachyon_release_version_compare(lhs, rhs) { + let lhs_parts = tachyon_release_version_parts(lhs); + let rhs_parts = tachyon_release_version_parts(rhs); if (lhs_parts == null || rhs_parts == null) return false; @@ -1176,8 +1176,8 @@ else if (mode == "release-asset-name-by-suffix") release_asset_name_by_suffix(ARGV[1]); else if (mode == "release-asset-url-by-suffix") release_asset_url_by_suffix(ARGV[1]); -else if (mode == "forkop-release-plan") - forkop_release_plan(ARGV[1], ARGV[2], ARGV[3]); +else if (mode == "tachyon-release-plan") + tachyon_release_plan(ARGV[1], ARGV[2], ARGV[3]); else if (mode == "release-metadata-tsv") release_metadata_tsv(); else if (mode == "openwrt-release-value") @@ -1198,10 +1198,10 @@ else if (mode == "updates-normalize-sing-box-version") updates_normalize_sing_box_version(ARGV[1]); else if (mode == "updates-normalize-zapret-version") updates_normalize_zapret_version(ARGV[1]); -else if (mode == "forkop-release-version-valid") - exit(forkop_release_version_valid(ARGV[1]) ? 0 : 1); -else if (mode == "forkop-release-version-compare") - exit(forkop_release_version_compare(ARGV[1], ARGV[2]) ? 0 : 1); +else if (mode == "tachyon-release-version-valid") + exit(tachyon_release_version_valid(ARGV[1]) ? 0 : 1); +else if (mode == "tachyon-release-version-compare") + exit(tachyon_release_version_compare(ARGV[1], ARGV[2]) ? 0 : 1); else if (mode == "updates-zip-inner-package-path") updates_zip_inner_package_path(ARGV[1], ARGV[2], ARGV[3]); else if (mode == "updates-archive-member-path") diff --git a/tachyon/files/usr/lib/components/updates.uc b/tachyon/files/usr/lib/components/updates.uc index 18db302f..a8e7e94f 100644 --- a/tachyon/files/usr/lib/components/updates.uc +++ b/tachyon/files/usr/lib/components/updates.uc @@ -3,56 +3,56 @@ let fs = require("fs"); let uci_core = require("core.uci"); let connections = require("config.connections"); -const CONFIG_NAME = getenv("FORKOP_CONFIG_NAME") || "forkop"; -const LIB_DIR = getenv("FORKOP_LIB") || "/usr/lib/forkop"; -const BIN_PATH = getenv("FORKOP_BIN") || "/usr/bin/forkop"; +const CONFIG_NAME = getenv("TACHYON_CONFIG_NAME") || "tachyon"; +const LIB_DIR = getenv("TACHYON_LIB") || "/usr/lib/tachyon"; +const BIN_PATH = getenv("TACHYON_BIN") || "/usr/bin/tachyon"; const TMP_SING_BOX_FOLDER = getenv("TMP_SING_BOX_FOLDER") || "/tmp/sing-box"; const TMP_RULESET_FOLDER = getenv("TMP_RULESET_FOLDER") || TMP_SING_BOX_FOLDER + "/rulesets"; const TMP_SUBSCRIPTION_FOLDER = getenv("TMP_SUBSCRIPTION_FOLDER") || TMP_SING_BOX_FOLDER + "/subscriptions"; -const RUNTIME_STATE_DIR = getenv("FORKOP_RUNTIME_STATE_DIR") || "/var/run/forkop"; -const LIST_UPDATE_STATE_FILE = getenv("FORKOP_LIST_UPDATE_STATE_FILE") || RUNTIME_STATE_DIR + "/list-update.timestamp"; -const LIST_UPDATE_PID_FILE = getenv("FORKOP_LIST_UPDATE_PID_FILE") || "/var/run/forkop_list_update.pid"; -const SUBSCRIPTION_UPDATE_STATE_DIR = getenv("FORKOP_SUBSCRIPTION_UPDATE_STATE_DIR") || RUNTIME_STATE_DIR + "/subscription-update"; -const SUBSCRIPTION_JOB_DIR = getenv("FORKOP_SUBSCRIPTION_UPDATE_JOB_DIR") || "/var/run/forkop/subscription-update-jobs"; -const SUBSCRIPTION_UPDATE_LOCK_DIR = getenv("FORKOP_SUBSCRIPTION_UPDATE_LOCK_DIR") || RUNTIME_STATE_DIR + "/subscription-update.lock"; -const SUBSCRIPTION_LINKS_DIR = getenv("FORKOP_SUBSCRIPTION_LINKS_DIR") || RUNTIME_STATE_DIR + "/subscription-links"; -const SUBSCRIPTION_METADATA_DIR = getenv("FORKOP_SUBSCRIPTION_METADATA_DIR") || RUNTIME_STATE_DIR + "/subscription-metadata"; -const OUTBOUND_METADATA_DIR = getenv("FORKOP_OUTBOUND_METADATA_DIR") || RUNTIME_STATE_DIR + "/outbound-metadata"; -const SECTION_CACHE_DIR = getenv("FORKOP_SECTION_CACHE_DIR") || RUNTIME_STATE_DIR + "/section-cache"; -const RUNTIME_CACHE_FORMAT_FILE = getenv("FORKOP_RUNTIME_CACHE_FORMAT_FILE") || RUNTIME_STATE_DIR + "/cache-format"; -const RUNTIME_CACHE_FORMAT = getenv("FORKOP_RUNTIME_CACHE_FORMAT") || "7"; -const PERSISTENT_SUBSCRIPTION_CACHE_DIR = getenv("FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR") || "/etc/forkop/subscription-cache"; -const PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE = getenv("FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE") || PERSISTENT_SUBSCRIPTION_CACHE_DIR + "/cache-format"; -const PENDING_RELOAD_FILE = getenv("FORKOP_PENDING_RELOAD_FILE") || RUNTIME_STATE_DIR + "/reload.pending"; -const RELOAD_STATE_FILE = getenv("FORKOP_RELOAD_STATE_FILE") || RUNTIME_STATE_DIR + "/reload-state"; -const RELOAD_STATE_FORMAT = getenv("FORKOP_RELOAD_STATE_FORMAT") || "1"; -const RULE_CONDITION_CACHE_DIR = getenv("FORKOP_RULE_CONDITION_CACHE_DIR") || RUNTIME_STATE_DIR + "/rule-condition-cache"; -const RELOAD_LOCK_DIR = getenv("FORKOP_RELOAD_LOCK_DIR") || "/var/run/forkop.reload.lock"; -const SERVICE_INIT = getenv("FORKOP_SERVICE_INIT") || "/etc/init.d/forkop"; -const PRIORITY_UC = getenv("FORKOP_PRIORITY_UC") || LIB_DIR + "/singbox/priority.uc"; -const DNS_FAILOVER_UC = getenv("FORKOP_DNS_FAILOVER_UC") || LIB_DIR + "/singbox/dns_failover.uc"; -const COMPONENT_JOB_DIR = getenv("UPDATES_JOB_DIR") || getenv("FORKOP_UI_COMPONENT_ACTION_DIR") || "/var/run/forkop/component-actions"; -const COMPONENT_UPDATE_CHECK_CACHE_DIR = getenv("FORKOP_COMPONENT_UPDATE_CHECK_CACHE_DIR") || RUNTIME_STATE_DIR + "/component-update-checks"; -const COMPONENT_UPDATE_CHECK_STATE_FILE = getenv("FORKOP_COMPONENT_UPDATE_CHECK_STATE_FILE") || RUNTIME_STATE_DIR + "/component-update-check.timestamp"; -const COMPONENT_UPDATE_CHECK_LOCK_DIR = getenv("FORKOP_COMPONENT_UPDATE_CHECK_LOCK_DIR") || RUNTIME_STATE_DIR + "/component-update-check.lock"; +const RUNTIME_STATE_DIR = getenv("TACHYON_RUNTIME_STATE_DIR") || "/var/run/tachyon"; +const LIST_UPDATE_STATE_FILE = getenv("TACHYON_LIST_UPDATE_STATE_FILE") || RUNTIME_STATE_DIR + "/list-update.timestamp"; +const LIST_UPDATE_PID_FILE = getenv("TACHYON_LIST_UPDATE_PID_FILE") || "/var/run/tachyon_list_update.pid"; +const SUBSCRIPTION_UPDATE_STATE_DIR = getenv("TACHYON_SUBSCRIPTION_UPDATE_STATE_DIR") || RUNTIME_STATE_DIR + "/subscription-update"; +const SUBSCRIPTION_JOB_DIR = getenv("TACHYON_SUBSCRIPTION_UPDATE_JOB_DIR") || "/var/run/tachyon/subscription-update-jobs"; +const SUBSCRIPTION_UPDATE_LOCK_DIR = getenv("TACHYON_SUBSCRIPTION_UPDATE_LOCK_DIR") || RUNTIME_STATE_DIR + "/subscription-update.lock"; +const SUBSCRIPTION_LINKS_DIR = getenv("TACHYON_SUBSCRIPTION_LINKS_DIR") || RUNTIME_STATE_DIR + "/subscription-links"; +const SUBSCRIPTION_METADATA_DIR = getenv("TACHYON_SUBSCRIPTION_METADATA_DIR") || RUNTIME_STATE_DIR + "/subscription-metadata"; +const OUTBOUND_METADATA_DIR = getenv("TACHYON_OUTBOUND_METADATA_DIR") || RUNTIME_STATE_DIR + "/outbound-metadata"; +const SECTION_CACHE_DIR = getenv("TACHYON_SECTION_CACHE_DIR") || RUNTIME_STATE_DIR + "/section-cache"; +const RUNTIME_CACHE_FORMAT_FILE = getenv("TACHYON_RUNTIME_CACHE_FORMAT_FILE") || RUNTIME_STATE_DIR + "/cache-format"; +const RUNTIME_CACHE_FORMAT = getenv("TACHYON_RUNTIME_CACHE_FORMAT") || "7"; +const PERSISTENT_SUBSCRIPTION_CACHE_DIR = getenv("TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR") || "/etc/tachyon/subscription-cache"; +const PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE = getenv("TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE") || PERSISTENT_SUBSCRIPTION_CACHE_DIR + "/cache-format"; +const PENDING_RELOAD_FILE = getenv("TACHYON_PENDING_RELOAD_FILE") || RUNTIME_STATE_DIR + "/reload.pending"; +const RELOAD_STATE_FILE = getenv("TACHYON_RELOAD_STATE_FILE") || RUNTIME_STATE_DIR + "/reload-state"; +const RELOAD_STATE_FORMAT = getenv("TACHYON_RELOAD_STATE_FORMAT") || "1"; +const RULE_CONDITION_CACHE_DIR = getenv("TACHYON_RULE_CONDITION_CACHE_DIR") || RUNTIME_STATE_DIR + "/rule-condition-cache"; +const RELOAD_LOCK_DIR = getenv("TACHYON_RELOAD_LOCK_DIR") || "/var/run/tachyon.reload.lock"; +const SERVICE_INIT = getenv("TACHYON_SERVICE_INIT") || "/etc/init.d/tachyon"; +const PRIORITY_UC = getenv("TACHYON_PRIORITY_UC") || LIB_DIR + "/singbox/priority.uc"; +const DNS_FAILOVER_UC = getenv("TACHYON_DNS_FAILOVER_UC") || LIB_DIR + "/singbox/dns_failover.uc"; +const COMPONENT_JOB_DIR = getenv("UPDATES_JOB_DIR") || getenv("TACHYON_UI_COMPONENT_ACTION_DIR") || "/var/run/tachyon/component-actions"; +const COMPONENT_UPDATE_CHECK_CACHE_DIR = getenv("TACHYON_COMPONENT_UPDATE_CHECK_CACHE_DIR") || RUNTIME_STATE_DIR + "/component-update-checks"; +const COMPONENT_UPDATE_CHECK_STATE_FILE = getenv("TACHYON_COMPONENT_UPDATE_CHECK_STATE_FILE") || RUNTIME_STATE_DIR + "/component-update-check.timestamp"; +const COMPONENT_UPDATE_CHECK_LOCK_DIR = getenv("TACHYON_COMPONENT_UPDATE_CHECK_LOCK_DIR") || RUNTIME_STATE_DIR + "/component-update-check.lock"; const COMPONENT_JOB_FINISHED_TTL_MINUTES = getenv("UPDATES_JOB_FINISHED_TTL_MINUTES") || "60"; const COMPONENT_JOB_ORPHAN_OUTPUT_TTL_MINUTES = getenv("UPDATES_JOB_ORPHAN_OUTPUT_TTL_MINUTES") || "60"; -const COMPONENT_JOB_STALE_GRACE_SECONDS = getenv("UPDATES_JOB_STALE_GRACE_SECONDS") || getenv("FORKOP_UI_ACTION_STALE_GRACE_SECONDS") || "15"; -const SUBSCRIPTION_JOB_FINISHED_TTL_MINUTES = getenv("FORKOP_SUBSCRIPTION_UPDATE_JOB_FINISHED_TTL_MINUTES") || "60"; -const SUBSCRIPTION_JOB_ORPHAN_OUTPUT_TTL_MINUTES = getenv("FORKOP_SUBSCRIPTION_UPDATE_JOB_ORPHAN_OUTPUT_TTL_MINUTES") || "60"; -const SUBSCRIPTION_JOB_STALE_GRACE_SECONDS = getenv("FORKOP_UI_ACTION_STALE_GRACE_SECONDS") || "15"; -const NFT_TABLE_NAME = getenv("NFT_TABLE_NAME") || "ForkopTable"; -const NFT_COMMON_SET_NAME = getenv("NFT_COMMON_SET_NAME") || "forkop_subnets"; -const NFT_COMMON6_SET_NAME = getenv("NFT_COMMON6_SET_NAME") || "forkop_subnets6"; -const NFT_IP_PORT_SET_NAME = getenv("NFT_IP_PORT_SET_NAME") || "forkop_ip_ports"; -const NFT_IP_PORT6_SET_NAME = getenv("NFT_IP_PORT6_SET_NAME") || "forkop_ip6_ports"; -const NFT_DISCORD_SET_NAME = getenv("NFT_DISCORD_SET_NAME") || "forkop_discord_subnets"; -const NFT_DISCORD6_SET_NAME = getenv("NFT_DISCORD6_SET_NAME") || "forkop_discord_subnets6"; -const NFT_INTERFACE_SET_NAME = getenv("NFT_INTERFACE_SET_NAME") || "forkop_interfaces"; +const COMPONENT_JOB_STALE_GRACE_SECONDS = getenv("UPDATES_JOB_STALE_GRACE_SECONDS") || getenv("TACHYON_UI_ACTION_STALE_GRACE_SECONDS") || "15"; +const SUBSCRIPTION_JOB_FINISHED_TTL_MINUTES = getenv("TACHYON_SUBSCRIPTION_UPDATE_JOB_FINISHED_TTL_MINUTES") || "60"; +const SUBSCRIPTION_JOB_ORPHAN_OUTPUT_TTL_MINUTES = getenv("TACHYON_SUBSCRIPTION_UPDATE_JOB_ORPHAN_OUTPUT_TTL_MINUTES") || "60"; +const SUBSCRIPTION_JOB_STALE_GRACE_SECONDS = getenv("TACHYON_UI_ACTION_STALE_GRACE_SECONDS") || "15"; +const NFT_TABLE_NAME = getenv("NFT_TABLE_NAME") || "TachyonTable"; +const NFT_COMMON_SET_NAME = getenv("NFT_COMMON_SET_NAME") || "tachyon_subnets"; +const NFT_COMMON6_SET_NAME = getenv("NFT_COMMON6_SET_NAME") || "tachyon_subnets6"; +const NFT_IP_PORT_SET_NAME = getenv("NFT_IP_PORT_SET_NAME") || "tachyon_ip_ports"; +const NFT_IP_PORT6_SET_NAME = getenv("NFT_IP_PORT6_SET_NAME") || "tachyon_ip6_ports"; +const NFT_DISCORD_SET_NAME = getenv("NFT_DISCORD_SET_NAME") || "tachyon_discord_subnets"; +const NFT_DISCORD6_SET_NAME = getenv("NFT_DISCORD6_SET_NAME") || "tachyon_discord_subnets6"; +const NFT_INTERFACE_SET_NAME = getenv("NFT_INTERFACE_SET_NAME") || "tachyon_interfaces"; const NFT_FAKEIP_MARK = getenv("NFT_FAKEIP_MARK") || "0x00100000"; const SB_SERVICE_MIXED_INBOUND_ADDRESS = getenv("SB_SERVICE_MIXED_INBOUND_ADDRESS") || "127.0.0.1"; const SB_SERVICE_MIXED_INBOUND_PORT = getenv("SB_SERVICE_MIXED_INBOUND_PORT") || "4534"; -const SB_VARIANT_STATE_FILE = getenv("SB_VARIANT_STATE_FILE") || "/etc/forkop/sing-box-variant"; +const SB_VARIANT_STATE_FILE = getenv("SB_VARIANT_STATE_FILE") || "/etc/tachyon/sing-box-variant"; const GITHUB_RAW_URL = getenv("GITHUB_RAW_URL") || "https://raw.githubusercontent.com/itdoginfo/allow-domains/main"; const BUILTIN_SUBNET_URLS = { twitter: getenv("SUBNETS_TWITTER") || GITHUB_RAW_URL + "/Subnets/IPv4/twitter.lst", @@ -155,7 +155,7 @@ function ensure_dir(path) { function log_message(message, level) { level = as_string(level || "info"); - command_success_from_args([ "logger", "-t", "forkop", "[" + level + "] " + as_string(message) ]); + command_success_from_args([ "logger", "-t", "tachyon", "[" + level + "] " + as_string(message) ]); } @@ -1048,21 +1048,21 @@ function subscription_job_id() { function ensure_subscription_runtime_dirs() { let command = command_env({ - FORKOP_CONFIG_NAME: CONFIG_NAME, - FORKOP_LIB: LIB_DIR, + TACHYON_CONFIG_NAME: CONFIG_NAME, + TACHYON_LIB: LIB_DIR, TMP_SING_BOX_FOLDER, TMP_RULESET_FOLDER, TMP_SUBSCRIPTION_FOLDER, - FORKOP_RUNTIME_STATE_DIR: RUNTIME_STATE_DIR, - FORKOP_SUBSCRIPTION_UPDATE_STATE_DIR: SUBSCRIPTION_UPDATE_STATE_DIR, - FORKOP_SUBSCRIPTION_LINKS_DIR: SUBSCRIPTION_LINKS_DIR, - FORKOP_SUBSCRIPTION_METADATA_DIR: SUBSCRIPTION_METADATA_DIR, - FORKOP_OUTBOUND_METADATA_DIR: OUTBOUND_METADATA_DIR, - FORKOP_SECTION_CACHE_DIR: SECTION_CACHE_DIR, - FORKOP_RUNTIME_CACHE_FORMAT_FILE: RUNTIME_CACHE_FORMAT_FILE, - FORKOP_RUNTIME_CACHE_FORMAT: RUNTIME_CACHE_FORMAT, - FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR: PERSISTENT_SUBSCRIPTION_CACHE_DIR, - FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE: PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE + TACHYON_RUNTIME_STATE_DIR: RUNTIME_STATE_DIR, + TACHYON_SUBSCRIPTION_UPDATE_STATE_DIR: SUBSCRIPTION_UPDATE_STATE_DIR, + TACHYON_SUBSCRIPTION_LINKS_DIR: SUBSCRIPTION_LINKS_DIR, + TACHYON_SUBSCRIPTION_METADATA_DIR: SUBSCRIPTION_METADATA_DIR, + TACHYON_OUTBOUND_METADATA_DIR: OUTBOUND_METADATA_DIR, + TACHYON_SECTION_CACHE_DIR: SECTION_CACHE_DIR, + TACHYON_RUNTIME_CACHE_FORMAT_FILE: RUNTIME_CACHE_FORMAT_FILE, + TACHYON_RUNTIME_CACHE_FORMAT: RUNTIME_CACHE_FORMAT, + TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR: PERSISTENT_SUBSCRIPTION_CACHE_DIR, + TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE: PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE }) + " " + command_from_args([ "ucode", "-L", LIB_DIR, @@ -1191,26 +1191,26 @@ function finish_subscription_job(path, exit_code, output_file) { function subscription_worker_env() { return { - FORKOP_CONFIG_NAME: CONFIG_NAME, - FORKOP_LIB: LIB_DIR, - FORKOP_BIN: BIN_PATH, + TACHYON_CONFIG_NAME: CONFIG_NAME, + TACHYON_LIB: LIB_DIR, + TACHYON_BIN: BIN_PATH, TMP_SING_BOX_FOLDER, TMP_RULESET_FOLDER, TMP_SUBSCRIPTION_FOLDER, - FORKOP_RUNTIME_STATE_DIR: RUNTIME_STATE_DIR, - FORKOP_SUBSCRIPTION_UPDATE_STATE_DIR: SUBSCRIPTION_UPDATE_STATE_DIR, - FORKOP_SUBSCRIPTION_UPDATE_JOB_DIR: SUBSCRIPTION_JOB_DIR, - FORKOP_SUBSCRIPTION_LINKS_DIR: SUBSCRIPTION_LINKS_DIR, - FORKOP_SUBSCRIPTION_METADATA_DIR: SUBSCRIPTION_METADATA_DIR, - FORKOP_OUTBOUND_METADATA_DIR: OUTBOUND_METADATA_DIR, - FORKOP_SECTION_CACHE_DIR: SECTION_CACHE_DIR, - FORKOP_RUNTIME_CACHE_FORMAT_FILE: RUNTIME_CACHE_FORMAT_FILE, - FORKOP_RUNTIME_CACHE_FORMAT: RUNTIME_CACHE_FORMAT, - FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR: PERSISTENT_SUBSCRIPTION_CACHE_DIR, - FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE: PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE, - FORKOP_SUBSCRIPTION_UPDATE_JOB_FINISHED_TTL_MINUTES: SUBSCRIPTION_JOB_FINISHED_TTL_MINUTES, - FORKOP_SUBSCRIPTION_UPDATE_JOB_ORPHAN_OUTPUT_TTL_MINUTES: SUBSCRIPTION_JOB_ORPHAN_OUTPUT_TTL_MINUTES, - FORKOP_UI_ACTION_STALE_GRACE_SECONDS: SUBSCRIPTION_JOB_STALE_GRACE_SECONDS + TACHYON_RUNTIME_STATE_DIR: RUNTIME_STATE_DIR, + TACHYON_SUBSCRIPTION_UPDATE_STATE_DIR: SUBSCRIPTION_UPDATE_STATE_DIR, + TACHYON_SUBSCRIPTION_UPDATE_JOB_DIR: SUBSCRIPTION_JOB_DIR, + TACHYON_SUBSCRIPTION_LINKS_DIR: SUBSCRIPTION_LINKS_DIR, + TACHYON_SUBSCRIPTION_METADATA_DIR: SUBSCRIPTION_METADATA_DIR, + TACHYON_OUTBOUND_METADATA_DIR: OUTBOUND_METADATA_DIR, + TACHYON_SECTION_CACHE_DIR: SECTION_CACHE_DIR, + TACHYON_RUNTIME_CACHE_FORMAT_FILE: RUNTIME_CACHE_FORMAT_FILE, + TACHYON_RUNTIME_CACHE_FORMAT: RUNTIME_CACHE_FORMAT, + TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR: PERSISTENT_SUBSCRIPTION_CACHE_DIR, + TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE: PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE, + TACHYON_SUBSCRIPTION_UPDATE_JOB_FINISHED_TTL_MINUTES: SUBSCRIPTION_JOB_FINISHED_TTL_MINUTES, + TACHYON_SUBSCRIPTION_UPDATE_JOB_ORPHAN_OUTPUT_TTL_MINUTES: SUBSCRIPTION_JOB_ORPHAN_OUTPUT_TTL_MINUTES, + TACHYON_UI_ACTION_STALE_GRACE_SECONDS: SUBSCRIPTION_JOB_STALE_GRACE_SECONDS }; } @@ -1342,14 +1342,14 @@ function normalize_component_name(component) { component = as_string(component); if (component == "sing-box" || component == "singbox") return "sing_box"; - if (component == "forkop") - return "forkop"; + if (component == "tachyon") + return "tachyon"; return component; } function valid_component_name(component) { component = normalize_component_name(component); - return component == "forkop" || component == "sing_box" || component == "zapret" || + return component == "tachyon" || component == "sing_box" || component == "zapret" || component == "zapret2" || component == "byedpi"; } @@ -1456,7 +1456,7 @@ function component_update_check_cache() { let results = []; if (enabled) { - for (let component in [ "forkop", "sing_box", "zapret", "zapret2", "byedpi" ]) { + for (let component in [ "tachyon", "sing_box", "zapret", "zapret2", "byedpi" ]) { let value = read_json_file(component_update_check_cache_path(component)); if (component_update_check_result_cacheable(value)) push(results, value); @@ -1699,15 +1699,15 @@ function finish_component_job(path, component, action, exit_code, output_file) { function component_worker_env() { return { - FORKOP_CONFIG_NAME: CONFIG_NAME, - FORKOP_LIB: LIB_DIR, - FORKOP_BIN: BIN_PATH, - FORKOP_SERVICE_INIT: SERVICE_INIT, + TACHYON_CONFIG_NAME: CONFIG_NAME, + TACHYON_LIB: LIB_DIR, + TACHYON_BIN: BIN_PATH, + TACHYON_SERVICE_INIT: SERVICE_INIT, UPDATES_JOB_DIR: COMPONENT_JOB_DIR, UPDATES_JOB_FINISHED_TTL_MINUTES: COMPONENT_JOB_FINISHED_TTL_MINUTES, UPDATES_JOB_ORPHAN_OUTPUT_TTL_MINUTES: COMPONENT_JOB_ORPHAN_OUTPUT_TTL_MINUTES, UPDATES_JOB_STALE_GRACE_SECONDS: COMPONENT_JOB_STALE_GRACE_SECONDS, - FORKOP_UI_COMPONENT_ACTION_TRACKED: "1" + TACHYON_UI_COMPONENT_ACTION_TRACKED: "1" }; } @@ -1794,7 +1794,7 @@ function component_action_status(job_id) { } function automatic_component_check_names() { - let result = [ "forkop" ]; + let result = [ "tachyon" ]; if (fs.stat("/usr/bin/sing-box") != null) push(result, "sing_box"); @@ -2537,23 +2537,23 @@ function stop_list_update() { function subscription_cache_env() { return { - FORKOP_CONFIG_NAME: CONFIG_NAME, - FORKOP_LIB: LIB_DIR, + TACHYON_CONFIG_NAME: CONFIG_NAME, + TACHYON_LIB: LIB_DIR, TMP_SING_BOX_FOLDER, TMP_RULESET_FOLDER, TMP_SUBSCRIPTION_FOLDER, - FORKOP_RUNTIME_STATE_DIR: RUNTIME_STATE_DIR, - FORKOP_SUBSCRIPTION_UPDATE_STATE_DIR: SUBSCRIPTION_UPDATE_STATE_DIR, - FORKOP_SUBSCRIPTION_LINKS_DIR: SUBSCRIPTION_LINKS_DIR, - FORKOP_SUBSCRIPTION_METADATA_DIR: SUBSCRIPTION_METADATA_DIR, - FORKOP_OUTBOUND_METADATA_DIR: OUTBOUND_METADATA_DIR, - FORKOP_SECTION_CACHE_DIR: SECTION_CACHE_DIR, - FORKOP_RUNTIME_CACHE_FORMAT_FILE: RUNTIME_CACHE_FORMAT_FILE, - FORKOP_RUNTIME_CACHE_FORMAT: RUNTIME_CACHE_FORMAT, - FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR: PERSISTENT_SUBSCRIPTION_CACHE_DIR, - FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE: PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE, - FORKOP_PENDING_RELOAD_FILE: PENDING_RELOAD_FILE, - FORKOP_SERVICE_INIT: SERVICE_INIT, + TACHYON_RUNTIME_STATE_DIR: RUNTIME_STATE_DIR, + TACHYON_SUBSCRIPTION_UPDATE_STATE_DIR: SUBSCRIPTION_UPDATE_STATE_DIR, + TACHYON_SUBSCRIPTION_LINKS_DIR: SUBSCRIPTION_LINKS_DIR, + TACHYON_SUBSCRIPTION_METADATA_DIR: SUBSCRIPTION_METADATA_DIR, + TACHYON_OUTBOUND_METADATA_DIR: OUTBOUND_METADATA_DIR, + TACHYON_SECTION_CACHE_DIR: SECTION_CACHE_DIR, + TACHYON_RUNTIME_CACHE_FORMAT_FILE: RUNTIME_CACHE_FORMAT_FILE, + TACHYON_RUNTIME_CACHE_FORMAT: RUNTIME_CACHE_FORMAT, + TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR: PERSISTENT_SUBSCRIPTION_CACHE_DIR, + TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE: PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE, + TACHYON_PENDING_RELOAD_FILE: PENDING_RELOAD_FILE, + TACHYON_SERVICE_INIT: SERVICE_INIT, SB_SERVICE_MIXED_INBOUND_ADDRESS, SB_SERVICE_MIXED_INBOUND_PORT, SB_VARIANT_STATE_FILE @@ -2717,7 +2717,7 @@ function subscription_update_common(force, target_section, target_source_index) if (!acquire_runtime_lock(RELOAD_LOCK_DIR, force)) { release_runtime_lock(SUBSCRIPTION_UPDATE_LOCK_DIR); - log_message("Forkop reload is already running; skipping subscription update", "info"); + log_message("Tachyon reload is already running; skipping subscription update", "info"); if (force) mark_pending_reload("reload_busy"); return force ? 1 : 0; diff --git a/tachyon/files/usr/lib/config/connections.uc b/tachyon/files/usr/lib/config/connections.uc index 59c497d2..9807f194 100644 --- a/tachyon/files/usr/lib/config/connections.uc +++ b/tachyon/files/usr/lib/config/connections.uc @@ -6,7 +6,7 @@ let uci_core = require("core.uci"); let as_string = common.as_string; let object_or_empty = common.object_or_empty; -const CONFIG_NAME = getenv("FORKOP_CONFIG_NAME") || "forkop"; +const CONFIG_NAME = getenv("TACHYON_CONFIG_NAME") || "tachyon"; const ITEM_TYPES = [ "subscription_url", "section_interface", diff --git a/tachyon/files/usr/lib/config/migration.uc b/tachyon/files/usr/lib/config/migration.uc index 86852c3d..5c4ff7e0 100644 --- a/tachyon/files/usr/lib/config/migration.uc +++ b/tachyon/files/usr/lib/config/migration.uc @@ -19,18 +19,18 @@ let list_option = common.list_option; let bool_option = common.bool_option; let object_or_empty = common.object_or_empty; -const CONFIG_NAME = getenv("FORKOP_CONFIG_NAME") || "forkop"; +const CONFIG_NAME = getenv("TACHYON_CONFIG_NAME") || "tachyon"; const TMP_SUBSCRIPTION_FOLDER = getenv("TMP_SUBSCRIPTION_FOLDER") || "/tmp/sing-box/subscriptions"; -const FORKOP_RUNTIME_STATE_DIR = getenv("FORKOP_RUNTIME_STATE_DIR") || "/var/run/forkop"; -const FORKOP_SUBSCRIPTION_LINKS_DIR = getenv("FORKOP_SUBSCRIPTION_LINKS_DIR") || FORKOP_RUNTIME_STATE_DIR + "/subscription-links"; -const FORKOP_SUBSCRIPTION_METADATA_DIR = getenv("FORKOP_SUBSCRIPTION_METADATA_DIR") || FORKOP_RUNTIME_STATE_DIR + "/subscription-metadata"; -const FORKOP_OUTBOUND_METADATA_DIR = getenv("FORKOP_OUTBOUND_METADATA_DIR") || FORKOP_RUNTIME_STATE_DIR + "/outbound-metadata"; -const FORKOP_SECTION_CACHE_DIR = getenv("FORKOP_SECTION_CACHE_DIR") || FORKOP_RUNTIME_STATE_DIR + "/section-cache"; -const FORKOP_RUNTIME_CACHE_FORMAT_FILE = getenv("FORKOP_RUNTIME_CACHE_FORMAT_FILE") || FORKOP_RUNTIME_STATE_DIR + "/cache-format"; -const FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR = getenv("FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR") || "/etc/forkop/subscription-cache"; -const FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE = getenv("FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE") || FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR + "/cache-format"; -const FORKOP_INTERNAL_CONFIG_TRIGGER_GUARD = getenv("FORKOP_INTERNAL_CONFIG_TRIGGER_GUARD") || "/var/run/forkop.internal-config-change"; -const FORKOP_RUNTIME_CACHE_FORMAT = getenv("FORKOP_RUNTIME_CACHE_FORMAT") || "7"; +const TACHYON_RUNTIME_STATE_DIR = getenv("TACHYON_RUNTIME_STATE_DIR") || "/var/run/tachyon"; +const TACHYON_SUBSCRIPTION_LINKS_DIR = getenv("TACHYON_SUBSCRIPTION_LINKS_DIR") || TACHYON_RUNTIME_STATE_DIR + "/subscription-links"; +const TACHYON_SUBSCRIPTION_METADATA_DIR = getenv("TACHYON_SUBSCRIPTION_METADATA_DIR") || TACHYON_RUNTIME_STATE_DIR + "/subscription-metadata"; +const TACHYON_OUTBOUND_METADATA_DIR = getenv("TACHYON_OUTBOUND_METADATA_DIR") || TACHYON_RUNTIME_STATE_DIR + "/outbound-metadata"; +const TACHYON_SECTION_CACHE_DIR = getenv("TACHYON_SECTION_CACHE_DIR") || TACHYON_RUNTIME_STATE_DIR + "/section-cache"; +const TACHYON_RUNTIME_CACHE_FORMAT_FILE = getenv("TACHYON_RUNTIME_CACHE_FORMAT_FILE") || TACHYON_RUNTIME_STATE_DIR + "/cache-format"; +const TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR = getenv("TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR") || "/etc/tachyon/subscription-cache"; +const TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE = getenv("TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE") || TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR + "/cache-format"; +const TACHYON_INTERNAL_CONFIG_TRIGGER_GUARD = getenv("TACHYON_INTERNAL_CONFIG_TRIGGER_GUARD") || "/var/run/tachyon.internal-config-change"; +const TACHYON_RUNTIME_CACHE_FORMAT = getenv("TACHYON_RUNTIME_CACHE_FORMAT") || "7"; const CONFIG_VERSION_OPTION = "config_version"; const APPLIED_MIGRATIONS_OPTION = "applied_migrations"; const SERVER_COUNTRY_METHOD_FLAG_EMOJI = "flag_emoji"; @@ -558,10 +558,10 @@ function subscription_cache_paths(section) { TMP_SUBSCRIPTION_FOLDER + "/" + section + ".json", TMP_SUBSCRIPTION_FOLDER + "/" + section + ".url", TMP_SUBSCRIPTION_FOLDER + "/" + section + ".user_agent", - FORKOP_SUBSCRIPTION_METADATA_DIR + "/" + section + ".json", - FORKOP_SUBSCRIPTION_LINKS_DIR + "/" + section + ".json", - FORKOP_OUTBOUND_METADATA_DIR + "/" + section + ".json", - FORKOP_SECTION_CACHE_DIR + "/" + section + ".json", + TACHYON_SUBSCRIPTION_METADATA_DIR + "/" + section + ".json", + TACHYON_SUBSCRIPTION_LINKS_DIR + "/" + section + ".json", + TACHYON_OUTBOUND_METADATA_DIR + "/" + section + ".json", + TACHYON_SECTION_CACHE_DIR + "/" + section + ".json", TMP_SUBSCRIPTION_FOLDER + "/" + section + "-subscription-*.json", TMP_SUBSCRIPTION_FOLDER + "/" + section + "-subscription-*.url", TMP_SUBSCRIPTION_FOLDER + "/" + section + "-subscription-*.user_agent" @@ -631,7 +631,7 @@ function migrate_proxy_rule(ctx, section, proxy_config_type) { delete_option(ctx, section, "proxy_config_type"); } -// Podkop Plus -> Forkop source migration. +// Podkop Plus -> Tachyon source migration. function migrated_rule_action(section) { let action = option(section, "action", ""); let proxy_config_type = option(section, "proxy_config_type", ""); @@ -1324,7 +1324,7 @@ function migrate_podkop_model(model, constants) { return ctx; } -function migrate_forkop_model(model) { +function migrate_tachyon_model(model) { let ctx = migration_context(model); apply_migrations(ctx); return ctx; @@ -1346,41 +1346,41 @@ function ensure_dir(path) { function clear_subscription_runtime_cache() { run("rm -rf " + shell_quote(TMP_SUBSCRIPTION_FOLDER) + " " + - shell_quote(FORKOP_SUBSCRIPTION_LINKS_DIR) + " " + - shell_quote(FORKOP_SUBSCRIPTION_METADATA_DIR) + " " + - shell_quote(FORKOP_OUTBOUND_METADATA_DIR) + " " + - shell_quote(FORKOP_SECTION_CACHE_DIR)); + shell_quote(TACHYON_SUBSCRIPTION_LINKS_DIR) + " " + + shell_quote(TACHYON_SUBSCRIPTION_METADATA_DIR) + " " + + shell_quote(TACHYON_OUTBOUND_METADATA_DIR) + " " + + shell_quote(TACHYON_SECTION_CACHE_DIR)); } function ensure_runtime_dirs() { ensure_dir(TMP_SUBSCRIPTION_FOLDER); - ensure_dir(FORKOP_RUNTIME_STATE_DIR); - ensure_dir(FORKOP_SUBSCRIPTION_LINKS_DIR); - ensure_dir(FORKOP_SUBSCRIPTION_METADATA_DIR); - ensure_dir(FORKOP_OUTBOUND_METADATA_DIR); - ensure_dir(FORKOP_SECTION_CACHE_DIR); + ensure_dir(TACHYON_RUNTIME_STATE_DIR); + ensure_dir(TACHYON_SUBSCRIPTION_LINKS_DIR); + ensure_dir(TACHYON_SUBSCRIPTION_METADATA_DIR); + ensure_dir(TACHYON_OUTBOUND_METADATA_DIR); + ensure_dir(TACHYON_SECTION_CACHE_DIR); } function ensure_runtime_cache_format() { - ensure_dir(FORKOP_RUNTIME_STATE_DIR); + ensure_dir(TACHYON_RUNTIME_STATE_DIR); - if (first_line(FORKOP_RUNTIME_CACHE_FORMAT_FILE) != FORKOP_RUNTIME_CACHE_FORMAT) { + if (first_line(TACHYON_RUNTIME_CACHE_FORMAT_FILE) != TACHYON_RUNTIME_CACHE_FORMAT) { clear_subscription_runtime_cache(); ensure_runtime_dirs(); - fs.writefile(FORKOP_RUNTIME_CACHE_FORMAT_FILE, FORKOP_RUNTIME_CACHE_FORMAT + "\n"); + fs.writefile(TACHYON_RUNTIME_CACHE_FORMAT_FILE, TACHYON_RUNTIME_CACHE_FORMAT + "\n"); } - if (first_line(FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE) != FORKOP_RUNTIME_CACHE_FORMAT) { - run("rm -rf " + shell_quote(FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR)); - ensure_dir(FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR); - run("chmod 700 " + shell_quote(FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR) + " >/dev/null 2>&1"); - fs.writefile(FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE, FORKOP_RUNTIME_CACHE_FORMAT + "\n"); - run("chmod 600 " + shell_quote(FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE) + " >/dev/null 2>&1"); + if (first_line(TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE) != TACHYON_RUNTIME_CACHE_FORMAT) { + run("rm -rf " + shell_quote(TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR)); + ensure_dir(TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR); + run("chmod 700 " + shell_quote(TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR) + " >/dev/null 2>&1"); + fs.writefile(TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE, TACHYON_RUNTIME_CACHE_FORMAT + "\n"); + run("chmod 600 " + shell_quote(TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE) + " >/dev/null 2>&1"); } } function remove_legacy_server_country_cache() { - fs.unlink(FORKOP_RUNTIME_STATE_DIR + "/server-country-cache.json"); + fs.unlink(TACHYON_RUNTIME_STATE_DIR + "/server-country-cache.json"); } function remove_cache_path(path) { @@ -1460,14 +1460,14 @@ function current_config_hash() { function mark_internal_config_guard() { let hash = current_config_hash(); if (hash == "") { - fs.unlink(FORKOP_INTERNAL_CONFIG_TRIGGER_GUARD); + fs.unlink(TACHYON_INTERNAL_CONFIG_TRIGGER_GUARD); return; } let stamp = clock(); - let tmp_path = FORKOP_INTERNAL_CONFIG_TRIGGER_GUARD + "." + stamp[0] + "." + stamp[1]; + let tmp_path = TACHYON_INTERNAL_CONFIG_TRIGGER_GUARD + "." + stamp[0] + "." + stamp[1]; fs.writefile(tmp_path, as_string(stamp[0]) + "\n" + hash + "\n"); - if (!fs.rename(tmp_path, FORKOP_INTERNAL_CONFIG_TRIGGER_GUARD)) + if (!fs.rename(tmp_path, TACHYON_INTERNAL_CONFIG_TRIGGER_GUARD)) fs.unlink(tmp_path); } @@ -1481,7 +1481,7 @@ function commit_cursor(cursor) { function migrate_model(model, source) { return source == "podkop" ? migrate_podkop_model(model, constants_context()) - : migrate_forkop_model(model); + : migrate_tachyon_model(model); } function migrate_runtime(source) { @@ -1521,20 +1521,20 @@ function main(argv) { let mode = argv[0] || ""; if (mode == "migrate") - return migrate_runtime("forkop") ? 0 : 1; + return migrate_runtime("tachyon") ? 0 : 1; if (mode == "migrate-podkop") return migrate_runtime("podkop") ? 0 : 1; if (mode == "commit") return commit_runtime() ? 0 : 1; if (mode == "migrate-fixture") { - migrate_fixture(argv[1], argv[2] || "forkop"); + migrate_fixture(argv[1], argv[2] || "tachyon"); return 0; } warn("Usage: config/migration.uc migrate\n"); warn(" config/migration.uc migrate-podkop\n"); warn(" config/migration.uc commit\n"); - warn(" config/migration.uc migrate-fixture [forkop|podkop]\n"); + warn(" config/migration.uc migrate-fixture [tachyon|podkop]\n"); return 1; } @@ -1542,7 +1542,7 @@ function module_exports() { return { main: main, migrate_model: migrate_model, - migrate_forkop_model: migrate_forkop_model, + migrate_tachyon_model: migrate_tachyon_model, migrate_podkop_model: migrate_podkop_model, mark_internal_config_guard: mark_internal_config_guard }; diff --git a/tachyon/files/usr/lib/config/validator.uc b/tachyon/files/usr/lib/config/validator.uc index 2901c988..c4a78618 100644 --- a/tachyon/files/usr/lib/config/validator.uc +++ b/tachyon/files/usr/lib/config/validator.uc @@ -13,7 +13,7 @@ let core_ip = require("core.ip"); let rule_config = require("config.rule"); let connections = require("config.connections"); -const CONFIG_NAME = getenv("FORKOP_CONFIG_NAME") || "forkop"; +const CONFIG_NAME = getenv("TACHYON_CONFIG_NAME") || "tachyon"; const DEFAULT_LATENCY_TEST_URL = "https://www.gstatic.com/generate_204"; let common = require("core.common"); @@ -190,7 +190,7 @@ function command_exists(name) { function log_message(message, level) { level = as_string(level || "info"); - run_args([ "logger", "-t", "forkop", "[" + level + "] " + as_string(message) ]); + run_args([ "logger", "-t", "tachyon", "[" + level + "] " + as_string(message) ]); } function fail_requirement(message, level) { @@ -210,7 +210,7 @@ function mkdir_p(paths) { function safe_rm_rf(path) { path = as_string(path); - if (path == "" || substr(path, 0, length("/var/run/forkop/")) != "/var/run/forkop/") + if (path == "" || substr(path, 0, length("/var/run/tachyon/")) != "/var/run/tachyon/") return true; return run_args([ "rm", "-rf", path ]); @@ -1707,7 +1707,7 @@ function context_from_runtime() { function sing_box_variant_marker(ctx, value) { let path = as_string(ctx.sing_box_variant_state_file); if (path == "") - path = "/etc/forkop/sing-box-variant"; + path = "/etc/tachyon/sing-box-variant"; let data = fs.readfile(path); return trim(as_string(data)) == as_string(value); @@ -1724,7 +1724,7 @@ function sing_box_extended_marker_set(ctx) { function sing_box_version_state(ctx) { let path = as_string(ctx.sing_box_version_state_file); if (path == "") - path = "/etc/forkop/sing-box-version"; + path = "/etc/tachyon/sing-box-version"; let data = fs.readfile(path); if (data == null) @@ -1784,7 +1784,7 @@ function sing_box_supports_tailscale(ctx, version, version_output) { function managed_sing_box_service_script(marker) { marker = as_string(marker); if (marker == "") - marker = "Forkop managed sing-box service for binary variants"; + marker = "Tachyon managed sing-box service for binary variants"; return "#!/bin/sh /etc/rc.common\n" + "# " + marker + "\n" + @@ -1822,7 +1822,7 @@ function managed_sing_box_service_script(marker) { function install_managed_sing_box_service_script(ctx) { let stamp = clock(); - let tmp_file = sprintf("/etc/init.d/sing-box.forkop.%d.%d", stamp[0], stamp[1]); + let tmp_file = sprintf("/etc/init.d/sing-box.tachyon.%d.%d", stamp[0], stamp[1]); if (!fs.writefile(tmp_file, managed_sing_box_service_script(ctx.sing_box_managed_service_marker))) return false; @@ -1936,7 +1936,7 @@ function check_provider_requirements(ctx) { ctx.zapret_provider_nfqws_bin, [ ctx.zapret_state_dir, ctx.zapret_pid_dir, ctx.zapret_child_pid_dir, ctx.zapret_log_dir ], "Zapret provider is not available at " + ctx.zapret_provider_nfqws_bin + ". Rules with action 'zapret' will be skipped until the zapret provider is installed.", - "Failed to prepare the Forkop zapret state directory in " + ctx.zapret_state_dir + ". Aborted." + "Failed to prepare the Tachyon zapret state directory in " + ctx.zapret_state_dir + ". Aborted." ); check_provider_requirement( @@ -1945,7 +1945,7 @@ function check_provider_requirements(ctx) { ctx.zapret2_provider_nfqws2_bin, [ ctx.zapret2_state_dir, ctx.zapret2_pid_dir, ctx.zapret2_child_pid_dir, ctx.zapret2_log_dir ], "Zapret2 provider is not available at " + ctx.zapret2_provider_nfqws2_bin + ". Rules with action 'zapret2' will be skipped until the zapret2 provider is installed.", - "Failed to prepare the Forkop zapret2 state directory in " + ctx.zapret2_state_dir + ". Aborted." + "Failed to prepare the Tachyon zapret2 state directory in " + ctx.zapret2_state_dir + ". Aborted." ); check_provider_requirement( @@ -1954,7 +1954,7 @@ function check_provider_requirements(ctx) { ctx.byedpi_bin, [ ctx.byedpi_state_dir, ctx.byedpi_pid_dir, ctx.byedpi_child_pid_dir, ctx.byedpi_log_dir ], "ByeDPI provider is not available at " + ctx.byedpi_bin + ". Rules with action 'byedpi' will be skipped until the byedpi package is installed.", - "Failed to prepare the Forkop ByeDPI state directory in " + ctx.byedpi_state_dir + ". Aborted." + "Failed to prepare the Tachyon ByeDPI state directory in " + ctx.byedpi_state_dir + ". Aborted." ); } @@ -1988,12 +1988,12 @@ function check_runtime_requirements() { log_message("Package 'coreutils-base64' version (" + coreutils_base64_version + ") is lower than the required minimum (" + ctx.coreutils_base64_required_version + "). This may cause issues when decoding base64 streams with missing padding, as automatic padding support is not available in older versions.", "warn"); if (dhcp_has_https_dns_proxy_options("/etc/config/dhcp") === true) - log_message("https-dns-proxy is enabled in DHCP config. Disable it or edit /etc/config/dhcp before starting Forkop.", "error"); + log_message("https-dns-proxy is enabled in DHCP config. Disable it or edit /etc/config/dhcp before starting Tachyon.", "error"); if (has_outbound_section(ctx)) log_message("Proxy outbound configuration found", "debug"); else - log_message("No proxy outbound sections found. Forkop will use direct and/or provider-only routing.", "warn"); + log_message("No proxy outbound sections found. Tachyon will use direct and/or provider-only routing.", "warn"); check_provider_requirements(ctx); } diff --git a/tachyon/files/usr/lib/core/constants.uc b/tachyon/files/usr/lib/core/constants.uc index d590da57..3b341d7d 100644 --- a/tachyon/files/usr/lib/core/constants.uc +++ b/tachyon/files/usr/lib/core/constants.uc @@ -12,16 +12,16 @@ function env(name, fallback) { function constants_map() { let c = {}; - c.FORKOP_VERSION = env("FORKOP_VERSION", "__COMPILED_VERSION_VARIABLE__"); - c.FORKOP_CONFIG_NAME = env("FORKOP_CONFIG_NAME", "forkop"); - c.FORKOP_CONFIG = env("FORKOP_CONFIG", "/etc/config/" + c.FORKOP_CONFIG_NAME); - c.FORKOP_BIN = env("FORKOP_BIN", "/usr/bin/forkop"); - c.FORKOP_SERVICE_NAME = env("FORKOP_SERVICE_NAME", "forkop"); - c.FORKOP_SERVICE_INIT = env("FORKOP_SERVICE_INIT", "/etc/init.d/forkop"); - c.FORKOP_RELEASE_REPO = env("FORKOP_RELEASE_REPO", "Dushnilin/tachyon"); - c.FORKOP_LUCI_VIEW_NAMESPACE = env("FORKOP_LUCI_VIEW_NAMESPACE", "forkop"); - c.FORKOP_LUCI_VIEW_DIR = env("FORKOP_LUCI_VIEW_DIR", "/www/luci-static/resources/view/" + c.FORKOP_LUCI_VIEW_NAMESPACE); - c.FORKOP_LUCI_I18N_DOMAIN = env("FORKOP_LUCI_I18N_DOMAIN", "forkop"); + c.TACHYON_VERSION = env("TACHYON_VERSION", "__COMPILED_VERSION_VARIABLE__"); + c.TACHYON_CONFIG_NAME = env("TACHYON_CONFIG_NAME", "tachyon"); + c.TACHYON_CONFIG = env("TACHYON_CONFIG", "/etc/config/" + c.TACHYON_CONFIG_NAME); + c.TACHYON_BIN = env("TACHYON_BIN", "/usr/bin/tachyon"); + c.TACHYON_SERVICE_NAME = env("TACHYON_SERVICE_NAME", "tachyon"); + c.TACHYON_SERVICE_INIT = env("TACHYON_SERVICE_INIT", "/etc/init.d/tachyon"); + c.TACHYON_RELEASE_REPO = env("TACHYON_RELEASE_REPO", "Dushnilin/tachyon"); + c.TACHYON_LUCI_VIEW_NAMESPACE = env("TACHYON_LUCI_VIEW_NAMESPACE", "tachyon"); + c.TACHYON_LUCI_VIEW_DIR = env("TACHYON_LUCI_VIEW_DIR", "/www/luci-static/resources/view/" + c.TACHYON_LUCI_VIEW_NAMESPACE); + c.TACHYON_LUCI_I18N_DOMAIN = env("TACHYON_LUCI_I18N_DOMAIN", "tachyon"); c.RESOLV_CONF = env("RESOLV_CONF", "/etc/resolv.conf"); c.CHECK_PROXY_IP_DOMAIN = env("CHECK_PROXY_IP_DOMAIN", "ip.podkop.fyi"); @@ -31,24 +31,24 @@ function constants_map() { c.TMP_SUBSCRIPTION_FOLDER = env("TMP_SUBSCRIPTION_FOLDER", c.TMP_SING_BOX_FOLDER + "/subscriptions"); c.CLOUDFLARE_OCTETS = env("CLOUDFLARE_OCTETS", "8.47 162.159 188.114"); c.COREUTILS_BASE64_REQUIRED_VERSION = env("COREUTILS_BASE64_REQUIRED_VERSION", "9.7"); - c.RT_TABLE_NAME = env("RT_TABLE_NAME", "forkop"); + c.RT_TABLE_NAME = env("RT_TABLE_NAME", "tachyon"); - c.NFT_TABLE_NAME = env("NFT_TABLE_NAME", "ForkopTable"); + c.NFT_TABLE_NAME = env("NFT_TABLE_NAME", "TachyonTable"); c.NFT_LOCALV4_SET_NAME = env("NFT_LOCALV4_SET_NAME", "localv4"); c.NFT_LOCALV6_SET_NAME = env("NFT_LOCALV6_SET_NAME", "localv6"); - c.NFT_COMMON_SET_NAME = env("NFT_COMMON_SET_NAME", "forkop_subnets"); - c.NFT_COMMON6_SET_NAME = env("NFT_COMMON6_SET_NAME", "forkop_subnets6"); - c.NFT_PORT_SET_NAME = env("NFT_PORT_SET_NAME", "forkop_ports"); - c.NFT_IP_PORT_SET_NAME = env("NFT_IP_PORT_SET_NAME", "forkop_ip_ports"); - c.NFT_IP_PORT6_SET_NAME = env("NFT_IP_PORT6_SET_NAME", "forkop_ip6_ports"); - c.NFT_DISCORD_SET_NAME = env("NFT_DISCORD_SET_NAME", "forkop_discord_subnets"); - c.NFT_DISCORD6_SET_NAME = env("NFT_DISCORD6_SET_NAME", "forkop_discord_subnets6"); - c.NFT_INTERFACE_SET_NAME = env("NFT_INTERFACE_SET_NAME", "forkop_interfaces"); + c.NFT_COMMON_SET_NAME = env("NFT_COMMON_SET_NAME", "tachyon_subnets"); + c.NFT_COMMON6_SET_NAME = env("NFT_COMMON6_SET_NAME", "tachyon_subnets6"); + c.NFT_PORT_SET_NAME = env("NFT_PORT_SET_NAME", "tachyon_ports"); + c.NFT_IP_PORT_SET_NAME = env("NFT_IP_PORT_SET_NAME", "tachyon_ip_ports"); + c.NFT_IP_PORT6_SET_NAME = env("NFT_IP_PORT6_SET_NAME", "tachyon_ip6_ports"); + c.NFT_DISCORD_SET_NAME = env("NFT_DISCORD_SET_NAME", "tachyon_discord_subnets"); + c.NFT_DISCORD6_SET_NAME = env("NFT_DISCORD6_SET_NAME", "tachyon_discord_subnets6"); + c.NFT_INTERFACE_SET_NAME = env("NFT_INTERFACE_SET_NAME", "tachyon_interfaces"); c.NFT_FAKEIP_MARK = env("NFT_FAKEIP_MARK", "0x00100000"); c.NFT_OUTBOUND_MARK = env("NFT_OUTBOUND_MARK", "0x00200000"); c.SB_REQUIRED_VERSION = env("SB_REQUIRED_VERSION", "1.12.0"); - c.SB_MANAGED_SERVICE_MARKER = env("SB_MANAGED_SERVICE_MARKER", "Forkop managed sing-box service for binary variants"); + c.SB_MANAGED_SERVICE_MARKER = env("SB_MANAGED_SERVICE_MARKER", "Tachyon managed sing-box service for binary variants"); c.SB_DNS_SERVER_TAG = env("SB_DNS_SERVER_TAG", "dns-server"); c.SB_FAKEIP_DNS_SERVER_TAG = env("SB_FAKEIP_DNS_SERVER_TAG", "fakeip-server"); c.SB_FAKEIP_INET4_RANGE = env("SB_FAKEIP_INET4_RANGE", "198.18.0.0/15"); @@ -71,8 +71,8 @@ function constants_map() { c.SB_DIRECT_OUTBOUND_TAG = env("SB_DIRECT_OUTBOUND_TAG", "direct-out"); c.SB_BYPASS_OUTBOUND_TAG = env("SB_BYPASS_OUTBOUND_TAG", "bypass-out"); c.SB_CLASH_API_CONTROLLER_PORT = env("SB_CLASH_API_CONTROLLER_PORT", "9090"); - c.SB_VARIANT_STATE_FILE = env("SB_VARIANT_STATE_FILE", "/etc/forkop/sing-box-variant"); - c.SB_VERSION_STATE_FILE = env("SB_VERSION_STATE_FILE", "/etc/forkop/sing-box-version"); + c.SB_VARIANT_STATE_FILE = env("SB_VARIANT_STATE_FILE", "/etc/tachyon/sing-box-variant"); + c.SB_VERSION_STATE_FILE = env("SB_VERSION_STATE_FILE", "/etc/tachyon/sing-box-version"); c.GITHUB_RAW_URL = env("GITHUB_RAW_URL", "https://raw.githubusercontent.com/itdoginfo/allow-domains/main"); c.SRS_MAIN_URL = env("SRS_MAIN_URL", "https://github.com/itdoginfo/allow-domains/releases/latest/download"); @@ -94,9 +94,9 @@ function constants_map() { c.ZAPRET_PROVIDER_NFQWS_BIN = env("ZAPRET_PROVIDER_NFQWS_BIN", c.ZAPRET_PROVIDER_BASE_DIR + "/nfq/nfqws"); c.ZAPRET_PROVIDER_FILES_DIR = env("ZAPRET_PROVIDER_FILES_DIR", c.ZAPRET_PROVIDER_BASE_DIR + "/files"); c.ZAPRET_PROVIDER_IPSET_DIR = env("ZAPRET_PROVIDER_IPSET_DIR", c.ZAPRET_PROVIDER_BASE_DIR + "/ipset"); - c.ZAPRET_LEGACY_RUNTIME_BASE_DIR = env("ZAPRET_LEGACY_RUNTIME_BASE_DIR", "/var/run/forkop/zapret-runtime"); + c.ZAPRET_LEGACY_RUNTIME_BASE_DIR = env("ZAPRET_LEGACY_RUNTIME_BASE_DIR", "/var/run/tachyon/zapret-runtime"); c.ZAPRET_NFQWS_BIN = env("ZAPRET_NFQWS_BIN", c.ZAPRET_PROVIDER_NFQWS_BIN); - c.ZAPRET_STATE_DIR = env("ZAPRET_STATE_DIR", "/var/run/forkop/zapret"); + c.ZAPRET_STATE_DIR = env("ZAPRET_STATE_DIR", "/var/run/tachyon/zapret"); c.ZAPRET_PID_DIR = env("ZAPRET_PID_DIR", c.ZAPRET_STATE_DIR + "/pid"); c.ZAPRET_CHILD_PID_DIR = env("ZAPRET_CHILD_PID_DIR", c.ZAPRET_STATE_DIR + "/child-pid"); c.ZAPRET_LOG_DIR = env("ZAPRET_LOG_DIR", c.ZAPRET_STATE_DIR + "/log"); @@ -116,7 +116,7 @@ function constants_map() { c.ZAPRET2_PROVIDER_IPSET_DIR = env("ZAPRET2_PROVIDER_IPSET_DIR", c.ZAPRET2_PROVIDER_BASE_DIR + "/ipset"); c.ZAPRET2_PROVIDER_LUA_DIR = env("ZAPRET2_PROVIDER_LUA_DIR", c.ZAPRET2_PROVIDER_BASE_DIR + "/lua"); c.ZAPRET2_NFQWS2_BIN = env("ZAPRET2_NFQWS2_BIN", c.ZAPRET2_PROVIDER_NFQWS2_BIN); - c.ZAPRET2_STATE_DIR = env("ZAPRET2_STATE_DIR", "/var/run/forkop/zapret2"); + c.ZAPRET2_STATE_DIR = env("ZAPRET2_STATE_DIR", "/var/run/tachyon/zapret2"); c.ZAPRET2_PID_DIR = env("ZAPRET2_PID_DIR", c.ZAPRET2_STATE_DIR + "/pid"); c.ZAPRET2_CHILD_PID_DIR = env("ZAPRET2_CHILD_PID_DIR", c.ZAPRET2_STATE_DIR + "/child-pid"); c.ZAPRET2_LOG_DIR = env("ZAPRET2_LOG_DIR", c.ZAPRET2_STATE_DIR + "/log"); @@ -130,7 +130,7 @@ function constants_map() { c.BYEDPI_BIN = env("BYEDPI_BIN", "/usr/bin/ciadpi"); c.BYEDPI_SERVICE_INIT = env("BYEDPI_SERVICE_INIT", "/etc/init.d/byedpi"); - c.BYEDPI_STATE_DIR = env("BYEDPI_STATE_DIR", "/var/run/forkop/byedpi"); + c.BYEDPI_STATE_DIR = env("BYEDPI_STATE_DIR", "/var/run/tachyon/byedpi"); c.BYEDPI_PID_DIR = env("BYEDPI_PID_DIR", c.BYEDPI_STATE_DIR + "/pid"); c.BYEDPI_CHILD_PID_DIR = env("BYEDPI_CHILD_PID_DIR", c.BYEDPI_STATE_DIR + "/child-pid"); c.BYEDPI_LOG_DIR = env("BYEDPI_LOG_DIR", c.BYEDPI_STATE_DIR + "/log"); diff --git a/tachyon/files/usr/lib/core/uci.uc b/tachyon/files/usr/lib/core/uci.uc index b46804e2..4996ed28 100644 --- a/tachyon/files/usr/lib/core/uci.uc +++ b/tachyon/files/usr/lib/core/uci.uc @@ -5,8 +5,8 @@ let common = require("core.common"); let as_string = common.as_string; -const UCI_STATE_FILE = getenv("FORKOP_UCI_STATE_FILE") || getenv("UCI_STATE") || ""; -const UCI_LOG_FILE = getenv("FORKOP_UCI_LOG_FILE") || getenv("UCI_LOG") || ""; +const UCI_STATE_FILE = getenv("TACHYON_UCI_STATE_FILE") || getenv("UCI_STATE") || ""; +const UCI_LOG_FILE = getenv("TACHYON_UCI_LOG_FILE") || getenv("UCI_LOG") || ""; let runtime_cursor = false; let loaded_packages = {}; diff --git a/tachyon/files/usr/lib/diagnostics/runtime.uc b/tachyon/files/usr/lib/diagnostics/runtime.uc index 2c077d60..08770eae 100644 --- a/tachyon/files/usr/lib/diagnostics/runtime.uc +++ b/tachyon/files/usr/lib/diagnostics/runtime.uc @@ -6,43 +6,43 @@ let core_ip = require("core.ip"); let uci_core = require("core.uci"); let runtime_dns = require("singbox.dns"); -const CONFIG_NAME = getenv("FORKOP_CONFIG_NAME") || constants.FORKOP_CONFIG_NAME || "forkop"; -const LIB_DIR = getenv("FORKOP_LIB") || "/usr/lib/forkop"; -const FORKOP_VERSION = getenv("FORKOP_VERSION") || constants.FORKOP_VERSION || ""; -const FORKOP_CONFIG = getenv("FORKOP_CONFIG") || constants.FORKOP_CONFIG || "/etc/config/" + CONFIG_NAME; -const FORKOP_SERVICE_NAME = getenv("FORKOP_SERVICE_NAME") || constants.FORKOP_SERVICE_NAME || "forkop"; -const FORKOP_RELEASE_REPO = getenv("FORKOP_RELEASE_REPO") || constants.FORKOP_RELEASE_REPO || "Dushnilin/tachyon"; -const FORKOP_LUCI_VIEW_DIR = getenv("FORKOP_LUCI_VIEW_DIR") || constants.FORKOP_LUCI_VIEW_DIR || "/www/luci-static/resources/view/forkop"; -const RUNTIME_STATE_DIR = getenv("FORKOP_RUNTIME_STATE_DIR") || "/var/run/forkop"; -const SYSTEM_INFO_CACHE_FILE = getenv("FORKOP_SYSTEM_INFO_CACHE_FILE") || RUNTIME_STATE_DIR + "/system-info.json"; -const SYSTEM_INFO_CACHE_TTL = int(getenv("FORKOP_SYSTEM_INFO_CACHE_TTL") || "3600"); +const CONFIG_NAME = getenv("TACHYON_CONFIG_NAME") || constants.TACHYON_CONFIG_NAME || "tachyon"; +const LIB_DIR = getenv("TACHYON_LIB") || "/usr/lib/tachyon"; +const TACHYON_VERSION = getenv("TACHYON_VERSION") || constants.TACHYON_VERSION || ""; +const TACHYON_CONFIG = getenv("TACHYON_CONFIG") || constants.TACHYON_CONFIG || "/etc/config/" + CONFIG_NAME; +const TACHYON_SERVICE_NAME = getenv("TACHYON_SERVICE_NAME") || constants.TACHYON_SERVICE_NAME || "tachyon"; +const TACHYON_RELEASE_REPO = getenv("TACHYON_RELEASE_REPO") || constants.TACHYON_RELEASE_REPO || "Dushnilin/tachyon"; +const TACHYON_LUCI_VIEW_DIR = getenv("TACHYON_LUCI_VIEW_DIR") || constants.TACHYON_LUCI_VIEW_DIR || "/www/luci-static/resources/view/tachyon"; +const RUNTIME_STATE_DIR = getenv("TACHYON_RUNTIME_STATE_DIR") || "/var/run/tachyon"; +const SYSTEM_INFO_CACHE_FILE = getenv("TACHYON_SYSTEM_INFO_CACHE_FILE") || RUNTIME_STATE_DIR + "/system-info.json"; +const SYSTEM_INFO_CACHE_TTL = int(getenv("TACHYON_SYSTEM_INFO_CACHE_TTL") || "3600"); const TMP_SING_BOX_FOLDER = getenv("TMP_SING_BOX_FOLDER") || constants.TMP_SING_BOX_FOLDER || "/tmp/sing-box"; const TMP_RULESET_FOLDER = getenv("TMP_RULESET_FOLDER") || constants.TMP_RULESET_FOLDER || TMP_SING_BOX_FOLDER + "/rulesets"; const TMP_SUBSCRIPTION_FOLDER = getenv("TMP_SUBSCRIPTION_FOLDER") || constants.TMP_SUBSCRIPTION_FOLDER || TMP_SING_BOX_FOLDER + "/subscriptions"; -const SUBSCRIPTION_LINKS_DIR = getenv("FORKOP_SUBSCRIPTION_LINKS_DIR") || RUNTIME_STATE_DIR + "/subscription-links"; -const SUBSCRIPTION_METADATA_DIR = getenv("FORKOP_SUBSCRIPTION_METADATA_DIR") || RUNTIME_STATE_DIR + "/subscription-metadata"; -const OUTBOUND_METADATA_DIR = getenv("FORKOP_OUTBOUND_METADATA_DIR") || RUNTIME_STATE_DIR + "/outbound-metadata"; -const SECTION_CACHE_DIR = getenv("FORKOP_SECTION_CACHE_DIR") || RUNTIME_STATE_DIR + "/section-cache"; +const SUBSCRIPTION_LINKS_DIR = getenv("TACHYON_SUBSCRIPTION_LINKS_DIR") || RUNTIME_STATE_DIR + "/subscription-links"; +const SUBSCRIPTION_METADATA_DIR = getenv("TACHYON_SUBSCRIPTION_METADATA_DIR") || RUNTIME_STATE_DIR + "/subscription-metadata"; +const OUTBOUND_METADATA_DIR = getenv("TACHYON_OUTBOUND_METADATA_DIR") || RUNTIME_STATE_DIR + "/outbound-metadata"; +const SECTION_CACHE_DIR = getenv("TACHYON_SECTION_CACHE_DIR") || RUNTIME_STATE_DIR + "/section-cache"; const CHECK_PROXY_IP_DOMAIN = getenv("CHECK_PROXY_IP_DOMAIN") || constants.CHECK_PROXY_IP_DOMAIN || "ip.podkop.fyi"; const FAKEIP_TEST_DOMAIN = getenv("FAKEIP_TEST_DOMAIN") || constants.FAKEIP_TEST_DOMAIN || "fakeip.podkop.fyi"; -const RT_TABLE_NAME = getenv("RT_TABLE_NAME") || constants.RT_TABLE_NAME || "forkop"; -const NFT_TABLE_NAME = getenv("NFT_TABLE_NAME") || constants.NFT_TABLE_NAME || "ForkopTable"; +const RT_TABLE_NAME = getenv("RT_TABLE_NAME") || constants.RT_TABLE_NAME || "tachyon"; +const NFT_TABLE_NAME = getenv("NFT_TABLE_NAME") || constants.NFT_TABLE_NAME || "TachyonTable"; const NFT_FAKEIP_MARK = getenv("NFT_FAKEIP_MARK") || constants.NFT_FAKEIP_MARK || "0x00100000"; -const NFT_COMMON_SET_NAME = getenv("NFT_COMMON_SET_NAME") || constants.NFT_COMMON_SET_NAME || "forkop_subnets"; -const NFT_PORT_SET_NAME = getenv("NFT_PORT_SET_NAME") || constants.NFT_PORT_SET_NAME || "forkop_ports"; -const NFT_IP_PORT_SET_NAME = getenv("NFT_IP_PORT_SET_NAME") || constants.NFT_IP_PORT_SET_NAME || "forkop_ip_ports"; -const NFT_INTERFACE_SET_NAME = getenv("NFT_INTERFACE_SET_NAME") || constants.NFT_INTERFACE_SET_NAME || "forkop_interfaces"; -const NFT_DISCORD_SET_NAME = getenv("NFT_DISCORD_SET_NAME") || constants.NFT_DISCORD_SET_NAME || "forkop_discord_subnets"; +const NFT_COMMON_SET_NAME = getenv("NFT_COMMON_SET_NAME") || constants.NFT_COMMON_SET_NAME || "tachyon_subnets"; +const NFT_PORT_SET_NAME = getenv("NFT_PORT_SET_NAME") || constants.NFT_PORT_SET_NAME || "tachyon_ports"; +const NFT_IP_PORT_SET_NAME = getenv("NFT_IP_PORT_SET_NAME") || constants.NFT_IP_PORT_SET_NAME || "tachyon_ip_ports"; +const NFT_INTERFACE_SET_NAME = getenv("NFT_INTERFACE_SET_NAME") || constants.NFT_INTERFACE_SET_NAME || "tachyon_interfaces"; +const NFT_DISCORD_SET_NAME = getenv("NFT_DISCORD_SET_NAME") || constants.NFT_DISCORD_SET_NAME || "tachyon_discord_subnets"; const NFT_LOCALV4_SET_NAME = getenv("NFT_LOCALV4_SET_NAME") || constants.NFT_LOCALV4_SET_NAME || "localv4"; const SB_DNS_INBOUND_ADDRESS = getenv("SB_DNS_INBOUND_ADDRESS") || constants.SB_DNS_INBOUND_ADDRESS || "127.0.0.42"; const SB_TPROXY_INBOUND6_ADDRESS = getenv("SB_TPROXY_INBOUND6_ADDRESS") || constants.SB_TPROXY_INBOUND6_ADDRESS || "::1"; const SB_TPROXY_INBOUND_PORT = getenv("SB_TPROXY_INBOUND_PORT") || constants.SB_TPROXY_INBOUND_PORT || "1602"; const SB_CLASH_API_CONTROLLER_PORT = getenv("SB_CLASH_API_CONTROLLER_PORT") || constants.SB_CLASH_API_CONTROLLER_PORT || "9090"; -const SB_VARIANT_STATE_FILE = getenv("SB_VARIANT_STATE_FILE") || constants.SB_VARIANT_STATE_FILE || "/etc/forkop/sing-box-variant"; +const SB_VARIANT_STATE_FILE = getenv("SB_VARIANT_STATE_FILE") || constants.SB_VARIANT_STATE_FILE || "/etc/tachyon/sing-box-variant"; const CLOUDFLARE_OCTETS = getenv("CLOUDFLARE_OCTETS") || constants.CLOUDFLARE_OCTETS || "8.47 162.159 188.114"; const ZAPRET_LEGACY_DEFAULT_NFQWS_OPT = getenv("ZAPRET_LEGACY_DEFAULT_NFQWS_OPT") || constants.ZAPRET_LEGACY_DEFAULT_NFQWS_OPT || ""; const DEFAULT_LATENCY_TEST_URL = getenv("DEFAULT_LATENCY_TEST_URL") || "https://www.gstatic.com/generate_204"; -const RUNTIME_STABLE_MIN_AGE = getenv("FORKOP_RUNTIME_STABLE_MIN_AGE") || "2"; +const RUNTIME_STABLE_MIN_AGE = getenv("TACHYON_RUNTIME_STABLE_MIN_AGE") || "2"; const STATUS_UC = LIB_DIR + "/diagnostics/status.uc"; const HELPERS_UC = LIB_DIR + "/core/helpers.uc"; @@ -366,7 +366,7 @@ function nolog(message) { function log_message(message, level) { level = as_string(level || "info"); - command_success_from_args([ "logger", "-t", "forkop", "[" + level + "] " + as_string(message) ]); + command_success_from_args([ "logger", "-t", "tachyon", "[" + level + "] " + as_string(message) ]); } function valid_ipv4(value) { @@ -845,7 +845,7 @@ function check_logs() { nolog("Error: logread command not found"); return 1; } - let rendered = status_capture([ "forkop-logs" ], command_output_from_args([ "logread" ])); + let rendered = status_capture([ "tachyon-logs" ], command_output_from_args([ "logread" ])); if (rendered.output != "") print(rendered.output); if (rendered.status != 0) { @@ -870,8 +870,8 @@ function check_sing_box_logs() { return 0; } -function forkop_logs_fixture() { - let rendered = status_capture([ "forkop-logs" ], read_stdin()); +function tachyon_logs_fixture() { + let rendered = status_capture([ "tachyon-logs" ], read_stdin()); if (rendered.output != "") print(rendered.output); return rendered.status; @@ -894,19 +894,19 @@ function show_sing_box_config(visibility) { function show_config(visibility) { visibility = as_string(visibility || "masked"); - if (!file_exists(FORKOP_CONFIG)) { + if (!file_exists(TACHYON_CONFIG)) { nolog("Configuration file not found"); return 1; } if (visibility == "raw") - print(as_string(fs.readfile(FORKOP_CONFIG))); + print(as_string(fs.readfile(TACHYON_CONFIG))); else - print(status_output([ "forkop-config-masked", FORKOP_CONFIG ], null)); + print(status_output([ "tachyon-config-masked", TACHYON_CONFIG ], null)); return 0; } function show_version() { - print(FORKOP_VERSION, "\n"); + print(TACHYON_VERSION, "\n"); return 0; } @@ -916,14 +916,14 @@ function show_sing_box_version() { } function get_luci_app_version() { - let path = FORKOP_LUCI_VIEW_DIR + "/main.js"; + let path = TACHYON_LUCI_VIEW_DIR + "/main.js"; let data = fs.readfile(path); if (data == null) return "not installed"; for (let line in split(as_string(data), "\n")) { let matched = match(line, /^[ \t]*var[ \t]+([^ \t=]+)[ \t]*=[ \t]*"([^"]*)"/); - if (matched != null && matched[1] == "FORKOP_LUCI_APP_VERSION") + if (matched != null && matched[1] == "TACHYON_LUCI_APP_VERSION") return as_string(matched[2]); } return ""; @@ -937,7 +937,7 @@ function system_info_cache_is_valid() { let generated_at = arg_number(cache.generated_at || 0); if (now > 0 && generated_at > 0 && SYSTEM_INFO_CACHE_TTL > 0 && now - generated_at >= SYSTEM_INFO_CACHE_TTL) return false; - return cache.forkop_version == FORKOP_VERSION && cache.luci_app_version == get_luci_app_version(); + return cache.tachyon_version == TACHYON_VERSION && cache.luci_app_version == get_luci_app_version(); } function ensure_subscription_runtime_dirs() { @@ -1029,7 +1029,7 @@ function openwrt_release() { } function build_system_info() { - let forkop_latest_version = first_line_value("/tmp/forkop.latest-version.cache", "unknown"); + let tachyon_latest_version = first_line_value("/tmp/tachyon.latest-version.cache", "unknown"); let luci_app_version = get_luci_app_version(); let sing_box_version = ""; let sing_box_version_output = ""; @@ -1063,8 +1063,8 @@ function build_system_info() { let device_model = first_line_value("/tmp/sysinfo/model", "unknown"); return { - forkop_version: FORKOP_VERSION, - forkop_latest_version: forkop_latest_version || "unknown", + tachyon_version: TACHYON_VERSION, + tachyon_latest_version: tachyon_latest_version || "unknown", luci_app_version, sing_box_version, sing_box_extended: flags.extended, @@ -1114,7 +1114,7 @@ function get_server_capabilities() { } function neutralize_zapret_defaults() { - log_message("Standalone zapret is not neutralized automatically; Forkop uses /opt/zapret/nfq/nfqws as an external provider and manages only its own NFQUEUE range.", "info"); + log_message("Standalone zapret is not neutralized automatically; Tachyon uses /opt/zapret/nfq/nfqws as an external provider and manages only its own NFQUEUE range.", "info"); return 0; } @@ -1138,8 +1138,8 @@ function write_service_status(running, enabled, dns_configured) { }); } -function dnsmasq_has_forkop_dns() { - return module_success(DNS_APPLY_UC, [ "has-forkop-dns" ]); +function dnsmasq_has_tachyon_dns() { + return module_success(DNS_APPLY_UC, [ "has-tachyon-dns" ]); } function get_sing_box_status() { @@ -1148,17 +1148,17 @@ function get_sing_box_status() { RUNTIME_STABLE_MIN_AGE ]) ? 1 : 0; let enabled = file_executable("/etc/rc.d/S99sing-box") ? 1 : 0; - let dns_configured = dnsmasq_has_forkop_dns() ? 1 : 0; + let dns_configured = dnsmasq_has_tachyon_dns() ? 1 : 0; write_service_status(running, enabled, dns_configured); return 0; } function get_status() { let running = module_success(SERVICE_STATE_UC, [ - "forkop-stably-running", RT_TABLE_NAME, NFT_TABLE_NAME, NFT_FAKEIP_MARK, RUNTIME_STABLE_MIN_AGE + "tachyon-stably-running", RT_TABLE_NAME, NFT_TABLE_NAME, NFT_FAKEIP_MARK, RUNTIME_STABLE_MIN_AGE ]) ? 1 : 0; - let enabled = file_executable("/etc/rc.d/S99" + FORKOP_SERVICE_NAME) ? 1 : 0; - let dns_configured = dnsmasq_has_forkop_dns() ? 1 : 0; + let enabled = file_executable("/etc/rc.d/S99" + TACHYON_SERVICE_NAME) ? 1 : 0; + let dns_configured = dnsmasq_has_tachyon_dns() ? 1 : 0; write_service_status(running, enabled, dns_configured); return 0; } @@ -1903,7 +1903,7 @@ function global_check(arg1, arg2) { print_global("❌ Failed to get NFT rules info"); print_global("━━━━━━━━━━━━━━━━━━━━━━━━━━━"); - print_global("📄 Forkop config"); + print_global("📄 Tachyon config"); show_config(visibility); print_global("━━━━━━━━━━━━━━━━━━━━━━━━━━━"); @@ -1945,33 +1945,675 @@ function global_check(arg1, arg2) { if (file_executable("/etc/init.d/zapret") && command_success_from_args([ "/etc/init.d/zapret", "status" ])) { print_global("━━━━━━━━━━━━━━━━━━━━━━━━━━━"); - print_global("⚠️ Standalone zapret service is active. Forkop uses separate queues, but packet-level policy overlap is possible."); + print_global("⚠️ Standalone zapret service is active. Tachyon uses separate queues, but packet-level policy overlap is possible."); } else if (file_executable("/etc/init.d/zapret") && command_success_from_args([ "/etc/init.d/zapret", "enabled" ])) { print_global("━━━━━━━━━━━━━━━━━━━━━━━━━━━"); - print_global("⚠️ Standalone zapret autostart is enabled. Forkop will not modify /etc/config/zapret."); + print_global("⚠️ Standalone zapret autostart is enabled. Tachyon will not modify /etc/config/zapret."); } if (file_executable("/etc/init.d/zapret2") && command_success_from_args([ "/etc/init.d/zapret2", "status" ])) { print_global("━━━━━━━━━━━━━━━━━━━━━━━━━━━"); - print_global("⚠️ Standalone zapret2 service is active. Forkop uses separate queues, but packet-level policy overlap is possible."); + print_global("⚠️ Standalone zapret2 service is active. Tachyon uses separate queues, but packet-level policy overlap is possible."); } else if (file_executable("/etc/init.d/zapret2") && command_success_from_args([ "/etc/init.d/zapret2", "enabled" ])) { print_global("━━━━━━━━━━━━━━━━━━━━━━━━━━━"); - print_global("⚠️ Standalone zapret2 autostart is enabled. Forkop will not modify /etc/config/zapret2."); + print_global("⚠️ Standalone zapret2 autostart is enabled. Tachyon will not modify /etc/config/zapret2."); } print_global("━━━━━━━━━━━━━━━━━━━━━━━━━━━"); print_global("🥸 FakeIP status"); let fakeip_check_json = command_capture(command_from_args(module_args(LIB_DIR + "/diagnostics/runtime.uc", [ "check-fakeip" ]))).output; - if (fakeip_check_json != "") - render_or_fail([ "global-fakeip-check" ], fakeip_check_json, "❌ Failed to parse FakeIP info", [ 0 ]); else print_global("❌ Failed to get FakeIP info"); return 0; } +function find_process_pid(name) { + let pids = split(trim(command_capture(command_from_args(["pidof", name])).output), /\s+/); + return length(pids) > 0 && pids[0] != "" ? pids[0] : ""; +} + +function is_degraded() { + return fs.stat("/tmp/tachyon/degraded") != null; +} + +function uci_settings() { + return uci_core.get_all(CONFIG_NAME, "settings") || {}; +} + +function kill_our_core_processes() { + command_status("/etc/init.d/sing-box stop >/dev/null 2>&1"); + command_status("killall -9 sing-box >/dev/null 2>&1"); +} + +function run_doctor_checks() { + let report = []; + let issues = 0; + let fixed = 0; + let cfg = uci_settings(); + + let is_degraded_flag = is_degraded(); + + let doc_check = function(icon, name, status, fix_msg) { + let msg = status; + if (fix_msg != "") { + msg = fix_msg; + } + push(report, sprintf("%s %-30s %s", icon, name, msg)); + }; + + let time_str = command_output_from_args(["date", "+%d.%m %H:%M"]); + push(report, sprintf("🩺 *tachyon doctor* — %s", trim(time_str))); + push(report, ""); + + if (cfg.recovery_bypass == "1") { + push(report, "⚠️ *Режим аварийного обхода (Safe Bypass) активен.*"); + push(report, "Все прокси-службы и правила фильтрации временно отключены."); + push(report, ""); + + let wd_running = false; + let wd_pid = trim(fs.readfile("/var/run/tachyon_watchdog.pid") || ""); + if (wd_pid != "" && fs.stat("/proc/" + wd_pid) != null) { + wd_running = true; + } + + let core_disp = cfg.core || "sing-box"; + doc_check("⚫", core_disp, "bypassed (stopped)", ""); + doc_check("⚫", "nftables rules", "bypassed (flushed)", ""); + doc_check("⚫", "routing rules (ip rule)", "bypassed (removed)", ""); + doc_check("⚫", "dnsmasq server", "bypassed (direct WAN)", ""); + + if (dns_check_resolve_host("google.com", "127.0.0.1", 2) != "") { + doc_check("✅", "DNS resolution", "working (direct)", ""); + } else { + doc_check("❌", "DNS resolution", "failed", "→ Проверьте подключение к интернету"); + issues++; + } + + if (wd_running) { + doc_check("✅", "Watchdog", "running (standby)", ""); + } else { + doc_check("⚠️", "Watchdog", "stopped", "→ перезапустите службу"); + issues++; + } + + push(report, ""); + push(report, "ℹ️ Автоматические проверки приостановлены в режиме Safe Bypass."); + return { report: join("\n", report) + "\n", issues, fixed }; + } + + let binary_name = "sing-box"; + let init_script = "/etc/init.d/sing-box"; + let config_file_path = "/etc/sing-box/config.json"; + + // 1. Process Check + let has_sections = false; + let uci_sections = uci_core.get_all(CONFIG_NAME); + if (uci_sections) { + for (let k in keys(uci_sections)) { + if (uci_sections[k][".type"] == "section") { + has_sections = true; + break; + } + } + } + + let pid = find_process_pid(binary_name); + if (pid != "") { + doc_check("✅", binary_name + " process", "running", ""); + } else if (!has_sections) { + doc_check("ℹ️", binary_name + " process", "not started", "→ Настройте подключение в LuCI — ядро запустится автоматически"); + } else { + issues++; + kill_our_core_processes(); + command_status("sleep 1"); + command_status(init_script + " start >/dev/null 2>&1"); + command_status("sleep 3"); + pid = find_process_pid(binary_name); + if (pid != "") { + doc_check("❌", binary_name + " process", "stopped", "→ FIXED: запущен после очистки конфликтующих портов"); + fixed++; + } else { + doc_check("❌", binary_name + " process", "stopped", "→ не удалось запустить — проверьте логи"); + } + } + + // 2. Configuration Check + if (fs.stat(config_file_path) != null) { + let check_res = command_status(binary_name + " check -c " + config_file_path + " >/dev/null 2>&1"); + if (check_res == 0) { + doc_check("✅", binary_name + " config", "valid", ""); + } else { + issues++; + let regen_status = command_status("ucode -L " + LIB_DIR + " " + SINGBOX_RUNTIME_UC + " configure-service >/dev/null 2>&1"); + if (regen_status == 0) { + let check_res2 = command_status(binary_name + " check -c " + config_file_path + " >/dev/null 2>&1"); + if (check_res2 == 0) { + doc_check("❌", binary_name + " config", "invalid", "→ FIXED: пересоздан и успешно валидирован"); + fixed++; + command_status(init_script + " restart >/dev/null 2>&1"); + } else { + doc_check("❌", binary_name + " config", "invalid", "→ не удалось восстановить (ошибка валидации)"); + } + } else { + doc_check("❌", binary_name + " config", "invalid", "→ не удалось перегенерировать конфиг"); + } + } + } else { + if (!has_sections) { + doc_check("ℹ️", binary_name + " config", "not yet created", "→ Настройте Tachyon в LuCI для генерации конфига"); + } else { + issues++; + let regen_status = command_status("ucode -L " + LIB_DIR + " " + SINGBOX_RUNTIME_UC + " configure-service >/dev/null 2>&1"); + if (regen_status == 0 && fs.stat(config_file_path) != null) { + doc_check("❌", "sing-box config", "missing", "→ FIXED: пересоздан"); + fixed++; + } else { + doc_check("❌", binary_name + " config", "missing", "→ не удалось сгенерировать config"); + } + } + } + + // 3. Nftables Table Check + let routing_mode = cfg.routing_mode || "nftables"; + if (routing_mode == "nftables") { + let out_nft = command_capture("nft list table inet " + NFT_TABLE_NAME).output; + if (index(out_nft, "tproxy") >= 0) { + doc_check("✅", "nftables table", "present", ""); + } else { + if (is_degraded_flag) { + doc_check("⚠️", "nftables table", "missing or incomplete", "→ GRACEFUL DEGRADATION: Proxy offline"); + } else { + issues++; + command_status("nft delete table inet " + NFT_TABLE_NAME + " >/dev/null 2>&1"); + let rebuild_status = command_status("/usr/bin/tachyon restart >/dev/null 2>&1"); + let out_nft_check = command_capture("nft list table inet " + NFT_TABLE_NAME).output; + if (index(out_nft_check, "tproxy") >= 0) { + doc_check("❌", "nftables table", "missing or incomplete", "→ FIXED: правила пересозданы"); + fixed++; + } else { + doc_check("❌", "nftables table", "missing or incomplete", "→ не удалось восстановить nftables правила"); + } + } + } + + // 4. IP Rule Check + let ip_rule_out = command_capture("ip rule list").output; + if (index(ip_rule_out, "fwmark") >= 0 && index(ip_rule_out, "lookup " + RT_TABLE_NAME) >= 0) { + doc_check("✅", "ip rule (fwmark)", "present", ""); + } else { + issues++; + let rebuild_status = command_status("/usr/bin/tachyon restart >/dev/null 2>&1"); + let ip_rule_check = command_capture("ip rule list").output; + if (index(ip_rule_check, "fwmark") >= 0 && index(ip_rule_check, "lookup " + RT_TABLE_NAME) >= 0) { + doc_check("❌", "ip rule", "missing", "→ FIXED: маршрут восстановлен"); + fixed++; + } else { + doc_check("❌", "ip rule", "missing", "→ не удалось восстановить ip rule"); + } + } + } else { + let ip_link_out = command_capture("ip link show tun0").output; + if (index(ip_link_out, "tun0") >= 0) { + doc_check("✅", "tun0 interface", "up", ""); + } else { + issues++; + command_status(init_script + " restart >/dev/null 2>&1"); + command_status("sleep 3"); + let ip_link_check = command_capture("ip link show tun0").output; + if (index(ip_link_check, "tun0") >= 0) { + doc_check("❌", "tun0 interface", "missing", "→ FIXED: интерфейс tun0 поднят после перезапуска службы"); + fixed++; + } else { + doc_check("❌", "tun0 interface", "missing", "→ не удалось поднять tun0"); + } + } + } + + // 4e. Dnsmasq Redirection Check + if (module_status(DNS_APPLY_UC, [ "has-tachyon-dns" ]) == 0) { + doc_check("✅", "dnsmasq server (Direct)", SB_DNS_INBOUND_ADDRESS, ""); + } else { + if (is_degraded_flag) { + doc_check("⚠️", "dnsmasq server (Direct)", "direct", "→ GRACEFUL DEGRADATION: Proxy offline"); + } else { + issues++; + module_status(DNS_APPLY_UC, [ "configure", "force" ]); + command_status("sleep 1"); + if (module_status(DNS_APPLY_UC, [ "has-tachyon-dns" ]) == 0) { + doc_check("❌", "dnsmasq server (Direct)", "incorrect", "→ FIXED: направлен на sing-box (" + SB_DNS_INBOUND_ADDRESS + ")"); + fixed++; + } else { + doc_check("❌", "dnsmasq server (Direct)", "incorrect", "→ не удалось перенаправить"); + } + } + } + + // 4b. Dnsmasq Params Check + let noresolv = uci_core.get("dhcp", "@dnsmasq[0]", "noresolv"); + let localuse = uci_core.get("dhcp", "@dnsmasq[0]", "localuse"); + let rebind_protection = uci_core.get("dhcp", "@dnsmasq[0]", "rebind_protection"); + if (noresolv == "1" && localuse == "1" && rebind_protection == "0") { + doc_check("✅", "dnsmasq params", "OK (noresolv=1, localuse=1, rebind_protection=0)", ""); + } else { + issues++; + uci_core.set("dhcp", "@dnsmasq[0]", "noresolv", "1"); + uci_core.set("dhcp", "@dnsmasq[0]", "localuse", "1"); + uci_core.set("dhcp", "@dnsmasq[0]", "rebind_protection", "0"); + uci_core.commit("dhcp"); + command_status("/etc/init.d/dnsmasq restart >/dev/null 2>&1"); + command_status("sleep 1"); + let noresolv2 = uci_core.get("dhcp", "@dnsmasq[0]", "noresolv"); + let localuse2 = uci_core.get("dhcp", "@dnsmasq[0]", "localuse"); + let rebind_protection2 = uci_core.get("dhcp", "@dnsmasq[0]", "rebind_protection"); + if (noresolv2 == "1" && localuse2 == "1" && rebind_protection2 == "0") { + doc_check("❌", "dnsmasq params", "incorrect", "→ FIXED: noresolv=1, localuse=1, rebind_protection=0"); + fixed++; + } else { + doc_check("❌", "dnsmasq params", "incorrect", "→ не удалось исправить параметры"); + } + } + + // 4c. Resolv.conf symlink + let resolv_link = ""; + try { resolv_link = fs.readlink("/etc/resolv.conf") || ""; } catch(e) {} + if (resolv_link == "/tmp/resolv.conf" || resolv_link == "../tmp/resolv.conf") { + doc_check("✅", "resolv.conf symlink", "OK (-> " + resolv_link + ")", ""); + } else { + issues++; + fs.unlink("/etc/resolv.conf"); + let sym_ok = false; + try { + fs.symlink("/tmp/resolv.conf", "/etc/resolv.conf"); + sym_ok = true; + } catch(e) {} + if (sym_ok) { + doc_check("❌", "resolv.conf symlink", "broken", "→ FIXED: восстановлена ссылка на /tmp/resolv.conf"); + fixed++; + } else { + doc_check("❌", "resolv.conf symlink", "broken", "→ не удалось восстановить ссылку"); + } + } + + // 5. DNS configuration servers + let bootstrap_dns = "77.88.8.8"; + let main_dns = "1.1.1.1"; + let main_dns_type = "udp"; + if (cfg.bootstrap_dns_server) { + let b_dns_list = type(cfg.bootstrap_dns_server) == "array" ? cfg.bootstrap_dns_server : split(trim(as_string(cfg.bootstrap_dns_server)), /\s+/); + if (length(b_dns_list) > 0) bootstrap_dns = b_dns_list[0]; + } + if (cfg.dns_server) { + let m_dns_list = type(cfg.dns_server) == "array" ? cfg.dns_server : split(trim(as_string(cfg.dns_server)), /\s+/); + if (length(m_dns_list) > 0) main_dns = m_dns_list[0]; + } + main_dns_type = cfg.dns_type || "udp"; + + // Strip proxy_group suffix + let display_main = split(main_dns, "#")[0]; + let display_bootstrap = split(bootstrap_dns, "#")[0]; + + // Check Bootstrap DNS + let bootstrap_dns_reachable = false; + if (dns_check_resolve_host("openwrt.org", bootstrap_dns, 2) != "") { + bootstrap_dns_reachable = true; + doc_check("✅", "DNS bootstrap (" + display_bootstrap + ")", "reachable", ""); + } else { + issues++; + let ping_ok = (command_status("ping -c 1 -W 2 1.1.1.1 >/dev/null 2>&1") == 0); + if (ping_ok) { + fs.unlink("/etc/resolv.conf"); + try { fs.symlink("/tmp/resolv.conf", "/etc/resolv.conf"); } catch(e) {} + fs.writefile("/tmp/resolv.conf", "nameserver 1.1.1.1\nnameserver 8.8.8.8\n"); + command_status("/etc/init.d/dnsmasq restart >/dev/null 2>&1"); + command_status("sleep 2"); + if (dns_check_resolve_host("openwrt.org", bootstrap_dns, 2) != "") { + bootstrap_dns_reachable = true; + doc_check("❌", "DNS bootstrap (" + display_bootstrap + ")", "unreachable", "→ FIXED: сброшен resolv.conf на 1.1.1.1, DNS перезапущен"); + fixed++; + } else { + doc_check("❌", "DNS bootstrap (" + display_bootstrap + ")", "unreachable", "→ DNS заблокирован или недоступен"); + } + } else { + command_status("/sbin/ifup wan >/dev/null 2>&1"); + command_status("sleep 3"); + doc_check("❌", "DNS bootstrap (" + display_bootstrap + ")", "unreachable", "→ FIXED: линк отсутствует, отправлен сигнал перезапуска WAN"); + fixed++; + } + } + + // Check Main DNS + let dns_main_reachable = false; + if (main_dns_type == "doh") { + let curl_cmd = "curl -sS --max-time 4 -o /dev/null -w %{http_code} https://" + display_main + "/dns-query"; + let curl_res = command_capture(curl_cmd); + if (curl_res.status == 0 && int(curl_res.output) < 400) { + dns_main_reachable = true; + doc_check("✅", "DNS main (" + display_main + ")", "reachable", ""); + } else { + let curl_cmd2 = "curl -sS --max-time 4 -o /dev/null -w %{http_code} https://" + display_main; + let curl_res2 = command_capture(curl_cmd2); + if (curl_res2.status == 0 && int(curl_res2.output) < 400) { + dns_main_reachable = true; + doc_check("✅", "DNS main (" + display_main + ")", "reachable", ""); + } else { + doc_check("⚠️", "DNS main (" + display_main + ")", "ISP blocks direct DoH", "→ Норма: провайдер блокирует DoH напрямую, sing-box использует DoH через прокси"); + } + } + } else { + if (dns_check_resolve_host("openwrt.org", main_dns, 2) != "") { + dns_main_reachable = true; + doc_check("✅", "DNS main (" + display_main + ")", "reachable", ""); + } else { + issues++; + if (bootstrap_dns_reachable) { + command_status("/etc/init.d/dnsmasq restart >/dev/null 2>&1"); + command_status("sleep 1"); + if (dns_check_resolve_host("openwrt.org", main_dns, 2) != "") { + dns_main_reachable = true; + doc_check("❌", "DNS main (" + display_main + ")", "unreachable", "→ FIXED: перезапущен dnsmasq"); + fixed++; + } + } + if (!dns_main_reachable) { + doc_check("❌", "DNS main (" + display_main + ")", "unreachable", "→ Основной DNS недоступен"); + } + } + } + + // 6. Clash API Check + let clash_addr = "127.0.0.1:9090"; + let curl_clash = command_capture("curl -s -o /dev/null -w %{http_code} http://" + clash_addr + "/version"); + if (curl_clash.status == 0 && int(curl_clash.output) == 200) { + doc_check("✅", "Clash API", "reachable (" + clash_addr + ")", ""); + } else { + issues++; + doc_check("⚠️", "Clash API", "unreachable", "→ sing-box запущен?"); + } + + // 7. Free RAM Check + let free_mb = -1; + let mem_info = fs.readfile("/proc/meminfo") || ""; + for (let line in split(mem_info, "\n")) { + if (index(line, "MemAvailable:") == 0) { + let fields = split(trim(line), /[ \t]+/); + if (length(fields) >= 2) { + free_mb = int(fields[1]) / 1024; + } + break; + } + } + if (free_mb > 20) { + doc_check("✅", "Free RAM", sprintf("%dMB", free_mb), ""); + } else if (free_mb >= 0) { + issues++; + doc_check("⚠️", "Free RAM", sprintf("%dMB", free_mb), "→ Мало памяти!"); + } else { + doc_check("✅", "Free RAM", "unknown", ""); + } + + // 8. Temp Directory Space Check + let tmp_free_mb = -1; + let df_out = command_capture("df /tmp").output; + let df_lines = split(df_out, "\n"); + if (length(df_lines) >= 2) { + let fields = split(trim(df_lines[1]), /[ \t]+/); + if (length(fields) >= 4) { + tmp_free_mb = int(fields[3]) / 1024; + } + } + if (tmp_free_mb > 5) { + doc_check("✅", "Free /tmp", sprintf("%dMB", tmp_free_mb), ""); + } else if (tmp_free_mb >= 0) { + issues++; + doc_check("⚠️", "Free /tmp", sprintf("%dMB", tmp_free_mb), "→ Мало места в /tmp"); + } else { + doc_check("✅", "Free /tmp", "unknown", ""); + } + + // 9. Watchdog Process Check + let watchdog_running = false; + let watchdog_pid = trim(fs.readfile("/var/run/tachyon_watchdog.pid") || ""); + if (watchdog_pid != "" && fs.stat("/proc/" + watchdog_pid) != null) { + watchdog_running = true; + } + if (watchdog_running) { + doc_check("✅", "Watchdog", "running", ""); + } else { + let enable_watchdog = cfg.enable_watchdog != "0"; + if (enable_watchdog) { + issues++; + let restart_status = command_status("/etc/init.d/tachyon restart >/dev/null 2>&1"); + if (restart_status == 0) { + doc_check("❌", "Watchdog", "dead", "→ FIXED: система перезапущена"); + fixed++; + } else { + doc_check("❌", "Watchdog", "dead", "→ не удалось перезапустить систему"); + } + } else { + doc_check("⚫", "Watchdog", "disabled (ok)", ""); + } + } + + // 11. MSS Clamping Check + if (routing_mode == "nftables") { + let out_clamping = command_capture("nft list table inet " + NFT_TABLE_NAME).output; + if (index(out_clamping, "tcp flags syn tcp option maxseg size set rtmtu") >= 0) { + doc_check("✅", "MSS Clamping rule", "active", ""); + } else { + if (is_degraded_flag) { + doc_check("⚠️", "MSS Clamping rule", "missing or inactive", "→ GRACEFUL DEGRADATION: Proxy offline"); + } else { + issues++; + command_status("nft add chain inet " + NFT_TABLE_NAME + " mangle_forward '{ type filter hook forward priority -150; }' >/dev/null 2>&1"); + command_status("nft add rule inet " + NFT_TABLE_NAME + " mangle_forward tcp flags syn tcp option maxseg size set rtmtu >/dev/null 2>&1"); + command_status("nft add rule inet " + NFT_TABLE_NAME + " mangle_output tcp flags syn tcp option maxseg size set rtmtu >/dev/null 2>&1"); + + let out_clamping_check = command_capture("nft list table inet " + NFT_TABLE_NAME).output; + if (index(out_clamping_check, "tcp flags syn tcp option maxseg size set rtmtu") >= 0) { + doc_check("❌", "MSS Clamping rule", "missing", "→ FIXED: MSS Clamping rules applied"); + fixed++; + } else { + doc_check("❌", "MSS Clamping rule", "missing", "→ не удалось применить MSS Clamping"); + } + } + } + } + + // 12. OOM audit Check + let logread_out = command_capture("logread -l 200").output; + let logread_lower = lc(logread_out); + if (index(logread_lower, "out of memory") >= 0 || index(logread_lower, "oom-killer") >= 0) { + issues++; + let scale = 1.0; + let scale_path = "/etc/tachyon/mem_scale"; + let scale_data = fs.readfile(scale_path); + if (scale_data != null) { + let parsed_scale = double(trim(as_string(scale_data))); + if (parsed_scale > 0.1) { + scale = parsed_scale; + } + } + let new_scale = scale * 0.8; + if (new_scale < 0.2) new_scale = 0.2; + fs.mkdir("/etc/tachyon"); + fs.writefile(scale_path, sprintf("%.2f", new_scale)); + command_status("logread -c >/dev/null 2>&1"); + + doc_check("❌", "System OOM checks", sprintf("OOM detected (current scale: %.2f)", scale), sprintf("→ FIXED: Scaled GOMEMLIMIT to %.2f and cleared logs", new_scale)); + fixed++; + } else { + doc_check("✅", "System OOM checks", "No OOM events detected in logs", ""); + } + + // 13. Port conflicts + let netstat_out = command_capture("netstat -ltnp").output; + let ports_to_check = ["4534", "9090"]; + for (let port in ports_to_check) { + if (index(netstat_out, ":" + port + " ") >= 0) { + let sb_pid = find_process_pid("sing-box"); + if (sb_pid == "") { + let killed = false; + for (let line in split(netstat_out, "\n")) { + if (index(line, ":" + port + " ") >= 0) { + let fields = split(trim(line), /[ \t]+/); + if (length(fields) >= 7) { + let pid_info = fields[6]; + let slash_idx = index(pid_info, "/"); + if (slash_idx >= 0) { + let conflict_pid = substr(pid_info, 0, slash_idx); + if (command_status("kill -9 " + conflict_pid + " >/dev/null 2>&1") == 0) { + killed = true; + } + } + } + } + } + if (killed) { + issues++; + doc_check("❌", "Port conflict :" + port, "port bound by orphan", "→ FIXED: конфликтный процесс завершен"); + fixed++; + } else { + issues++; + doc_check("❌", "Port conflict :" + port, "port bound by unknown process", "→ завершите процесс вручную"); + } + } else { + doc_check("✅", "Port check :" + port, "bound by sing-box", ""); + } + } else { + doc_check("✅", "Port check :" + port, "free", ""); + } + } + + push(report, ""); + if (issues == 0) { + push(report, "✅ Всё в порядке — проблем не обнаружено"); + } else { + push(report, sprintf("⚠️ Проблем: %d Исправлено: %d", issues, fixed)); + } + + return { report: join("\n", report) + "\n", issues, fixed }; +} + +function query_llm(provider, api_key, custom_url, prompt_text) { + let api_url = "https://api.openai.com/v1/chat/completions"; + let model = "gpt-4o-mini"; + + provider = lc(trim(as_string(provider))); + if (provider == "deepseek") { + api_url = "https://api.deepseek.com/chat/completions"; + model = "deepseek-chat"; + } else if (provider == "custom" && custom_url != "") { + api_url = custom_url; + model = "gpt-4o-mini"; + } else { + api_url = "https://api.openai.com/v1/chat/completions"; + model = "gpt-4o-mini"; + } + + let payload = { + model: model, + messages: [ + { + role: "user", + content: prompt_text + } + ], + temperature: 0.3 + }; + + let payload_path = "/tmp/llm_payload.json"; + common.write_json_file(payload_path, payload); + + let curl_args = [ + "curl", "-s", "-X", "POST", + "-H", "Content-Type: application/json", + "-H", "Authorization: Bearer " + api_key, + "-d", "@" + payload_path, + api_url + ]; + + let result = command_capture(command_from_args(curl_args)); + remove_file(payload_path); + + if (result.status != 0 || result.output == "") { + return null; + } + + let response_data = parse_json_or_null(result.output); + if (response_data && type(response_data.choices) == "array" && length(response_data.choices) > 0) { + return response_data.choices[0].message.content; + } + + return null; +} + +function doctor(format) { + let res = run_doctor_checks(); + if (format == "json") { + print(sprintf("%J\n", { + success: true, + issues: res.issues, + fixed: res.fixed, + report: res.report + })); + } else { + print(res.report); + } + return 0; +} + +function ai_doctor() { + let cfg = uci_settings(); + if (cfg.enable_ai_doctor != "1" || !cfg.ai_doctor_api_key) { + print(sprintf("%J\n", { + success: false, + error: "AI Doctor is disabled or API Key is missing. Configure it in Settings." + })); + return 0; + } + + let res = run_doctor_checks(); + let report = res.report; + + let sys_context = sprintf("Tachyon Doctor Report:\n%s\n", report); + let prompt = sprintf("Вы — ИИ-ассистент \"Tachyon AI Doctor\" для сервиса обхода блокировок на OpenWrt.\nПроанализируйте диагностический отчет и логи роутера ниже.\n\n%s\n\nСформулируйте краткий, понятный пользователю диагноз проблемы (на русском языке, максимум 3 лаконичных пункта/совета).\nЕсли обнаружена известная проблема, которую можно исправить в один клик, обязательно укажите в самом конце ответа специальный тег:\nFIX: <код_исправления>\n\nДоступные коды исправления (выберите не более одного, если применимо):\n- start_singbox (если sing-box остановлен/упал)\n- rebuild_rules (если правила nftables нарушены)\n- fix_dnsmasq (если проблемы в конфигурации dnsmasq)\n- fix_resolv_symlink (если повреждена ссылка resolv.conf)\n- start_watchdog (если служба watchdog остановлена)\n\nЕсли авто-исправление не применимо, не пишите тег FIX.", sys_context); + + let provider = cfg.ai_doctor_provider || "openai"; + let api_key = cfg.ai_doctor_api_key || ""; + let custom_url = cfg.ai_doctor_custom_url || ""; + + let ai_res = query_llm(provider, api_key, custom_url, prompt); + if (!ai_res) { + print(sprintf("%J\n", { + success: false, + error: "AI Doctor query failed: request returned empty or failed" + })); + return 0; + } + + let quick_fix = ""; + let text = ai_res; + let fix_idx = index(text, "FIX:"); + if (fix_idx >= 0) { + let fix_part = trim(substr(text, fix_idx + 4)); + let fields = split(fix_part, /[ \t\r\n]+/); + if (length(fields) > 0) { + quick_fix = replace(fields[0], /[._`*]/g, ""); + } + text = trim(substr(text, 0, fix_idx)); + } + + print(sprintf("%J\n", { + success: true, + report: text, + quick_fix: quick_fix + })); + return 0; +} + let mode = ARGV[0] || ""; if (mode == "check-proxy") @@ -1992,8 +2634,8 @@ else if (mode == "check-logs") exit(check_logs()); else if (mode == "check-sing-box-logs") exit(check_sing_box_logs()); -else if (mode == "forkop-logs-fixture") - exit(forkop_logs_fixture()); +else if (mode == "tachyon-logs-fixture") + exit(tachyon_logs_fixture()); else if (mode == "check-fakeip") exit(check_fakeip()); else if (mode == "check-zapret-runtime") @@ -2040,6 +2682,10 @@ else if (mode == "check-dns-available") exit(check_dns_available()); else if (mode == "global-check") exit(global_check(ARGV[1] || "", ARGV[2] || "")); +else if (mode == "doctor") + exit(doctor(ARGV[1])); +else if (mode == "ai-doctor") + exit(ai_doctor()); else if (mode == "validate-nfqws-strategy-json") exit(validate_nfqws_strategy_json(ARGV[1] || "")); else if (mode == "validate-nfqws2-strategy-json") diff --git a/tachyon/files/usr/lib/diagnostics/status.uc b/tachyon/files/usr/lib/diagnostics/status.uc index b9483167..fb7fd047 100644 --- a/tachyon/files/usr/lib/diagnostics/status.uc +++ b/tachyon/files/usr/lib/diagnostics/status.uc @@ -344,7 +344,7 @@ function mask_option_path(line, token) { return substr(line, 0, slash) + "/MASKED'" + substr(line, quote + 1); } -function forkop_config_masked_line(line) { +function tachyon_config_masked_line(line) { line = mask_after_token(line, "option proxy_string"); line = mask_after_token(line, "option subscription_url"); line = mask_after_token(line, "list subscription_urls"); @@ -395,7 +395,7 @@ function forkop_config_masked_line(line) { return line; } -function forkop_config_masked(path) { +function tachyon_config_masked(path) { let data = fs.readfile(path); if (data == null) exit(1); @@ -419,7 +419,7 @@ function forkop_config_masked(path) { delete_token_space(line, "option tailscale_exit_node_allow_lan_access")) continue; - let masked = forkop_config_masked_line(line); + let masked = tachyon_config_masked_line(line); print(masked, "\n"); if (index(line, "option outbound_json") >= 0) { let first_quote = index(line, "'"); @@ -1377,7 +1377,7 @@ function render_global_sing_box_check() { function render_global_system_info() { let value = object_or_empty(read_stdin_json()); - let forkop_version = object_value(value, "forkop_version") || "unknown"; + let tachyon_version = object_value(value, "tachyon_version") || "unknown"; let luci_app_version = object_value(value, "luci_app_version") || "unknown"; let sing_box_version = object_value(value, "sing_box_version") || "unknown"; let zapret_version = object_value(value, "zapret_version") || "unknown"; @@ -1389,7 +1389,7 @@ function render_global_system_info() { let sing_box_core = sing_box_core_label(value) || "regular"; print_line("Sing-box core: " + sing_box_core); - print_line("\ud83d\udd73\ufe0f Forkop: " + forkop_version); + print_line("\ud83d\udd73\ufe0f Tachyon: " + tachyon_version); print_line("\ud83d\udd73\ufe0f LuCI App: " + luci_app_version); print_line("\ud83d\udce6 Sing-box: " + format_sing_box_version(value, sing_box_version)); if (flag_is_one(value.zapret_installed)) @@ -1473,19 +1473,19 @@ function global_nft_other_mark_exists() { function nft_ruleset_other_mark_lines(table_name) { table_name = as_string(table_name); - let in_forkop_table = false; + let in_tachyon_table = false; for (let line in split(read_stdin(), "\n")) { line = as_string(line); if (index(line, "table inet " + table_name) >= 0) { - in_forkop_table = true; + in_tachyon_table = true; continue; } if (match(line, /^table/) != null) - in_forkop_table = false; + in_tachyon_table = false; - if (!in_forkop_table && (index(line, "mark set") >= 0 || index(line, "meta mark") >= 0)) + if (!in_tachyon_table && (index(line, "mark set") >= 0 || index(line, "meta mark") >= 0)) print_line(line); } } @@ -1529,7 +1529,7 @@ function render_matching_log_tail(needle, max_lines) { { if (needle == "sing-box" && is_udp_unsupported_outbound_log(line)) { if (!udp_http_notice_emitted) { - push(filtered, "UDP traffic through HTTP outbounds is not supported by sing-box; repeated UDP warnings for HTTP outbounds are hidden by Forkop."); + push(filtered, "UDP traffic through HTTP outbounds is not supported by sing-box; repeated UDP warnings for HTTP outbounds are hidden by Tachyon."); udp_http_notice_emitted = true; } continue; @@ -1547,7 +1547,7 @@ function render_matching_log_tail(needle, max_lines) { print_lines(filtered, start, length(filtered)); } -function render_forkop_logs() { +function render_tachyon_logs() { let lines = split(read_stdin(), "\n"); let filtered = []; let start = -1; @@ -1556,18 +1556,18 @@ function render_forkop_logs() { for (let line in lines) { if (line == "") continue; - if (!line_contains(line, "forkop") && !line_contains(line, "sing-box")) + if (!line_contains(line, "tachyon") && !line_contains(line, "sing-box")) continue; if (line_contains(line, "sing-box") && is_udp_unsupported_outbound_log(line)) { if (!udp_http_notice_emitted) { - push(filtered, "UDP traffic through HTTP outbounds is not supported by sing-box; repeated UDP warnings for HTTP outbounds are hidden by Forkop."); + push(filtered, "UDP traffic through HTTP outbounds is not supported by sing-box; repeated UDP warnings for HTTP outbounds are hidden by Tachyon."); udp_http_notice_emitted = true; } continue; } - if (line_contains(line, "forkop") && line_contains(line, "Starting Forkop")) + if (line_contains(line, "tachyon") && line_contains(line, "Starting Tachyon")) start = length(filtered); push(filtered, line); @@ -1581,7 +1581,7 @@ function render_forkop_logs() { return; } - print_line("No 'Starting Forkop' message found, showing last 100 lines"); + print_line("No 'Starting Tachyon' message found, showing last 100 lines"); start = length(filtered) > 100 ? length(filtered) - 100 : 0; print_lines(filtered, start, length(filtered)); } @@ -1642,7 +1642,7 @@ function key_value_file_value(path, key) { } } -function system_info_cache_valid(path, forkop_version, luci_app_version, ttl, now) { +function system_info_cache_valid(path, tachyon_version, luci_app_version, ttl, now) { let cache = read_json_file(path); if (type(cache) != "object") return false; @@ -1654,13 +1654,13 @@ function system_info_cache_valid(path, forkop_version, luci_app_version, ttl, no if (now > 0 && cached_at > 0 && ttl > 0 && now - cached_at >= ttl) return false; - return cache.forkop_version == forkop_version && cache.luci_app_version == luci_app_version; + return cache.tachyon_version == tachyon_version && cache.luci_app_version == luci_app_version; } function system_info_json() { write_json({ - forkop_version: as_string(ARGV[1]), - forkop_latest_version: as_string(ARGV[2]), + tachyon_version: as_string(ARGV[1]), + tachyon_latest_version: as_string(ARGV[2]), luci_app_version: as_string(ARGV[3]), sing_box_version: as_string(ARGV[4]), sing_box_extended: arg_number(ARGV[5]), @@ -1917,8 +1917,8 @@ else if (mode == "network-wireguard-route-allowed-peers") network_wireguard_route_allowed_peers(); else if (mode == "wan-config-masked") wan_config_masked(ARGV[1]); -else if (mode == "forkop-config-masked") - forkop_config_masked(ARGV[1]); +else if (mode == "tachyon-config-masked") + tachyon_config_masked(ARGV[1]); else if (mode == "dhcp-dnsmasq-config") dhcp_dnsmasq_config(ARGV[1]); else if (mode == "firewall-port-token-contains") @@ -1997,8 +1997,8 @@ else if (mode == "nft-chain-config-blocks") render_nft_chain_config_blocks(); else if (mode == "nft-chain-counter-status") nft_chain_counter_status(); -else if (mode == "forkop-logs") - render_forkop_logs(); +else if (mode == "tachyon-logs") + render_tachyon_logs(); else if (mode == "matching-log-tail") render_matching_log_tail(ARGV[1], ARGV[2]); else if (mode == "file-first-line") diff --git a/tachyon/files/usr/lib/dns/apply.uc b/tachyon/files/usr/lib/dns/apply.uc index 15e3c968..c1d6c36b 100644 --- a/tachyon/files/usr/lib/dns/apply.uc +++ b/tachyon/files/usr/lib/dns/apply.uc @@ -3,7 +3,7 @@ let fs = require("fs"); let uci = require("core.uci"); -const CONFIG_NAME = getenv("FORKOP_CONFIG_NAME") || "forkop"; +const CONFIG_NAME = getenv("TACHYON_CONFIG_NAME") || "tachyon"; const SB_DNS_INBOUND_ADDRESS = getenv("SB_DNS_INBOUND_ADDRESS") || "127.0.0.42"; const DNSMASQ_INIT = getenv("DNSMASQ_INIT") || "/etc/init.d/dnsmasq"; @@ -79,7 +79,7 @@ function list_has(values, needle) { function log(message, level) { level = as_string(level || "info"); - run("logger -t " + shell_quote("forkop") + " " + shell_quote("[" + level + "] " + as_string(message))); + run("logger -t " + shell_quote("tachyon") + " " + shell_quote("[" + level + "] " + as_string(message))); } function restart_dnsmasq() { @@ -87,26 +87,26 @@ function restart_dnsmasq() { } function dnsmasq_legacy_instance_exists() { - return uci_exists("dhcp.forkop"); + return uci_exists("dhcp.tachyon"); } function dnsmasq_default_servers() { return uci_get("dhcp.@dnsmasq[0].server"); } -function dnsmasq_default_has_forkop_dns() { +function dnsmasq_default_has_tachyon_dns() { return list_has(dnsmasq_default_servers(), SB_DNS_INBOUND_ADDRESS); } -function dnsmasq_has_forkop_dns() { - return dnsmasq_default_has_forkop_dns() || dnsmasq_legacy_instance_exists(); +function dnsmasq_has_tachyon_dns() { + return dnsmasq_default_has_tachyon_dns() || dnsmasq_legacy_instance_exists(); } -function dnsmasq_has_forkop_managed_state() { - return uci_get("dhcp.@dnsmasq[0].forkop_server") != "" || - uci_get("dhcp.@dnsmasq[0].forkop_noresolv") != "" || - uci_get("dhcp.@dnsmasq[0].forkop_cachesize") != "" || - uci_get("dhcp.@dnsmasq[0].forkop_notinterface") != "" || +function dnsmasq_has_tachyon_managed_state() { + return uci_get("dhcp.@dnsmasq[0].tachyon_server") != "" || + uci_get("dhcp.@dnsmasq[0].tachyon_noresolv") != "" || + uci_get("dhcp.@dnsmasq[0].tachyon_cachesize") != "" || + uci_get("dhcp.@dnsmasq[0].tachyon_notinterface") != "" || dnsmasq_legacy_instance_exists(); } @@ -115,14 +115,14 @@ function dnsmasq_management_disabled() { } function dnsmasq_default_config_is_complete() { - return dnsmasq_default_has_forkop_dns() && + return dnsmasq_default_has_tachyon_dns() && uci_get("dhcp.@dnsmasq[0].noresolv") == "1" && uci_get("dhcp.@dnsmasq[0].cachesize") == "0" && !dnsmasq_legacy_instance_exists(); } function dnsmasq_legacy_interfaces() { - let legacy_dnsmasq_section = "forkop"; + let legacy_dnsmasq_section = "tachyon"; let legacy_interfaces = uci_get("dhcp." + legacy_dnsmasq_section + ".interface"); if (legacy_interfaces == "") legacy_interfaces = uci_get(CONFIG_NAME + ".settings.source_network_interfaces"); @@ -142,12 +142,12 @@ function backup_dnsmasq_config_option(key, backup_key) { } function backup_dnsmasq_server_list() { - if (uci_get("dhcp.@dnsmasq[0].forkop_server") != "") + if (uci_get("dhcp.@dnsmasq[0].tachyon_server") != "") return; for (let server in words(dnsmasq_default_servers())) { if (server != SB_DNS_INBOUND_ADDRESS) - uci_add_list("dhcp.@dnsmasq[0].forkop_server", server); + uci_add_list("dhcp.@dnsmasq[0].tachyon_server", server); } } @@ -169,14 +169,14 @@ function dnsmasq_cleanup_legacy_instance() { let legacy_instance_present = dnsmasq_legacy_instance_exists(); let legacy_interfaces = legacy_instance_present ? dnsmasq_legacy_interfaces() : ""; - uci_delete("dhcp.forkop"); + uci_delete("dhcp.tachyon"); - let backup_notinterfaces = uci_get("dhcp.@dnsmasq[0].forkop_notinterface"); + let backup_notinterfaces = uci_get("dhcp.@dnsmasq[0].tachyon_notinterface"); if (backup_notinterfaces != "") { uci_delete("dhcp.@dnsmasq[0].notinterface"); for (let value in words(backup_notinterfaces)) uci_add_list("dhcp.@dnsmasq[0].notinterface", value); - uci_delete("dhcp.@dnsmasq[0].forkop_notinterface"); + uci_delete("dhcp.@dnsmasq[0].tachyon_notinterface"); return; } @@ -185,16 +185,16 @@ function dnsmasq_cleanup_legacy_instance() { uci_del_list("dhcp.@dnsmasq[0].notinterface", value); } - uci_delete("dhcp.@dnsmasq[0].forkop_notinterface"); + uci_delete("dhcp.@dnsmasq[0].tachyon_notinterface"); } function dnsmasq_configure_default_instance() { - let default_has_forkop_dns = dnsmasq_default_has_forkop_dns(); + let default_has_tachyon_dns = dnsmasq_default_has_tachyon_dns(); backup_dnsmasq_server_list(); - if (!default_has_forkop_dns) { - backup_dnsmasq_config_option("noresolv", "forkop_noresolv"); - backup_dnsmasq_config_option("cachesize", "forkop_cachesize"); + if (!default_has_tachyon_dns) { + backup_dnsmasq_config_option("noresolv", "tachyon_noresolv"); + backup_dnsmasq_config_option("cachesize", "tachyon_cachesize"); } uci_delete("dhcp.@dnsmasq[0].server"); @@ -205,14 +205,14 @@ function dnsmasq_configure_default_instance() { function dnsmasq_restore_default_instance() { let server_list = dnsmasq_default_servers(); - let backup_servers = uci_get("dhcp.@dnsmasq[0].forkop_server"); + let backup_servers = uci_get("dhcp.@dnsmasq[0].tachyon_server"); let managed_global_dns = list_has(server_list, SB_DNS_INBOUND_ADDRESS); uci_delete("dhcp.@dnsmasq[0].server"); if (backup_servers != "") { for (let value in words(backup_servers)) uci_add_list("dhcp.@dnsmasq[0].server", value); - uci_delete("dhcp.@dnsmasq[0].forkop_server"); + uci_delete("dhcp.@dnsmasq[0].tachyon_server"); } else { for (let value in words(server_list)) { @@ -220,17 +220,17 @@ function dnsmasq_restore_default_instance() { uci_add_list("dhcp.@dnsmasq[0].server", value); } } - uci_delete("dhcp.@dnsmasq[0].forkop_server"); + uci_delete("dhcp.@dnsmasq[0].tachyon_server"); - let noresolv = uci_get("dhcp.@dnsmasq[0].forkop_noresolv"); + let noresolv = uci_get("dhcp.@dnsmasq[0].tachyon_noresolv"); if (noresolv != "") - restore_dnsmasq_config_option("noresolv", "forkop_noresolv", ""); + restore_dnsmasq_config_option("noresolv", "tachyon_noresolv", ""); else if (managed_global_dns) uci_set("dhcp.@dnsmasq[0].noresolv", "0"); - let cachesize = uci_get("dhcp.@dnsmasq[0].forkop_cachesize"); + let cachesize = uci_get("dhcp.@dnsmasq[0].tachyon_cachesize"); if (cachesize != "") - restore_dnsmasq_config_option("cachesize", "forkop_cachesize", ""); + restore_dnsmasq_config_option("cachesize", "tachyon_cachesize", ""); else if (managed_global_dns) uci_set("dhcp.@dnsmasq[0].cachesize", "150"); } @@ -241,10 +241,10 @@ function dnsmasq_configure(force) { if (as_string(force) != "force" && uci_get(CONFIG_NAME + ".settings.shutdown_correctly") == "0") { if (dnsmasq_default_config_is_complete()) { - log("Previous Forkop shutdown was unclean; dnsmasq already points to sing-box", "info"); + log("Previous Tachyon shutdown was unclean; dnsmasq already points to sing-box", "info"); return true; } - log("Previous Forkop shutdown was unclean and dnsmasq is not ready; applying Forkop DNS settings", "info"); + log("Previous Tachyon shutdown was unclean and dnsmasq is not ready; applying Tachyon DNS settings", "info"); } log("Configuring dnsmasq to forward DNS to sing-box", "info"); @@ -262,11 +262,11 @@ function dnsmasq_restore(force, quiet) { if (!quiet) log("Restoring DNS settings in dnsmasq", "info"); if (as_string(force) != "force" && uci_get(CONFIG_NAME + ".settings.shutdown_correctly") == "1") { - if (!dnsmasq_has_forkop_dns()) { - log("dnsmasq already uses non-Forkop DNS settings; restore is not required", "info"); + if (!dnsmasq_has_tachyon_dns()) { + log("dnsmasq already uses non-Tachyon DNS settings; restore is not required", "info"); return true; } - log("Forkop DNS settings are still present after a clean shutdown; restoring DNS settings in dnsmasq", "info"); + log("Tachyon DNS settings are still present after a clean shutdown; restoring DNS settings in dnsmasq", "info"); } dnsmasq_cleanup_legacy_instance(); @@ -281,15 +281,15 @@ function failsafe_restore() { return true; if (dnsmasq_management_disabled()) { - if (!dnsmasq_has_forkop_managed_state()) { - log("DNS rollback skipped: dont_touch_dhcp is enabled and no Forkop dnsmasq changes were found", "info"); + if (!dnsmasq_has_tachyon_managed_state()) { + log("DNS rollback skipped: dont_touch_dhcp is enabled and no Tachyon dnsmasq changes were found", "info"); return true; } - log("Rolling back previous Forkop dnsmasq changes because dont_touch_dhcp is enabled", "warn"); + log("Rolling back previous Tachyon dnsmasq changes because dont_touch_dhcp is enabled", "warn"); } else { - log("Rolling back Forkop DNS changes in dnsmasq", "warn"); + log("Rolling back Tachyon DNS changes in dnsmasq", "warn"); } dnsmasq_restore("force", true); @@ -304,12 +304,12 @@ else if (mode == "restore") exit(dnsmasq_restore(ARGV[1]) ? 0 : 1); else if (mode == "failsafe-restore") exit(failsafe_restore() ? 0 : 1); -else if (mode == "has-forkop-dns") - exit(dnsmasq_has_forkop_dns() ? 0 : 1); +else if (mode == "has-tachyon-dns") + exit(dnsmasq_has_tachyon_dns() ? 0 : 1); else if (mode == "has-managed-state") - exit(dnsmasq_has_forkop_managed_state() ? 0 : 1); + exit(dnsmasq_has_tachyon_managed_state() ? 0 : 1); else if (mode == "default-config-complete") exit(dnsmasq_default_config_is_complete() ? 0 : 1); -warn("Usage: dns/apply.uc \n"); +warn("Usage: dns/apply.uc \n"); exit(1); diff --git a/tachyon/files/usr/lib/nft/apply.uc b/tachyon/files/usr/lib/nft/apply.uc index 01704a9b..e7cbb6d8 100644 --- a/tachyon/files/usr/lib/nft/apply.uc +++ b/tachyon/files/usr/lib/nft/apply.uc @@ -8,7 +8,7 @@ let rule_config = require("config.rule"); let domain_config = require("config.domain"); let connections = require("config.connections"); let routing_rulesets = require("routing.rulesets"); -const CONFIG_NAME = getenv("FORKOP_CONFIG_NAME") || "forkop"; +const CONFIG_NAME = getenv("TACHYON_CONFIG_NAME") || "tachyon"; let common_read_json_file = common.read_json_file; let list_option = common.list_option; @@ -129,11 +129,11 @@ function command_output_from_args(args) { } function log_debug(message) { - run_args([ "logger", "-t", "forkop", "[debug] " + as_string(message) ]); + run_args([ "logger", "-t", "tachyon", "[debug] " + as_string(message) ]); } function log_fatal(message) { - run_args([ "logger", "-t", "forkop", "[fatal] " + as_string(message) ]); + run_args([ "logger", "-t", "tachyon", "[fatal] " + as_string(message) ]); } function strip_list_comment(line) { @@ -583,7 +583,7 @@ function section_priority_action(section) { } function section_priority_prefix(section) { - return "forkop_rule_" + as_string(section[".name"]); + return "tachyon_rule_" + as_string(section[".name"]); } function section_priority_sets(section) { @@ -758,8 +758,8 @@ function nft_add_section_priority_rules_from_sections(sections, table, interface function nft_create_runtime_base(table, localv4_set, common_set, port_set, ip_port_set, interface_set, source_interfaces, fakeip_mark, outbound_mark, fakeip_range, tproxy_port, exclude_ntp, localv6_set, common6_set, ip_port6_set, fakeip6_range, tproxy6_address) { localv6_set = default_arg(localv6_set, "localv6"); - common6_set = default_arg(common6_set, "forkop_subnets6"); - ip_port6_set = default_arg(ip_port6_set, "forkop_ip6_ports"); + common6_set = default_arg(common6_set, "tachyon_subnets6"); + ip_port6_set = default_arg(ip_port6_set, "tachyon_ip6_ports"); fakeip6_range = default_arg(fakeip6_range, "fc00::/18"); tproxy6_address = default_arg(tproxy6_address, "::1"); @@ -848,8 +848,8 @@ function nft_create_runtime_base_from_uci(table, localv4_set, common_set, port_s function nft_create_runtime_output_rules(table, localv4_set, common_set, port_set, ip_port_set, fakeip_mark, fakeip_range, localv6_set, common6_set, ip_port6_set, fakeip6_range) { localv6_set = default_arg(localv6_set, "localv6"); - common6_set = default_arg(common6_set, "forkop_subnets6"); - ip_port6_set = default_arg(ip_port6_set, "forkop_ip6_ports"); + common6_set = default_arg(common6_set, "tachyon_subnets6"); + ip_port6_set = default_arg(ip_port6_set, "tachyon_ip6_ports"); fakeip6_range = default_arg(fakeip6_range, "fc00::/18"); return ( @@ -1164,9 +1164,9 @@ function nft_add_inline_ip_cidr_matchers(csv, ports_csv, table, common_set, ip_p return true; if (as_string(ports_csv) != "") - return nft_add_csv_chunks_to_family_sets(csv, table, ip_port_set, default_arg(ip_port6_set, "forkop_ip6_ports"), "ip-port-from-ip", ports_csv, chunk_size_text); + return nft_add_csv_chunks_to_family_sets(csv, table, ip_port_set, default_arg(ip_port6_set, "tachyon_ip6_ports"), "ip-port-from-ip", ports_csv, chunk_size_text); - return nft_add_csv_chunks_to_family_sets(csv, table, common_set, default_arg(common6_set, "forkop_subnets6"), "ips", "", chunk_size_text); + return nft_add_csv_chunks_to_family_sets(csv, table, common_set, default_arg(common6_set, "tachyon_subnets6"), "ips", "", chunk_size_text); } function nft_insert_fully_routed_ip_rules(source_ip, table, interface_set, localv4_set, localv6_set, mark) { @@ -1661,19 +1661,19 @@ function nft_add_extracted_ruleset_subnets(unscoped_path, scoped_path, label, ta let has_entries = false; if (file_nonempty(unscoped_path)) { - if (!nft_add_file_chunks_to_family_sets(unscoped_path, table, common_set, default_arg(common6_set, "forkop_subnets6"), "ips", "", chunk_size_text)) + if (!nft_add_file_chunks_to_family_sets(unscoped_path, table, common_set, default_arg(common6_set, "tachyon_subnets6"), "ips", "", chunk_size_text)) return false; has_entries = true; } if (file_nonempty(scoped_path)) { - if (!nft_add_file_chunks_to_family_sets(scoped_path, table, ip_port_set, default_arg(ip_port6_set, "forkop_ip6_ports"), "ip-ports", "", chunk_size_text)) + if (!nft_add_file_chunks_to_family_sets(scoped_path, table, ip_port_set, default_arg(ip_port6_set, "tachyon_ip6_ports"), "ip-ports", "", chunk_size_text)) return false; has_entries = true; } if (!has_entries) - run_args([ "logger", "-t", "forkop", "[warn] " + as_string(label) + " has no ip_cidr entries for nftables" ]); + run_args([ "logger", "-t", "tachyon", "[warn] " + as_string(label) + " has no ip_cidr entries for nftables" ]); return true; } diff --git a/tachyon/files/usr/lib/providers/byedpi/runtime.uc b/tachyon/files/usr/lib/providers/byedpi/runtime.uc index 8230bb22..eb93abf2 100644 --- a/tachyon/files/usr/lib/providers/byedpi/runtime.uc +++ b/tachyon/files/usr/lib/providers/byedpi/runtime.uc @@ -5,11 +5,11 @@ let uci_core = require("core.uci"); let runtime_constants = require("singbox.constants"); let validator_module = null; -const CONFIG_NAME = getenv("FORKOP_CONFIG_NAME") || "forkop"; -const LIB_DIR = getenv("FORKOP_LIB") || "/usr/lib/forkop"; +const CONFIG_NAME = getenv("TACHYON_CONFIG_NAME") || "tachyon"; +const LIB_DIR = getenv("TACHYON_LIB") || "/usr/lib/tachyon"; const BYEDPI_BIN = getenv("BYEDPI_BIN") || "/usr/bin/ciadpi"; const BYEDPI_SERVICE_INIT = getenv("BYEDPI_SERVICE_INIT") || "/etc/init.d/byedpi"; -const BYEDPI_STATE_DIR = getenv("BYEDPI_STATE_DIR") || "/var/run/forkop/byedpi"; +const BYEDPI_STATE_DIR = getenv("BYEDPI_STATE_DIR") || "/var/run/tachyon/byedpi"; const BYEDPI_PID_DIR = getenv("BYEDPI_PID_DIR") || BYEDPI_STATE_DIR + "/pid"; const BYEDPI_CHILD_PID_DIR = getenv("BYEDPI_CHILD_PID_DIR") || BYEDPI_STATE_DIR + "/child-pid"; const BYEDPI_LOG_DIR = getenv("BYEDPI_LOG_DIR") || BYEDPI_STATE_DIR + "/log"; @@ -76,7 +76,7 @@ function command_exists(name) { function log_message(message, level) { level = as_string(level || "info"); - command_success_from_args([ "logger", "-t", "forkop", "[" + level + "] " + as_string(message) ]); + command_success_from_args([ "logger", "-t", "tachyon", "[" + level + "] " + as_string(message) ]); } function object_or_empty(value) { @@ -369,20 +369,20 @@ function start_runtime() { return; if (standalone_service_enabled()) - log_message("Standalone byedpi service is enabled. Forkop manages ciadpi itself for action 'byedpi'; disable standalone byedpi autostart to avoid boot-time port conflicts.", "warn"); + log_message("Standalone byedpi service is enabled. Tachyon manages ciadpi itself for action 'byedpi'; disable standalone byedpi autostart to avoid boot-time port conflicts.", "warn"); if (standalone_service_running()) { - log_message("Stopping standalone byedpi service before starting Forkop-managed ciadpi runtime", "info"); + log_message("Stopping standalone byedpi service before starting Tachyon-managed ciadpi runtime", "info"); command_success_from_args([ BYEDPI_SERVICE_INIT, "stop" ]); command_success_from_args([ "sleep", "1" ]); if (standalone_service_running()) { - log_message("Standalone byedpi service is still running and may conflict with Forkop-managed ciadpi runtime. Aborted.", "fatal"); + log_message("Standalone byedpi service is still running and may conflict with Tachyon-managed ciadpi runtime. Aborted.", "fatal"); exit(1); } } if (!ensure_runtime_dirs()) { - log_message("Failed to prepare the Forkop ByeDPI state directory in " + BYEDPI_STATE_DIR + ". Aborted.", "fatal"); + log_message("Failed to prepare the Tachyon ByeDPI state directory in " + BYEDPI_STATE_DIR + ". Aborted.", "fatal"); exit(1); } @@ -521,15 +521,15 @@ function status_json() { if (configured && !provider) message = "action=byedpi is configured, but ciadpi is not available at " + BYEDPI_BIN; else if (configured && standalone_running) - message = "standalone byedpi service is active together with Forkop action=byedpi; port conflicts are possible"; + message = "standalone byedpi service is active together with Tachyon action=byedpi; port conflicts are possible"; else if (configured && standalone_enabled) - message = "standalone byedpi service autostart is enabled; disable it to avoid boot-time port conflicts with Forkop action=byedpi"; + message = "standalone byedpi service autostart is enabled; disable it to avoid boot-time port conflicts with Tachyon action=byedpi"; else if (running > expected || supervisors > expected) - message = "unexpected Forkop-managed ciadpi processes are running without matching action=byedpi rules"; + message = "unexpected Tachyon-managed ciadpi processes are running without matching action=byedpi rules"; else if (configured && unstable) - message = "Forkop-managed ciadpi has restarted after exiting; the ByeDPI strategy or traffic load may be unstable"; + message = "Tachyon-managed ciadpi has restarted after exiting; the ByeDPI strategy or traffic load may be unstable"; else if (configured && !ready) - message = "action=byedpi is configured, but the Forkop-managed ciadpi runtime is not ready"; + message = "action=byedpi is configured, but the Tachyon-managed ciadpi runtime is not ready"; else if (!configured && !provider && pkg) message = "byedpi package is installed, but ciadpi is not available at " + BYEDPI_BIN; else if (!configured && !provider) diff --git a/tachyon/files/usr/lib/providers/byedpi/validator.uc b/tachyon/files/usr/lib/providers/byedpi/validator.uc index fdef2b94..ac7754fe 100644 --- a/tachyon/files/usr/lib/providers/byedpi/validator.uc +++ b/tachyon/files/usr/lib/providers/byedpi/validator.uc @@ -104,26 +104,26 @@ function controlled_option_failure(token, next_token) { as_string(next_token) != "" && substr(as_string(next_token), 0, 1) != "-") display += " " + as_string(next_token); return validation_failure( - "ByeDPI listen address and port are assigned by Forkop and must not be set in the strategy: " + display, + "ByeDPI listen address and port are assigned by Tachyon and must not be set in the strategy: " + display, [ base ] ); } if (token == "--transparent" || token == "-E" || match(token, /^-E.+/) != null) return validation_failure( - "Transparent proxy mode is incompatible with action=byedpi because Forkop connects to ciadpi through SOCKS.", + "Transparent proxy mode is incompatible with action=byedpi because Tachyon connects to ciadpi through SOCKS.", [ base ] ); if (token == "--daemon" || token == "-D" || match(token, /^-D.+/) != null) return validation_failure( - "Forkop manages the ciadpi process lifecycle itself, so daemon mode is not allowed here.", + "Tachyon manages the ciadpi process lifecycle itself, so daemon mode is not allowed here.", [ base ] ); if (token == "--pidfile" || index(token, "--pidfile=") == 0 || token == "-w" || match(token, /^-w.+/) != null) return validation_failure( - "Forkop manages ciadpi pid files itself, so pidfile options are not allowed here.", + "Tachyon manages ciadpi pid files itself, so pidfile options are not allowed here.", [ base ] ); diff --git a/tachyon/files/usr/lib/providers/nfqueue/runtime.uc b/tachyon/files/usr/lib/providers/nfqueue/runtime.uc index 8400a5cd..91437d5a 100644 --- a/tachyon/files/usr/lib/providers/nfqueue/runtime.uc +++ b/tachyon/files/usr/lib/providers/nfqueue/runtime.uc @@ -5,10 +5,10 @@ let constants = require("core.constants"); let uci_core = require("core.uci"); let runtime_constants = require("singbox.constants"); -const CONFIG_NAME = getenv("FORKOP_CONFIG_NAME") || constants.FORKOP_CONFIG_NAME || "forkop"; -const LIB_DIR = getenv("FORKOP_LIB") || "/usr/lib/forkop"; +const CONFIG_NAME = getenv("TACHYON_CONFIG_NAME") || constants.TACHYON_CONFIG_NAME || "tachyon"; +const LIB_DIR = getenv("TACHYON_LIB") || "/usr/lib/tachyon"; const SB_TPROXY_INBOUND_TAG = getenv("SB_TPROXY_INBOUND_TAG") || constants.SB_TPROXY_INBOUND_TAG || "tproxy-in"; -const NFT_TABLE_NAME = getenv("NFT_TABLE_NAME") || constants.NFT_TABLE_NAME || "ForkopTable"; +const NFT_TABLE_NAME = getenv("NFT_TABLE_NAME") || constants.NFT_TABLE_NAME || "TachyonTable"; let common = require("core.common"); let as_string = common.as_string; @@ -77,7 +77,7 @@ function module_success(args) { function log_message(message, level) { level = as_string(level || "info"); - command_success_from_args([ "logger", "-t", "forkop", "[" + level + "] " + as_string(message) ]); + command_success_from_args([ "logger", "-t", "tachyon", "[" + level + "] " + as_string(message) ]); } function object_or_empty(value) { @@ -477,7 +477,7 @@ function start_runtime(cfg) { cleanup_legacy_runtime(cfg); if (!ensure_runtime_dirs(cfg)) { - log_message("Failed to prepare the Forkop " + cfg.status_label + " state directory in " + cfg.state_dir + ". Aborted.", "fatal"); + log_message("Failed to prepare the Tachyon " + cfg.status_label + " state directory in " + cfg.state_dir + ". Aborted.", "fatal"); exit(1); } @@ -595,15 +595,15 @@ function status_json(cfg) { if (configured && !provider) message = "action=" + cfg.action + " is configured, but " + cfg.status_label + " provider is not available at " + cfg.provider_bin; else if (queue_overlap) - message = "external NFQUEUE rules overlap with the Forkop " + cfg.status_label + " range " + cfg.queue_base + "-" + queue_range_end(cfg); + message = "external NFQUEUE rules overlap with the Tachyon " + cfg.status_label + " range " + cfg.queue_base + "-" + queue_range_end(cfg); else if (legacy_runtime) message = "legacy zapret runtime paths are still present and should be migrated"; else if (running > expected || supervisors > expected) - message = "unexpected Forkop-managed " + cfg.binary_name + " processes are running without matching action=" + cfg.action + " rules"; + message = "unexpected Tachyon-managed " + cfg.binary_name + " processes are running without matching action=" + cfg.action + " rules"; else if (configured && !ready) - message = "action=" + cfg.action + " is configured, but the Forkop-managed " + cfg.binary_name + " runtime is not ready"; + message = "action=" + cfg.action + " is configured, but the Tachyon-managed " + cfg.binary_name + " runtime is not ready"; else if (standalone_conflict) - message = "standalone " + cfg.status_label + " is active together with Forkop action=" + cfg.action + "; queues are separate, but packet-level policy overlap is possible"; + message = "standalone " + cfg.status_label + " is active together with Tachyon action=" + cfg.action + "; queues are separate, but packet-level policy overlap is possible"; else if (!configured && !provider && pkg) message = cfg.status_label + " package is installed, but the provider binary is not available at " + cfg.provider_bin; else if (!configured && !provider) diff --git a/tachyon/files/usr/lib/providers/nfqueue/validator.uc b/tachyon/files/usr/lib/providers/nfqueue/validator.uc index 3a837fb9..86e8dde2 100644 --- a/tachyon/files/usr/lib/providers/nfqueue/validator.uc +++ b/tachyon/files/usr/lib/providers/nfqueue/validator.uc @@ -162,7 +162,7 @@ function unsupported_reason(kind, token) { let action = kind == "nfqws2" ? "zapret2" : "zapret"; if (token == "" || token == "") - return "Forkop does not expand " + action + " hostlist templates in per-rule strategies because sing-box already selects the resources before NFQUEUE."; + return "Tachyon does not expand " + action + " hostlist templates in per-rule strategies because sing-box already selects the resources before NFQUEUE."; let base = split_option_token(token); if (contains([ @@ -173,28 +173,28 @@ function unsupported_reason(kind, token) { "--hostlist-auto-retrans-maxseq", "--hostlist-auto-retrans-reset", "--hostlist-auto-incoming-maxseq", "--hostlist-auto-udp-in", "--hostlist-auto-udp-out" ], base))) - return "Hostname-based selection inside " + name + " is incompatible with the Forkop architecture because sing-box already chooses which resources enter action=" + action + "."; + return "Hostname-based selection inside " + name + " is incompatible with the Tachyon architecture because sing-box already chooses which resources enter action=" + action + "."; if (contains([ "--ipset", "--ipset-ip", "--ipset-exclude", "--ipset-exclude-ip" ], base)) - return "IP or CIDR selection inside " + name + " is incompatible with the Forkop architecture because sing-box already chooses which resources enter action=" + action + "."; + return "IP or CIDR selection inside " + name + " is incompatible with the Tachyon architecture because sing-box already chooses which resources enter action=" + action + "."; if (base == "--qnum") - return "The NFQUEUE number is assigned by Forkop per rule and must not be overridden in the strategy."; + return "The NFQUEUE number is assigned by Tachyon per rule and must not be overridden in the strategy."; if (kind == "nfqws" && base == "--dpi-desync-fwmark") - return "The desync fwmark is managed by Forkop for loop prevention and must not be overridden in the strategy."; + return "The desync fwmark is managed by Tachyon for loop prevention and must not be overridden in the strategy."; if (kind == "nfqws2" && (base == "--fwmark" || base == "--dpi-desync-fwmark")) - return "The nfqws2 fwmark is managed by Forkop for loop prevention and must not be overridden in the strategy."; + return "The nfqws2 fwmark is managed by Tachyon for loop prevention and must not be overridden in the strategy."; if (kind == "nfqws2" && base == "--fuzz") - return "nfqws2 fuzz mode disables normal interception and is incompatible with Forkop-managed action=zapret2 rules."; + return "nfqws2 fuzz mode disables normal interception and is incompatible with Tachyon-managed action=zapret2 rules."; if (kind == "nfqws2" && token == "--intercept=0") - return "nfqws2 interception must stay enabled for Forkop-managed action=zapret2 rules."; + return "nfqws2 interception must stay enabled for Tachyon-managed action=zapret2 rules."; if (base == "--daemon") - return "Forkop manages the " + name + " process lifecycle itself. The strategy must not daemonize " + name + "."; + return "Tachyon manages the " + name + " process lifecycle itself. The strategy must not daemonize " + name + "."; if (base == "--dry-run") return "The strategy must launch a working " + name + " process. --dry-run exits immediately and is not allowed."; if (base == "--version") @@ -235,7 +235,7 @@ function validate_strategy(kind, raw_opt, legacy_default) { if (token_count == 0 && token_has_external_config_prefix(token)) return validation_failure( - "Unsupported " + label(kind) + " token '" + token + "': External " + (kind == "nfqws2" ? "nfqws2" : "nfqws") + " config files bypass Forkop validation and queue management.", + "Unsupported " + label(kind) + " token '" + token + "': External " + (kind == "nfqws2" ? "nfqws2" : "nfqws") + " config files bypass Tachyon validation and queue management.", [ token ] ); diff --git a/tachyon/files/usr/lib/providers/rules.uc b/tachyon/files/usr/lib/providers/rules.uc index c37b48a4..31306e54 100644 --- a/tachyon/files/usr/lib/providers/rules.uc +++ b/tachyon/files/usr/lib/providers/rules.uc @@ -3,7 +3,7 @@ let fs = require("fs"); let uci_core = require("core.uci"); -const CONFIG_NAME = getenv("FORKOP_CONFIG_NAME") || "forkop"; +const CONFIG_NAME = getenv("TACHYON_CONFIG_NAME") || "tachyon"; function as_string(value) { return value == null ? "" : "" + value; diff --git a/tachyon/files/usr/lib/providers/zapret/common.uc b/tachyon/files/usr/lib/providers/zapret/common.uc index 56fe2c71..69c06f36 100644 --- a/tachyon/files/usr/lib/providers/zapret/common.uc +++ b/tachyon/files/usr/lib/providers/zapret/common.uc @@ -3,7 +3,7 @@ let constants = require("core.constants"); let validator_module = null; -const LIB_DIR = getenv("FORKOP_LIB") || "/usr/lib/forkop"; +const LIB_DIR = getenv("TACHYON_LIB") || "/usr/lib/tachyon"; function validator() { if (validator_module == null) diff --git a/tachyon/files/usr/lib/providers/zapret2/common.uc b/tachyon/files/usr/lib/providers/zapret2/common.uc index ead95679..6a266701 100644 --- a/tachyon/files/usr/lib/providers/zapret2/common.uc +++ b/tachyon/files/usr/lib/providers/zapret2/common.uc @@ -3,7 +3,7 @@ let constants = require("core.constants"); let validator_module = null; -const LIB_DIR = getenv("FORKOP_LIB") || "/usr/lib/forkop"; +const LIB_DIR = getenv("TACHYON_LIB") || "/usr/lib/tachyon"; function validator() { if (validator_module == null) diff --git a/tachyon/files/usr/lib/server/service.uc b/tachyon/files/usr/lib/server/service.uc index 85fee540..8d429aa5 100644 --- a/tachyon/files/usr/lib/server/service.uc +++ b/tachyon/files/usr/lib/server/service.uc @@ -5,7 +5,7 @@ let core_ip = require("core.ip"); let core_url = require("core.url"); let uci = require("core.uci"); -const CONFIG_NAME = getenv("FORKOP_CONFIG_NAME") || "forkop"; +const CONFIG_NAME = getenv("TACHYON_CONFIG_NAME") || "tachyon"; let common = require("core.common"); let as_string = common.as_string; @@ -43,7 +43,7 @@ function output(command) { function log(message, level) { level = as_string(level || "info"); - run("logger -t " + shell_quote("forkop") + " " + shell_quote("[" + level + "] " + as_string(message))); + run("logger -t " + shell_quote("tachyon") + " " + shell_quote("[" + level + "] " + as_string(message))); } function fatal(message) { @@ -848,7 +848,7 @@ function server_prepare_tls_defaults(section, protocol, security) { let key_path = config_get(section, "tls_key_path", ""); if (certificate_path == "" || key_path == "") { let safe_name = safe_filename_string(section); - let default_dir = "/etc/forkop/server-certs"; + let default_dir = "/etc/tachyon/server-certs"; if (certificate_path == "") certificate_path = default_dir + "/" + safe_name + ".crt"; if (key_path == "") @@ -954,7 +954,7 @@ function prepare_server_defaults(section) { if (protocol == "tailscale") { let safe_name = safe_filename_string(section); server_default_set_option(section, "tailscale_control_url", "https://controlplane.tailscale.com"); - server_default_set_option(section, "tailscale_hostname", "forkop-" + safe_name); + server_default_set_option(section, "tailscale_hostname", "tachyon-" + safe_name); server_default_set_option(section, "tailscale_advertise_exit_node", "1"); } diff --git a/tachyon/files/usr/lib/service/initd.uc b/tachyon/files/usr/lib/service/initd.uc index 91878edc..3bfc8902 100644 --- a/tachyon/files/usr/lib/service/initd.uc +++ b/tachyon/files/usr/lib/service/initd.uc @@ -13,21 +13,21 @@ function constant_value(name, fallback) { return value == null ? as_string(fallback) : as_string(value); } -const CONFIG_NAME = getenv("FORKOP_CONFIG_NAME") || constant_value("FORKOP_CONFIG_NAME", "forkop"); -const LIB_DIR = getenv("FORKOP_LIB") || "/usr/lib/forkop"; -const BIN_PATH = getenv("FORKOP_BIN") || constant_value("FORKOP_BIN", "/usr/bin/forkop"); -const SERVICE_INIT = getenv("FORKOP_SERVICE_INIT") || constant_value("FORKOP_SERVICE_INIT", "/etc/init.d/forkop"); -const SERVICE_NAME = getenv("FORKOP_SERVICE_NAME") || constant_value("FORKOP_SERVICE_NAME", "forkop"); -const CONFIG_FILE = getenv("FORKOP_CONFIG_FILE") || "/etc/config/" + CONFIG_NAME; -const RELOAD_LOCK_DIR = getenv("FORKOP_RELOAD_LOCK_DIR") || "/var/run/forkop.reload.lock"; -const RUNTIME_STATE_DIR = getenv("FORKOP_RUNTIME_STATE_DIR") || "/var/run/forkop"; -const PENDING_RELOAD_FILE = getenv("FORKOP_PENDING_RELOAD_FILE") || RUNTIME_STATE_DIR + "/reload.pending"; -const START_RETRY_FILE = getenv("FORKOP_START_RETRY_FILE") || RUNTIME_STATE_DIR + "/start.retry"; -const START_RETRY_PID_FILE = getenv("FORKOP_START_RETRY_PID_FILE") || RUNTIME_STATE_DIR + "/start-retry.pid"; -const START_RETRY_DELAY_SECONDS = getenv("FORKOP_START_RETRY_DELAY_SECONDS") || "30"; -const SERVICE_TRIGGER_SYNC_FILE = getenv("FORKOP_SERVICE_TRIGGER_SYNC_FILE") || RUNTIME_STATE_DIR + "/service-triggers.sync"; -const INTERNAL_CONFIG_TRIGGER_GUARD = getenv("FORKOP_INTERNAL_CONFIG_TRIGGER_GUARD") || "/var/run/forkop.internal-config-change"; -const CONFIG_CHANGE_REASON = getenv("FORKOP_CONFIG_CHANGE_REASON") || "on_config_change"; +const CONFIG_NAME = getenv("TACHYON_CONFIG_NAME") || constant_value("TACHYON_CONFIG_NAME", "tachyon"); +const LIB_DIR = getenv("TACHYON_LIB") || "/usr/lib/tachyon"; +const BIN_PATH = getenv("TACHYON_BIN") || constant_value("TACHYON_BIN", "/usr/bin/tachyon"); +const SERVICE_INIT = getenv("TACHYON_SERVICE_INIT") || constant_value("TACHYON_SERVICE_INIT", "/etc/init.d/tachyon"); +const SERVICE_NAME = getenv("TACHYON_SERVICE_NAME") || constant_value("TACHYON_SERVICE_NAME", "tachyon"); +const CONFIG_FILE = getenv("TACHYON_CONFIG_FILE") || "/etc/config/" + CONFIG_NAME; +const RELOAD_LOCK_DIR = getenv("TACHYON_RELOAD_LOCK_DIR") || "/var/run/tachyon.reload.lock"; +const RUNTIME_STATE_DIR = getenv("TACHYON_RUNTIME_STATE_DIR") || "/var/run/tachyon"; +const PENDING_RELOAD_FILE = getenv("TACHYON_PENDING_RELOAD_FILE") || RUNTIME_STATE_DIR + "/reload.pending"; +const START_RETRY_FILE = getenv("TACHYON_START_RETRY_FILE") || RUNTIME_STATE_DIR + "/start.retry"; +const START_RETRY_PID_FILE = getenv("TACHYON_START_RETRY_PID_FILE") || RUNTIME_STATE_DIR + "/start-retry.pid"; +const START_RETRY_DELAY_SECONDS = getenv("TACHYON_START_RETRY_DELAY_SECONDS") || "30"; +const SERVICE_TRIGGER_SYNC_FILE = getenv("TACHYON_SERVICE_TRIGGER_SYNC_FILE") || RUNTIME_STATE_DIR + "/service-triggers.sync"; +const INTERNAL_CONFIG_TRIGGER_GUARD = getenv("TACHYON_INTERNAL_CONFIG_TRIGGER_GUARD") || "/var/run/tachyon.internal-config-change"; +const CONFIG_CHANGE_REASON = getenv("TACHYON_CONFIG_CHANGE_REASON") || "on_config_change"; const DNS_APPLY_UC = LIB_DIR + "/dns/apply.uc"; const UI_UC = LIB_DIR + "/service/ui.uc"; @@ -297,7 +297,7 @@ function run_pending_reload_if_requested(path, init_script) { if (!consume_pending_reload(path)) return; - command_success_from_args([ "logger", "-t", SERVICE_NAME, "[info] Applying pending Forkop reload" ]); + command_success_from_args([ "logger", "-t", SERVICE_NAME, "[info] Applying pending Tachyon reload" ]); system(shell_quote(init_script) + " reload pending >/dev/null 2>&1 1000>&- &"); } @@ -397,7 +397,7 @@ function restore_dnsmasq_failsafe() { } function begin_external_service_action(action, source, owner_pid) { - if (as_string(getenv("FORKOP_UI_ACTION_TRACKED") || "0") == "1") + if (as_string(getenv("TACHYON_UI_ACTION_TRACKED") || "0") == "1") return ""; if (!file_exists(UI_UC)) return ""; @@ -474,7 +474,7 @@ function retry_start_on_wan_up(owner_pid) { if (action != "restart") return 0; - command_success_from_args([ "logger", "-t", SERVICE_NAME, "[info] Retrying failed Forkop start after WAN came up" ]); + command_success_from_args([ "logger", "-t", SERVICE_NAME, "[info] Retrying failed Tachyon start after WAN came up" ]); return command_status_from_args([ SERVICE_INIT, "restart", "triggered" ]); } @@ -486,7 +486,7 @@ function active_service_action_value() { } function ui_action_tracked() { - return as_string(getenv("FORKOP_UI_ACTION_TRACKED") || "0") == "1"; + return as_string(getenv("TACHYON_UI_ACTION_TRACKED") || "0") == "1"; } function start_plan_value(reason, owner_pid, settings, bin_ok) { @@ -520,7 +520,7 @@ function start_plan(reason, owner_pid, settings, bin_ok) { } function start_service(reason, owner_pid) { - print("Start Forkop\n"); + print("Start Tachyon\n"); let plan = start_plan_value(reason, owner_pid, uci_settings(), null); if (!plan.bin_ok) return 1; @@ -533,7 +533,7 @@ function start_service(reason, owner_pid) { else { mark_start_retry(START_RETRY_FILE, as_string(reason) == "triggered" ? "wan_retry_failed" : "start_failed"); schedule_start_retry(START_RETRY_PID_FILE, START_RETRY_DELAY_SECONDS); - command_success_from_args([ "logger", "-t", SERVICE_NAME, "[warn] Forkop start failed; scheduled an automatic retry" ]); + command_success_from_args([ "logger", "-t", SERVICE_NAME, "[warn] Tachyon start failed; scheduled an automatic retry" ]); } finish_external_service_action("start", plan.job_id, status); return status; @@ -655,7 +655,7 @@ function reload_service(reason, owner_pid) { if (plan.action != "run") return 0; - let status = command_status(command_from_args([ "env", "FORKOP_UI_ACTION_TRACKED=1", BIN_PATH, "reload", reason ]) + " >/dev/null 2>&1"); + let status = command_status(command_from_args([ "env", "TACHYON_UI_ACTION_TRACKED=1", BIN_PATH, "reload", reason ]) + " >/dev/null 2>&1"); let finish = reload_finish_value(reason, plan.job_id, status); if (finish.sync) print("sync\n"); diff --git a/tachyon/files/usr/lib/service/lifecycle.uc b/tachyon/files/usr/lib/service/lifecycle.uc index 8afbc33d..a7196164 100644 --- a/tachyon/files/usr/lib/service/lifecycle.uc +++ b/tachyon/files/usr/lib/service/lifecycle.uc @@ -14,62 +14,62 @@ function constant_value(name, fallback) { return value == null ? as_string(fallback) : as_string(value); } -const CONFIG_NAME = getenv("FORKOP_CONFIG_NAME") || constant_value("FORKOP_CONFIG_NAME", "forkop"); -const CONFIG_FILE = getenv("FORKOP_CONFIG_FILE") || "/etc/config/" + CONFIG_NAME; -const LIB_DIR = getenv("FORKOP_LIB") || "/usr/lib/forkop"; -const BIN_PATH = getenv("FORKOP_BIN") || constant_value("FORKOP_BIN", "/usr/bin/forkop"); -const SERVICE_INIT = getenv("FORKOP_SERVICE_INIT") || constant_value("FORKOP_SERVICE_INIT", "/etc/init.d/forkop"); -const SERVICE_NAME = getenv("FORKOP_SERVICE_NAME") || constant_value("FORKOP_SERVICE_NAME", "forkop"); -const LUCI_VIEW_DIR = getenv("FORKOP_LUCI_VIEW_DIR") || constant_value("FORKOP_LUCI_VIEW_DIR", "/www/luci-static/resources/view/forkop"); -const LUCI_I18N_DOMAIN = getenv("FORKOP_LUCI_I18N_DOMAIN") || constant_value("FORKOP_LUCI_I18N_DOMAIN", "forkop"); +const CONFIG_NAME = getenv("TACHYON_CONFIG_NAME") || constant_value("TACHYON_CONFIG_NAME", "tachyon"); +const CONFIG_FILE = getenv("TACHYON_CONFIG_FILE") || "/etc/config/" + CONFIG_NAME; +const LIB_DIR = getenv("TACHYON_LIB") || "/usr/lib/tachyon"; +const BIN_PATH = getenv("TACHYON_BIN") || constant_value("TACHYON_BIN", "/usr/bin/tachyon"); +const SERVICE_INIT = getenv("TACHYON_SERVICE_INIT") || constant_value("TACHYON_SERVICE_INIT", "/etc/init.d/tachyon"); +const SERVICE_NAME = getenv("TACHYON_SERVICE_NAME") || constant_value("TACHYON_SERVICE_NAME", "tachyon"); +const LUCI_VIEW_DIR = getenv("TACHYON_LUCI_VIEW_DIR") || constant_value("TACHYON_LUCI_VIEW_DIR", "/www/luci-static/resources/view/tachyon"); +const LUCI_I18N_DOMAIN = getenv("TACHYON_LUCI_I18N_DOMAIN") || constant_value("TACHYON_LUCI_I18N_DOMAIN", "tachyon"); -const RUNTIME_STATE_DIR = getenv("FORKOP_RUNTIME_STATE_DIR") || "/var/run/forkop"; -const SYSTEM_INFO_CACHE_FILE = getenv("FORKOP_SYSTEM_INFO_CACHE_FILE") || RUNTIME_STATE_DIR + "/system-info.json"; -const RELOAD_STATE_FILE = getenv("FORKOP_RELOAD_STATE_FILE") || RUNTIME_STATE_DIR + "/reload-state"; -const RELOAD_STATE_SNAPSHOT_FILE = getenv("FORKOP_RELOAD_STATE_SNAPSHOT_FILE") || RUNTIME_STATE_DIR + "/reload-state.snapshot." + clock()[0] + "." + clock()[1]; -const PENDING_RELOAD_FILE = getenv("FORKOP_PENDING_RELOAD_FILE") || RUNTIME_STATE_DIR + "/reload.pending"; -const SERVICE_TRIGGER_SYNC_FILE = getenv("FORKOP_SERVICE_TRIGGER_SYNC_FILE") || RUNTIME_STATE_DIR + "/service-triggers.sync"; -const SUBSCRIPTION_UPDATE_STATE_DIR = getenv("FORKOP_SUBSCRIPTION_UPDATE_STATE_DIR") || RUNTIME_STATE_DIR + "/subscription-update"; -const SUBSCRIPTION_UPDATE_JOB_DIR = getenv("FORKOP_SUBSCRIPTION_UPDATE_JOB_DIR") || RUNTIME_STATE_DIR + "/subscription-update-jobs"; -const SUBSCRIPTION_LINKS_DIR = getenv("FORKOP_SUBSCRIPTION_LINKS_DIR") || RUNTIME_STATE_DIR + "/subscription-links"; -const SUBSCRIPTION_METADATA_DIR = getenv("FORKOP_SUBSCRIPTION_METADATA_DIR") || RUNTIME_STATE_DIR + "/subscription-metadata"; -const OUTBOUND_METADATA_DIR = getenv("FORKOP_OUTBOUND_METADATA_DIR") || RUNTIME_STATE_DIR + "/outbound-metadata"; -const SECTION_CACHE_DIR = getenv("FORKOP_SECTION_CACHE_DIR") || RUNTIME_STATE_DIR + "/section-cache"; -const RULE_CONDITION_CACHE_DIR = getenv("FORKOP_RULE_CONDITION_CACHE_DIR") || RUNTIME_STATE_DIR + "/rule-condition-cache"; -const RUNTIME_CACHE_FORMAT_FILE = getenv("FORKOP_RUNTIME_CACHE_FORMAT_FILE") || RUNTIME_STATE_DIR + "/cache-format"; -const PERSISTENT_SUBSCRIPTION_CACHE_DIR = getenv("FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR") || "/etc/forkop/subscription-cache"; -const PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE = getenv("FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE") || PERSISTENT_SUBSCRIPTION_CACHE_DIR + "/cache-format"; -const SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE = getenv("FORKOP_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE") || RUNTIME_STATE_DIR + "/subscription-bootstrap-retry.pid"; -const DNS_FAILOVER_STATE_FILE = getenv("FORKOP_DNS_FAILOVER_STATE_FILE") || RUNTIME_STATE_DIR + "/dns-failover.json"; -const DNS_FAILOVER_PID_FILE = getenv("FORKOP_DNS_FAILOVER_PID_FILE") || RUNTIME_STATE_DIR + "/dns-failover.pid"; -const SUBSCRIPTION_UPDATE_LOCK_DIR = getenv("FORKOP_SUBSCRIPTION_UPDATE_LOCK_DIR") || RUNTIME_STATE_DIR + "/subscription-update.lock"; -const RELOAD_LOCK_DIR = getenv("FORKOP_RELOAD_LOCK_DIR") || "/var/run/forkop.reload.lock"; -const INTERNAL_CONFIG_TRIGGER_GUARD = getenv("FORKOP_INTERNAL_CONFIG_TRIGGER_GUARD") || "/var/run/forkop.internal-config-change"; +const RUNTIME_STATE_DIR = getenv("TACHYON_RUNTIME_STATE_DIR") || "/var/run/tachyon"; +const SYSTEM_INFO_CACHE_FILE = getenv("TACHYON_SYSTEM_INFO_CACHE_FILE") || RUNTIME_STATE_DIR + "/system-info.json"; +const RELOAD_STATE_FILE = getenv("TACHYON_RELOAD_STATE_FILE") || RUNTIME_STATE_DIR + "/reload-state"; +const RELOAD_STATE_SNAPSHOT_FILE = getenv("TACHYON_RELOAD_STATE_SNAPSHOT_FILE") || RUNTIME_STATE_DIR + "/reload-state.snapshot." + clock()[0] + "." + clock()[1]; +const PENDING_RELOAD_FILE = getenv("TACHYON_PENDING_RELOAD_FILE") || RUNTIME_STATE_DIR + "/reload.pending"; +const SERVICE_TRIGGER_SYNC_FILE = getenv("TACHYON_SERVICE_TRIGGER_SYNC_FILE") || RUNTIME_STATE_DIR + "/service-triggers.sync"; +const SUBSCRIPTION_UPDATE_STATE_DIR = getenv("TACHYON_SUBSCRIPTION_UPDATE_STATE_DIR") || RUNTIME_STATE_DIR + "/subscription-update"; +const SUBSCRIPTION_UPDATE_JOB_DIR = getenv("TACHYON_SUBSCRIPTION_UPDATE_JOB_DIR") || RUNTIME_STATE_DIR + "/subscription-update-jobs"; +const SUBSCRIPTION_LINKS_DIR = getenv("TACHYON_SUBSCRIPTION_LINKS_DIR") || RUNTIME_STATE_DIR + "/subscription-links"; +const SUBSCRIPTION_METADATA_DIR = getenv("TACHYON_SUBSCRIPTION_METADATA_DIR") || RUNTIME_STATE_DIR + "/subscription-metadata"; +const OUTBOUND_METADATA_DIR = getenv("TACHYON_OUTBOUND_METADATA_DIR") || RUNTIME_STATE_DIR + "/outbound-metadata"; +const SECTION_CACHE_DIR = getenv("TACHYON_SECTION_CACHE_DIR") || RUNTIME_STATE_DIR + "/section-cache"; +const RULE_CONDITION_CACHE_DIR = getenv("TACHYON_RULE_CONDITION_CACHE_DIR") || RUNTIME_STATE_DIR + "/rule-condition-cache"; +const RUNTIME_CACHE_FORMAT_FILE = getenv("TACHYON_RUNTIME_CACHE_FORMAT_FILE") || RUNTIME_STATE_DIR + "/cache-format"; +const PERSISTENT_SUBSCRIPTION_CACHE_DIR = getenv("TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR") || "/etc/tachyon/subscription-cache"; +const PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE = getenv("TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE") || PERSISTENT_SUBSCRIPTION_CACHE_DIR + "/cache-format"; +const SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE = getenv("TACHYON_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE") || RUNTIME_STATE_DIR + "/subscription-bootstrap-retry.pid"; +const DNS_FAILOVER_STATE_FILE = getenv("TACHYON_DNS_FAILOVER_STATE_FILE") || RUNTIME_STATE_DIR + "/dns-failover.json"; +const DNS_FAILOVER_PID_FILE = getenv("TACHYON_DNS_FAILOVER_PID_FILE") || RUNTIME_STATE_DIR + "/dns-failover.pid"; +const SUBSCRIPTION_UPDATE_LOCK_DIR = getenv("TACHYON_SUBSCRIPTION_UPDATE_LOCK_DIR") || RUNTIME_STATE_DIR + "/subscription-update.lock"; +const RELOAD_LOCK_DIR = getenv("TACHYON_RELOAD_LOCK_DIR") || "/var/run/tachyon.reload.lock"; +const INTERNAL_CONFIG_TRIGGER_GUARD = getenv("TACHYON_INTERNAL_CONFIG_TRIGGER_GUARD") || "/var/run/tachyon.internal-config-change"; -const LIST_UPDATE_CRON_MARKER = getenv("FORKOP_LIST_UPDATE_CRON_MARKER") || "# forkop-list-update"; -const SUBSCRIPTION_UPDATE_CRON_MARKER = getenv("FORKOP_SUBSCRIPTION_UPDATE_CRON_MARKER") || "# forkop-subscription-update"; -const COMPONENT_UPDATE_CHECK_CRON_MARKER = getenv("FORKOP_COMPONENT_UPDATE_CHECK_CRON_MARKER") || "# forkop-component-update-check"; -const RELOAD_STATE_FORMAT = int(getenv("FORKOP_RELOAD_STATE_FORMAT") || "1"); -const RUNTIME_CACHE_FORMAT = int(getenv("FORKOP_RUNTIME_CACHE_FORMAT") || "7"); -const RUNTIME_STABLE_MIN_AGE = int(getenv("FORKOP_RUNTIME_STABLE_MIN_AGE") || "2"); -const SING_BOX_START_STABLE_MIN_AGE = int(getenv("FORKOP_SING_BOX_START_STABLE_MIN_AGE") || "8"); -const SING_BOX_START_VERIFY_TIMEOUT = int(getenv("FORKOP_SING_BOX_START_VERIFY_TIMEOUT") || "10"); -const NFT_POPULATE_ENABLED_DEFAULT = int(getenv("FORKOP_NFT_POPULATE_ENABLED") || "1"); +const LIST_UPDATE_CRON_MARKER = getenv("TACHYON_LIST_UPDATE_CRON_MARKER") || "# tachyon-list-update"; +const SUBSCRIPTION_UPDATE_CRON_MARKER = getenv("TACHYON_SUBSCRIPTION_UPDATE_CRON_MARKER") || "# tachyon-subscription-update"; +const COMPONENT_UPDATE_CHECK_CRON_MARKER = getenv("TACHYON_COMPONENT_UPDATE_CHECK_CRON_MARKER") || "# tachyon-component-update-check"; +const RELOAD_STATE_FORMAT = int(getenv("TACHYON_RELOAD_STATE_FORMAT") || "1"); +const RUNTIME_CACHE_FORMAT = int(getenv("TACHYON_RUNTIME_CACHE_FORMAT") || "7"); +const RUNTIME_STABLE_MIN_AGE = int(getenv("TACHYON_RUNTIME_STABLE_MIN_AGE") || "2"); +const SING_BOX_START_STABLE_MIN_AGE = int(getenv("TACHYON_SING_BOX_START_STABLE_MIN_AGE") || "8"); +const SING_BOX_START_VERIFY_TIMEOUT = int(getenv("TACHYON_SING_BOX_START_VERIFY_TIMEOUT") || "10"); +const NFT_POPULATE_ENABLED_DEFAULT = int(getenv("TACHYON_NFT_POPULATE_ENABLED") || "1"); const TMP_SING_BOX_FOLDER = getenv("TMP_SING_BOX_FOLDER") || constant_value("TMP_SING_BOX_FOLDER", "/tmp/sing-box"); const TMP_RULESET_FOLDER = getenv("TMP_RULESET_FOLDER") || constant_value("TMP_RULESET_FOLDER", TMP_SING_BOX_FOLDER + "/rulesets"); const TMP_SUBSCRIPTION_FOLDER = getenv("TMP_SUBSCRIPTION_FOLDER") || constant_value("TMP_SUBSCRIPTION_FOLDER", TMP_SING_BOX_FOLDER + "/subscriptions"); -const RT_TABLE_NAME = constant_value("RT_TABLE_NAME", "forkop"); -const NFT_TABLE_NAME = constant_value("NFT_TABLE_NAME", "ForkopTable"); +const RT_TABLE_NAME = constant_value("RT_TABLE_NAME", "tachyon"); +const NFT_TABLE_NAME = constant_value("NFT_TABLE_NAME", "TachyonTable"); const NFT_LOCALV4_SET_NAME = constant_value("NFT_LOCALV4_SET_NAME", "localv4"); const NFT_LOCALV6_SET_NAME = constant_value("NFT_LOCALV6_SET_NAME", "localv6"); -const NFT_COMMON_SET_NAME = constant_value("NFT_COMMON_SET_NAME", "forkop_subnets"); -const NFT_COMMON6_SET_NAME = constant_value("NFT_COMMON6_SET_NAME", "forkop_subnets6"); -const NFT_PORT_SET_NAME = constant_value("NFT_PORT_SET_NAME", "forkop_ports"); -const NFT_IP_PORT_SET_NAME = constant_value("NFT_IP_PORT_SET_NAME", "forkop_ip_ports"); -const NFT_IP_PORT6_SET_NAME = constant_value("NFT_IP_PORT6_SET_NAME", "forkop_ip6_ports"); -const NFT_INTERFACE_SET_NAME = constant_value("NFT_INTERFACE_SET_NAME", "forkop_interfaces"); +const NFT_COMMON_SET_NAME = constant_value("NFT_COMMON_SET_NAME", "tachyon_subnets"); +const NFT_COMMON6_SET_NAME = constant_value("NFT_COMMON6_SET_NAME", "tachyon_subnets6"); +const NFT_PORT_SET_NAME = constant_value("NFT_PORT_SET_NAME", "tachyon_ports"); +const NFT_IP_PORT_SET_NAME = constant_value("NFT_IP_PORT_SET_NAME", "tachyon_ip_ports"); +const NFT_IP_PORT6_SET_NAME = constant_value("NFT_IP_PORT6_SET_NAME", "tachyon_ip6_ports"); +const NFT_INTERFACE_SET_NAME = constant_value("NFT_INTERFACE_SET_NAME", "tachyon_interfaces"); const NFT_FAKEIP_MARK = constant_value("NFT_FAKEIP_MARK", "0x00100000"); const NFT_OUTBOUND_MARK = constant_value("NFT_OUTBOUND_MARK", "0x00200000"); @@ -79,8 +79,8 @@ const SB_TPROXY_INBOUND6_ADDRESS = constant_value("SB_TPROXY_INBOUND6_ADDRESS", const SB_TPROXY_INBOUND_PORT = constant_value("SB_TPROXY_INBOUND_PORT", "1602"); const SB_SERVICE_MIXED_INBOUND_ADDRESS = constant_value("SB_SERVICE_MIXED_INBOUND_ADDRESS", "127.0.0.1"); const SB_SERVICE_MIXED_INBOUND_PORT = constant_value("SB_SERVICE_MIXED_INBOUND_PORT", "4534"); -const SB_VARIANT_STATE_FILE = constant_value("SB_VARIANT_STATE_FILE", "/etc/forkop/sing-box-variant"); -const SB_VERSION_STATE_FILE = constant_value("SB_VERSION_STATE_FILE", "/etc/forkop/sing-box-version"); +const SB_VARIANT_STATE_FILE = constant_value("SB_VARIANT_STATE_FILE", "/etc/tachyon/sing-box-variant"); +const SB_VERSION_STATE_FILE = constant_value("SB_VERSION_STATE_FILE", "/etc/tachyon/sing-box-version"); const ZAPRET_PROVIDER_NFQWS_BIN = constant_value("ZAPRET_PROVIDER_NFQWS_BIN", "/opt/zapret/nfq/nfqws"); const ZAPRET_ROUTE_MARK_BASE = constant_value("ZAPRET_ROUTE_MARK_BASE", "0x01000000"); @@ -111,10 +111,11 @@ const ZAPRET_UC = LIB_DIR + "/providers/zapret/runtime.uc"; const ZAPRET2_UC = LIB_DIR + "/providers/zapret2/runtime.uc"; const BYEDPI_UC = LIB_DIR + "/providers/byedpi/runtime.uc"; const PACKAGES_UC = LIB_DIR + "/core/packages.uc"; +const WATCHDOG_UC = LIB_DIR + "/service/watchdog.uc"; let start_subscription_update_lock_held = false; -let subscription_caches_prepared = getenv("FORKOP_SUBSCRIPTION_CACHES_PREPARED") || "0"; -let subscription_runtime_no_refresh = getenv("FORKOP_SUBSCRIPTION_RUNTIME_NO_REFRESH") || "0"; +let subscription_caches_prepared = getenv("TACHYON_SUBSCRIPTION_CACHES_PREPARED") || "0"; +let subscription_runtime_no_refresh = getenv("TACHYON_SUBSCRIPTION_RUNTIME_NO_REFRESH") || "0"; let subscription_deferred_sections = ""; let nft_populate_enabled = NFT_POPULATE_ENABLED_DEFAULT; let rule_condition_cache_enabled = 0; @@ -246,28 +247,28 @@ function log_message(message, level) { function lifecycle_env() { return { - FORKOP_CONFIG_NAME: CONFIG_NAME, - FORKOP_LIB: LIB_DIR, - FORKOP_BIN: BIN_PATH, - FORKOP_SERVICE_INIT: SERVICE_INIT, - FORKOP_RUNTIME_STATE_DIR: RUNTIME_STATE_DIR, - FORKOP_SYSTEM_INFO_CACHE_FILE: SYSTEM_INFO_CACHE_FILE, - FORKOP_SUBSCRIPTION_UPDATE_STATE_DIR: SUBSCRIPTION_UPDATE_STATE_DIR, - FORKOP_SUBSCRIPTION_LINKS_DIR: SUBSCRIPTION_LINKS_DIR, - FORKOP_SUBSCRIPTION_METADATA_DIR: SUBSCRIPTION_METADATA_DIR, - FORKOP_OUTBOUND_METADATA_DIR: OUTBOUND_METADATA_DIR, - FORKOP_SECTION_CACHE_DIR: SECTION_CACHE_DIR, - FORKOP_RULE_CONDITION_CACHE_DIR: RULE_CONDITION_CACHE_DIR, - FORKOP_RUNTIME_CACHE_FORMAT_FILE: RUNTIME_CACHE_FORMAT_FILE, - FORKOP_RUNTIME_CACHE_FORMAT: as_string(RUNTIME_CACHE_FORMAT), - FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR: PERSISTENT_SUBSCRIPTION_CACHE_DIR, - FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE: PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE, - FORKOP_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE: SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE, - FORKOP_DNS_FAILOVER_STATE_FILE: DNS_FAILOVER_STATE_FILE, - FORKOP_DNS_FAILOVER_PID_FILE: DNS_FAILOVER_PID_FILE, - FORKOP_SUBSCRIPTION_UPDATE_LOCK_DIR: SUBSCRIPTION_UPDATE_LOCK_DIR, - FORKOP_PENDING_RELOAD_FILE: PENDING_RELOAD_FILE, - FORKOP_RELOAD_LOCK_DIR: RELOAD_LOCK_DIR, + TACHYON_CONFIG_NAME: CONFIG_NAME, + TACHYON_LIB: LIB_DIR, + TACHYON_BIN: BIN_PATH, + TACHYON_SERVICE_INIT: SERVICE_INIT, + TACHYON_RUNTIME_STATE_DIR: RUNTIME_STATE_DIR, + TACHYON_SYSTEM_INFO_CACHE_FILE: SYSTEM_INFO_CACHE_FILE, + TACHYON_SUBSCRIPTION_UPDATE_STATE_DIR: SUBSCRIPTION_UPDATE_STATE_DIR, + TACHYON_SUBSCRIPTION_LINKS_DIR: SUBSCRIPTION_LINKS_DIR, + TACHYON_SUBSCRIPTION_METADATA_DIR: SUBSCRIPTION_METADATA_DIR, + TACHYON_OUTBOUND_METADATA_DIR: OUTBOUND_METADATA_DIR, + TACHYON_SECTION_CACHE_DIR: SECTION_CACHE_DIR, + TACHYON_RULE_CONDITION_CACHE_DIR: RULE_CONDITION_CACHE_DIR, + TACHYON_RUNTIME_CACHE_FORMAT_FILE: RUNTIME_CACHE_FORMAT_FILE, + TACHYON_RUNTIME_CACHE_FORMAT: as_string(RUNTIME_CACHE_FORMAT), + TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR: PERSISTENT_SUBSCRIPTION_CACHE_DIR, + TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE: PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE, + TACHYON_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE: SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE, + TACHYON_DNS_FAILOVER_STATE_FILE: DNS_FAILOVER_STATE_FILE, + TACHYON_DNS_FAILOVER_PID_FILE: DNS_FAILOVER_PID_FILE, + TACHYON_SUBSCRIPTION_UPDATE_LOCK_DIR: SUBSCRIPTION_UPDATE_LOCK_DIR, + TACHYON_PENDING_RELOAD_FILE: PENDING_RELOAD_FILE, + TACHYON_RELOAD_LOCK_DIR: RELOAD_LOCK_DIR, TMP_SING_BOX_FOLDER: TMP_SING_BOX_FOLDER, TMP_RULESET_FOLDER: TMP_RULESET_FOLDER, TMP_SUBSCRIPTION_FOLDER: TMP_SUBSCRIPTION_FOLDER, @@ -278,7 +279,7 @@ function lifecycle_env() { ZAPRET_PROVIDER_NFQWS_BIN: ZAPRET_PROVIDER_NFQWS_BIN, ZAPRET2_PROVIDER_NFQWS2_BIN: ZAPRET2_PROVIDER_NFQWS2_BIN, BYEDPI_BIN: BYEDPI_BIN, - FORKOP_RULE_CONDITION_CACHE_ENABLED: as_string(rule_condition_cache_enabled) + TACHYON_RULE_CONDITION_CACHE_ENABLED: as_string(rule_condition_cache_enabled) }; } @@ -521,7 +522,7 @@ function dnsmasq_restore_fail_safe() { return dns_apply_status([ "failsafe-restore" ]); } -function dnsmasq_has_forkop_managed_state() { +function dnsmasq_has_tachyon_managed_state() { return dns_apply_success([ "has-managed-state" ]); } @@ -661,7 +662,7 @@ function prepare_subscription_caches(mode) { function start_main() { let status; - log_message("Starting Forkop", "info"); + log_message("Starting Tachyon", "info"); status = validate_start_config(); if (status != 0) @@ -712,7 +713,7 @@ function start_main() { } status = module_status(STATE_UC, [ - "wait-forkop-stable-start", + "wait-tachyon-stable-start", RT_TABLE_NAME, NFT_TABLE_NAME, NFT_FAKEIP_MARK, @@ -752,7 +753,7 @@ function start_impl() { if (status != 0) return status; } - else if (dnsmasq_has_forkop_managed_state()) { + else if (dnsmasq_has_tachyon_managed_state()) { status = dnsmasq_restore(true); if (status != 0) return status; @@ -780,6 +781,12 @@ function start_impl() { return status; } + status = module_status(WATCHDOG_UC, [ "start-runtime" ]); + if (status != 0) { + log_message("Failed to start Watchdog runtime", "fatal"); + return status; + } + module_background(DIAGNOSTICS_UC, [ "get-system-info" ]); return 0; } @@ -787,8 +794,9 @@ function start_impl() { function stop_main() { let status = 0; - log_message("Stopping Forkop", "info"); + log_message("Stopping Tachyon", "info"); module_success(DNS_FAILOVER_UC, [ "stop-runtime" ]); + module_success(WATCHDOG_UC, [ "stop-runtime" ]); module_success(PRIORITY_UC, [ "stop-runtime" ]); module_success(SUBSCRIPTION_CACHE_UC, [ "stop-deferred-bootstrap-worker" ]); module_success(UPDATES_UC, [ "stop-list-update" ]); @@ -822,7 +830,7 @@ function stop_main() { function cleanup_failed_runtime() { let status = 0; - log_message("Cleaning up Forkop runtime after failed start/reload", "info"); + log_message("Cleaning up Tachyon runtime after failed start/reload", "info"); let stop_status = stop_main(); if (stop_status != 0) @@ -837,7 +845,7 @@ function cleanup_failed_runtime() { status = mark_status; if (status != 0) - log_message("Failed to fully clean up Forkop runtime after start/reload failure", "warn"); + log_message("Failed to fully clean up Tachyon runtime after start/reload failure", "warn"); return status; } @@ -867,7 +875,7 @@ function start() { mark_pending_reload_if_config_changed(startup_config_fingerprint, "config_changed_during_start"); status = module_status(STATE_UC, [ - "wait-forkop-stable-start", + "wait-tachyon-stable-start", RT_TABLE_NAME, NFT_TABLE_NAME, NFT_FAKEIP_MARK, @@ -875,7 +883,7 @@ function start() { "8" ]); if (status != 0) { - log_message("Startup verification failed after Forkop was started; rolling back DNS changes", "warn"); + log_message("Startup verification failed after Tachyon was started; rolling back DNS changes", "warn"); cleanup_failed_runtime(); return status; } @@ -891,7 +899,7 @@ function stop_impl() { if (dns_status != 0) status = dns_status; } - else if (dnsmasq_has_forkop_managed_state()) { + else if (dnsmasq_has_tachyon_managed_state()) { let dns_status = dnsmasq_restore(true); if (dns_status != 0) status = dns_status; @@ -925,7 +933,7 @@ function restart_runtime_for_reload() { let status; let selector_state = capture_selector_state(); - log_message("Reload requires a full Forkop runtime restart", "info"); + log_message("Reload requires a full Tachyon runtime restart", "info"); status = stop_main(); if (status != 0) @@ -938,7 +946,7 @@ function restart_runtime_for_reload() { } status = module_status(STATE_UC, [ - "wait-forkop-stable-start", + "wait-tachyon-stable-start", RT_TABLE_NAME, NFT_TABLE_NAME, NFT_FAKEIP_MARK, @@ -946,7 +954,7 @@ function restart_runtime_for_reload() { "8" ]); if (status != 0) { - log_message("Reload runtime restart verification failed after Forkop was started; rolling back DNS changes", "fatal"); + log_message("Reload runtime restart verification failed after Tachyon was started; rolling back DNS changes", "fatal"); cleanup_failed_runtime(); return status; } @@ -1097,7 +1105,7 @@ function reload(reason) { let reload_config_fingerprint = external_config_fingerprint(); rule_condition_cache_enabled = force_runtime_reload; - log_message("Reloading Forkop", "info"); + log_message("Reloading Tachyon", "info"); status = validate_start_config(); if (status != 0) @@ -1107,8 +1115,8 @@ function reload(reason) { if (status != 0) return status; - if (!module_success(STATE_UC, [ "forkop-running", RT_TABLE_NAME, NFT_TABLE_NAME, NFT_FAKEIP_MARK ])) { - log_message("Runtime state is incomplete; restarting Forkop runtime", "info"); + if (!module_success(STATE_UC, [ "tachyon-running", RT_TABLE_NAME, NFT_TABLE_NAME, NFT_FAKEIP_MARK ])) { + log_message("Runtime state is incomplete; restarting Tachyon runtime", "info"); return finish_reload_status(restart_runtime_for_reload(), reload_config_fingerprint); } @@ -1139,11 +1147,11 @@ function reload(reason) { return abort_reload(status, false); } - let dnsmasq_managed_state = dnsmasq_has_forkop_managed_state() ? 1 : 0; + let dnsmasq_managed_state = dnsmasq_has_tachyon_managed_state() ? 1 : 0; let list_update_sources = module_success(STATE_UC, [ "has-list-update-sources" ]) ? 1 : 0; let nft_list_update_sources = module_success(STATE_UC, [ "has-nft-list-update-sources" ]) ? 1 : 0; let runtime_cache_needs_rebuild = 0; - if (as_string(getenv("FORKOP_RUNTIME_CACHE_INVALIDATED") || "0") == "1" || + if (as_string(getenv("TACHYON_RUNTIME_CACHE_INVALIDATED") || "0") == "1" || module_success(SUBSCRIPTION_CACHE_UC, [ "runtime-cache-needs-rebuild", SECTION_CACHE_DIR ])) runtime_cache_needs_rebuild = 1; @@ -1161,7 +1169,7 @@ function reload(reason) { if (plan_result.status != 0) { if (plan_result.status == 2) { - log_message("Reload state is unavailable; restarting Forkop runtime", "info"); + log_message("Reload state is unavailable; restarting Tachyon runtime", "info"); return finish_reload_status(restart_runtime_for_reload(), reload_config_fingerprint); } return abort_reload(plan_result.status, false); @@ -1227,7 +1235,7 @@ function reload(reason) { if (status != 0) return abort_reload(status, true); status = module_status(STATE_UC, [ - "wait-forkop-stable-start", + "wait-tachyon-stable-start", RT_TABLE_NAME, NFT_TABLE_NAME, NFT_FAKEIP_MARK, @@ -1235,7 +1243,7 @@ function reload(reason) { as_string(SING_BOX_START_VERIFY_TIMEOUT) ]); if (status != 0) { - log_message("Reload verification failed after sing-box was reloaded; stopping Forkop runtime", "fatal"); + log_message("Reload verification failed after sing-box was reloaded; stopping Tachyon runtime", "fatal"); cleanup_failed_runtime(); return status; } @@ -1299,7 +1307,7 @@ function reload(reason) { } function reload_tracked(reason) { - if (as_string(getenv("FORKOP_UI_ACTION_TRACKED") || "0") == "1") + if (as_string(getenv("TACHYON_UI_ACTION_TRACKED") || "0") == "1") return reload(reason); let job_id = trim(module_output(UI_UC, [ "service-action-begin-if-idle", "reload", "runtime_reload" ])); @@ -1314,7 +1322,7 @@ function reload_tracked(reason) { } function restart() { - log_message("Restarting Forkop", "info"); + log_message("Restarting Tachyon", "info"); let selector_state = capture_selector_state(); let status = stop_impl(); @@ -1328,7 +1336,7 @@ function restart() { } if (module_success(STATE_UC, [ - "forkop-stably-running", + "tachyon-stably-running", RT_TABLE_NAME, NFT_TABLE_NAME, NFT_FAKEIP_MARK, @@ -1338,7 +1346,7 @@ function restart() { return 0; } - log_message("Restart verification failed after Forkop was started; stopping Forkop runtime", "fatal"); + log_message("Restart verification failed after Tachyon was started; stopping Tachyon runtime", "fatal"); cleanup_failed_runtime(); return 1; } @@ -1356,7 +1364,7 @@ function package_manager_remove_if_installed(package_name) { } function uninstall() { - log_message("Uninstalling Forkop", "info"); + log_message("Uninstalling Tachyon", "info"); if (fs.stat(SERVICE_INIT) != null) { stop(); @@ -1365,13 +1373,13 @@ function uninstall() { dnsmasq_restore_fail_safe(); - if (fs.stat("/etc/init.d/forkop") != null) { - command_success_from_args([ "/etc/init.d/forkop", "stop" ]); - command_success_from_args([ "/etc/init.d/forkop", "disable" ]); + if (fs.stat("/etc/init.d/tachyon") != null) { + command_success_from_args([ "/etc/init.d/tachyon", "stop" ]); + command_success_from_args([ "/etc/init.d/tachyon", "disable" ]); } - package_manager_remove_if_installed("luci-i18n-forkop-ru"); - package_manager_remove_if_installed("luci-app-forkop"); + package_manager_remove_if_installed("luci-i18n-tachyon-ru"); + package_manager_remove_if_installed("luci-app-tachyon"); if (module_success(SINGBOX_UC, [ "managed-service-installed" ])) { module_success(SINGBOX_UC, [ "remove-managed-service-script" ]); @@ -1379,13 +1387,13 @@ function uninstall() { remove_file("/usr/lib/libcronet.so"); } - command_success_from_args([ "rm", "-rf", "/usr/lib/forkop" ]); + command_success_from_args([ "rm", "-rf", "/usr/lib/tachyon" ]); command_success_from_args([ "rm", "-rf", LUCI_VIEW_DIR ]); remove_file(SERVICE_INIT); remove_file(BIN_PATH); - remove_file("/usr/share/luci/menu.d/luci-app-forkop.json"); - remove_file("/usr/share/rpcd/acl.d/luci-app-forkop.json"); - remove_file("/etc/uci-defaults/50_luci-forkop"); + remove_file("/usr/share/luci/menu.d/luci-app-tachyon.json"); + remove_file("/usr/share/rpcd/acl.d/luci-app-tachyon.json"); + remove_file("/etc/uci-defaults/50_luci-tachyon"); command_success_from_args([ "find", "/usr/lib/lua/luci/i18n", "-maxdepth", "1", "-type", "f", "-name", LUCI_I18N_DOMAIN + ".*.lmo", "-delete" ]); remove_file("/usr/lib/lua/luci/i18n/" + LUCI_I18N_DOMAIN + ".ru.lua"); remove_file("/usr/lib/lua/luci/i18n/" + LUCI_I18N_DOMAIN + ".en.lua"); diff --git a/tachyon/files/usr/lib/service/package.uc b/tachyon/files/usr/lib/service/package.uc index 316edabd..066035e1 100644 --- a/tachyon/files/usr/lib/service/package.uc +++ b/tachyon/files/usr/lib/service/package.uc @@ -12,16 +12,16 @@ function env(name, fallback) { return value == null ? as_string(fallback) : as_string(value); } -const CONFIG_NAME = env("FORKOP_CONFIG_NAME", "forkop"); -const RT_TABLES_PATH = env("FORKOP_RT_TABLES", "/etc/iproute2/rt_tables"); -const BIN_PATH = env("FORKOP_BIN", "/usr/bin/forkop"); -const INIT_PATH = env("FORKOP_INIT", "/etc/init.d/forkop"); -const DNS_APPLY_UC = env("FORKOP_DNS_APPLY_UC", "/usr/lib/forkop/dns/apply.uc"); -const SING_BOX_INIT = env("FORKOP_SING_BOX_INIT", "/etc/init.d/sing-box"); -const SING_BOX_BIN = env("FORKOP_SING_BOX_BIN", "/usr/bin/sing-box"); -const SING_BOX_CRONET = env("FORKOP_SING_BOX_CRONET", "/usr/lib/libcronet.so"); -const SING_BOX_MANAGED_MARKER = env("SB_MANAGED_SERVICE_MARKER", "Forkop managed sing-box service for binary variants"); -const PACKAGE_TEST_MODE = env("FORKOP_PACKAGE_TEST_MODE", "") != ""; +const CONFIG_NAME = env("TACHYON_CONFIG_NAME", "tachyon"); +const RT_TABLES_PATH = env("TACHYON_RT_TABLES", "/etc/iproute2/rt_tables"); +const BIN_PATH = env("TACHYON_BIN", "/usr/bin/tachyon"); +const INIT_PATH = env("TACHYON_INIT", "/etc/init.d/tachyon"); +const DNS_APPLY_UC = env("TACHYON_DNS_APPLY_UC", "/usr/lib/tachyon/dns/apply.uc"); +const SING_BOX_INIT = env("TACHYON_SING_BOX_INIT", "/etc/init.d/sing-box"); +const SING_BOX_BIN = env("TACHYON_SING_BOX_BIN", "/usr/bin/sing-box"); +const SING_BOX_CRONET = env("TACHYON_SING_BOX_CRONET", "/usr/lib/libcronet.so"); +const SING_BOX_MANAGED_MARKER = env("SB_MANAGED_SERVICE_MARKER", "Tachyon managed sing-box service for binary variants"); +const PACKAGE_TEST_MODE = env("TACHYON_PACKAGE_TEST_MODE", "") != ""; function command_from_args(args) { let parts = []; @@ -56,7 +56,7 @@ function remove_rt_tables_entry() { let changed = false; let lines = []; for (let line in split(data, "\n")) { - if (index(line, "105 forkop") >= 0) { + if (index(line, "105 tachyon") >= 0) { changed = true; continue; } @@ -117,7 +117,7 @@ function prerm_cleanup() { } function luci_cache_globs() { - let configured = env("FORKOP_LUCI_CACHE_GLOBS", ""); + let configured = env("TACHYON_LUCI_CACHE_GLOBS", ""); if (configured != "") return split(configured, /[ \t\r\n]+/); @@ -140,7 +140,7 @@ function luci_postinst() { if (!PACKAGE_TEST_MODE) { if (path_exists("/etc/init.d/rpcd")) command_success_from_args([ "/etc/init.d/rpcd", "reload" ]); - command_success_from_args([ "logger", "-t", "forkop", "[info] Package defaults applied" ]); + command_success_from_args([ "logger", "-t", "tachyon", "[info] Package defaults applied" ]); } return true; } diff --git a/tachyon/files/usr/lib/service/state.uc b/tachyon/files/usr/lib/service/state.uc index 533863c7..f872b692 100644 --- a/tachyon/files/usr/lib/service/state.uc +++ b/tachyon/files/usr/lib/service/state.uc @@ -7,10 +7,10 @@ let connections = require("config.connections"); let zapret_validator = require("providers.zapret.validator"); let zapret2_validator = require("providers.zapret2.validator"); let byedpi_validator = require("providers.byedpi.validator"); -const CONFIG_NAME = getenv("FORKOP_CONFIG_NAME") || "forkop"; -const LIB_DIR = getenv("FORKOP_LIB") || "/usr/lib/forkop"; -const DEFAULT_PENDING_RELOAD_FILE = getenv("FORKOP_PENDING_RELOAD_FILE") || "/var/run/forkop/reload.pending"; -const DEFAULT_SERVICE_INIT = getenv("FORKOP_SERVICE_INIT") || "/etc/init.d/forkop"; +const CONFIG_NAME = getenv("TACHYON_CONFIG_NAME") || "tachyon"; +const LIB_DIR = getenv("TACHYON_LIB") || "/usr/lib/tachyon"; +const DEFAULT_PENDING_RELOAD_FILE = getenv("TACHYON_PENDING_RELOAD_FILE") || "/var/run/tachyon/reload.pending"; +const DEFAULT_SERVICE_INIT = getenv("TACHYON_SERVICE_INIT") || "/etc/init.d/tachyon"; const ZAPRET_DEFAULT_NFQWS_OPT = getenv("ZAPRET_DEFAULT_NFQWS_OPT") || ""; const ZAPRET2_DEFAULT_NFQWS2_OPT = getenv("ZAPRET2_DEFAULT_NFQWS2_OPT") || ""; const BYEDPI_DEFAULT_CMD_OPTS = getenv("BYEDPI_DEFAULT_CMD_OPTS") || ""; @@ -248,7 +248,7 @@ function run_pending_reload_if_requested(path, init_script) { if (!consume_pending_reload(path)) return; - command_success_from_args([ "logger", "-t", "forkop", "[info] Applying pending Forkop reload" ]); + command_success_from_args([ "logger", "-t", "tachyon", "[info] Applying pending Tachyon reload" ]); system(shell_quote(init_script) + " reload pending >/dev/null 2>&1 1000>&- &"); } @@ -344,7 +344,7 @@ function cleanup_rule_condition_cache(path) { path = as_string(path); if (path != "") command_success_from_args([ "rm", "-rf", path ]); - system("rm -rf /tmp/forkop-rule-cache.* >/dev/null 2>&1"); + system("rm -rf /tmp/tachyon-rule-cache.* >/dev/null 2>&1"); } function cleanup_reload_state_snapshots(path) { @@ -439,7 +439,7 @@ function hup_sing_box_runtime() { if (pid <= 0 || !pid_is_sing_box(pid)) exit(1); - command_success_from_args([ "logger", "-t", "forkop", "[info] Applying DNS failover with sing-box SIGHUP reload" ]); + command_success_from_args([ "logger", "-t", "tachyon", "[info] Applying DNS failover with sing-box SIGHUP reload" ]); if (!command_success_from_args([ "kill", "-HUP", as_string(pid) ])) exit(1); } @@ -509,15 +509,15 @@ function sing_box_reload_previous_pid(previous_pid, config_hash_before, config_h function reload_sing_box_runtime(previous_pid, config_hash_before, config_hash_after) { previous_pid = sing_box_reload_previous_pid(previous_pid, config_hash_before, config_hash_after); - command_success_from_args([ "logger", "-t", "forkop", "[info] Reloading sing-box runtime" ]); + command_success_from_args([ "logger", "-t", "tachyon", "[info] Reloading sing-box runtime" ]); if (!command_success_from_args([ "/etc/init.d/sing-box", "reload" ])) { - command_success_from_args([ "logger", "-t", "forkop", "[fatal] Failed to reload sing-box. Aborted." ]); + command_success_from_args([ "logger", "-t", "tachyon", "[fatal] Failed to reload sing-box. Aborted." ]); exit(1); } - let timeout = getenv("FORKOP_SING_BOX_RELOAD_PID_TIMEOUT") || "15"; + let timeout = getenv("TACHYON_SING_BOX_RELOAD_PID_TIMEOUT") || "15"; if (previous_pid > 0 && !wait_sing_box_pid_replacement(previous_pid, timeout)) { - command_success_from_args([ "logger", "-t", "forkop", "[fatal] sing-box reload did not replace the running process. Aborted." ]); + command_success_from_args([ "logger", "-t", "tachyon", "[fatal] sing-box reload did not replace the running process. Aborted." ]); exit(1); } } @@ -538,23 +538,23 @@ function sing_box_service_stable(min_age) { return age != null && age >= min_age; } -function forkop_runtime_network_configured(rt_table, nft_table, mark) { +function tachyon_runtime_network_configured(rt_table, nft_table, mark) { return command_success_from_args([ "nft", "list", "table", "inet", nft_table ]) && command_success_from_args([ "ucode", "-L", LIB_DIR, LIB_DIR + "/nft/apply.uc", "tproxy-route-rule-present", rt_table, mark ]); } -function forkop_running(rt_table, nft_table, mark) { - return sing_box_service_running() && forkop_runtime_network_configured(rt_table, nft_table, mark); +function tachyon_running(rt_table, nft_table, mark) { + return sing_box_service_running() && tachyon_runtime_network_configured(rt_table, nft_table, mark); } -function forkop_stably_running(rt_table, nft_table, mark, min_age) { - return sing_box_service_stable(min_age) && forkop_runtime_network_configured(rt_table, nft_table, mark); +function tachyon_stably_running(rt_table, nft_table, mark, min_age) { + return sing_box_service_stable(min_age) && tachyon_runtime_network_configured(rt_table, nft_table, mark); } -function wait_forkop_stable_start(rt_table, nft_table, mark, min_age, timeout) { +function wait_tachyon_stable_start(rt_table, nft_table, mark, min_age, timeout) { timeout = int(timeout || 8); while (timeout > 0) { - if (forkop_stably_running(rt_table, nft_table, mark, min_age)) + if (tachyon_stably_running(rt_table, nft_table, mark, min_age)) return true; command_success_from_args([ "sleep", "1" ]); @@ -798,10 +798,10 @@ function dnsmasq_signature_body(settings, dnsmasq, legacy_dnsmasq_present) { body = signature_add_value(body, "dhcp.@dnsmasq[0].server", option(dnsmasq, "server", "")); body = signature_add_value(body, "dhcp.@dnsmasq[0].noresolv", option(dnsmasq, "noresolv", "")); body = signature_add_value(body, "dhcp.@dnsmasq[0].cachesize", option(dnsmasq, "cachesize", "")); - body = signature_add_value(body, "dhcp.@dnsmasq[0].forkop_server", option(dnsmasq, "forkop_server", "")); - body = signature_add_value(body, "dhcp.@dnsmasq[0].forkop_noresolv", option(dnsmasq, "forkop_noresolv", "")); - body = signature_add_value(body, "dhcp.@dnsmasq[0].forkop_cachesize", option(dnsmasq, "forkop_cachesize", "")); - body = signature_add_value(body, "dhcp.forkop.present", arg_bool(legacy_dnsmasq_present) ? "1" : "0"); + body = signature_add_value(body, "dhcp.@dnsmasq[0].tachyon_server", option(dnsmasq, "tachyon_server", "")); + body = signature_add_value(body, "dhcp.@dnsmasq[0].tachyon_noresolv", option(dnsmasq, "tachyon_noresolv", "")); + body = signature_add_value(body, "dhcp.@dnsmasq[0].tachyon_cachesize", option(dnsmasq, "tachyon_cachesize", "")); + body = signature_add_value(body, "dhcp.tachyon.present", arg_bool(legacy_dnsmasq_present) ? "1" : "0"); return body; } @@ -1652,9 +1652,9 @@ function uci_dnsmasq() { server: uci_get("dhcp.@dnsmasq[0].server"), noresolv: uci_get("dhcp.@dnsmasq[0].noresolv"), cachesize: uci_get("dhcp.@dnsmasq[0].cachesize"), - forkop_server: uci_get("dhcp.@dnsmasq[0].forkop_server"), - forkop_noresolv: uci_get("dhcp.@dnsmasq[0].forkop_noresolv"), - forkop_cachesize: uci_get("dhcp.@dnsmasq[0].forkop_cachesize") + tachyon_server: uci_get("dhcp.@dnsmasq[0].tachyon_server"), + tachyon_noresolv: uci_get("dhcp.@dnsmasq[0].tachyon_noresolv"), + tachyon_cachesize: uci_get("dhcp.@dnsmasq[0].tachyon_cachesize") }; } @@ -1668,7 +1668,7 @@ function current_reload_state_values(format) { sections, uci_servers(), uci_dnsmasq(), - uci_exists("dhcp.forkop"), + uci_exists("dhcp.tachyon"), mwan3_active() ); } @@ -1787,12 +1787,12 @@ else if (mode == "sing-box-pid-replaced-fixture") exit(sing_box_pid_replaced(ARGV[1], ARGV[2], ARGV[3]) ? 0 : 1); else if (mode == "sing-box-reload-previous-pid-fixture") print(sing_box_reload_previous_pid(ARGV[1], ARGV[2], ARGV[3]), "\n"); -else if (mode == "forkop-running") - exit(forkop_running(ARGV[1], ARGV[2], ARGV[3]) ? 0 : 1); -else if (mode == "forkop-stably-running") - exit(forkop_stably_running(ARGV[1], ARGV[2], ARGV[3], ARGV[4]) ? 0 : 1); -else if (mode == "wait-forkop-stable-start") - exit(wait_forkop_stable_start(ARGV[1], ARGV[2], ARGV[3], ARGV[4], ARGV[5]) ? 0 : 1); +else if (mode == "tachyon-running") + exit(tachyon_running(ARGV[1], ARGV[2], ARGV[3]) ? 0 : 1); +else if (mode == "tachyon-stably-running") + exit(tachyon_stably_running(ARGV[1], ARGV[2], ARGV[3], ARGV[4]) ? 0 : 1); +else if (mode == "wait-tachyon-stable-start") + exit(wait_tachyon_stable_start(ARGV[1], ARGV[2], ARGV[3], ARGV[4], ARGV[5]) ? 0 : 1); else if (mode == "list-has-remote-references" || mode == "list-has-remote-sing-box-rulesets") exit(list_has_remote_references(ARGV[1]) ? 0 : 1); else if (mode == "community-service-has-subnet-list") @@ -1812,7 +1812,7 @@ else if (mode == "service-trigger-signature-fixture") { exit(print_signature_hash(service_trigger_signature_body(fixture_settings(data))) ? 0 : 1); } else if (mode == "dnsmasq-signature") - exit(print_signature_hash(dnsmasq_signature_body(uci_settings(), uci_dnsmasq(), uci_exists("dhcp.forkop"))) ? 0 : 1); + exit(print_signature_hash(dnsmasq_signature_body(uci_settings(), uci_dnsmasq(), uci_exists("dhcp.tachyon"))) ? 0 : 1); else if (mode == "dnsmasq-signature-fixture") { let data = fixture_data(ARGV[1]); exit(print_signature_hash(dnsmasq_signature_body(fixture_settings(data), fixture_dnsmasq(data), fixture_legacy_dnsmasq_present(data))) ? 0 : 1); diff --git a/tachyon/files/usr/lib/service/ui.uc b/tachyon/files/usr/lib/service/ui.uc index 9090fdbc..d64a73be 100644 --- a/tachyon/files/usr/lib/service/ui.uc +++ b/tachyon/files/usr/lib/service/ui.uc @@ -3,31 +3,31 @@ let fs = require("fs"); let uci_core = require("core.uci"); -const CONFIG_NAME = getenv("FORKOP_CONFIG_NAME") || "forkop"; -const LIB_DIR = getenv("FORKOP_LIB") || "/usr/lib/forkop"; -const BIN_PATH = getenv("FORKOP_BIN") || "/usr/bin/forkop"; -const SERVICE_INIT = getenv("FORKOP_SERVICE_INIT") || "/etc/init.d/forkop"; -const SERVICE_NAME = getenv("FORKOP_SERVICE_NAME") || "forkop"; +const CONFIG_NAME = getenv("TACHYON_CONFIG_NAME") || "tachyon"; +const LIB_DIR = getenv("TACHYON_LIB") || "/usr/lib/tachyon"; +const BIN_PATH = getenv("TACHYON_BIN") || "/usr/bin/tachyon"; +const SERVICE_INIT = getenv("TACHYON_SERVICE_INIT") || "/etc/init.d/tachyon"; +const SERVICE_NAME = getenv("TACHYON_SERVICE_NAME") || "tachyon"; const STATE_UC = LIB_DIR + "/service/state.uc"; const UI_UC = LIB_DIR + "/service/ui.uc"; -const STATE_DIR = getenv("FORKOP_UI_STATE_DIR") || "/var/run/forkop/ui-state"; -const PENDING_RELOAD_FILE = getenv("FORKOP_PENDING_RELOAD_FILE") || "/var/run/forkop/reload.pending"; -const SERVICE_ACTION_DIR = getenv("FORKOP_UI_SERVICE_ACTION_DIR") || STATE_DIR + "/service-actions"; -const SERVICE_ACTION_LOCK_DIR = getenv("FORKOP_UI_SERVICE_ACTION_LOCK_DIR") || STATE_DIR + "/service-actions.lock"; -const LATENCY_ACTION_DIR = getenv("FORKOP_UI_LATENCY_ACTION_DIR") || STATE_DIR + "/latency-actions"; -const COMPONENT_ACTION_DIR = getenv("FORKOP_UI_COMPONENT_ACTION_DIR") || getenv("UPDATES_JOB_DIR") || "/var/run/forkop/component-actions"; -const SUBSCRIPTION_ACTION_DIR = getenv("FORKOP_UI_SUBSCRIPTION_ACTION_DIR") || getenv("FORKOP_SUBSCRIPTION_UPDATE_JOB_DIR") || "/var/run/forkop/subscription-update-jobs"; -const SING_BOX_VERSION_CACHE_FILE = getenv("FORKOP_UI_SING_BOX_VERSION_CACHE_FILE") || STATE_DIR + "/sing-box-version"; -const SING_BOX_VERSION_STATE_FILE = getenv("FORKOP_UI_SING_BOX_VERSION_STATE_FILE") || "/etc/forkop/sing-box-version"; -const SING_BOX_VARIANT_STATE_FILE = getenv("FORKOP_UI_SING_BOX_VARIANT_STATE_FILE") || "/etc/forkop/sing-box-variant"; -const ACTION_FINISHED_TTL_MINUTES = getenv("FORKOP_UI_ACTION_FINISHED_TTL_MINUTES") || "60"; -const ACTION_ACKED_TTL_SECONDS = getenv("FORKOP_UI_ACTION_ACKED_TTL_SECONDS") || "15"; -const ACTION_STALE_GRACE_SECONDS = getenv("FORKOP_UI_ACTION_STALE_GRACE_SECONDS") || "15"; -const SERVICE_ACTION_TIMEOUT_SECONDS = getenv("FORKOP_UI_SERVICE_ACTION_TIMEOUT_SECONDS") || "120"; -const SERVICE_ACTION_SETTLE_SECONDS = getenv("FORKOP_UI_SERVICE_ACTION_SETTLE_SECONDS") || "2"; -const RUNTIME_STABLE_MIN_AGE = getenv("FORKOP_RUNTIME_STABLE_MIN_AGE") || "2"; -const NFT_TABLE_NAME = getenv("NFT_TABLE_NAME") || "ForkopTable"; -const RT_TABLE_NAME = getenv("RT_TABLE_NAME") || "forkop"; +const STATE_DIR = getenv("TACHYON_UI_STATE_DIR") || "/var/run/tachyon/ui-state"; +const PENDING_RELOAD_FILE = getenv("TACHYON_PENDING_RELOAD_FILE") || "/var/run/tachyon/reload.pending"; +const SERVICE_ACTION_DIR = getenv("TACHYON_UI_SERVICE_ACTION_DIR") || STATE_DIR + "/service-actions"; +const SERVICE_ACTION_LOCK_DIR = getenv("TACHYON_UI_SERVICE_ACTION_LOCK_DIR") || STATE_DIR + "/service-actions.lock"; +const LATENCY_ACTION_DIR = getenv("TACHYON_UI_LATENCY_ACTION_DIR") || STATE_DIR + "/latency-actions"; +const COMPONENT_ACTION_DIR = getenv("TACHYON_UI_COMPONENT_ACTION_DIR") || getenv("UPDATES_JOB_DIR") || "/var/run/tachyon/component-actions"; +const SUBSCRIPTION_ACTION_DIR = getenv("TACHYON_UI_SUBSCRIPTION_ACTION_DIR") || getenv("TACHYON_SUBSCRIPTION_UPDATE_JOB_DIR") || "/var/run/tachyon/subscription-update-jobs"; +const SING_BOX_VERSION_CACHE_FILE = getenv("TACHYON_UI_SING_BOX_VERSION_CACHE_FILE") || STATE_DIR + "/sing-box-version"; +const SING_BOX_VERSION_STATE_FILE = getenv("TACHYON_UI_SING_BOX_VERSION_STATE_FILE") || "/etc/tachyon/sing-box-version"; +const SING_BOX_VARIANT_STATE_FILE = getenv("TACHYON_UI_SING_BOX_VARIANT_STATE_FILE") || "/etc/tachyon/sing-box-variant"; +const ACTION_FINISHED_TTL_MINUTES = getenv("TACHYON_UI_ACTION_FINISHED_TTL_MINUTES") || "60"; +const ACTION_ACKED_TTL_SECONDS = getenv("TACHYON_UI_ACTION_ACKED_TTL_SECONDS") || "15"; +const ACTION_STALE_GRACE_SECONDS = getenv("TACHYON_UI_ACTION_STALE_GRACE_SECONDS") || "15"; +const SERVICE_ACTION_TIMEOUT_SECONDS = getenv("TACHYON_UI_SERVICE_ACTION_TIMEOUT_SECONDS") || "120"; +const SERVICE_ACTION_SETTLE_SECONDS = getenv("TACHYON_UI_SERVICE_ACTION_SETTLE_SECONDS") || "2"; +const RUNTIME_STABLE_MIN_AGE = getenv("TACHYON_RUNTIME_STABLE_MIN_AGE") || "2"; +const NFT_TABLE_NAME = getenv("NFT_TABLE_NAME") || "TachyonTable"; +const RT_TABLE_NAME = getenv("RT_TABLE_NAME") || "tachyon"; const NFT_FAKEIP_MARK = getenv("NFT_FAKEIP_MARK") || "0x00100000"; const SB_DNS_INBOUND_ADDRESS = getenv("SB_DNS_INBOUND_ADDRESS") || "127.0.0.42"; const ZAPRET_PROVIDER_NFQWS_BIN = getenv("ZAPRET_PROVIDER_NFQWS_BIN") || "/opt/zapret/nfq/nfqws"; @@ -271,27 +271,27 @@ function print_service_status_text(running, enabled) { function ui_state_json() { let action_state = read_state_paths(); - let forkop_running = arg_number(ARGV[1]); - let forkop_enabled = arg_number(ARGV[2]); - let forkop_status = as_string(ARGV[3]); - let forkop_dns_configured = arg_number(ARGV[4]); + let tachyon_running = arg_number(ARGV[1]); + let tachyon_enabled = arg_number(ARGV[2]); + let tachyon_status = as_string(ARGV[3]); + let tachyon_dns_configured = arg_number(ARGV[4]); let sing_box_running = arg_number(ARGV[5]); let sing_box_enabled = arg_number(ARGV[6]); let sing_box_status = as_string(ARGV[7]); - if (forkop_status == "") - forkop_status = service_status_text(forkop_running, forkop_enabled); + if (tachyon_status == "") + tachyon_status = service_status_text(tachyon_running, tachyon_enabled); if (sing_box_status == "") sing_box_status = service_status_text(sing_box_running, sing_box_enabled); write_json({ service: { - forkop: { - running: forkop_running, - enabled: forkop_enabled, - status: forkop_status, - dns_configured: forkop_dns_configured + tachyon: { + running: tachyon_running, + enabled: tachyon_enabled, + status: tachyon_status, + dns_configured: tachyon_dns_configured }, sing_box: { running: sing_box_running, @@ -820,9 +820,9 @@ function sing_box_running() { ]); } -function forkop_running() { +function tachyon_running() { return module_success(LIB_DIR + "/service/state.uc", [ - "forkop-stably-running", + "tachyon-stably-running", RT_TABLE_NAME, NFT_TABLE_NAME, NFT_FAKEIP_MARK, @@ -978,29 +978,29 @@ function current_ui_state_json() { refresh_action_dirs(); let capabilities = capability_flags(); - let forkop_is_running = forkop_running() ? 1 : 0; - let forkop_is_enabled = service_enabled() ? 1 : 0; + let tachyon_is_running = tachyon_running() ? 1 : 0; + let tachyon_is_enabled = service_enabled() ? 1 : 0; let sing_box_is_running = sing_box_running() ? 1 : 0; let sing_box_is_enabled = sing_box_enabled() ? 1 : 0; - let forkop_status = service_status_text(forkop_is_running, forkop_is_enabled); + let tachyon_status = service_status_text(tachyon_is_running, tachyon_is_enabled); let sing_box_status = service_status_text(sing_box_is_running, sing_box_is_enabled); let active_action = active_service_action_value(); if (active_action == "start") - forkop_status = "starting"; + tachyon_status = "starting"; else if (active_action == "stop") - forkop_status = "stopping"; + tachyon_status = "stopping"; else if (active_action == "restart") - forkop_status = "restarting"; + tachyon_status = "restarting"; else if (active_action == "reload") - forkop_status = "reloading"; + tachyon_status = "reloading"; write_json({ service: { - forkop: { - running: forkop_is_running, - enabled: forkop_is_enabled, - status: forkop_status, + tachyon: { + running: tachyon_is_running, + enabled: tachyon_is_enabled, + status: tachyon_status, dns_configured: dns_configured() ? 1 : 0 }, sing_box: { @@ -1027,7 +1027,7 @@ function service_action_reached_expected_state(action) { let expected = service_action_expected_running_value(action); if (expected < 0) return false; - return expected == 1 ? forkop_running() : !forkop_running(); + return expected == 1 ? tachyon_running() : !tachyon_running(); } function service_action_wait_for_expected_state(action, timeout, settle_seconds) { @@ -1103,26 +1103,26 @@ function launch_worker(args) { push(command_args, arg); let command = command_env({ - FORKOP_CONFIG_NAME: CONFIG_NAME, - FORKOP_LIB: LIB_DIR, - FORKOP_BIN: BIN_PATH, - FORKOP_SERVICE_INIT: SERVICE_INIT, - FORKOP_SERVICE_NAME: SERVICE_NAME, - FORKOP_UI_STATE_DIR: STATE_DIR, - FORKOP_UI_SERVICE_ACTION_DIR: SERVICE_ACTION_DIR, - FORKOP_UI_SERVICE_ACTION_LOCK_DIR: SERVICE_ACTION_LOCK_DIR, - FORKOP_UI_LATENCY_ACTION_DIR: LATENCY_ACTION_DIR, - FORKOP_UI_COMPONENT_ACTION_DIR: COMPONENT_ACTION_DIR, - FORKOP_UI_SUBSCRIPTION_ACTION_DIR: SUBSCRIPTION_ACTION_DIR, - FORKOP_UI_SING_BOX_VERSION_CACHE_FILE: SING_BOX_VERSION_CACHE_FILE, - FORKOP_UI_SING_BOX_VERSION_STATE_FILE: SING_BOX_VERSION_STATE_FILE, - FORKOP_UI_SING_BOX_VARIANT_STATE_FILE: SING_BOX_VARIANT_STATE_FILE, - FORKOP_UI_ACTION_FINISHED_TTL_MINUTES: ACTION_FINISHED_TTL_MINUTES, - FORKOP_UI_ACTION_ACKED_TTL_SECONDS: ACTION_ACKED_TTL_SECONDS, - FORKOP_UI_ACTION_STALE_GRACE_SECONDS: ACTION_STALE_GRACE_SECONDS, - FORKOP_UI_SERVICE_ACTION_TIMEOUT_SECONDS: SERVICE_ACTION_TIMEOUT_SECONDS, - FORKOP_UI_SERVICE_ACTION_SETTLE_SECONDS: SERVICE_ACTION_SETTLE_SECONDS, - FORKOP_PENDING_RELOAD_FILE: PENDING_RELOAD_FILE, + TACHYON_CONFIG_NAME: CONFIG_NAME, + TACHYON_LIB: LIB_DIR, + TACHYON_BIN: BIN_PATH, + TACHYON_SERVICE_INIT: SERVICE_INIT, + TACHYON_SERVICE_NAME: SERVICE_NAME, + TACHYON_UI_STATE_DIR: STATE_DIR, + TACHYON_UI_SERVICE_ACTION_DIR: SERVICE_ACTION_DIR, + TACHYON_UI_SERVICE_ACTION_LOCK_DIR: SERVICE_ACTION_LOCK_DIR, + TACHYON_UI_LATENCY_ACTION_DIR: LATENCY_ACTION_DIR, + TACHYON_UI_COMPONENT_ACTION_DIR: COMPONENT_ACTION_DIR, + TACHYON_UI_SUBSCRIPTION_ACTION_DIR: SUBSCRIPTION_ACTION_DIR, + TACHYON_UI_SING_BOX_VERSION_CACHE_FILE: SING_BOX_VERSION_CACHE_FILE, + TACHYON_UI_SING_BOX_VERSION_STATE_FILE: SING_BOX_VERSION_STATE_FILE, + TACHYON_UI_SING_BOX_VARIANT_STATE_FILE: SING_BOX_VARIANT_STATE_FILE, + TACHYON_UI_ACTION_FINISHED_TTL_MINUTES: ACTION_FINISHED_TTL_MINUTES, + TACHYON_UI_ACTION_ACKED_TTL_SECONDS: ACTION_ACKED_TTL_SECONDS, + TACHYON_UI_ACTION_STALE_GRACE_SECONDS: ACTION_STALE_GRACE_SECONDS, + TACHYON_UI_SERVICE_ACTION_TIMEOUT_SECONDS: SERVICE_ACTION_TIMEOUT_SECONDS, + TACHYON_UI_SERVICE_ACTION_SETTLE_SECONDS: SERVICE_ACTION_SETTLE_SECONDS, + TACHYON_PENDING_RELOAD_FILE: PENDING_RELOAD_FILE, NFT_TABLE_NAME, RT_TABLE_NAME, NFT_FAKEIP_MARK, @@ -1189,7 +1189,7 @@ function run_pending_reload_after_service_action(action, success) { if (!consume_pending_reload()) return; - command_success_from_args([ "logger", "-t", SERVICE_NAME, "[info] Applying pending Forkop reload" ]); + command_success_from_args([ "logger", "-t", SERVICE_NAME, "[info] Applying pending Tachyon reload" ]); let started = start_service_action("reload", "initd", "pending"); if (!started.success) mark_pending_reload("pending"); @@ -1216,7 +1216,7 @@ function finish_service_action_after_command(action, job_id_value, status, spawn return 0; } - if (!service_enabled() && !forkop_running()) { + if (!service_enabled() && !tachyon_running()) { write_finished_service_action_state(path, action, true, "Service " + as_string(action) + " completed", 0); return 0; } @@ -1249,7 +1249,7 @@ function service_action_worker(path, action, job_id_value, reason) { reason = as_string(reason || ""); if (reason != "") push(args, reason); - let command = "FORKOP_UI_ACTION_TRACKED=1 " + command_from_args(args) + " >/dev/null 2>&1"; + let command = "TACHYON_UI_ACTION_TRACKED=1 " + command_from_args(args) + " >/dev/null 2>&1"; let status = command_status(command); finish_service_action_after_command(action, job_id_value, status, false); } diff --git a/tachyon/files/usr/lib/singbox/country.uc b/tachyon/files/usr/lib/singbox/country.uc index 3f84896c..008f485c 100644 --- a/tachyon/files/usr/lib/singbox/country.uc +++ b/tachyon/files/usr/lib/singbox/country.uc @@ -7,7 +7,7 @@ let as_string = common.as_string; let array_or_empty = common.array_or_empty; let object_or_empty = common.object_or_empty; -const COUNTRY_IS_URL = getenv("FORKOP_COUNTRY_IS_URL") || "https://api.country.is/"; +const COUNTRY_IS_URL = getenv("TACHYON_COUNTRY_IS_URL") || "https://api.country.is/"; const COUNTRY_IS_BATCH_SIZE = 100; let shell_quote = common.shell_quote; diff --git a/tachyon/files/usr/lib/singbox/dns.uc b/tachyon/files/usr/lib/singbox/dns.uc index be40fb72..4f34a44a 100644 --- a/tachyon/files/usr/lib/singbox/dns.uc +++ b/tachyon/files/usr/lib/singbox/dns.uc @@ -12,9 +12,9 @@ let object_or_empty = common.object_or_empty; let option = common.option; let read_json_file = common.read_json_file; -const DNS_FAILOVER_STATE_FILE = getenv("FORKOP_DNS_FAILOVER_STATE_FILE") || "/var/run/forkop/dns-failover.json"; -const DNS_HEALTH_ADDRESS = getenv("FORKOP_DNS_HEALTH_ADDRESS") || "127.0.0.42"; -const DNS_HEALTH_PORT_BASE = int(getenv("FORKOP_DNS_HEALTH_PORT_BASE") || "10053"); +const DNS_FAILOVER_STATE_FILE = getenv("TACHYON_DNS_FAILOVER_STATE_FILE") || "/var/run/tachyon/dns-failover.json"; +const DNS_HEALTH_ADDRESS = getenv("TACHYON_DNS_HEALTH_ADDRESS") || "127.0.0.42"; +const DNS_HEALTH_PORT_BASE = int(getenv("TACHYON_DNS_HEALTH_PORT_BASE") || "10053"); function server_list(settings, key, fallback) { let result = []; diff --git a/tachyon/files/usr/lib/singbox/dns_failover.uc b/tachyon/files/usr/lib/singbox/dns_failover.uc index fb271ba8..5f4d63a9 100644 --- a/tachyon/files/usr/lib/singbox/dns_failover.uc +++ b/tachyon/files/usr/lib/singbox/dns_failover.uc @@ -6,13 +6,13 @@ let common = require("core.common"); let core_ip = require("core.ip"); let runtime_dns = require("singbox.dns"); -const CONFIG_NAME = getenv("FORKOP_CONFIG_NAME") || "forkop"; -const LIB_DIR = getenv("FORKOP_LIB") || "/usr/lib/forkop"; -const RUNTIME_STATE_DIR = getenv("FORKOP_RUNTIME_STATE_DIR") || "/var/run/forkop"; -const STATE_FILE = getenv("FORKOP_DNS_FAILOVER_STATE_FILE") || RUNTIME_STATE_DIR + "/dns-failover.json"; -const PID_FILE = getenv("FORKOP_DNS_FAILOVER_PID_FILE") || RUNTIME_STATE_DIR + "/dns-failover.pid"; -const DNS_FAILOVER_UC = getenv("FORKOP_DNS_FAILOVER_UC") || LIB_DIR + "/singbox/dns_failover.uc"; -const SERVICE_BIN = getenv("FORKOP_BIN") || "/usr/bin/forkop"; +const CONFIG_NAME = getenv("TACHYON_CONFIG_NAME") || "tachyon"; +const LIB_DIR = getenv("TACHYON_LIB") || "/usr/lib/tachyon"; +const RUNTIME_STATE_DIR = getenv("TACHYON_RUNTIME_STATE_DIR") || "/var/run/tachyon"; +const STATE_FILE = getenv("TACHYON_DNS_FAILOVER_STATE_FILE") || RUNTIME_STATE_DIR + "/dns-failover.json"; +const PID_FILE = getenv("TACHYON_DNS_FAILOVER_PID_FILE") || RUNTIME_STATE_DIR + "/dns-failover.pid"; +const DNS_FAILOVER_UC = getenv("TACHYON_DNS_FAILOVER_UC") || LIB_DIR + "/singbox/dns_failover.uc"; +const SERVICE_BIN = getenv("TACHYON_BIN") || "/usr/bin/tachyon"; const CHECK_DOMAIN = "example.com"; let as_string = common.as_string; @@ -74,7 +74,7 @@ function write_state(path, value) { } function log_message(message, level) { - command_success_from_args([ "logger", "-t", "forkop", "[" + as_string(level || "info") + "] DNS failover: " + as_string(message) ]); + command_success_from_args([ "logger", "-t", "tachyon", "[" + as_string(level || "info") + "] DNS failover: " + as_string(message) ]); } function duration_milliseconds(value, fallback) { diff --git a/tachyon/files/usr/lib/singbox/generator.uc b/tachyon/files/usr/lib/singbox/generator.uc index ecf79bdb..1463e2fd 100644 --- a/tachyon/files/usr/lib/singbox/generator.uc +++ b/tachyon/files/usr/lib/singbox/generator.uc @@ -47,7 +47,7 @@ let url_userinfo = runtime_url.userinfo; let url_path = runtime_url.path; let url_query_params = runtime_url.query_params; -const CONFIG_NAME = "forkop"; +const CONFIG_NAME = "tachyon"; function parent_dir(path) { path = as_string(path); @@ -198,13 +198,13 @@ function subscription_group_outbound(outbound) { if (type(outbound) != "object") return false; let t = as_string(outbound.type); - return (t == "selector" || t == "urltest") && internal_flag(outbound.__forkop_allow_group); + return (t == "selector" || t == "urltest") && internal_flag(outbound.__tachyon_allow_group); } function subscription_urltest_group_outbound(outbound) { if (type(outbound) != "object") return false; - return as_string(outbound.type || "") == "urltest" && internal_flag(outbound.__forkop_allow_group); + return as_string(outbound.type || "") == "urltest" && internal_flag(outbound.__tachyon_allow_group); } function subscription_outbound_tag(outbound) { @@ -251,7 +251,7 @@ function subscription_hidden_outbound(outbound, refs, hide_urltest_group_outboun return true; if (hidden_by_detour && hide_detour_outbounds !== false) return true; - return internal_flag(outbound.__forkop_hidden) && !hidden_by_urltest && !hidden_by_detour; + return internal_flag(outbound.__tachyon_hidden) && !hidden_by_urltest && !hidden_by_detour; } function tag(base, postfix) { @@ -610,7 +610,7 @@ function copy_subscription_outbound(outbound, new_tag) { let copy = {}; for (let key, value in outbound) { if (key != "tag" && key != "remark" && key != "share_link" && - key != "__forkop_hidden" && key != "__forkop_allow_group") + key != "__tachyon_hidden" && key != "__tachyon_allow_group") copy[key] = value; } if (as_string(copy.type || "") == "hysteria2" && diff --git a/tachyon/files/usr/lib/singbox/priority.uc b/tachyon/files/usr/lib/singbox/priority.uc index 69192df9..77a615ac 100644 --- a/tachyon/files/usr/lib/singbox/priority.uc +++ b/tachyon/files/usr/lib/singbox/priority.uc @@ -9,12 +9,12 @@ let write_json = common.write_json; let array_or_empty = common.array_or_empty; let object_or_empty = common.object_or_empty; -const LIB_DIR = getenv("FORKOP_LIB") || "/usr/lib/forkop"; -const RUNTIME_STATE_DIR = getenv("FORKOP_RUNTIME_STATE_DIR") || "/var/run/forkop"; -const SECTION_CACHE_DIR = getenv("FORKOP_SECTION_CACHE_DIR") || RUNTIME_STATE_DIR + "/section-cache"; -const PRIORITY_PID_FILE = getenv("FORKOP_PRIORITY_PID_FILE") || RUNTIME_STATE_DIR + "/priority.pid"; -const PRIORITY_UC = getenv("FORKOP_PRIORITY_UC") || LIB_DIR + "/singbox/priority.uc"; -const DIAGNOSTICS_UC = getenv("FORKOP_DIAGNOSTICS_UC") || LIB_DIR + "/diagnostics/runtime.uc"; +const LIB_DIR = getenv("TACHYON_LIB") || "/usr/lib/tachyon"; +const RUNTIME_STATE_DIR = getenv("TACHYON_RUNTIME_STATE_DIR") || "/var/run/tachyon"; +const SECTION_CACHE_DIR = getenv("TACHYON_SECTION_CACHE_DIR") || RUNTIME_STATE_DIR + "/section-cache"; +const PRIORITY_PID_FILE = getenv("TACHYON_PRIORITY_PID_FILE") || RUNTIME_STATE_DIR + "/priority.pid"; +const PRIORITY_UC = getenv("TACHYON_PRIORITY_UC") || LIB_DIR + "/singbox/priority.uc"; +const DIAGNOSTICS_UC = getenv("TACHYON_DIAGNOSTICS_UC") || LIB_DIR + "/diagnostics/runtime.uc"; let shell_quote = common.shell_quote; @@ -72,7 +72,7 @@ function file_first_line(path) { function log_message(message, level) { level = as_string(level || "info"); - command_success_from_args([ "logger", "-t", "forkop", "[" + level + "] priority: " + as_string(message) ]); + command_success_from_args([ "logger", "-t", "tachyon", "[" + level + "] priority: " + as_string(message) ]); } function now_seconds() { diff --git a/tachyon/files/usr/lib/singbox/runtime.uc b/tachyon/files/usr/lib/singbox/runtime.uc index 46c0820c..0f69f154 100644 --- a/tachyon/files/usr/lib/singbox/runtime.uc +++ b/tachyon/files/usr/lib/singbox/runtime.uc @@ -5,38 +5,38 @@ let uci_core = require("core.uci"); let common = require("core.common"); let runtime_dns = require("singbox.dns"); -const CONFIG_NAME = getenv("FORKOP_CONFIG_NAME") || "forkop"; -const LIB_DIR = getenv("FORKOP_LIB") || "/usr/lib/forkop"; +const CONFIG_NAME = getenv("TACHYON_CONFIG_NAME") || "tachyon"; +const LIB_DIR = getenv("TACHYON_LIB") || "/usr/lib/tachyon"; const TMP_SING_BOX_FOLDER = getenv("TMP_SING_BOX_FOLDER") || "/tmp/sing-box"; const TMP_RULESET_FOLDER = getenv("TMP_RULESET_FOLDER") || TMP_SING_BOX_FOLDER + "/rulesets"; const TMP_SUBSCRIPTION_FOLDER = getenv("TMP_SUBSCRIPTION_FOLDER") || TMP_SING_BOX_FOLDER + "/subscriptions"; -const RUNTIME_STATE_DIR = getenv("FORKOP_RUNTIME_STATE_DIR") || "/var/run/forkop"; -const SUBSCRIPTION_UPDATE_STATE_DIR = getenv("FORKOP_SUBSCRIPTION_UPDATE_STATE_DIR") || RUNTIME_STATE_DIR + "/subscription-update"; -const SUBSCRIPTION_LINKS_DIR = getenv("FORKOP_SUBSCRIPTION_LINKS_DIR") || RUNTIME_STATE_DIR + "/subscription-links"; -const SUBSCRIPTION_METADATA_DIR = getenv("FORKOP_SUBSCRIPTION_METADATA_DIR") || RUNTIME_STATE_DIR + "/subscription-metadata"; -const OUTBOUND_METADATA_DIR = getenv("FORKOP_OUTBOUND_METADATA_DIR") || RUNTIME_STATE_DIR + "/outbound-metadata"; -const SECTION_CACHE_DIR = getenv("FORKOP_SECTION_CACHE_DIR") || RUNTIME_STATE_DIR + "/section-cache"; -const RUNTIME_CACHE_FORMAT_FILE = getenv("FORKOP_RUNTIME_CACHE_FORMAT_FILE") || RUNTIME_STATE_DIR + "/cache-format"; -const RUNTIME_CACHE_FORMAT = getenv("FORKOP_RUNTIME_CACHE_FORMAT") || "7"; -const PERSISTENT_SUBSCRIPTION_CACHE_DIR = getenv("FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR") || "/etc/forkop/subscription-cache"; -const PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE = getenv("FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE") || PERSISTENT_SUBSCRIPTION_CACHE_DIR + "/cache-format"; -const PENDING_RELOAD_FILE = getenv("FORKOP_PENDING_RELOAD_FILE") || RUNTIME_STATE_DIR + "/reload.pending"; -const SERVICE_INIT = getenv("FORKOP_SERVICE_INIT") || "/etc/init.d/forkop"; -const NFT_TABLE_NAME = getenv("NFT_TABLE_NAME") || "ForkopTable"; -const NFT_COMMON_SET_NAME = getenv("NFT_COMMON_SET_NAME") || "forkop_subnets"; -const NFT_COMMON6_SET_NAME = getenv("NFT_COMMON6_SET_NAME") || "forkop_subnets6"; -const NFT_PORT_SET_NAME = getenv("NFT_PORT_SET_NAME") || "forkop_ports"; -const NFT_IP_PORT_SET_NAME = getenv("NFT_IP_PORT_SET_NAME") || "forkop_ip_ports"; -const NFT_IP_PORT6_SET_NAME = getenv("NFT_IP_PORT6_SET_NAME") || "forkop_ip6_ports"; -const NFT_INTERFACE_SET_NAME = getenv("NFT_INTERFACE_SET_NAME") || "forkop_interfaces"; +const RUNTIME_STATE_DIR = getenv("TACHYON_RUNTIME_STATE_DIR") || "/var/run/tachyon"; +const SUBSCRIPTION_UPDATE_STATE_DIR = getenv("TACHYON_SUBSCRIPTION_UPDATE_STATE_DIR") || RUNTIME_STATE_DIR + "/subscription-update"; +const SUBSCRIPTION_LINKS_DIR = getenv("TACHYON_SUBSCRIPTION_LINKS_DIR") || RUNTIME_STATE_DIR + "/subscription-links"; +const SUBSCRIPTION_METADATA_DIR = getenv("TACHYON_SUBSCRIPTION_METADATA_DIR") || RUNTIME_STATE_DIR + "/subscription-metadata"; +const OUTBOUND_METADATA_DIR = getenv("TACHYON_OUTBOUND_METADATA_DIR") || RUNTIME_STATE_DIR + "/outbound-metadata"; +const SECTION_CACHE_DIR = getenv("TACHYON_SECTION_CACHE_DIR") || RUNTIME_STATE_DIR + "/section-cache"; +const RUNTIME_CACHE_FORMAT_FILE = getenv("TACHYON_RUNTIME_CACHE_FORMAT_FILE") || RUNTIME_STATE_DIR + "/cache-format"; +const RUNTIME_CACHE_FORMAT = getenv("TACHYON_RUNTIME_CACHE_FORMAT") || "7"; +const PERSISTENT_SUBSCRIPTION_CACHE_DIR = getenv("TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR") || "/etc/tachyon/subscription-cache"; +const PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE = getenv("TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE") || PERSISTENT_SUBSCRIPTION_CACHE_DIR + "/cache-format"; +const PENDING_RELOAD_FILE = getenv("TACHYON_PENDING_RELOAD_FILE") || RUNTIME_STATE_DIR + "/reload.pending"; +const SERVICE_INIT = getenv("TACHYON_SERVICE_INIT") || "/etc/init.d/tachyon"; +const NFT_TABLE_NAME = getenv("NFT_TABLE_NAME") || "TachyonTable"; +const NFT_COMMON_SET_NAME = getenv("NFT_COMMON_SET_NAME") || "tachyon_subnets"; +const NFT_COMMON6_SET_NAME = getenv("NFT_COMMON6_SET_NAME") || "tachyon_subnets6"; +const NFT_PORT_SET_NAME = getenv("NFT_PORT_SET_NAME") || "tachyon_ports"; +const NFT_IP_PORT_SET_NAME = getenv("NFT_IP_PORT_SET_NAME") || "tachyon_ip_ports"; +const NFT_IP_PORT6_SET_NAME = getenv("NFT_IP_PORT6_SET_NAME") || "tachyon_ip6_ports"; +const NFT_INTERFACE_SET_NAME = getenv("NFT_INTERFACE_SET_NAME") || "tachyon_interfaces"; const NFT_LOCALV4_SET_NAME = getenv("NFT_LOCALV4_SET_NAME") || "localv4"; const NFT_LOCALV6_SET_NAME = getenv("NFT_LOCALV6_SET_NAME") || "localv6"; const NFT_FAKEIP_MARK = getenv("NFT_FAKEIP_MARK") || "0x00100000"; const SB_SERVICE_MIXED_INBOUND_ADDRESS = getenv("SB_SERVICE_MIXED_INBOUND_ADDRESS") || "127.0.0.1"; const SB_SERVICE_MIXED_INBOUND_PORT = getenv("SB_SERVICE_MIXED_INBOUND_PORT") || "4534"; -const SB_VARIANT_STATE_FILE = getenv("SB_VARIANT_STATE_FILE") || "/etc/forkop/sing-box-variant"; -const SB_VERSION_STATE_FILE = getenv("SB_VERSION_STATE_FILE") || "/etc/forkop/sing-box-version"; -const SB_MANAGED_SERVICE_MARKER = getenv("SB_MANAGED_SERVICE_MARKER") || "Forkop managed sing-box service for binary variants"; +const SB_VARIANT_STATE_FILE = getenv("SB_VARIANT_STATE_FILE") || "/etc/tachyon/sing-box-variant"; +const SB_VERSION_STATE_FILE = getenv("SB_VERSION_STATE_FILE") || "/etc/tachyon/sing-box-version"; +const SB_MANAGED_SERVICE_MARKER = getenv("SB_MANAGED_SERVICE_MARKER") || "Tachyon managed sing-box service for binary variants"; let as_string = common.as_string; let shell_quote = common.shell_quote; @@ -335,7 +335,7 @@ function sing_box_variant() { function log_message(message, level) { level = as_string(level || "info"); - command_success_from_args([ "logger", "-t", "forkop", "[" + level + "] " + as_string(message) ]); + command_success_from_args([ "logger", "-t", "tachyon", "[" + level + "] " + as_string(message) ]); } function module_env_capture(env, args) { @@ -421,7 +421,7 @@ function sing_box_compressed_marker_set() { } function install_managed_service_script() { - let tmp = "/etc/init.d/sing-box.forkop." + owner_pid(); + let tmp = "/etc/init.d/sing-box.tachyon." + owner_pid(); if (!write_file(tmp, managed_service_text())) return false; if (!command_success_from_args([ "chmod", "0755", tmp ])) { @@ -591,23 +591,23 @@ function service_listen_address_value(settings) { function subscription_cache_env() { return { - FORKOP_CONFIG_NAME: CONFIG_NAME, - FORKOP_LIB: LIB_DIR, + TACHYON_CONFIG_NAME: CONFIG_NAME, + TACHYON_LIB: LIB_DIR, TMP_SING_BOX_FOLDER, TMP_RULESET_FOLDER, TMP_SUBSCRIPTION_FOLDER, - FORKOP_RUNTIME_STATE_DIR: RUNTIME_STATE_DIR, - FORKOP_SUBSCRIPTION_UPDATE_STATE_DIR: SUBSCRIPTION_UPDATE_STATE_DIR, - FORKOP_SUBSCRIPTION_LINKS_DIR: SUBSCRIPTION_LINKS_DIR, - FORKOP_SUBSCRIPTION_METADATA_DIR: SUBSCRIPTION_METADATA_DIR, - FORKOP_OUTBOUND_METADATA_DIR: OUTBOUND_METADATA_DIR, - FORKOP_SECTION_CACHE_DIR: SECTION_CACHE_DIR, - FORKOP_RUNTIME_CACHE_FORMAT_FILE: RUNTIME_CACHE_FORMAT_FILE, - FORKOP_RUNTIME_CACHE_FORMAT: RUNTIME_CACHE_FORMAT, - FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR: PERSISTENT_SUBSCRIPTION_CACHE_DIR, - FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE: PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE, - FORKOP_PENDING_RELOAD_FILE: PENDING_RELOAD_FILE, - FORKOP_SERVICE_INIT: SERVICE_INIT + TACHYON_RUNTIME_STATE_DIR: RUNTIME_STATE_DIR, + TACHYON_SUBSCRIPTION_UPDATE_STATE_DIR: SUBSCRIPTION_UPDATE_STATE_DIR, + TACHYON_SUBSCRIPTION_LINKS_DIR: SUBSCRIPTION_LINKS_DIR, + TACHYON_SUBSCRIPTION_METADATA_DIR: SUBSCRIPTION_METADATA_DIR, + TACHYON_OUTBOUND_METADATA_DIR: OUTBOUND_METADATA_DIR, + TACHYON_SECTION_CACHE_DIR: SECTION_CACHE_DIR, + TACHYON_RUNTIME_CACHE_FORMAT_FILE: RUNTIME_CACHE_FORMAT_FILE, + TACHYON_RUNTIME_CACHE_FORMAT: RUNTIME_CACHE_FORMAT, + TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR: PERSISTENT_SUBSCRIPTION_CACHE_DIR, + TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE: PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE, + TACHYON_PENDING_RELOAD_FILE: PENDING_RELOAD_FILE, + TACHYON_SERVICE_INIT: SERVICE_INIT }; } diff --git a/tachyon/files/usr/lib/singbox/servers.uc b/tachyon/files/usr/lib/singbox/servers.uc index 35fdfbb4..92f13328 100644 --- a/tachyon/files/usr/lib/singbox/servers.uc +++ b/tachyon/files/usr/lib/singbox/servers.uc @@ -270,10 +270,10 @@ function add_tailscale_endpoint(config, section, tag_name) { let endpoint = { type: "tailscale", tag: tag_name, - state_directory: "/etc/forkop/tailscale/" + safe_filename(section_name), + state_directory: "/etc/tachyon/tailscale/" + safe_filename(section_name), auth_key: option(section, "tailscale_auth_key", ""), control_url: option(section, "tailscale_control_url", "https://controlplane.tailscale.com"), - hostname: option(section, "tailscale_hostname", "forkop-" + safe_filename(section_name)) + hostname: option(section, "tailscale_hostname", "tachyon-" + safe_filename(section_name)) }; if (bool_option(section, "tailscale_accept_routes", false)) endpoint.accept_routes = true; diff --git a/tachyon/files/usr/lib/singbox/subscription.uc b/tachyon/files/usr/lib/singbox/subscription.uc index 982d1efb..d0e9d9fb 100644 --- a/tachyon/files/usr/lib/singbox/subscription.uc +++ b/tachyon/files/usr/lib/singbox/subscription.uc @@ -10,13 +10,13 @@ let object_or_empty = common.object_or_empty; let object_key_count = common.object_key_count; const TMP_SUBSCRIPTION_FOLDER = getenv("TMP_SUBSCRIPTION_FOLDER") || "/tmp/sing-box/subscriptions"; -const FORKOP_RUNTIME_STATE_DIR = getenv("FORKOP_RUNTIME_STATE_DIR") || "/var/run/forkop"; -const FORKOP_SECTION_CACHE_DIR = getenv("FORKOP_SECTION_CACHE_DIR") || FORKOP_RUNTIME_STATE_DIR + "/section-cache"; -const FORKOP_SUBSCRIPTION_METADATA_DIR = getenv("FORKOP_SUBSCRIPTION_METADATA_DIR") || FORKOP_RUNTIME_STATE_DIR + "/subscription-metadata"; -const FORKOP_RUNTIME_CACHE_FORMAT = int(getenv("FORKOP_RUNTIME_CACHE_FORMAT") || "7"); -const FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR = getenv("FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR") || "/etc/forkop/subscription-cache"; +const TACHYON_RUNTIME_STATE_DIR = getenv("TACHYON_RUNTIME_STATE_DIR") || "/var/run/tachyon"; +const TACHYON_SECTION_CACHE_DIR = getenv("TACHYON_SECTION_CACHE_DIR") || TACHYON_RUNTIME_STATE_DIR + "/section-cache"; +const TACHYON_SUBSCRIPTION_METADATA_DIR = getenv("TACHYON_SUBSCRIPTION_METADATA_DIR") || TACHYON_RUNTIME_STATE_DIR + "/subscription-metadata"; +const TACHYON_RUNTIME_CACHE_FORMAT = int(getenv("TACHYON_RUNTIME_CACHE_FORMAT") || "7"); +const TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR = getenv("TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR") || "/etc/tachyon/subscription-cache"; -let section_cache_dir = FORKOP_SECTION_CACHE_DIR; +let section_cache_dir = TACHYON_SECTION_CACHE_DIR; function set_section_cache_dir(path) { path = as_string(path); @@ -33,11 +33,11 @@ function section_cache_path(section_name) { } function legacy_metadata_path(section_name) { - return FORKOP_SUBSCRIPTION_METADATA_DIR + "/" + section_name + ".json"; + return TACHYON_SUBSCRIPTION_METADATA_DIR + "/" + section_name + ".json"; } function persistent_source_path(source_section, suffix) { - return FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR + "/" + source_section + suffix; + return TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR + "/" + source_section + suffix; } function persistent_metadata_path(source_section) { @@ -350,7 +350,7 @@ function read_source_outbounds(source_section) { function new_section_state(section_name) { return { - version: FORKOP_RUNTIME_CACHE_FORMAT, + version: TACHYON_RUNTIME_CACHE_FORMAT, section: section_name, links: {}, linkRefs: {}, diff --git a/tachyon/files/usr/lib/subscription/cache.uc b/tachyon/files/usr/lib/subscription/cache.uc index f9f2dfb3..5aa76837 100644 --- a/tachyon/files/usr/lib/subscription/cache.uc +++ b/tachyon/files/usr/lib/subscription/cache.uc @@ -4,29 +4,29 @@ let fs = require("fs"); let uci_core = require("core.uci"); let connections = require("config.connections"); -const CONFIG_NAME = getenv("FORKOP_CONFIG_NAME") || "forkop"; -const LIB_DIR = getenv("FORKOP_LIB") || "/usr/lib/forkop"; +const CONFIG_NAME = getenv("TACHYON_CONFIG_NAME") || "tachyon"; +const LIB_DIR = getenv("TACHYON_LIB") || "/usr/lib/tachyon"; const TMP_SING_BOX_FOLDER = getenv("TMP_SING_BOX_FOLDER") || "/tmp/sing-box"; const TMP_RULESET_FOLDER = getenv("TMP_RULESET_FOLDER") || TMP_SING_BOX_FOLDER + "/rulesets"; const TMP_SUBSCRIPTION_FOLDER = getenv("TMP_SUBSCRIPTION_FOLDER") || TMP_SING_BOX_FOLDER + "/subscriptions"; -const FORKOP_RUNTIME_STATE_DIR = getenv("FORKOP_RUNTIME_STATE_DIR") || "/var/run/forkop"; -const FORKOP_SUBSCRIPTION_UPDATE_STATE_DIR = getenv("FORKOP_SUBSCRIPTION_UPDATE_STATE_DIR") || FORKOP_RUNTIME_STATE_DIR + "/subscription-update"; -const FORKOP_SUBSCRIPTION_LINKS_DIR = getenv("FORKOP_SUBSCRIPTION_LINKS_DIR") || FORKOP_RUNTIME_STATE_DIR + "/subscription-links"; -const FORKOP_SUBSCRIPTION_METADATA_DIR = getenv("FORKOP_SUBSCRIPTION_METADATA_DIR") || FORKOP_RUNTIME_STATE_DIR + "/subscription-metadata"; -const FORKOP_OUTBOUND_METADATA_DIR = getenv("FORKOP_OUTBOUND_METADATA_DIR") || FORKOP_RUNTIME_STATE_DIR + "/outbound-metadata"; -const FORKOP_SECTION_CACHE_DIR = getenv("FORKOP_SECTION_CACHE_DIR") || FORKOP_RUNTIME_STATE_DIR + "/section-cache"; -const FORKOP_RUNTIME_CACHE_FORMAT_FILE = getenv("FORKOP_RUNTIME_CACHE_FORMAT_FILE") || FORKOP_RUNTIME_STATE_DIR + "/cache-format"; -const FORKOP_RUNTIME_CACHE_FORMAT = getenv("FORKOP_RUNTIME_CACHE_FORMAT") || "7"; -const FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR = getenv("FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR") || "/etc/forkop/subscription-cache"; -const FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE = getenv("FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE") || FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR + "/cache-format"; -const FORKOP_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE = getenv("FORKOP_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE") || FORKOP_RUNTIME_STATE_DIR + "/subscription-bootstrap-retry.pid"; -const FORKOP_SUBSCRIPTION_UPDATE_LOCK_DIR = getenv("FORKOP_SUBSCRIPTION_UPDATE_LOCK_DIR") || FORKOP_RUNTIME_STATE_DIR + "/subscription-update.lock"; -const FORKOP_PENDING_RELOAD_FILE = getenv("FORKOP_PENDING_RELOAD_FILE") || FORKOP_RUNTIME_STATE_DIR + "/reload.pending"; -const FORKOP_SERVICE_INIT = getenv("FORKOP_SERVICE_INIT") || "/etc/init.d/forkop"; +const TACHYON_RUNTIME_STATE_DIR = getenv("TACHYON_RUNTIME_STATE_DIR") || "/var/run/tachyon"; +const TACHYON_SUBSCRIPTION_UPDATE_STATE_DIR = getenv("TACHYON_SUBSCRIPTION_UPDATE_STATE_DIR") || TACHYON_RUNTIME_STATE_DIR + "/subscription-update"; +const TACHYON_SUBSCRIPTION_LINKS_DIR = getenv("TACHYON_SUBSCRIPTION_LINKS_DIR") || TACHYON_RUNTIME_STATE_DIR + "/subscription-links"; +const TACHYON_SUBSCRIPTION_METADATA_DIR = getenv("TACHYON_SUBSCRIPTION_METADATA_DIR") || TACHYON_RUNTIME_STATE_DIR + "/subscription-metadata"; +const TACHYON_OUTBOUND_METADATA_DIR = getenv("TACHYON_OUTBOUND_METADATA_DIR") || TACHYON_RUNTIME_STATE_DIR + "/outbound-metadata"; +const TACHYON_SECTION_CACHE_DIR = getenv("TACHYON_SECTION_CACHE_DIR") || TACHYON_RUNTIME_STATE_DIR + "/section-cache"; +const TACHYON_RUNTIME_CACHE_FORMAT_FILE = getenv("TACHYON_RUNTIME_CACHE_FORMAT_FILE") || TACHYON_RUNTIME_STATE_DIR + "/cache-format"; +const TACHYON_RUNTIME_CACHE_FORMAT = getenv("TACHYON_RUNTIME_CACHE_FORMAT") || "7"; +const TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR = getenv("TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR") || "/etc/tachyon/subscription-cache"; +const TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE = getenv("TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE") || TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR + "/cache-format"; +const TACHYON_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE = getenv("TACHYON_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE") || TACHYON_RUNTIME_STATE_DIR + "/subscription-bootstrap-retry.pid"; +const TACHYON_SUBSCRIPTION_UPDATE_LOCK_DIR = getenv("TACHYON_SUBSCRIPTION_UPDATE_LOCK_DIR") || TACHYON_RUNTIME_STATE_DIR + "/subscription-update.lock"; +const TACHYON_PENDING_RELOAD_FILE = getenv("TACHYON_PENDING_RELOAD_FILE") || TACHYON_RUNTIME_STATE_DIR + "/reload.pending"; +const TACHYON_SERVICE_INIT = getenv("TACHYON_SERVICE_INIT") || "/etc/init.d/tachyon"; const SB_SERVICE_MIXED_INBOUND_ADDRESS = getenv("SB_SERVICE_MIXED_INBOUND_ADDRESS") || "127.0.0.1"; const SB_SERVICE_MIXED_INBOUND_PORT = getenv("SB_SERVICE_MIXED_INBOUND_PORT") || "4534"; -const SB_VARIANT_STATE_FILE = getenv("SB_VARIANT_STATE_FILE") || "/etc/forkop/sing-box-variant"; -const SB_VERSION_STATE_FILE = getenv("SB_VERSION_STATE_FILE") || "/etc/forkop/sing-box-version"; +const SB_VARIANT_STATE_FILE = getenv("SB_VARIANT_STATE_FILE") || "/etc/tachyon/sing-box-variant"; +const SB_VERSION_STATE_FILE = getenv("SB_VERSION_STATE_FILE") || "/etc/tachyon/sing-box-version"; const ZAPRET_PROVIDER_NFQWS_BIN = getenv("ZAPRET_PROVIDER_NFQWS_BIN") || "/opt/zapret/nfq/nfqws"; const ZAPRET2_PROVIDER_NFQWS2_BIN = getenv("ZAPRET2_PROVIDER_NFQWS2_BIN") || "/opt/zapret2/nfq2/nfqws2"; const BYEDPI_BIN = getenv("BYEDPI_BIN") || "/usr/bin/ciadpi"; @@ -244,14 +244,14 @@ function subscription_metadata_path(section) { section = as_string(section); if (!cache_section_is_safe(section)) return ""; - return FORKOP_SUBSCRIPTION_METADATA_DIR + "/" + section + ".json"; + return TACHYON_SUBSCRIPTION_METADATA_DIR + "/" + section + ".json"; } function outbound_metadata_path(section) { section = as_string(section); if (!cache_section_is_safe(section)) return ""; - return FORKOP_OUTBOUND_METADATA_DIR + "/" + section + ".json"; + return TACHYON_OUTBOUND_METADATA_DIR + "/" + section + ".json"; } function section_has_subscription_urls(section) { @@ -594,7 +594,7 @@ function run_silent(command) { function log_message(message, level) { level = as_string(level || "info"); - command_success_from_args([ "logger", "-t", "forkop", "[" + level + "] " + as_string(message) ]); + command_success_from_args([ "logger", "-t", "tachyon", "[" + level + "] " + as_string(message) ]); } function ensure_dir(path) { @@ -609,44 +609,44 @@ function ensure_runtime_dirs() { ensure_dir(TMP_SING_BOX_FOLDER); ensure_dir(TMP_RULESET_FOLDER); ensure_dir(TMP_SUBSCRIPTION_FOLDER); - ensure_dir(FORKOP_RUNTIME_STATE_DIR); - ensure_dir(FORKOP_SUBSCRIPTION_UPDATE_STATE_DIR); - ensure_dir(FORKOP_SUBSCRIPTION_LINKS_DIR); - ensure_dir(FORKOP_SUBSCRIPTION_METADATA_DIR); - ensure_dir(FORKOP_OUTBOUND_METADATA_DIR); - ensure_dir(FORKOP_SECTION_CACHE_DIR); + ensure_dir(TACHYON_RUNTIME_STATE_DIR); + ensure_dir(TACHYON_SUBSCRIPTION_UPDATE_STATE_DIR); + ensure_dir(TACHYON_SUBSCRIPTION_LINKS_DIR); + ensure_dir(TACHYON_SUBSCRIPTION_METADATA_DIR); + ensure_dir(TACHYON_OUTBOUND_METADATA_DIR); + ensure_dir(TACHYON_SECTION_CACHE_DIR); } function clear_subscription_runtime_cache() { run_silent("rm -rf " + shell_quote(TMP_SUBSCRIPTION_FOLDER) + " " + - shell_quote(FORKOP_SUBSCRIPTION_LINKS_DIR) + " " + - shell_quote(FORKOP_SUBSCRIPTION_METADATA_DIR) + " " + - shell_quote(FORKOP_OUTBOUND_METADATA_DIR) + " " + - shell_quote(FORKOP_SECTION_CACHE_DIR)); + shell_quote(TACHYON_SUBSCRIPTION_LINKS_DIR) + " " + + shell_quote(TACHYON_SUBSCRIPTION_METADATA_DIR) + " " + + shell_quote(TACHYON_OUTBOUND_METADATA_DIR) + " " + + shell_quote(TACHYON_SECTION_CACHE_DIR)); } function ensure_runtime_cache_format() { - ensure_dir(FORKOP_RUNTIME_STATE_DIR); + ensure_dir(TACHYON_RUNTIME_STATE_DIR); - if (file_first_line_value(FORKOP_RUNTIME_CACHE_FORMAT_FILE) != FORKOP_RUNTIME_CACHE_FORMAT) { + if (file_first_line_value(TACHYON_RUNTIME_CACHE_FORMAT_FILE) != TACHYON_RUNTIME_CACHE_FORMAT) { log_message("Runtime subscription cache format changed; clearing old subscription cache", "info"); clear_subscription_runtime_cache(); ensure_runtime_dirs(); - write_file(FORKOP_RUNTIME_CACHE_FORMAT_FILE, FORKOP_RUNTIME_CACHE_FORMAT + "\n"); + write_file(TACHYON_RUNTIME_CACHE_FORMAT_FILE, TACHYON_RUNTIME_CACHE_FORMAT + "\n"); } - if (file_first_line_value(FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE) != FORKOP_RUNTIME_CACHE_FORMAT) { - run_silent("rm -rf " + shell_quote(FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR)); - ensure_dir(FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR); - chmod_path(FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR, "700"); - write_file(FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE, FORKOP_RUNTIME_CACHE_FORMAT + "\n"); - chmod_path(FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE, "600"); + if (file_first_line_value(TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE) != TACHYON_RUNTIME_CACHE_FORMAT) { + run_silent("rm -rf " + shell_quote(TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR)); + ensure_dir(TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR); + chmod_path(TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR, "700"); + write_file(TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE, TACHYON_RUNTIME_CACHE_FORMAT + "\n"); + chmod_path(TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE, "600"); } } function remove_legacy_server_country_cache() { - unlink_path(FORKOP_RUNTIME_STATE_DIR + "/server-country-cache.json"); + unlink_path(TACHYON_RUNTIME_STATE_DIR + "/server-country-cache.json"); } function temp_path(dir, section, kind) { @@ -863,7 +863,7 @@ function provider_action_is_available(action) { } function section_current_usable_cache_by_name(sections, section, default_user_agent) { - return section_current_usable_cache(find_section(sections, section), TMP_SUBSCRIPTION_FOLDER, FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR, default_user_agent); + return section_current_usable_cache(find_section(sections, section), TMP_SUBSCRIPTION_FOLDER, TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR, default_user_agent); } function section_has_non_subscription_connection_sources(section) { @@ -928,11 +928,11 @@ function cache_candidate_paths() { let result = []; for (let dir in [ TMP_SUBSCRIPTION_FOLDER, - FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR, - FORKOP_SECTION_CACHE_DIR, - FORKOP_SUBSCRIPTION_LINKS_DIR, - FORKOP_SUBSCRIPTION_METADATA_DIR, - FORKOP_OUTBOUND_METADATA_DIR + TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR, + TACHYON_SECTION_CACHE_DIR, + TACHYON_SUBSCRIPTION_LINKS_DIR, + TACHYON_SUBSCRIPTION_METADATA_DIR, + TACHYON_OUTBOUND_METADATA_DIR ]) { let entries = fs.lsdir(dir); if (type(entries) != "array") @@ -960,11 +960,11 @@ function prune_stale_subscription_caches_for_sections(sections) { path, keep, TMP_SUBSCRIPTION_FOLDER, - FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR, - FORKOP_SECTION_CACHE_DIR, - FORKOP_SUBSCRIPTION_LINKS_DIR, - FORKOP_SUBSCRIPTION_METADATA_DIR, - FORKOP_OUTBOUND_METADATA_DIR + TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR, + TACHYON_SECTION_CACHE_DIR, + TACHYON_SUBSCRIPTION_LINKS_DIR, + TACHYON_SUBSCRIPTION_METADATA_DIR, + TACHYON_OUTBOUND_METADATA_DIR ); if (!state_list_contains(keep_names, cache_name)) unlink_path(path); @@ -1751,7 +1751,7 @@ function get_subscription_metadata(cache_dir, section, legacy_path) { } function persistent_metadata_path(source_section) { - return FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR + "/" + as_string(source_section) + ".metadata.json"; + return TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR + "/" + as_string(source_section) + ".metadata.json"; } function remove_subscription_source_runtime_cache(source_section) { @@ -1768,13 +1768,13 @@ function persist_subscription_cache(source_section, subscription_json_path, subs if (!cache_section_is_safe(source_section) || !subscription_cache_is_usable(subscription_json_path)) return false; - ensure_dir(FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR); - chmod_path(FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR, "700"); + ensure_dir(TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR); + chmod_path(TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR, "700"); - let persistent_json = source_json_path(FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR, source_section); - let persistent_url = source_url_path(FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR, source_section); - let persistent_user_agent = source_user_agent_path(FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR, source_section); - let persistent_hwid = source_hwid_path(FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR, source_section); + let persistent_json = source_json_path(TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR, source_section); + let persistent_url = source_url_path(TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR, source_section); + let persistent_user_agent = source_user_agent_path(TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR, source_section); + let persistent_hwid = source_hwid_path(TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR, source_section); let persistent_metadata = persistent_metadata_path(source_section); let previous_url = read_text(persistent_url); let previous_user_agent = read_text(persistent_user_agent); @@ -1817,7 +1817,7 @@ function append_available_cached_metadata(array_path, section, source_index, sou let before = length(array_or_empty(read_json(array_path))); append_persistent_source_metadata(array_path, source_index, source_section) || - append_cached_metadata(array_path, FORKOP_SECTION_CACHE_DIR, section, FORKOP_SUBSCRIPTION_METADATA_DIR + "/" + section + ".json", source_index, source_section); + append_cached_metadata(array_path, TACHYON_SECTION_CACHE_DIR, section, TACHYON_SUBSCRIPTION_METADATA_DIR + "/" + section + ".json", source_index, source_section); return length(array_or_empty(read_json(array_path))) > before; } @@ -2156,7 +2156,7 @@ function cached_source_status(source_section, parsed) { restore_persistent_subscription_cache( source_section, TMP_SUBSCRIPTION_FOLDER, - FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR, + TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR, parsed.url, parsed.user_agent, parsed.hwid, @@ -2231,7 +2231,7 @@ function update_subscription_source(section_name_value, index_value, entry, phas } function subscription_update_timestamp_path(section_name_value) { - return FORKOP_SUBSCRIPTION_UPDATE_STATE_DIR + "/" + as_string(section_name_value) + ".timestamp"; + return TACHYON_SUBSCRIPTION_UPDATE_STATE_DIR + "/" + as_string(section_name_value) + ".timestamp"; } function current_timestamp_value() { @@ -2244,7 +2244,7 @@ function write_subscription_update_timestamp(section_name_value) { if (timestamp == "") return; - ensure_dir(FORKOP_SUBSCRIPTION_UPDATE_STATE_DIR); + ensure_dir(TACHYON_SUBSCRIPTION_UPDATE_STATE_DIR); write_file(subscription_update_timestamp_path(section_name_value), timestamp + "\n"); } @@ -2269,9 +2269,9 @@ function finalize_subscription_section_metadata(section_name_value, metadata_tmp if (!superseded) { if (length(array_or_empty(read_json(metadata_tmpfile))) > 0) - write_subscription_metadata(FORKOP_SECTION_CACHE_DIR, FORKOP_RUNTIME_CACHE_FORMAT, section_name_value, metadata_tmpfile); + write_subscription_metadata(TACHYON_SECTION_CACHE_DIR, TACHYON_RUNTIME_CACHE_FORMAT, section_name_value, metadata_tmpfile); else - write_subscription_metadata(FORKOP_SECTION_CACHE_DIR, FORKOP_RUNTIME_CACHE_FORMAT, section_name_value, ""); + write_subscription_metadata(TACHYON_SECTION_CACHE_DIR, TACHYON_RUNTIME_CACHE_FORMAT, section_name_value, ""); } unlink_path(metadata_tmpfile); @@ -2434,13 +2434,13 @@ function subscription_update_selected_source(sections, section_name_value, sourc if (update_result == 0 || update_result == 2) write_source_metadata( - FORKOP_SECTION_CACHE_DIR, - FORKOP_RUNTIME_CACHE_FORMAT, + TACHYON_SECTION_CACHE_DIR, + TACHYON_RUNTIME_CACHE_FORMAT, section_name_value, source_index, source_section, metadata_output_path, - FORKOP_SUBSCRIPTION_METADATA_DIR + "/" + section_name_value + ".json" + TACHYON_SUBSCRIPTION_METADATA_DIR + "/" + section_name_value + ".json" ); unlink_path(metadata_output_path); @@ -2603,9 +2603,9 @@ function prepare_subscription_cache_section(state, section) { let metadata_count = length(array_or_empty(read_json(metadata_tmpfile))); if (metadata_count > 0) - write_subscription_metadata(FORKOP_SECTION_CACHE_DIR, FORKOP_RUNTIME_CACHE_FORMAT, section_name_value, metadata_tmpfile); + write_subscription_metadata(TACHYON_SECTION_CACHE_DIR, TACHYON_RUNTIME_CACHE_FORMAT, section_name_value, metadata_tmpfile); else - write_subscription_metadata(FORKOP_SECTION_CACHE_DIR, FORKOP_RUNTIME_CACHE_FORMAT, section_name_value, ""); + write_subscription_metadata(TACHYON_SECTION_CACHE_DIR, TACHYON_RUNTIME_CACHE_FORMAT, section_name_value, ""); unlink_path(metadata_tmpfile); } @@ -2619,7 +2619,7 @@ function prepare_subscription_caches(phase, already_prepared, no_refresh) { phase = as_string(phase || "startup"); let sections = uci_sections(); - if (prepared_runtime_cache_should_skip(sections, FORKOP_SECTION_CACHE_DIR, phase, already_prepared)) { + if (prepared_runtime_cache_should_skip(sections, TACHYON_SECTION_CACHE_DIR, phase, already_prepared)) { print("\n"); return 0; } @@ -2673,12 +2673,12 @@ function state_ucode_status(args) { } function mark_pending_subscription_recovery_reload() { - state_ucode_status([ "mark-pending-reload", FORKOP_PENDING_RELOAD_FILE, "subscription_deferred_recovery" ]); + state_ucode_status([ "mark-pending-reload", TACHYON_PENDING_RELOAD_FILE, "subscription_deferred_recovery" ]); } function trigger_subscription_recovery_reload(worker) { if (worker) - command_status_from_args([ FORKOP_SERVICE_INIT, "reload", "subscription_deferred_recovery" ]); + command_status_from_args([ TACHYON_SERVICE_INIT, "reload", "subscription_deferred_recovery" ]); else mark_pending_subscription_recovery_reload(); } @@ -2721,25 +2721,25 @@ function subscription_bootstrap_retry_result(deferred_sections) { function worker_env() { return { - FORKOP_CONFIG_NAME: CONFIG_NAME, - FORKOP_LIB: LIB_DIR, + TACHYON_CONFIG_NAME: CONFIG_NAME, + TACHYON_LIB: LIB_DIR, TMP_SING_BOX_FOLDER, TMP_RULESET_FOLDER, TMP_SUBSCRIPTION_FOLDER, - FORKOP_RUNTIME_STATE_DIR, - FORKOP_SUBSCRIPTION_UPDATE_STATE_DIR, - FORKOP_SUBSCRIPTION_LINKS_DIR, - FORKOP_SUBSCRIPTION_METADATA_DIR, - FORKOP_OUTBOUND_METADATA_DIR, - FORKOP_SECTION_CACHE_DIR, - FORKOP_RUNTIME_CACHE_FORMAT_FILE, - FORKOP_RUNTIME_CACHE_FORMAT, - FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR, - FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE, - FORKOP_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE, - FORKOP_SUBSCRIPTION_UPDATE_LOCK_DIR, - FORKOP_PENDING_RELOAD_FILE, - FORKOP_SERVICE_INIT, + TACHYON_RUNTIME_STATE_DIR, + TACHYON_SUBSCRIPTION_UPDATE_STATE_DIR, + TACHYON_SUBSCRIPTION_LINKS_DIR, + TACHYON_SUBSCRIPTION_METADATA_DIR, + TACHYON_OUTBOUND_METADATA_DIR, + TACHYON_SECTION_CACHE_DIR, + TACHYON_RUNTIME_CACHE_FORMAT_FILE, + TACHYON_RUNTIME_CACHE_FORMAT, + TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR, + TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE, + TACHYON_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE, + TACHYON_SUBSCRIPTION_UPDATE_LOCK_DIR, + TACHYON_PENDING_RELOAD_FILE, + TACHYON_SERVICE_INIT, SB_SERVICE_MIXED_INBOUND_ADDRESS, SB_SERVICE_MIXED_INBOUND_PORT, SB_VARIANT_STATE_FILE, @@ -2762,7 +2762,7 @@ function start_deferred_subscription_bootstrap_retry_worker(deferred_sections) { return; ensure_runtime_dirs(); - let existing_pid = trim(file_first_line_value(FORKOP_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE)); + let existing_pid = trim(file_first_line_value(TACHYON_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE)); if (pid_running(existing_pid)) { log_message("Subscription bootstrap retry worker is already running with PID " + existing_pid, "debug"); return; @@ -2770,17 +2770,17 @@ function start_deferred_subscription_bootstrap_retry_worker(deferred_sections) { let pid = launch_self_worker([ "deferred-bootstrap-worker", deferred_sections ]); if (pid != "") - write_file(FORKOP_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE, pid + "\n"); + write_file(TACHYON_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE, pid + "\n"); log_message("Started subscription bootstrap retry worker for rule(s): " + deferred_sections, "info"); } function stop_deferred_subscription_bootstrap_retry_worker() { - let pid = trim(file_first_line_value(FORKOP_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE)); + let pid = trim(file_first_line_value(TACHYON_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE)); if (pid_running(pid)) { command_success_from_args([ "kill", pid ]); log_message("Stopped subscription bootstrap retry worker", "info"); } - unlink_path(FORKOP_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE); + unlink_path(TACHYON_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE); } function run_deferred_subscription_bootstrap(deferred_sections) { @@ -2806,7 +2806,7 @@ function run_deferred_subscription_bootstrap(deferred_sections) { let result = subscription_bootstrap_retry_result(deferred_sections); if (result.recovered != "") { - log_message("Recovered deferred subscription rule(s): " + result.recovered + "; scheduling Forkop reload", "info"); + log_message("Recovered deferred subscription rule(s): " + result.recovered + "; scheduling Tachyon reload", "info"); trigger_subscription_recovery_reload(false); } @@ -2827,23 +2827,23 @@ function deferred_subscription_bootstrap_retry_worker(remaining_sections) { } ensure_runtime_dirs(); - if (!state_ucode_status([ "acquire-runtime-dir-lock", FORKOP_SUBSCRIPTION_UPDATE_LOCK_DIR, current_pid() ])) { + if (!state_ucode_status([ "acquire-runtime-dir-lock", TACHYON_SUBSCRIPTION_UPDATE_LOCK_DIR, current_pid() ])) { log_message("Subscription bootstrap retry skipped because another subscription update is running", "debug"); continue; } let result = subscription_bootstrap_retry_result(remaining_sections); - state_ucode_status([ "release-runtime-dir-lock", FORKOP_SUBSCRIPTION_UPDATE_LOCK_DIR ]); + state_ucode_status([ "release-runtime-dir-lock", TACHYON_SUBSCRIPTION_UPDATE_LOCK_DIR ]); if (result.recovered != "") { - log_message("Recovered deferred subscription rule(s): " + result.recovered + "; reloading Forkop", "info"); + log_message("Recovered deferred subscription rule(s): " + result.recovered + "; reloading Tachyon", "info"); trigger_subscription_recovery_reload(true); } remaining_sections = result.remaining; } - unlink_path(FORKOP_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE); + unlink_path(TACHYON_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE); } let mode = ARGV[0] || ""; diff --git a/tachyon/files/usr/lib/subscription/parser.uc b/tachyon/files/usr/lib/subscription/parser.uc index ca7dfa54..b403c715 100644 --- a/tachyon/files/usr/lib/subscription/parser.uc +++ b/tachyon/files/usr/lib/subscription/parser.uc @@ -2536,7 +2536,7 @@ function xray_add_converted_outbound(result, item, tag_map, visible, display_nam if (visible && display_name != "") converted.remark = display_name; if (!visible) - converted.__forkop_hidden = true; + converted.__tachyon_hidden = true; let detour = xray_outbound_detour(item.outbound); if (detour != "" && tag_map[detour]) @@ -2576,7 +2576,7 @@ function xray_config_outbounds(config, config_index, config_count, taken) { tag: group_tag, outbounds: urltest_outbounds, remark: group_base != "" ? group_base : group_tag, - __forkop_allow_group: true + __tachyon_allow_group: true }; xray_apply_urltest_options(group, plan.urltest_options); push(result, group); @@ -2699,11 +2699,11 @@ function normalize_sing_box_json_outbounds(candidates) { for (let outbound in outbounds) { let tag_name = sing_box_outbound_tag(outbound); if (sing_box_urltest_group(outbound)) { - outbound.__forkop_allow_group = true; + outbound.__tachyon_allow_group = true; continue; } if (tag_name != "" && (urltest_refs[tag_name] || detour_refs[tag_name])) - outbound.__forkop_hidden = true; + outbound.__tachyon_hidden = true; } return outbounds; @@ -2776,7 +2776,7 @@ function gzip_decode_file(input_file, output_file) { } function try_decode_gzip_content_file(input_file) { - let tmp = temp_path("forkop-subscription-gzip"); + let tmp = temp_path("tachyon-subscription-gzip"); if (!gzip_decode_file(input_file, tmp)) { fs.unlink(tmp); return false; @@ -2806,7 +2806,7 @@ function normalized_skipped_message(path) { } function extract_ui_metadata_file(headers_file, body_file, output_file) { - let tmp = temp_path("forkop-subscription-metadata"); + let tmp = temp_path("tachyon-subscription-metadata"); let raw = metadata_body_store_with_base64_fallback(body_file).values; let headers = metadata_headers_store(headers_file).values; for (let key, value in headers) @@ -2843,7 +2843,7 @@ function normalize_content_data(data, output_file, depth) { } if (index(data, "proxies:") >= 0 && content_is_clash_yaml(data)) { - let tmp = temp_path("forkop-subscription-clash"); + let tmp = temp_path("tachyon-subscription-clash"); if (!fs.writefile(tmp, data)) return false; let ok = normalize_clash_yaml(tmp, output_file); @@ -2876,7 +2876,7 @@ function normalize_content_file(input_file, output_file) { function normalize_content_validated(input_file, output_file) { let normalize_input = input_file; - let decoded_tmp = temp_path("forkop-subscription-gzip"); + let decoded_tmp = temp_path("tachyon-subscription-gzip"); let decoded = gzip_decode_file(input_file, decoded_tmp); if (decoded) normalize_input = decoded_tmp; diff --git a/tests/byedpi_runtime_owner.sh b/tests/byedpi_runtime_owner.sh index 9a66750b..b0739ac5 100644 --- a/tests/byedpi_runtime_owner.sh +++ b/tests/byedpi_runtime_owner.sh @@ -2,12 +2,12 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_BIN="$ROOT_DIR/forkop/files/usr/bin/forkop" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -CLI_UC="$FORKOP_BIN" -BYEDPI_RUNTIME_SH="$FORKOP_LIB/byedpi.sh" -LIFECYCLE_UC="$FORKOP_LIB/service/lifecycle.uc" -BYEDPI_RUNTIME_UC="$FORKOP_LIB/providers/byedpi/runtime.uc" +TACHYON_BIN="$ROOT_DIR/tachyon/files/usr/bin/tachyon" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +CLI_UC="$TACHYON_BIN" +BYEDPI_RUNTIME_SH="$TACHYON_LIB/byedpi.sh" +LIFECYCLE_UC="$TACHYON_LIB/service/lifecycle.uc" +BYEDPI_RUNTIME_UC="$TACHYON_LIB/providers/byedpi/runtime.uc" fail() { printf 'FAIL: %s\n' "$1" >&2 @@ -17,15 +17,15 @@ fail() { [ ! -e "$BYEDPI_RUNTIME_SH" ] || fail "byedpi.sh shell owner must be removed" -grep -Fq '#!/usr/bin/ucode' "$FORKOP_BIN" || - fail "forkop entrypoint must be a direct ucode executable" +grep -Fq '#!/usr/bin/ucode' "$TACHYON_BIN" || + fail "tachyon entrypoint must be a direct ucode executable" grep -Fq 'service/lifecycle.uc' "$CLI_UC" || fail "service/cli.uc must dispatch lifecycle orchestration through service/lifecycle.uc" grep -Fq 'providers/byedpi/runtime.uc' "$LIFECYCLE_UC" || fail "service/lifecycle.uc must call providers/byedpi/runtime.uc for ByeDPI runtime operations" if grep -R -n -E 'start_byedpi_runtime|stop_byedpi_runtime|get_byedpi_status_json|check_byedpi_runtime_json|is_byedpi_installed|get_byedpi_package_version|get_byedpi_rule_|run_byedpi_supervisor' \ - "$FORKOP_BIN" "$FORKOP_LIB" --include='*.sh' >/dev/null 2>&1; then + "$TACHYON_BIN" "$TACHYON_LIB" --include='*.sh' >/dev/null 2>&1; then fail "ByeDPI runtime shell symbols must not remain" fi if grep -n -E 'require\("uci"\)\.cursor|uci -q|"uci", "-q"' "$BYEDPI_RUNTIME_UC" >/dev/null 2>&1; then @@ -48,7 +48,7 @@ grep -Fq 'mode == "check"' "$BYEDPI_RUNTIME_UC" || fail "providers/byedpi/runtime.uc must own ByeDPI check" BYEDPI_BIN="$ROOT_DIR/tests/missing-ciadpi" \ - ucode -L "$FORKOP_LIB" "$BYEDPI_RUNTIME_UC" check | + ucode -L "$TACHYON_LIB" "$BYEDPI_RUNTIME_UC" check | node -e ' const fs = require("fs"); const value = JSON.parse(fs.readFileSync(0, "utf8")); diff --git a/tests/byedpi_validator.sh b/tests/byedpi_validator.sh index 013a18d3..5b37cc3e 100644 --- a/tests/byedpi_validator.sh +++ b/tests/byedpi_validator.sh @@ -2,8 +2,8 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -VALIDATOR="$ROOT_DIR/forkop/files/usr/lib/providers/byedpi/validator.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +VALIDATOR="$ROOT_DIR/tachyon/files/usr/lib/providers/byedpi/validator.uc" WORK_DIR="$(mktemp -d)" cleanup() { @@ -73,6 +73,6 @@ if (validator.strategy_or_default("", "--default\t1") != "--default 1") exit(1); UCODE -ucode -L "$FORKOP_LIB" "$WORK_DIR/require-byedpi-validator.uc" +ucode -L "$TACHYON_LIB" "$WORK_DIR/require-byedpi-validator.uc" printf 'ByeDPI validator checks passed\n' diff --git a/tests/cli_entrypoint.sh b/tests/cli_entrypoint.sh index ebcb8f89..559dd51f 100644 --- a/tests/cli_entrypoint.sh +++ b/tests/cli_entrypoint.sh @@ -2,8 +2,8 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_BIN="$ROOT_DIR/forkop/files/usr/bin/forkop" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" +TACHYON_BIN="$ROOT_DIR/tachyon/files/usr/bin/tachyon" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" WORK_DIR="$(mktemp -d)" cleanup() { @@ -16,23 +16,23 @@ fail() { exit 1 } -[ ! -e "$FORKOP_LIB/service/cli.uc" ] || +[ ! -e "$TACHYON_LIB/service/cli.uc" ] || fail "service/cli.uc must be removed after /usr/bin ucode entrypoint takeover" -grep -Fq '#!/usr/bin/ucode' "$FORKOP_BIN" || - fail "forkop entrypoint must be a direct ucode executable" -if grep -Fq '#!/bin/sh' "$FORKOP_BIN" || - grep -Fq '#!/bin/ash' "$FORKOP_BIN" || - grep -Fq 'exec ucode' "$FORKOP_BIN"; then - fail "forkop entrypoint must not keep a shell loader" +grep -Fq '#!/usr/bin/ucode' "$TACHYON_BIN" || + fail "tachyon entrypoint must be a direct ucode executable" +if grep -Fq '#!/bin/sh' "$TACHYON_BIN" || + grep -Fq '#!/bin/ash' "$TACHYON_BIN" || + grep -Fq 'exec ucode' "$TACHYON_BIN"; then + fail "tachyon entrypoint must not keep a shell loader" fi -if grep -Fq 'FORKOP_COMMAND' "$FORKOP_BIN" || - grep -Fq 'run_module()' "$FORKOP_BIN"; then - fail "forkop entrypoint must not keep legacy shell routing symbols" +if grep -Fq 'TACHYON_COMMAND' "$TACHYON_BIN" || + grep -Fq 'run_module()' "$TACHYON_BIN"; then + fail "tachyon entrypoint must not keep legacy shell routing symbols" fi -grep -Fq 'function command_spec(command)' "$FORKOP_BIN" || - fail "forkop ucode entrypoint must own command routing" -grep -Fq 'function show_help()' "$FORKOP_BIN" || - fail "forkop ucode entrypoint must own help text" +grep -Fq 'function command_spec(command)' "$TACHYON_BIN" || + fail "tachyon ucode entrypoint must own command routing" +grep -Fq 'function show_help()' "$TACHYON_BIN" || + fail "tachyon ucode entrypoint must own help text" fake_lib="$WORK_DIR/lib" mkdir -p "$fake_lib/service" "$fake_lib/diagnostics" "$fake_lib/components" "$fake_lib/dns" @@ -55,35 +55,35 @@ UCODE cat >"$fake_lib/dns/apply.uc" <<'UCODE' #!/usr/bin/env ucode let fs = require("fs"); -let marker = getenv("FORKOP_TEST_DNS_RESTORE_MARKER"); +let marker = getenv("TACHYON_TEST_DNS_RESTORE_MARKER"); if (marker != null && marker != "") fs.writefile(marker, ARGV[0] || ""); UCODE -show_version_out="$(FORKOP_LIB="$fake_lib" ucode "$FORKOP_BIN" show_version)" +show_version_out="$(TACHYON_LIB="$fake_lib" ucode "$TACHYON_BIN" show_version)" [ "$show_version_out" = $'diagnostics\tshow-version\t\t\t' ] || fail "show_version must dispatch through diagnostics/runtime.uc" -subscription_out="$(FORKOP_LIB="$fake_lib" ucode "$FORKOP_BIN" subscription_update proxy 2)" +subscription_out="$(TACHYON_LIB="$fake_lib" ucode "$TACHYON_BIN" subscription_update proxy 2)" [ "$subscription_out" = $'updates\tsubscription-update\tproxy\t2' ] || fail "subscription_update must dispatch through components/updates.uc with arguments" -component_out="$(FORKOP_LIB="$fake_lib" ucode "$FORKOP_BIN" component_action sing_box update)" +component_out="$(TACHYON_LIB="$fake_lib" ucode "$TACHYON_BIN" component_action sing_box update)" [ "$component_out" = $'action\tcomponent-action\tsing_box\tupdate' ] || fail "component_action must dispatch through components/action.uc with arguments" -component_check_cache_out="$(FORKOP_LIB="$fake_lib" ucode "$FORKOP_BIN" component_update_check_cache)" +component_check_cache_out="$(TACHYON_LIB="$fake_lib" ucode "$TACHYON_BIN" component_update_check_cache)" [ "$component_check_cache_out" = $'updates\tcomponent-update-check-cache\t\t' ] || fail "component_update_check_cache must dispatch through components/updates.uc" -component_updates_out="$(FORKOP_LIB="$fake_lib" ucode "$FORKOP_BIN" component_updates_if_due)" +component_updates_out="$(TACHYON_LIB="$fake_lib" ucode "$TACHYON_BIN" component_updates_if_due)" [ "$component_updates_out" = $'updates\tcomponent-updates-if-due\t\t' ] || fail "component_updates_if_due must dispatch through components/updates.uc" rm -f "$fake_lib/service/lifecycle.uc" set +e -FORKOP_TEST_DNS_RESTORE_MARKER="$WORK_DIR/dns-restore.marker" FORKOP_LIB="$fake_lib" \ - ucode "$FORKOP_BIN" start >/dev/null 2>"$WORK_DIR/missing.err" +TACHYON_TEST_DNS_RESTORE_MARKER="$WORK_DIR/dns-restore.marker" TACHYON_LIB="$fake_lib" \ + ucode "$TACHYON_BIN" start >/dev/null 2>"$WORK_DIR/missing.err" status="$?" set -e [ "$status" -ne 0 ] || diff --git a/tests/component_update_check_cache.sh b/tests/component_update_check_cache.sh index 855d038c..64dda17e 100644 --- a/tests/component_update_check_cache.sh +++ b/tests/component_update_check_cache.sh @@ -2,8 +2,8 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -UPDATES_UC="$FORKOP_LIB/components/updates.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +UPDATES_UC="$TACHYON_LIB/components/updates.uc" WORK_DIR="$(mktemp -d)" cleanup() { @@ -59,7 +59,7 @@ UCODE cat >"$fake_lib/components/action.uc" <<'UCODE' #!/usr/bin/env ucode -let component = ARGV[1] || "forkop"; +let component = ARGV[1] || "tachyon"; let action = ARGV[2] || "check_update"; print(sprintf("%J\n", { success: true, @@ -89,11 +89,11 @@ UCODE updates_ucode() { TEST_COMPONENT_UPDATE_CHECK_ENABLED="${TEST_COMPONENT_UPDATE_CHECK_ENABLED:-1}" \ TEST_COMPONENT_UPDATE_CHECK_INTERVAL="${TEST_COMPONENT_UPDATE_CHECK_INTERVAL:-1d}" \ - FORKOP_LIB="$fake_lib" \ - FORKOP_COMPONENT_UPDATE_CHECK_CACHE_DIR="$cache_dir" \ - FORKOP_COMPONENT_UPDATE_CHECK_STATE_FILE="$timestamp_file" \ + TACHYON_LIB="$fake_lib" \ + TACHYON_COMPONENT_UPDATE_CHECK_CACHE_DIR="$cache_dir" \ + TACHYON_COMPONENT_UPDATE_CHECK_STATE_FILE="$timestamp_file" \ UPDATES_JOB_DIR="$job_dir" \ - ucode -L "$fake_lib" -L "$FORKOP_LIB" "$UPDATES_UC" "$@" + ucode -L "$fake_lib" -L "$TACHYON_LIB" "$UPDATES_UC" "$@" } updates_ucode component-action-worker "$state_file" "$output_file" zapret check_update @@ -117,8 +117,8 @@ TEST_COMPONENT_UPDATE_CHECK_ENABLED=0 updates_ucode \ rm -f "$state_file" "$timestamp_file" updates_ucode component-updates-if-due -[ -s "$cache_dir/forkop.json" ] || - fail "automatic checks must cache the Forkop result" +[ -s "$cache_dir/tachyon.json" ] || + fail "automatic checks must cache the Tachyon result" [ -s "$timestamp_file" ] || fail "automatic checks must record their last run" diff --git a/tests/components_updater_job.sh b/tests/components_updater_job.sh index 3e0d239e..0cb79ff6 100644 --- a/tests/components_updater_job.sh +++ b/tests/components_updater_job.sh @@ -2,12 +2,12 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -FORKOP_BIN="$ROOT_DIR/forkop/files/usr/bin/forkop" -CLI_UC="$FORKOP_BIN" -UPDATER="$ROOT_DIR/forkop/files/usr/lib/components/updater.uc" -UPDATES_UC="$ROOT_DIR/forkop/files/usr/lib/components/updates.uc" -ACTION_UC="$ROOT_DIR/forkop/files/usr/lib/components/action.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +TACHYON_BIN="$ROOT_DIR/tachyon/files/usr/bin/tachyon" +CLI_UC="$TACHYON_BIN" +UPDATER="$ROOT_DIR/tachyon/files/usr/lib/components/updater.uc" +UPDATES_UC="$ROOT_DIR/tachyon/files/usr/lib/components/updates.uc" +ACTION_UC="$ROOT_DIR/tachyon/files/usr/lib/components/action.uc" WORK_DIR="$(mktemp -d)" cleanup() { @@ -70,7 +70,7 @@ if ucode "$UPDATER" updates-check-result-row component 1.0 2.0 invalid >/dev/nul fail "invalid check result status should be rejected" fi -[ ! -e "$ROOT_DIR/forkop/files/usr/lib/updater.sh" ] || +[ ! -e "$ROOT_DIR/tachyon/files/usr/lib/updater.sh" ] || fail "updater.sh shell owner must be removed" grep -Fq 'component_action: [ "components/action.uc", "component-action", 2 ]' "$CLI_UC" || fail "service/cli.uc must dispatch direct component_action through components/action.uc" @@ -97,8 +97,8 @@ grep -Fq 'require("core.uci")' "$ACTION_UC" || if grep -n -E 'require\("uci"\)\.cursor|uci -q|uci", "-q"|command_exists\("uci"\)' "$ACTION_UC" >/dev/null 2>&1; then fail "components/action.uc must not own direct UCI cursor or CLI calls" fi -grep -Fq 'forkop_status_running_with_timeout()' "$ACTION_UC" || - fail "components/action.uc must use bounded Forkop status checks for component actions" +grep -Fq 'tachyon_status_running_with_timeout()' "$ACTION_UC" || + fail "components/action.uc must use bounded Tachyon status checks for component actions" grep -Fq 'restore_sing_box_after_failed_package_install' "$ACTION_UC" || fail "stable and tiny sing-box package installs must restore the previous variant after validation failures" grep -Fq 'let package_spec = package_name + "=" + package_version;' "$ACTION_UC" || @@ -109,15 +109,15 @@ grep -Fq '!file_exists("/etc/init.d/sing-box") && file_nonempty("/usr/bin/sing-b fail "binary rollback must restore a managed sing-box service when the package script is missing" grep -Fq 'fail_package_sing_box_install(action, tiny, "package was installed, but sing-box binary is not available"' "$ACTION_UC" || fail "stable and tiny sing-box binary validation failures must use transactional rollback" -grep -Fq 'fail_package_sing_box_install(action, tiny, "was installed, but Forkop did not start cleanly"' "$ACTION_UC" || +grep -Fq 'fail_package_sing_box_install(action, tiny, "was installed, but Tachyon did not start cleanly"' "$ACTION_UC" || fail "stable and tiny sing-box startup failures must use transactional rollback" if grep -Fq 'command_success_from_args([ SERVICE_INIT, "status" ])' "$ACTION_UC"; then fail "components/action.uc must not call init.d status without a timeout" fi -status_timeout_line="$(grep -n '^function forkop_status_running_with_timeout()' "$ACTION_UC" | cut -d: -f1)" -capture_state_line="$(grep -n '^function capture_forkop_running_state()' "$ACTION_UC" | cut -d: -f1)" +status_timeout_line="$(grep -n '^function tachyon_status_running_with_timeout()' "$ACTION_UC" | cut -d: -f1)" +capture_state_line="$(grep -n '^function capture_tachyon_running_state()' "$ACTION_UC" | cut -d: -f1)" [ -n "$status_timeout_line" ] && [ -n "$capture_state_line" ] && [ "$status_timeout_line" -lt "$capture_state_line" ] || - fail "components/action.uc must declare bounded status helper before capture_forkop_running_state for OpenWrt ucode" + fail "components/action.uc must declare bounded status helper before capture_tachyon_running_state for OpenWrt ucode" init_line="$(grep -n '^function init_tmp_dir()' "$ACTION_UC" | cut -d: -f1)" tmp_file_line="$(grep -n '^function make_tmp_file' "$ACTION_UC" | cut -d: -f1)" [ -n "$init_line" ] && [ -n "$tmp_file_line" ] && [ "$init_line" -lt "$tmp_file_line" ] || @@ -138,7 +138,7 @@ assert_eq "extracted payload" "$(cat "$command_success_output")" \ awk ' prev2 == " remove_file(archive_file);" && -prev1 == " stop_forkop_before_sing_box_change();" && +prev1 == " stop_tachyon_before_sing_box_change();" && $0 == " let new_version = validate_sing_box_extended_binary(tmp_binary, tmp_dir);" { safe_validation = 1 } @@ -155,7 +155,7 @@ if grep -Fq 'fs.rename(tmp_binary, "/usr/bin/sing-box")' "$ACTION_UC"; then fi grep -Fq 'let backup_on_tmpfs = previous_variant == "extended-compressed";' "$ACTION_UC" || fail "package sing-box installs must move compressed backups off overlay before opkg space checks" -grep -Fq 'backup_binary = backup_on_tmpfs ? tmp_dir + "/sing-box.forkop-backup"' "$ACTION_UC" || +grep -Fq 'backup_binary = backup_on_tmpfs ? tmp_dir + "/sing-box.tachyon-backup"' "$ACTION_UC" || fail "compressed sing-box backup must use tmpfs while installing a package variant" grep -Fq 'return move_file_portable(backup_binary, "/usr/bin/sing-box");' "$ACTION_UC" && fail "portable sing-box restore must preserve executable permissions explicitly" @@ -240,10 +240,10 @@ chmod +x "$package_runtime_bin/opkg" "$package_runtime_bin/logger" set +e PATH="$package_runtime_bin:$PATH" \ -FORKOP_LIB="$package_runtime_lib" \ -FORKOP_RUNTIME_STATE_DIR="$WORK_DIR/package-runtime" \ -FORKOP_BIN="$WORK_DIR/missing-forkop" \ -FORKOP_SERVICE_INIT="$WORK_DIR/missing-init" \ +TACHYON_LIB="$package_runtime_lib" \ +TACHYON_RUNTIME_STATE_DIR="$WORK_DIR/package-runtime" \ +TACHYON_BIN="$WORK_DIR/missing-tachyon" \ +TACHYON_SERVICE_INIT="$WORK_DIR/missing-init" \ FAKE_OPKG_LOG="$WORK_DIR/opkg.log" \ FAKE_OPKG_UPDATED="$WORK_DIR/opkg.updated" \ ucode -L "$package_runtime_lib" "$ACTION_UC" component-action sing_box install_stable >/dev/null @@ -284,10 +284,10 @@ SH chmod +x "$package_runtime_bin/apk" set +e PATH="$package_runtime_bin:$PATH" \ -FORKOP_LIB="$package_runtime_lib" \ -FORKOP_RUNTIME_STATE_DIR="$WORK_DIR/apk-package-runtime" \ -FORKOP_BIN="$WORK_DIR/missing-forkop" \ -FORKOP_SERVICE_INIT="$WORK_DIR/missing-init" \ +TACHYON_LIB="$package_runtime_lib" \ +TACHYON_RUNTIME_STATE_DIR="$WORK_DIR/apk-package-runtime" \ +TACHYON_BIN="$WORK_DIR/missing-tachyon" \ +TACHYON_SERVICE_INIT="$WORK_DIR/missing-init" \ FAKE_APK_LOG="$WORK_DIR/apk.log" \ ucode -L "$package_runtime_lib" "$ACTION_UC" component-action sing_box install_stable >/dev/null set -e @@ -302,47 +302,47 @@ release_json="$(cat <<'JSON' "tag_name": "1.2.3", "html_url": "https://example.com/release", "assets": [ - {"name": "forkop_1.2.3.ipk", "browser_download_url": "https://example.com/backend.ipk"}, - {"name": "luci-app-forkop_1.2.3.ipk", "browser_download_url": "https://example.com/app.ipk"}, - {"name": "luci-i18n-forkop-ru_1.2.3.ipk", "browser_download_url": "https://example.com/i18n.ipk"} + {"name": "tachyon_1.2.3.ipk", "browser_download_url": "https://example.com/backend.ipk"}, + {"name": "luci-app-tachyon_1.2.3.ipk", "browser_download_url": "https://example.com/app.ipk"}, + {"name": "luci-i18n-tachyon-ru_1.2.3.ipk", "browser_download_url": "https://example.com/i18n.ipk"} ] } JSON )" -assert_eq "$(printf 'https://example.com/release\tforkop_1.2.3.ipk\thttps://example.com/backend.ipk\tluci-app-forkop_1.2.3.ipk\thttps://example.com/app.ipk\tluci-i18n-forkop-ru_1.2.3.ipk\thttps://example.com/i18n.ipk')" \ - "$(printf '%s' "$release_json" | ucode "$UPDATER" forkop-release-plan 1.2.3 ipk 1)" \ - "forkop release plan with i18n" -assert_eq "$(printf 'https://example.com/release\tforkop_1.2.3.ipk\thttps://example.com/backend.ipk\tluci-app-forkop_1.2.3.ipk\thttps://example.com/app.ipk\t\t')" \ - "$(printf '%s' "$release_json" | ucode "$UPDATER" forkop-release-plan 1.2.3 ipk 0)" \ - "forkop release plan without i18n" -if printf '%s' "$release_json" | ucode "$UPDATER" forkop-release-plan 9.9.9 ipk 0 >/dev/null 2>&1; then - fail "forkop release plan should reject tag mismatch" +assert_eq "$(printf 'https://example.com/release\ttachyon_1.2.3.ipk\thttps://example.com/backend.ipk\tluci-app-tachyon_1.2.3.ipk\thttps://example.com/app.ipk\tluci-i18n-tachyon-ru_1.2.3.ipk\thttps://example.com/i18n.ipk')" \ + "$(printf '%s' "$release_json" | ucode "$UPDATER" tachyon-release-plan 1.2.3 ipk 1)" \ + "tachyon release plan with i18n" +assert_eq "$(printf 'https://example.com/release\ttachyon_1.2.3.ipk\thttps://example.com/backend.ipk\tluci-app-tachyon_1.2.3.ipk\thttps://example.com/app.ipk\t\t')" \ + "$(printf '%s' "$release_json" | ucode "$UPDATER" tachyon-release-plan 1.2.3 ipk 0)" \ + "tachyon release plan without i18n" +if printf '%s' "$release_json" | ucode "$UPDATER" tachyon-release-plan 9.9.9 ipk 0 >/dev/null 2>&1; then + fail "tachyon release plan should reject tag mismatch" fi missing_i18n_json="$(cat <<'JSON' { "tag_name": "1.2.3", "html_url": "https://example.com/release", "assets": [ - {"name": "forkop_1.2.3.ipk", "browser_download_url": "https://example.com/backend.ipk"}, - {"name": "luci-app-forkop_1.2.3.ipk", "browser_download_url": "https://example.com/app.ipk"} + {"name": "tachyon_1.2.3.ipk", "browser_download_url": "https://example.com/backend.ipk"}, + {"name": "luci-app-tachyon_1.2.3.ipk", "browser_download_url": "https://example.com/app.ipk"} ] } JSON )" -if printf '%s' "$missing_i18n_json" | ucode "$UPDATER" forkop-release-plan 1.2.3 ipk 1 >/dev/null 2>&1; then - fail "forkop release plan should require i18n asset when requested" +if printf '%s' "$missing_i18n_json" | ucode "$UPDATER" tachyon-release-plan 1.2.3 ipk 1 >/dev/null 2>&1; then + fail "tachyon release plan should require i18n asset when requested" fi -ucode "$UPDATER" forkop-release-version-valid 1.2.3 || - fail "three-part Forkop release version should be valid" +ucode "$UPDATER" tachyon-release-version-valid 1.2.3 || + fail "three-part Tachyon release version should be valid" for invalid_version in v1.2.3 1.2 1.2.3.4 1.2.3-1 1.2.3-r1; do - if ucode "$UPDATER" forkop-release-version-valid "$invalid_version" >/dev/null 2>&1; then - fail "invalid Forkop release version was accepted: $invalid_version" + if ucode "$UPDATER" tachyon-release-version-valid "$invalid_version" >/dev/null 2>&1; then + fail "invalid Tachyon release version was accepted: $invalid_version" fi done -assert_eq "-1" "$(ucode "$UPDATER" forkop-release-version-compare 1.2.3 1.2.4)" \ - "three-part Forkop release version comparison" +assert_eq "-1" "$(ucode "$UPDATER" tachyon-release-version-compare 1.2.3 1.2.4)" \ + "three-part Tachyon release version comparison" assert_eq "1.13.14-extended-2.5.0" \ "$(printf 'sing-box version 1.13.14-extended-2.5.0\n\nEnvironment: go1.26.4 linux/amd64\n' | ucode "$UPDATER" stdin-first-line-last-field)" \ @@ -352,9 +352,9 @@ component_actions_dir="$WORK_DIR/component-actions" fake_lib="$WORK_DIR/lib" mkdir -p "$fake_lib/components" "$fake_lib/config" "$fake_lib/core" cp "$UPDATES_UC" "$fake_lib/components/updates.uc" -cp "$FORKOP_LIB/config/connections.uc" "$fake_lib/config/connections.uc" -cp "$FORKOP_LIB/core/uci.uc" "$fake_lib/core/uci.uc" -cp "$FORKOP_LIB/core/common.uc" "$fake_lib/core/common.uc" +cp "$TACHYON_LIB/config/connections.uc" "$fake_lib/config/connections.uc" +cp "$TACHYON_LIB/core/uci.uc" "$fake_lib/core/uci.uc" +cp "$TACHYON_LIB/core/common.uc" "$fake_lib/core/common.uc" cat >"$fake_lib/components/action.uc" <<'UCODE' #!/usr/bin/env ucode if ((ARGV[0] || "") == "component-action") { @@ -364,8 +364,8 @@ if ((ARGV[0] || "") == "component-action") { exit(1); UCODE -start_json="$(FORKOP_LIB="$fake_lib" UPDATES_JOB_DIR="$component_actions_dir" \ - ucode -L "$FORKOP_LIB" "$UPDATES_UC" component-action-async sing_box check_update)" +start_json="$(TACHYON_LIB="$fake_lib" UPDATES_JOB_DIR="$component_actions_dir" \ + ucode -L "$TACHYON_LIB" "$UPDATES_UC" component-action-async sing_box check_update)" job_id="$(JSON_VALUE="$start_json" node - <<'NODE' const value = JSON.parse(process.env.JSON_VALUE); if (!value.success || !value.job_id) { @@ -378,8 +378,8 @@ NODE status_json="" for _ in 1 2 3 4 5; do - status_json="$(FORKOP_LIB="$fake_lib" UPDATES_JOB_DIR="$component_actions_dir" \ - ucode -L "$FORKOP_LIB" "$UPDATES_UC" component-action-status "$job_id")" + status_json="$(TACHYON_LIB="$fake_lib" UPDATES_JOB_DIR="$component_actions_dir" \ + ucode -L "$TACHYON_LIB" "$UPDATES_UC" component-action-status "$job_id")" JSON_VALUE="$status_json" node - <<'NODE' && break || true const value = JSON.parse(process.env.JSON_VALUE); process.exit(value.running === false ? 0 : 1); @@ -396,8 +396,8 @@ if (value.running !== false || value.success !== true || value.component !== "si } NODE -start_json="$(FORKOP_LIB="$fake_lib" UPDATES_JOB_DIR="$component_actions_dir" \ - ucode -L "$FORKOP_LIB" "$UPDATES_UC" component-action-async sing-box check_update)" +start_json="$(TACHYON_LIB="$fake_lib" UPDATES_JOB_DIR="$component_actions_dir" \ + ucode -L "$TACHYON_LIB" "$UPDATES_UC" component-action-async sing-box check_update)" job_id="$(JSON_VALUE="$start_json" node - <<'NODE' const value = JSON.parse(process.env.JSON_VALUE); if (!value.success || !value.job_id) { @@ -410,8 +410,8 @@ NODE status_json="" for _ in 1 2 3 4 5; do - status_json="$(FORKOP_LIB="$fake_lib" UPDATES_JOB_DIR="$component_actions_dir" \ - ucode -L "$FORKOP_LIB" "$UPDATES_UC" component-action-status "$job_id")" + status_json="$(TACHYON_LIB="$fake_lib" UPDATES_JOB_DIR="$component_actions_dir" \ + ucode -L "$TACHYON_LIB" "$UPDATES_UC" component-action-status "$job_id")" JSON_VALUE="$status_json" node - <<'NODE' && break || true const value = JSON.parse(process.env.JSON_VALUE); process.exit(value.running === false ? 0 : 1); diff --git a/tests/config_contract_matrix.sh b/tests/config_contract_matrix.sh index da00df4d..f7137878 100644 --- a/tests/config_contract_matrix.sh +++ b/tests/config_contract_matrix.sh @@ -2,8 +2,8 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -STABLE_REF="${FORKOP_STABLE_REF:-0.7.19.9}" -STABLE_REPO="${FORKOP_STABLE_REPO:-}" +STABLE_REF="${TACHYON_STABLE_REF:-0.7.19.9}" +STABLE_REPO="${TACHYON_STABLE_REPO:-}" MATRIX_SCRIPT="$ROOT_DIR/tests/helpers/config_contract_matrix.js" WORK_DIR="$(mktemp -d)" LEGACY_STEM="$(printf '\160\157\144\153\157\160')" @@ -29,7 +29,7 @@ ensure_stable_ref() { prepare_stable_repo() { if [ -n "$STABLE_REPO" ]; then - if [ ! -r "$STABLE_REPO/forkop/files/etc/config/forkop" ] && + if [ ! -r "$STABLE_REPO/tachyon/files/etc/config/tachyon" ] && [ ! -r "$STABLE_REPO/$LEGACY_STEM/files/etc/config/$LEGACY_STEM" ]; then fail "stable repo is missing the expected config template: $STABLE_REPO" fi diff --git a/tests/config_migration.sh b/tests/config_migration.sh index 988be428..da383cbd 100644 --- a/tests/config_migration.sh +++ b/tests/config_migration.sh @@ -2,12 +2,12 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -RUNTIME_MIGRATION="$FORKOP_LIB/config/migration.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +RUNTIME_MIGRATION="$TACHYON_LIB/config/migration.uc" INSTALLER="$ROOT_DIR/install.sh" WORK_DIR="$(mktemp -d)" MIGRATION="$RUNTIME_MIGRATION" -MIGRATIONS_DIR="$FORKOP_LIB/config/migrations" +MIGRATIONS_DIR="$TACHYON_LIB/config/migrations" cleanup() { rm -rf "$WORK_DIR" @@ -19,7 +19,7 @@ fail() { exit 1 } -if grep -n -E 'FORKOP_CONFIG_MIGRATION_EOF|installer_config_migration_path' "$INSTALLER" >/dev/null 2>&1; then +if grep -n -E 'TACHYON_CONFIG_MIGRATION_EOF|installer_config_migration_path' "$INSTALLER" >/dev/null 2>&1; then fail "install.sh must not embed configuration migration logic" fi [ -s "$MIGRATION" ] || fail "runtime configuration migration module is missing" @@ -37,7 +37,7 @@ grep -Fq '{ id: "enable_component_checks", run: migrate_enable_component_checks grep -Fq 'release_at_most(ctx, "1.0.1")' "$MIGRATION" || fail "release-specific migrations must use the source release only as a condition" -eval "$(ucode -L "$FORKOP_LIB" "$FORKOP_LIB/core/constants.uc" shell-env)" +eval "$(ucode -L "$TACHYON_LIB" "$TACHYON_LIB/core/constants.uc" shell-env)" export ZAPRET_LEGACY_DEFAULT_NFQWS_OPT ZAPRET_DEFAULT_NFQWS_OPT node >"$WORK_DIR/fixture.json" <<'NODE' @@ -155,7 +155,7 @@ const fixture = { process.stdout.write(`${JSON.stringify(fixture, null, 2)}\n`); NODE -FORKOP_LIB="$FORKOP_LIB" ucode -L "$FORKOP_LIB" "$MIGRATION" migrate-fixture "$WORK_DIR/fixture.json" podkop >"$WORK_DIR/output.json" +TACHYON_LIB="$TACHYON_LIB" ucode -L "$TACHYON_LIB" "$MIGRATION" migrate-fixture "$WORK_DIR/fixture.json" podkop >"$WORK_DIR/output.json" node - "$WORK_DIR/output.json" <<'NODE' const fs = require('fs'); @@ -350,10 +350,10 @@ assert(legacyOutboundCollision.outbound_jsons.length === 2, 'legacy JSON outboun assert(JSON.parse(legacyOutboundCollision.outbound_jsons[1]).tag === 'legacy-outbound-collision-json-2-out-1', 'legacy JSON outbound tag avoids existing list tags'); assert(out.removed_caches.includes('/tmp/sing-box/subscriptions/legacy-sub.json'), 'subscription runtime cache removal'); -assert(out.removed_caches.includes('/var/run/forkop/section-cache/legacy-sub.json'), 'section cache removal'); +assert(out.removed_caches.includes('/var/run/tachyon/section-cache/legacy-sub.json'), 'section cache removal'); NODE -cat >"$WORK_DIR/forkop-1.0.1.json" <<'JSON' +cat >"$WORK_DIR/tachyon-1.0.1.json" <<'JSON' { "settings": { ".name": "settings", @@ -372,9 +372,9 @@ cat >"$WORK_DIR/forkop-1.0.1.json" <<'JSON' } JSON -FORKOP_LIB="$FORKOP_LIB" ucode -L "$FORKOP_LIB" "$MIGRATION" migrate-fixture "$WORK_DIR/forkop-1.0.1.json" >"$WORK_DIR/forkop-1.0.2.json" +TACHYON_LIB="$TACHYON_LIB" ucode -L "$TACHYON_LIB" "$MIGRATION" migrate-fixture "$WORK_DIR/tachyon-1.0.1.json" >"$WORK_DIR/tachyon-1.0.2.json" -node - "$WORK_DIR/forkop-1.0.2.json" <<'NODE' +node - "$WORK_DIR/tachyon-1.0.2.json" <<'NODE' const fs = require('fs'); const out = JSON.parse(fs.readFileSync(process.argv[2], 'utf8')); const section = out.config.section[0]; @@ -401,7 +401,7 @@ for (const item of interfaces) { } NODE -cat >"$WORK_DIR/forkop-1.0.2-disabled.json" <<'JSON' +cat >"$WORK_DIR/tachyon-1.0.2-disabled.json" <<'JSON' { "settings": { ".name": "settings", @@ -413,9 +413,9 @@ cat >"$WORK_DIR/forkop-1.0.2-disabled.json" <<'JSON' } JSON -FORKOP_LIB="$FORKOP_LIB" ucode -L "$FORKOP_LIB" "$MIGRATION" migrate-fixture "$WORK_DIR/forkop-1.0.2-disabled.json" >"$WORK_DIR/forkop-1.0.2-disabled-output.json" +TACHYON_LIB="$TACHYON_LIB" ucode -L "$TACHYON_LIB" "$MIGRATION" migrate-fixture "$WORK_DIR/tachyon-1.0.2-disabled.json" >"$WORK_DIR/tachyon-1.0.2-disabled-output.json" -node - "$WORK_DIR/forkop-1.0.2-disabled-output.json" <<'NODE' +node - "$WORK_DIR/tachyon-1.0.2-disabled-output.json" <<'NODE' const fs = require('fs'); const out = JSON.parse(fs.readFileSync(process.argv[2], 'utf8')); @@ -431,112 +431,112 @@ assert(JSON.stringify(out.config.settings.applied_migrations) === JSON.stringify NODE cat >"$WORK_DIR/runtime-migrate.state" <<'EOF_UCI' -forkop.settings=settings -forkop.settings.routing_excluded_ips=192.0.2.0/24 -forkop.legacy=rule -forkop.legacy.enabled=1 -forkop.legacy.connection_type=proxy -forkop.legacy.proxy_config_type=url -forkop.legacy.proxy_string=vless://one -forkop.old_direct=section -forkop.old_direct.enabled=1 -forkop.old_direct.action=direct -forkop.vpn=section -forkop.vpn.enabled=1 -forkop.vpn.connection_type=vpn -forkop.vpn.interface=awg0 -forkop.vpn.domain_resolver_enabled=1 -forkop.vpn.domain_resolver_dns_type=doh -forkop.vpn.domain_resolver_dns_server=https://dns.example/dns-query +tachyon.settings=settings +tachyon.settings.routing_excluded_ips=192.0.2.0/24 +tachyon.legacy=rule +tachyon.legacy.enabled=1 +tachyon.legacy.connection_type=proxy +tachyon.legacy.proxy_config_type=url +tachyon.legacy.proxy_string=vless://one +tachyon.old_direct=section +tachyon.old_direct.enabled=1 +tachyon.old_direct.action=direct +tachyon.vpn=section +tachyon.vpn.enabled=1 +tachyon.vpn.connection_type=vpn +tachyon.vpn.interface=awg0 +tachyon.vpn.domain_resolver_enabled=1 +tachyon.vpn.domain_resolver_dns_type=doh +tachyon.vpn.domain_resolver_dns_server=https://dns.example/dns-query EOF_UCI mkdir -p "$WORK_DIR/runtime" "$WORK_DIR/persistent-cache" : >"$WORK_DIR/runtime-migrate.log" -FORKOP_UCI_STATE_FILE="$WORK_DIR/runtime-migrate.state" \ -FORKOP_UCI_LOG_FILE="$WORK_DIR/runtime-migrate.log" \ -FORKOP_CONFIG_NAME="forkop" \ +TACHYON_UCI_STATE_FILE="$WORK_DIR/runtime-migrate.state" \ +TACHYON_UCI_LOG_FILE="$WORK_DIR/runtime-migrate.log" \ +TACHYON_CONFIG_NAME="tachyon" \ TMP_SUBSCRIPTION_FOLDER="$WORK_DIR/tmp-subscriptions" \ -FORKOP_RUNTIME_STATE_DIR="$WORK_DIR/runtime" \ -FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR="$WORK_DIR/persistent-cache" \ -FORKOP_INTERNAL_CONFIG_TRIGGER_GUARD="$WORK_DIR/internal-config-change" \ -ucode -L "$FORKOP_LIB" "$MIGRATION" migrate-podkop +TACHYON_RUNTIME_STATE_DIR="$WORK_DIR/runtime" \ +TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR="$WORK_DIR/persistent-cache" \ +TACHYON_INTERNAL_CONFIG_TRIGGER_GUARD="$WORK_DIR/internal-config-change" \ +ucode -L "$TACHYON_LIB" "$MIGRATION" migrate-podkop -grep -Fxq 'forkop.legacy=section' "$WORK_DIR/runtime-migrate.state" || +grep -Fxq 'tachyon.legacy=section' "$WORK_DIR/runtime-migrate.state" || fail "runtime migration must convert legacy rule type through core.uci" -grep -Fxq 'forkop.legacy.action=connection' "$WORK_DIR/runtime-migrate.state" || +grep -Fxq 'tachyon.legacy.action=connection' "$WORK_DIR/runtime-migrate.state" || fail "runtime migration must write migrated action through core.uci" -grep -Fxq 'forkop.old_direct.action=bypass' "$WORK_DIR/runtime-migrate.state" || +grep -Fxq 'tachyon.old_direct.action=bypass' "$WORK_DIR/runtime-migrate.state" || fail "runtime migration must convert direct action to bypass through core.uci" -grep -Eq '^forkop\\.cfg[0-9a-f]+=$' "$WORK_DIR/runtime-migrate.state" && fail "anonymous fixture section should include a type" -grep -Fxq 'forkop.legacy.selector_proxy_links=vless://one' "$WORK_DIR/runtime-migrate.state" || +grep -Eq '^tachyon\\.cfg[0-9a-f]+=$' "$WORK_DIR/runtime-migrate.state" && fail "anonymous fixture section should include a type" +grep -Fxq 'tachyon.legacy.selector_proxy_links=vless://one' "$WORK_DIR/runtime-migrate.state" || fail "runtime migration must keep connection URLs in the parent section" if grep -Fq '=connection_url' "$WORK_DIR/runtime-migrate.state"; then fail "runtime migration must not create connection_url child sections" fi -grep -Eq '^forkop\.cfg[0-9a-f]+=section_interface$' "$WORK_DIR/runtime-migrate.state" || +grep -Eq '^tachyon\.cfg[0-9a-f]+=section_interface$' "$WORK_DIR/runtime-migrate.state" || fail "runtime migration must create an anonymous interface settings section" -grep -Eq '^forkop\.cfg[0-9a-f]+\.section=vpn$' "$WORK_DIR/runtime-migrate.state" || +grep -Eq '^tachyon\.cfg[0-9a-f]+\.section=vpn$' "$WORK_DIR/runtime-migrate.state" || fail "runtime interface settings section must reference its parent" -grep -Eq '^forkop\.cfg[0-9a-f]+\.name=' "$WORK_DIR/runtime-migrate.state" || +grep -Eq '^tachyon\.cfg[0-9a-f]+\.name=' "$WORK_DIR/runtime-migrate.state" || fail "runtime interface settings section must store the interface name" -if grep -Fq 'forkop.legacy.urltest_enabled=' "$WORK_DIR/runtime-migrate.state"; then +if grep -Fq 'tachyon.legacy.urltest_enabled=' "$WORK_DIR/runtime-migrate.state"; then fail "runtime migration must delete migrated urltest_enabled through core.uci" fi -if grep -Fq 'forkop.settings.routing_excluded_ips=' "$WORK_DIR/runtime-migrate.state"; then +if grep -Fq 'tachyon.settings.routing_excluded_ips=' "$WORK_DIR/runtime-migrate.state"; then fail "runtime migration must delete removed routing_excluded_ips through core.uci" fi -if grep -Fq 'forkop.legacy.proxy_string=' "$WORK_DIR/runtime-migrate.state"; then +if grep -Fq 'tachyon.legacy.proxy_string=' "$WORK_DIR/runtime-migrate.state"; then fail "runtime migration must delete legacy proxy_string through core.uci" fi -grep -Fxq 'commit forkop' "$WORK_DIR/runtime-migrate.log" || +grep -Fxq 'commit tachyon' "$WORK_DIR/runtime-migrate.log" || fail "runtime migration must commit through core.uci" cat >"$WORK_DIR/runtime-version.state" <<'EOF_UCI' -forkop.settings=settings -forkop.settings.config_version=1.0.1 -forkop.settings.component_update_check_enabled=0 -forkop.main=section -forkop.main.enabled=1 -forkop.main.action=connection -forkop.main.interfaces=awg0 +tachyon.settings=settings +tachyon.settings.config_version=1.0.1 +tachyon.settings.component_update_check_enabled=0 +tachyon.main=section +tachyon.main.enabled=1 +tachyon.main.action=connection +tachyon.main.interfaces=awg0 EOF_UCI : >"$WORK_DIR/runtime-version.log" -FORKOP_UCI_STATE_FILE="$WORK_DIR/runtime-version.state" \ -FORKOP_UCI_LOG_FILE="$WORK_DIR/runtime-version.log" \ -FORKOP_CONFIG_NAME="forkop" \ -FORKOP_INTERNAL_CONFIG_TRIGGER_GUARD="$WORK_DIR/internal-config-change" \ -ucode -L "$FORKOP_LIB" "$MIGRATION" migrate +TACHYON_UCI_STATE_FILE="$WORK_DIR/runtime-version.state" \ +TACHYON_UCI_LOG_FILE="$WORK_DIR/runtime-version.log" \ +TACHYON_CONFIG_NAME="tachyon" \ +TACHYON_INTERNAL_CONFIG_TRIGGER_GUARD="$WORK_DIR/internal-config-change" \ +ucode -L "$TACHYON_LIB" "$MIGRATION" migrate -grep -Fxq 'forkop.settings.config_version=1.0.2' "$WORK_DIR/runtime-version.state" || +grep -Fxq 'tachyon.settings.config_version=1.0.2' "$WORK_DIR/runtime-version.state" || fail "runtime version migration must advance config_version" -grep -Fxq 'forkop.settings.component_update_check_enabled=1' "$WORK_DIR/runtime-version.state" || +grep -Fxq 'tachyon.settings.component_update_check_enabled=1' "$WORK_DIR/runtime-version.state" || fail "runtime version migration must enable component update checks" -grep -Fq 'forkop.settings.applied_migrations=interface_sections enable_component_checks' "$WORK_DIR/runtime-version.state" || +grep -Fq 'tachyon.settings.applied_migrations=interface_sections enable_component_checks' "$WORK_DIR/runtime-version.state" || fail "runtime migration must record stable migration names" -grep -Eq '^forkop\.cfg[0-9a-f]+=section_interface$' "$WORK_DIR/runtime-version.state" || +grep -Eq '^tachyon\.cfg[0-9a-f]+=section_interface$' "$WORK_DIR/runtime-version.state" || fail "runtime version migration must create interface child settings" -if grep -Fq 'forkop.main.interfaces=' "$WORK_DIR/runtime-version.state"; then +if grep -Fq 'tachyon.main.interfaces=' "$WORK_DIR/runtime-version.state"; then fail "runtime version migration must remove the parent interface list" fi : >"$WORK_DIR/runtime-version.log" -FORKOP_UCI_STATE_FILE="$WORK_DIR/runtime-version.state" \ -FORKOP_UCI_LOG_FILE="$WORK_DIR/runtime-version.log" \ -FORKOP_CONFIG_NAME="forkop" \ -FORKOP_INTERNAL_CONFIG_TRIGGER_GUARD="$WORK_DIR/internal-config-change" \ -ucode -L "$FORKOP_LIB" "$MIGRATION" migrate -if grep -Fq 'commit forkop' "$WORK_DIR/runtime-version.log"; then +TACHYON_UCI_STATE_FILE="$WORK_DIR/runtime-version.state" \ +TACHYON_UCI_LOG_FILE="$WORK_DIR/runtime-version.log" \ +TACHYON_CONFIG_NAME="tachyon" \ +TACHYON_INTERNAL_CONFIG_TRIGGER_GUARD="$WORK_DIR/internal-config-change" \ +ucode -L "$TACHYON_LIB" "$MIGRATION" migrate +if grep -Fq 'commit tachyon' "$WORK_DIR/runtime-version.log"; then fail "completed named migrations must be idempotent" fi : >"$WORK_DIR/uci-commit.log" : >"$WORK_DIR/uci-commit.state" -FORKOP_UCI_STATE_FILE="$WORK_DIR/uci-commit.state" \ -FORKOP_UCI_LOG_FILE="$WORK_DIR/uci-commit.log" \ -FORKOP_CONFIG_NAME="forkop" \ -FORKOP_INTERNAL_CONFIG_TRIGGER_GUARD="$WORK_DIR/internal-config-change" \ -ucode -L "$FORKOP_LIB" "$MIGRATION" commit +TACHYON_UCI_STATE_FILE="$WORK_DIR/uci-commit.state" \ +TACHYON_UCI_LOG_FILE="$WORK_DIR/uci-commit.log" \ +TACHYON_CONFIG_NAME="tachyon" \ +TACHYON_INTERNAL_CONFIG_TRIGGER_GUARD="$WORK_DIR/internal-config-change" \ +ucode -L "$TACHYON_LIB" "$MIGRATION" commit -grep -Fxq 'commit forkop' "$WORK_DIR/uci-commit.log" || - fail "commit mode must commit forkop through core.uci" +grep -Fxq 'commit tachyon' "$WORK_DIR/uci-commit.log" || + fail "commit mode must commit tachyon through core.uci" printf 'installer config migration checks passed\n' diff --git a/tests/config_validation_owner.sh b/tests/config_validation_owner.sh index 75a0d243..e2004a2c 100644 --- a/tests/config_validation_owner.sh +++ b/tests/config_validation_owner.sh @@ -2,30 +2,30 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_FILES="$ROOT_DIR/forkop/files" -FORKOP_BIN="$FORKOP_FILES/usr/bin/forkop" -FORKOP_LIB="$FORKOP_FILES/usr/lib" -CLI_UC="$FORKOP_BIN" -VALIDATOR="$FORKOP_LIB/config/validator.uc" -RULE_CONFIG="$FORKOP_LIB/config/rule.uc" -GENERATOR="$FORKOP_LIB/singbox/generator.uc" -SECTION_JS="$ROOT_DIR/luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js" -LIFECYCLE="$FORKOP_LIB/service/lifecycle.uc" +TACHYON_FILES="$ROOT_DIR/tachyon/files" +TACHYON_BIN="$TACHYON_FILES/usr/bin/tachyon" +TACHYON_LIB="$TACHYON_FILES/usr/lib" +CLI_UC="$TACHYON_BIN" +VALIDATOR="$TACHYON_LIB/config/validator.uc" +RULE_CONFIG="$TACHYON_LIB/config/rule.uc" +GENERATOR="$TACHYON_LIB/singbox/generator.uc" +SECTION_JS="$ROOT_DIR/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js" +LIFECYCLE="$TACHYON_LIB/service/lifecycle.uc" fail() { printf 'FAIL: %s\n' "$1" >&2 exit 1 } -[ ! -e "$FORKOP_LIB/config_validation.sh" ] || +[ ! -e "$TACHYON_LIB/config_validation.sh" ] || fail "config_validation.sh shell owner must be removed" -if grep -R -n "config_validation.sh" "$FORKOP_FILES" >/dev/null 2>&1; then +if grep -R -n "config_validation.sh" "$TACHYON_FILES" >/dev/null 2>&1; then fail "runtime files must not reference config_validation.sh" fi -legacy_symbols='(^|[^A-Za-z0-9_])(config_validate_runtime|check_requirements|commit_forkop_config|mwan3_is_active|get_inline_remote_ruleset_format|detect_inline_ruleset_reference_kind)([^A-Za-z0-9_]|$)' -if grep -R -n -E "$legacy_symbols" "$FORKOP_BIN" "$FORKOP_LIB" --include='*.sh' >/dev/null 2>&1; then +legacy_symbols='(^|[^A-Za-z0-9_])(config_validate_runtime|check_requirements|commit_tachyon_config|mwan3_is_active|get_inline_remote_ruleset_format|detect_inline_ruleset_reference_kind)([^A-Za-z0-9_]|$)' +if grep -R -n -E "$legacy_symbols" "$TACHYON_BIN" "$TACHYON_LIB" --include='*.sh' >/dev/null 2>&1; then fail "runtime shell must not keep config_validation.sh symbols" fi @@ -46,8 +46,8 @@ grep -Fq 'return appendUniqueDomainTextValues(textValue, values);' "$SECTION_JS" if grep -n -E 'require\("uci"\)\.cursor|uci -q|uci", "-q"|command_output\("uci' "$VALIDATOR" >/dev/null 2>&1; then fail "config validator must not own direct UCI cursor or CLI access" fi -grep -Fq '#!/usr/bin/ucode' "$FORKOP_BIN" || - fail "forkop entrypoint must be a direct ucode executable" +grep -Fq '#!/usr/bin/ucode' "$TACHYON_BIN" || + fail "tachyon entrypoint must be a direct ucode executable" grep -Fq 'service/lifecycle.uc' "$CLI_UC" || fail "service/cli.uc must dispatch service lifecycle through service/lifecycle.uc" if grep -n -E 'MIGRATION_UC|config[./]migration|"migrate"' "$LIFECYCLE" >/dev/null 2>&1; then diff --git a/tests/config_validator_detour.sh b/tests/config_validator_detour.sh index 15eab1b6..38a0c45f 100644 --- a/tests/config_validator_detour.sh +++ b/tests/config_validator_detour.sh @@ -2,8 +2,8 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -VALIDATOR="$ROOT_DIR/forkop/files/usr/lib/config/validator.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +VALIDATOR="$ROOT_DIR/tachyon/files/usr/lib/config/validator.uc" fail() { printf 'FAIL: %s\n' "$1" >&2 @@ -20,7 +20,7 @@ assert_rejects() { shift 2 local output - if output="$(rows "$@" | ucode -L "$FORKOP_LIB" "$VALIDATOR" validate-outbound-detours 2>/dev/null)"; then + if output="$(rows "$@" | ucode -L "$TACHYON_LIB" "$VALIDATOR" validate-outbound-detours 2>/dev/null)"; then fail "$label should be rejected" fi @@ -31,7 +31,7 @@ assert_rejects() { rows \ source 1 connection 1 target \ target 1 connection 0 '' | - ucode -L "$FORKOP_LIB" "$VALIDATOR" validate-outbound-detours + ucode -L "$TACHYON_LIB" "$VALIDATOR" validate-outbound-detours assert_rejects "unsupported source action" "supported only for Connection rules" \ source 1 zapret 1 target \ diff --git a/tests/config_validator_download_section.sh b/tests/config_validator_download_section.sh index eb462b88..d6ad6f2e 100644 --- a/tests/config_validator_download_section.sh +++ b/tests/config_validator_download_section.sh @@ -2,8 +2,8 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -VALIDATOR="$ROOT_DIR/forkop/files/usr/lib/config/validator.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +VALIDATOR="$ROOT_DIR/tachyon/files/usr/lib/config/validator.uc" fail() { printf 'FAIL: %s\n' "$1" >&2 @@ -21,7 +21,7 @@ assert_accepts() { local zapret2="$4" shift 4 - rows "$@" | ucode -L "$FORKOP_LIB" "$VALIDATOR" validate-download-section "$target" "$byedpi" "$zapret" "$zapret2" + rows "$@" | ucode -L "$TACHYON_LIB" "$VALIDATOR" validate-download-section "$target" "$byedpi" "$zapret" "$zapret2" } assert_rejects() { @@ -34,7 +34,7 @@ assert_rejects() { shift 6 local output - if output="$(rows "$@" | ucode -L "$FORKOP_LIB" "$VALIDATOR" validate-download-section "$target" "$byedpi" "$zapret" "$zapret2" 2>/dev/null)"; then + if output="$(rows "$@" | ucode -L "$TACHYON_LIB" "$VALIDATOR" validate-download-section "$target" "$byedpi" "$zapret" "$zapret2" 2>/dev/null)"; then fail "$label should be rejected" fi diff --git a/tests/config_validator_reference.sh b/tests/config_validator_reference.sh index 5681e48a..0da50718 100644 --- a/tests/config_validator_reference.sh +++ b/tests/config_validator_reference.sh @@ -2,8 +2,8 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -VALIDATOR="$ROOT_DIR/forkop/files/usr/lib/config/validator.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +VALIDATOR="$ROOT_DIR/tachyon/files/usr/lib/config/validator.uc" COMMUNITY_SERVICES="youtube twitter telegram" fail() { @@ -15,7 +15,7 @@ assert_accepts() { local label="$1" shift - ucode -L "$FORKOP_LIB" "$VALIDATOR" "$@" >/dev/null || + ucode -L "$TACHYON_LIB" "$VALIDATOR" "$@" >/dev/null || fail "$label should be accepted" } @@ -23,7 +23,7 @@ assert_rejects() { local label="$1" shift - if ucode -L "$FORKOP_LIB" "$VALIDATOR" "$@" >/dev/null 2>&1; then + if ucode -L "$TACHYON_LIB" "$VALIDATOR" "$@" >/dev/null 2>&1; then fail "$label should be rejected" fi } diff --git a/tests/config_validator_runtime.sh b/tests/config_validator_runtime.sh index 20edc07e..8e63f1e1 100644 --- a/tests/config_validator_runtime.sh +++ b/tests/config_validator_runtime.sh @@ -2,8 +2,8 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -VALIDATOR="$FORKOP_LIB/config/validator.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +VALIDATOR="$TACHYON_LIB/config/validator.uc" WORK_DIR="$(mktemp -d)" cleanup() { @@ -33,7 +33,7 @@ if (input.settings.dns_server === undefined) input.settings.dns_server = ['77.88 if (input.settings.bootstrap_dns_server === undefined) input.settings.bootstrap_dns_server = ['77.88.8.8']; fs.writeFileSync(process.argv[3], JSON.stringify(input)); JS - FORKOP_LIB="$FORKOP_LIB" ucode -L "$FORKOP_LIB" "$VALIDATOR" validate-runtime-fixture "$normalized" "$context" + TACHYON_LIB="$TACHYON_LIB" ucode -L "$TACHYON_LIB" "$VALIDATOR" validate-runtime-fixture "$normalized" "$context" } assert_rejects() { @@ -432,7 +432,7 @@ cat >"$WORK_DIR/bad-byedpi.json" <<'JSON' ] } JSON -if output="$(FORKOP_LIB="$FORKOP_LIB" ucode -L "$FORKOP_LIB" "$VALIDATOR" validate-runtime-fixture "$WORK_DIR/bad-byedpi.json" "$provider_context" 2>/dev/null)"; then +if output="$(TACHYON_LIB="$TACHYON_LIB" ucode -L "$TACHYON_LIB" "$VALIDATOR" validate-runtime-fixture "$WORK_DIR/bad-byedpi.json" "$provider_context" 2>/dev/null)"; then fail "bad byedpi should be rejected" fi printf '%s\n' "$output" | grep -Fq "ByeDPI listen address and port are assigned" || @@ -440,10 +440,10 @@ printf '%s\n' "$output" | grep -Fq "ByeDPI listen address and port are assigned" runtime_lib="$WORK_DIR/runtime-lib" mkdir -p "$runtime_lib" -ln -s "$FORKOP_LIB/core" "$runtime_lib/core" -ln -s "$FORKOP_LIB/config" "$runtime_lib/config" -ln -s "$FORKOP_LIB/subscription" "$runtime_lib/subscription" -ln -s "$FORKOP_LIB/providers" "$runtime_lib/providers" +ln -s "$TACHYON_LIB/core" "$runtime_lib/core" +ln -s "$TACHYON_LIB/config" "$runtime_lib/config" +ln -s "$TACHYON_LIB/subscription" "$runtime_lib/subscription" +ln -s "$TACHYON_LIB/providers" "$runtime_lib/providers" touch "$WORK_DIR/ciadpi-provider" cat >"$WORK_DIR/bad-byedpi-runtime-state.json" <<'JSON' { @@ -469,7 +469,7 @@ env \ ZAPRET2_QUEUE_RANGE_SIZE="16" \ NFT_FAKEIP_MARK="0x00000800" \ NFT_OUTBOUND_MARK="0x00000400" \ - FORKOP_LIB="$runtime_lib" \ + TACHYON_LIB="$runtime_lib" \ ucode -L "$runtime_lib" "$VALIDATOR" validate-runtime-fixture "$WORK_DIR/bad-byedpi-runtime-state.json" "{}" chmod 755 "$WORK_DIR/ciadpi-provider" if output="$(env \ @@ -487,7 +487,7 @@ if output="$(env \ ZAPRET2_QUEUE_RANGE_SIZE="16" \ NFT_FAKEIP_MARK="0x00000800" \ NFT_OUTBOUND_MARK="0x00000400" \ - FORKOP_LIB="$runtime_lib" \ + TACHYON_LIB="$runtime_lib" \ ucode -L "$runtime_lib" "$VALIDATOR" validate-runtime-fixture "$WORK_DIR/bad-byedpi-runtime-state.json" "{}" 2>/dev/null)"; then fail "executable byedpi provider should enable strategy validation" fi diff --git a/tests/connection_cascade.sh b/tests/connection_cascade.sh index 4b292768..d991f803 100644 --- a/tests/connection_cascade.sh +++ b/tests/connection_cascade.sh @@ -2,8 +2,8 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -GENERATOR="$FORKOP_LIB/singbox/generator.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +GENERATOR="$TACHYON_LIB/singbox/generator.uc" WORK_DIR="$(mktemp -d)" cleanup() { @@ -49,7 +49,7 @@ cat >"$WORK_DIR/subscriptions/source-subscription-1.json" <<'JSON' "outbounds": [ "nested-entry", "independent" ], "url": "https://www.gstatic.com/generate_204", "interval": "3m", - "__forkop_allow_group": true + "__tachyon_allow_group": true } ] } @@ -100,7 +100,7 @@ cat >"$WORK_DIR/fixture.json" <<'JSON' JSON TMP_SUBSCRIPTION_FOLDER="$WORK_DIR/subscriptions" \ - ucode -L "$FORKOP_LIB" "$GENERATOR" generate-config-fixture \ + ucode -L "$TACHYON_LIB" "$GENERATOR" generate-config-fixture \ "$WORK_DIR/fixture.json" "$WORK_DIR/output.json" "127.0.0.1" ucode -e ' diff --git a/tests/constants_owner.sh b/tests/constants_owner.sh index bc8a593c..17586beb 100644 --- a/tests/constants_owner.sh +++ b/tests/constants_owner.sh @@ -2,16 +2,16 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_BIN="$ROOT_DIR/forkop/files/usr/bin/forkop" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -CLI_UC="$FORKOP_BIN" -FORKOP_MAKEFILE="$ROOT_DIR/forkop/Makefile" +TACHYON_BIN="$ROOT_DIR/tachyon/files/usr/bin/tachyon" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +CLI_UC="$TACHYON_BIN" +TACHYON_MAKEFILE="$ROOT_DIR/tachyon/Makefile" BUILD_SCRIPT="$ROOT_DIR/build.sh" -CONSTANTS_SH="$FORKOP_LIB/constants.sh" -LIFECYCLE_UC="$FORKOP_LIB/service/lifecycle.uc" -CONSTANTS_UC="$FORKOP_LIB/core/constants.uc" -SINGBOX_CONSTANTS_UC="$FORKOP_LIB/singbox/constants.uc" -FRONTEND_CONSTANTS="$ROOT_DIR/fe-app-forkop/src/constants.ts" +CONSTANTS_SH="$TACHYON_LIB/constants.sh" +LIFECYCLE_UC="$TACHYON_LIB/service/lifecycle.uc" +CONSTANTS_UC="$TACHYON_LIB/core/constants.uc" +SINGBOX_CONSTANTS_UC="$TACHYON_LIB/singbox/constants.uc" +FRONTEND_CONSTANTS="$ROOT_DIR/fe-app-tachyon/src/constants.ts" fail() { printf 'FAIL: %s\n' "$1" >&2 @@ -21,41 +21,41 @@ fail() { [ ! -e "$CONSTANTS_SH" ] || fail "constants.sh shell owner must be removed" -grep -Fq '#!/usr/bin/ucode' "$FORKOP_BIN" || - fail "forkop entrypoint must be a direct ucode executable" +grep -Fq '#!/usr/bin/ucode' "$TACHYON_BIN" || + fail "tachyon entrypoint must be a direct ucode executable" grep -Fq 'service/lifecycle.uc' "$CLI_UC" || fail "service/cli.uc must dispatch lifecycle orchestration through service/lifecycle.uc" grep -Fq 'core.constants' "$LIFECYCLE_UC" || fail "service/lifecycle.uc must load constants from core/constants.uc" if grep -R -n -E 'constants\.sh|read_shell_constants|expand_shell_constants|unquote_shell_value' \ - "$FORKOP_BIN" "$FORKOP_LIB" --include='*.sh' --include='*.uc' >/dev/null 2>&1; then + "$TACHYON_BIN" "$TACHYON_LIB" --include='*.sh' --include='*.uc' >/dev/null 2>&1; then fail "shell constants owner or parser references must not remain" fi -if grep -n 'constants\.sh' "$FORKOP_MAKEFILE" "$BUILD_SCRIPT" >/dev/null 2>&1; then +if grep -n 'constants\.sh' "$TACHYON_MAKEFILE" "$BUILD_SCRIPT" >/dev/null 2>&1; then fail "package build must not patch removed constants.sh" fi -grep -Fq 'core/constants.uc' "$FORKOP_MAKEFILE" || - fail "forkop/Makefile must patch core/constants.uc" +grep -Fq 'core/constants.uc' "$TACHYON_MAKEFILE" || + fail "tachyon/Makefile must patch core/constants.uc" grep -Fq 'core/constants.uc' "$BUILD_SCRIPT" || fail "manual WSL build must patch core/constants.uc" -config_name="$(ucode -L "$FORKOP_LIB" "$CONSTANTS_UC" get FORKOP_CONFIG_NAME)" -[ "$config_name" = "forkop" ] || - fail "core/constants.uc get returned unexpected FORKOP_CONFIG_NAME" +config_name="$(ucode -L "$TACHYON_LIB" "$CONSTANTS_UC" get TACHYON_CONFIG_NAME)" +[ "$config_name" = "tachyon" ] || + fail "core/constants.uc get returned unexpected TACHYON_CONFIG_NAME" -eval "$(ucode -L "$FORKOP_LIB" "$CONSTANTS_UC" shell-env)" -[ "$FORKOP_CONFIG" = "/etc/config/forkop" ] || - fail "core/constants.uc shell-env did not derive FORKOP_CONFIG" +eval "$(ucode -L "$TACHYON_LIB" "$CONSTANTS_UC" shell-env)" +[ "$TACHYON_CONFIG" = "/etc/config/tachyon" ] || + fail "core/constants.uc shell-env did not derive TACHYON_CONFIG" [ "$TMP_RULESET_FOLDER" = "/tmp/sing-box/rulesets" ] || fail "core/constants.uc shell-env did not derive TMP_RULESET_FOLDER" -[ "$BYEDPI_PID_DIR" = "/var/run/forkop/byedpi/pid" ] || +[ "$BYEDPI_PID_DIR" = "/var/run/tachyon/byedpi/pid" ] || fail "core/constants.uc shell-env did not derive BYEDPI_PID_DIR" -[ "$(ucode -L "$FORKOP_LIB" "$CONSTANTS_UC" get FAKEIP_TEST_DOMAIN)" = "fakeip.podkop.fyi" ] || +[ "$(ucode -L "$TACHYON_LIB" "$CONSTANTS_UC" get FAKEIP_TEST_DOMAIN)" = "fakeip.podkop.fyi" ] || fail "FakeIP diagnostics must use the deployed public endpoint" -[ "$(ucode -L "$FORKOP_LIB" "$CONSTANTS_UC" get CHECK_PROXY_IP_DOMAIN)" = "ip.podkop.fyi" ] || +[ "$(ucode -L "$TACHYON_LIB" "$CONSTANTS_UC" get CHECK_PROXY_IP_DOMAIN)" = "ip.podkop.fyi" ] || fail "public IP diagnostics must use the deployed public endpoint" grep -Fq 'const FAKEIP_TEST_DOMAIN = "fakeip.podkop.fyi";' "$SINGBOX_CONSTANTS_UC" || fail "sing-box constants must match the deployed FakeIP endpoint" diff --git a/tests/core_helpers.sh b/tests/core_helpers.sh index 7db9fabb..1724c5f6 100644 --- a/tests/core_helpers.sh +++ b/tests/core_helpers.sh @@ -2,7 +2,7 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -HELPERS_UC="$ROOT_DIR/forkop/files/usr/lib/core/helpers.uc" +HELPERS_UC="$ROOT_DIR/tachyon/files/usr/lib/core/helpers.uc" fail() { printf 'FAIL: %s\n' "$1" >&2 diff --git a/tests/core_uci_runtime.sh b/tests/core_uci_runtime.sh index 98df3fb9..3680ae0d 100644 --- a/tests/core_uci_runtime.sh +++ b/tests/core_uci_runtime.sh @@ -2,7 +2,7 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -UCODE_LIB="$ROOT_DIR/forkop/files/usr/lib" +UCODE_LIB="$ROOT_DIR/tachyon/files/usr/lib" WORK_DIR="$(mktemp -d)" cleanup() { diff --git a/tests/country_detection.sh b/tests/country_detection.sh index 287bf19a..c9b401dd 100644 --- a/tests/country_detection.sh +++ b/tests/country_detection.sh @@ -2,7 +2,7 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" WORK_DIR="$(mktemp -d)" cleanup() { @@ -95,9 +95,9 @@ UCODE FAKE_COUNTRY_PAYLOAD="$WORK_DIR/payload.json" \ FAKE_COUNTRY_RESOLVE="$WORK_DIR/resolve.txt" \ -FORKOP_COUNTRY_IS_URL="https://country.invalid/" \ +TACHYON_COUNTRY_IS_URL="https://country.invalid/" \ PATH="$WORK_DIR/bin:$PATH" \ - ucode -L "$FORKOP_LIB" "$WORK_DIR/runner.uc" + ucode -L "$TACHYON_LIB" "$WORK_DIR/runner.uc" grep -Fq '8.8.8.8' "$WORK_DIR/payload.json" || fail "country.is request did not contain the first resolved IP" diff --git a/tests/diagnostics_status.sh b/tests/diagnostics_status.sh index cd11ebab..15d2c33e 100644 --- a/tests/diagnostics_status.sh +++ b/tests/diagnostics_status.sh @@ -2,15 +2,15 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -DIAGNOSTICS="$ROOT_DIR/forkop/files/usr/lib/diagnostics/status.uc" -DIAGNOSTICS_RUNTIME="$ROOT_DIR/forkop/files/usr/lib/diagnostics/runtime.uc" -FORKOP_BIN="$ROOT_DIR/forkop/files/usr/bin/forkop" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -CLI_UC="$FORKOP_BIN" +DIAGNOSTICS="$ROOT_DIR/tachyon/files/usr/lib/diagnostics/status.uc" +DIAGNOSTICS_RUNTIME="$ROOT_DIR/tachyon/files/usr/lib/diagnostics/runtime.uc" +TACHYON_BIN="$ROOT_DIR/tachyon/files/usr/bin/tachyon" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +CLI_UC="$TACHYON_BIN" WORK_DIR="$(mktemp -d)" status_ucode() { - ucode -L "$FORKOP_LIB" "$DIAGNOSTICS" "$@" + ucode -L "$TACHYON_LIB" "$DIAGNOSTICS" "$@" } cleanup() { @@ -47,17 +47,17 @@ assert_status 1 0 0 "running but disabled" assert_status 0 1 1 "stopped but enabled" assert_status 0 0 0 "stopped & disabled" -[ ! -e "$FORKOP_LIB/status_diagnostics.sh" ] || +[ ! -e "$TACHYON_LIB/status_diagnostics.sh" ] || fail "status_diagnostics.sh shell owner must be removed" grep -Fq 'get_system_info: [ "diagnostics/runtime.uc", "get-system-info", 0 ]' "$CLI_UC" || fail "service/cli.uc must dispatch get_system_info through diagnostics/runtime.uc" -[ "$(FORKOP_VERSION=runtime-test ucode -L "$FORKOP_LIB" "$DIAGNOSTICS_RUNTIME" show-version)" = "runtime-test" ] || +[ "$(TACHYON_VERSION=runtime-test ucode -L "$TACHYON_LIB" "$DIAGNOSTICS_RUNTIME" show-version)" = "runtime-test" ] || fail "diagnostics/runtime.uc show-version mode failed" if grep -n -E 'require\("uci"\)\.cursor|uci -q|uci", "show"|uci", "-q"' "$DIAGNOSTICS_RUNTIME" >/dev/null 2>&1; then fail "diagnostics/runtime.uc must use core.uci instead of owning direct UCI cursor or CLI calls" fi -grep -Fq '"forkop-stably-running", RT_TABLE_NAME, NFT_TABLE_NAME, NFT_FAKEIP_MARK, RUNTIME_STABLE_MIN_AGE' "$DIAGNOSTICS_RUNTIME" || - fail "diagnostics Forkop status must use stable runtime state to avoid crash-loop flicker" +grep -Fq '"tachyon-stably-running", RT_TABLE_NAME, NFT_TABLE_NAME, NFT_FAKEIP_MARK, RUNTIME_STABLE_MIN_AGE' "$DIAGNOSTICS_RUNTIME" || + fail "diagnostics Tachyon status must use stable runtime state to avoid crash-loop flicker" grep -Fq '"sing-box-service-stable",' "$DIAGNOSTICS_RUNTIME" || fail "diagnostics sing-box status must use stable runtime state to avoid crash-loop flicker" @@ -71,13 +71,13 @@ if (value.status !== "running but disabled" || value.dns_configured !== 1) { NODE { - printf 'Tue Jun 30 11:00:00 2026 user.notice forkop: [info] Starting Forkop\n' + printf 'Tue Jun 30 11:00:00 2026 user.notice tachyon: [info] Starting Tachyon\n' for i in $(seq 1 4500); do printf 'Tue Jun 30 11:00:%02d 2026 daemon.info unrelated[%04d]: filler filler filler filler filler filler filler filler filler filler\n' "$((i % 60))" "$i" done - printf 'Tue Jun 30 11:01:00 2026 user.notice forkop: [info] large logread marker survived stdin transport\n' + printf 'Tue Jun 30 11:01:00 2026 user.notice tachyon: [info] large logread marker survived stdin transport\n' } >"$WORK_DIR/large-logread.txt" -large_logs="$(FORKOP_LIB="$FORKOP_LIB" ucode -L "$FORKOP_LIB" "$DIAGNOSTICS_RUNTIME" forkop-logs-fixture <"$WORK_DIR/large-logread.txt")" || +large_logs="$(TACHYON_LIB="$TACHYON_LIB" ucode -L "$TACHYON_LIB" "$DIAGNOSTICS_RUNTIME" tachyon-logs-fixture <"$WORK_DIR/large-logread.txt")" || fail "diagnostics/runtime.uc must process large logread payloads through stdin without shell argument limits" case "$large_logs" in *"large logread marker survived stdin transport"*) ;; @@ -94,14 +94,14 @@ SH chmod +x "$fake_bin/curl" uci_state="$WORK_DIR/uci-state.txt" cat >"$uci_state" <<'EOF' -forkop.settings=settings -forkop.settings.latency_test_url=https://latency.example/generate_204 +tachyon.settings=settings +tachyon.settings.latency_test_url=https://latency.example/generate_204 EOF FAKE_CURL_LOG="$WORK_DIR/fake-curl.log" \ -FORKOP_UCI_STATE_FILE="$uci_state" \ -FORKOP_LIB="$FORKOP_LIB" \ +TACHYON_UCI_STATE_FILE="$uci_state" \ +TACHYON_LIB="$TACHYON_LIB" \ PATH="$fake_bin:$PATH" \ - ucode -L "$FORKOP_LIB" "$DIAGNOSTICS_RUNTIME" clash-api get_proxy_latency proxy-out 5000 >/dev/null || + ucode -L "$TACHYON_LIB" "$DIAGNOSTICS_RUNTIME" clash-api get_proxy_latency proxy-out 5000 >/dev/null || fail "clash-api get_proxy_latency should use fake curl successfully" grep -Fq "url=https://latency.example/generate_204" "$WORK_DIR/fake-curl.log" || fail "clash-api latency check must use settings.latency_test_url" @@ -111,11 +111,11 @@ mkdir -p "$latency_action_dir" latency_state="$latency_action_dir/latency-1.json" printf '%s\n' '{"success":true,"running":true,"kind":"latency","latency_type":"proxy_list","section":"main","tag":"[]","started_at":100}' >"$latency_state" FAKE_CURL_LOG="$WORK_DIR/fake-curl-latencies.log" \ -FORKOP_UCI_STATE_FILE="$uci_state" \ -FORKOP_LIB="$FORKOP_LIB" \ -FORKOP_UI_LATENCY_ACTION_DIR="$latency_action_dir" \ +TACHYON_UCI_STATE_FILE="$uci_state" \ +TACHYON_LIB="$TACHYON_LIB" \ +TACHYON_UI_LATENCY_ACTION_DIR="$latency_action_dir" \ PATH="$fake_bin:$PATH" \ - ucode -L "$FORKOP_LIB" "$DIAGNOSTICS_RUNTIME" clash-api get_proxy_latencies '["proxy-a","proxy-b"]' 5000 "$latency_state" >/dev/null || + ucode -L "$TACHYON_LIB" "$DIAGNOSTICS_RUNTIME" clash-api get_proxy_latencies '["proxy-a","proxy-b"]' 5000 "$latency_state" >/dev/null || fail "clash-api get_proxy_latencies should update latency progress" JOB_STATE="$latency_state" node - <<'NODE' const fs = require("fs"); @@ -226,10 +226,10 @@ EOF )" printf '%s\n' "$sing_box_netstat" | - FORKOP_LIB="$FORKOP_LIB" ucode -L "$FORKOP_LIB" "$DIAGNOSTICS_RUNTIME" sing-box-standard-ports-listening-fixture >/dev/null || + TACHYON_LIB="$TACHYON_LIB" ucode -L "$TACHYON_LIB" "$DIAGNOSTICS_RUNTIME" sing-box-standard-ports-listening-fixture >/dev/null || fail "sing-box standard listeners should satisfy diagnostics" if printf '%s\n' "$sing_box_netstat" | sed '/0.0.0.0:1602/d' | - FORKOP_LIB="$FORKOP_LIB" ucode -L "$FORKOP_LIB" "$DIAGNOSTICS_RUNTIME" sing-box-standard-ports-listening-fixture >/dev/null 2>&1; then + TACHYON_LIB="$TACHYON_LIB" ucode -L "$TACHYON_LIB" "$DIAGNOSTICS_RUNTIME" sing-box-standard-ports-listening-fixture >/dev/null 2>&1; then fail "missing sing-box tproxy listener should fail diagnostics" fi diff --git a/tests/dns_action_ui.sh b/tests/dns_action_ui.sh index ee8fcd02..40c88ae1 100644 --- a/tests/dns_action_ui.sh +++ b/tests/dns_action_ui.sh @@ -2,7 +2,7 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -SECTION_JS="$ROOT_DIR/luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js" +SECTION_JS="$ROOT_DIR/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js" node - "$SECTION_JS" <<'NODE' const fs = require("fs"); diff --git a/tests/dns_apply.sh b/tests/dns_apply.sh index 109374b5..52f4a229 100644 --- a/tests/dns_apply.sh +++ b/tests/dns_apply.sh @@ -2,8 +2,8 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -APPLY="$ROOT_DIR/forkop/files/usr/lib/dns/apply.uc" -UCODE_LIB="$ROOT_DIR/forkop/files/usr/lib" +APPLY="$ROOT_DIR/tachyon/files/usr/lib/dns/apply.uc" +UCODE_LIB="$ROOT_DIR/tachyon/files/usr/lib" WORK_DIR="$(mktemp -d)" STATE="$WORK_DIR/uci.state" LOG="$WORK_DIR/uci.log" @@ -131,7 +131,7 @@ export UCI_STATE="$STATE" export UCI_LOG="$LOG" export DNSMASQ_LOG export DNSMASQ_INIT="$WORK_DIR/dnsmasq-init" -export FORKOP_CONFIG_NAME="forkop" +export TACHYON_CONFIG_NAME="tachyon" export SB_DNS_INBOUND_ADDRESS="127.0.0.42" if grep -E 'uci -q|command -v uci' "$APPLY" >/dev/null; then @@ -182,18 +182,18 @@ cat >"$STATE" <<'EOF_STATE' dhcp.@dnsmasq[0].server=1.1.1.1 8.8.8.8 dhcp.@dnsmasq[0].noresolv=0 dhcp.@dnsmasq[0].cachesize=150 -forkop.settings.shutdown_correctly=1 +tachyon.settings.shutdown_correctly=1 EOF_STATE : > "$DNSMASQ_LOG" : > "$LOG" ucode -L "$UCODE_LIB" "$APPLY" configure force assert_value 'dhcp.@dnsmasq[0].server' '127.0.0.42' -assert_value 'dhcp.@dnsmasq[0].forkop_server' '1.1.1.1 8.8.8.8' +assert_value 'dhcp.@dnsmasq[0].tachyon_server' '1.1.1.1 8.8.8.8' assert_value 'dhcp.@dnsmasq[0].noresolv' '1' -assert_value 'dhcp.@dnsmasq[0].forkop_noresolv' '0' +assert_value 'dhcp.@dnsmasq[0].tachyon_noresolv' '0' assert_value 'dhcp.@dnsmasq[0].cachesize' '0' -assert_value 'dhcp.@dnsmasq[0].forkop_cachesize' '150' +assert_value 'dhcp.@dnsmasq[0].tachyon_cachesize' '150' assert_log_contains 'commit dhcp' assert_dnsmasq_restarted @@ -203,21 +203,21 @@ ucode -L "$UCODE_LIB" "$APPLY" restore force assert_value 'dhcp.@dnsmasq[0].server' '1.1.1.1 8.8.8.8' assert_value 'dhcp.@dnsmasq[0].noresolv' '0' assert_value 'dhcp.@dnsmasq[0].cachesize' '150' -assert_absent 'dhcp.@dnsmasq[0].forkop_server' -assert_absent 'dhcp.@dnsmasq[0].forkop_noresolv' -assert_absent 'dhcp.@dnsmasq[0].forkop_cachesize' +assert_absent 'dhcp.@dnsmasq[0].tachyon_server' +assert_absent 'dhcp.@dnsmasq[0].tachyon_noresolv' +assert_absent 'dhcp.@dnsmasq[0].tachyon_cachesize' assert_log_contains 'commit dhcp' assert_dnsmasq_restarted cat >"$STATE" <<'EOF_STATE' dhcp.@dnsmasq[0].server=127.0.0.42 dhcp.@dnsmasq[0].notinterface=br-lan guest -dhcp.@dnsmasq[0].forkop_server=1.1.1.1 8.8.8.8 -dhcp.@dnsmasq[0].forkop_notinterface=wan docker -dhcp.@dnsmasq[0].forkop_noresolv=1 -dhcp.@dnsmasq[0].forkop_cachesize=0 -dhcp.forkop.interface=br-lan guest -forkop.settings.dont_touch_dhcp=1 +dhcp.@dnsmasq[0].tachyon_server=1.1.1.1 8.8.8.8 +dhcp.@dnsmasq[0].tachyon_notinterface=wan docker +dhcp.@dnsmasq[0].tachyon_noresolv=1 +dhcp.@dnsmasq[0].tachyon_cachesize=0 +dhcp.tachyon.interface=br-lan guest +tachyon.settings.dont_touch_dhcp=1 EOF_STATE run_restore @@ -225,16 +225,16 @@ assert_value 'dhcp.@dnsmasq[0].server' '1.1.1.1 8.8.8.8' assert_value 'dhcp.@dnsmasq[0].notinterface' 'wan docker' assert_value 'dhcp.@dnsmasq[0].noresolv' '1' assert_value 'dhcp.@dnsmasq[0].cachesize' '0' -assert_absent 'dhcp.@dnsmasq[0].forkop_server' -assert_absent 'dhcp.@dnsmasq[0].forkop_notinterface' -assert_absent 'dhcp.@dnsmasq[0].forkop_noresolv' -assert_absent 'dhcp.@dnsmasq[0].forkop_cachesize' -assert_absent 'dhcp.forkop.interface' +assert_absent 'dhcp.@dnsmasq[0].tachyon_server' +assert_absent 'dhcp.@dnsmasq[0].tachyon_notinterface' +assert_absent 'dhcp.@dnsmasq[0].tachyon_noresolv' +assert_absent 'dhcp.@dnsmasq[0].tachyon_cachesize' +assert_absent 'dhcp.tachyon.interface' assert_log_contains 'commit dhcp' cat >"$STATE" <<'EOF_STATE' dhcp.@dnsmasq[0].server=9.9.9.9 -forkop.settings.dont_touch_dhcp=1 +tachyon.settings.dont_touch_dhcp=1 EOF_STATE run_restore @@ -243,17 +243,17 @@ assert_log_empty cat >"$STATE" <<'EOF_STATE' dhcp.@dnsmasq[0].server=127.0.0.42 -dhcp.@dnsmasq[0].forkop_noresolv=1 -dhcp.@dnsmasq[0].forkop_cachesize=0 -forkop.settings.dont_touch_dhcp=0 +dhcp.@dnsmasq[0].tachyon_noresolv=1 +dhcp.@dnsmasq[0].tachyon_cachesize=0 +tachyon.settings.dont_touch_dhcp=0 EOF_STATE run_restore assert_absent 'dhcp.@dnsmasq[0].server' assert_value 'dhcp.@dnsmasq[0].noresolv' '1' assert_value 'dhcp.@dnsmasq[0].cachesize' '0' -assert_absent 'dhcp.@dnsmasq[0].forkop_noresolv' -assert_absent 'dhcp.@dnsmasq[0].forkop_cachesize' +assert_absent 'dhcp.@dnsmasq[0].tachyon_noresolv' +assert_absent 'dhcp.@dnsmasq[0].tachyon_cachesize' assert_log_contains 'commit dhcp' printf 'DNS apply checks passed\n' diff --git a/tests/dns_failover.sh b/tests/dns_failover.sh index 895353a2..90d81452 100644 --- a/tests/dns_failover.sh +++ b/tests/dns_failover.sh @@ -2,9 +2,9 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -GENERATOR="$FORKOP_LIB/singbox/generator.uc" -FAILOVER="$FORKOP_LIB/singbox/dns_failover.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +GENERATOR="$TACHYON_LIB/singbox/generator.uc" +FAILOVER="$TACHYON_LIB/singbox/dns_failover.uc" WORK_DIR="$(mktemp -d)" cleanup() { @@ -21,9 +21,9 @@ generate() { local fixture="$1" local output="$2" local state="${3:-$WORK_DIR/missing-state.json}" - FORKOP_LIB="$FORKOP_LIB" \ - FORKOP_DNS_FAILOVER_STATE_FILE="$state" \ - ucode -L "$FORKOP_LIB" "$GENERATOR" generate-config-fixture "$fixture" "$output" 192.168.1.1 0 + TACHYON_LIB="$TACHYON_LIB" \ + TACHYON_DNS_FAILOVER_STATE_FILE="$state" \ + ucode -L "$TACHYON_LIB" "$GENERATOR" generate-config-fixture "$fixture" "$output" 192.168.1.1 0 } cat >"$WORK_DIR/single.json" <<'JSON' @@ -141,11 +141,11 @@ cat >"$WORK_DIR/alive-recovery.json" <<'JSON' { "0": true, "1": true } JSON -selected="$(ucode -L "$FORKOP_LIB" "$FAILOVER" select-fixture "$WORK_DIR/select-state.json" "$WORK_DIR/alive-failover.json" main 0)" +selected="$(ucode -L "$TACHYON_LIB" "$FAILOVER" select-fixture "$WORK_DIR/select-state.json" "$WORK_DIR/alive-failover.json" main 0)" printf '%s' "$selected" | grep -Eq '"index"[[:space:]]*:[[:space:]]*1' || fail "dead active DNS must select the first live server below" printf '%s' "$selected" | grep -Eq '"reason"[[:space:]]*:[[:space:]]*"active_dead"' || fail "failover reason" -selected="$(ucode -L "$FORKOP_LIB" "$FAILOVER" select-fixture "$WORK_DIR/select-state.json" "$WORK_DIR/alive-recovery.json" bootstrap 1)" +selected="$(ucode -L "$TACHYON_LIB" "$FAILOVER" select-fixture "$WORK_DIR/select-state.json" "$WORK_DIR/alive-recovery.json" bootstrap 1)" printf '%s' "$selected" | grep -Eq '"index"[[:space:]]*:[[:space:]]*0' || fail "recovery must return to the highest live priority" printf '%s' "$selected" | grep -Eq '"reason"[[:space:]]*:[[:space:]]*"recovery"' || fail "recovery reason" @@ -156,7 +156,7 @@ cat >"$WORK_DIR/verify-bootstrap.json" <<'JSON' { "main_index": 0, "bootstrap_index": 1, "bootstrap_servers": [ "a", "b" ] } JSON -verification="$(ucode -L "$FORKOP_LIB" "$FAILOVER" verification-plan-fixture "$WORK_DIR/verify-previous.json" "$WORK_DIR/verify-bootstrap.json")" +verification="$(ucode -L "$TACHYON_LIB" "$FAILOVER" verification-plan-fixture "$WORK_DIR/verify-previous.json" "$WORK_DIR/verify-bootstrap.json")" printf '%s' "$verification" | grep -Eq '"main"[[:space:]]*:[[:space:]]*false' || fail "bootstrap-only switch must not require a dead main DNS to recover" printf '%s' "$verification" | grep -Eq '"bootstrap"[[:space:]]*:[[:space:]]*true' || fail "bootstrap-only switch must verify the selected bootstrap DNS" diff --git a/tests/helpers/config_contract_matrix.js b/tests/helpers/config_contract_matrix.js index 75df4971..e6c68a43 100644 --- a/tests/helpers/config_contract_matrix.js +++ b/tests/helpers/config_contract_matrix.js @@ -150,12 +150,12 @@ function enrichUiValues(fileData, option, block, values) { function extractUi(repo, fields) { const currentViewDir = path.join( repo, - "luci-app-forkop", + "luci-app-tachyon", "htdocs", "luci-static", "resources", "view", - "forkop", + "tachyon", ); const legacyViewDir = path.join(repo, legacyAppDir, "htdocs", "luci-static", "resources", "view", legacyStem); const viewDir = fs.existsSync(currentViewDir) ? currentViewDir : legacyViewDir; @@ -205,7 +205,7 @@ function extractUi(repo, fields) { } function extractConfigDefaults(repo, fields) { - const currentFile = path.join(repo, "forkop", "files", "etc", "config", "forkop"); + const currentFile = path.join(repo, "tachyon", "files", "etc", "config", "tachyon"); const legacyFile = path.join(repo, legacyStem, "files", "etc", "config", legacyStem); const file = fs.existsSync(currentFile) ? currentFile : legacyFile; const data = readFileIfExists(file); @@ -219,7 +219,7 @@ function extractConfigDefaults(repo, fields) { } function extractBackend(repo, fields) { - const backendRoot = fs.existsSync(path.join(repo, "forkop")) ? "forkop" : legacyStem; + const backendRoot = fs.existsSync(path.join(repo, "tachyon")) ? "tachyon" : legacyStem; const roots = [ path.join(repo, backendRoot, "files", "usr", "lib"), path.join(repo, backendRoot, "files", "usr", "bin"), @@ -227,14 +227,14 @@ function extractBackend(repo, fields) { ]; const files = roots .flatMap((root) => walkFiles(root)) - .filter((file) => /\.(sh|uc)$/.test(file) || ["forkop", legacyStem].includes(path.basename(file))); + .filter((file) => /\.(sh|uc)$/.test(file) || ["tachyon", legacyStem].includes(path.basename(file))); const installer = path.join(repo, "install.sh"); if (fs.existsSync(installer)) files.push(installer); const shellOptionRe = /\bconfig_(?:get|get_bool|list_foreach)\s+\S+\s+(?:"[^"]+"|'[^']+'|\$[A-Za-z_][A-Za-z0-9_]*|\$\{[^}]+\})\s+["']([A-Za-z0-9_]+)["']/g; const ucodeOptionRe = /\b(?:option|list_option|bool_option|int_option)\(\s*[^,\n]+,\s*["']([A-Za-z0-9_]+)["']/g; const ucodeStaticOptionKeyArrayRe = /^\s*\[\s*["']([A-Za-z0-9_]+)["']\s*,/gm; - const migrationRe = new RegExp(`\\b(?:forkop|${legacyStem})_uci_(?:set_option|set_option_if_missing|delete_option|add_list_unique)\\s+["'$A-Za-z0-9_{}.-]+\\s+["']([A-Za-z0-9_]+)["']`, "g"); + const migrationRe = new RegExp(`\\b(?:tachyon|${legacyStem})_uci_(?:set_option|set_option_if_missing|delete_option|add_list_unique)\\s+["'$A-Za-z0-9_{}.-]+\\s+["']([A-Za-z0-9_]+)["']`, "g"); const ucodeMigrationRe = /\b(?:set_option|set_option_if_missing|delete_option|add_list_unique)\(\s*[^,\n]+,\s*[^,\n]+,\s*["']([A-Za-z0-9_]+)["']/g; for (const file of files) { diff --git a/tests/helpers_owner.sh b/tests/helpers_owner.sh index 2e0d85ed..94c915eb 100644 --- a/tests/helpers_owner.sh +++ b/tests/helpers_owner.sh @@ -2,16 +2,16 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_BIN="$ROOT_DIR/forkop/files/usr/bin/forkop" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -CLI_UC="$FORKOP_BIN" -HELPERS_SH="$FORKOP_LIB/helpers.sh" -LIFECYCLE_UC="$FORKOP_LIB/service/lifecycle.uc" -PACKAGES_UC="$FORKOP_LIB/core/packages.uc" -RULES_UC="$FORKOP_LIB/providers/rules.uc" -SINGBOX_RUNTIME_UC="$FORKOP_LIB/singbox/runtime.uc" -COMPONENT_ACTION_UC="$FORKOP_LIB/components/action.uc" -DIAGNOSTICS_RUNTIME_UC="$FORKOP_LIB/diagnostics/runtime.uc" +TACHYON_BIN="$ROOT_DIR/tachyon/files/usr/bin/tachyon" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +CLI_UC="$TACHYON_BIN" +HELPERS_SH="$TACHYON_LIB/helpers.sh" +LIFECYCLE_UC="$TACHYON_LIB/service/lifecycle.uc" +PACKAGES_UC="$TACHYON_LIB/core/packages.uc" +RULES_UC="$TACHYON_LIB/providers/rules.uc" +SINGBOX_RUNTIME_UC="$TACHYON_LIB/singbox/runtime.uc" +COMPONENT_ACTION_UC="$TACHYON_LIB/components/action.uc" +DIAGNOSTICS_RUNTIME_UC="$TACHYON_LIB/diagnostics/runtime.uc" WORK_DIR="$(mktemp -d)" cleanup() { @@ -26,16 +26,16 @@ fail() { [ ! -e "$HELPERS_SH" ] || fail "helpers.sh shell owner must be removed" -if grep -R -n -F 'helpers.sh' "$FORKOP_BIN" "$FORKOP_LIB" --include='*.sh' >/dev/null 2>&1; then +if grep -R -n -F 'helpers.sh' "$TACHYON_BIN" "$TACHYON_LIB" --include='*.sh' >/dev/null 2>&1; then fail "runtime shell must not reference helpers.sh" fi if grep -R -n -E 'helpers_ucode\(|get_(inbound|server_inbound|tailscale_dns_server|outbound)_tag_by_section\(|get_domain_resolver_tag\(|provider_status_ucode\(|is_ipv4\(|is_min_package_version\(|url_get_(scheme|userinfo|host|port|path|query_param)\(' \ - "$FORKOP_BIN" "$FORKOP_LIB" --include='*.sh' >/dev/null 2>&1; then + "$TACHYON_BIN" "$TACHYON_LIB" --include='*.sh' >/dev/null 2>&1; then fail "helpers.sh wrapper symbols must not remain in runtime shell" fi -grep -Fq '#!/usr/bin/ucode' "$FORKOP_BIN" || - fail "forkop entrypoint must be a direct ucode executable" +grep -Fq '#!/usr/bin/ucode' "$TACHYON_BIN" || + fail "tachyon entrypoint must be a direct ucode executable" grep -Fq 'service/lifecycle.uc' "$CLI_UC" || fail "service/cli.uc must dispatch lifecycle through service/lifecycle.uc" grep -Fq 'core/packages.uc' "$LIFECYCLE_UC" || @@ -45,19 +45,19 @@ for shell_owner_pattern in \ 'config_get' \ 'uci_set' do - if grep -Fq "$shell_owner_pattern" "$FORKOP_BIN"; then - fail "forkop shell entrypoint must not own $shell_owner_pattern logic" + if grep -Fq "$shell_owner_pattern" "$TACHYON_BIN"; then + fail "tachyon shell entrypoint must not own $shell_owner_pattern logic" fi done -if grep -E -n '(^|[;&|[:space:]])nft[[:space:]]+(list|add|delete|flush)' "$FORKOP_BIN" >/dev/null 2>&1; then - fail "forkop shell entrypoint must not own nft command logic" +if grep -E -n '(^|[;&|[:space:]])nft[[:space:]]+(list|add|delete|flush)' "$TACHYON_BIN" >/dev/null 2>&1; then + fail "tachyon shell entrypoint must not own nft command logic" fi -if grep -E -n '(^|[;&|[:space:]])ip[[:space:]]+(rule|route)' "$FORKOP_BIN" >/dev/null 2>&1; then - fail "forkop shell entrypoint must not own ip rule/route logic" +if grep -E -n '(^|[;&|[:space:]])ip[[:space:]]+(rule|route)' "$TACHYON_BIN" >/dev/null 2>&1; then + fail "tachyon shell entrypoint must not own ip rule/route logic" fi -[ ! -e "$FORKOP_LIB/updater.sh" ] || +[ ! -e "$TACHYON_LIB/updater.sh" ] || fail "updater.sh shell owner must be removed" -[ ! -e "$FORKOP_LIB/status_diagnostics.sh" ] || +[ ! -e "$TACHYON_LIB/status_diagnostics.sh" ] || fail "status_diagnostics.sh shell owner must be removed" grep -Fq 'diagnostics/runtime.uc' "$CLI_UC" || fail "service/cli.uc must dispatch diagnostics through diagnostics/runtime.uc" @@ -86,11 +86,11 @@ do fail "singbox/runtime.uc missing $mode" done if grep -R -n -E 'get_sing_box_version\(|sing_box_version_from_output\(|sing_box_version_output\(|sing_box_output_has_build_tag\(|sing_box_has_build_tag\(|is_sing_box_extended\(|is_sing_box_tiny_package_installed\(|is_sing_box_full_package_installed\(|is_sing_box_compressed_marker_set\(|is_sing_box_extended_marker_set\(|read_sing_box_version_state\(|is_sing_box_tiny_marker_set\(|is_sing_box_tiny\(|sing_box_supports_tailscale\(|get_sing_box_variant\(|updates_(write|read|clear|restore)_sing_box_(variant_marker|version_state)\(' \ - "$FORKOP_BIN" "$FORKOP_LIB" --include='*.sh' >/dev/null 2>&1; then + "$TACHYON_BIN" "$TACHYON_LIB" --include='*.sh' >/dev/null 2>&1; then fail "sing-box helper/state shell symbols must not remain" fi -if ucode -L "$FORKOP_LIB" "$PACKAGES_UC" installed forkop-definitely-missing >/dev/null 2>&1; then +if ucode -L "$TACHYON_LIB" "$PACKAGES_UC" installed tachyon-definitely-missing >/dev/null 2>&1; then fail "missing package must not be reported installed" fi @@ -109,47 +109,47 @@ fi exit 1 SH chmod +x "$WORK_DIR/apk-bin/apk" -[ "$(PATH="$WORK_DIR/apk-bin:$PATH" ucode -L "$FORKOP_LIB" "$PACKAGES_UC" apk-available-version sing-box)" = "1.2.3-r1" ] || +[ "$(PATH="$WORK_DIR/apk-bin:$PATH" ucode -L "$TACHYON_LIB" "$PACKAGES_UC" apk-available-version sing-box)" = "1.2.3-r1" ] || fail "APK available version lookup must select the exact package name, not a higher-priority provider" -mark_hex="$(ucode -L "$FORKOP_LIB" "$RULES_UC" mark-hex 0x01000000 2)" +mark_hex="$(ucode -L "$TACHYON_LIB" "$RULES_UC" mark-hex 0x01000000 2)" [ "$mark_hex" = "0x01000002" ] || fail "providers/rules.uc mark math changed" version="$(printf 'sing-box version 1.12.4-extended\nEnvironment: test\n' | - ucode -L "$FORKOP_LIB" "$SINGBOX_RUNTIME_UC" version-from-output)" + ucode -L "$TACHYON_LIB" "$SINGBOX_RUNTIME_UC" version-from-output)" [ "$version" = "1.12.4-extended" ] || fail "singbox/runtime.uc version-from-output changed" -ucode -L "$FORKOP_LIB" "$SINGBOX_RUNTIME_UC" is-extended "1.12.4-extended" >/dev/null || +ucode -L "$TACHYON_LIB" "$SINGBOX_RUNTIME_UC" is-extended "1.12.4-extended" >/dev/null || fail "extended sing-box version should be detected" -if ucode -L "$FORKOP_LIB" "$SINGBOX_RUNTIME_UC" is-extended "1.12.4" >/dev/null 2>&1; then +if ucode -L "$TACHYON_LIB" "$SINGBOX_RUNTIME_UC" is-extended "1.12.4" >/dev/null 2>&1; then fail "stable sing-box version must not be detected as extended" fi -ucode -L "$FORKOP_LIB" "$SINGBOX_RUNTIME_UC" supports-tailscale "" "$(printf 'Tags: with_quic,with_tailscale\n')" >/dev/null || +ucode -L "$TACHYON_LIB" "$SINGBOX_RUNTIME_UC" supports-tailscale "" "$(printf 'Tags: with_quic,with_tailscale\n')" >/dev/null || fail "with_tailscale build tag should be detected" SB_VERSION_STATE_FILE="$WORK_DIR/version" \ - ucode -L "$FORKOP_LIB" "$SINGBOX_RUNTIME_UC" write-version-state 1.2.3 >/dev/null || + ucode -L "$TACHYON_LIB" "$SINGBOX_RUNTIME_UC" write-version-state 1.2.3 >/dev/null || fail "version state write failed" -[ "$(SB_VERSION_STATE_FILE="$WORK_DIR/version" ucode -L "$FORKOP_LIB" "$SINGBOX_RUNTIME_UC" read-version-state)" = "1.2.3" ] || +[ "$(SB_VERSION_STATE_FILE="$WORK_DIR/version" ucode -L "$TACHYON_LIB" "$SINGBOX_RUNTIME_UC" read-version-state)" = "1.2.3" ] || fail "version state read failed" SB_VERSION_STATE_FILE="$WORK_DIR/version" \ - ucode -L "$FORKOP_LIB" "$SINGBOX_RUNTIME_UC" restore-version-state "" >/dev/null || + ucode -L "$TACHYON_LIB" "$SINGBOX_RUNTIME_UC" restore-version-state "" >/dev/null || fail "version state restore-clear failed" [ ! -e "$WORK_DIR/version" ] || fail "empty version state restore must clear the state file" SB_VARIANT_STATE_FILE="$WORK_DIR/variant" \ - ucode -L "$FORKOP_LIB" "$SINGBOX_RUNTIME_UC" write-variant-marker extended-compressed >/dev/null || + ucode -L "$TACHYON_LIB" "$SINGBOX_RUNTIME_UC" write-variant-marker extended-compressed >/dev/null || fail "variant marker write failed" SB_VARIANT_STATE_FILE="$WORK_DIR/variant" \ - ucode -L "$FORKOP_LIB" "$SINGBOX_RUNTIME_UC" marker-is extended-compressed >/dev/null || + ucode -L "$TACHYON_LIB" "$SINGBOX_RUNTIME_UC" marker-is extended-compressed >/dev/null || fail "variant marker check failed" -[ "$(SB_VARIANT_STATE_FILE="$WORK_DIR/variant" ucode -L "$FORKOP_LIB" "$SINGBOX_RUNTIME_UC" read-variant-marker)" = "extended-compressed" ] || +[ "$(SB_VARIANT_STATE_FILE="$WORK_DIR/variant" ucode -L "$TACHYON_LIB" "$SINGBOX_RUNTIME_UC" read-variant-marker)" = "extended-compressed" ] || fail "variant marker read failed" SB_VARIANT_STATE_FILE="$WORK_DIR/variant" \ - ucode -L "$FORKOP_LIB" "$SINGBOX_RUNTIME_UC" restore-variant-marker "" >/dev/null || + ucode -L "$TACHYON_LIB" "$SINGBOX_RUNTIME_UC" restore-variant-marker "" >/dev/null || fail "variant marker restore-clear failed" [ ! -e "$WORK_DIR/variant" ] || fail "empty variant marker restore must clear the marker file" diff --git a/tests/initd_state.sh b/tests/initd_state.sh index f6100cc5..dd825269 100755 --- a/tests/initd_state.sh +++ b/tests/initd_state.sh @@ -2,10 +2,10 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -INITD_UC="$FORKOP_LIB/service/initd.uc" -STATE_UC="$FORKOP_LIB/service/state.uc" -INITD="$ROOT_DIR/forkop/files/etc/init.d/forkop" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +INITD_UC="$TACHYON_LIB/service/initd.uc" +STATE_UC="$TACHYON_LIB/service/state.uc" +INITD="$ROOT_DIR/tachyon/files/etc/init.d/tachyon" WORK_DIR="$(mktemp -d)" cleanup() { @@ -19,10 +19,10 @@ fail() { } initd_ucode() { - ucode -L "$FORKOP_LIB" "$INITD_UC" "$@" + ucode -L "$TACHYON_LIB" "$INITD_UC" "$@" } -config_file="$WORK_DIR/forkop" +config_file="$WORK_DIR/tachyon" guard_file="$WORK_DIR/internal-config-change" sync_file="$WORK_DIR/service-triggers.sync" @@ -89,7 +89,7 @@ if initd_ucode initd-should-queue-config-change-reload on_config_change on_confi fi pending_file="$WORK_DIR/reload.pending" -if FORKOP_PENDING_RELOAD_FILE="$pending_file" \ +if TACHYON_PENDING_RELOAD_FILE="$pending_file" \ initd_ucode reload-begin-fixture on_config_change 123 0 1 start >/dev/null 2>&1; then fail "queued config-change reload should not run immediately while service is starting" fi @@ -99,7 +99,7 @@ grep -Fq 'reason=on_config_change' "$pending_file" || fail "pending reload should preserve config-change reason" rm -f "$pending_file" -if FORKOP_PENDING_RELOAD_FILE="$pending_file" \ +if TACHYON_PENDING_RELOAD_FILE="$pending_file" \ initd_ucode reload-begin-fixture pending 123 1 1 start >/dev/null 2>&1; then fail "pending reload should not run while another service action is active" fi @@ -125,15 +125,15 @@ fi retry_pid_file="$WORK_DIR/start-retry.pid" retry_call_file="$WORK_DIR/start-retry.called" -retry_service="$WORK_DIR/forkop-init" +retry_service="$WORK_DIR/tachyon-init" cat >"$retry_service" <>"$retry_call_file" EOF chmod +x "$retry_service" -FORKOP_SERVICE_INIT="$retry_service" \ - FORKOP_START_RETRY_PID_FILE="$retry_pid_file" \ - FORKOP_START_RETRY_DELAY_SECONDS=1 \ +TACHYON_SERVICE_INIT="$retry_service" \ + TACHYON_START_RETRY_PID_FILE="$retry_pid_file" \ + TACHYON_START_RETRY_DELAY_SECONDS=1 \ initd_ucode schedule-start-retry >/dev/null || fail "failed start should schedule an automatic retry" [ -s "$retry_pid_file" ] || @@ -255,7 +255,7 @@ fi if grep -Fq 'runtime_is_running' "$INITD"; then fail "init.d must not keep shell runtime status decisions" fi -if grep -E -n 'FORKOP_(CONFIG_FILE|RELOAD_LOCK_DIR|RUNTIME_STATE_DIR|PENDING_RELOAD_FILE|SERVICE_TRIGGER_SYNC_FILE|INTERNAL_CONFIG_TRIGGER_GUARD|CONFIG_CHANGE_REASON|BIN|SERVICE_INIT)=' "$INITD" >/dev/null 2>&1; then +if grep -E -n 'TACHYON_(CONFIG_FILE|RELOAD_LOCK_DIR|RUNTIME_STATE_DIR|PENDING_RELOAD_FILE|SERVICE_TRIGGER_SYNC_FILE|INTERNAL_CONFIG_TRIGGER_GUARD|CONFIG_CHANGE_REASON|BIN|SERVICE_INIT)=' "$INITD" >/dev/null 2>&1; then fail "init.d must not pass internal orchestration paths through shell env" fi if grep -n -E 'require\("uci"\)\.cursor|uci -q|uci", "-q"' "$INITD_UC" >/dev/null 2>&1; then @@ -264,10 +264,10 @@ fi if grep -E -n '(^|[[:space:]])config_(load|get|get_bool|set)[[:space:]]' "$INITD" >/dev/null 2>&1; then fail "init.d must not read UCI directly" fi -if grep -Fq 'FORKOP_STATE_UC' "$INITD" || grep -Fq 'FORKOP_UI_UC' "$INITD" || grep -Fq 'FORKOP_STATUS_UC' "$INITD"; then +if grep -Fq 'TACHYON_STATE_UC' "$INITD" || grep -Fq 'TACHYON_UI_UC' "$INITD" || grep -Fq 'TACHYON_STATUS_UC' "$INITD"; then fail "init.d must not orchestrate state/UI/status modules directly" fi -if grep -Fq 'procd_set_param command "$FORKOP_BIN" start' "$INITD"; then +if grep -Fq 'procd_set_param command "$TACHYON_BIN" start' "$INITD"; then fail "init.d must not hand the one-shot start operation to procd as a daemon" fi if grep -Fq 'initd-should-' "$STATE_UC"; then diff --git a/tests/installer_owner.sh b/tests/installer_owner.sh index d0a570c6..39c3fcf5 100644 --- a/tests/installer_owner.sh +++ b/tests/installer_owner.sh @@ -46,7 +46,7 @@ if grep -n -E '(^|[;&|[:space:]])uci[[:space:]]+-q|command_exists[[:space:]]+uci fail "install.sh must not own UCI reads/writes through shell" fi -shell_sing_box_owner_symbols='REQUIRED_SING_BOX_VERSION|SING_BOX_EXTENDED_|SING_BOX_MANAGED_SERVICE_MARKER|remove_old_sing_box_if_needed|install_managed_sing_box_service_script|remove_managed_sing_box_service_script|disable_sing_box_service_config|prepare_sing_box_service_disabled|prepare_sing_box_package_service_install|stop_forkop_for_sing_box_install|pkg_install_sing_box_variant|pkg_install_name_downgrade|pkg_remove_sing_box_conflict|resolve_sing_box_extended_release|install_sing_box_extended_(package|binary)|restore_sing_box_after_failed|move_file_to_backup|validate_extended_sing_box_binary|archive-member-path|sing-box-extended-arch-suffix|sing-box-extended-asset-url|sing-box-extended-package-asset-url' +shell_sing_box_owner_symbols='REQUIRED_SING_BOX_VERSION|SING_BOX_EXTENDED_|SING_BOX_MANAGED_SERVICE_MARKER|remove_old_sing_box_if_needed|install_managed_sing_box_service_script|remove_managed_sing_box_service_script|disable_sing_box_service_config|prepare_sing_box_service_disabled|prepare_sing_box_package_service_install|stop_tachyon_for_sing_box_install|pkg_install_sing_box_variant|pkg_install_name_downgrade|pkg_remove_sing_box_conflict|resolve_sing_box_extended_release|install_sing_box_extended_(package|binary)|restore_sing_box_after_failed|move_file_to_backup|validate_extended_sing_box_binary|archive-member-path|sing-box-extended-arch-suffix|sing-box-extended-asset-url|sing-box-extended-package-asset-url' if grep -n -E "$shell_sing_box_owner_symbols" "$INSTALLER" >/dev/null; then fail "install.sh must not contain shell sing-box install/runtime ownership" fi @@ -56,8 +56,8 @@ grep -Fq 'ensure_bootstrap_package "ucode-mod-fs"' "$INSTALLER" || grep -Fq 'ensure_bootstrap_package "ucode-mod-uci"' "$INSTALLER" || fail "install.sh must bootstrap ucode-mod-uci before embedded UCI helper use" -grep -Fq '/usr/bin/forkop component_action sing_box "$action"' "$INSTALLER" || - fail "selected sing-box install must delegate to forkop component_action" +grep -Fq '/usr/bin/tachyon component_action sing_box "$action"' "$INSTALLER" || + fail "selected sing-box install must delegate to tachyon component_action" for action in install_stable install_extended install_extended_compressed; do grep -Fq "action=\"$action\"" "$INSTALLER" || fail "selected sing-box installer is missing action mapping: $action" @@ -89,13 +89,13 @@ grep -Fq 'install_json_ucode installer-post-install' "$INSTALLER" || if grep -Fq 'installer_config_migration_path()' "$INSTALLER"; then fail "install.sh must not embed configuration migration logic" fi -grep -Fq 'ucode -L /usr/lib/forkop /usr/lib/forkop/config/migration.uc migrate-podkop' "$INSTALLER" || +grep -Fq 'ucode -L /usr/lib/tachyon /usr/lib/tachyon/config/migration.uc migrate-podkop' "$INSTALLER" || fail "install.sh must delegate the legacy transition to the installed migration module" -if grep -n -E 'restore_forkop_dnsmasq_failsafe|remember_service_state|stop_conflicting_services|deactivate_original_forkop_if_present|remove_conflicting_dns_proxy|pkg_remove_if_installed|pkg_remove_matching_prefix|pkg_list_installed_names' "$INSTALLER" >/dev/null 2>&1; then +if grep -n -E 'restore_tachyon_dnsmasq_failsafe|remember_service_state|stop_conflicting_services|deactivate_original_tachyon_if_present|remove_conflicting_dns_proxy|pkg_remove_if_installed|pkg_remove_matching_prefix|pkg_list_installed_names' "$INSTALLER" >/dev/null 2>&1; then fail "install.sh must not keep shell cleanup/remove service owners" fi -if grep -n -E 'rm -f /var/luci-indexcache|rm -f /tmp/luci-indexcache|/etc/init\.d/rpcd[[:space:]]+reload|/etc/init\.d/forkop[[:space:]]+(start|stop|disable|enable|restart)|/etc/init\.d/forkop[[:space:]]+(stop|disable)' "$INSTALLER" >/dev/null 2>&1; then +if grep -n -E 'rm -f /var/luci-indexcache|rm -f /tmp/luci-indexcache|/etc/init\.d/rpcd[[:space:]]+reload|/etc/init\.d/tachyon[[:space:]]+(start|stop|disable|enable|restart)|/etc/init\.d/tachyon[[:space:]]+(stop|disable)' "$INSTALLER" >/dev/null 2>&1; then fail "install.sh shell must not own service/cache lifecycle actions" fi @@ -131,12 +131,12 @@ awk ' printf '%s\n' '{"tag_name":"0.0.1"}' | ucode "$helper" release-tag | grep -Fxq '0.0.1' || fail "embedded helper release-tag mode must parse release JSON" -release_json='{"tag_name":"0.0.1","assets":[{"name":"forkop_0.0.1.ipk","browser_download_url":"https://example.com/forkop.ipk"}]}' -printf '%s' "$release_json" | ucode "$helper" release-asset-url backend ipk | grep -Fxq 'https://example.com/forkop.ipk' || - fail "embedded helper must resolve the exact three-part Forkop package name" -if printf '%s' '{"tag_name":"0.0.1","assets":[{"name":"forkop_0.0.1_all.ipk","browser_download_url":"https://example.com/old.ipk"}]}' | +release_json='{"tag_name":"0.0.1","assets":[{"name":"tachyon_0.0.1.ipk","browser_download_url":"https://example.com/tachyon.ipk"}]}' +printf '%s' "$release_json" | ucode "$helper" release-asset-url backend ipk | grep -Fxq 'https://example.com/tachyon.ipk' || + fail "embedded helper must resolve the exact three-part Tachyon package name" +if printf '%s' '{"tag_name":"0.0.1","assets":[{"name":"tachyon_0.0.1_all.ipk","browser_download_url":"https://example.com/old.ipk"}]}' | ucode "$helper" release-asset-url backend ipk | grep -q .; then - fail "embedded helper must reject package names outside the Forkop release format" + fail "embedded helper must reject package names outside the Tachyon release format" fi cat >"$WORK_DIR/opkg" <<'SH' @@ -147,18 +147,18 @@ case "$1" in 'https-dns-proxy - 1.0' \ 'luci-app-https-dns-proxy - 1.0' \ 'luci-i18n-https-dns-proxy-ru - 1.0' - if [ -n "${FORKOP_INSTALLER_FAKE_LEGACY_BACKEND:-}" ]; then + if [ -n "${TACHYON_INSTALLER_FAKE_LEGACY_BACKEND:-}" ]; then printf '%s\n' \ - "$FORKOP_INSTALLER_FAKE_LEGACY_BACKEND - 1.0" \ - "luci-app-$FORKOP_INSTALLER_FAKE_LEGACY_BACKEND - 1.0" \ - "luci-i18n-$FORKOP_INSTALLER_FAKE_LEGACY_BACKEND-ru - 1.0" + "$TACHYON_INSTALLER_FAKE_LEGACY_BACKEND - 1.0" \ + "luci-app-$TACHYON_INSTALLER_FAKE_LEGACY_BACKEND - 1.0" \ + "luci-i18n-$TACHYON_INSTALLER_FAKE_LEGACY_BACKEND-ru - 1.0" fi ;; remove) shift [ "$1" = "--force-depends" ] && shift - printf '%s\n' "$1" >> "$FORKOP_INSTALLER_OPKG_LOG" - [ "${FORKOP_INSTALLER_FAIL_REMOVE:-}" != "$1" ] || exit 1 + printf '%s\n' "$1" >> "$TACHYON_INSTALLER_OPKG_LOG" + [ "${TACHYON_INSTALLER_FAIL_REMOVE:-}" != "$1" ] || exit 1 ;; esac exit 0 @@ -168,22 +168,22 @@ chmod 0755 "$WORK_DIR/opkg" : >"$WORK_DIR/opkg.log" printf '%s\n' '1' | PATH="$WORK_DIR:$PATH" \ - FORKOP_INSTALLER_OPKG_LOG="$WORK_DIR/opkg.log" \ - FORKOP_INSTALLER_INIT="$WORK_DIR/missing-forkop-init" \ - FORKOP_INSTALLER_BIN="$WORK_DIR/missing-forkop-bin" \ - FORKOP_INSTALLER_LIB="$WORK_DIR/missing-forkop-lib" \ - FORKOP_INSTALLER_UCI_DEFAULTS="$WORK_DIR/missing-uci-defaults" \ - FORKOP_INSTALLER_LUCI_VIEW="$WORK_DIR/missing-luci-view" \ - FORKOP_INSTALLER_MENU_JSON="$WORK_DIR/missing-menu.json" \ - FORKOP_INSTALLER_ACL_JSON="$WORK_DIR/missing-acl.json" \ - FORKOP_INSTALLER_RU_LMO="$WORK_DIR/missing-ru.lmo" \ - FORKOP_INSTALLER_EN_LMO="$WORK_DIR/missing-en.lmo" \ - FORKOP_INSTALLER_RU_LUA="$WORK_DIR/missing-ru.lua" \ - FORKOP_INSTALLER_EN_LUA="$WORK_DIR/missing-en.lua" \ - FORKOP_INSTALLER_LEGACY_BASE_INIT="$WORK_DIR/missing-original-init" \ - FORKOP_INSTALLER_LEGACY_BRAND="$LEGACY_BRAND" \ - FORKOP_INSTALLER_LEGACY_BACKEND="$LEGACY_BACKEND" \ - FORKOP_UCI_STATE_FILE="$WORK_DIR/empty-uci.state" \ + TACHYON_INSTALLER_OPKG_LOG="$WORK_DIR/opkg.log" \ + TACHYON_INSTALLER_INIT="$WORK_DIR/missing-tachyon-init" \ + TACHYON_INSTALLER_BIN="$WORK_DIR/missing-tachyon-bin" \ + TACHYON_INSTALLER_LIB="$WORK_DIR/missing-tachyon-lib" \ + TACHYON_INSTALLER_UCI_DEFAULTS="$WORK_DIR/missing-uci-defaults" \ + TACHYON_INSTALLER_LUCI_VIEW="$WORK_DIR/missing-luci-view" \ + TACHYON_INSTALLER_MENU_JSON="$WORK_DIR/missing-menu.json" \ + TACHYON_INSTALLER_ACL_JSON="$WORK_DIR/missing-acl.json" \ + TACHYON_INSTALLER_RU_LMO="$WORK_DIR/missing-ru.lmo" \ + TACHYON_INSTALLER_EN_LMO="$WORK_DIR/missing-en.lmo" \ + TACHYON_INSTALLER_RU_LUA="$WORK_DIR/missing-ru.lua" \ + TACHYON_INSTALLER_EN_LUA="$WORK_DIR/missing-en.lua" \ + TACHYON_INSTALLER_LEGACY_BASE_INIT="$WORK_DIR/missing-original-init" \ + TACHYON_INSTALLER_LEGACY_BRAND="$LEGACY_BRAND" \ + TACHYON_INSTALLER_LEGACY_BACKEND="$LEGACY_BACKEND" \ + TACHYON_UCI_STATE_FILE="$WORK_DIR/empty-uci.state" \ ucode "$helper" installer-cleanup-legacy >"$WORK_DIR/conflict-state.env" 2>"$WORK_DIR/conflict.err" grep -Fxq 'https-dns-proxy' "$WORK_DIR/opkg.log" || @@ -200,7 +200,7 @@ write_fake_service_init() { case "$1" in enabled) exit 0 ;; status) printf '%s\n' running; exit 0 ;; - stop|disable|enable|start|restart) printf '%s\n' "$1" >> "$FORKOP_INSTALLER_INIT_LOG"; exit 0 ;; + stop|disable|enable|start|restart) printf '%s\n' "$1" >> "$TACHYON_INSTALLER_INIT_LOG"; exit 0 ;; esac exit 0 SH @@ -211,7 +211,7 @@ write_fake_service_init "$WORK_DIR/legacy-init" cat >"$WORK_DIR/legacy-bin" <<'SH' #!/usr/bin/env sh -printf '%s\n' "$*" >> "$FORKOP_INSTALLER_BIN_LOG" +printf '%s\n' "$*" >> "$TACHYON_INSTALLER_BIN_LOG" case "$1" in get_status) printf '%s\n' '{"running":1}' ;; esac @@ -223,36 +223,36 @@ chmod 0755 "$WORK_DIR/legacy-bin" : >"$WORK_DIR/bin.log" state="$WORK_DIR/state.env" PATH="$WORK_DIR:$PATH" \ -FORKOP_INSTALLER_INIT="$WORK_DIR/missing-forkop-init" \ -FORKOP_INSTALLER_BIN="$WORK_DIR/missing-forkop-bin" \ -FORKOP_INSTALLER_LIB="$WORK_DIR/missing-forkop-lib" \ -FORKOP_INSTALLER_UCI_DEFAULTS="$WORK_DIR/uci-defaults" \ -FORKOP_INSTALLER_LUCI_VIEW="$WORK_DIR/luci-view" \ -FORKOP_INSTALLER_MENU_JSON="$WORK_DIR/menu.json" \ -FORKOP_INSTALLER_ACL_JSON="$WORK_DIR/acl.json" \ -FORKOP_INSTALLER_RU_LMO="$WORK_DIR/ru.lmo" \ -FORKOP_INSTALLER_EN_LMO="$WORK_DIR/en.lmo" \ -FORKOP_INSTALLER_RU_LUA="$WORK_DIR/ru.lua" \ -FORKOP_INSTALLER_EN_LUA="$WORK_DIR/en.lua" \ -FORKOP_INSTALLER_LEGACY_BASE_INIT="$WORK_DIR/missing-original-init" \ -FORKOP_INSTALLER_LEGACY_BRAND="$LEGACY_BRAND" \ -FORKOP_INSTALLER_LEGACY_BACKEND="$LEGACY_BACKEND" \ -FORKOP_INSTALLER_LEGACY_CONFIG_ALT="$LEGACY_CONFIG_ALT" \ -FORKOP_INSTALLER_LEGACY_INIT="$WORK_DIR/legacy-init" \ -FORKOP_INSTALLER_LEGACY_BIN="$WORK_DIR/legacy-bin" \ -FORKOP_INSTALLER_LEGACY_LIB="$WORK_DIR/legacy-lib" \ -FORKOP_INSTALLER_FAKE_LEGACY_BACKEND="$LEGACY_BACKEND" \ -FORKOP_INSTALLER_OPKG_LOG="$WORK_DIR/opkg.log" \ -FORKOP_INSTALLER_INIT_LOG="$WORK_DIR/init.log" \ -FORKOP_INSTALLER_BIN_LOG="$WORK_DIR/bin.log" \ -FORKOP_UCI_STATE_FILE="$WORK_DIR/empty-uci.state" \ +TACHYON_INSTALLER_INIT="$WORK_DIR/missing-tachyon-init" \ +TACHYON_INSTALLER_BIN="$WORK_DIR/missing-tachyon-bin" \ +TACHYON_INSTALLER_LIB="$WORK_DIR/missing-tachyon-lib" \ +TACHYON_INSTALLER_UCI_DEFAULTS="$WORK_DIR/uci-defaults" \ +TACHYON_INSTALLER_LUCI_VIEW="$WORK_DIR/luci-view" \ +TACHYON_INSTALLER_MENU_JSON="$WORK_DIR/menu.json" \ +TACHYON_INSTALLER_ACL_JSON="$WORK_DIR/acl.json" \ +TACHYON_INSTALLER_RU_LMO="$WORK_DIR/ru.lmo" \ +TACHYON_INSTALLER_EN_LMO="$WORK_DIR/en.lmo" \ +TACHYON_INSTALLER_RU_LUA="$WORK_DIR/ru.lua" \ +TACHYON_INSTALLER_EN_LUA="$WORK_DIR/en.lua" \ +TACHYON_INSTALLER_LEGACY_BASE_INIT="$WORK_DIR/missing-original-init" \ +TACHYON_INSTALLER_LEGACY_BRAND="$LEGACY_BRAND" \ +TACHYON_INSTALLER_LEGACY_BACKEND="$LEGACY_BACKEND" \ +TACHYON_INSTALLER_LEGACY_CONFIG_ALT="$LEGACY_CONFIG_ALT" \ +TACHYON_INSTALLER_LEGACY_INIT="$WORK_DIR/legacy-init" \ +TACHYON_INSTALLER_LEGACY_BIN="$WORK_DIR/legacy-bin" \ +TACHYON_INSTALLER_LEGACY_LIB="$WORK_DIR/legacy-lib" \ +TACHYON_INSTALLER_FAKE_LEGACY_BACKEND="$LEGACY_BACKEND" \ +TACHYON_INSTALLER_OPKG_LOG="$WORK_DIR/opkg.log" \ +TACHYON_INSTALLER_INIT_LOG="$WORK_DIR/init.log" \ +TACHYON_INSTALLER_BIN_LOG="$WORK_DIR/bin.log" \ +TACHYON_UCI_STATE_FILE="$WORK_DIR/empty-uci.state" \ ucode "$helper" installer-cleanup-legacy >"$state" -grep -Fxq 'FORKOP_WAS_ENABLED=1' "$state" || +grep -Fxq 'TACHYON_WAS_ENABLED=1' "$state" || fail "installer cleanup must export previous enabled state" -grep -Fxq 'FORKOP_WAS_RUNNING=1' "$state" || +grep -Fxq 'TACHYON_WAS_RUNNING=1' "$state" || fail "installer cleanup must export previous running state" -grep -Fxq 'FORKOP_LEGACY_DETECTED=1' "$state" || +grep -Fxq 'TACHYON_LEGACY_DETECTED=1' "$state" || fail "installer cleanup must report the legacy package transition" grep -Fxq 'stop' "$WORK_DIR/init.log" || fail "installer cleanup must stop the legacy service through ucode owner" @@ -267,12 +267,12 @@ grep -Fxq "luci-app-$LEGACY_BACKEND" "$WORK_DIR/opkg.log" || if printf '%s\n' '1' | PATH="$WORK_DIR:$PATH" \ - FORKOP_INSTALLER_OPKG_LOG="$WORK_DIR/opkg.log" \ - FORKOP_INSTALLER_FAIL_REMOVE="$LEGACY_BACKEND" \ - FORKOP_INSTALLER_FAKE_LEGACY_BACKEND="$LEGACY_BACKEND" \ - FORKOP_INSTALLER_LEGACY_BRAND="$LEGACY_BRAND" \ - FORKOP_INSTALLER_LEGACY_BACKEND="$LEGACY_BACKEND" \ - FORKOP_UCI_STATE_FILE="$WORK_DIR/empty-uci.state" \ + TACHYON_INSTALLER_OPKG_LOG="$WORK_DIR/opkg.log" \ + TACHYON_INSTALLER_FAIL_REMOVE="$LEGACY_BACKEND" \ + TACHYON_INSTALLER_FAKE_LEGACY_BACKEND="$LEGACY_BACKEND" \ + TACHYON_INSTALLER_LEGACY_BRAND="$LEGACY_BRAND" \ + TACHYON_INSTALLER_LEGACY_BACKEND="$LEGACY_BACKEND" \ + TACHYON_UCI_STATE_FILE="$WORK_DIR/empty-uci.state" \ ucode "$helper" installer-cleanup-legacy >/dev/null 2>&1; then fail "installer cleanup must stop when the package manager cannot remove the legacy backend" fi @@ -280,7 +280,7 @@ fi legacy_config="$WORK_DIR/legacy-config" legacy_config_alt="$WORK_DIR/legacy-config-alt" legacy_persistent="$WORK_DIR/legacy-persistent" -forkop_persistent="$WORK_DIR/forkop-persistent" +tachyon_persistent="$WORK_DIR/tachyon-persistent" legacy_runtime="$WORK_DIR/legacy-runtime" legacy_tmp="$WORK_DIR/legacy-tmp" legacy_tmp_alt="$WORK_DIR/legacy-tmp-alt" @@ -304,11 +304,11 @@ legacy_nested_backup="$legacy_scan_root/audit/${LEGACY_BACKEND}.config" mkdir -p \ "$legacy_persistent/tailscale/server-new" \ "$legacy_persistent/tailscale/server-existing" \ - "$forkop_persistent/tailscale/server-existing" \ + "$tachyon_persistent/tailscale/server-existing" \ "$legacy_runtime" "$legacy_tmp" "$legacy_tmp_alt" printf '%s\n' 'legacy-node-identity' >"$legacy_persistent/tailscale/server-new/node.key" printf '%s\n' 'stale-legacy-identity' >"$legacy_persistent/tailscale/server-existing/node.key" -printf '%s\n' 'current-forkop-identity' >"$forkop_persistent/tailscale/server-existing/node.key" +printf '%s\n' 'current-tachyon-identity' >"$tachyon_persistent/tailscale/server-existing/node.key" mkdir -p "$(dirname "$legacy_nested_uci")" "$(dirname "$legacy_nested_lock")" "$(dirname "$legacy_nested_backup")" touch "$legacy_config" "$legacy_config_alt" "$legacy_config-opkg" touch \ @@ -328,35 +328,35 @@ touch \ "$legacy_nested_uci" \ "$legacy_nested_lock" \ "$legacy_nested_backup" -FORKOP_INSTALLER_LEGACY_BRAND="$LEGACY_BRAND" \ -FORKOP_INSTALLER_LEGACY_BACKEND="$LEGACY_BACKEND" \ -FORKOP_INSTALLER_LEGACY_CONFIG_ALT="$LEGACY_CONFIG_ALT" \ -FORKOP_INSTALLER_LEGACY_CONFIG="$legacy_config" \ -FORKOP_INSTALLER_LEGACY_CONFIG_FILE_ALT="$legacy_config_alt" \ -FORKOP_INSTALLER_LEGACY_PERSISTENT_DIR="$legacy_persistent" \ -FORKOP_INSTALLER_PERSISTENT_DIR="$forkop_persistent" \ -FORKOP_INSTALLER_LEGACY_RUNTIME_DIR="$legacy_runtime" \ -FORKOP_INSTALLER_LEGACY_TMP_DIR="$legacy_tmp" \ -FORKOP_INSTALLER_LEGACY_TMP_ALT_DIR="$legacy_tmp_alt" \ -FORKOP_INSTALLER_LEGACY_BASE_CONFIG="$legacy_base_config" \ -FORKOP_INSTALLER_LEGACY_BASE_PERSISTENT_DIR="$legacy_base_persistent" \ -FORKOP_INSTALLER_LEGACY_BASE_RUNTIME_DIR="$legacy_base_runtime" \ -FORKOP_INSTALLER_LEGACY_BASE_TMP_DIR="$legacy_base_tmp" \ -FORKOP_INSTALLER_LEGACY_BASE_INIT="$legacy_base_init" \ -FORKOP_INSTALLER_LEGACY_BASE_BIN="$legacy_base_bin" \ -FORKOP_INSTALLER_LEGACY_BASE_LIB="$legacy_base_lib" \ -FORKOP_INSTALLER_LEGACY_BASE_UCI_DEFAULTS="$legacy_base_uci_defaults" \ -FORKOP_INSTALLER_LEGACY_BASE_LUCI_VIEW="$legacy_base_luci_view" \ -FORKOP_INSTALLER_LEGACY_BASE_MENU_JSON="$legacy_base_menu" \ -FORKOP_INSTALLER_LEGACY_BASE_ACL_JSON="$legacy_base_acl" \ -FORKOP_INSTALLER_LEGACY_BASE_I18N="$legacy_base_i18n" \ -FORKOP_INSTALLER_LEGACY_TMP_PACKAGE_GLOB="$WORK_DIR/*${LEGACY_BRAND}*" \ -FORKOP_INSTALLER_LEGACY_SCAN_ROOTS="$legacy_scan_root" \ +TACHYON_INSTALLER_LEGACY_BRAND="$LEGACY_BRAND" \ +TACHYON_INSTALLER_LEGACY_BACKEND="$LEGACY_BACKEND" \ +TACHYON_INSTALLER_LEGACY_CONFIG_ALT="$LEGACY_CONFIG_ALT" \ +TACHYON_INSTALLER_LEGACY_CONFIG="$legacy_config" \ +TACHYON_INSTALLER_LEGACY_CONFIG_FILE_ALT="$legacy_config_alt" \ +TACHYON_INSTALLER_LEGACY_PERSISTENT_DIR="$legacy_persistent" \ +TACHYON_INSTALLER_PERSISTENT_DIR="$tachyon_persistent" \ +TACHYON_INSTALLER_LEGACY_RUNTIME_DIR="$legacy_runtime" \ +TACHYON_INSTALLER_LEGACY_TMP_DIR="$legacy_tmp" \ +TACHYON_INSTALLER_LEGACY_TMP_ALT_DIR="$legacy_tmp_alt" \ +TACHYON_INSTALLER_LEGACY_BASE_CONFIG="$legacy_base_config" \ +TACHYON_INSTALLER_LEGACY_BASE_PERSISTENT_DIR="$legacy_base_persistent" \ +TACHYON_INSTALLER_LEGACY_BASE_RUNTIME_DIR="$legacy_base_runtime" \ +TACHYON_INSTALLER_LEGACY_BASE_TMP_DIR="$legacy_base_tmp" \ +TACHYON_INSTALLER_LEGACY_BASE_INIT="$legacy_base_init" \ +TACHYON_INSTALLER_LEGACY_BASE_BIN="$legacy_base_bin" \ +TACHYON_INSTALLER_LEGACY_BASE_LIB="$legacy_base_lib" \ +TACHYON_INSTALLER_LEGACY_BASE_UCI_DEFAULTS="$legacy_base_uci_defaults" \ +TACHYON_INSTALLER_LEGACY_BASE_LUCI_VIEW="$legacy_base_luci_view" \ +TACHYON_INSTALLER_LEGACY_BASE_MENU_JSON="$legacy_base_menu" \ +TACHYON_INSTALLER_LEGACY_BASE_ACL_JSON="$legacy_base_acl" \ +TACHYON_INSTALLER_LEGACY_BASE_I18N="$legacy_base_i18n" \ +TACHYON_INSTALLER_LEGACY_TMP_PACKAGE_GLOB="$WORK_DIR/*${LEGACY_BRAND}*" \ +TACHYON_INSTALLER_LEGACY_SCAN_ROOTS="$legacy_scan_root" \ ucode "$helper" installer-finalize-legacy -[ "$(cat "$forkop_persistent/tailscale/server-new/node.key")" = 'legacy-node-identity' ] || +[ "$(cat "$tachyon_persistent/tailscale/server-new/node.key")" = 'legacy-node-identity' ] || fail "installer finalization must migrate legacy Tailscale node identity" -[ "$(cat "$forkop_persistent/tailscale/server-existing/node.key")" = 'current-forkop-identity' ] || - fail "installer finalization must not overwrite existing Forkop Tailscale state" +[ "$(cat "$tachyon_persistent/tailscale/server-existing/node.key")" = 'current-tachyon-identity' ] || + fail "installer finalization must not overwrite existing Tachyon Tailscale state" for path in "$legacy_config" "$legacy_config_alt" "$legacy_config-opkg" \ "$legacy_persistent" "$legacy_runtime" "$legacy_tmp" "$legacy_tmp_alt" \ "$legacy_base_config.backup" "$legacy_base_persistent.cache" \ @@ -371,52 +371,52 @@ done mkdir -p "$legacy_persistent/tailscale/server-failed" printf '%s\n' 'preserve-on-failure' >"$legacy_persistent/tailscale/server-failed/node.key" -forkop_persistent_file="$WORK_DIR/forkop-persistent-file" -touch "$forkop_persistent_file" -if FORKOP_INSTALLER_LEGACY_BRAND="$LEGACY_BRAND" \ - FORKOP_INSTALLER_LEGACY_BACKEND="$LEGACY_BACKEND" \ - FORKOP_INSTALLER_LEGACY_CONFIG_ALT="$LEGACY_CONFIG_ALT" \ - FORKOP_INSTALLER_LEGACY_CONFIG="$legacy_config" \ - FORKOP_INSTALLER_LEGACY_CONFIG_FILE_ALT="$legacy_config_alt" \ - FORKOP_INSTALLER_LEGACY_PERSISTENT_DIR="$legacy_persistent" \ - FORKOP_INSTALLER_PERSISTENT_DIR="$forkop_persistent_file" \ - FORKOP_INSTALLER_LEGACY_RUNTIME_DIR="$legacy_runtime" \ - FORKOP_INSTALLER_LEGACY_TMP_DIR="$legacy_tmp" \ - FORKOP_INSTALLER_LEGACY_TMP_ALT_DIR="$legacy_tmp_alt" \ - FORKOP_INSTALLER_LEGACY_BASE_CONFIG="$legacy_base_config" \ - FORKOP_INSTALLER_LEGACY_BASE_PERSISTENT_DIR="$legacy_base_persistent" \ - FORKOP_INSTALLER_LEGACY_BASE_RUNTIME_DIR="$legacy_base_runtime" \ - FORKOP_INSTALLER_LEGACY_BASE_TMP_DIR="$legacy_base_tmp" \ - FORKOP_INSTALLER_LEGACY_BASE_INIT="$legacy_base_init" \ - FORKOP_INSTALLER_LEGACY_BASE_BIN="$legacy_base_bin" \ - FORKOP_INSTALLER_LEGACY_BASE_LIB="$legacy_base_lib" \ - FORKOP_INSTALLER_LEGACY_BASE_UCI_DEFAULTS="$legacy_base_uci_defaults" \ - FORKOP_INSTALLER_LEGACY_BASE_LUCI_VIEW="$legacy_base_luci_view" \ - FORKOP_INSTALLER_LEGACY_BASE_MENU_JSON="$legacy_base_menu" \ - FORKOP_INSTALLER_LEGACY_BASE_ACL_JSON="$legacy_base_acl" \ - FORKOP_INSTALLER_LEGACY_BASE_I18N="$legacy_base_i18n" \ - FORKOP_INSTALLER_LEGACY_TMP_PACKAGE_GLOB="$WORK_DIR/missing-${LEGACY_BRAND}*" \ - FORKOP_INSTALLER_LEGACY_SCAN_ROOTS="$legacy_scan_root" \ +tachyon_persistent_file="$WORK_DIR/tachyon-persistent-file" +touch "$tachyon_persistent_file" +if TACHYON_INSTALLER_LEGACY_BRAND="$LEGACY_BRAND" \ + TACHYON_INSTALLER_LEGACY_BACKEND="$LEGACY_BACKEND" \ + TACHYON_INSTALLER_LEGACY_CONFIG_ALT="$LEGACY_CONFIG_ALT" \ + TACHYON_INSTALLER_LEGACY_CONFIG="$legacy_config" \ + TACHYON_INSTALLER_LEGACY_CONFIG_FILE_ALT="$legacy_config_alt" \ + TACHYON_INSTALLER_LEGACY_PERSISTENT_DIR="$legacy_persistent" \ + TACHYON_INSTALLER_PERSISTENT_DIR="$tachyon_persistent_file" \ + TACHYON_INSTALLER_LEGACY_RUNTIME_DIR="$legacy_runtime" \ + TACHYON_INSTALLER_LEGACY_TMP_DIR="$legacy_tmp" \ + TACHYON_INSTALLER_LEGACY_TMP_ALT_DIR="$legacy_tmp_alt" \ + TACHYON_INSTALLER_LEGACY_BASE_CONFIG="$legacy_base_config" \ + TACHYON_INSTALLER_LEGACY_BASE_PERSISTENT_DIR="$legacy_base_persistent" \ + TACHYON_INSTALLER_LEGACY_BASE_RUNTIME_DIR="$legacy_base_runtime" \ + TACHYON_INSTALLER_LEGACY_BASE_TMP_DIR="$legacy_base_tmp" \ + TACHYON_INSTALLER_LEGACY_BASE_INIT="$legacy_base_init" \ + TACHYON_INSTALLER_LEGACY_BASE_BIN="$legacy_base_bin" \ + TACHYON_INSTALLER_LEGACY_BASE_LIB="$legacy_base_lib" \ + TACHYON_INSTALLER_LEGACY_BASE_UCI_DEFAULTS="$legacy_base_uci_defaults" \ + TACHYON_INSTALLER_LEGACY_BASE_LUCI_VIEW="$legacy_base_luci_view" \ + TACHYON_INSTALLER_LEGACY_BASE_MENU_JSON="$legacy_base_menu" \ + TACHYON_INSTALLER_LEGACY_BASE_ACL_JSON="$legacy_base_acl" \ + TACHYON_INSTALLER_LEGACY_BASE_I18N="$legacy_base_i18n" \ + TACHYON_INSTALLER_LEGACY_TMP_PACKAGE_GLOB="$WORK_DIR/missing-${LEGACY_BRAND}*" \ + TACHYON_INSTALLER_LEGACY_SCAN_ROOTS="$legacy_scan_root" \ ucode "$helper" installer-finalize-legacy >/dev/null 2>&1; then fail "installer finalization must fail when legacy Tailscale state cannot be migrated" fi [ "$(cat "$legacy_persistent/tailscale/server-failed/node.key")" = 'preserve-on-failure' ] || fail "failed Tailscale migration must preserve the legacy identity" -write_fake_service_init "$WORK_DIR/forkop-init" +write_fake_service_init "$WORK_DIR/tachyon-init" touch "$WORK_DIR/luci-indexcache.one" "$WORK_DIR/luci-indexcache.two" : >"$WORK_DIR/init.log" -FORKOP_INSTALLER_INIT="$WORK_DIR/forkop-init" \ -FORKOP_INSTALLER_RPCD_INIT="$WORK_DIR/missing-rpcd" \ -FORKOP_INSTALLER_LUCI_CACHE_GLOBS="$WORK_DIR/luci-indexcache*" \ -FORKOP_INSTALLER_LATEST_VERSION_CACHE="$WORK_DIR/latest.cache" \ -FORKOP_INSTALLER_SYSTEM_INFO_CACHE="$WORK_DIR/system-info.json" \ -FORKOP_INSTALLER_SERVER_COUNTRY_CACHE="$WORK_DIR/server-country.json" \ -FORKOP_INSTALLER_SING_BOX_VERSION_CACHE="$WORK_DIR/sing-box-version" \ -FORKOP_INSTALLER_TMP_SYSTEM_INFO_CACHE="$WORK_DIR/tmp-system-info.json" \ -FORKOP_WAS_ENABLED=1 \ -FORKOP_WAS_RUNNING=1 \ -FORKOP_INSTALLER_INIT_LOG="$WORK_DIR/init.log" \ +TACHYON_INSTALLER_INIT="$WORK_DIR/tachyon-init" \ +TACHYON_INSTALLER_RPCD_INIT="$WORK_DIR/missing-rpcd" \ +TACHYON_INSTALLER_LUCI_CACHE_GLOBS="$WORK_DIR/luci-indexcache*" \ +TACHYON_INSTALLER_LATEST_VERSION_CACHE="$WORK_DIR/latest.cache" \ +TACHYON_INSTALLER_SYSTEM_INFO_CACHE="$WORK_DIR/system-info.json" \ +TACHYON_INSTALLER_SERVER_COUNTRY_CACHE="$WORK_DIR/server-country.json" \ +TACHYON_INSTALLER_SING_BOX_VERSION_CACHE="$WORK_DIR/sing-box-version" \ +TACHYON_INSTALLER_TMP_SYSTEM_INFO_CACHE="$WORK_DIR/tmp-system-info.json" \ +TACHYON_WAS_ENABLED=1 \ +TACHYON_WAS_RUNNING=1 \ +TACHYON_INSTALLER_INIT_LOG="$WORK_DIR/init.log" \ ucode "$helper" installer-post-install if compgen -G "$WORK_DIR/luci-indexcache*" >/dev/null; then diff --git a/tests/log_hygiene.sh b/tests/log_hygiene.sh index 90512951..c8df5878 100644 --- a/tests/log_hygiene.sh +++ b/tests/log_hygiene.sh @@ -12,8 +12,8 @@ reject_runtime_pattern() { local pattern="$1" local label="$2" - if rg -n --fixed-strings "$pattern" "$ROOT_DIR/forkop/files" >/dev/null 2>&1; then - rg -n --fixed-strings "$pattern" "$ROOT_DIR/forkop/files" >&2 + if rg -n --fixed-strings "$pattern" "$ROOT_DIR/tachyon/files" >/dev/null 2>&1; then + rg -n --fixed-strings "$pattern" "$ROOT_DIR/tachyon/files" >&2 fail "$label" fi } @@ -22,8 +22,8 @@ reject_runtime_regex() { local pattern="$1" local label="$2" - if rg -n "$pattern" "$ROOT_DIR/forkop/files" >/dev/null 2>&1; then - rg -n "$pattern" "$ROOT_DIR/forkop/files" >&2 + if rg -n "$pattern" "$ROOT_DIR/tachyon/files" >/dev/null 2>&1; then + rg -n "$pattern" "$ROOT_DIR/tachyon/files" >&2 fail "$label" fi } @@ -44,7 +44,7 @@ reject_runtime_pattern "Current sing-box config hash:" \ "sing-box config logs must not emit duplicate hash lines" reject_runtime_pattern "Temporary sing-box config hash:" \ "sing-box config logs must not emit duplicate hash lines" -reject_runtime_pattern "Forkop did not reach a stable running state after start" \ +reject_runtime_pattern "Tachyon did not reach a stable running state after start" \ "startup rollback logs must not be fatal secondary errors" reject_runtime_pattern "Flush nft" \ "stop logs must not expose routine nft cleanup as user-facing info" diff --git a/tests/luci_dynamiclist_layout.sh b/tests/luci_dynamiclist_layout.sh index 41afef15..d3a446e3 100644 --- a/tests/luci_dynamiclist_layout.sh +++ b/tests/luci_dynamiclist_layout.sh @@ -2,7 +2,7 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -SECTION_JS="$ROOT_DIR/luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js" +SECTION_JS="$ROOT_DIR/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js" fail() { printf 'FAIL: %s\n' "$1" >&2 diff --git a/tests/luci_interface_settings.sh b/tests/luci_interface_settings.sh index 156b73ab..06e849ec 100644 --- a/tests/luci_interface_settings.sh +++ b/tests/luci_interface_settings.sh @@ -2,7 +2,7 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -SECTION_JS="$ROOT_DIR/luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js" +SECTION_JS="$ROOT_DIR/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js" fail() { printf 'FAIL: %s\n' "$1" >&2 diff --git a/tests/luci_localization.sh b/tests/luci_localization.sh index fb6a4269..a67d0437 100755 --- a/tests/luci_localization.sh +++ b/tests/luci_localization.sh @@ -2,9 +2,9 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -SECTION_JS="$ROOT_DIR/luci-app-forkop/htdocs/luci-static/resources/view/forkop/section.js" -SOURCE_PO="$ROOT_DIR/fe-app-forkop/locales/forkop.ru.po" -PACKAGE_PO="$ROOT_DIR/luci-app-forkop/po/ru/forkop.po" +SECTION_JS="$ROOT_DIR/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js" +SOURCE_PO="$ROOT_DIR/fe-app-tachyon/locales/tachyon.ru.po" +PACKAGE_PO="$ROOT_DIR/luci-app-tachyon/po/ru/tachyon.po" fail() { printf 'FAIL: %s\n' "$1" >&2 @@ -12,10 +12,10 @@ fail() { } if grep -Fq '_("Dismiss")' "$SECTION_JS"; then - fail "Forkop modals must use Close instead of the shared LuCI Dismiss key" + fail "Tachyon modals must use Close instead of the shared LuCI Dismiss key" fi grep -Fq '_("Close")' "$SECTION_JS" || - fail "Forkop section settings modal must expose a Close action" + fail "Tachyon section settings modal must expose a Close action" for po in "$SOURCE_PO" "$PACKAGE_PO"; do awk ' diff --git a/tests/luci_server_auth.sh b/tests/luci_server_auth.sh index 23065ea3..bc0f5d2a 100755 --- a/tests/luci_server_auth.sh +++ b/tests/luci_server_auth.sh @@ -2,7 +2,7 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -SERVER_JS="$ROOT_DIR/luci-app-forkop/htdocs/luci-static/resources/view/forkop/server.js" +SERVER_JS="$ROOT_DIR/luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/server.js" node - "$SERVER_JS" <<'NODE' const fs = require("fs"); diff --git a/tests/mark_ranges.sh b/tests/mark_ranges.sh index b5a6fad4..29814cc5 100644 --- a/tests/mark_ranges.sh +++ b/tests/mark_ranges.sh @@ -2,8 +2,8 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -VALIDATOR="$FORKOP_LIB/config/validator.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +VALIDATOR="$TACHYON_LIB/config/validator.uc" WORK_DIR="$(mktemp -d)" cleanup() { @@ -42,7 +42,7 @@ assert_mark_range_no_overlap() { done } -eval "$(ucode -L "$FORKOP_LIB" "$FORKOP_LIB/core/constants.uc" shell-env)" +eval "$(ucode -L "$TACHYON_LIB" "$TACHYON_LIB/core/constants.uc" shell-env)" assert_mark_range_no_overlap "Zapret" "$((ZAPRET_ROUTE_MARK_BASE))" "$ZAPRET_QUEUE_RANGE_SIZE" "$((NFT_FAKEIP_MARK))" "FakeIP" assert_mark_range_no_overlap "Zapret" "$((ZAPRET_ROUTE_MARK_BASE))" "$ZAPRET_QUEUE_RANGE_SIZE" "$((NFT_OUTBOUND_MARK))" "outbound" @@ -78,9 +78,9 @@ context_json() { JSON } -FORKOP_LIB="$FORKOP_LIB" ucode -L "$FORKOP_LIB" "$VALIDATOR" validate-runtime-fixture "$WORK_DIR/fixture.json" "$(context_json)" +TACHYON_LIB="$TACHYON_LIB" ucode -L "$TACHYON_LIB" "$VALIDATOR" validate-runtime-fixture "$WORK_DIR/fixture.json" "$(context_json)" -if FORKOP_LIB="$FORKOP_LIB" ucode -L "$FORKOP_LIB" "$VALIDATOR" validate-runtime-fixture "$WORK_DIR/fixture.json" "$(context_json "0x01100000")" >/dev/null 2>&1; then +if TACHYON_LIB="$TACHYON_LIB" ucode -L "$TACHYON_LIB" "$VALIDATOR" validate-runtime-fixture "$WORK_DIR/fixture.json" "$(context_json "0x01100000")" >/dev/null 2>&1; then fail "legacy Zapret2 route mark base should overlap FakeIP mark" fi diff --git a/tests/nft_apply.sh b/tests/nft_apply.sh index bf174c8d..57e5584e 100644 --- a/tests/nft_apply.sh +++ b/tests/nft_apply.sh @@ -2,8 +2,8 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -NFT_RUNTIME="$ROOT_DIR/forkop/files/usr/lib/nft/apply.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +NFT_RUNTIME="$ROOT_DIR/tachyon/files/usr/lib/nft/apply.uc" WORK_DIR="$(mktemp -d)" NFT_LOG="$WORK_DIR/nft.log" LOGGER_LOG="$WORK_DIR/logger.log" @@ -11,7 +11,7 @@ IP_LOG="$WORK_DIR/ip.log" SYSCTL_LOG="$WORK_DIR/sysctl.log" nft_ucode() { - ucode -L "$FORKOP_LIB" "$NFT_RUNTIME" "$@" + ucode -L "$TACHYON_LIB" "$NFT_RUNTIME" "$@" } cleanup() { @@ -171,10 +171,10 @@ export LOGGER_LOG export IP_LOG export SYSCTL_LOG -assert_eq "/tmp/forkop-cache/condition_rule_1_domain_domains" \ - "$(nft_ucode cache-path 1 /tmp/forkop-cache condition rule_1 domain domains)" \ +assert_eq "/tmp/tachyon-cache/condition_rule_1_domain_domains" \ + "$(nft_ucode cache-path 1 /tmp/tachyon-cache condition rule_1 domain domains)" \ "cache path" -if nft_ucode cache-path 1 /tmp/forkop-cache condition 'bad-name' domain domains >/dev/null 2>&1; then +if nft_ucode cache-path 1 /tmp/tachyon-cache condition 'bad-name' domain domains >/dev/null 2>&1; then fail "unsafe cache key should fail" fi @@ -206,55 +206,55 @@ assert_eq "^xn--80aswg[.]xn--p1ai$" \ "$(nft_ucode rule-condition-csv domain_regex generic 0 0 '' '' 'сайт.рф full:пример.испытание keyword:пример regex:^сайт[.]рф$' '')" \ "combined IDN regex is punycoded" -nft_ucode nft-create-runtime-base ForkopTable localv4 forkop_subnets forkop_ports forkop_ip_ports forkop_interfaces "br-lan tun0" 0x00100000 0x00200000 198.18.0.0/15 1602 1 -assert_contains "$NFT_LOG" $'nft\tadd\ttable\tinet\tForkopTable' "runtime table" -assert_contains "$NFT_LOG" $'nft\tadd\tset\tinet\tForkopTable\tlocalv4\t{ type ipv4_addr; flags interval; auto-merge; }' "runtime localv4 set" -assert_contains "$NFT_LOG" $'nft\tadd\tset\tinet\tForkopTable\tlocalv6\t{ type ipv6_addr; flags interval; auto-merge; }' "runtime localv6 set" +nft_ucode nft-create-runtime-base TachyonTable localv4 tachyon_subnets tachyon_ports tachyon_ip_ports tachyon_interfaces "br-lan tun0" 0x00100000 0x00200000 198.18.0.0/15 1602 1 +assert_contains "$NFT_LOG" $'nft\tadd\ttable\tinet\tTachyonTable' "runtime table" +assert_contains "$NFT_LOG" $'nft\tadd\tset\tinet\tTachyonTable\tlocalv4\t{ type ipv4_addr; flags interval; auto-merge; }' "runtime localv4 set" +assert_contains "$NFT_LOG" $'nft\tadd\tset\tinet\tTachyonTable\tlocalv6\t{ type ipv6_addr; flags interval; auto-merge; }' "runtime localv6 set" assert_contains "$NFT_LOG" '0.0.0.0/8,10.0.0.0/8,127.0.0.0/8' "runtime localv4 elements" assert_contains "$NFT_LOG" '::/128,::1/128,64:ff9b::/96' "runtime localv6 elements" -assert_contains "$NFT_LOG" $'nft\tadd\tset\tinet\tForkopTable\tforkop_interfaces\t{ type ifname; flags interval; }' "runtime interface set" -assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tForkopTable\tforkop_interfaces\t{ br-lan }' "runtime br-lan interface" -assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tForkopTable\tforkop_interfaces\t{ tun0 }' "runtime tun0 interface" -assert_contains "$NFT_LOG" $'nft\tadd\tchain\tinet\tForkopTable\tmangle\t{ type filter hook prerouting priority -150; policy accept; }' "runtime mangle chain" -assert_contains "$NFT_LOG" $'nft\tadd\tchain\tinet\tForkopTable\tpriority_rules\t{ }' "runtime priority chain" -assert_contains "$NFT_LOG" $'nft\tadd\tchain\tinet\tForkopTable\tpriority_output_rules\t{ }' "runtime priority output chain" -assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tForkopTable\tmangle\tjump\tpriority_rules' "runtime priority jump" -assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tForkopTable\tmangle\tiifname\t@forkop_interfaces\tip\tdaddr\t@forkop_subnets\tmeta\tl4proto\ttcp\tmeta\tmark\tset\t0x00100000\tcounter' "runtime common tcp rule" -assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tForkopTable\tmangle\tiifname\t@forkop_interfaces\tip6\tdaddr\t@forkop_subnets6\tmeta\tl4proto\ttcp\tmeta\tmark\tset\t0x00100000\tcounter' "runtime common6 tcp rule" -assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tForkopTable\tproxy\tmeta\tmark\t&\t0x00100000\t==\t0x00100000\tmeta\tl4proto\ttcp\ttproxy\tip\tto\t:1602\tcounter' "runtime proxy tcp rule" -assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tForkopTable\tproxy\tmeta\tmark\t&\t0x00100000\t==\t0x00100000\tmeta\tl4proto\ttcp\ttproxy\tip6\tto\t[::1]:1602\tcounter' "runtime proxy6 tcp rule" -assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tForkopTable\tmangle_output\tmeta\tmark\t0x00200000\tcounter\treturn' "runtime outbound return" -assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tForkopTable\tmangle_output\tjump\tpriority_output_rules' "runtime priority output jump" -assert_contains "$NFT_LOG" $'nft\tinsert\trule\tinet\tForkopTable\tmangle\tudp\tdport\t123\treturn' "runtime ntp exclusion" +assert_contains "$NFT_LOG" $'nft\tadd\tset\tinet\tTachyonTable\ttachyon_interfaces\t{ type ifname; flags interval; }' "runtime interface set" +assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tTachyonTable\ttachyon_interfaces\t{ br-lan }' "runtime br-lan interface" +assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tTachyonTable\ttachyon_interfaces\t{ tun0 }' "runtime tun0 interface" +assert_contains "$NFT_LOG" $'nft\tadd\tchain\tinet\tTachyonTable\tmangle\t{ type filter hook prerouting priority -150; policy accept; }' "runtime mangle chain" +assert_contains "$NFT_LOG" $'nft\tadd\tchain\tinet\tTachyonTable\tpriority_rules\t{ }' "runtime priority chain" +assert_contains "$NFT_LOG" $'nft\tadd\tchain\tinet\tTachyonTable\tpriority_output_rules\t{ }' "runtime priority output chain" +assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tTachyonTable\tmangle\tjump\tpriority_rules' "runtime priority jump" +assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tTachyonTable\tmangle\tiifname\t@tachyon_interfaces\tip\tdaddr\t@tachyon_subnets\tmeta\tl4proto\ttcp\tmeta\tmark\tset\t0x00100000\tcounter' "runtime common tcp rule" +assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tTachyonTable\tmangle\tiifname\t@tachyon_interfaces\tip6\tdaddr\t@tachyon_subnets6\tmeta\tl4proto\ttcp\tmeta\tmark\tset\t0x00100000\tcounter' "runtime common6 tcp rule" +assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tTachyonTable\tproxy\tmeta\tmark\t&\t0x00100000\t==\t0x00100000\tmeta\tl4proto\ttcp\ttproxy\tip\tto\t:1602\tcounter' "runtime proxy tcp rule" +assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tTachyonTable\tproxy\tmeta\tmark\t&\t0x00100000\t==\t0x00100000\tmeta\tl4proto\ttcp\ttproxy\tip6\tto\t[::1]:1602\tcounter' "runtime proxy6 tcp rule" +assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tTachyonTable\tmangle_output\tmeta\tmark\t0x00200000\tcounter\treturn' "runtime outbound return" +assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tTachyonTable\tmangle_output\tjump\tpriority_output_rules' "runtime priority output jump" +assert_contains "$NFT_LOG" $'nft\tinsert\trule\tinet\tTachyonTable\tmangle\tudp\tdport\t123\treturn' "runtime ntp exclusion" cat >"$WORK_DIR/runtime-base-uci.state" <<'EOF_UCI' -forkop.settings=settings -forkop.settings.source_network_interfaces=br-lan tun0 -forkop.settings.exclude_ntp=1 +tachyon.settings=settings +tachyon.settings.source_network_interfaces=br-lan tun0 +tachyon.settings.exclude_ntp=1 EOF_UCI : > "$NFT_LOG" -FORKOP_UCI_STATE_FILE="$WORK_DIR/runtime-base-uci.state" \ - nft_ucode nft-create-runtime-base-from-uci ForkopTable localv4 forkop_subnets forkop_ports forkop_ip_ports forkop_interfaces 0x00100000 0x00200000 198.18.0.0/15 1602 -assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tForkopTable\tforkop_interfaces\t{ br-lan }' "runtime base from UCI br-lan interface" -assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tForkopTable\tforkop_interfaces\t{ tun0 }' "runtime base from UCI tun0 interface" -assert_contains "$NFT_LOG" $'nft\tinsert\trule\tinet\tForkopTable\tmangle\tudp\tdport\t123\treturn' "runtime base from UCI ntp exclusion" +TACHYON_UCI_STATE_FILE="$WORK_DIR/runtime-base-uci.state" \ + nft_ucode nft-create-runtime-base-from-uci TachyonTable localv4 tachyon_subnets tachyon_ports tachyon_ip_ports tachyon_interfaces 0x00100000 0x00200000 198.18.0.0/15 1602 +assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tTachyonTable\ttachyon_interfaces\t{ br-lan }' "runtime base from UCI br-lan interface" +assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tTachyonTable\ttachyon_interfaces\t{ tun0 }' "runtime base from UCI tun0 interface" +assert_contains "$NFT_LOG" $'nft\tinsert\trule\tinet\tTachyonTable\tmangle\tudp\tdport\t123\treturn' "runtime base from UCI ntp exclusion" : > "$NFT_LOG" -nft_ucode nft-create-runtime-output-rules ForkopTable localv4 forkop_subnets forkop_ports forkop_ip_ports 0x00100000 198.18.0.0/15 -assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tForkopTable\tmangle_output\tip\tdaddr\t@forkop_subnets\tmeta\tl4proto\ttcp\tmeta\tmark\tset\t0x00100000\tcounter' "runtime output common tcp" -assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tForkopTable\tmangle_output\tip6\tdaddr\t@forkop_subnets6\tmeta\tl4proto\ttcp\tmeta\tmark\tset\t0x00100000\tcounter' "runtime output common6 tcp" -assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tForkopTable\tmangle_output\tip\tdaddr\t.\ttcp\tdport\t@forkop_ip_ports\tmeta\tmark\tset\t0x00100000\tcounter' "runtime output ip-port tcp" -assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tForkopTable\tmangle_output\tip6\tdaddr\t.\ttcp\tdport\t@forkop_ip6_ports\tmeta\tmark\tset\t0x00100000\tcounter' "runtime output ip6-port tcp" -assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tForkopTable\tmangle_output\ttcp\tdport\t@forkop_ports\tmeta\tmark\tset\t0x00100000\tcounter' "runtime output port tcp" -assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tForkopTable\tmangle_output\tip\tdaddr\t198.18.0.0/15\tmeta\tl4proto\tudp\tmeta\tmark\tset\t0x00100000\tcounter' "runtime output fakeip udp" +nft_ucode nft-create-runtime-output-rules TachyonTable localv4 tachyon_subnets tachyon_ports tachyon_ip_ports 0x00100000 198.18.0.0/15 +assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tTachyonTable\tmangle_output\tip\tdaddr\t@tachyon_subnets\tmeta\tl4proto\ttcp\tmeta\tmark\tset\t0x00100000\tcounter' "runtime output common tcp" +assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tTachyonTable\tmangle_output\tip6\tdaddr\t@tachyon_subnets6\tmeta\tl4proto\ttcp\tmeta\tmark\tset\t0x00100000\tcounter' "runtime output common6 tcp" +assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tTachyonTable\tmangle_output\tip\tdaddr\t.\ttcp\tdport\t@tachyon_ip_ports\tmeta\tmark\tset\t0x00100000\tcounter' "runtime output ip-port tcp" +assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tTachyonTable\tmangle_output\tip6\tdaddr\t.\ttcp\tdport\t@tachyon_ip6_ports\tmeta\tmark\tset\t0x00100000\tcounter' "runtime output ip6-port tcp" +assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tTachyonTable\tmangle_output\ttcp\tdport\t@tachyon_ports\tmeta\tmark\tset\t0x00100000\tcounter' "runtime output port tcp" +assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tTachyonTable\tmangle_output\tip\tdaddr\t198.18.0.0/15\tmeta\tl4proto\tudp\tmeta\tmark\tset\t0x00100000\tcounter' "runtime output fakeip udp" : > "$NFT_LOG" -if NFT_LIST_TABLE_FAIL=1 nft_ucode nft-table-present-fixture ForkopTable 2>"$WORK_DIR/nft-table-present.err"; then +if NFT_LIST_TABLE_FAIL=1 nft_ucode nft-table-present-fixture TachyonTable 2>"$WORK_DIR/nft-table-present.err"; then fail "missing nft table should return false" fi [ ! -s "$WORK_DIR/nft-table-present.err" ] || fail "missing nft table predicate must suppress nft stderr" -assert_contains "$NFT_LOG" $'nft\tlist\ttable\tinet\tForkopTable' "nft table presence check" +assert_contains "$NFT_LOG" $'nft\tlist\ttable\tinet\tTachyonTable' "nft table presence check" cat >"$WORK_DIR/provider-rules.json" <<'JSON' { @@ -272,16 +272,16 @@ printf '#!/usr/bin/env sh\nexit 0\n' >"$provider_bin" chmod 0755 "$provider_bin" : > "$NFT_LOG" -nft_ucode nft-create-provider-output-rules-fixture "$WORK_DIR/provider-rules.json" ForkopTable zapret "$provider_bin" 0x01000000 4000 0x40000000 0x20000000 -assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tForkopTable\tmangle_output\tmeta\tmark\t&\t0x40000000\t==\t0x40000000\treturn' "zapret desync return" -assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tForkopTable\tmangle_output\tmeta\tmark\t0x01000001\tmeta\tl4proto\ttcp\tcounter\tqueue\tnum\t4000\tbypass' "zapret first tcp queue rule" -assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tForkopTable\tmangle_output\tmeta\tmark\t0x01000002\tmeta\tl4proto\tudp\tcounter\tqueue\tnum\t4001\tbypass' "zapret second udp queue rule" +nft_ucode nft-create-provider-output-rules-fixture "$WORK_DIR/provider-rules.json" TachyonTable zapret "$provider_bin" 0x01000000 4000 0x40000000 0x20000000 +assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tTachyonTable\tmangle_output\tmeta\tmark\t&\t0x40000000\t==\t0x40000000\treturn' "zapret desync return" +assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tTachyonTable\tmangle_output\tmeta\tmark\t0x01000001\tmeta\tl4proto\ttcp\tcounter\tqueue\tnum\t4000\tbypass' "zapret first tcp queue rule" +assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tTachyonTable\tmangle_output\tmeta\tmark\t0x01000002\tmeta\tl4proto\tudp\tcounter\tqueue\tnum\t4001\tbypass' "zapret second udp queue rule" if grep -Fq 'zapret_disabled' "$NFT_LOG"; then fail "disabled provider section should not create nft rule" fi : > "$NFT_LOG" -nft_ucode nft-create-provider-output-rules-fixture "$WORK_DIR/provider-rules.json" ForkopTable zapret "$WORK_DIR/bin/missing-provider" 0x01000000 4000 0x40000000 0x20000000 +nft_ucode nft-create-provider-output-rules-fixture "$WORK_DIR/provider-rules.json" TachyonTable zapret "$WORK_DIR/bin/missing-provider" 0x01000000 4000 0x40000000 0x20000000 if [ -s "$NFT_LOG" ]; then fail "missing provider binary should skip provider nft output rules" fi @@ -315,26 +315,26 @@ cat >"$WORK_DIR/priority-rules.json" <<'JSON' JSON : > "$NFT_LOG" -nft_ucode nft-add-section-priority-rules-fixture "$WORK_DIR/priority-rules.json" ForkopTable forkop_interfaces localv4 localv6 0x00100000 -assert_contains "$NFT_LOG" $'nft\tadd\tset\tinet\tForkopTable\tforkop_rule_bypass_first_subnets\t{ type ipv4_addr; flags interval; auto-merge; }' "bypass priority subnet set" -assert_contains "$NFT_LOG" $'nft\tadd\tset\tinet\tForkopTable\tforkop_rule_wide_proxy_subnets\t{ type ipv4_addr; flags interval; auto-merge; }' "proxy priority subnet set" -assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tForkopTable\tpriority_rules\tiifname\t@forkop_interfaces\tip\tdaddr\t!=\t@localv4\tip\tdaddr\t@forkop_rule_bypass_first_subnets\tcounter\taccept' "bypass priority accept rule" -assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tForkopTable\tpriority_rules\tiifname\t@forkop_interfaces\tip\tdaddr\t!=\t@localv4\tip\tdaddr\t@forkop_rule_wide_proxy_subnets\tmeta\tmark\tset\t0x00100000\tcounter\taccept' "proxy priority capture rule" -assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tForkopTable\tpriority_rules\tiifname\t@forkop_interfaces\tip\tdaddr\t!=\t@localv4\ttcp\tdport\t@forkop_rule_port_bypass_ports\tcounter\taccept' "port-only bypass priority rule" +nft_ucode nft-add-section-priority-rules-fixture "$WORK_DIR/priority-rules.json" TachyonTable tachyon_interfaces localv4 localv6 0x00100000 +assert_contains "$NFT_LOG" $'nft\tadd\tset\tinet\tTachyonTable\ttachyon_rule_bypass_first_subnets\t{ type ipv4_addr; flags interval; auto-merge; }' "bypass priority subnet set" +assert_contains "$NFT_LOG" $'nft\tadd\tset\tinet\tTachyonTable\ttachyon_rule_wide_proxy_subnets\t{ type ipv4_addr; flags interval; auto-merge; }' "proxy priority subnet set" +assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tTachyonTable\tpriority_rules\tiifname\t@tachyon_interfaces\tip\tdaddr\t!=\t@localv4\tip\tdaddr\t@tachyon_rule_bypass_first_subnets\tcounter\taccept' "bypass priority accept rule" +assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tTachyonTable\tpriority_rules\tiifname\t@tachyon_interfaces\tip\tdaddr\t!=\t@localv4\tip\tdaddr\t@tachyon_rule_wide_proxy_subnets\tmeta\tmark\tset\t0x00100000\tcounter\taccept' "proxy priority capture rule" +assert_contains "$NFT_LOG" $'nft\tadd\trule\tinet\tTachyonTable\tpriority_rules\tiifname\t@tachyon_interfaces\tip\tdaddr\t!=\t@localv4\ttcp\tdport\t@tachyon_rule_port_bypass_ports\tcounter\taccept' "port-only bypass priority rule" assert_line_before "$NFT_LOG" \ - $'nft\tadd\trule\tinet\tForkopTable\tpriority_rules\tiifname\t@forkop_interfaces\tip\tdaddr\t!=\t@localv4\tip\tdaddr\t@forkop_rule_bypass_first_subnets\tcounter\taccept' \ - $'nft\tadd\trule\tinet\tForkopTable\tpriority_rules\tiifname\t@forkop_interfaces\tip\tdaddr\t!=\t@localv4\tip\tdaddr\t@forkop_rule_wide_proxy_subnets\tmeta\tmark\tset\t0x00100000\tcounter\taccept' \ + $'nft\tadd\trule\tinet\tTachyonTable\tpriority_rules\tiifname\t@tachyon_interfaces\tip\tdaddr\t!=\t@localv4\tip\tdaddr\t@tachyon_rule_bypass_first_subnets\tcounter\taccept' \ + $'nft\tadd\trule\tinet\tTachyonTable\tpriority_rules\tiifname\t@tachyon_interfaces\tip\tdaddr\t!=\t@localv4\tip\tdaddr\t@tachyon_rule_wide_proxy_subnets\tmeta\tmark\tset\t0x00100000\tcounter\taccept' \ "bypass priority order" : > "$IP_LOG" : > "$LOGGER_LOG" rt_tables="$WORK_DIR/rt_tables" -IP_ROUTE_OUTPUT='' IP_ROUTE6_OUTPUT='' IP_RULE_OUTPUT='' IP_RULE6_OUTPUT='' nft_ucode ensure-tproxy-route-rule forkop 0x00100000 "$rt_tables" -assert_contains "$rt_tables" "105 forkop" "tproxy route table registry" -assert_contains "$IP_LOG" $'ip\troute\tadd\tlocal\t0.0.0.0/0\tdev\tlo\ttable\tforkop' "tproxy route add" -assert_contains "$IP_LOG" $'ip\t-6\troute\tadd\tlocal\t::/0\tdev\tlo\ttable\tforkop' "tproxy route6 add" -assert_contains "$IP_LOG" $'ip\t-4\trule\tadd\tfwmark\t0x00100000/0x00100000\ttable\tforkop\tpriority\t105' "tproxy marking rule add" -assert_contains "$IP_LOG" $'ip\t-6\trule\tadd\tfwmark\t0x00100000/0x00100000\ttable\tforkop\tpriority\t105' "tproxy marking rule6 add" +IP_ROUTE_OUTPUT='' IP_ROUTE6_OUTPUT='' IP_RULE_OUTPUT='' IP_RULE6_OUTPUT='' nft_ucode ensure-tproxy-route-rule tachyon 0x00100000 "$rt_tables" +assert_contains "$rt_tables" "105 tachyon" "tproxy route table registry" +assert_contains "$IP_LOG" $'ip\troute\tadd\tlocal\t0.0.0.0/0\tdev\tlo\ttable\ttachyon' "tproxy route add" +assert_contains "$IP_LOG" $'ip\t-6\troute\tadd\tlocal\t::/0\tdev\tlo\ttable\ttachyon' "tproxy route6 add" +assert_contains "$IP_LOG" $'ip\t-4\trule\tadd\tfwmark\t0x00100000/0x00100000\ttable\ttachyon\tpriority\t105' "tproxy marking rule add" +assert_contains "$IP_LOG" $'ip\t-6\trule\tadd\tfwmark\t0x00100000/0x00100000\ttable\ttachyon\tpriority\t105' "tproxy marking rule6 add" assert_contains "$LOGGER_LOG" "[debug] Added IPv4 TPROXY route" "tproxy route creation log" assert_contains "$LOGGER_LOG" "[debug] Added IPv6 TPROXY route" "tproxy route6 creation log" assert_contains "$LOGGER_LOG" "[debug] Creating IPv4 TPROXY marking rule" "tproxy marking rule creation log" @@ -342,12 +342,12 @@ assert_contains "$LOGGER_LOG" "[debug] Creating IPv6 TPROXY marking rule" "tprox : > "$IP_LOG" : > "$LOGGER_LOG" -printf '%s\n' '105 forkop' >"$rt_tables" +printf '%s\n' '105 tachyon' >"$rt_tables" IP_ROUTE_OUTPUT='local default dev lo scope host' \ IP_ROUTE6_OUTPUT='local default dev lo metric 1024 pref medium' \ - IP_RULE_OUTPUT='105: from all fwmark 0x100000/0x100000 lookup forkop' \ - IP_RULE6_OUTPUT='105: from all fwmark 0x100000/0x100000 lookup forkop' \ - nft_ucode ensure-tproxy-route-rule forkop 0x00100000 "$rt_tables" + IP_RULE_OUTPUT='105: from all fwmark 0x100000/0x100000 lookup tachyon' \ + IP_RULE6_OUTPUT='105: from all fwmark 0x100000/0x100000 lookup tachyon' \ + nft_ucode ensure-tproxy-route-rule tachyon 0x00100000 "$rt_tables" if grep -Fq $'\tadd\t' "$IP_LOG"; then fail "existing tproxy route/rule should not be added again" fi @@ -357,14 +357,14 @@ assert_contains "$LOGGER_LOG" "[debug] IPv4 TPROXY marking rule already exists" assert_contains "$LOGGER_LOG" "[debug] IPv6 TPROXY marking rule already exists" "existing tproxy marking rule6 log" IP_ROUTE_OUTPUT='local default dev lo scope host' \ IP_ROUTE6_OUTPUT='local default dev lo metric 1024 pref medium' \ - IP_RULE_OUTPUT='105: from all fwmark 0x100000/0x100000 lookup forkop' \ - IP_RULE6_OUTPUT='105: from all fwmark 0x100000/0x100000 lookup forkop' \ - nft_ucode tproxy-route-rule-present forkop 0x00100000 + IP_RULE_OUTPUT='105: from all fwmark 0x100000/0x100000 lookup tachyon' \ + IP_RULE6_OUTPUT='105: from all fwmark 0x100000/0x100000 lookup tachyon' \ + nft_ucode tproxy-route-rule-present tachyon 0x00100000 if IP_ROUTE_OUTPUT='local default dev lo scope host' \ IP_ROUTE6_OUTPUT='local default dev lo metric 1024 pref medium' \ IP_RULE_OUTPUT='105: from all fwmark 0x100000/0x100000 lookup other' \ - IP_RULE6_OUTPUT='105: from all fwmark 0x100000/0x100000 lookup forkop' \ - nft_ucode tproxy-route-rule-present forkop 0x00100000 >/dev/null 2>&1; then + IP_RULE6_OUTPUT='105: from all fwmark 0x100000/0x100000 lookup tachyon' \ + nft_ucode tproxy-route-rule-present tachyon 0x00100000 >/dev/null 2>&1; then fail "tproxy route/rule presence should require matching lookup table" fi @@ -389,10 +389,10 @@ bad-value 203.0.113.0/24 EOF_INPUT -nft_ucode nft-add-file-chunks-to-set "$input" ForkopTable forkop_subnets ips "" 2 -assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tForkopTable\tforkop_subnets\t{ 198.51.100.1,203.0.113.0/24 }' "nft chunked ips" +nft_ucode nft-add-file-chunks-to-set "$input" TachyonTable tachyon_subnets ips "" 2 +assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tTachyonTable\ttachyon_subnets\t{ 198.51.100.1,203.0.113.0/24 }' "nft chunked ips" assert_contains "$LOGGER_LOG" "[debug] 'bad-value' is not IP or CIDR" "invalid element log" -assert_contains "$LOGGER_LOG" "[debug] Adding 2 elements to nft set forkop_subnets" "chunk count log" +assert_contains "$LOGGER_LOG" "[debug] Adding 2 elements to nft set tachyon_subnets" "chunk count log" : > "$NFT_LOG" ports_input="$WORK_DIR/ip-ports.txt" @@ -401,7 +401,7 @@ cat >"$ports_input" <<'EOF_INPUT' 203.0.113.0/24 EOF_INPUT -nft_ucode nft-add-file-chunks-to-set "$ports_input" ForkopTable forkop_ip_ports ip-port-from-ip "80,443-444" 3 +nft_ucode nft-add-file-chunks-to-set "$ports_input" TachyonTable tachyon_ip_ports ip-port-from-ip "80,443-444" 3 assert_contains "$NFT_LOG" $'198.51.100.1 . 80,198.51.100.1 . 443-444,203.0.113.0/24 . 80' "ip-port chunk" assert_contains "$NFT_LOG" $'203.0.113.0/24 . 443-444' "ip-port second chunk" @@ -480,12 +480,12 @@ cat >"$plain_subnets" <<'EOF_INPUT' EOF_INPUT : > "$NFT_LOG" -nft_ucode nft-add-subnet-file-for-section-fixture "$WORK_DIR/populate-fixture.json" inline_no_ports "$plain_subnets" ForkopTable forkop_subnets forkop_ip_ports 5000 -assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tForkopTable\tforkop_rule_inline_no_ports_subnets\t{ 198.51.100.210,203.0.113.0/24 }' "plain subnet import without ports" -assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tForkopTable\tforkop_rule_inline_no_ports_subnets6\t{ 2001:db8::210 }' "plain subnet6 import without ports" +nft_ucode nft-add-subnet-file-for-section-fixture "$WORK_DIR/populate-fixture.json" inline_no_ports "$plain_subnets" TachyonTable tachyon_subnets tachyon_ip_ports 5000 +assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tTachyonTable\ttachyon_rule_inline_no_ports_subnets\t{ 198.51.100.210,203.0.113.0/24 }' "plain subnet import without ports" +assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tTachyonTable\ttachyon_rule_inline_no_ports_subnets6\t{ 2001:db8::210 }' "plain subnet6 import without ports" : > "$NFT_LOG" -nft_ucode nft-add-subnet-file-for-section-fixture "$WORK_DIR/populate-fixture.json" ports_only "$plain_subnets" ForkopTable forkop_subnets forkop_ip_ports 3 +nft_ucode nft-add-subnet-file-for-section-fixture "$WORK_DIR/populate-fixture.json" ports_only "$plain_subnets" TachyonTable tachyon_subnets tachyon_ip_ports 3 assert_contains "$NFT_LOG" $'198.51.100.210 . 53,198.51.100.210 . 853,198.51.100.210 . 5353' "plain subnet import scoped first chunk" assert_contains "$NFT_LOG" $'203.0.113.0/24 . 53,203.0.113.0/24 . 853,203.0.113.0/24 . 5353' "plain subnet import scoped second chunk" assert_contains "$NFT_LOG" $'2001:db8::210 . 53,2001:db8::210 . 853,2001:db8::210 . 5353' "plain subnet6 import scoped chunk" @@ -512,59 +512,59 @@ JSON : > "$NFT_LOG" unscoped_json="$WORK_DIR/unscoped-json.txt" scoped_json="$WORK_DIR/scoped-json.txt" -nft_ucode nft-add-json-ruleset-subnets-for-section-fixture "$WORK_DIR/populate-fixture.json" inline_no_ports "$json_ruleset" "fixture json" ForkopTable forkop_subnets forkop_ip_ports "$unscoped_json" "$scoped_json" 5000 -assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tForkopTable\tforkop_rule_inline_no_ports_subnets\t{ 198.51.100.220 }' "json ruleset unscoped import" -assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tForkopTable\tforkop_rule_inline_no_ports_subnets6\t{ 2001:db8::220 }' "json ruleset unscoped6 import" -assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tForkopTable\tforkop_rule_inline_no_ports_ip_ports\t{ 198.51.100.221 . 443,198.51.100.222 . 1000-1002 }' "json ruleset own port filters" +nft_ucode nft-add-json-ruleset-subnets-for-section-fixture "$WORK_DIR/populate-fixture.json" inline_no_ports "$json_ruleset" "fixture json" TachyonTable tachyon_subnets tachyon_ip_ports "$unscoped_json" "$scoped_json" 5000 +assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tTachyonTable\ttachyon_rule_inline_no_ports_subnets\t{ 198.51.100.220 }' "json ruleset unscoped import" +assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tTachyonTable\ttachyon_rule_inline_no_ports_subnets6\t{ 2001:db8::220 }' "json ruleset unscoped6 import" +assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tTachyonTable\ttachyon_rule_inline_no_ports_ip_ports\t{ 198.51.100.221 . 443,198.51.100.222 . 1000-1002 }' "json ruleset own port filters" : > "$NFT_LOG" unscoped_json="$WORK_DIR/unscoped-json-ports.txt" scoped_json="$WORK_DIR/scoped-json-ports.txt" -nft_ucode nft-add-json-ruleset-subnets-for-section-fixture "$WORK_DIR/populate-fixture.json" ports_only "$json_ruleset" "fixture json ports" ForkopTable forkop_subnets forkop_ip_ports "$unscoped_json" "$scoped_json" 4 +nft_ucode nft-add-json-ruleset-subnets-for-section-fixture "$WORK_DIR/populate-fixture.json" ports_only "$json_ruleset" "fixture json ports" TachyonTable tachyon_subnets tachyon_ip_ports "$unscoped_json" "$scoped_json" 4 assert_contains "$NFT_LOG" $'198.51.100.220 . 53,198.51.100.220 . 5353,198.51.100.220 . 853' "json ruleset scoped import" if grep -Fq '198.51.100.221' "$NFT_LOG" || grep -Fq '198.51.100.222' "$NFT_LOG"; then fail "json ruleset section ports should intersect rule-owned port filters" fi : > "$NFT_LOG" -nft_ucode nft-add-community-subnet-file-for-section-fixture "$WORK_DIR/populate-fixture.json" inline_no_ports discord "$plain_subnets" ForkopTable forkop_subnets forkop_ip_ports forkop_interfaces forkop_discord_subnets 0x00100000 5000 -assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tForkopTable\tforkop_rule_inline_no_ports_subnets\t{ 198.51.100.210,203.0.113.0/24 }' "discord community subnet import" +nft_ucode nft-add-community-subnet-file-for-section-fixture "$WORK_DIR/populate-fixture.json" inline_no_ports discord "$plain_subnets" TachyonTable tachyon_subnets tachyon_ip_ports tachyon_interfaces tachyon_discord_subnets 0x00100000 5000 +assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tTachyonTable\ttachyon_rule_inline_no_ports_subnets\t{ 198.51.100.210,203.0.113.0/24 }' "discord community subnet import" : > "$NFT_LOG" -NFT_MANGLE_CHAIN_OUTPUT=$'iifname @forkop_interfaces ip daddr @forkop_discord_subnets udp dport { 19000-20000, 50000-65535 } meta mark set 0x00100000 counter\niifname @forkop_interfaces ip6 daddr @forkop_discord_subnets6 udp dport { 19000-20000, 50000-65535 } meta mark set 0x00100000 counter' \ - nft_ucode nft-add-community-subnet-file-for-section-fixture "$WORK_DIR/populate-fixture.json" inline_no_ports discord "$plain_subnets" ForkopTable forkop_subnets forkop_ip_ports forkop_interfaces forkop_discord_subnets 0x00100000 5000 +NFT_MANGLE_CHAIN_OUTPUT=$'iifname @tachyon_interfaces ip daddr @tachyon_discord_subnets udp dport { 19000-20000, 50000-65535 } meta mark set 0x00100000 counter\niifname @tachyon_interfaces ip6 daddr @tachyon_discord_subnets6 udp dport { 19000-20000, 50000-65535 } meta mark set 0x00100000 counter' \ + nft_ucode nft-add-community-subnet-file-for-section-fixture "$WORK_DIR/populate-fixture.json" inline_no_ports discord "$plain_subnets" TachyonTable tachyon_subnets tachyon_ip_ports tachyon_interfaces tachyon_discord_subnets 0x00100000 5000 if grep -Fq $'nft\tadd\trule' "$NFT_LOG"; then fail "discord community existing rule should not insert" fi : > "$NFT_LOG" -nft_ucode nft-add-community-subnet-file-for-section-fixture "$WORK_DIR/populate-fixture.json" ports_only discord "$plain_subnets" ForkopTable forkop_subnets forkop_ip_ports forkop_interfaces forkop_discord_subnets 0x00100000 3 -if grep -Fq 'forkop_discord_subnets' "$NFT_LOG"; then +nft_ucode nft-add-community-subnet-file-for-section-fixture "$WORK_DIR/populate-fixture.json" ports_only discord "$plain_subnets" TachyonTable tachyon_subnets tachyon_ip_ports tachyon_interfaces tachyon_discord_subnets 0x00100000 3 +if grep -Fq 'tachyon_discord_subnets' "$NFT_LOG"; then fail "discord community with section ports should not use the discord nft set" fi assert_contains "$NFT_LOG" $'198.51.100.210 . 53,198.51.100.210 . 853,198.51.100.210 . 5353' "discord community with ports uses scoped import" : > "$NFT_LOG" -nft_ucode nft-populate-runtime-sets-fixture "$WORK_DIR/populate-fixture.json" 1 "deferred" ForkopTable forkop_subnets forkop_ports forkop_ip_ports forkop_interfaces localv4 0x00100000 +nft_ucode nft-populate-runtime-sets-fixture "$WORK_DIR/populate-fixture.json" 1 "deferred" TachyonTable tachyon_subnets tachyon_ports tachyon_ip_ports tachyon_interfaces localv4 0x00100000 assert_contains "$NFT_LOG" $'198.51.100.1 . 80,198.51.100.1 . 443-444,203.0.113.0/24 . 80' "populate inline ip-port first chunk" assert_contains "$NFT_LOG" $'203.0.113.0/24 . 443-444' "populate inline ip-port second chunk" -assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tForkopTable\tforkop_rule_inline_ip_ports\t{ 198.51.100.1 . 80,198.51.100.1 . 443-444,203.0.113.0/24 . 80,203.0.113.0/24 . 443-444 }' "populate inline priority ip-port set" -assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tForkopTable\tforkop_rule_inline_ip6_ports\t{ 2001:db8::1 . 80,2001:db8::1 . 443-444 }' "populate inline priority ip6-port set" -assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tForkopTable\tforkop_rule_inline_no_ports_subnets\t{ 198.51.100.200 }' "populate inline ip without ports" -assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tForkopTable\tforkop_rule_inline_no_ports_subnets6\t{ 2001:db8::200 }' "populate inline ip6 without ports" -assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tForkopTable\tforkop_rule_ports_only_ports\t{ 53,853,5353 }' "populate ports-only set" -assert_contains "$NFT_LOG" $'nft\tinsert\trule\tinet\tForkopTable\tmangle\tiifname\t@forkop_interfaces\tip\tsaddr\t192.168.1.20/32\tmeta\tl4proto\ttcp\tmeta\tmark\tset\t0x00100000\tcounter' "populate fully routed tcp" -assert_contains "$NFT_LOG" $'nft\tinsert\trule\tinet\tForkopTable\tmangle\tiifname\t@forkop_interfaces\tip6\tsaddr\t2001:db8::20/128\tmeta\tl4proto\ttcp\tmeta\tmark\tset\t0x00100000\tcounter' "populate fully routed6 tcp" +assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tTachyonTable\ttachyon_rule_inline_ip_ports\t{ 198.51.100.1 . 80,198.51.100.1 . 443-444,203.0.113.0/24 . 80,203.0.113.0/24 . 443-444 }' "populate inline priority ip-port set" +assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tTachyonTable\ttachyon_rule_inline_ip6_ports\t{ 2001:db8::1 . 80,2001:db8::1 . 443-444 }' "populate inline priority ip6-port set" +assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tTachyonTable\ttachyon_rule_inline_no_ports_subnets\t{ 198.51.100.200 }' "populate inline ip without ports" +assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tTachyonTable\ttachyon_rule_inline_no_ports_subnets6\t{ 2001:db8::200 }' "populate inline ip6 without ports" +assert_contains "$NFT_LOG" $'nft\tadd\telement\tinet\tTachyonTable\ttachyon_rule_ports_only_ports\t{ 53,853,5353 }' "populate ports-only set" +assert_contains "$NFT_LOG" $'nft\tinsert\trule\tinet\tTachyonTable\tmangle\tiifname\t@tachyon_interfaces\tip\tsaddr\t192.168.1.20/32\tmeta\tl4proto\ttcp\tmeta\tmark\tset\t0x00100000\tcounter' "populate fully routed tcp" +assert_contains "$NFT_LOG" $'nft\tinsert\trule\tinet\tTachyonTable\tmangle\tiifname\t@tachyon_interfaces\tip6\tsaddr\t2001:db8::20/128\tmeta\tl4proto\ttcp\tmeta\tmark\tset\t0x00100000\tcounter' "populate fully routed6 tcp" if grep -Fq '192.0.2.1' "$NFT_LOG"; then fail "disabled section should not populate nft" fi if grep -Fq '192.0.2.2' "$NFT_LOG"; then fail "deferred section should not populate nft" fi -if grep -Fq $'nft\tadd\telement\tinet\tForkopTable\tforkop_rule_ports_with_domain_ports\t{ 8443 }' "$NFT_LOG"; then +if grep -Fq $'nft\tadd\telement\tinet\tTachyonTable\ttachyon_rule_ports_with_domain_ports\t{ 8443 }' "$NFT_LOG"; then fail "ports with destination matchers should not populate global port set" fi -if grep -Fq '192.0.2.53' "$NFT_LOG" || grep -Fq '192.168.1.53' "$NFT_LOG" || grep -Fq 'forkop_rule_dns_only' "$NFT_LOG"; then +if grep -Fq '192.0.2.53' "$NFT_LOG" || grep -Fq '192.168.1.53' "$NFT_LOG" || grep -Fq 'tachyon_rule_dns_only' "$NFT_LOG"; then fail "DNS action should not populate nft sets or fully routed rules" fi if [ "$(grep -F $'ip\tsaddr\t192.168.1.20/32' "$NFT_LOG" | wc -l | tr -d ' ')" != "3" ]; then @@ -663,23 +663,23 @@ assert_eq "$expected_signature" \ "nft runtime signature fixture" cat >"$WORK_DIR/signature-uci.state" <<'EOF_UCI' -forkop.settings=settings -forkop.settings.source_network_interfaces=br-lan tun0 -forkop.settings.exclude_ntp=1 -forkop.disabled=section -forkop.disabled.enabled=0 -forkop.disabled.ip_cidr=192.0.2.10 -forkop.enabled=section -forkop.enabled.enabled=1 -forkop.enabled.action=bypass -forkop.enabled.ip_cidr=10.0.0.0/8 192.0.2.1 -forkop.enabled.ports=443 bad-value -forkop.enabled.ports_text=80 443-444 65536 -forkop.enabled.fully_routed_ips=192.168.1.10/32 -forkop.enabled.community_lists=geoblock meta telegram youtube discord -forkop.enabled.remote_subnet_lists=https://example.com/subnets.lst -forkop.enabled.rule_set_with_subnets=/tmp/local.json -forkop.enabled.domain_ip_lists=https://example.com/mixed.lst +tachyon.settings=settings +tachyon.settings.source_network_interfaces=br-lan tun0 +tachyon.settings.exclude_ntp=1 +tachyon.disabled=section +tachyon.disabled.enabled=0 +tachyon.disabled.ip_cidr=192.0.2.10 +tachyon.enabled=section +tachyon.enabled.enabled=1 +tachyon.enabled.action=bypass +tachyon.enabled.ip_cidr=10.0.0.0/8 192.0.2.1 +tachyon.enabled.ports=443 bad-value +tachyon.enabled.ports_text=80 443-444 65536 +tachyon.enabled.fully_routed_ips=192.168.1.10/32 +tachyon.enabled.community_lists=geoblock meta telegram youtube discord +tachyon.enabled.remote_subnet_lists=https://example.com/subnets.lst +tachyon.enabled.rule_set_with_subnets=/tmp/local.json +tachyon.enabled.domain_ip_lists=https://example.com/mixed.lst EOF_UCI cat >"$WORK_DIR/signature-uci-expected.txt" <<'EOF_EXPECTED' [settings.source_network_interfaces] @@ -707,7 +707,7 @@ https://example.com/mixed.lst EOF_EXPECTED expected_signature="$(md5sum "$WORK_DIR/signature-uci-expected.txt" | awk '{print $1}')" assert_eq "$expected_signature" \ - "$(FORKOP_UCI_STATE_FILE="$WORK_DIR/signature-uci.state" nft_ucode nft-runtime-signature)" \ + "$(TACHYON_UCI_STATE_FILE="$WORK_DIR/signature-uci.state" nft_ucode nft-runtime-signature)" \ "nft runtime signature from UCI state" cat >"$WORK_DIR/signature-defaults-fixture.json" <<'JSON' @@ -725,12 +725,12 @@ assert_eq "$expected_signature" \ "nft runtime signature defaults" : > "$NFT_LOG" -nft_ucode nft-populate-runtime-sets-fixture "$WORK_DIR/populate-fixture.json" 0 "" ForkopTable forkop_subnets forkop_ports forkop_ip_ports forkop_interfaces localv4 0x00100000 +nft_ucode nft-populate-runtime-sets-fixture "$WORK_DIR/populate-fixture.json" 0 "" TachyonTable tachyon_subnets tachyon_ports tachyon_ip_ports tachyon_interfaces localv4 0x00100000 [ ! -s "$NFT_LOG" ] || fail "disabled nft population should not call nft" : > "$NFT_LOG" NFT_MANGLE_CHAIN_OUTPUT='ip saddr 192.168.1.20 meta l4proto tcp meta mark set 0x00100000 counter' \ - nft_ucode nft-populate-runtime-sets-fixture "$WORK_DIR/populate-fixture.json" 1 "disabled deferred inline inline_no_ports ports_only ports_with_domain dns_only" ForkopTable forkop_subnets forkop_ports forkop_ip_ports forkop_interfaces localv4 0x00100000 + nft_ucode nft-populate-runtime-sets-fixture "$WORK_DIR/populate-fixture.json" 1 "disabled deferred inline inline_no_ports ports_only ports_with_domain dns_only" TachyonTable tachyon_subnets tachyon_ports tachyon_ip_ports tachyon_interfaces localv4 0x00100000 if grep -Fq $'nft\tinsert\trule' "$NFT_LOG"; then fail "existing nft-normalized /32 fully routed source should not insert" fi diff --git a/tests/outbound_tags.sh b/tests/outbound_tags.sh index 2d1a0d29..d52bd4ed 100644 --- a/tests/outbound_tags.sh +++ b/tests/outbound_tags.sh @@ -2,10 +2,10 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -GENERATOR_UC="$FORKOP_LIB/singbox/generator.uc" -PARSER_UC="$FORKOP_LIB/subscription/parser.uc" -VALIDATOR_UC="$FORKOP_LIB/config/validator.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +GENERATOR_UC="$TACHYON_LIB/singbox/generator.uc" +PARSER_UC="$TACHYON_LIB/subscription/parser.uc" +VALIDATOR_UC="$TACHYON_LIB/config/validator.uc" WORK_DIR="$(mktemp -d)" cleanup() { @@ -109,7 +109,7 @@ JSON runtime_config="$WORK_DIR/runtime-config.json" mkdir -p "$runtime_config.section-cache" TMP_SUBSCRIPTION_FOLDER="$WORK_DIR/subscriptions" \ - ucode -L "$FORKOP_LIB" "$GENERATOR_UC" generate-config-fixture \ + ucode -L "$TACHYON_LIB" "$GENERATOR_UC" generate-config-fixture \ "$WORK_DIR/runtime-tags.json" "$runtime_config" "127.0.0.1" "0" ucode -e ' @@ -225,7 +225,7 @@ input.settings.dns_server = ['77.88.8.8']; input.settings.bootstrap_dns_server = ['77.88.8.8']; fs.writeFileSync(process.argv[3], JSON.stringify(input)); JS - if output="$(FORKOP_LIB="$FORKOP_LIB" ucode -L "$FORKOP_LIB" "$VALIDATOR_UC" \ + if output="$(TACHYON_LIB="$TACHYON_LIB" ucode -L "$TACHYON_LIB" "$VALIDATOR_UC" \ validate-runtime-fixture "$normalized" '{}' 2>/dev/null)"; then fail "validator accepted $fixture" fi @@ -259,7 +259,7 @@ cat >"$WORK_DIR/xray-duplicates.json" <<'JSON' ] JSON -ucode -L "$FORKOP_LIB" "$PARSER_UC" normalize-content \ +ucode -L "$TACHYON_LIB" "$PARSER_UC" normalize-content \ "$WORK_DIR/xray-duplicates.json" "$WORK_DIR/xray-normalized.json" ucode -e ' let fs = require("fs"); diff --git a/tests/package_contract.sh b/tests/package_contract.sh index 2048bdb9..f74b9cf5 100644 --- a/tests/package_contract.sh +++ b/tests/package_contract.sh @@ -2,10 +2,10 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_MAKEFILE="$ROOT_DIR/forkop/Makefile" -FORKOP_CONFIG="$ROOT_DIR/forkop/files/etc/config/forkop" +TACHYON_MAKEFILE="$ROOT_DIR/tachyon/Makefile" +TACHYON_CONFIG="$ROOT_DIR/tachyon/files/etc/config/tachyon" BUILD_SCRIPT="$ROOT_DIR/build.sh" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" fail() { printf 'FAIL: %s\n' "$1" >&2 @@ -21,8 +21,8 @@ require_file() { require_make_dep() { local package="$1" - grep -Eq "DEPENDS:=.*(^|[[:space:]])\\+$package([[:space:]]|$)" "$FORKOP_MAKEFILE" || - fail "forkop/Makefile DEPENDS is missing +$package" + grep -Eq "DEPENDS:=.*(^|[[:space:]])\\+$package([[:space:]]|$)" "$TACHYON_MAKEFILE" || + fail "tachyon/Makefile DEPENDS is missing +$package" } require_build_dep() { @@ -41,40 +41,40 @@ require_package_dependency() { require_build_dep "BACKEND_DEPENDS_APK" "$package" } -require_file "$FORKOP_MAKEFILE" -require_file "$FORKOP_CONFIG" +require_file "$TACHYON_MAKEFILE" +require_file "$TACHYON_CONFIG" require_file "$BUILD_SCRIPT" -require_file "$FORKOP_LIB" +require_file "$TACHYON_LIB" -grep -Fq "must use x.y.z format" "$FORKOP_MAKEFILE" || - fail "forkop/Makefile must enforce the three-part release version contract" +grep -Fq "must use x.y.z format" "$TACHYON_MAKEFILE" || + fail "tachyon/Makefile must enforce the three-part release version contract" grep -Fq 'APK_INTERNAL_VERSION="$RELEASE_VERSION"' "$BUILD_SCRIPT" || fail "build.sh must use the exact three-part release version for APK metadata" -grep -Fq "option component_update_check_enabled '1'" "$FORKOP_CONFIG" || +grep -Fq "option component_update_check_enabled '1'" "$TACHYON_CONFIG" || fail "new installations must enable component update checks by default" -grep -Fq "option config_version '1.0.2'" "$FORKOP_CONFIG" || +grep -Fq "option config_version '1.0.2'" "$TACHYON_CONFIG" || fail "new installations must start at the current configuration schema version" -grep -Fq "list applied_migrations 'interface_sections'" "$FORKOP_CONFIG" || +grep -Fq "list applied_migrations 'interface_sections'" "$TACHYON_CONFIG" || fail "new installations must mark the interface section migration as applied" -grep -Fq "list applied_migrations 'enable_component_checks'" "$FORKOP_CONFIG" || +grep -Fq "list applied_migrations 'enable_component_checks'" "$TACHYON_CONFIG" || fail "new installations must mark the component check migration as applied" -grep -Fq '/usr/lib/forkop/config/migration.uc migrate' "$FORKOP_MAKEFILE" || +grep -Fq '/usr/lib/tachyon/config/migration.uc migrate' "$TACHYON_MAKEFILE" || fail "OpenWrt package postinst must run configuration migrations" -[ "$(grep -Fc '/usr/lib/forkop/config/migration.uc migrate' "$BUILD_SCRIPT")" -ge 3 ] || +[ "$(grep -Fc '/usr/lib/tachyon/config/migration.uc migrate' "$BUILD_SCRIPT")" -ge 3 ] || fail "manual IPK/APK package scripts must run configuration migrations after install and upgrade" -if grep -Rqs 'require("uci")' "$FORKOP_LIB"; then +if grep -Rqs 'require("uci")' "$TACHYON_LIB"; then require_package_dependency "ucode-mod-uci" fi -if grep -Rqs 'require("fs")' "$FORKOP_LIB"; then +if grep -Rqs 'require("fs")' "$TACHYON_LIB"; then require_package_dependency "ucode-mod-fs" fi -if grep -Rqs 'forkop_dnsmasq_failsafe_restore_raw' \ - "$ROOT_DIR/forkop/files/usr/bin" \ - "$ROOT_DIR/forkop/files/usr/lib" \ - "$ROOT_DIR/forkop/files/etc/init.d"; then +if grep -Rqs 'tachyon_dnsmasq_failsafe_restore_raw' \ + "$ROOT_DIR/tachyon/files/usr/bin" \ + "$ROOT_DIR/tachyon/files/usr/lib" \ + "$ROOT_DIR/tachyon/files/etc/init.d"; then fail "duplicated raw dnsmasq failsafe restore shell owner is present" fi diff --git a/tests/package_lifecycle.sh b/tests/package_lifecycle.sh index 5fa93bfa..e46642da 100644 --- a/tests/package_lifecycle.sh +++ b/tests/package_lifecycle.sh @@ -2,11 +2,11 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_BIN="$ROOT_DIR/forkop/files/usr/bin/forkop" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -PACKAGE_UC="$FORKOP_LIB/service/package.uc" -FORKOP_MAKEFILE="$ROOT_DIR/forkop/Makefile" -LUCI_UCI_DEFAULTS="$ROOT_DIR/luci-app-forkop/root/etc/uci-defaults/50_luci-forkop" +TACHYON_BIN="$ROOT_DIR/tachyon/files/usr/bin/tachyon" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +PACKAGE_UC="$TACHYON_LIB/service/package.uc" +TACHYON_MAKEFILE="$ROOT_DIR/tachyon/Makefile" +LUCI_UCI_DEFAULTS="$ROOT_DIR/luci-app-tachyon/root/etc/uci-defaults/50_luci-tachyon" BUILD_SCRIPT="$ROOT_DIR/build.sh" WORK_DIR="$(mktemp -d)" @@ -27,119 +27,119 @@ if grep -n -E 'require\("uci"\)\.cursor|uci -q|uci", "-q"' "$PACKAGE_UC" >/dev/n fi grep -Fq 'require("core.uci")' "$PACKAGE_UC" || fail "service/package.uc must import core.uci" -grep -Fq 'package_prerm: [ "service/package.uc", "prerm", 0 ]' "$FORKOP_BIN" || - fail "forkop entrypoint must dispatch package prerm cleanup through service/package.uc" -grep -Fq 'luci_postinst: [ "service/package.uc", "luci-postinst", 0 ]' "$FORKOP_BIN" || - fail "forkop entrypoint must dispatch LuCI postinstall cleanup through service/package.uc" +grep -Fq 'package_prerm: [ "service/package.uc", "prerm", 0 ]' "$TACHYON_BIN" || + fail "tachyon entrypoint must dispatch package prerm cleanup through service/package.uc" +grep -Fq 'luci_postinst: [ "service/package.uc", "luci-postinst", 0 ]' "$TACHYON_BIN" || + fail "tachyon entrypoint must dispatch LuCI postinstall cleanup through service/package.uc" grep -Fq '#!/bin/sh' "$LUCI_UCI_DEFAULTS" || fail "LuCI uci-defaults must remain a shell script because OpenWrt default_postinst runs it through shell" -grep -Fq '/usr/bin/forkop luci_postinst' "$LUCI_UCI_DEFAULTS" || +grep -Fq '/usr/bin/tachyon luci_postinst' "$LUCI_UCI_DEFAULTS" || fail "LuCI uci-defaults must delegate cache/rpcd handling to ucode" -if grep -E 'rm -f /var/luci-indexcache|rm -f /tmp/luci-indexcache|logger -t "forkop"' "$LUCI_UCI_DEFAULTS" >/dev/null; then +if grep -E 'rm -f /var/luci-indexcache|rm -f /tmp/luci-indexcache|logger -t "tachyon"' "$LUCI_UCI_DEFAULTS" >/dev/null; then fail "LuCI uci-defaults must not own cache/logger shell logic" fi -if grep -n -E 'grep -q "105 forkop"|sed -i "/105 forkop|forkop_dont_touch_dhcp=.*uci|cp /etc/config/forkop|rm -f /tmp/luci-indexcache|killall -HUP rpcd' "$FORKOP_MAKEFILE" "$BUILD_SCRIPT" >/dev/null; then +if grep -n -E 'grep -q "105 tachyon"|sed -i "/105 tachyon|tachyon_dont_touch_dhcp=.*uci|cp /etc/config/tachyon|rm -f /tmp/luci-indexcache|killall -HUP rpcd' "$TACHYON_MAKEFILE" "$BUILD_SCRIPT" >/dev/null; then fail "package scripts must not keep backend/LuCI lifecycle business logic in shell" fi -grep -Fq '#!/usr/bin/ucode' "$FORKOP_MAKEFILE" || - fail "forkop Makefile package hooks must use ucode entrypoints" -grep -Fq '/usr/bin/forkop package_prerm' "$FORKOP_MAKEFILE" || - fail "forkop Makefile prerm must delegate cleanup to package_prerm" -grep -Fq '/usr/bin/forkop luci_postinst' "$BUILD_SCRIPT" || +grep -Fq '#!/usr/bin/ucode' "$TACHYON_MAKEFILE" || + fail "tachyon Makefile package hooks must use ucode entrypoints" +grep -Fq '/usr/bin/tachyon package_prerm' "$TACHYON_MAKEFILE" || + fail "tachyon Makefile prerm must delegate cleanup to package_prerm" +grep -Fq '/usr/bin/tachyon luci_postinst' "$BUILD_SCRIPT" || fail "manual package builder must delegate LuCI cache/rpcd handling to luci_postinst" -if grep -n -E 'Package/forkop/preinst|copy_legacy_config|FORKOP_LEGACY_CONFIG|mode == "preinst"' \ - "$FORKOP_MAKEFILE" "$BUILD_SCRIPT" "$PACKAGE_UC" >/dev/null 2>&1; then +if grep -n -E 'Package/tachyon/preinst|copy_legacy_config|TACHYON_LEGACY_CONFIG|mode == "preinst"' \ + "$TACHYON_MAKEFILE" "$BUILD_SCRIPT" "$PACKAGE_UC" >/dev/null 2>&1; then fail "package hooks and runtime service must not own configuration migration" fi rt_tables="$WORK_DIR/rt_tables" cat >"$rt_tables" <<'EOF' 100 main -105 forkop +105 tachyon 200 custom EOF -FORKOP_PACKAGE_TEST_MODE=1 FORKOP_RT_TABLES="$rt_tables" \ - ucode -L "$FORKOP_LIB" "$PACKAGE_UC" prerm -if grep -Fq '105 forkop' "$rt_tables"; then - fail "package prerm must remove the Forkop routing table entry" +TACHYON_PACKAGE_TEST_MODE=1 TACHYON_RT_TABLES="$rt_tables" \ + ucode -L "$TACHYON_LIB" "$PACKAGE_UC" prerm +if grep -Fq '105 tachyon' "$rt_tables"; then + fail "package prerm must remove the Tachyon routing table entry" fi grep -Fq '200 custom' "$rt_tables" || fail "package prerm must preserve unrelated rt_tables entries" -cat >"$WORK_DIR/forkop-init" <<'SH' +cat >"$WORK_DIR/tachyon-init" <<'SH' #!/usr/bin/env bash -grep -Fq '105 forkop' "${FORKOP_RT_TABLES:?}" || exit 1 -printf '%s\n' 'stop-with-route-table' >>"${FORKOP_STOP_LOG:?}" +grep -Fq '105 tachyon' "${TACHYON_RT_TABLES:?}" || exit 1 +printf '%s\n' 'stop-with-route-table' >>"${TACHYON_STOP_LOG:?}" SH -chmod 0755 "$WORK_DIR/forkop-init" +chmod 0755 "$WORK_DIR/tachyon-init" cat >"$WORK_DIR/stop-order.state" <<'EOF_UCI' -forkop.settings=settings -forkop.settings.dont_touch_dhcp=1 +tachyon.settings=settings +tachyon.settings.dont_touch_dhcp=1 EOF_UCI -printf '105 forkop\n' >"$WORK_DIR/rt_tables_stop_order" +printf '105 tachyon\n' >"$WORK_DIR/rt_tables_stop_order" : >"$WORK_DIR/stop-order.log" -FORKOP_UCI_STATE_FILE="$WORK_DIR/stop-order.state" \ -FORKOP_INIT="$WORK_DIR/forkop-init" \ -FORKOP_STOP_LOG="$WORK_DIR/stop-order.log" \ -FORKOP_BIN="$WORK_DIR/missing-forkop-bin" \ -FORKOP_DNS_APPLY_UC="$WORK_DIR/missing-dns-apply.uc" \ -FORKOP_SING_BOX_INIT="$WORK_DIR/missing-sing-box-init" \ -FORKOP_SING_BOX_BIN="$WORK_DIR/missing-sing-box-bin" \ -FORKOP_SING_BOX_CRONET="$WORK_DIR/missing-cronet" \ -FORKOP_RT_TABLES="$WORK_DIR/rt_tables_stop_order" \ - ucode -L "$FORKOP_LIB" "$PACKAGE_UC" prerm +TACHYON_UCI_STATE_FILE="$WORK_DIR/stop-order.state" \ +TACHYON_INIT="$WORK_DIR/tachyon-init" \ +TACHYON_STOP_LOG="$WORK_DIR/stop-order.log" \ +TACHYON_BIN="$WORK_DIR/missing-tachyon-bin" \ +TACHYON_DNS_APPLY_UC="$WORK_DIR/missing-dns-apply.uc" \ +TACHYON_SING_BOX_INIT="$WORK_DIR/missing-sing-box-init" \ +TACHYON_SING_BOX_BIN="$WORK_DIR/missing-sing-box-bin" \ +TACHYON_SING_BOX_CRONET="$WORK_DIR/missing-cronet" \ +TACHYON_RT_TABLES="$WORK_DIR/rt_tables_stop_order" \ + ucode -L "$TACHYON_LIB" "$PACKAGE_UC" prerm grep -Fxq 'stop-with-route-table' "$WORK_DIR/stop-order.log" || - fail "package prerm must stop Forkop before removing its routing table name" + fail "package prerm must stop Tachyon before removing its routing table name" [ ! -s "$WORK_DIR/rt_tables_stop_order" ] || - fail "package prerm must remove the routing table name after Forkop stops" + fail "package prerm must remove the routing table name after Tachyon stops" touch "$WORK_DIR/luci-indexcache.one" "$WORK_DIR/luci-indexcache.two" -FORKOP_PACKAGE_TEST_MODE=1 FORKOP_LUCI_CACHE_GLOBS="$WORK_DIR/luci-indexcache*" \ - ucode -L "$FORKOP_LIB" "$PACKAGE_UC" luci-postinst +TACHYON_PACKAGE_TEST_MODE=1 TACHYON_LUCI_CACHE_GLOBS="$WORK_DIR/luci-indexcache*" \ + ucode -L "$TACHYON_LIB" "$PACKAGE_UC" luci-postinst if compgen -G "$WORK_DIR/luci-indexcache*" >/dev/null; then fail "luci-postinst must remove LuCI index cache files" fi -cat >"$WORK_DIR/forkop-bin" <<'SH' +cat >"$WORK_DIR/tachyon-bin" <<'SH' #!/usr/bin/env bash -printf '%s\n' "$*" >> "${FORKOP_RESTORE_LOG:?}" +printf '%s\n' "$*" >> "${TACHYON_RESTORE_LOG:?}" SH -chmod 0755 "$WORK_DIR/forkop-bin" +chmod 0755 "$WORK_DIR/tachyon-bin" cat >"$WORK_DIR/dont-touch.state" <<'EOF_UCI' -forkop.settings=settings -forkop.settings.dont_touch_dhcp=1 +tachyon.settings=settings +tachyon.settings.dont_touch_dhcp=1 EOF_UCI -printf '105 forkop\n' >"$WORK_DIR/rt_tables_dont_touch" +printf '105 tachyon\n' >"$WORK_DIR/rt_tables_dont_touch" : >"$WORK_DIR/restore-dont-touch.log" -FORKOP_UCI_STATE_FILE="$WORK_DIR/dont-touch.state" \ -FORKOP_RESTORE_LOG="$WORK_DIR/restore-dont-touch.log" \ -FORKOP_BIN="$WORK_DIR/forkop-bin" \ -FORKOP_DNS_APPLY_UC="$WORK_DIR/missing-dns-apply.uc" \ -FORKOP_SING_BOX_INIT="$WORK_DIR/missing-sing-box-init" \ -FORKOP_SING_BOX_BIN="$WORK_DIR/missing-sing-box-bin" \ -FORKOP_SING_BOX_CRONET="$WORK_DIR/missing-cronet" \ -FORKOP_RT_TABLES="$WORK_DIR/rt_tables_dont_touch" \ - ucode -L "$FORKOP_LIB" "$PACKAGE_UC" prerm +TACHYON_UCI_STATE_FILE="$WORK_DIR/dont-touch.state" \ +TACHYON_RESTORE_LOG="$WORK_DIR/restore-dont-touch.log" \ +TACHYON_BIN="$WORK_DIR/tachyon-bin" \ +TACHYON_DNS_APPLY_UC="$WORK_DIR/missing-dns-apply.uc" \ +TACHYON_SING_BOX_INIT="$WORK_DIR/missing-sing-box-init" \ +TACHYON_SING_BOX_BIN="$WORK_DIR/missing-sing-box-bin" \ +TACHYON_SING_BOX_CRONET="$WORK_DIR/missing-cronet" \ +TACHYON_RT_TABLES="$WORK_DIR/rt_tables_dont_touch" \ + ucode -L "$TACHYON_LIB" "$PACKAGE_UC" prerm [ ! -s "$WORK_DIR/restore-dont-touch.log" ] || fail "package prerm must skip dnsmasq restore when dont_touch_dhcp is enabled" cat >"$WORK_DIR/restore.state" <<'EOF_UCI' -forkop.settings=settings -forkop.settings.dont_touch_dhcp=0 +tachyon.settings=settings +tachyon.settings.dont_touch_dhcp=0 EOF_UCI -printf '105 forkop\n' >"$WORK_DIR/rt_tables_restore" +printf '105 tachyon\n' >"$WORK_DIR/rt_tables_restore" : >"$WORK_DIR/restore.log" -FORKOP_UCI_STATE_FILE="$WORK_DIR/restore.state" \ -FORKOP_RESTORE_LOG="$WORK_DIR/restore.log" \ -FORKOP_BIN="$WORK_DIR/forkop-bin" \ -FORKOP_DNS_APPLY_UC="$WORK_DIR/missing-dns-apply.uc" \ -FORKOP_SING_BOX_INIT="$WORK_DIR/missing-sing-box-init" \ -FORKOP_SING_BOX_BIN="$WORK_DIR/missing-sing-box-bin" \ -FORKOP_SING_BOX_CRONET="$WORK_DIR/missing-cronet" \ -FORKOP_RT_TABLES="$WORK_DIR/rt_tables_restore" \ - ucode -L "$FORKOP_LIB" "$PACKAGE_UC" prerm +TACHYON_UCI_STATE_FILE="$WORK_DIR/restore.state" \ +TACHYON_RESTORE_LOG="$WORK_DIR/restore.log" \ +TACHYON_BIN="$WORK_DIR/tachyon-bin" \ +TACHYON_DNS_APPLY_UC="$WORK_DIR/missing-dns-apply.uc" \ +TACHYON_SING_BOX_INIT="$WORK_DIR/missing-sing-box-init" \ +TACHYON_SING_BOX_BIN="$WORK_DIR/missing-sing-box-bin" \ +TACHYON_SING_BOX_CRONET="$WORK_DIR/missing-cronet" \ +TACHYON_RT_TABLES="$WORK_DIR/rt_tables_restore" \ + ucode -L "$TACHYON_LIB" "$PACKAGE_UC" prerm grep -Fxq 'restore_dnsmasq' "$WORK_DIR/restore.log" || fail "package prerm must restore dnsmasq when dont_touch_dhcp is disabled" diff --git a/tests/package_versions.sh b/tests/package_versions.sh index 36f963d1..5cfb4b98 100755 --- a/tests/package_versions.sh +++ b/tests/package_versions.sh @@ -2,7 +2,7 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" -PACKAGES_UC="${PACKAGES_UC:-$ROOT_DIR/forkop/files/usr/lib/core/packages.uc}" +PACKAGES_UC="${PACKAGES_UC:-$ROOT_DIR/tachyon/files/usr/lib/core/packages.uc}" WORK_DIR="$(mktemp -d)" cleanup() { diff --git a/tests/priority_failover.sh b/tests/priority_failover.sh index 10b2409c..9c1095a1 100644 --- a/tests/priority_failover.sh +++ b/tests/priority_failover.sh @@ -2,10 +2,10 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -GENERATOR_UC="$FORKOP_LIB/singbox/generator.uc" -VALIDATOR_UC="$FORKOP_LIB/config/validator.uc" -PRIORITY_UC="$FORKOP_LIB/singbox/priority.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +GENERATOR_UC="$TACHYON_LIB/singbox/generator.uc" +VALIDATOR_UC="$TACHYON_LIB/config/validator.uc" +PRIORITY_UC="$TACHYON_LIB/singbox/priority.uc" WORK_DIR="$(mktemp -d)" cleanup() { @@ -23,7 +23,7 @@ generate_config() { local output="$2" mkdir -p "${output}.section-cache" - ucode -L "$FORKOP_LIB" "$GENERATOR_UC" generate-config-fixture \ + ucode -L "$TACHYON_LIB" "$GENERATOR_UC" generate-config-fixture \ "$fixture" "$output" "127.0.0.1" } @@ -38,7 +38,7 @@ input.settings.dns_server ??= ['77.88.8.8']; input.settings.bootstrap_dns_server ??= ['77.88.8.8']; fs.writeFileSync(process.argv[3], JSON.stringify(input)); JS - FORKOP_LIB="$FORKOP_LIB" ucode -L "$FORKOP_LIB" "$VALIDATOR_UC" \ + TACHYON_LIB="$TACHYON_LIB" ucode -L "$TACHYON_LIB" "$VALIDATOR_UC" \ validate-runtime-fixture "$normalized" "{}" } @@ -366,7 +366,7 @@ JSON cat >"$WORK_DIR/select-first-live-latency.json" <<'JSON' { "a": -1, "b": 200, "c": 50 } JSON -first_live="$(ucode -L "$FORKOP_LIB" "$PRIORITY_UC" select-fixture \ +first_live="$(ucode -L "$TACHYON_LIB" "$PRIORITY_UC" select-fixture \ "$WORK_DIR/select-first-live-group.json" "$WORK_DIR/select-first-live-latency.json" 0 1)" printf '%s\n' "$first_live" | grep -Fq '"tag": "b"' || fail "priority selection should choose the first live outbound when pick_fastest=0" @@ -383,7 +383,7 @@ JSON cat >"$WORK_DIR/select-fastest-latency.json" <<'JSON' { "a": 80, "b": 20, "c": 50 } JSON -fastest="$(ucode -L "$FORKOP_LIB" "$PRIORITY_UC" select-fixture \ +fastest="$(ucode -L "$TACHYON_LIB" "$PRIORITY_UC" select-fixture \ "$WORK_DIR/select-fastest-group.json" "$WORK_DIR/select-fastest-latency.json" 0 0)" printf '%s\n' "$fastest" | grep -Fq '"tag": "b"' || fail "priority selection should choose the fastest live outbound when pick_fastest=1" @@ -652,7 +652,7 @@ cat >"$WORK_DIR/bad-filter-mode.json" <<'JSON' JSON assert_rejects "priority level bad filter mode" "$WORK_DIR/bad-filter-mode.json" "Invalid Priority filter mode" -skip_dead="$(ucode -L "$FORKOP_LIB" "$PRIORITY_UC" select-fixture \ +skip_dead="$(ucode -L "$TACHYON_LIB" "$PRIORITY_UC" select-fixture \ "$WORK_DIR/select-first-live-group.json" "$WORK_DIR/select-fastest-latency.json" 0 1 a)" printf '%s\n' "$skip_dead" | grep -Fq '"tag": "b"' || fail "replacement selection should skip the just-failed active outbound" @@ -660,7 +660,7 @@ printf '%s\n' "$skip_dead" | grep -Fq '"tag": "b"' || cat >"$WORK_DIR/select-faster-current-latency.json" <<'JSON' { "a": 100, "b": 50, "c": 80 } JSON -same_level="$(ucode -L "$FORKOP_LIB" "$PRIORITY_UC" select-faster-fixture \ +same_level="$(ucode -L "$TACHYON_LIB" "$PRIORITY_UC" select-faster-fixture \ "$WORK_DIR/select-fastest-group.json" "$WORK_DIR/select-faster-current-latency.json" 0 a)" printf '%s\n' "$same_level" | grep -Fq '"tag": "b"' || fail "same-level switching should compare candidates with the active delay from the same pass" diff --git a/tests/provider_rules.sh b/tests/provider_rules.sh index 085eefc7..1e6bbec1 100644 --- a/tests/provider_rules.sh +++ b/tests/provider_rules.sh @@ -2,8 +2,8 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -RULES_UC="$ROOT_DIR/forkop/files/usr/lib/providers/rules.uc" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" +RULES_UC="$ROOT_DIR/tachyon/files/usr/lib/providers/rules.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" fail() { printf 'FAIL: %s\n' "$1" >&2 @@ -28,7 +28,7 @@ rows() { } rules_ucode() { - ucode -L "$FORKOP_LIB" "$RULES_UC" "$@" + ucode -L "$TACHYON_LIB" "$RULES_UC" "$@" } if grep -n -E 'require\("uci"\)\.cursor|cursor\.foreach' "$RULES_UC" >/dev/null 2>&1; then diff --git a/tests/proxy_parameter_filters.sh b/tests/proxy_parameter_filters.sh index 8086a8cd..d6b53c95 100755 --- a/tests/proxy_parameter_filters.sh +++ b/tests/proxy_parameter_filters.sh @@ -2,9 +2,9 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -GENERATOR_UC="$FORKOP_LIB/singbox/generator.uc" -VALIDATOR_UC="$FORKOP_LIB/config/validator.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +GENERATOR_UC="$TACHYON_LIB/singbox/generator.uc" +VALIDATOR_UC="$TACHYON_LIB/config/validator.uc" WORK_DIR="$(mktemp -d)" cleanup() { @@ -21,13 +21,13 @@ generate_config() { local fixture="$1" local output="$2" mkdir -p "${output}.section-cache" - ucode -L "$FORKOP_LIB" "$GENERATOR_UC" generate-config-fixture \ + ucode -L "$TACHYON_LIB" "$GENERATOR_UC" generate-config-fixture \ "$fixture" "$output" "127.0.0.1" } validate_fixture() { local fixture="$1" - FORKOP_LIB="$FORKOP_LIB" ucode -L "$FORKOP_LIB" "$VALIDATOR_UC" \ + TACHYON_LIB="$TACHYON_LIB" ucode -L "$TACHYON_LIB" "$VALIDATOR_UC" \ validate-runtime-fixture "$fixture" "{}" } diff --git a/tests/runtime_state_owner.sh b/tests/runtime_state_owner.sh index 5c6960d9..02d49953 100644 --- a/tests/runtime_state_owner.sh +++ b/tests/runtime_state_owner.sh @@ -2,15 +2,15 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_BIN="$ROOT_DIR/forkop/files/usr/bin/forkop" -FORKOP_INIT="$ROOT_DIR/forkop/files/etc/init.d/forkop" -CLI_UC="$FORKOP_BIN" -RUNTIME_STATE="$ROOT_DIR/forkop/files/usr/lib/runtime_state.sh" -UPDATES_RUNTIME="$ROOT_DIR/forkop/files/usr/lib/updates_runtime.sh" -LIFECYCLE_UC="$ROOT_DIR/forkop/files/usr/lib/service/lifecycle.uc" -UPDATES_UC="$ROOT_DIR/forkop/files/usr/lib/components/updates.uc" -STATE_UC="$ROOT_DIR/forkop/files/usr/lib/service/state.uc" -NFT_UC="$ROOT_DIR/forkop/files/usr/lib/nft/apply.uc" +TACHYON_BIN="$ROOT_DIR/tachyon/files/usr/bin/tachyon" +TACHYON_INIT="$ROOT_DIR/tachyon/files/etc/init.d/tachyon" +CLI_UC="$TACHYON_BIN" +RUNTIME_STATE="$ROOT_DIR/tachyon/files/usr/lib/runtime_state.sh" +UPDATES_RUNTIME="$ROOT_DIR/tachyon/files/usr/lib/updates_runtime.sh" +LIFECYCLE_UC="$ROOT_DIR/tachyon/files/usr/lib/service/lifecycle.uc" +UPDATES_UC="$ROOT_DIR/tachyon/files/usr/lib/components/updates.uc" +STATE_UC="$ROOT_DIR/tachyon/files/usr/lib/service/state.uc" +NFT_UC="$ROOT_DIR/tachyon/files/usr/lib/nft/apply.uc" fail() { printf 'FAIL: %s\n' "$1" >&2 @@ -22,30 +22,30 @@ fail() { [ ! -e "$UPDATES_RUNTIME" ] || fail "updates_runtime.sh shell owner must be removed" -grep -Fq 'runtime_state.sh' "$FORKOP_BIN" && - fail "forkop must not source runtime_state.sh" +grep -Fq 'runtime_state.sh' "$TACHYON_BIN" && + fail "tachyon must not source runtime_state.sh" -service_predicates='process_age_seconds|sing_box_service_pid|pid_is_sing_box|sing_box_service_is_running|sing_box_service_is_stable|forkop_runtime_network_is_configured|forkop_is_running|forkop_is_stably_running|wait_for_forkop_stable_start' -if grep -R -n -E "$service_predicates" "$FORKOP_BIN" "$ROOT_DIR/forkop/files/usr/lib" --include='*.sh' >/dev/null 2>&1; then +service_predicates='process_age_seconds|sing_box_service_pid|pid_is_sing_box|sing_box_service_is_running|sing_box_service_is_stable|tachyon_runtime_network_is_configured|tachyon_is_running|tachyon_is_stably_running|wait_for_tachyon_stable_start' +if grep -R -n -E "$service_predicates" "$TACHYON_BIN" "$ROOT_DIR/tachyon/files/usr/lib" --include='*.sh' >/dev/null 2>&1; then fail "service running/stability predicates must not remain in shell" fi pending_state='mark_pending_reload|consume_pending_reload|run_pending_reload_if_requested|sync_time_if_needed' -if grep -R -n -E "$pending_state" "$FORKOP_BIN" "$FORKOP_INIT" "$ROOT_DIR/forkop/files/usr/lib" --include='*.sh' >/dev/null 2>&1; then +if grep -R -n -E "$pending_state" "$TACHYON_BIN" "$TACHYON_INIT" "$ROOT_DIR/tachyon/files/usr/lib" --include='*.sh' >/dev/null 2>&1; then fail "pending reload/time-sync ownership must not remain in shell" fi -runtime_state_shell_symbols='runtime_state_ucode|acquire_runtime_dir_lock|release_runtime_dir_lock|capture_reload_state|write_reload_state_file|write_reload_state|clear_reload_state|populate_nft_runtime_sets|rebuild_nft_runtime|reload_sing_box_runtime|apply_pending_urltest_selector_switches|close_inherited_service_lock_fd|FORKOP_URLTEST_SELECTOR_SWITCHES' -if grep -R -n -E "$runtime_state_shell_symbols" "$FORKOP_BIN" "$FORKOP_INIT" "$ROOT_DIR/forkop/files/usr/lib" --include='*.sh' >/dev/null 2>&1; then +runtime_state_shell_symbols='runtime_state_ucode|acquire_runtime_dir_lock|release_runtime_dir_lock|capture_reload_state|write_reload_state_file|write_reload_state|clear_reload_state|populate_nft_runtime_sets|rebuild_nft_runtime|reload_sing_box_runtime|apply_pending_urltest_selector_switches|close_inherited_service_lock_fd|TACHYON_URLTEST_SELECTOR_SWITCHES' +if grep -R -n -E "$runtime_state_shell_symbols" "$TACHYON_BIN" "$TACHYON_INIT" "$ROOT_DIR/tachyon/files/usr/lib" --include='*.sh' >/dev/null 2>&1; then fail "runtime_state.sh symbols must not remain in shell" fi -if grep -Fq 'acquire_reload_lock' "$FORKOP_INIT" || grep -Fq 'release_reload_lock' "$FORKOP_INIT"; then +if grep -Fq 'acquire_reload_lock' "$TACHYON_INIT" || grep -Fq 'release_reload_lock' "$TACHYON_INIT"; then fail "init.d must not own reload lock decisions" fi -grep -Fq '#!/usr/bin/ucode' "$FORKOP_BIN" || - fail "forkop entrypoint must be a direct ucode executable" +grep -Fq '#!/usr/bin/ucode' "$TACHYON_BIN" || + fail "tachyon entrypoint must be a direct ucode executable" grep -Fq 'service/lifecycle.uc' "$CLI_UC" || fail "service/cli.uc must dispatch lifecycle orchestration through service/lifecycle.uc" grep -Fq 'refresh-cron-from-uci' "$LIFECYCLE_UC" || @@ -56,7 +56,7 @@ grep -Fq '"list-update"' "$LIFECYCLE_UC" || fail "service/lifecycle.uc start/reload must run list updates through components/updates.uc" grep -Fq 'subscription_update: [ "components/updates.uc", "subscription-update", 2 ]' "$CLI_UC" || fail "service/cli.uc must run subscription updates through components/updates.uc" -if grep -R -n -F 'updates_runtime.sh' "$FORKOP_BIN" "$ROOT_DIR/forkop/files/usr/lib" --include='*.sh' >/dev/null 2>&1; then +if grep -R -n -F 'updates_runtime.sh' "$TACHYON_BIN" "$ROOT_DIR/tachyon/files/usr/lib" --include='*.sh' >/dev/null 2>&1; then fail "runtime shell must not reference updates_runtime.sh" fi grep -Fq 'mode == "refresh-cron-from-uci"' "$UPDATES_UC" || @@ -67,11 +67,11 @@ grep -Fq 'mode == "list-update"' "$UPDATES_UC" || fail "components/updates.uc must own list update" grep -Fq 'mode == "subscription-update"' "$UPDATES_UC" || fail "components/updates.uc must own subscription update" -grep -Fq 'mode == "forkop-running"' "$STATE_UC" || - fail "service/state.uc must own Forkop running predicate" +grep -Fq 'mode == "tachyon-running"' "$STATE_UC" || + fail "service/state.uc must own Tachyon running predicate" grep -Fq 'mode == "sing-box-service-stable"' "$STATE_UC" || fail "service/state.uc must expose stable sing-box predicate" -grep -Fq 'mode == "wait-forkop-stable-start"' "$STATE_UC" || +grep -Fq 'mode == "wait-tachyon-stable-start"' "$STATE_UC" || fail "service/state.uc must own stable-start waiting" grep -Fq 'mode == "mark-pending-reload"' "$STATE_UC" || fail "service/state.uc must own pending reload writes" @@ -83,12 +83,12 @@ grep -Fq 'mode == "write-captured-reload-state"' "$STATE_UC" || fail "service/state.uc must own captured reload state writes" grep -Fq 'mode == "reload-sing-box-runtime"' "$STATE_UC" || fail "service/state.uc must own sing-box runtime reload" -grep -Fq '"wait-forkop-stable-start"' "$LIFECYCLE_UC" || +grep -Fq '"wait-tachyon-stable-start"' "$LIFECYCLE_UC" || fail "service/lifecycle.uc must verify stable runtime after sing-box start/reload" grep -Fq 'SING_BOX_START_STABLE_MIN_AGE' "$LIFECYCLE_UC" || fail "service/lifecycle.uc must use a dedicated sing-box start stability window" sing_box_start_line="$(grep -nF 'command_success_from_args([ "/etc/init.d/sing-box", "start" ])' "$LIFECYCLE_UC" | head -n1 | cut -d: -f1)" -early_stable_line="$(awk -v start="$sing_box_start_line" 'NR > start && /"wait-forkop-stable-start"/ { print NR; exit }' "$LIFECYCLE_UC")" +early_stable_line="$(awk -v start="$sing_box_start_line" 'NR > start && /"wait-tachyon-stable-start"/ { print NR; exit }' "$LIFECYCLE_UC")" start_stable_min_age_line="$(awk -v start="$sing_box_start_line" 'NR > start && /SING_BOX_START_STABLE_MIN_AGE/ { print NR; exit }' "$LIFECYCLE_UC")" deferred_bootstrap_line="$(grep -nF '"run-deferred-bootstrap"' "$LIFECYCLE_UC" | head -n1 | cut -d: -f1)" [ -n "$sing_box_start_line" ] || @@ -105,9 +105,9 @@ reload_stable_min_age_line="$(awk -v start="$sing_box_reload_line" 'NR > start & fail "service/lifecycle.uc must reload sing-box through service/state.uc" [ -n "$reload_stable_min_age_line" ] || fail "service/lifecycle.uc must use the dedicated sing-box start stability window after sing-box reload" -grep -Fq 'Reload verification failed after sing-box was reloaded; stopping Forkop runtime' "$LIFECYCLE_UC" || +grep -Fq 'Reload verification failed after sing-box was reloaded; stopping Tachyon runtime' "$LIFECYCLE_UC" || fail "service/lifecycle.uc must fail reload when sing-box does not stay stable" -grep -Fq 'Reload runtime restart verification failed after Forkop was started; rolling back DNS changes' "$LIFECYCLE_UC" || +grep -Fq 'Reload runtime restart verification failed after Tachyon was started; rolling back DNS changes' "$LIFECYCLE_UC" || fail "service/lifecycle.uc must fail full runtime restart when sing-box does not stay stable" if grep -n -E 'require\("uci"\)\.cursor|uci -q|uci", "-q"|uci_get_cli|uci_exists_cli|mwan3_has_enabled_interface_from_uci_show' "$STATE_UC" >/dev/null 2>&1; then fail "service/state.uc must not own direct UCI CLI/cursor access" @@ -115,7 +115,7 @@ fi grep -Fq 'nft-rebuild-runtime-from-uci' "$LIFECYCLE_UC" || fail "service/lifecycle.uc reload must call nft rebuild through ucode" if grep -Fq 'nft-create-full-runtime-from-uci' "$LIFECYCLE_UC"; then - fail "forkop start/reload must rebuild nft runtime instead of appending to stale state" + fail "tachyon start/reload must rebuild nft runtime instead of appending to stale state" fi grep -Fq 'nft-populate-runtime-sets-from-uci' "$LIFECYCLE_UC" || fail "service/lifecycle.uc reload must call nft populate through ucode" diff --git a/tests/runtime_state_predicates.sh b/tests/runtime_state_predicates.sh index a1971eab..bc4c3f41 100644 --- a/tests/runtime_state_predicates.sh +++ b/tests/runtime_state_predicates.sh @@ -2,14 +2,14 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -STATE_UC="$ROOT_DIR/forkop/files/usr/lib/service/state.uc" -NFT_UC="$ROOT_DIR/forkop/files/usr/lib/nft/apply.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +STATE_UC="$ROOT_DIR/tachyon/files/usr/lib/service/state.uc" +NFT_UC="$ROOT_DIR/tachyon/files/usr/lib/nft/apply.uc" WORK_DIR="$(mktemp -d)" export ZAPRET_DEFAULT_NFQWS_OPT="--default-zapret" export ZAPRET2_DEFAULT_NFQWS2_OPT="--default-zapret2" export BYEDPI_DEFAULT_CMD_OPTS="--default-bye" -export FORKOP_FAKE_INIT_CAPTURE="$WORK_DIR/pending-reload-init.args" +export TACHYON_FAKE_INIT_CAPTURE="$WORK_DIR/pending-reload-init.args" cleanup() { rm -rf "$WORK_DIR" @@ -34,11 +34,11 @@ md5_file() { } state_ucode() { - ucode -L "$FORKOP_LIB" "$STATE_UC" "$@" + ucode -L "$TACHYON_LIB" "$STATE_UC" "$@" } nft_ucode() { - ucode -L "$FORKOP_LIB" "$NFT_UC" "$@" + ucode -L "$TACHYON_LIB" "$NFT_UC" "$@" } state_ucode list-has-remote-references "local.lst https://example.com/list.txt" >/dev/null || @@ -143,17 +143,17 @@ fi cat >"$WORK_DIR/fake-init" <<'SH' #!/bin/sh -printf '%s\n' "$1" >"$FORKOP_FAKE_INIT_CAPTURE" +printf '%s\n' "$1" >"$TACHYON_FAKE_INIT_CAPTURE" SH chmod +x "$WORK_DIR/fake-init" state_ucode mark-pending-reload "$PENDING_RELOAD_FILE" "reload_busy" state_ucode run-pending-reload-if-requested "$PENDING_RELOAD_FILE" "$WORK_DIR/fake-init" for _ in $(seq 1 20); do - [ -s "$FORKOP_FAKE_INIT_CAPTURE" ] && break + [ -s "$TACHYON_FAKE_INIT_CAPTURE" ] && break sleep 0.1 done assert_eq "reload" \ - "$(cat "$FORKOP_FAKE_INIT_CAPTURE")" \ + "$(cat "$TACHYON_FAKE_INIT_CAPTURE")" \ "pending reload should invoke init.d reload" [ ! -e "$PENDING_RELOAD_FILE" ] || fail "pending reload should be consumed when worker is started" @@ -220,9 +220,9 @@ cat >"$WORK_DIR/service-dns-state.json" <<'JSON' "server": [ "1.1.1.1#53", "8.8.8.8" ], "noresolv": "1", "cachesize": "0", - "forkop_server": [ "127.0.0.42#53" ], - "forkop_noresolv": "0", - "forkop_cachesize": "1500" + "tachyon_server": [ "127.0.0.42#53" ], + "tachyon_noresolv": "0", + "tachyon_cachesize": "1500" }, "legacy_dnsmasq_present": true } @@ -246,13 +246,13 @@ cat >"$WORK_DIR/dnsmasq-signature.expected" <<'EOF_DNSMASQ_SIG' 1 [dhcp.@dnsmasq[0].cachesize] 0 -[dhcp.@dnsmasq[0].forkop_server] +[dhcp.@dnsmasq[0].tachyon_server] 127.0.0.42#53 -[dhcp.@dnsmasq[0].forkop_noresolv] +[dhcp.@dnsmasq[0].tachyon_noresolv] 0 -[dhcp.@dnsmasq[0].forkop_cachesize] +[dhcp.@dnsmasq[0].tachyon_cachesize] 1500 -[dhcp.forkop.present] +[dhcp.tachyon.present] 1 EOF_DNSMASQ_SIG diff --git a/tests/selector_state.sh b/tests/selector_state.sh index 05806549..0cddd18c 100644 --- a/tests/selector_state.sh +++ b/tests/selector_state.sh @@ -2,8 +2,8 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -LIFECYCLE_UC="$FORKOP_LIB/service/lifecycle.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +LIFECYCLE_UC="$TACHYON_LIB/service/lifecycle.uc" WORK_DIR="$(mktemp -d)" cleanup() { @@ -17,8 +17,8 @@ fail() { } lifecycle_ucode() { - FORKOP_RUNTIME_STATE_DIR="$WORK_DIR/run" \ - ucode -L "$FORKOP_LIB" "$LIFECYCLE_UC" "$@" + TACHYON_RUNTIME_STATE_DIR="$WORK_DIR/run" \ + ucode -L "$TACHYON_LIB" "$LIFECYCLE_UC" "$@" } json_flatten() { diff --git a/tests/semantic_json_compare.sh b/tests/semantic_json_compare.sh index fb693b53..29ed020a 100644 --- a/tests/semantic_json_compare.sh +++ b/tests/semantic_json_compare.sh @@ -62,11 +62,11 @@ cat >"$WORK_DIR/different-array-order.json" <<'JSON' } JSON -if node "$COMPARE" "$WORK_DIR/expected.json" "$WORK_DIR/different-array-order.json" >/tmp/forkop-semantic-json.out 2>&1; then +if node "$COMPARE" "$WORK_DIR/expected.json" "$WORK_DIR/different-array-order.json" >/tmp/tachyon-semantic-json.out 2>&1; then fail "array order mismatch should be rejected" fi -grep -Fq '$.outbounds[0].tag: "first" != "second"' /tmp/forkop-semantic-json.out || +grep -Fq '$.outbounds[0].tag: "first" != "second"' /tmp/tachyon-semantic-json.out || fail "array order mismatch reported unexpected diff" printf 'semantic JSON compare checks passed\n' diff --git a/tests/server_runtime.sh b/tests/server_runtime.sh index b653b10d..3e805f94 100644 --- a/tests/server_runtime.sh +++ b/tests/server_runtime.sh @@ -2,8 +2,8 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -SERVER_RUNTIME="$ROOT_DIR/forkop/files/usr/lib/server/service.uc" -UCODE_LIB="$ROOT_DIR/forkop/files/usr/lib" +SERVER_RUNTIME="$ROOT_DIR/tachyon/files/usr/lib/server/service.uc" +UCODE_LIB="$ROOT_DIR/tachyon/files/usr/lib" WORK_DIR="$(mktemp -d)" STATE="$WORK_DIR/uci.state" LOG="$WORK_DIR/uci.log" @@ -59,39 +59,39 @@ LOGGER chmod 0755 "$WORK_DIR/bin/logger" export PATH="$WORK_DIR/bin:$PATH" -export FORKOP_UCI_STATE_FILE="$STATE" -export FORKOP_UCI_LOG_FILE="$LOG" -export FORKOP_CONFIG_NAME="forkop" -export FORKOP_SERVER_RUNTIME_UC="$SERVER_RUNTIME" +export TACHYON_UCI_STATE_FILE="$STATE" +export TACHYON_UCI_LOG_FILE="$LOG" +export TACHYON_CONFIG_NAME="tachyon" +export TACHYON_SERVER_RUNTIME_UC="$SERVER_RUNTIME" if grep -E 'uci -q|command -v uci' "$SERVER_RUNTIME" >/dev/null; then fail "server/service.uc must use ucode UCI access instead of shelling out to uci" fi if grep -F 'output("ucode "' "$SERVER_RUNTIME" >/dev/null; then - fail "server defaults must not spawn service.uc without the Forkop module path" + fail "server defaults must not spawn service.uc without the Tachyon module path" fi cat >"$STATE" <<'EOF_STATE' -forkop.vless=server -forkop.vless.protocol=vless -forkop.vless.server_users=client|22222222-2222-4222-8222-222222222222|xtls-rprx-vision -forkop.socks=server -forkop.socks.protocol=socks -forkop.socks.label=desk -forkop.socks_open=server -forkop.socks_open.protocol=socks -forkop.socks_open.label=guest -forkop.socks_open.socks_auth_enabled=0 -forkop.tailscale=server -forkop.tailscale.protocol=tailscale -forkop.json=server -forkop.json.protocol=json_inbound -forkop.mtproto=server -forkop.mtproto.protocol=mtproto -forkop.mtproto.mtproto_secret=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -forkop.mtproto_legacy=server -forkop.mtproto_legacy.protocol=mtproto -forkop.mtproto_legacy.server_users=client|eebbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb676f6f676c652e636f6d +tachyon.vless=server +tachyon.vless.protocol=vless +tachyon.vless.server_users=client|22222222-2222-4222-8222-222222222222|xtls-rprx-vision +tachyon.socks=server +tachyon.socks.protocol=socks +tachyon.socks.label=desk +tachyon.socks_open=server +tachyon.socks_open.protocol=socks +tachyon.socks_open.label=guest +tachyon.socks_open.socks_auth_enabled=0 +tachyon.tailscale=server +tachyon.tailscale.protocol=tailscale +tachyon.json=server +tachyon.json.protocol=json_inbound +tachyon.mtproto=server +tachyon.mtproto.protocol=mtproto +tachyon.mtproto.mtproto_secret=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +tachyon.mtproto_legacy=server +tachyon.mtproto_legacy.protocol=mtproto +tachyon.mtproto_legacy.server_users=client|eebbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb676f6f676c652e636f6d EOF_STATE ucode -L "$UCODE_LIB" "$SERVER_RUNTIME" prepare-all-defaults @@ -106,30 +106,30 @@ assert_value() { [ "$actual" = "$expected" ] || fail "$path: expected '$expected', got '$actual'" } -assert_value forkop.vless.security reality -assert_value forkop.vless.listen 0.0.0.0 -assert_value forkop.vless.listen_port 443 -assert_value forkop.vless.server_uuid 22222222-2222-4222-8222-222222222222 -assert_value forkop.vless.vless_flow xtls-rprx-vision -assert_value forkop.vless.reality_short_id abcd1234 -assert_value forkop.vless.reality_private_key private-key -assert_value forkop.vless.reality_public_key public-key -assert_value forkop.socks.security none -assert_value forkop.socks.socks_auth_enabled 1 -assert_value forkop.socks.server_username desk -assert_value forkop.socks.server_password generated-password -assert_value forkop.socks_open.socks_auth_enabled 0 -assert_value forkop.socks_open.server_username guest -assert_value forkop.socks_open.server_password generated-password -assert_value forkop.tailscale.security none -assert_value forkop.tailscale.tailscale_control_url https://controlplane.tailscale.com -assert_value forkop.tailscale.tailscale_hostname forkop-tailscale -assert_value forkop.tailscale.tailscale_advertise_exit_node 1 -assert_value forkop.json.security none -assert_value forkop.mtproto.mtproto_secret aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -assert_value forkop.mtproto_legacy.mtproto_secret bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -assert_value forkop.mtproto_legacy.mtproto_faketls google.com -grep -Fxq 'commit forkop' "$LOG" || fail 'expected config commit' +assert_value tachyon.vless.security reality +assert_value tachyon.vless.listen 0.0.0.0 +assert_value tachyon.vless.listen_port 443 +assert_value tachyon.vless.server_uuid 22222222-2222-4222-8222-222222222222 +assert_value tachyon.vless.vless_flow xtls-rprx-vision +assert_value tachyon.vless.reality_short_id abcd1234 +assert_value tachyon.vless.reality_private_key private-key +assert_value tachyon.vless.reality_public_key public-key +assert_value tachyon.socks.security none +assert_value tachyon.socks.socks_auth_enabled 1 +assert_value tachyon.socks.server_username desk +assert_value tachyon.socks.server_password generated-password +assert_value tachyon.socks_open.socks_auth_enabled 0 +assert_value tachyon.socks_open.server_username guest +assert_value tachyon.socks_open.server_password generated-password +assert_value tachyon.tailscale.security none +assert_value tachyon.tailscale.tailscale_control_url https://controlplane.tailscale.com +assert_value tachyon.tailscale.tailscale_hostname tachyon-tailscale +assert_value tachyon.tailscale.tailscale_advertise_exit_node 1 +assert_value tachyon.json.security none +assert_value tachyon.mtproto.mtproto_secret aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +assert_value tachyon.mtproto_legacy.mtproto_secret bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +assert_value tachyon.mtproto_legacy.mtproto_faketls google.com +grep -Fxq 'commit tachyon' "$LOG" || fail 'expected config commit' : >"$LOG" ucode -L "$UCODE_LIB" "$SERVER_RUNTIME" prepare-all-defaults diff --git a/tests/service_reload_plan.sh b/tests/service_reload_plan.sh index b6e53c86..21f37064 100644 --- a/tests/service_reload_plan.sh +++ b/tests/service_reload_plan.sh @@ -2,7 +2,7 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -RELOAD_UC="$ROOT_DIR/forkop/files/usr/lib/service/reload.uc" +RELOAD_UC="$ROOT_DIR/tachyon/files/usr/lib/service/reload.uc" WORK_DIR="$(mktemp -d)" cleanup() { diff --git a/tests/service_start_trap.sh b/tests/service_start_trap.sh index f4d1265e..4b773650 100644 --- a/tests/service_start_trap.sh +++ b/tests/service_start_trap.sh @@ -2,18 +2,18 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_BIN="$ROOT_DIR/forkop/files/usr/bin/forkop" -FORKOP_INIT="$ROOT_DIR/forkop/files/etc/init.d/forkop" -CLI_UC="$FORKOP_BIN" -LIFECYCLE_UC="$ROOT_DIR/forkop/files/usr/lib/service/lifecycle.uc" -INITD_UC="$ROOT_DIR/forkop/files/usr/lib/service/initd.uc" -STATE_UC="$ROOT_DIR/forkop/files/usr/lib/service/state.uc" -UI_UC="$ROOT_DIR/forkop/files/usr/lib/service/ui.uc" -UPDATES_UC="$ROOT_DIR/forkop/files/usr/lib/components/updates.uc" -SUBSCRIPTION_CACHE_UC="$ROOT_DIR/forkop/files/usr/lib/subscription/cache.uc" -NFQUEUE_RUNTIME_UC="$ROOT_DIR/forkop/files/usr/lib/providers/nfqueue/runtime.uc" -BYEDPI_RUNTIME_UC="$ROOT_DIR/forkop/files/usr/lib/providers/byedpi/runtime.uc" -PRIORITY_UC="$ROOT_DIR/forkop/files/usr/lib/singbox/priority.uc" +TACHYON_BIN="$ROOT_DIR/tachyon/files/usr/bin/tachyon" +TACHYON_INIT="$ROOT_DIR/tachyon/files/etc/init.d/tachyon" +CLI_UC="$TACHYON_BIN" +LIFECYCLE_UC="$ROOT_DIR/tachyon/files/usr/lib/service/lifecycle.uc" +INITD_UC="$ROOT_DIR/tachyon/files/usr/lib/service/initd.uc" +STATE_UC="$ROOT_DIR/tachyon/files/usr/lib/service/state.uc" +UI_UC="$ROOT_DIR/tachyon/files/usr/lib/service/ui.uc" +UPDATES_UC="$ROOT_DIR/tachyon/files/usr/lib/components/updates.uc" +SUBSCRIPTION_CACHE_UC="$ROOT_DIR/tachyon/files/usr/lib/subscription/cache.uc" +NFQUEUE_RUNTIME_UC="$ROOT_DIR/tachyon/files/usr/lib/providers/nfqueue/runtime.uc" +BYEDPI_RUNTIME_UC="$ROOT_DIR/tachyon/files/usr/lib/providers/byedpi/runtime.uc" +PRIORITY_UC="$ROOT_DIR/tachyon/files/usr/lib/singbox/priority.uc" fail() { printf 'FAIL: %s\n' "$1" >&2 @@ -31,7 +31,7 @@ reject_pattern() { local pattern="$1" local label="$2" - ! grep -Fq "$pattern" "$FORKOP_BIN" || fail "$label" + ! grep -Fq "$pattern" "$TACHYON_BIN" || fail "$label" } require_file_pattern() { @@ -42,18 +42,18 @@ require_file_pattern() { grep -Fq "$pattern" "$file" || fail "$label" } -[ -r "$FORKOP_BIN" ] || fail "forkop binary source is missing" -[ -r "$FORKOP_BIN" ] || fail "forkop entrypoint is missing" +[ -r "$TACHYON_BIN" ] || fail "tachyon binary source is missing" +[ -r "$TACHYON_BIN" ] || fail "tachyon entrypoint is missing" [ -r "$LIFECYCLE_UC" ] || fail "service/lifecycle.uc is missing" -grep -Fq '#!/usr/bin/ucode' "$FORKOP_BIN" || - fail "forkop entrypoint must be a direct ucode executable" +grep -Fq '#!/usr/bin/ucode' "$TACHYON_BIN" || + fail "tachyon entrypoint must be a direct ucode executable" grep -Fq 'service/lifecycle.uc' "$CLI_UC" || fail "service/cli.uc must dispatch startup through service/lifecycle.uc" reject_pattern "trap " \ - "forkop shell entrypoint must not own startup fail-safe traps" + "tachyon shell entrypoint must not own startup fail-safe traps" reject_pattern "clear_startup_failsafe_trap" \ - "forkop shell entrypoint must not keep old trap helper" + "tachyon shell entrypoint must not keep old trap helper" require_pattern 'module_background(UPDATES_UC, [ "list-update" ])' \ "startup list_update background job must be owned by service/lifecycle.uc" require_pattern 'module_background(DIAGNOSTICS_UC, [ "get-system-info" ])' \ @@ -91,9 +91,9 @@ require_file_pattern "$INITD_UC" 'reload pending >/dev/null 2>&1 1000>&- &' \ "service/initd.uc pending reload worker must close inherited procd lock fd" require_file_pattern "$STATE_UC" 'reload pending >/dev/null 2>&1 1000>&- &' \ "service/state.uc pending reload worker must close inherited procd lock fd" -require_file_pattern "$FORKOP_INIT" 'FORKOP_LAST_START_STATUS="$?"' \ +require_file_pattern "$TACHYON_INIT" 'TACHYON_LAST_START_STATUS="$?"' \ "init.d start_service must preserve backend start status for rc.common" -require_file_pattern "$FORKOP_INIT" 'service_started()' \ +require_file_pattern "$TACHYON_INIT" 'service_started()' \ "init.d must return preserved start status through rc.common service_started hook" require_file_pattern "$UI_UC" '>/dev/null 2>&1 1000>&- & echo $!' \ "service/ui.uc service action workers must close inherited procd lock fd" diff --git a/tests/shell_inventory.sh b/tests/shell_inventory.sh index cf12776c..adaf37e3 100644 --- a/tests/shell_inventory.sh +++ b/tests/shell_inventory.sh @@ -2,34 +2,34 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_FILES="$ROOT_DIR/forkop/files" -FORKOP_BIN="$FORKOP_FILES/usr/bin/forkop" -FORKOP_LIB="$FORKOP_FILES/usr/lib" -FORKOP_INIT="$FORKOP_FILES/etc/init.d/forkop" -LUCI_ROOT="$ROOT_DIR/luci-app-forkop/root" -LUCI_UCI_DEFAULTS="$LUCI_ROOT/etc/uci-defaults/50_luci-forkop" +TACHYON_FILES="$ROOT_DIR/tachyon/files" +TACHYON_BIN="$TACHYON_FILES/usr/bin/tachyon" +TACHYON_LIB="$TACHYON_FILES/usr/lib" +TACHYON_INIT="$TACHYON_FILES/etc/init.d/tachyon" +LUCI_ROOT="$ROOT_DIR/luci-app-tachyon/root" +LUCI_UCI_DEFAULTS="$LUCI_ROOT/etc/uci-defaults/50_luci-tachyon" fail() { printf 'FAIL: %s\n' "$1" >&2 exit 1 } -[ -d "$FORKOP_LIB" ] || fail "runtime library directory is missing" -[ -r "$FORKOP_BIN" ] || fail "forkop ucode entrypoint is missing" -[ -r "$FORKOP_INIT" ] || fail "forkop init.d entrypoint is missing" +[ -d "$TACHYON_LIB" ] || fail "runtime library directory is missing" +[ -r "$TACHYON_BIN" ] || fail "tachyon ucode entrypoint is missing" +[ -r "$TACHYON_INIT" ] || fail "tachyon init.d entrypoint is missing" [ -r "$LUCI_UCI_DEFAULTS" ] || fail "LuCI uci-defaults entrypoint is missing" -runtime_shell_files="$(find "$FORKOP_LIB" -type f -name '*.sh' -print)" +runtime_shell_files="$(find "$TACHYON_LIB" -type f -name '*.sh' -print)" [ -z "$runtime_shell_files" ] || fail "runtime library must not contain shell owners: $runtime_shell_files" legacy_shell_owners='runtime_state\.sh|rules_nft_runtime\.sh|config_validation\.sh|sing_box_runtime\.sh|updates_runtime\.sh|updater\.sh|status_diagnostics\.sh|helpers\.sh|constants\.sh|subscription_runtime\.sh|byedpi\.sh|zapret\.sh|zapret2\.sh' -if find "$FORKOP_FILES" -type f -print | grep -E "$legacy_shell_owners" >/dev/null 2>&1; then - fail "legacy runtime shell owner file returned under forkop/files" +if find "$TACHYON_FILES" -type f -print | grep -E "$legacy_shell_owners" >/dev/null 2>&1; then + fail "legacy runtime shell owner file returned under tachyon/files" fi shell_scripts="$( - find "$FORKOP_FILES" "$LUCI_ROOT" -type f -print | + find "$TACHYON_FILES" "$LUCI_ROOT" -type f -print | while IFS= read -r file; do first_line="$(sed -n '1p' "$file")" case "$first_line" in @@ -43,8 +43,8 @@ shell_scripts="$( expected_shell_scripts="$( printf '%s\n' \ - 'luci-app-forkop/root/etc/uci-defaults/50_luci-forkop' \ - 'forkop/files/etc/init.d/forkop' | + 'luci-app-tachyon/root/etc/uci-defaults/50_luci-tachyon' \ + 'tachyon/files/etc/init.d/tachyon' | LC_ALL=C sort )" @@ -55,33 +55,33 @@ $expected_shell_scripts actual: $shell_scripts" -grep -Fq '#!/usr/bin/ucode' "$FORKOP_BIN" || - fail "/usr/bin/forkop must remain a direct ucode executable" -grep -Fq 'function command_spec(command)' "$FORKOP_BIN" || - fail "/usr/bin/forkop must own command routing in ucode" -if grep -n -E '#!/bin/(ba)?sh|exec[[:space:]]+ucode|run_module\(|FORKOP_COMMAND' "$FORKOP_BIN" >/dev/null 2>&1; then - fail "/usr/bin/forkop must not regress to a shell loader or shell router" +grep -Fq '#!/usr/bin/ucode' "$TACHYON_BIN" || + fail "/usr/bin/tachyon must remain a direct ucode executable" +grep -Fq 'function command_spec(command)' "$TACHYON_BIN" || + fail "/usr/bin/tachyon must own command routing in ucode" +if grep -n -E '#!/bin/(ba)?sh|exec[[:space:]]+ucode|run_module\(|TACHYON_COMMAND' "$TACHYON_BIN" >/dev/null 2>&1; then + fail "/usr/bin/tachyon must not regress to a shell loader or shell router" fi -grep -Fq 'FORKOP_INITD_UC="$FORKOP_LIB/service/initd.uc"' "$FORKOP_INIT" || +grep -Fq 'TACHYON_INITD_UC="$TACHYON_LIB/service/initd.uc"' "$TACHYON_INIT" || fail "init.d must delegate service orchestration to service/initd.uc" -grep -Fq 'initd_ucode start-service' "$FORKOP_INIT" || +grep -Fq 'initd_ucode start-service' "$TACHYON_INIT" || fail "init.d start path must delegate to ucode" -grep -Fq 'initd_ucode stop-service' "$FORKOP_INIT" || +grep -Fq 'initd_ucode stop-service' "$TACHYON_INIT" || fail "init.d stop path must delegate to ucode" -grep -Fq 'initd_ucode reload-service' "$FORKOP_INIT" || +grep -Fq 'initd_ucode reload-service' "$TACHYON_INIT" || fail "init.d reload path must delegate to ucode" -grep -Fq 'initd_ucode trigger-plan' "$FORKOP_INIT" || +grep -Fq 'initd_ucode trigger-plan' "$TACHYON_INIT" || fail "init.d trigger decisions must be produced by ucode" -if grep -n -E '(^|[^[:alnum:]_])(uci|config_load|config_get|config_foreach|jsonfilter|nft|iptables|ip6?tables|sing-box|dnsmasq|curl|wget|opkg|apk)([[:space:]]|$)' "$FORKOP_INIT" >/dev/null 2>&1; then +if grep -n -E '(^|[^[:alnum:]_])(uci|config_load|config_get|config_foreach|jsonfilter|nft|iptables|ip6?tables|sing-box|dnsmasq|curl|wget|opkg|apk)([[:space:]]|$)' "$TACHYON_INIT" >/dev/null 2>&1; then fail "init.d must not own UCI, routing, download, package, dnsmasq, nft, or sing-box decisions" fi -if grep -n -E 'FORKOP_RELOAD_LOCK|FORKOP_URLTEST_SELECTOR_SWITCHES|capture_reload_state|populate_nft_runtime_sets|rebuild_nft_runtime|apply_pending_urltest_selector_switches' "$FORKOP_INIT" >/dev/null 2>&1; then +if grep -n -E 'TACHYON_RELOAD_LOCK|TACHYON_URLTEST_SELECTOR_SWITCHES|capture_reload_state|populate_nft_runtime_sets|rebuild_nft_runtime|apply_pending_urltest_selector_switches' "$TACHYON_INIT" >/dev/null 2>&1; then fail "init.d must not own runtime state or reload decisions" fi -grep -Fq '/usr/bin/forkop luci_postinst' "$LUCI_UCI_DEFAULTS" || +grep -Fq '/usr/bin/tachyon luci_postinst' "$LUCI_UCI_DEFAULTS" || fail "LuCI uci-defaults must delegate postinstall work to ucode" if grep -n -E '(^|[^[:alnum:]_])(uci|rm|logger|rpcd|killall|jsonfilter|config_load|config_get)([[:space:]]|$)' "$LUCI_UCI_DEFAULTS" >/dev/null 2>&1; then fail "LuCI uci-defaults must not own cache, rpcd, logging, or UCI logic" diff --git a/tests/sing_box_runtime.sh b/tests/sing_box_runtime.sh index 28be4ffb..4136f847 100644 --- a/tests/sing_box_runtime.sh +++ b/tests/sing_box_runtime.sh @@ -2,13 +2,13 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -FORKOP_BIN="$ROOT_DIR/forkop/files/usr/bin/forkop" -CLI_UC="$FORKOP_BIN" -SING_BOX_RUNTIME_SH="$FORKOP_LIB/sing_box_runtime.sh" -LIFECYCLE_UC="$FORKOP_LIB/service/lifecycle.uc" -SINGBOX_RUNTIME_UC="$FORKOP_LIB/singbox/runtime.uc" -SINGBOX_GENERATOR_UC="$FORKOP_LIB/singbox/generator.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +TACHYON_BIN="$ROOT_DIR/tachyon/files/usr/bin/tachyon" +CLI_UC="$TACHYON_BIN" +SING_BOX_RUNTIME_SH="$TACHYON_LIB/sing_box_runtime.sh" +LIFECYCLE_UC="$TACHYON_LIB/service/lifecycle.uc" +SINGBOX_RUNTIME_UC="$TACHYON_LIB/singbox/runtime.uc" +SINGBOX_GENERATOR_UC="$TACHYON_LIB/singbox/generator.uc" WORK_DIR="$(mktemp -d)" cleanup() { @@ -23,13 +23,13 @@ fail() { [ ! -e "$SING_BOX_RUNTIME_SH" ] || fail "sing_box_runtime.sh shell owner must be removed" -grep -Fq '#!/usr/bin/ucode' "$FORKOP_BIN" || - fail "forkop entrypoint must be a direct ucode executable" +grep -Fq '#!/usr/bin/ucode' "$TACHYON_BIN" || + fail "tachyon entrypoint must be a direct ucode executable" grep -Fq 'service/lifecycle.uc' "$CLI_UC" || fail "service/cli.uc must dispatch lifecycle orchestration through service/lifecycle.uc" grep -Fq 'singbox/runtime.uc' "$LIFECYCLE_UC" || fail "service/lifecycle.uc must call singbox/runtime.uc for sing-box runtime operations" -if grep -R -n -E 'sing_box_runtime_ucode|rulesets_ucode|sing_box_configure_service|sing_box_init_config|get_service_listen_address|get_device_ipv4_address|get_download_detour_tag' "$FORKOP_BIN" "$FORKOP_LIB" --include='*.sh' >/dev/null 2>&1; then +if grep -R -n -E 'sing_box_runtime_ucode|rulesets_ucode|sing_box_configure_service|sing_box_init_config|get_service_listen_address|get_device_ipv4_address|get_download_detour_tag' "$TACHYON_BIN" "$TACHYON_LIB" --include='*.sh' >/dev/null 2>&1; then fail "sing-box runtime shell symbols must not remain" fi grep -Fq 'mode == "configure-service"' "$SINGBOX_RUNTIME_UC" || @@ -54,7 +54,7 @@ if grep -n -E 'require\("uci"\)\.cursor|uci -q|uci", "-q"' "$SINGBOX_GENERATOR_U fi grep -Fq 'require("core.uci")' "$SINGBOX_GENERATOR_UC" || fail "singbox/generator.uc must import core.uci" -grep -Fq 'FORKOP_RULE_CONDITION_CACHE_DIR' "$LIFECYCLE_UC" || +grep -Fq 'TACHYON_RULE_CONDITION_CACHE_DIR' "$LIFECYCLE_UC" || fail "service/lifecycle.uc must pass rule-condition cache dir through module environment" if awk ' /"write-current-reload-state-clean"|"write-captured-reload-state"/ { @@ -84,9 +84,9 @@ EOF_SING_BOX chmod +x "$WORK_DIR/bin/sing-box" stable_variant="$({ PATH="$WORK_DIR/bin:$PATH" \ - FORKOP_LIB="$FORKOP_LIB" \ + TACHYON_LIB="$TACHYON_LIB" \ SB_VARIANT_STATE_FILE="$WORK_DIR/sing-box-variant" \ - ucode -L "$FORKOP_LIB" "$SINGBOX_RUNTIME_UC" variant + ucode -L "$TACHYON_LIB" "$SINGBOX_RUNTIME_UC" variant } 2>"$WORK_DIR/stable-variant.stderr")" || fail "singbox/runtime.uc must detect a stable binary without a ucode call-order failure" [ "$stable_variant" = "stable" ] || @@ -104,7 +104,7 @@ EOF_SING_BOX_CHECK chmod +x "$WORK_DIR/check-bin/sing-box" : >"$WORK_DIR/invalid-config.json" if PATH="$WORK_DIR/check-bin:$PATH" \ - ucode -L "$FORKOP_LIB" "$SINGBOX_RUNTIME_UC" check-config-fixture \ + ucode -L "$TACHYON_LIB" "$SINGBOX_RUNTIME_UC" check-config-fixture \ "$WORK_DIR/invalid-config.json" "$WORK_DIR/sing-box-check.log" \ >"$WORK_DIR/sing-box-check.reason"; then fail "singbox/runtime.uc check fixture should preserve a failed sing-box status" @@ -118,7 +118,7 @@ cat >"$WORK_DIR/generator-failure.log" <<'EOF_GENERATOR_FAILURE' skipped incompatible subscription outbound for rule 'only_xhttp': Only XHTTP node (XHTTP requires sing-box-extended) connection section has no usable outbounds EOF_GENERATOR_FAILURE -generator_reason="$(ucode -L "$FORKOP_LIB" "$SINGBOX_RUNTIME_UC" generator-failure-reason-fixture \ +generator_reason="$(ucode -L "$TACHYON_LIB" "$SINGBOX_RUNTIME_UC" generator-failure-reason-fixture \ "$WORK_DIR/generator-failure.log" 2)" [ "$generator_reason" = 'connection section has no usable outbounds' ] || fail "singbox/runtime.uc must report the terminal generator error instead of an earlier warning" @@ -126,7 +126,7 @@ generator_reason="$(ucode -L "$FORKOP_LIB" "$SINGBOX_RUNTIME_UC" generator-failu mkdir -p "$WORK_DIR/etc" "$WORK_DIR/tmp" printf 'old config\n' >"$WORK_DIR/etc/config.json" printf 'new config\n' >"$WORK_DIR/tmp/config.json" -ucode -L "$FORKOP_LIB" "$SINGBOX_RUNTIME_UC" save-config-file-fixture \ +ucode -L "$TACHYON_LIB" "$SINGBOX_RUNTIME_UC" save-config-file-fixture \ "$WORK_DIR/tmp/config.json" "$WORK_DIR/etc/config.json" [ "$(cat "$WORK_DIR/etc/config.json")" = "new config" ] || fail "singbox/runtime.uc must replace an existing config from a temp file" @@ -139,7 +139,7 @@ generate_config() { local mwan3_active="${3:-0}" mkdir -p "$output.section-cache" "$output.rulesets" - ucode -L "$FORKOP_LIB" "$FORKOP_LIB/singbox/generator.uc" generate-config-fixture \ + ucode -L "$TACHYON_LIB" "$TACHYON_LIB/singbox/generator.uc" generate-config-fixture \ "$fixture" "$output" "127.0.0.1" "$mwan3_active" } @@ -150,8 +150,8 @@ generate_config_with_subscription_cache() { mkdir -p "$output.section-cache" "$output.rulesets" TMP_SUBSCRIPTION_FOLDER="$WORK_DIR/subscriptions" \ - FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR="$WORK_DIR/persistent-subscription-cache" \ - ucode -L "$FORKOP_LIB" "$FORKOP_LIB/singbox/generator.uc" generate-config-fixture \ + TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR="$WORK_DIR/persistent-subscription-cache" \ + ucode -L "$TACHYON_LIB" "$TACHYON_LIB/singbox/generator.uc" generate-config-fixture \ "$fixture" "$output" "127.0.0.1" "0" "$supports_xhttp" } @@ -168,7 +168,7 @@ cat >"$WORK_DIR/no-enabled-fixture.json" <<'JSON' } JSON -if ucode -L "$FORKOP_LIB" "$SINGBOX_GENERATOR_UC" generate-config-fixture \ +if ucode -L "$TACHYON_LIB" "$SINGBOX_GENERATOR_UC" generate-config-fixture \ "$WORK_DIR/no-enabled-fixture.json" "$WORK_DIR/no-enabled.json" "127.0.0.1" "0" \ >"$WORK_DIR/no-enabled.stdout" 2>"$WORK_DIR/no-enabled.stderr"; then fail "generator should reject a config without enabled sections" @@ -180,21 +180,21 @@ grep -Fxq 'no enabled sections' "$WORK_DIR/no-enabled.stderr" || fail "generator failure reason should be concise" cat >"$WORK_DIR/generator-uci.state" <<'EOF_UCI' -forkop.settings=settings -forkop.settings.dns_server=1.1.1.1 -forkop.settings.bootstrap_dns_server=1.1.1.1 -forkop.settings.config_path=/tmp/sing-box/config.json -forkop.settings.cache_path=/tmp/sing-box/cache.db -forkop.settings.log_level=warn -forkop.uci_proxy=section -forkop.uci_proxy.enabled=1 -forkop.uci_proxy.action=connection -forkop.uci_proxy.outbound_jsons={"type":"direct"} -forkop.uci_proxy.domain_suffix=example.org +tachyon.settings=settings +tachyon.settings.dns_server=1.1.1.1 +tachyon.settings.bootstrap_dns_server=1.1.1.1 +tachyon.settings.config_path=/tmp/sing-box/config.json +tachyon.settings.cache_path=/tmp/sing-box/cache.db +tachyon.settings.log_level=warn +tachyon.uci_proxy=section +tachyon.uci_proxy.enabled=1 +tachyon.uci_proxy.action=connection +tachyon.uci_proxy.outbound_jsons={"type":"direct"} +tachyon.uci_proxy.domain_suffix=example.org EOF_UCI -FORKOP_UCI_STATE_FILE="$WORK_DIR/generator-uci.state" \ - FORKOP_SECTION_CACHE_DIR="$WORK_DIR/generated-from-uci.section-cache" \ - ucode -L "$FORKOP_LIB" "$SINGBOX_GENERATOR_UC" generate-config "$WORK_DIR/generated-from-uci.json" "127.0.0.1" "0" +TACHYON_UCI_STATE_FILE="$WORK_DIR/generator-uci.state" \ + TACHYON_SECTION_CACHE_DIR="$WORK_DIR/generated-from-uci.section-cache" \ + ucode -L "$TACHYON_LIB" "$SINGBOX_GENERATOR_UC" generate-config "$WORK_DIR/generated-from-uci.json" "127.0.0.1" "0" grep -Fq '"example.org"' "$WORK_DIR/generated-from-uci.json" || fail "singbox/generator.uc must read section matchers from core.uci" grep -Fq '"uci_proxy-out"' "$WORK_DIR/generated-from-uci.json" || @@ -885,7 +885,7 @@ cat >"$WORK_DIR/subscriptions/grouped-subscription-1.json" <<'JSON' "interval": "10m", "tolerance": 50, "remark": "Provider Group", - "__forkop_allow_group": true + "__tachyon_allow_group": true }, { "type": "vless", @@ -894,7 +894,7 @@ cat >"$WORK_DIR/subscriptions/grouped-subscription-1.json" <<'JSON' "server_port": 443, "uuid": "00000000-0000-4000-8000-000000000001", "tls": { "enabled": true, "server_name": "example.com" }, - "__forkop_hidden": true + "__tachyon_hidden": true }, { "type": "vless", @@ -903,7 +903,7 @@ cat >"$WORK_DIR/subscriptions/grouped-subscription-1.json" <<'JSON' "server_port": 443, "uuid": "00000000-0000-4000-8000-000000000002", "tls": { "enabled": true, "server_name": "example.org" }, - "__forkop_hidden": true + "__tachyon_hidden": true }, { "type": "direct", @@ -924,7 +924,7 @@ cat >"$WORK_DIR/subscriptions/xhttp-subscription-1.json" <<'JSON' "default": "xhttp-node", "url": "https://www.gstatic.com/generate_204", "remark": "Provider XHTTP Group", - "__forkop_allow_group": true + "__tachyon_allow_group": true }, { "type": "vless", @@ -934,7 +934,7 @@ cat >"$WORK_DIR/subscriptions/xhttp-subscription-1.json" <<'JSON' "server_port": 443, "uuid": "00000000-0000-4000-8000-000000000010", "transport": { "type": "xhttp" }, - "__forkop_hidden": true + "__tachyon_hidden": true }, { "type": "socks", @@ -942,7 +942,7 @@ cat >"$WORK_DIR/subscriptions/xhttp-subscription-1.json" <<'JSON' "remark": "Plain node", "server": "127.0.0.11", "server_port": 1080, - "__forkop_hidden": true + "__tachyon_hidden": true }, { "type": "socks", @@ -1018,7 +1018,7 @@ grep -Fq "Only XHTTP node (XHTTP requires sing-box-extended)" "$WORK_DIR/subscri fail "all-XHTTP subscription failure should end with the actionable generator error" for fixture in manual-xhttp json-xhttp; do - if ucode -L "$FORKOP_LIB" "$SINGBOX_GENERATOR_UC" generate-config-fixture \ + if ucode -L "$TACHYON_LIB" "$SINGBOX_GENERATOR_UC" generate-config-fixture \ "$WORK_DIR/$fixture-fixture.json" "$WORK_DIR/$fixture-stable.json" "127.0.0.1" "0" "0" \ >"$WORK_DIR/$fixture-stable.stdout" 2>"$WORK_DIR/$fixture-stable.stderr"; then fail "stable sing-box should reject explicit $fixture configuration" diff --git a/tests/singbox_rulesets.sh b/tests/singbox_rulesets.sh index 0398471b..95c8f91a 100644 --- a/tests/singbox_rulesets.sh +++ b/tests/singbox_rulesets.sh @@ -2,8 +2,8 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -RULESETS_UC="$ROOT_DIR/forkop/files/usr/lib/singbox/rulesets.uc" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" +RULESETS_UC="$ROOT_DIR/tachyon/files/usr/lib/singbox/rulesets.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" fail() { printf 'FAIL: %s\n' "$1" >&2 @@ -19,32 +19,32 @@ assert_eq() { } assert_eq srs \ - "$(ucode -L "$FORKOP_LIB" "$RULESETS_UC" file-extension 'https://example.com/path/rule.srs?token=1#x')" \ + "$(ucode -L "$TACHYON_LIB" "$RULESETS_UC" file-extension 'https://example.com/path/rule.srs?token=1#x')" \ "ruleset file extension" -ucode -L "$FORKOP_LIB" "$RULESETS_UC" is-community youtube >/dev/null || +ucode -L "$TACHYON_LIB" "$RULESETS_UC" is-community youtube >/dev/null || fail "youtube should be a community ruleset" -if ucode -L "$FORKOP_LIB" "$RULESETS_UC" is-community unknown_service >/dev/null 2>&1; then +if ucode -L "$TACHYON_LIB" "$RULESETS_UC" is-community unknown_service >/dev/null 2>&1; then fail "unknown service should not be a community ruleset" fi assert_eq domains \ - "$(ucode -L "$FORKOP_LIB" "$RULESETS_UC" kind-from-reference-hint 'https://example.com/geosite-custom.srs')" \ + "$(ucode -L "$TACHYON_LIB" "$RULESETS_UC" kind-from-reference-hint 'https://example.com/geosite-custom.srs')" \ "domain ruleset hint" assert_eq subnets \ - "$(ucode -L "$FORKOP_LIB" "$RULESETS_UC" kind-from-reference-hint '/tmp/geoip-cidr.json')" \ + "$(ucode -L "$TACHYON_LIB" "$RULESETS_UC" kind-from-reference-hint '/tmp/geoip-cidr.json')" \ "subnet ruleset hint" assert_eq unknown \ - "$(ucode -L "$FORKOP_LIB" "$RULESETS_UC" kind-from-reference-hint '/tmp/custom.srs')" \ + "$(ucode -L "$TACHYON_LIB" "$RULESETS_UC" kind-from-reference-hint '/tmp/custom.srs')" \ "unknown ruleset hint" assert_eq source \ - "$(ucode -L "$FORKOP_LIB" "$RULESETS_UC" remote-format 'https://example.com/rules.json')" \ + "$(ucode -L "$TACHYON_LIB" "$RULESETS_UC" remote-format 'https://example.com/rules.json')" \ "json remote ruleset format" assert_eq binary \ - "$(ucode -L "$FORKOP_LIB" "$RULESETS_UC" remote-format 'https://example.com/rules.srs')" \ + "$(ucode -L "$TACHYON_LIB" "$RULESETS_UC" remote-format 'https://example.com/rules.srs')" \ "srs remote ruleset format" assert_eq binary \ - "$(ucode -L "$FORKOP_LIB" "$RULESETS_UC" remote-format 'https://example.com/rules.unknown')" \ + "$(ucode -L "$TACHYON_LIB" "$RULESETS_UC" remote-format 'https://example.com/rules.unknown')" \ "unknown remote ruleset format" -ucode -L "$FORKOP_LIB" -e 'let rulesets = require("singbox.rulesets"); if (rulesets.kind_from_reference_hint("geoip") != "subnets") exit(1);' +ucode -L "$TACHYON_LIB" -e 'let rulesets = require("singbox.rulesets"); if (rulesets.kind_from_reference_hint("geoip") != "subnets") exit(1);' printf 'singbox rulesets checks passed\n' diff --git a/tests/subscription_alpn.sh b/tests/subscription_alpn.sh index ccab437f..d1939c0f 100644 --- a/tests/subscription_alpn.sh +++ b/tests/subscription_alpn.sh @@ -2,7 +2,7 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -PARSER="$ROOT_DIR/forkop/files/usr/lib/subscription/parser.uc" +PARSER="$ROOT_DIR/tachyon/files/usr/lib/subscription/parser.uc" WORK_DIR="$(mktemp -d)" cleanup() { diff --git a/tests/subscription_cache_state.sh b/tests/subscription_cache_state.sh index c78bb473..1f69ad7b 100644 --- a/tests/subscription_cache_state.sh +++ b/tests/subscription_cache_state.sh @@ -2,8 +2,8 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -CACHE_UC="$ROOT_DIR/forkop/files/usr/lib/subscription/cache.uc" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" +CACHE_UC="$ROOT_DIR/tachyon/files/usr/lib/subscription/cache.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" WORK_DIR="$(mktemp -d)" cleanup() { @@ -25,7 +25,7 @@ assert_eq() { } cache_ucode() { - ucode -L "$FORKOP_LIB" "$CACHE_UC" "$@" + ucode -L "$TACHYON_LIB" "$CACHE_UC" "$@" } assert_eq "first second" \ @@ -44,24 +44,24 @@ if cache_ucode state-list-contains "first second" third >/dev/null 2>&1; then fail "state list should not contain third" fi -SUBSCRIPTION_RUNTIME_SH="$ROOT_DIR/forkop/files/usr/lib/subscription_runtime.sh" -UPDATES_RUNTIME_SH="$ROOT_DIR/forkop/files/usr/lib/updates_runtime.sh" +SUBSCRIPTION_RUNTIME_SH="$ROOT_DIR/tachyon/files/usr/lib/subscription_runtime.sh" +UPDATES_RUNTIME_SH="$ROOT_DIR/tachyon/files/usr/lib/updates_runtime.sh" [ ! -e "$SUBSCRIPTION_RUNTIME_SH" ] || fail "subscription_runtime.sh shell owner must be removed" [ ! -e "$UPDATES_RUNTIME_SH" ] || fail "updates_runtime.sh shell owner must be removed" -if grep -R -n "subscription_runtime.sh" "$ROOT_DIR/forkop/files" >/dev/null 2>&1; then +if grep -R -n "subscription_runtime.sh" "$ROOT_DIR/tachyon/files" >/dev/null 2>&1; then fail "runtime files must not reference subscription_runtime.sh" fi subscription_runtime_shell_symbols='subscription_runtime_|prepare_subscription_caches_for_startup|prepare_subscription_caches_for_runtime_generation|run_deferred_subscription_bootstrap|stop_deferred_subscription_bootstrap_retry_worker' -if grep -R -n -E "$subscription_runtime_shell_symbols" "$ROOT_DIR/forkop/files/usr/bin/forkop" "$ROOT_DIR/forkop/files/usr/lib" --include='*.sh' >/dev/null 2>&1; then +if grep -R -n -E "$subscription_runtime_shell_symbols" "$ROOT_DIR/tachyon/files/usr/bin/tachyon" "$ROOT_DIR/tachyon/files/usr/lib" --include='*.sh' >/dev/null 2>&1; then fail "subscription_runtime shell symbols must not remain in runtime shell" fi -if grep -R -n -E 'get_subscription_metadata_path|get_outbound_metadata_path' "$ROOT_DIR/forkop/files/usr/bin/forkop" "$ROOT_DIR/forkop/files/usr/lib" --include='*.sh' >/dev/null 2>&1; then +if grep -R -n -E 'get_subscription_metadata_path|get_outbound_metadata_path' "$ROOT_DIR/tachyon/files/usr/bin/tachyon" "$ROOT_DIR/tachyon/files/usr/lib" --include='*.sh' >/dev/null 2>&1; then fail "subscription metadata path helpers must be owned by subscription/cache.uc" fi @@ -94,10 +94,10 @@ grep -q 'mode == "stop-deferred-bootstrap-worker"' "$CACHE_UC" || assert_eq "proxy-subscription-2" \ "$(cache_ucode source-id proxy 2)" \ "source id mode" -assert_eq "/var/run/forkop/subscription-metadata/proxy.json" \ +assert_eq "/var/run/tachyon/subscription-metadata/proxy.json" \ "$(cache_ucode subscription-metadata-path proxy)" \ "subscription metadata path mode" -assert_eq "/var/run/forkop/outbound-metadata/proxy.json" \ +assert_eq "/var/run/tachyon/outbound-metadata/proxy.json" \ "$(cache_ucode outbound-metadata-path proxy)" \ "outbound metadata path mode" if cache_ucode subscription-metadata-path '../bad' >/dev/null 2>&1; then @@ -129,16 +129,16 @@ runtime_env() { TMP_SING_BOX_FOLDER="$WORK_DIR/runtime/tmp-sing-box" \ TMP_RULESET_FOLDER="$WORK_DIR/runtime/tmp-sing-box/rulesets" \ TMP_SUBSCRIPTION_FOLDER="$WORK_DIR/runtime/tmp-sing-box/subscriptions" \ - FORKOP_RUNTIME_STATE_DIR="$WORK_DIR/runtime/run" \ - FORKOP_SUBSCRIPTION_UPDATE_STATE_DIR="$WORK_DIR/runtime/run/subscription-update" \ - FORKOP_SUBSCRIPTION_LINKS_DIR="$WORK_DIR/runtime/run/subscription-links" \ - FORKOP_SUBSCRIPTION_METADATA_DIR="$WORK_DIR/runtime/run/subscription-metadata" \ - FORKOP_OUTBOUND_METADATA_DIR="$WORK_DIR/runtime/run/outbound-metadata" \ - FORKOP_SECTION_CACHE_DIR="$WORK_DIR/runtime/run/section-cache" \ - FORKOP_RUNTIME_CACHE_FORMAT_FILE="$WORK_DIR/runtime/run/cache-format" \ - FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR="$WORK_DIR/runtime/persistent" \ - FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE="$WORK_DIR/runtime/persistent/cache-format" \ - FORKOP_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE="$WORK_DIR/runtime/run/bootstrap.pid" \ + TACHYON_RUNTIME_STATE_DIR="$WORK_DIR/runtime/run" \ + TACHYON_SUBSCRIPTION_UPDATE_STATE_DIR="$WORK_DIR/runtime/run/subscription-update" \ + TACHYON_SUBSCRIPTION_LINKS_DIR="$WORK_DIR/runtime/run/subscription-links" \ + TACHYON_SUBSCRIPTION_METADATA_DIR="$WORK_DIR/runtime/run/subscription-metadata" \ + TACHYON_OUTBOUND_METADATA_DIR="$WORK_DIR/runtime/run/outbound-metadata" \ + TACHYON_SECTION_CACHE_DIR="$WORK_DIR/runtime/run/section-cache" \ + TACHYON_RUNTIME_CACHE_FORMAT_FILE="$WORK_DIR/runtime/run/cache-format" \ + TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR="$WORK_DIR/runtime/persistent" \ + TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE="$WORK_DIR/runtime/persistent/cache-format" \ + TACHYON_SUBSCRIPTION_BOOTSTRAP_RETRY_PID_FILE="$WORK_DIR/runtime/run/bootstrap.pid" \ "$@" } diff --git a/tests/subscription_hysteria2.sh b/tests/subscription_hysteria2.sh index ffbd0f44..42f98641 100644 --- a/tests/subscription_hysteria2.sh +++ b/tests/subscription_hysteria2.sh @@ -2,9 +2,9 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -PARSER="$ROOT_DIR/forkop/files/usr/lib/subscription/parser.uc" -GENERATOR="$ROOT_DIR/forkop/files/usr/lib/singbox/generator.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +PARSER="$ROOT_DIR/tachyon/files/usr/lib/subscription/parser.uc" +GENERATOR="$ROOT_DIR/tachyon/files/usr/lib/singbox/generator.uc" WORK_DIR="$(mktemp -d)" cleanup() { @@ -119,7 +119,7 @@ cat >"$generator_fixture" <<'JSON' } JSON TMP_SUBSCRIPTION_FOLDER="$WORK_DIR/subscriptions" \ - ucode -L "$FORKOP_LIB" "$GENERATOR" generate-config-fixture \ + ucode -L "$TACHYON_LIB" "$GENERATOR" generate-config-fixture \ "$generator_fixture" "$generator_output" "127.0.0.1" "0" assert_contains "$generator_output" '"type": "hysteria2"' "generated stale HY2 type" if grep -Fq '"utls"' "$generator_output"; then diff --git a/tests/subscription_source_entry.sh b/tests/subscription_source_entry.sh index f679440e..d2a9afaf 100644 --- a/tests/subscription_source_entry.sh +++ b/tests/subscription_source_entry.sh @@ -2,8 +2,8 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -PARSER="$ROOT_DIR/forkop/files/usr/lib/subscription/parser.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +PARSER="$ROOT_DIR/tachyon/files/usr/lib/subscription/parser.uc" WORK_DIR="$(mktemp -d)" cleanup() { @@ -69,6 +69,6 @@ if (invalid.valid || invalid.error != "Subscription URL must start with http:// exit(1); UCODE -ucode -L "$FORKOP_LIB" "$WORK_DIR/require-subscription-parser.uc" +ucode -L "$TACHYON_LIB" "$WORK_DIR/require-subscription-parser.uc" printf 'subscription source entry checks passed\n' diff --git a/tests/subscription_update_job.sh b/tests/subscription_update_job.sh index 2c817780..e078f6e8 100644 --- a/tests/subscription_update_job.sh +++ b/tests/subscription_update_job.sh @@ -2,9 +2,9 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -UPDATES_UC="$ROOT_DIR/forkop/files/usr/lib/components/updates.uc" -UPDATES_RUNTIME="$ROOT_DIR/forkop/files/usr/lib/updates_runtime.sh" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" +UPDATES_UC="$ROOT_DIR/tachyon/files/usr/lib/components/updates.uc" +UPDATES_RUNTIME="$ROOT_DIR/tachyon/files/usr/lib/updates_runtime.sh" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" WORK_DIR="$(mktemp -d)" cleanup() { @@ -34,7 +34,7 @@ write_state() { } updates_ucode() { - ucode -L "$FORKOP_LIB" "$UPDATES_UC" "$@" + ucode -L "$TACHYON_LIB" "$UPDATES_UC" "$@" } [ ! -e "$UPDATES_RUNTIME" ] || @@ -79,7 +79,7 @@ if (value.running !== false || value.success !== false || value.section !== "pro NODE mkdir -p "$WORK_DIR/bin" -cat >"$WORK_DIR/bin/forkop" <<'SH' +cat >"$WORK_DIR/bin/tachyon" <<'SH' #!/usr/bin/env sh if [ "$1" != "subscription_update" ]; then exit 64 @@ -87,27 +87,27 @@ fi printf 'fake update for %s/%s\n' "$2" "$3" printf 'Subscription update completed by fake worker\n' SH -chmod +x "$WORK_DIR/bin/forkop" +chmod +x "$WORK_DIR/bin/tachyon" ASYNC_ENV=( - "FORKOP_LIB=$ROOT_DIR/forkop/files/usr/lib" - "FORKOP_BIN=$WORK_DIR/bin/forkop" + "TACHYON_LIB=$ROOT_DIR/tachyon/files/usr/lib" + "TACHYON_BIN=$WORK_DIR/bin/tachyon" "TMP_SING_BOX_FOLDER=$WORK_DIR/tmp/sing-box" "TMP_RULESET_FOLDER=$WORK_DIR/tmp/sing-box/rulesets" "TMP_SUBSCRIPTION_FOLDER=$WORK_DIR/tmp/sing-box/subscriptions" - "FORKOP_RUNTIME_STATE_DIR=$WORK_DIR/run" - "FORKOP_SUBSCRIPTION_UPDATE_STATE_DIR=$WORK_DIR/run/subscription-update" - "FORKOP_SUBSCRIPTION_UPDATE_JOB_DIR=$WORK_DIR/run/subscription-update-jobs" - "FORKOP_SUBSCRIPTION_LINKS_DIR=$WORK_DIR/run/subscription-links" - "FORKOP_SUBSCRIPTION_METADATA_DIR=$WORK_DIR/run/subscription-metadata" - "FORKOP_OUTBOUND_METADATA_DIR=$WORK_DIR/run/outbound-metadata" - "FORKOP_SECTION_CACHE_DIR=$WORK_DIR/run/section-cache" - "FORKOP_RUNTIME_CACHE_FORMAT_FILE=$WORK_DIR/run/cache-format" - "FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR=$WORK_DIR/persistent/subscription-cache" - "FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE=$WORK_DIR/persistent/subscription-cache/cache-format" + "TACHYON_RUNTIME_STATE_DIR=$WORK_DIR/run" + "TACHYON_SUBSCRIPTION_UPDATE_STATE_DIR=$WORK_DIR/run/subscription-update" + "TACHYON_SUBSCRIPTION_UPDATE_JOB_DIR=$WORK_DIR/run/subscription-update-jobs" + "TACHYON_SUBSCRIPTION_LINKS_DIR=$WORK_DIR/run/subscription-links" + "TACHYON_SUBSCRIPTION_METADATA_DIR=$WORK_DIR/run/subscription-metadata" + "TACHYON_OUTBOUND_METADATA_DIR=$WORK_DIR/run/outbound-metadata" + "TACHYON_SECTION_CACHE_DIR=$WORK_DIR/run/section-cache" + "TACHYON_RUNTIME_CACHE_FORMAT_FILE=$WORK_DIR/run/cache-format" + "TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR=$WORK_DIR/persistent/subscription-cache" + "TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE=$WORK_DIR/persistent/subscription-cache/cache-format" ) -async_response="$(env "${ASYNC_ENV[@]}" ucode -L "$ROOT_DIR/forkop/files/usr/lib" "$UPDATES_UC" subscription-update-async proxy 1)" +async_response="$(env "${ASYNC_ENV[@]}" ucode -L "$ROOT_DIR/tachyon/files/usr/lib" "$UPDATES_UC" subscription-update-async proxy 1)" job_id="$(JSON_VALUE="$async_response" node - <<'NODE' const value = JSON.parse(process.env.JSON_VALUE); if (value.success !== true || !value.job_id) { @@ -120,7 +120,7 @@ NODE final_status="" for _ in $(seq 1 30); do - final_status="$(env "${ASYNC_ENV[@]}" ucode -L "$ROOT_DIR/forkop/files/usr/lib" "$UPDATES_UC" subscription-update-status "$job_id")" + final_status="$(env "${ASYNC_ENV[@]}" ucode -L "$ROOT_DIR/tachyon/files/usr/lib" "$UPDATES_UC" subscription-update-status "$job_id")" if JSON_VALUE="$final_status" node -e 'process.exit(JSON.parse(process.env.JSON_VALUE).running ? 1 : 0)' >/dev/null 2>&1; then break fi diff --git a/tests/subscription_update_reload.sh b/tests/subscription_update_reload.sh index b97be06b..d53fd692 100644 --- a/tests/subscription_update_reload.sh +++ b/tests/subscription_update_reload.sh @@ -2,8 +2,8 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -UPDATES_UC="$ROOT_DIR/forkop/files/usr/lib/components/updates.uc" -REAL_LIB="$ROOT_DIR/forkop/files/usr/lib" +UPDATES_UC="$ROOT_DIR/tachyon/files/usr/lib/components/updates.uc" +REAL_LIB="$ROOT_DIR/tachyon/files/usr/lib" WORK_DIR="$(mktemp -d)" cleanup() { @@ -116,22 +116,22 @@ run_update() { : >"$log" env \ - FORKOP_LIB="$FAKE_LIB" \ - FORKOP_RUNTIME_STATE_DIR="$WORK_DIR/run" \ - FORKOP_SUBSCRIPTION_UPDATE_LOCK_DIR="$WORK_DIR/run/subscription-update.lock" \ - FORKOP_RELOAD_LOCK_DIR="$WORK_DIR/run/reload.lock" \ - FORKOP_SUBSCRIPTION_UPDATE_STATE_DIR="$WORK_DIR/run/subscription-update" \ - FORKOP_SUBSCRIPTION_UPDATE_JOB_DIR="$WORK_DIR/run/subscription-update-jobs" \ - FORKOP_SUBSCRIPTION_LINKS_DIR="$WORK_DIR/run/subscription-links" \ - FORKOP_SUBSCRIPTION_METADATA_DIR="$WORK_DIR/run/subscription-metadata" \ - FORKOP_OUTBOUND_METADATA_DIR="$WORK_DIR/run/outbound-metadata" \ - FORKOP_SECTION_CACHE_DIR="$WORK_DIR/run/section-cache" \ - FORKOP_RUNTIME_CACHE_FORMAT_FILE="$WORK_DIR/run/cache-format" \ - FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_DIR="$WORK_DIR/persistent/subscription-cache" \ - FORKOP_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE="$WORK_DIR/persistent/subscription-cache/cache-format" \ - FORKOP_PENDING_RELOAD_FILE="$WORK_DIR/run/reload.pending" \ - FORKOP_RELOAD_STATE_FILE="$WORK_DIR/run/reload-state" \ - FORKOP_RULE_CONDITION_CACHE_DIR="$WORK_DIR/run/rule-condition-cache" \ + TACHYON_LIB="$FAKE_LIB" \ + TACHYON_RUNTIME_STATE_DIR="$WORK_DIR/run" \ + TACHYON_SUBSCRIPTION_UPDATE_LOCK_DIR="$WORK_DIR/run/subscription-update.lock" \ + TACHYON_RELOAD_LOCK_DIR="$WORK_DIR/run/reload.lock" \ + TACHYON_SUBSCRIPTION_UPDATE_STATE_DIR="$WORK_DIR/run/subscription-update" \ + TACHYON_SUBSCRIPTION_UPDATE_JOB_DIR="$WORK_DIR/run/subscription-update-jobs" \ + TACHYON_SUBSCRIPTION_LINKS_DIR="$WORK_DIR/run/subscription-links" \ + TACHYON_SUBSCRIPTION_METADATA_DIR="$WORK_DIR/run/subscription-metadata" \ + TACHYON_OUTBOUND_METADATA_DIR="$WORK_DIR/run/outbound-metadata" \ + TACHYON_SECTION_CACHE_DIR="$WORK_DIR/run/section-cache" \ + TACHYON_RUNTIME_CACHE_FORMAT_FILE="$WORK_DIR/run/cache-format" \ + TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_DIR="$WORK_DIR/persistent/subscription-cache" \ + TACHYON_PERSISTENT_SUBSCRIPTION_CACHE_FORMAT_FILE="$WORK_DIR/persistent/subscription-cache/cache-format" \ + TACHYON_PENDING_RELOAD_FILE="$WORK_DIR/run/reload.pending" \ + TACHYON_RELOAD_STATE_FILE="$WORK_DIR/run/reload-state" \ + TACHYON_RULE_CONDITION_CACHE_DIR="$WORK_DIR/run/rule-condition-cache" \ FAKE_CALL_LOG="$log" \ FAKE_SUBSCRIPTION_UPDATE_SUMMARY="$summary" \ ucode -L "$REAL_LIB" "$UPDATES_UC" subscription-update-if-due diff --git a/tests/subscription_user_agent.sh b/tests/subscription_user_agent.sh index 4c3c7899..1de21d77 100644 --- a/tests/subscription_user_agent.sh +++ b/tests/subscription_user_agent.sh @@ -2,8 +2,8 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -CACHE_UC="$ROOT_DIR/forkop/files/usr/lib/subscription/cache.uc" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" +CACHE_UC="$ROOT_DIR/tachyon/files/usr/lib/subscription/cache.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" WORK_DIR="$(mktemp -d)" cleanup() { @@ -42,7 +42,7 @@ preferred_candidates="$(printf '%s\n%s\n%s\n%s\n%s\n%s' \ Clash.Meta)" cache_ucode() { - ucode -L "$FORKOP_LIB" "$CACHE_UC" "$@" + ucode -L "$TACHYON_LIB" "$CACHE_UC" "$@" } cache_ucode write-user-agent-candidates "$WORK_DIR/default.txt" "" "" "$default_ua" diff --git a/tests/ui_runtime_job.sh b/tests/ui_runtime_job.sh index 484bf98c..66eb2735 100644 --- a/tests/ui_runtime_job.sh +++ b/tests/ui_runtime_job.sh @@ -2,11 +2,11 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -UI_UC="$ROOT_DIR/forkop/files/usr/lib/service/ui.uc" -FORKOP_FILES="$ROOT_DIR/forkop/files" -FORKOP_BIN="$FORKOP_FILES/usr/bin/forkop" -FORKOP_INIT="$FORKOP_FILES/etc/init.d/forkop" -UI_RUNTIME_SH="$FORKOP_FILES/usr/lib/ui_runtime.sh" +UI_UC="$ROOT_DIR/tachyon/files/usr/lib/service/ui.uc" +TACHYON_FILES="$ROOT_DIR/tachyon/files" +TACHYON_BIN="$TACHYON_FILES/usr/bin/tachyon" +TACHYON_INIT="$TACHYON_FILES/etc/init.d/tachyon" +UI_RUNTIME_SH="$TACHYON_FILES/usr/lib/ui_runtime.sh" WORK_DIR="$(mktemp -d)" cleanup() { @@ -20,7 +20,7 @@ fail() { } ui_ucode() { - ucode -L "$FORKOP_FILES/usr/lib" "$UI_UC" "$@" + ucode -L "$TACHYON_FILES/usr/lib" "$UI_UC" "$@" } assert_eq() { @@ -42,16 +42,16 @@ write_state() { [ ! -e "$UI_RUNTIME_SH" ] || fail "ui_runtime.sh shell owner must be removed" -if grep -R -n "ui_runtime.sh" "$FORKOP_FILES" >/dev/null 2>&1; then +if grep -R -n "ui_runtime.sh" "$TACHYON_FILES" >/dev/null 2>&1; then fail "runtime files must not reference ui_runtime.sh" fi -ui_runtime_shell_symbols='ui_runtime_|forkop_fast_get_ui_state|FORKOP_UI_RUNTIME|load_ui_runtime' -if grep -R -n -E "$ui_runtime_shell_symbols" "$FORKOP_BIN" "$FORKOP_INIT" "$FORKOP_FILES/usr/lib" --include='*.sh' >/dev/null 2>&1; then +ui_runtime_shell_symbols='ui_runtime_|tachyon_fast_get_ui_state|TACHYON_UI_RUNTIME|load_ui_runtime' +if grep -R -n -E "$ui_runtime_shell_symbols" "$TACHYON_BIN" "$TACHYON_INIT" "$TACHYON_FILES/usr/lib" --include='*.sh' >/dev/null 2>&1; then fail "ui_runtime shell symbols must not remain in runtime shell" fi -if grep -R -n '^get_ui_capabilities()' "$FORKOP_FILES/usr/lib" --include='*.sh' >/dev/null 2>&1; then +if grep -R -n '^get_ui_capabilities()' "$TACHYON_FILES/usr/lib" --include='*.sh' >/dev/null 2>&1; then fail "UI capabilities must be owned by service/ui.uc, not shell" fi grep -Fq 'require("core.uci")' "$UI_UC" || @@ -59,8 +59,8 @@ grep -Fq 'require("core.uci")' "$UI_UC" || if grep -n -E 'require\("uci"\)\.cursor|uci -q|uci", "-q"' "$UI_UC" >/dev/null 2>&1; then fail "service/ui.uc must not own direct UCI cursor or CLI reads" fi -grep -Fq '"forkop-stably-running"' "$UI_UC" || - fail "UI Forkop status must use stable runtime state to avoid crash-loop flicker" +grep -Fq '"tachyon-stably-running"' "$UI_UC" || + fail "UI Tachyon status must use stable runtime state to avoid crash-loop flicker" grep -Fq '"sing-box-service-stable"' "$UI_UC" || fail "UI sing-box status must use stable runtime state to avoid crash-loop flicker" grep -Fq 'run_pending_reload_after_service_action(action, success)' "$UI_UC" || @@ -127,7 +127,7 @@ latency_action_dir="$WORK_DIR/latency-actions" mkdir -p "$latency_action_dir" latency_state="$latency_action_dir/latency-1.json" printf '%s\n' '{"success":true,"running":true,"kind":"latency","latency_type":"proxy_list","section":"main","tag":"[]","started_at":100}' >"$latency_state" -FORKOP_UI_LATENCY_ACTION_DIR="$latency_action_dir" \ +TACHYON_UI_LATENCY_ACTION_DIR="$latency_action_dir" \ ui_ucode latency-progress-state "$latency_state" 2 5 1 >/dev/null || fail "latency-progress-state should update running latency jobs" JOB_STATE="$latency_state" node - <<'NODE' @@ -207,21 +207,21 @@ ui_ucode cleanup-action-dir-fixture "$cleanup_dir" [ ! -e "$cleanup_dir/done.out.json" ] || fail "expired acknowledged action JSON sidecar should be cleaned" -export FORKOP_UI_STATE_DIR="$WORK_DIR/ui-state" -export FORKOP_UI_SERVICE_ACTION_DIR="$FORKOP_UI_STATE_DIR/service-actions" -export FORKOP_UI_SERVICE_ACTION_LOCK_DIR="$FORKOP_UI_STATE_DIR/service-actions.lock" -export FORKOP_UI_LATENCY_ACTION_DIR="$FORKOP_UI_STATE_DIR/latency-actions" -export FORKOP_UI_COMPONENT_ACTION_DIR="$FORKOP_UI_STATE_DIR/component-actions" -export FORKOP_UI_SUBSCRIPTION_ACTION_DIR="$FORKOP_UI_STATE_DIR/subscription-actions" +export TACHYON_UI_STATE_DIR="$WORK_DIR/ui-state" +export TACHYON_UI_SERVICE_ACTION_DIR="$TACHYON_UI_STATE_DIR/service-actions" +export TACHYON_UI_SERVICE_ACTION_LOCK_DIR="$TACHYON_UI_STATE_DIR/service-actions.lock" +export TACHYON_UI_LATENCY_ACTION_DIR="$TACHYON_UI_STATE_DIR/latency-actions" +export TACHYON_UI_COMPONENT_ACTION_DIR="$TACHYON_UI_STATE_DIR/component-actions" +export TACHYON_UI_SUBSCRIPTION_ACTION_DIR="$TACHYON_UI_STATE_DIR/subscription-actions" latency_start="$( - FORKOP_BIN=/bin/true \ - FORKOP_LIB="$FORKOP_FILES/usr/lib" \ + TACHYON_BIN=/bin/true \ + TACHYON_LIB="$TACHYON_FILES/usr/lib" \ ui_ucode latency-test-async proxy_list main '["proxy-a","proxy-b"]' 5000 )" latency_job_id="$(printf '%s' "$latency_start" | sed -n 's/.*"job_id"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p')" [ -n "$latency_job_id" ] || fail "latency-test-async should return a job id" -latency_async_state="$FORKOP_UI_LATENCY_ACTION_DIR/$latency_job_id.json" +latency_async_state="$TACHYON_UI_LATENCY_ACTION_DIR/$latency_job_id.json" [ -f "$latency_async_state" ] || fail "latency-test-async should create a state file" JOB_STATE="$latency_async_state" node - <<'NODE' const fs = require("fs"); @@ -234,7 +234,7 @@ NODE job_id="$(ui_ucode service-action-begin-if-idle reload test)" [ -n "$job_id" ] || fail "service-action-begin-if-idle should create a job" -service_state="$FORKOP_UI_SERVICE_ACTION_DIR/$job_id.json" +service_state="$TACHYON_UI_SERVICE_ACTION_DIR/$job_id.json" [ -f "$service_state" ] || fail "service action state file should be created" assert_eq "reload" \ "$(ui_ucode active-service-action)" \ @@ -247,11 +247,11 @@ fi ui_ucode service-action-update-pid "$job_id" "$$" >/dev/null || fail "service-action-update-pid should update running job" -FORKOP_UI_SERVICE_ACTION_TIMEOUT_SECONDS=1 \ -FORKOP_UI_SERVICE_ACTION_SETTLE_SECONDS=0 \ -FORKOP_SERVICE_INIT=/bin/true \ -FORKOP_BIN=/bin/true \ -FORKOP_LIB="$FORKOP_FILES/usr/lib" \ +TACHYON_UI_SERVICE_ACTION_TIMEOUT_SECONDS=1 \ +TACHYON_UI_SERVICE_ACTION_SETTLE_SECONDS=0 \ +TACHYON_SERVICE_INIT=/bin/true \ +TACHYON_BIN=/bin/true \ +TACHYON_LIB="$TACHYON_FILES/usr/lib" \ ui_ucode service-action-finish-after-command reload "$job_id" 0 >/dev/null || fail "service-action-finish-after-command should spawn waiter without ucode declaration-order failure" @@ -272,8 +272,8 @@ if (value.running !== false || value.success !== true || value.message !== "done } NODE -component_job="$FORKOP_UI_COMPONENT_ACTION_DIR/component-1.json" -mkdir -p "$FORKOP_UI_COMPONENT_ACTION_DIR" +component_job="$TACHYON_UI_COMPONENT_ACTION_DIR/component-1.json" +mkdir -p "$TACHYON_UI_COMPONENT_ACTION_DIR" printf '%s\n' '{"running":true,"component":"sing_box","started_at":100}' >"$component_job" ui_ucode component-action-running-for sing_box >/dev/null || fail "component-action-running-for should detect running sing-box component action" diff --git a/tests/updates_due.sh b/tests/updates_due.sh index 931cb6c7..41144ac8 100644 --- a/tests/updates_due.sh +++ b/tests/updates_due.sh @@ -2,8 +2,8 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -UPDATES_UC="$ROOT_DIR/forkop/files/usr/lib/components/updates.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +UPDATES_UC="$ROOT_DIR/tachyon/files/usr/lib/components/updates.uc" fail() { printf 'FAIL: %s\n' "$1" >&2 @@ -22,7 +22,7 @@ assert_status() { } updates_ucode() { - ucode -L "$FORKOP_LIB" "$UPDATES_UC" "$@" + ucode -L "$TACHYON_LIB" "$UPDATES_UC" "$@" } if grep -n -E 'require\("uci"\)\.cursor|uci -q' "$UPDATES_UC" >/dev/null 2>&1; then @@ -83,11 +83,11 @@ assert_eq "0 0 * * *" \ "$(updates_ucode due-check-cron-schedule 86400)" \ "daily cron schedule" -assert_eq "*/30 * * * * /usr/bin/forkop list_update_if_due # list" \ - "$(updates_ucode list-update-cron-job 30m /usr/bin/forkop '# list')" \ +assert_eq "*/30 * * * * /usr/bin/tachyon list_update_if_due # list" \ + "$(updates_ucode list-update-cron-job 30m /usr/bin/tachyon '# list')" \ "list update cron job" -assert_eq "0 */2 * * * /usr/bin/forkop subscription_update_if_due # subscription" \ - "$(updates_ucode subscription-update-cron-job 7200 /usr/bin/forkop '# subscription')" \ +assert_eq "0 */2 * * * /usr/bin/tachyon subscription_update_if_due # subscription" \ + "$(updates_ucode subscription-update-cron-job 7200 /usr/bin/tachyon '# subscription')" \ "subscription update cron job" assert_eq $'error\trule3\tinvalid\nmin\t1800' \ "$(printf 'rule1\t2h\nrule2\t30m\nrule3\tinvalid\nrule4\t\n' | updates_ucode subscription-update-interval-plan)" \ @@ -95,10 +95,10 @@ assert_eq $'error\trule3\tinvalid\nmin\t1800' \ assert_eq $'min\t0' \ "$(printf 'rule1\t\n' | updates_ucode subscription-update-interval-plan)" \ "empty subscription interval plan" -if updates_ucode list-update-cron-job invalid /usr/bin/forkop '# list' >/dev/null 2>&1; then +if updates_ucode list-update-cron-job invalid /usr/bin/tachyon '# list' >/dev/null 2>&1; then fail "invalid list update interval should fail" fi -if updates_ucode subscription-update-cron-job 0 /usr/bin/forkop '# subscription' >/dev/null 2>&1; then +if updates_ucode subscription-update-cron-job 0 /usr/bin/tachyon '# subscription' >/dev/null 2>&1; then fail "invalid subscription update interval should fail" fi @@ -150,8 +150,8 @@ cat >"$WORK_DIR/cron-plan.json" <<'JSON' } JSON -assert_eq $'list\t*/30 * * * * /usr/bin/forkop list_update_if_due # list\nsubscription-error\tbad_sub\tbad\nsubscription\t*/45 * * * * /usr/bin/forkop subscription_update_if_due # subscription\ncomponent\t0 */2 * * * /usr/bin/forkop component_updates_if_due # component' \ - "$(updates_ucode cron-refresh-plan-fixture "$WORK_DIR/cron-plan.json" /usr/bin/forkop '# list' '# subscription' '# component')" \ +assert_eq $'list\t*/30 * * * * /usr/bin/tachyon list_update_if_due # list\nsubscription-error\tbad_sub\tbad\nsubscription\t*/45 * * * * /usr/bin/tachyon subscription_update_if_due # subscription\ncomponent\t0 */2 * * * /usr/bin/tachyon component_updates_if_due # component' \ + "$(updates_ucode cron-refresh-plan-fixture "$WORK_DIR/cron-plan.json" /usr/bin/tachyon '# list' '# subscription' '# component')" \ "cron refresh plan" grep -Fq 'fs.writefile(tmp, as_string(text)) == null' "$UPDATES_UC" || @@ -175,7 +175,7 @@ cat >"$WORK_DIR/cron-plan-list-disabled.json" <<'JSON' JSON assert_eq "list-disabled" \ - "$(updates_ucode cron-refresh-plan-fixture "$WORK_DIR/cron-plan-list-disabled.json" /usr/bin/forkop '# list' '# subscription' '# component')" \ + "$(updates_ucode cron-refresh-plan-fixture "$WORK_DIR/cron-plan-list-disabled.json" /usr/bin/tachyon '# list' '# subscription' '# component')" \ "disabled list cron plan" cat >"$WORK_DIR/cron-plan-invalid-list.json" <<'JSON' @@ -196,26 +196,26 @@ cat >"$WORK_DIR/cron-plan-invalid-list.json" <<'JSON' JSON status=0 -invalid_plan="$(updates_ucode cron-refresh-plan-fixture "$WORK_DIR/cron-plan-invalid-list.json" /usr/bin/forkop '# list' '# subscription' '# component')" || status="$?" +invalid_plan="$(updates_ucode cron-refresh-plan-fixture "$WORK_DIR/cron-plan-invalid-list.json" /usr/bin/tachyon '# list' '# subscription' '# component')" || status="$?" assert_eq 1 "$status" "invalid list cron plan status" assert_eq $'list-error\tbad' "$invalid_plan" "invalid list cron plan output" cat >"$WORK_DIR/existing.cron" <<'CRON' 0 1 * * * /bin/true # keep -* * * * * /usr/bin/forkop list_update_if_due # list -* * * * * /usr/bin/forkop subscription_update_if_due # subscription -* * * * * /usr/bin/forkop component_updates_if_due # component +* * * * * /usr/bin/tachyon list_update_if_due # list +* * * * * /usr/bin/tachyon subscription_update_if_due # subscription +* * * * * /usr/bin/tachyon component_updates_if_due # component CRON -updates_ucode refresh-cron-fixture "$WORK_DIR/cron-plan.json" "$WORK_DIR/existing.cron" /usr/bin/forkop '# list' '# subscription' '# component' >"$WORK_DIR/cron-apply.json" +updates_ucode refresh-cron-fixture "$WORK_DIR/cron-plan.json" "$WORK_DIR/existing.cron" /usr/bin/tachyon '# list' '# subscription' '# component' >"$WORK_DIR/cron-apply.json" node - "$WORK_DIR/cron-apply.json" <<'JS' const fs = require("fs"); const value = JSON.parse(fs.readFileSync(process.argv[2], "utf8")); const expected = [ "0 1 * * * /bin/true # keep", - "*/30 * * * * /usr/bin/forkop list_update_if_due # list", - "*/45 * * * * /usr/bin/forkop subscription_update_if_due # subscription", - "0 */2 * * * /usr/bin/forkop component_updates_if_due # component", + "*/30 * * * * /usr/bin/tachyon list_update_if_due # list", + "*/45 * * * * /usr/bin/tachyon subscription_update_if_due # subscription", + "0 */2 * * * /usr/bin/tachyon component_updates_if_due # component", "" ].join("\n"); if (value.crontab !== expected) { @@ -224,22 +224,22 @@ if (value.crontab !== expected) { } const messages = value.logs.map(item => item.message); if (!messages.includes("The cron job removed") || - !messages.includes("The cron job has been created: */30 * * * * /usr/bin/forkop list_update_if_due # list") || - !messages.includes("The subscription cron job has been created: */45 * * * * /usr/bin/forkop subscription_update_if_due # subscription") || - !messages.includes("The component update check cron job has been created: 0 */2 * * * /usr/bin/forkop component_updates_if_due # component")) { + !messages.includes("The cron job has been created: */30 * * * * /usr/bin/tachyon list_update_if_due # list") || + !messages.includes("The subscription cron job has been created: */45 * * * * /usr/bin/tachyon subscription_update_if_due # subscription") || + !messages.includes("The component update check cron job has been created: 0 */2 * * * /usr/bin/tachyon component_updates_if_due # component")) { console.error("unexpected cron apply logs", JSON.stringify(value.logs)); process.exit(1); } JS status=0 -updates_ucode refresh-cron-fixture "$WORK_DIR/cron-plan-invalid-list.json" "$WORK_DIR/existing.cron" /usr/bin/forkop '# list' '# subscription' '# component' >"$WORK_DIR/cron-apply-invalid.json" || status="$?" +updates_ucode refresh-cron-fixture "$WORK_DIR/cron-plan-invalid-list.json" "$WORK_DIR/existing.cron" /usr/bin/tachyon '# list' '# subscription' '# component' >"$WORK_DIR/cron-apply-invalid.json" || status="$?" assert_eq 1 "$status" "invalid cron apply status" node - "$WORK_DIR/cron-apply-invalid.json" <<'JS' const fs = require("fs"); const value = JSON.parse(fs.readFileSync(process.argv[2], "utf8")); if (value.crontab !== "0 1 * * * /bin/true # keep\n") { - console.error("invalid plan should remove old forkop cron jobs only", JSON.stringify(value.crontab)); + console.error("invalid plan should remove old tachyon cron jobs only", JSON.stringify(value.crontab)); process.exit(1); } if (!value.logs.some(item => item.level === "error" && item.message === "Invalid update_interval value: bad")) { diff --git a/tests/urltest_groups.sh b/tests/urltest_groups.sh index 62bdb378..f9287c33 100644 --- a/tests/urltest_groups.sh +++ b/tests/urltest_groups.sh @@ -2,10 +2,10 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -PARSER_UC="$FORKOP_LIB/subscription/parser.uc" -GENERATOR_UC="$FORKOP_LIB/singbox/generator.uc" -CACHE_UC="$FORKOP_LIB/subscription/cache.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +PARSER_UC="$TACHYON_LIB/subscription/parser.uc" +GENERATOR_UC="$TACHYON_LIB/singbox/generator.uc" +CACHE_UC="$TACHYON_LIB/subscription/cache.uc" WORK_DIR="$(mktemp -d)" cleanup() { @@ -21,7 +21,7 @@ fail() { normalize_subscription() { local input="$1" local output="$2" - ucode -L "$FORKOP_LIB" "$PARSER_UC" normalize-content "$input" "$output" + ucode -L "$TACHYON_LIB" "$PARSER_UC" normalize-content "$input" "$output" } prepare_subscription_cache() { @@ -42,7 +42,7 @@ generate_config() { local output="$2" mkdir -p "${output}.section-cache" TMP_SUBSCRIPTION_FOLDER="$WORK_DIR/subscriptions" \ - ucode -L "$FORKOP_LIB" "$GENERATOR_UC" generate-config-fixture \ + ucode -L "$TACHYON_LIB" "$GENERATOR_UC" generate-config-fixture \ "$fixture" "$output" "127.0.0.1" } @@ -286,7 +286,7 @@ if (!reveal_selector || length(reveal_selector.outbounds || []) != 4) ' "$xray_config" "$xray_config.section-cache/proxy.json" "$xray_reveal_urltest_config" "$xray_group_name_filter_config" || fail "xray generated URLTest behavior" xray_metadata="$WORK_DIR/xray-ui-outbound-metadata.json" -ucode -L "$FORKOP_LIB" "$CACHE_UC" get-outbound-metadata "$xray_config.section-cache" proxy "$WORK_DIR/missing-outbound-metadata.json" >"$xray_metadata" +ucode -L "$TACHYON_LIB" "$CACHE_UC" get-outbound-metadata "$xray_config.section-cache" proxy "$WORK_DIR/missing-outbound-metadata.json" >"$xray_metadata" ucode -e ' let fs = require("fs"); @@ -356,8 +356,8 @@ let value = json(fs.readfile(ARGV[0])); let flags = {}; for (let outbound in value.outbounds || []) flags[outbound.tag] = { - allow: outbound.__forkop_allow_group === true, - hidden: outbound.__forkop_hidden === true + allow: outbound.__tachyon_allow_group === true, + hidden: outbound.__tachyon_hidden === true }; if (!flags["Native Group"].allow) die("native sing-box URLTest group was not allowed\n"); @@ -591,7 +591,7 @@ if (!contains(candidates, "Native A") || !contains(candidates, "Detour Only")) ' "$singbox_config" "$singbox_config.section-cache/proxy.json" "$singbox_reveal_urltest_config" "$singbox_reveal_detour_config" || fail "native sing-box generated URLTest behavior" singbox_metadata="$WORK_DIR/singbox-ui-outbound-metadata.json" -ucode -L "$FORKOP_LIB" "$CACHE_UC" get-outbound-metadata "$singbox_config.section-cache" proxy "$WORK_DIR/missing-outbound-metadata.json" >"$singbox_metadata" +ucode -L "$TACHYON_LIB" "$CACHE_UC" get-outbound-metadata "$singbox_config.section-cache" proxy "$WORK_DIR/missing-outbound-metadata.json" >"$singbox_metadata" ucode -e ' let fs = require("fs"); diff --git a/tests/urltest_interrupt.sh b/tests/urltest_interrupt.sh index 41e0885e..28261056 100644 --- a/tests/urltest_interrupt.sh +++ b/tests/urltest_interrupt.sh @@ -2,7 +2,7 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" WORK_DIR="$(mktemp -d)" cleanup() { @@ -69,7 +69,7 @@ JSON output="$WORK_DIR/config.json" mkdir -p "$output.section-cache" -ucode -L "$FORKOP_LIB" "$FORKOP_LIB/singbox/generator.uc" generate-config-fixture \ +ucode -L "$TACHYON_LIB" "$TACHYON_LIB/singbox/generator.uc" generate-config-fixture \ "$WORK_DIR/fixture.json" "$output" "127.0.0.1" urltest_count="$(ucode -e ' @@ -148,7 +148,7 @@ JSON multi_output="$WORK_DIR/multi-config.json" mkdir -p "$multi_output.section-cache" -ucode -L "$FORKOP_LIB" "$FORKOP_LIB/singbox/generator.uc" generate-config-fixture \ +ucode -L "$TACHYON_LIB" "$TACHYON_LIB/singbox/generator.uc" generate-config-fixture \ "$WORK_DIR/multi-fixture.json" "$multi_output" "127.0.0.1" ucode -e ' @@ -222,7 +222,7 @@ JSON hide_added_output="$WORK_DIR/hide-added-config.json" mkdir -p "$hide_added_output.section-cache" -ucode -L "$FORKOP_LIB" "$FORKOP_LIB/singbox/generator.uc" generate-config-fixture \ +ucode -L "$TACHYON_LIB" "$TACHYON_LIB/singbox/generator.uc" generate-config-fixture \ "$WORK_DIR/hide-added-fixture.json" "$hide_added_output" "127.0.0.1" ucode -e ' diff --git a/tests/zapret_runtime_owner.sh b/tests/zapret_runtime_owner.sh index 8b3653f8..1f994b96 100644 --- a/tests/zapret_runtime_owner.sh +++ b/tests/zapret_runtime_owner.sh @@ -2,32 +2,32 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_BIN="$ROOT_DIR/forkop/files/usr/bin/forkop" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -CLI_UC="$FORKOP_BIN" -LIFECYCLE_UC="$FORKOP_LIB/service/lifecycle.uc" -ZAPRET_RUNTIME="$FORKOP_LIB/providers/zapret/runtime.uc" -ZAPRET2_RUNTIME="$FORKOP_LIB/providers/zapret2/runtime.uc" -ZAPRET_COMMON="$FORKOP_LIB/providers/zapret/common.uc" -ZAPRET2_COMMON="$FORKOP_LIB/providers/zapret2/common.uc" -NFQUEUE_RUNTIME="$FORKOP_LIB/providers/nfqueue/runtime.uc" -NFQUEUE_CHECK="$FORKOP_LIB/providers/nfqueue/check.uc" -NFQUEUE_VALIDATOR="$FORKOP_LIB/providers/nfqueue/validator.uc" -ZAPRET2_CHECK="$FORKOP_LIB/providers/zapret2/check.uc" -ZAPRET2_VALIDATOR="$FORKOP_LIB/providers/zapret2/validator.uc" +TACHYON_BIN="$ROOT_DIR/tachyon/files/usr/bin/tachyon" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +CLI_UC="$TACHYON_BIN" +LIFECYCLE_UC="$TACHYON_LIB/service/lifecycle.uc" +ZAPRET_RUNTIME="$TACHYON_LIB/providers/zapret/runtime.uc" +ZAPRET2_RUNTIME="$TACHYON_LIB/providers/zapret2/runtime.uc" +ZAPRET_COMMON="$TACHYON_LIB/providers/zapret/common.uc" +ZAPRET2_COMMON="$TACHYON_LIB/providers/zapret2/common.uc" +NFQUEUE_RUNTIME="$TACHYON_LIB/providers/nfqueue/runtime.uc" +NFQUEUE_CHECK="$TACHYON_LIB/providers/nfqueue/check.uc" +NFQUEUE_VALIDATOR="$TACHYON_LIB/providers/nfqueue/validator.uc" +ZAPRET2_CHECK="$TACHYON_LIB/providers/zapret2/check.uc" +ZAPRET2_VALIDATOR="$TACHYON_LIB/providers/zapret2/validator.uc" fail() { printf 'FAIL: %s\n' "$1" >&2 exit 1 } -[ ! -e "$FORKOP_LIB/zapret.sh" ] || +[ ! -e "$TACHYON_LIB/zapret.sh" ] || fail "zapret.sh shell owner must be removed" -[ ! -e "$FORKOP_LIB/zapret2.sh" ] || +[ ! -e "$TACHYON_LIB/zapret2.sh" ] || fail "zapret2.sh shell owner must be removed" -grep -Fq '#!/usr/bin/ucode' "$FORKOP_BIN" || - fail "forkop entrypoint must be a direct ucode executable" +grep -Fq '#!/usr/bin/ucode' "$TACHYON_BIN" || + fail "tachyon entrypoint must be a direct ucode executable" grep -Fq 'service/lifecycle.uc' "$CLI_UC" || fail "service/cli.uc must dispatch lifecycle orchestration through service/lifecycle.uc" grep -Fq 'providers/zapret/runtime.uc' "$LIFECYCLE_UC" || @@ -64,21 +64,21 @@ if grep -n -E 'function (start_runtime|stop_runtime|status_json|create_nft_rules fail "provider common modules must stay thin config wrappers, not runtime engines" fi if grep -R -n -E 'providers/zapret/runtime\.uc" (start-runtime|stop-runtime|status|check|installed|package-installed|package-version|enabled-rule-count) zapret2' \ - "$FORKOP_BIN" "$FORKOP_LIB" --include='*.sh' >/dev/null 2>&1; then + "$TACHYON_BIN" "$TACHYON_LIB" --include='*.sh' >/dev/null 2>&1; then fail "zapret2 must not be multiplexed through providers/zapret/runtime.uc" fi -if grep -R -n -E 'providers\.zapret\.|providers/zapret/' "$FORKOP_LIB/providers/zapret2" >/dev/null 2>&1; then +if grep -R -n -E 'providers\.zapret\.|providers/zapret/' "$TACHYON_LIB/providers/zapret2" >/dev/null 2>&1; then fail "zapret2 provider modules must not import or execute providers/zapret modules" fi if grep -n 'zapret2' "$ZAPRET_COMMON" >/dev/null 2>&1; then fail "providers/zapret/common.uc must not contain zapret2 ownership" fi if grep -R -n -E 'start_zapret2?_runtime|stop_zapret2?_runtime|get_zapret2?_status_json|check_zapret2?_runtime_json|create_zapret2?_nft_rules|validate_rule_nfqws2?_opt|has_enabled_zapret2?_rules|get_zapret2?_rule_' \ - "$FORKOP_BIN" "$FORKOP_LIB" --include='*.sh' >/dev/null 2>&1; then + "$TACHYON_BIN" "$TACHYON_LIB" --include='*.sh' >/dev/null 2>&1; then fail "zapret runtime shell symbols must not remain" fi if grep -R -n -E 'is_zapret2?_installed|get_zapret2?_package_version' \ - "$FORKOP_BIN" "$FORKOP_LIB" --include='*.sh' >/dev/null 2>&1; then + "$TACHYON_BIN" "$TACHYON_LIB" --include='*.sh' >/dev/null 2>&1; then fail "zapret installed/version shell predicates must not remain" fi if grep -n -E 'require\("uci"\)\.cursor|uci -q|"uci", "-q"|command_output\(command_from_args\(\[ "uci"' "$NFQUEUE_RUNTIME" "$ZAPRET_COMMON" "$ZAPRET2_COMMON" >/dev/null 2>&1; then @@ -119,7 +119,7 @@ grep -Fq 'providers/zapret2/check.uc' "$ZAPRET2_COMMON" || grep -Fq 'providers.zapret2.validator' "$ZAPRET2_COMMON" || fail "providers/zapret2/common.uc must use its own validator module" -status_json="$(FORKOP_CONFIG_NAME=forkop-definitely-missing ucode -L "$FORKOP_LIB" "$ZAPRET_RUNTIME" status)" +status_json="$(TACHYON_CONFIG_NAME=tachyon-definitely-missing ucode -L "$TACHYON_LIB" "$ZAPRET_RUNTIME" status)" JSON_VALUE="$status_json" node - <<'NODE' const value = JSON.parse(process.env.JSON_VALUE); if (value.configured !== false || value.enabled_rule_count !== 0 || typeof value.provider_path !== 'string') { @@ -128,7 +128,7 @@ if (value.configured !== false || value.enabled_rule_count !== 0 || typeof value } NODE -check_json="$(ucode -L "$FORKOP_LIB" "$ZAPRET2_RUNTIME" check)" +check_json="$(ucode -L "$TACHYON_LIB" "$ZAPRET2_RUNTIME" check)" JSON_VALUE="$check_json" node - <<'NODE' const value = JSON.parse(process.env.JSON_VALUE); if (!Object.prototype.hasOwnProperty.call(value, 'zapret2_installed') || @@ -139,14 +139,14 @@ if (!Object.prototype.hasOwnProperty.call(value, 'zapret2_installed') || } NODE -ucode -L "$FORKOP_LIB" -- "$ZAPRET2_VALIDATOR" validate-json nfqws2 '--name forkop --intercept=1' >/dev/null || +ucode -L "$TACHYON_LIB" -- "$ZAPRET2_VALIDATOR" validate-json nfqws2 '--name tachyon --intercept=1' >/dev/null || fail "providers/zapret2/validator.uc must validate nfqws2 strategies" -if ucode -L "$FORKOP_LIB" -- "$ZAPRET2_VALIDATOR" validate-json nfqws '--dpi-desync=fake' >/dev/null 2>&1; then +if ucode -L "$TACHYON_LIB" -- "$ZAPRET2_VALIDATOR" validate-json nfqws '--dpi-desync=fake' >/dev/null 2>&1; then fail "providers/zapret2/validator.uc must not validate nfqws strategies" fi printf 'table inet x { chain y { queue num 4301 bypass } }\n' | - ucode -L "$FORKOP_LIB" "$ZAPRET2_CHECK" nft-queue-overlap ForkopTable 4300 4555 >/dev/null || + ucode -L "$TACHYON_LIB" "$ZAPRET2_CHECK" nft-queue-overlap TachyonTable 4300 4555 >/dev/null || fail "providers/zapret2/check.uc must own zapret2 queue overlap checks" printf 'zapret runtime ownership checks passed\n' diff --git a/tests/zapret_validator.sh b/tests/zapret_validator.sh index 8c3e48cc..0c20ee17 100644 --- a/tests/zapret_validator.sh +++ b/tests/zapret_validator.sh @@ -2,9 +2,9 @@ set -eo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -FORKOP_LIB="$ROOT_DIR/forkop/files/usr/lib" -VALIDATOR="$ROOT_DIR/forkop/files/usr/lib/providers/zapret/validator.uc" -ZAPRET2_VALIDATOR="$ROOT_DIR/forkop/files/usr/lib/providers/zapret2/validator.uc" +TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib" +VALIDATOR="$ROOT_DIR/tachyon/files/usr/lib/providers/zapret/validator.uc" +ZAPRET2_VALIDATOR="$ROOT_DIR/tachyon/files/usr/lib/providers/zapret2/validator.uc" WORK_DIR="$(mktemp -d)" cleanup() { @@ -43,42 +43,42 @@ assert_json_field() { [ "$actual" = "$expected" ] || fail "expected $field=$expected, got $actual" } -valid_nfqws="$(ucode -L "$FORKOP_LIB" -- "$VALIDATOR" validate-json nfqws '--dpi-desync=fake --dpi-desync-repeats 2')" +valid_nfqws="$(ucode -L "$TACHYON_LIB" -- "$VALIDATOR" validate-json nfqws '--dpi-desync=fake --dpi-desync-repeats 2')" assert_json_field "$valid_nfqws" valid true -configured="$(ucode -L "$FORKOP_LIB" -- "$VALIDATOR" strategy-or-default "$(printf -- '--dpi-desync=fake\t--dpi-desync-repeats 2')" '--default')" +configured="$(ucode -L "$TACHYON_LIB" -- "$VALIDATOR" strategy-or-default "$(printf -- '--dpi-desync=fake\t--dpi-desync-repeats 2')" '--default')" [ "$configured" = "--dpi-desync=fake --dpi-desync-repeats 2" ] || fail "configured zapret strategy should be normalized, got '$configured'" -defaulted="$(ucode -L "$FORKOP_LIB" -- "$VALIDATOR" strategy-or-default "" "$(printf -- '--default\t1')")" +defaulted="$(ucode -L "$TACHYON_LIB" -- "$VALIDATOR" strategy-or-default "" "$(printf -- '--default\t1')")" [ "$defaulted" = "--default 1" ] || fail "empty zapret strategy should use normalized default, got '$defaulted'" -if invalid_nfqws="$(ucode -L "$FORKOP_LIB" -- "$VALIDATOR" validate-json nfqws '--hostlist domains.txt' 2>/dev/null)"; then +if invalid_nfqws="$(ucode -L "$TACHYON_LIB" -- "$VALIDATOR" validate-json nfqws '--hostlist domains.txt' 2>/dev/null)"; then fail "hostlist selection should be rejected for nfqws" fi assert_json_field "$invalid_nfqws" valid false assert_json_field "$invalid_nfqws" needle --hostlist -if ucode -L "$FORKOP_LIB" -- "$VALIDATOR" validate nfqws '--qnum=200' >/tmp/zapret-validator.out 2>/dev/null; then +if ucode -L "$TACHYON_LIB" -- "$VALIDATOR" validate nfqws '--qnum=200' >/tmp/zapret-validator.out 2>/dev/null; then fail "qnum override should be rejected for nfqws" fi -grep -q 'NFQUEUE number is assigned by Forkop' /tmp/zapret-validator.out || +grep -q 'NFQUEUE number is assigned by Tachyon' /tmp/zapret-validator.out || fail "qnum rejection should explain ownership" -valid_nfqws2="$(ucode -L "$FORKOP_LIB" -- "$ZAPRET2_VALIDATOR" validate-json nfqws2 '--name forkop --intercept=1')" +valid_nfqws2="$(ucode -L "$TACHYON_LIB" -- "$ZAPRET2_VALIDATOR" validate-json nfqws2 '--name tachyon --intercept=1')" assert_json_field "$valid_nfqws2" valid true -if invalid_nfqws2="$(ucode -L "$FORKOP_LIB" -- "$ZAPRET2_VALIDATOR" validate-json nfqws2 '--intercept=0' 2>/dev/null)"; then +if invalid_nfqws2="$(ucode -L "$TACHYON_LIB" -- "$ZAPRET2_VALIDATOR" validate-json nfqws2 '--intercept=0' 2>/dev/null)"; then fail "disabled nfqws2 intercept should be rejected" fi assert_json_field "$invalid_nfqws2" valid false assert_json_field "$invalid_nfqws2" needle --intercept -if ucode -L "$FORKOP_LIB" -- "$VALIDATOR" validate-json nfqws2 '--name forkop --intercept=1' >/dev/null 2>&1; then +if ucode -L "$TACHYON_LIB" -- "$VALIDATOR" validate-json nfqws2 '--name tachyon --intercept=1' >/dev/null 2>&1; then fail "zapret validator must not own nfqws2 validation" fi -if ucode -L "$FORKOP_LIB" -- "$ZAPRET2_VALIDATOR" validate-json nfqws '--dpi-desync=fake' >/dev/null 2>&1; then +if ucode -L "$TACHYON_LIB" -- "$ZAPRET2_VALIDATOR" validate-json nfqws '--dpi-desync=fake' >/dev/null 2>&1; then fail "zapret2 validator must not own nfqws validation" fi @@ -94,11 +94,11 @@ let invalid_nfqws = validator.validate_strategy("nfqws", "--hostlist domains.txt if (invalid_nfqws.valid || invalid_nfqws.needle != "--hostlist") exit(1); -let valid_nfqws2 = zapret2_validator.validate_strategy("nfqws2", "--name forkop --intercept=1", ""); +let valid_nfqws2 = zapret2_validator.validate_strategy("nfqws2", "--name tachyon --intercept=1", ""); if (!valid_nfqws2.valid) exit(1); -if (validator.validate_strategy("nfqws2", "--name forkop --intercept=1", "").valid) +if (validator.validate_strategy("nfqws2", "--name tachyon --intercept=1", "").valid) exit(1); if (zapret2_validator.validate_strategy("nfqws", "--dpi-desync=fake", "").valid) exit(1); @@ -107,6 +107,6 @@ if (validator.strategy_or_default("", "--default\t1") != "--default 1") exit(1); UCODE -ucode -L "$FORKOP_LIB" "$WORK_DIR/require-zapret-validator.uc" +ucode -L "$TACHYON_LIB" "$WORK_DIR/require-zapret-validator.uc" printf 'Zapret validator checks passed\n'