diff --git a/package-lock.json b/package-lock.json index f68a62e..cf8166c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "rknboost", - "version": "0.5.3", + "version": "0.5.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "rknboost", - "version": "0.5.3", + "version": "0.5.4", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 84ef5b8..6bc9c8e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rknboost", - "version": "0.5.3", + "version": "0.5.4", "description": "Кроссплатформенное десктопное приложение на Electron + React + TypeScript", "main": "./out/main/index.js", "desktopName": "rknboost.desktop", diff --git a/resources/linux-helper/rknboost-helper.sh b/resources/linux-helper/rknboost-helper.sh index 712b427..d4a62d5 100755 --- a/resources/linux-helper/rknboost-helper.sh +++ b/resources/linux-helper/rknboost-helper.sh @@ -23,6 +23,7 @@ CONFIG="$RUN_DIR/strategy.cfg" ERRLOG="$RUN_DIR/nfqws.err" TABLE_FAMILY=inet TABLE_NAME=rknboost +# Держать в синхроне с NFQUEUE_NUM в nfqws.linux.ts (используется там же для --dry-run). QUEUE_NUM=220 FW_MARK=0x40000000 diff --git a/src/main/zapret/nfqws.linux.ts b/src/main/zapret/nfqws.linux.ts index c6990db..fe99c92 100644 --- a/src/main/zapret/nfqws.linux.ts +++ b/src/main/zapret/nfqws.linux.ts @@ -78,18 +78,30 @@ export async function stageRuntime(): Promise { } /** - * `nfqws --dry-run @<файл>` — проверяет только аргументы фильтра, root не нужен (в отличие - * от рабочего запуска демона). Запускаем бинарник из сборки напрямую: dry-run идёт от uid + * Номер очереди NFQUEUE — держать в синхроне с `QUEUE_NUM` в `rknboost-helper.sh` + * (там же и объяснение выбора числа). В TS он нужен только для `--dry-run` ниже: сам + * помощник получает его не отсюда, а как захардкоженное значение в своём коде. + */ +const NFQUEUE_NUM = 220 + +/** + * `nfqws --dry-run @<файл>` — проверяет аргументы фильтра, root не нужен (в отличие от + * рабочего запуска демона). Запускаем бинарник из сборки напрямую: dry-run идёт от uid * самого приложения, а не root, так что FUSE-примонтированный AppImage тут не помеха — - * ограничение касается только `pkexec` (см. linuxStagingDir()). Дословный аналог - * `Win32Engine['dryRun']`. + * ограничение касается только `pkexec` (см. linuxStagingDir()). + * + * В отличие от `Win32Engine['dryRun']` (там `winws.exe --dry-run @file` без доп. флагов + * достаточно) nfqws требует `--qnum` даже для проверки — «Need queue number (--qnum)», + * даже когда реальная очередь не открывается. Значение то же, что использует помощник + * при настоящем запуске: раз номер не совпадёт — `nft`-правила и демон всё равно будут + * рассинхронизированы, но сам факт валидности остальных аргументов dry-run проверяет верно. */ export async function dryRun(configBody: string): Promise { const dir = await mkdtemp(join(tmpdir(), 'rknboost-dryrun-')) const configPath = join(dir, 'dry-run.cfg') try { await writeFile(configPath, configBody, 'utf8') - await run(nfqwsPath(), ['--dry-run', `@${configPath}`]) + await run(nfqwsPath(), ['--dry-run', `--qnum=${NFQUEUE_NUM}`, `@${configPath}`]) } catch (error) { const message = error instanceof Error ? error.message : String(error) throw new Error(`Стратегия содержит недопустимые параметры nfqws: ${message}`, {