Make zapret optional and handle missing package gracefully

This commit is contained in:
ushan0v
2026-04-11 21:35:06 +03:00
parent 1e50faa471
commit 59fd93bb86
19 changed files with 1182 additions and 560 deletions
+1 -1
View File
@@ -28,4 +28,4 @@ sh <(wget -O - https://raw.githubusercontent.com/ushan0v/podkop-plus/main/instal
- ручное управление очередью и fwmark: `--qnum`, `--dpi-desync-fwmark`;
- режимы, которые ломают lifecycle процесса: `--daemon`;
- режимы, которые не должны быть итоговой стратегией запуска: `--dry-run`, `--version`;
- внешние конфиги вида `@file` или `$file`, которые обходят встроенную валидацию и управление очередями.
- внешние конфиги вида `@file` или `$file`, которые обходят встроенную валидацию и управление очередями.
+187 -131
View File
@@ -5,6 +5,13 @@
"places": [
"src/podkop/tabs/dashboard/initController.ts:345",
"src/podkop/tabs/dashboard/initController.ts:356",
"src/podkop/tabs/dashboard/initController.ts:369"
]
},
{
"call": "✘ Not installed",
"key": "✘ Not installed",
"places": [
"src/podkop/tabs/dashboard/initController.ts:367"
]
},
@@ -14,7 +21,7 @@
"places": [
"src/podkop/tabs/dashboard/initController.ts:346",
"src/podkop/tabs/dashboard/initController.ts:357",
"src/podkop/tabs/dashboard/initController.ts:368"
"src/podkop/tabs/dashboard/initController.ts:370"
]
},
{
@@ -28,7 +35,7 @@
"call": "A latency-tested group of proxy URLs for this section",
"key": "A latency-tested group of proxy URLs for this section",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1551"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1700"
]
},
{
@@ -42,15 +49,15 @@
"call": "A manual group of proxy URLs for this section",
"key": "A manual group of proxy URLs for this section",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1533"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1682"
]
},
{
"call": "Action",
"key": "Action",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1401",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1426"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1524",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1556"
]
},
{
@@ -71,7 +78,7 @@
"call": "Add URLs or local paths to .srs lists",
"key": "Add URLs or local paths to .srs lists",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1935"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:2084"
]
},
{
@@ -100,21 +107,21 @@
"key": "Applicable for SOCKS and Shadowsocks links",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:170",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1646"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1795"
]
},
{
"call": "At least one valid domain must be specified.",
"key": "At least one valid domain must be specified.",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:681"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:834"
]
},
{
"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-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:692"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:845"
]
},
{
@@ -135,7 +142,7 @@
"call": "Backend validation failed: %s",
"key": "Backend validation failed: %s",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:783"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:936"
]
},
{
@@ -145,6 +152,14 @@
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/ruleset.js:21"
]
},
{
"call": "Block",
"key": "Block",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:229",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:262"
]
},
{
"call": "Bootsrap DNS",
"key": "Bootsrap DNS",
@@ -177,7 +192,7 @@
"call": "Built-in rule sets",
"key": "Built-in rule sets",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1840"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1989"
]
},
{
@@ -228,7 +243,6 @@
"call": "Checks failed",
"key": "Checks failed",
"places": [
"src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:38",
"src/podkop/tabs/diagnostic/helpers/getMeta.ts:26"
]
},
@@ -236,7 +250,8 @@
"call": "Checks passed",
"key": "Checks passed",
"places": [
"src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:38",
"src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:40",
"src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:82",
"src/podkop/tabs/diagnostic/helpers/getMeta.ts:13"
]
},
@@ -265,7 +280,7 @@
"call": "Conditions",
"key": "Conditions",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1389"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1512"
]
},
{
@@ -286,14 +301,14 @@
"call": "Connection",
"key": "Connection",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1492"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1637"
]
},
{
"call": "Connection Type",
"key": "Connection Type",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1475"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1620"
]
},
{
@@ -301,7 +316,7 @@
"key": "Connection URL",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:19",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1478"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1623"
]
},
{
@@ -408,7 +423,7 @@
"key": "DNS over HTTPS (DoH)",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:227",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1711",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1860",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/settings.js:15"
]
},
@@ -417,7 +432,7 @@
"key": "DNS over TLS (DoT)",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:228",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1712",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1861",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/settings.js:16"
]
},
@@ -425,7 +440,7 @@
"call": "DNS protocol",
"key": "DNS protocol",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1709"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1858"
]
},
{
@@ -453,7 +468,7 @@
"call": "DNS server",
"key": "DNS server",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1727"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1876"
]
},
{
@@ -482,21 +497,21 @@
"call": "Domain keyword",
"key": "Domain keyword",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1810"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1959"
]
},
{
"call": "Domain regex",
"key": "Domain regex",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1817"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1966"
]
},
{
"call": "Domains",
"key": "Domains",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1782"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1931"
]
},
{
@@ -567,9 +582,9 @@
"call": "Duplicate value",
"key": "Duplicate value",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:248",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:263",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:283"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:367",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:382",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:402"
]
},
{
@@ -578,7 +593,7 @@
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:8",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/ruleset.js:8",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1391"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1514"
]
},
{
@@ -592,7 +607,7 @@
"call": "Enable a dedicated DNS resolver when this section uses an interface",
"key": "Enable a dedicated DNS resolver when this section uses an interface",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1698"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1847"
]
},
{
@@ -606,7 +621,7 @@
"call": "Enable Mixed Proxy",
"key": "Enable Mixed Proxy",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1749"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1898"
]
},
{
@@ -635,7 +650,7 @@
"key": "Enter a complete sing-box outbound object",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:52",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1514"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1660"
]
},
{
@@ -643,7 +658,7 @@
"key": "Every 3 minutes",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:103",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1572"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1721"
]
},
{
@@ -651,7 +666,7 @@
"key": "Every 30 seconds",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:101",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1570"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1719"
]
},
{
@@ -659,7 +674,7 @@
"key": "Every 5 minutes",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:104",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1573"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1722"
]
},
{
@@ -667,14 +682,14 @@
"key": "Every minute",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:102",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1571"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1720"
]
},
{
"call": "Exact full domain",
"key": "Exact full domain",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1796"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1945"
]
},
{
@@ -702,14 +717,14 @@
"call": "Expose this section as a local HTTP+SOCKS proxy",
"key": "Expose this section as a local HTTP+SOCKS proxy",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1750"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1899"
]
},
{
"call": "External nfqws config files bypass Podkop Plus queue management and explicit validation.",
"key": "External nfqws config files bypass Podkop Plus queue management and explicit validation.",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:844"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:997"
]
},
{
@@ -723,12 +738,12 @@
"call": "Failed to execute!",
"key": "Failed to execute!",
"places": [
"src/podkop/tabs/diagnostic/initController.ts:250",
"src/podkop/tabs/diagnostic/initController.ts:254",
"src/podkop/tabs/diagnostic/initController.ts:300",
"src/podkop/tabs/diagnostic/initController.ts:304",
"src/podkop/tabs/diagnostic/initController.ts:341",
"src/podkop/tabs/diagnostic/initController.ts:345"
"src/podkop/tabs/diagnostic/initController.ts:251",
"src/podkop/tabs/diagnostic/initController.ts:255",
"src/podkop/tabs/diagnostic/initController.ts:301",
"src/podkop/tabs/diagnostic/initController.ts:305",
"src/podkop/tabs/diagnostic/initController.ts:342",
"src/podkop/tabs/diagnostic/initController.ts:346"
]
},
{
@@ -757,7 +772,7 @@
"call": "Global check",
"key": "Global check",
"places": [
"src/podkop/tabs/diagnostic/initController.ts:245"
"src/podkop/tabs/diagnostic/initController.ts:246"
]
},
{
@@ -771,7 +786,7 @@
"call": "How to configure the proxy connection for this section",
"key": "How to configure the proxy connection for this section",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1476"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1621"
]
},
{
@@ -787,8 +802,8 @@
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:23",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:179",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1482",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1657"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1627",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1806"
]
},
{
@@ -950,7 +965,7 @@
"call": "Invalid port number. Must be between 1 and 65535",
"key": "Invalid port number. Must be between 1 and 65535",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1777",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1926",
"src/validators/validateShadowsocksUrl.ts:85"
]
},
@@ -958,7 +973,7 @@
"call": "Invalid regular expression",
"key": "Invalid regular expression",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:191"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:310"
]
},
{
@@ -1134,7 +1149,7 @@
"call": "IPs",
"key": "IPs",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1789"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1938"
]
},
{
@@ -1148,14 +1163,14 @@
"call": "Keyword must not contain spaces",
"key": "Keyword must not contain spaces",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:201"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:320"
]
},
{
"call": "Latest",
"key": "Latest",
"places": [
"src/podkop/tabs/diagnostic/initController.ts:501"
"src/podkop/tabs/diagnostic/initController.ts:502"
]
},
{
@@ -1197,42 +1212,42 @@
"call": "Match destination IPs or subnets",
"key": "Match destination IPs or subnets",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1790"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1939"
]
},
{
"call": "Match domains containing a substring",
"key": "Match domains containing a substring",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1811"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1960"
]
},
{
"call": "Match domains including all subdomains",
"key": "Match domains including all subdomains",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1783"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1932"
]
},
{
"call": "Match domains using a regular expression",
"key": "Match domains using a regular expression",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1818"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1967"
]
},
{
"call": "Match only one exact full domain name",
"key": "Match only one exact full domain name",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1797"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1946"
]
},
{
"call": "Match source IPs or subnets",
"key": "Match source IPs or subnets",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1825"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1974"
]
},
{
@@ -1240,7 +1255,7 @@
"key": "Maximum response time delta in milliseconds",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:114",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1584"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1733"
]
},
{
@@ -1254,7 +1269,7 @@
"call": "Mixed Proxy Port",
"key": "Mixed Proxy Port",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1761"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1910"
]
},
{
@@ -1269,21 +1284,21 @@
"key": "Must be a number in the range of 50 - 1000",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:136",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1606"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1755"
]
},
{
"call": "NFQWS Strategy",
"key": "NFQWS Strategy",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1441"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1586"
]
},
{
"call": "NFQWS strategy cannot be empty",
"key": "NFQWS strategy cannot be empty",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:974"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1127"
]
},
{
@@ -1293,6 +1308,13 @@
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:105"
]
},
{
"call": "No rules use zapret",
"key": "No rules use zapret",
"places": [
"src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:45"
]
},
{
"call": "Node Type",
"key": "Node Type",
@@ -1307,6 +1329,13 @@
"src/podkop/tabs/diagnostic/partials/renderCheckSection.ts:189"
]
},
{
"call": "not installed",
"key": "not installed",
"places": [
"src/podkop/tabs/diagnostic/initController.ts:523"
]
},
{
"call": "Not responding",
"key": "Not responding",
@@ -1320,12 +1349,12 @@
"call": "Not running",
"key": "Not running",
"places": [
"src/podkop/tabs/diagnostic/diagnostic.store.ts:56",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:64",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:72",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:80",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:88",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:96"
"src/podkop/tabs/diagnostic/diagnostic.store.ts:57",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:65",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:73",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:81",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:89",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:97"
]
},
{
@@ -1353,7 +1382,7 @@
"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-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1052"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1205"
]
},
{
@@ -1362,15 +1391,15 @@
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:22",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:51",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1481",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1513"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1626",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1659"
]
},
{
"call": "Outdated",
"key": "Outdated",
"places": [
"src/podkop/tabs/diagnostic/initController.ts:491"
"src/podkop/tabs/diagnostic/initController.ts:492"
]
},
{
@@ -1419,12 +1448,12 @@
"call": "Pending",
"key": "Pending",
"places": [
"src/podkop/tabs/diagnostic/diagnostic.store.ts:112",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:120",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:128",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:136",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:144",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:152"
"src/podkop/tabs/diagnostic/diagnostic.store.ts:113",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:121",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:129",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:137",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:145",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:153"
]
},
{
@@ -1438,7 +1467,7 @@
"call": "Podkop Plus manages the nfqws process lifecycle itself, so daemon mode is not allowed here.",
"key": "Podkop Plus manages the nfqws process lifecycle itself, so daemon mode is not allowed here.",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:862"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1015"
]
},
{
@@ -1459,14 +1488,22 @@
"call": "Port cannot be empty",
"key": "Port cannot be empty",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1769"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1918"
]
},
{
"call": "Port for the local mixed proxy of this section",
"key": "Port for the local mixed proxy of this section",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1762"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1911"
]
},
{
"call": "Proxy",
"key": "Proxy",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:238",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:260"
]
},
{
@@ -1494,7 +1531,7 @@
"call": "Regional options cannot be used together",
"key": "Regional options cannot be used together",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1879"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:2028"
]
},
{
@@ -1515,7 +1552,7 @@
"call": "Resolver for interface outbound",
"key": "Resolver for interface outbound",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1697"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1846"
]
},
{
@@ -1529,14 +1566,14 @@
"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-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:847"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1000"
]
},
{
"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-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:850"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1003"
]
},
{
@@ -1571,9 +1608,9 @@
"call": "Rule set must be a direct .srs URL or a local .srs path",
"key": "Rule set must be a direct .srs URL or a local .srs path",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1313",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1322",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1325"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1466",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1475",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1478"
]
},
{
@@ -1587,7 +1624,7 @@
"call": "Rule sets",
"key": "Rule sets",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1934"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:2083"
]
},
{
@@ -1643,7 +1680,7 @@
"call": "Russia inside restrictions",
"key": "Russia inside restrictions",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1898"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:2047"
]
},
{
@@ -1671,7 +1708,7 @@
"call": "Section name",
"key": "Section name",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1413"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1543"
]
},
{
@@ -1685,7 +1722,7 @@
"call": "Select a predefined list for routing",
"key": "Select a predefined list for routing",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1841"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1990"
]
},
{
@@ -1756,14 +1793,14 @@
"key": "Selector",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:20",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1479"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1624"
]
},
{
"call": "Selector connections",
"key": "Selector connections",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1532"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1681"
]
},
{
@@ -1777,7 +1814,7 @@
"call": "Service list",
"key": "Service list",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1844"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1993"
]
},
{
@@ -1792,14 +1829,14 @@
"key": "Settings",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/podkop.js:391",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1388"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1511"
]
},
{
"call": "Show sing-box config",
"key": "Show sing-box config",
"places": [
"src/podkop/tabs/diagnostic/initController.ts:329",
"src/podkop/tabs/diagnostic/initController.ts:330",
"src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:116"
]
},
@@ -1863,7 +1900,7 @@
"call": "Source IPs",
"key": "Source IPs",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1824"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1973"
]
},
{
@@ -1933,7 +1970,7 @@
"call": "The desync fwmark is managed by Podkop Plus for loop prevention and must not be overridden here.",
"key": "The desync fwmark is managed by Podkop Plus for loop prevention and must not be overridden here.",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:859"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1012"
]
},
{
@@ -1947,35 +1984,43 @@
"call": "The NFQUEUE number is assigned by Podkop Plus for each rule and must not be overridden here.",
"key": "The NFQUEUE number is assigned by Podkop Plus for each rule and must not be overridden here.",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:856"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1009"
]
},
{
"call": "There are rules using zapret",
"key": "There are rules using zapret",
"places": [
"src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:69",
"src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:92"
]
},
{
"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-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:865"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1018"
]
},
{
"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-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:868"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1021"
]
},
{
"call": "This flag does not accept a value.",
"key": "This flag does not accept a value.",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1037"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1190"
]
},
{
"call": "This option requires a value.",
"key": "This option requires a value.",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1068"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1221"
]
},
{
@@ -2032,7 +2077,7 @@
"key": "UDP",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:229",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1713"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1862"
]
},
{
@@ -2047,21 +2092,21 @@
"key": "UDP over TCP",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:169",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1645"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1794"
]
},
{
"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-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:779"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:932"
]
},
{
"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-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1017"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1170"
]
},
{
@@ -2080,9 +2125,9 @@
"src/podkop/tabs/diagnostic/initController.ts:28",
"src/podkop/tabs/diagnostic/initController.ts:29",
"src/podkop/tabs/diagnostic/initController.ts:30",
"src/podkop/tabs/diagnostic/initController.ts:31",
"src/podkop/tabs/diagnostic/initController.ts:32",
"src/podkop/tabs/diagnostic/initController.ts:463"
"src/podkop/tabs/diagnostic/initController.ts:33",
"src/podkop/tabs/diagnostic/initController.ts:464"
]
},
{
@@ -2096,7 +2141,7 @@
"call": "Unknown NFQWS flag.",
"key": "Unknown NFQWS flag.",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1028"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1181"
]
},
{
@@ -2133,21 +2178,21 @@
"key": "URLTest",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:21",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1480"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1625"
]
},
{
"call": "URLTest connections",
"key": "URLTest connections",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1550"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1699"
]
},
{
"call": "URLTest interval",
"key": "URLTest interval",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1568"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1717"
]
},
{
@@ -2168,7 +2213,7 @@
"call": "URLTest tolerance",
"key": "URLTest tolerance",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1583"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1732"
]
},
{
@@ -2183,7 +2228,7 @@
"key": "URLTest URL",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:139",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1613"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1762"
]
},
{
@@ -2197,7 +2242,7 @@
"call": "Use a network interface as the outbound for this section",
"key": "Use a network interface as the outbound for this section",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1658"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1807"
]
},
{
@@ -2224,16 +2269,16 @@
"call": "Validation errors:",
"key": "Validation errors:",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:255",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:275",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:279"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:374",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:394",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:398"
]
},
{
"call": "View logs",
"key": "View logs",
"places": [
"src/podkop/tabs/diagnostic/initController.ts:289",
"src/podkop/tabs/diagnostic/initController.ts:290",
"src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:107"
]
},
@@ -2241,7 +2286,7 @@
"call": "Visible name of this section",
"key": "Visible name of this section",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1414"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1544"
]
},
{
@@ -2249,28 +2294,28 @@
"key": "vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:32",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1493"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1638"
]
},
{
"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-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1881"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:2030"
]
},
{
"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-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1900"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:2049"
]
},
{
"call": "What Podkop Plus should do when this section matches",
"key": "What Podkop Plus should do when this section matches",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1427"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1557"
]
},
{
@@ -2291,28 +2336,39 @@
"call": "Zapret",
"key": "Zapret",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:234",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:246",
"src/podkop/tabs/dashboard/initController.ts:365"
]
},
{
"call": "Zapret (package not installed)",
"key": "Zapret (package not installed)",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:235",
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:282"
]
},
{
"call": "Zapret hostlist templates are not supported here because Podkop Plus does not expand them for per-rule NFQWS strategies.",
"key": "Zapret hostlist templates are not supported here because Podkop Plus does not expand them for per-rule NFQWS strategies.",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:853"
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1006"
]
},
{
"call": "Zapret installed",
"key": "Zapret installed",
"places": [
"src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:43"
"src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:87"
]
},
{
"call": "Zapret not installed",
"key": "Zapret not installed",
"places": [
"src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:43"
"src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:59",
"src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:64"
]
}
]
+169 -134
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PODKOP PLUS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-07 18:03+0300\n"
"PO-Revision-Date: 2026-04-07 18:03+0300\n"
"POT-Creation-Date: 2026-04-11 18:16+0300\n"
"PO-Revision-Date: 2026-04-11 18:16+0300\n"
"Last-Translator: ushan0v <ushan0v@users.noreply.github.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
@@ -18,13 +18,17 @@ msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:345
#: src/podkop/tabs/dashboard/initController.ts:356
#: src/podkop/tabs/dashboard/initController.ts:367
#: src/podkop/tabs/dashboard/initController.ts:369
msgid "✔ Running"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:367
msgid "✘ Not installed"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:346
#: src/podkop/tabs/dashboard/initController.ts:357
#: src/podkop/tabs/dashboard/initController.ts:368
#: src/podkop/tabs/dashboard/initController.ts:370
msgid "✘ Stopped"
msgstr ""
@@ -32,7 +36,7 @@ msgstr ""
msgid "A latency-tested group of proxy URLs for this node"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1551
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1700
msgid "A latency-tested group of proxy URLs for this section"
msgstr ""
@@ -40,12 +44,12 @@ msgstr ""
msgid "A manual group of proxy URLs for this node"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1533
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1682
msgid "A manual group of proxy URLs for this section"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1401
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1426
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1524
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1556
msgid "Action"
msgstr ""
@@ -57,7 +61,7 @@ msgstr ""
msgid "Add a section"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1935
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:2084
msgid "Add URLs or local paths to .srs lists"
msgstr ""
@@ -74,15 +78,15 @@ msgid "An error occurred while saving the form:"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:170
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1646
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1795
msgid "Applicable for SOCKS and Shadowsocks links"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:681
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:834
msgid "At least one valid domain must be specified."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:692
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:845
msgid "At least one valid IP or subnet must be specified."
msgstr ""
@@ -94,7 +98,7 @@ msgstr ""
msgid "Available actions"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:783
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:936
msgid "Backend validation failed: %s"
msgstr ""
@@ -102,6 +106,11 @@ msgstr ""
msgid "Binary file"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:229
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:262
msgid "Block"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:65
msgid "Bootsrap DNS"
msgstr ""
@@ -118,7 +127,7 @@ msgstr ""
msgid "Browser is using FakeIP correctly"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1840
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1989
msgid "Built-in rule sets"
msgstr ""
@@ -151,12 +160,12 @@ msgstr ""
msgid "checks"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:38
#: src/podkop/tabs/diagnostic/helpers/getMeta.ts:26
msgid "Checks failed"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:38
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:40
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:82
#: src/podkop/tabs/diagnostic/helpers/getMeta.ts:13
msgid "Checks passed"
msgstr ""
@@ -173,7 +182,7 @@ msgstr ""
msgid "Close"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1389
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1512
msgid "Conditions"
msgstr ""
@@ -185,16 +194,16 @@ msgstr ""
msgid "Configuration for Podkop Plus service"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1492
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1637
msgid "Connection"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1475
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1620
msgid "Connection Type"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:19
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1478
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1623
msgid "Connection URL"
msgstr ""
@@ -256,18 +265,18 @@ msgid "DNS on router"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:227
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1711
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1860
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/settings.js:15
msgid "DNS over HTTPS (DoH)"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:228
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1712
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1861
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/settings.js:16
msgid "DNS over TLS (DoT)"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1709
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1858
msgid "DNS protocol"
msgstr ""
@@ -283,7 +292,7 @@ msgstr ""
msgid "DNS Rewrite TTL"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1727
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1876
msgid "DNS server"
msgstr ""
@@ -300,15 +309,15 @@ msgstr ""
msgid "Do not panic, everything can be fixed, just..."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1810
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1959
msgid "Domain keyword"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1817
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1966
msgid "Domain regex"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1782
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1931
msgid "Domains"
msgstr ""
@@ -349,15 +358,15 @@ msgstr ""
msgid "Drag rows to change priority. The rule at the top is checked first."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:248
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:263
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:283
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:367
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:382
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:402
msgid "Duplicate value"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:8
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/ruleset.js:8
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1391
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1514
msgid "Enable"
msgstr ""
@@ -365,7 +374,7 @@ msgstr ""
msgid "Enable a dedicated DNS resolver when this node uses an interface"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1698
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1847
msgid "Enable a dedicated DNS resolver when this section uses an interface"
msgstr ""
@@ -373,7 +382,7 @@ msgstr ""
msgid "Enable autostart"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1749
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1898
msgid "Enable Mixed Proxy"
msgstr ""
@@ -390,31 +399,31 @@ msgid "Enable YACD WAN Access"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:52
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1514
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1660
msgid "Enter a complete sing-box outbound object"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:103
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1572
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1721
msgid "Every 3 minutes"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:101
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1570
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1719
msgid "Every 30 seconds"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:104
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1573
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1722
msgid "Every 5 minutes"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:102
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1571
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1720
msgid "Every minute"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1796
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1945
msgid "Exact full domain"
msgstr ""
@@ -430,11 +439,11 @@ msgstr ""
msgid "Expecting: %s"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1750
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1899
msgid "Expose this section as a local HTTP+SOCKS proxy"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:844
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:997
msgid "External nfqws config files bypass Podkop Plus queue management and explicit validation."
msgstr ""
@@ -442,12 +451,12 @@ msgstr ""
msgid "Failed to copy!"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:250
#: src/podkop/tabs/diagnostic/initController.ts:254
#: src/podkop/tabs/diagnostic/initController.ts:300
#: src/podkop/tabs/diagnostic/initController.ts:304
#: src/podkop/tabs/diagnostic/initController.ts:341
#: src/podkop/tabs/diagnostic/initController.ts:345
#: src/podkop/tabs/diagnostic/initController.ts:251
#: src/podkop/tabs/diagnostic/initController.ts:255
#: src/podkop/tabs/diagnostic/initController.ts:301
#: src/podkop/tabs/diagnostic/initController.ts:305
#: src/podkop/tabs/diagnostic/initController.ts:342
#: src/podkop/tabs/diagnostic/initController.ts:346
msgid "Failed to execute!"
msgstr ""
@@ -464,7 +473,7 @@ msgstr ""
msgid "Get global check"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:245
#: src/podkop/tabs/diagnostic/initController.ts:246
msgid "Global check"
msgstr ""
@@ -472,7 +481,7 @@ msgstr ""
msgid "How often this remote rule set should be refreshed"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1476
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1621
msgid "How to configure the proxy connection for this section"
msgstr ""
@@ -482,8 +491,8 @@ msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:23
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:179
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1482
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1657
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1627
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1806
msgid "Interface"
msgstr ""
@@ -576,12 +585,12 @@ msgstr ""
msgid "Invalid path format. Path must start with \"/\" and contain valid characters"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1777
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1926
#: src/validators/validateShadowsocksUrl.ts:85
msgid "Invalid port number. Must be between 1 and 65535"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:191
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:310
msgid "Invalid regular expression"
msgstr ""
@@ -682,7 +691,7 @@ msgstr ""
msgid "IP address 0.0.0.0 is not allowed"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1789
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1938
msgid "IPs"
msgstr ""
@@ -690,11 +699,11 @@ msgstr ""
msgid "Issues detected"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:201
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:320
msgid "Keyword must not contain spaces"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:501
#: src/podkop/tabs/diagnostic/initController.ts:502
msgid "Latest"
msgstr ""
@@ -718,32 +727,32 @@ msgstr ""
msgid "Main DNS"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1790
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1939
msgid "Match destination IPs or subnets"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1811
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1960
msgid "Match domains containing a substring"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1783
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1932
msgid "Match domains including all subdomains"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1818
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1967
msgid "Match domains using a regular expression"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1797
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1946
msgid "Match only one exact full domain name"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1825
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1974
msgid "Match source IPs or subnets"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:114
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1584
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1733
msgid "Maximum response time delta in milliseconds"
msgstr ""
@@ -751,7 +760,7 @@ msgstr ""
msgid "Memory Usage"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1761
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1910
msgid "Mixed Proxy Port"
msgstr ""
@@ -760,15 +769,15 @@ msgid "Monitored Interfaces"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:136
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1606
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1755
msgid "Must be a number in the range of 50 - 1000"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1441
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1586
msgid "NFQWS Strategy"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:974
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1127
msgid "NFQWS strategy cannot be empty"
msgstr ""
@@ -776,6 +785,10 @@ msgstr ""
msgid "No other marking rules found"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:45
msgid "No rules use zapret"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:16
msgid "Node Type"
msgstr ""
@@ -784,18 +797,22 @@ msgstr ""
msgid "Not implement yet"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:523
msgid "not installed"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:75
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:81
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:100
msgid "Not responding"
msgstr ""
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:56
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:64
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:72
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:80
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:88
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:96
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:57
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:65
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:73
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:81
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:89
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:97
msgid "Not running"
msgstr ""
@@ -811,18 +828,18 @@ msgstr ""
msgid "Optional node used to download this remote rule set"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1052
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1205
msgid "Optional values must be attached with '=' here; a separate token would be ignored by nfqws."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:22
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:51
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1481
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1513
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1626
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1659
msgid "Outbound JSON"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:491
#: src/podkop/tabs/diagnostic/initController.ts:492
msgid "Outdated"
msgstr ""
@@ -850,12 +867,12 @@ msgstr ""
msgid "Path must end with cache.db"
msgstr ""
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:112
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:120
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:128
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:136
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:144
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:152
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:113
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:121
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:129
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:137
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:145
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:153
msgid "Pending"
msgstr ""
@@ -863,7 +880,7 @@ msgstr ""
msgid "Podkop Plus"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:862
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1015
msgid "Podkop Plus manages the nfqws process lifecycle itself, so daemon mode is not allowed here."
msgstr ""
@@ -875,14 +892,19 @@ msgstr ""
msgid "Podkop Plus will not modify your DHCP configuration"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1769
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1918
msgid "Port cannot be empty"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1762
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1911
msgid "Port for the local mixed proxy of this section"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:238
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:260
msgid "Proxy"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:31
msgid "Proxy Configuration URL"
msgstr ""
@@ -895,7 +917,7 @@ msgstr ""
msgid "Proxy traffic is routed via FakeIP"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1879
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:2028
msgid "Regional options cannot be used together"
msgstr ""
@@ -907,7 +929,7 @@ msgstr ""
msgid "Remote URL to a sing-box rule set"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1697
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1846
msgid "Resolver for interface outbound"
msgstr ""
@@ -915,11 +937,11 @@ msgstr ""
msgid "Resolver For Interface Outbound"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:847
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1000
msgid "Resource selection by hostname inside nfqws is not supported here; sing-box selects resources before NFQUEUE."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:850
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1003
msgid "Resource selection by IP or CIDR inside nfqws is not supported here; sing-box selects resources before NFQUEUE."
msgstr ""
@@ -939,9 +961,9 @@ msgstr ""
msgid "Routing Excluded IPs"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1313
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1322
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1325
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1466
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1475
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1478
msgid "Rule set must be a direct .srs URL or a local .srs path"
msgstr ""
@@ -949,7 +971,7 @@ msgstr ""
msgid "Rule set URL"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1934
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:2083
msgid "Rule sets"
msgstr ""
@@ -981,7 +1003,7 @@ msgstr ""
msgid "Run Diagnostic"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1898
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:2047
msgid "Russia inside restrictions"
msgstr ""
@@ -997,7 +1019,7 @@ msgstr ""
msgid "Section"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1413
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1543
msgid "Section name"
msgstr ""
@@ -1005,7 +1027,7 @@ msgstr ""
msgid "Sections"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1841
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1990
msgid "Select a predefined list for routing"
msgstr ""
@@ -1046,11 +1068,11 @@ msgid "Select the WAN interfaces to be monitored"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:20
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1479
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1624
msgid "Selector"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1532
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1681
msgid "Selector connections"
msgstr ""
@@ -1058,7 +1080,7 @@ msgstr ""
msgid "Selector Links"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1844
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1993
msgid "Service list"
msgstr ""
@@ -1067,11 +1089,11 @@ msgid "Services info"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/podkop.js:391
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1388
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1511
msgid "Settings"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:329
#: src/podkop/tabs/diagnostic/initController.ts:330
#: src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:116
msgid "Show sing-box config"
msgstr ""
@@ -1108,7 +1130,7 @@ msgstr ""
msgid "Source file"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1824
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1973
msgid "Source IPs"
msgstr ""
@@ -1148,7 +1170,7 @@ msgstr ""
msgid "Test latency"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:859
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1012
msgid "The desync fwmark is managed by Podkop Plus for loop prevention and must not be overridden here."
msgstr ""
@@ -1156,23 +1178,28 @@ msgstr ""
msgid "The DNS server used to look up the IP address of an upstream DNS server"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:856
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1009
msgid "The NFQUEUE number is assigned by Podkop Plus for each rule and must not be overridden here."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:865
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:69
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:92
msgid "There are rules using zapret"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1018
msgid "This field must start a working nfqws strategy; --dry-run exits immediately and is not allowed here."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:868
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1021
msgid "This field must start a working nfqws strategy; --version exits immediately and is not allowed here."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1037
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1190
msgid "This flag does not accept a value."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1068
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1221
msgid "This option requires a value."
msgstr ""
@@ -1205,7 +1232,7 @@ msgid "Type"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:229
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1713
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1862
msgid "UDP"
msgstr ""
@@ -1214,15 +1241,15 @@ msgid "UDP (Unprotected DNS)"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:169
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1645
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1794
msgid "UDP over TCP"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:779
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:932
msgid "Unable to validate the NFQWS strategy through the backend parser."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1017
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1170
msgid "Unexpected standalone token. Use explicit flags such as --name or --name=value."
msgstr ""
@@ -1235,9 +1262,9 @@ msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:28
#: src/podkop/tabs/diagnostic/initController.ts:29
#: src/podkop/tabs/diagnostic/initController.ts:30
#: src/podkop/tabs/diagnostic/initController.ts:31
#: src/podkop/tabs/diagnostic/initController.ts:32
#: src/podkop/tabs/diagnostic/initController.ts:463
#: src/podkop/tabs/diagnostic/initController.ts:33
#: src/podkop/tabs/diagnostic/initController.ts:464
msgid "unknown"
msgstr ""
@@ -1245,7 +1272,7 @@ msgstr ""
msgid "Unknown error"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1028
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1181
msgid "Unknown NFQWS flag."
msgstr ""
@@ -1267,15 +1294,15 @@ msgid "URL must use one of the following protocols:"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:21
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1480
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1625
msgid "URLTest"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1550
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1699
msgid "URLTest connections"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1568
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1717
msgid "URLTest interval"
msgstr ""
@@ -1287,7 +1314,7 @@ msgstr ""
msgid "URLTest Links"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1583
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1732
msgid "URLTest tolerance"
msgstr ""
@@ -1296,7 +1323,7 @@ msgid "URLTest Tolerance"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:139
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1613
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1762
msgid "URLTest URL"
msgstr ""
@@ -1304,7 +1331,7 @@ msgstr ""
msgid "Use a network interface as the outbound for this node"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1658
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1807
msgid "Use a network interface as the outbound for this section"
msgstr ""
@@ -1325,35 +1352,35 @@ msgstr ""
msgid "Valid"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:255
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:275
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:279
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:374
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:394
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:398
msgid "Validation errors:"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:289
#: src/podkop/tabs/diagnostic/initController.ts:290
#: src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:107
msgid "View logs"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1414
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1544
msgid "Visible name of this section"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:32
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1493
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1638
msgid "vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1881
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:2030
msgid "Warning: %s cannot be used together with %s. Previous selections have been removed."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1900
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:2049
msgid "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1427
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1557
msgid "What Podkop Plus should do when this section matches"
msgstr ""
@@ -1365,18 +1392,26 @@ msgstr ""
msgid "You can select Output Network Interface, by default autodetect"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:234
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:246
#: src/podkop/tabs/dashboard/initController.ts:365
msgid "Zapret"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:853
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:235
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:282
msgid "Zapret (package not installed)"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1006
msgid "Zapret hostlist templates are not supported here because Podkop Plus does not expand them for per-rule NFQWS strategies."
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:43
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:87
msgid "Zapret installed"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:43
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:59
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:64
msgid "Zapret not installed"
msgstr ""
+23 -2
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PODKOP PLUS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-07 21:03+0300\n"
"PO-Revision-Date: 2026-04-07 21:03+0300\n"
"POT-Creation-Date: 2026-04-11 21:16+0300\n"
"PO-Revision-Date: 2026-04-11 21:16+0300\n"
"Last-Translator: ushan0v\n"
"Language-Team: none\n"
"Language: ru\n"
@@ -20,6 +20,9 @@ msgstr ""
msgid "✔ Running"
msgstr "✔ Работает"
msgid "✘ Not installed"
msgstr "✘ Не установлен"
msgid "✘ Stopped"
msgstr "✘ Остановлен"
@@ -77,6 +80,9 @@ msgstr "Backend-проверка завершилась ошибкой: %s"
msgid "Binary file"
msgstr "Бинарный файл"
msgid "Block"
msgstr ""
msgid "Bootsrap DNS"
msgstr "Bootstrap DNS"
@@ -551,12 +557,18 @@ msgstr "Стратегия NFQWS не может быть пустой"
msgid "No other marking rules found"
msgstr "Другие правила маркировки не найдены"
msgid "No rules use zapret"
msgstr "Нет правил использующих zapret"
msgid "Node Type"
msgstr "Тип узла"
msgid "Not implement yet"
msgstr "Ещё не реализовано"
msgid "not installed"
msgstr "не установлен"
msgid "Not responding"
msgstr "Не отвечает"
@@ -620,6 +632,9 @@ msgstr "Порт не может быть пустым"
msgid "Port for the local mixed proxy of this section"
msgstr "Порт локального смешанного прокси для этой секции"
msgid "Proxy"
msgstr ""
msgid "Proxy Configuration URL"
msgstr "URL конфигурации прокси"
@@ -824,6 +839,9 @@ msgstr "DNS-сервер, используемый для поиска IP-адр
msgid "The NFQUEUE number is assigned by Podkop Plus for each rule and must not be overridden here."
msgstr "Номер NFQUEUE назначается Podkop Plus для каждого правила и не должен переопределяться здесь."
msgid "There are rules using zapret"
msgstr "Есть правила использующие zapret"
msgid "This field must start a working nfqws strategy; --dry-run exits immediately and is not allowed here."
msgstr "Это поле должно запускать рабочую стратегию nfqws; --dry-run сразу завершает процесс и здесь запрещён."
@@ -959,6 +977,9 @@ msgstr "Вы можете выбрать выходной сетевой инт
msgid "Zapret"
msgstr "Zapret"
msgid "Zapret (package not installed)"
msgstr "Zapret (пакет не установлен)"
msgid "Zapret hostlist templates are not supported here because Podkop Plus does not expand them for per-rule NFQWS strategies."
msgstr "Шаблоны hostlist zapret здесь не поддерживаются, потому что Podkop Plus не разворачивает их для per-rule стратегий NFQWS."
@@ -34,10 +34,7 @@ export async function fetchServicesInfo() {
}
const podkop = getSettledMethodResponse('getStatus', podkopResult);
const singbox = getSettledMethodResponse(
'getSingBoxStatus',
singboxResult,
);
const singbox = getSettledMethodResponse('getSingBoxStatus', singboxResult);
const zapret = getSettledMethodResponse('getZapretStatus', zapretResult);
store.set({
@@ -49,6 +46,7 @@ export async function fetchServicesInfo() {
podkopRunning: podkop.success ? podkop.data.running : 0,
podkopEnabled: podkop.success ? podkop.data.enabled : 0,
zapret: zapret.success ? zapret.data.ready : 0,
zapretInstalled: zapret.success ? zapret.data.installed : 0,
},
},
});
@@ -4,6 +4,40 @@ import { logger } from './logger.service';
import { PodkopLogWatcher } from './podkopLogWatcher.service';
import { PodkopShellMethods } from '../methods';
const LOG_NOTIFICATION_DEDUPE_WINDOW_MS = 15000;
const recentErrorNotifications = new Map<string, number>();
function getNotificationKey(line: string) {
const lower = line.toLowerCase();
const errorIndex = lower.indexOf('[error]');
const fatalIndex = lower.indexOf('[fatal]');
const markerIndex =
errorIndex >= 0 && fatalIndex >= 0
? Math.min(errorIndex, fatalIndex)
: Math.max(errorIndex, fatalIndex);
return (markerIndex >= 0 ? line.slice(markerIndex) : line).trim();
}
function shouldNotifyAboutLogLine(line: string) {
const key = getNotificationKey(line);
const now = Date.now();
const lastShownAt = recentErrorNotifications.get(key) ?? 0;
recentErrorNotifications.forEach((shownAt, storedKey) => {
if (now - shownAt > LOG_NOTIFICATION_DEDUPE_WINDOW_MS) {
recentErrorNotifications.delete(storedKey);
}
});
if (now - lastShownAt < LOG_NOTIFICATION_DEDUPE_WINDOW_MS) {
return false;
}
recentErrorNotifications.set(key, now);
return true;
}
export function coreService() {
TabServiceInstance.onChange((activeId, tabs) => {
logger.info('[TAB]', activeId);
@@ -31,14 +65,11 @@ export function coreService() {
intervalMs: 3000,
onNewLog: (line) => {
if (
line.toLowerCase().includes('[error]') ||
line.toLowerCase().includes('[fatal]')
(line.toLowerCase().includes('[error]') ||
line.toLowerCase().includes('[fatal]')) &&
shouldNotifyAboutLogLine(line)
) {
ui.addNotification(
'Podkop Plus Error',
E('div', {}, line),
'error',
);
ui.addNotification('Podkop Plus Error', E('div', {}, line), 'error');
}
},
},
@@ -164,6 +164,7 @@ export interface StoreType {
podkopRunning: number;
podkopEnabled: number;
zapret: number;
zapretInstalled: number;
};
};
sectionsWidget: {
@@ -193,6 +194,7 @@ export interface StoreType {
luci_app_version: string;
sing_box_version: string;
zapret_version: string;
zapret_installed: number;
openwrt_version: string;
device_model: string;
};
@@ -221,7 +223,13 @@ const initialStore: StoreType = {
servicesInfoWidget: {
loading: true,
failed: false,
data: { singbox: 0, podkopRunning: 0, podkopEnabled: 0, zapret: 0 },
data: {
singbox: 0,
podkopRunning: 0,
podkopEnabled: 0,
zapret: 0,
zapretInstalled: 0,
},
},
sectionsWidget: {
loading: true,
@@ -363,13 +363,17 @@ async function renderServicesInfoWidget() {
},
{
key: _('Zapret'),
value: servicesInfoWidget.data.zapret
? _('✔ Running')
: _('✘ Stopped'),
value: !servicesInfoWidget.data.zapretInstalled
? _('✘ Not installed')
: servicesInfoWidget.data.zapret
? _('✔ Running')
: _('✘ Stopped'),
attributes: {
class: servicesInfoWidget.data.zapret
? 'pdk_dashboard-page__widgets-section__item__row--success'
: 'pdk_dashboard-page__widgets-section__item__row--error',
class:
servicesInfoWidget.data.zapretInstalled &&
servicesInfoWidget.data.zapret
? 'pdk_dashboard-page__widgets-section__item__row--success'
: 'pdk_dashboard-page__widgets-section__item__row--error',
},
},
],
@@ -14,9 +14,9 @@ export async function runZapretCheck() {
items: [],
});
const zapretChecks = await PodkopShellMethods.checkZapretRuntime();
const zapretStatus = await PodkopShellMethods.getZapretStatus();
if (!zapretChecks.success) {
if (!zapretStatus.success) {
updateCheckStore({
order,
code,
@@ -29,24 +29,76 @@ export async function runZapretCheck() {
throw new Error('Zapret checks failed');
}
const installed = Boolean(zapretChecks.data.zapret_installed);
const installed = Boolean(zapretStatus.data.installed);
const hasZapretRules = Number(zapretStatus.data.enabled_rule_count || 0) > 0;
if (installed) {
updateCheckStore({
order,
code,
title,
description: _('Checks passed'),
state: 'success',
items: [
{
state: 'success',
key: _('Zapret installed'),
value: '',
},
{
state: 'success',
key: hasZapretRules
? _('There are rules using zapret')
: _('No rules use zapret'),
value: '',
},
],
});
return;
}
if (hasZapretRules) {
updateCheckStore({
order,
code,
title,
description: _('Zapret not installed'),
state: 'error',
items: [
{
state: 'error',
key: _('Zapret not installed'),
value: '',
},
{
state: 'error',
key: _('There are rules using zapret'),
value: '',
},
],
});
return;
}
updateCheckStore({
order,
code,
title,
description: installed ? _('Checks passed') : _('Checks failed'),
state: installed ? 'success' : 'error',
description: _('Zapret not installed'),
state: 'warning',
items: [
{
state: installed ? 'success' : 'error',
key: installed ? _('Zapret installed') : _('Zapret not installed'),
state: 'warning',
key: _('Zapret not installed'),
value: '',
},
{
state: 'success',
key: _('No rules use zapret'),
value: '',
},
],
});
if (!installed) {
throw new Error('Zapret checks failed');
}
}
@@ -18,6 +18,7 @@ export const initialDiagnosticStore: Pick<
luci_app_version: 'loading',
sing_box_version: 'loading',
zapret_version: 'loading',
zapret_installed: 0,
openwrt_version: 'loading',
device_model: 'loading',
},
@@ -28,6 +28,7 @@ const UNKNOWN_DIAGNOSTICS_SYSTEM_INFO = {
luci_app_version: _('unknown'),
sing_box_version: _('unknown'),
zapret_version: _('unknown'),
zapret_installed: 0,
openwrt_version: _('unknown'),
device_model: _('unknown'),
};
@@ -517,7 +518,9 @@ function renderDiagnosticSystemInfoWidget() {
},
{
key: 'Zapret',
value: diagnosticsSystemInfo.zapret_version,
value: diagnosticsSystemInfo.zapret_installed
? diagnosticsSystemInfo.zapret_version
: _('not installed'),
},
{
key: 'OS',
+1
View File
@@ -187,6 +187,7 @@ export namespace Podkop {
luci_app_version: string;
sing_box_version: string;
zapret_version: string;
zapret_installed: 0 | 1;
openwrt_version: string;
device_model: string;
}
+197 -59
View File
@@ -4,14 +4,7 @@
REPO_OWNER="ushan0v"
REPO_NAME="podkop-plus"
PODKOP_PLUS_RELEASE_TAG="${PODKOP_PLUS_RELEASE_TAG:-}"
PODKOP_PLUS_SOURCE_REF="${PODKOP_PLUS_SOURCE_REF:-}"
ZAPRET_RELEASE_TAG="${ZAPRET_RELEASE_TAG:-}"
DOWNLOAD_RETRIES="${DOWNLOAD_RETRIES:-3}"
REQUIRED_SPACE_KB=15360
PODKOP_PLUS_ASSUME_YES="${PODKOP_PLUS_ASSUME_YES:-0}"
PODKOP_PLUS_KEEP_EXISTING_ZAPRET="${PODKOP_PLUS_KEEP_EXISTING_ZAPRET:-0}"
PKG_IS_APK=0
FETCHER=""
@@ -20,8 +13,12 @@ PODKOP_WAS_ENABLED=0
TARGET_ARCH=""
ZAPRET_ARCH=""
ZAPRET_ARCH_CANDIDATES=""
ZAPRET_ALREADY_PRESENT=0
ZAPRET_REQUESTED=0
ZAPRET_SKIPPED_REASON=""
PODKOP_PLUS_RELEASE_JSON=""
PODKOP_PLUS_RELEASE_TAG=""
PODKOP_PLUS_PACKAGE_URL=""
PODKOP_PLUS_PACKAGE_NAME=""
PODKOP_PLUS_PACKAGE_FILE=""
@@ -57,6 +54,24 @@ cleanup() {
[ -n "$TMP_DIR" ] && rm -rf "$TMP_DIR"
}
clear_zapret_download_state() {
ZAPRET_RELEASE_JSON=""
ZAPRET_RELEASE_TAG_RESOLVED=""
ZAPRET_BUNDLE_URL=""
ZAPRET_BUNDLE_NAME=""
ZAPRET_PACKAGE_NAME=""
ZAPRET_PACKAGE_FILE=""
ZAPRET_PACKAGE_VERSION=""
ZAPRET_ARCH=""
}
read_openwrt_release_value() {
key="$1"
[ -f /etc/openwrt_release ] || return 0
sed -n "s/^${key}='\(.*\)'/\1/p" /etc/openwrt_release 2>/dev/null | head -n 1
}
command_exists() {
command -v "$1" >/dev/null 2>&1
}
@@ -117,9 +132,10 @@ download_with_retry() {
output_path="$2"
label="$3"
attempt=1
max_attempts=3
while [ "$attempt" -le "$DOWNLOAD_RETRIES" ]; do
msg "Downloading $label ($attempt/$DOWNLOAD_RETRIES)"
while [ "$attempt" -le "$max_attempts" ]; do
msg "Downloading $label ($attempt/$max_attempts)"
if download_file_once "$url" "$output_path" && [ -s "$output_path" ]; then
return 0
@@ -151,6 +167,10 @@ pkg_is_installed() {
fi
}
is_zapret_present() {
pkg_is_installed "zapret" || [ -x /opt/zapret/nfq/nfqws ]
}
pkg_list_update() {
if [ "$PKG_IS_APK" -eq 1 ]; then
apk update
@@ -241,7 +261,7 @@ check_system() {
model="$(cat /tmp/sysinfo/model 2>/dev/null || true)"
[ -n "$model" ] && msg "Router model: $model"
release="$(sed -n "s/^DISTRIB_RELEASE='\(.*\)'/\1/p" /etc/openwrt_release | head -n 1)"
release="$(read_openwrt_release_value "DISTRIB_RELEASE")"
major="$(printf '%s' "$release" | sed 's/[^0-9].*$//' | cut -d. -f1)"
if [ -n "$major" ] && [ "$major" -lt 24 ]; then
@@ -260,10 +280,6 @@ confirm_prompt() {
prompt_text="$1"
answer=""
if [ "$PODKOP_PLUS_ASSUME_YES" = "1" ]; then
return 0
fi
printf '%s [y/N]: ' "$prompt_text"
read -r answer || return 1
@@ -332,16 +348,9 @@ extract_package_version() {
fetch_github_release_json() {
owner="$1"
repo="$2"
tag="$3"
url=""
response=""
message=""
if [ -n "$tag" ]; then
url="https://api.github.com/repos/${owner}/${repo}/releases/tags/${tag}"
else
url="https://api.github.com/repos/${owner}/${repo}/releases/latest"
fi
url="https://api.github.com/repos/${owner}/${repo}/releases/latest"
response="$(http_get "$url" 2>/dev/null || true)"
[ -n "$response" ] || fail "Failed to query GitHub release metadata for ${owner}/${repo}"
@@ -351,12 +360,9 @@ fetch_github_release_json() {
message="$(printf '%s' "$response" | jq -r '.message // empty')"
case "$message" in
*"API rate limit"*|*"rate limit exceeded"*)
fail "GitHub API rate limit reached. Try again later or set PODKOP_PLUS_RELEASE_TAG/ZAPRET_RELEASE_TAG manually."
fail "GitHub API rate limit reached. Try again later."
;;
"Not Found")
if [ -n "$tag" ]; then
fail "GitHub release tag not found: ${owner}/${repo}@${tag}"
fi
fail "No published releases found for ${owner}/${repo}"
;;
esac
@@ -369,12 +375,10 @@ resolve_podkop_plus_release() {
[ "$PKG_IS_APK" -eq 1 ] && asset_ext="apk"
PODKOP_PLUS_RELEASE_JSON="$(fetch_github_release_json "$REPO_OWNER" "$REPO_NAME" "$PODKOP_PLUS_RELEASE_TAG")"
PODKOP_PLUS_RELEASE_JSON="$(fetch_github_release_json "$REPO_OWNER" "$REPO_NAME")"
PODKOP_PLUS_RELEASE_TAG="$(printf '%s' "$PODKOP_PLUS_RELEASE_JSON" | jq -r '.tag_name // empty')"
[ -n "$PODKOP_PLUS_RELEASE_TAG" ] || fail "Failed to detect the Podkop Plus release tag"
[ -n "$PODKOP_PLUS_SOURCE_REF" ] || PODKOP_PLUS_SOURCE_REF="$PODKOP_PLUS_RELEASE_TAG"
PODKOP_PLUS_PACKAGE_URL="$(printf '%s' "$PODKOP_PLUS_RELEASE_JSON" | jq -r --arg ext "$asset_ext" '.assets[] | select((.name | startswith("luci-app-podkop-plus_")) and (.name | endswith("." + $ext))) | .browser_download_url' | sed -n '1p')"
PODKOP_PLUS_I18N_URL="$(printf '%s' "$PODKOP_PLUS_RELEASE_JSON" | jq -r --arg ext "$asset_ext" '.assets[] | select((.name | startswith("luci-i18n-podkop-plus-ru_")) and (.name | endswith("." + $ext))) | .browser_download_url' | sed -n '1p')"
@@ -426,7 +430,7 @@ reset_legacy_config_if_needed() {
backup_path="/etc/config/podkop-070.$(date +%Y%m%d%H%M%S 2>/dev/null || echo "$$")"
mv /etc/config/podkop "$backup_path" || fail "Failed to back up /etc/config/podkop"
default_config_url="https://raw.githubusercontent.com/${REPO_OWNER}/${REPO_NAME}/${PODKOP_PLUS_SOURCE_REF}/podkop/files/etc/config/podkop"
default_config_url="https://raw.githubusercontent.com/${REPO_OWNER}/${REPO_NAME}/${PODKOP_PLUS_RELEASE_TAG}/podkop/files/etc/config/podkop"
default_config_tmp="$TMP_DIR/default-podkop-config"
download_with_retry "$default_config_url" "$default_config_tmp" "default Podkop Plus config" || fail "Failed to download the default Podkop Plus config"
@@ -512,6 +516,12 @@ append_arch_candidate() {
[ -n "$candidate" ] || return 0
case "$candidate" in
all|noarch)
return 0
;;
esac
case " $ZAPRET_ARCH_CANDIDATES " in
*" $candidate "*)
return 0
@@ -525,66 +535,143 @@ append_arch_candidate() {
fi
}
append_arch_candidate_variants() {
candidate="$1"
base_candidate=""
[ -n "$candidate" ] || return 0
append_arch_candidate "$candidate"
case "$candidate" in
*+*)
append_arch_candidate "${candidate%%+*}"
;;
esac
for suffix in _musl _uclibc _glibc -musl -uclibc -glibc .musl .uclibc .glibc; do
case "$candidate" in
*"$suffix")
base_candidate="${candidate%"$suffix"}"
append_arch_candidate "$base_candidate"
;;
esac
done
}
add_arch_family_fallbacks() {
arch="$1"
append_arch_candidate "$arch"
append_arch_candidate_variants "$arch"
case "$arch" in
aarch64_*)
append_arch_candidate "aarch64_generic"
append_arch_candidate_variants "aarch64_generic"
;;
riscv64_*)
append_arch_candidate "riscv64_generic"
append_arch_candidate_variants "riscv64_generic"
;;
arm_cortex-a7_neon-vfpv4)
append_arch_candidate "arm_cortex-a7_vfpv4"
append_arch_candidate "arm_cortex-a7"
append_arch_candidate_variants "arm_cortex-a7_vfpv4"
append_arch_candidate_variants "arm_cortex-a7"
;;
arm_cortex-a7_*)
append_arch_candidate "arm_cortex-a7"
append_arch_candidate_variants "arm_cortex-a7"
;;
arm_cortex-a9_*)
append_arch_candidate "arm_cortex-a9"
append_arch_candidate_variants "arm_cortex-a9"
;;
mipsel_24kc_24kf)
append_arch_candidate "mipsel_24kc"
append_arch_candidate_variants "mipsel_24kc"
;;
esac
}
resolve_arch_candidates() {
arch_list=""
apk_arch_list=""
release_arch=""
if [ "$PKG_IS_APK" -eq 1 ]; then
arch_list="$(apk --print-arch 2>/dev/null || true)"
if [ -f /etc/apk/arch ]; then
apk_arch_list="$(tr '\r\n' ' ' </etc/apk/arch)"
[ -n "$apk_arch_list" ] && arch_list="$arch_list $apk_arch_list"
fi
apk_arch_list="$(apk --print-arch 2>/dev/null || true)"
[ -n "$apk_arch_list" ] && arch_list="$arch_list $apk_arch_list"
else
arch_list="$(opkg print-architecture 2>/dev/null | awk '$1 == "arch" && $2 !~ /^(all|noarch)$/ {print $2 " " $3}' | sort -k2,2nr | awk '{print $1}')"
fi
if [ -z "$arch_list" ]; then
release_arch="$(read_openwrt_release_value "DISTRIB_ARCH")"
[ -n "$release_arch" ] && arch_list="$arch_list $release_arch"
if [ -z "$(printf '%s' "$arch_list" | tr -d '[:space:]')" ]; then
arch_list="$(uname -m 2>/dev/null || true)"
fi
for arch in $arch_list; do
case "$arch" in
all|noarch)
continue
;;
esac
[ -n "$TARGET_ARCH" ] || TARGET_ARCH="$arch"
add_arch_family_fallbacks "$arch"
done
[ -n "$TARGET_ARCH" ] || fail "Failed to detect the router package architecture"
msg "Detected zapret architecture candidates: $ZAPRET_ARCH_CANDIDATES"
}
resolve_zapret_release() {
candidate_name=""
message=""
url="https://api.github.com/repos/remittor/zapret-openwrt/releases/latest"
if [ "$PODKOP_PLUS_KEEP_EXISTING_ZAPRET" = "1" ] && pkg_is_installed "zapret"; then
warn "Keeping the existing zapret package because PODKOP_PLUS_KEEP_EXISTING_ZAPRET=1"
clear_zapret_download_state
[ "$ZAPRET_REQUESTED" -eq 1 ] || return 0
ZAPRET_RELEASE_JSON="$(http_get "$url" 2>/dev/null || true)"
if [ -z "$ZAPRET_RELEASE_JSON" ]; then
warn "Failed to query zapret release metadata. Continuing without zapret."
ZAPRET_SKIPPED_REASON="release metadata unavailable"
return 0
fi
ZAPRET_RELEASE_JSON="$(fetch_github_release_json "remittor" "zapret-openwrt" "$ZAPRET_RELEASE_TAG")"
if ! printf '%s' "$ZAPRET_RELEASE_JSON" | jq -e . >/dev/null 2>&1; then
warn "GitHub returned an invalid zapret release response. Continuing without zapret."
ZAPRET_SKIPPED_REASON="invalid release metadata"
clear_zapret_download_state
return 0
fi
message="$(printf '%s' "$ZAPRET_RELEASE_JSON" | jq -r '.message // empty')"
case "$message" in
*"API rate limit"*|*"rate limit exceeded"*)
warn "GitHub API rate limit reached while resolving zapret. Continuing without zapret."
ZAPRET_SKIPPED_REASON="GitHub API rate limit"
clear_zapret_download_state
return 0
;;
"Not Found")
warn "No published releases found for remittor/zapret-openwrt. Continuing without zapret."
ZAPRET_SKIPPED_REASON="release not found"
clear_zapret_download_state
return 0
;;
esac
ZAPRET_RELEASE_TAG_RESOLVED="$(printf '%s' "$ZAPRET_RELEASE_JSON" | jq -r '.tag_name // empty')"
[ -n "$ZAPRET_RELEASE_TAG_RESOLVED" ] || fail "Failed to detect the zapret release tag"
if [ -z "$ZAPRET_RELEASE_TAG_RESOLVED" ]; then
warn "Failed to detect the zapret release tag. Continuing without zapret."
ZAPRET_SKIPPED_REASON="release tag unavailable"
clear_zapret_download_state
return 0
fi
for arch in $ZAPRET_ARCH_CANDIDATES; do
candidate_name="$(printf '%s' "$ZAPRET_RELEASE_JSON" | jq -r --arg arch "$arch" '.assets[] | select(.name | endswith("_" + $arch + ".zip")) | .name' | sed -n '1p')"
@@ -596,10 +683,36 @@ resolve_zapret_release() {
fi
done
[ -n "$ZAPRET_BUNDLE_NAME" ] || fail "No zapret package was found for architecture: $TARGET_ARCH. Tried: $ZAPRET_ARCH_CANDIDATES"
if [ -z "$ZAPRET_BUNDLE_NAME" ]; then
warn "No zapret package was found for architecture: $TARGET_ARCH. Tried: $ZAPRET_ARCH_CANDIDATES. Continuing without zapret."
ZAPRET_SKIPPED_REASON="package not found for architecture"
clear_zapret_download_state
return 0
fi
ZAPRET_BUNDLE_URL="$(printf '%s' "$ZAPRET_RELEASE_JSON" | jq -r --arg name "$ZAPRET_BUNDLE_NAME" '.assets[] | select(.name == $name) | .browser_download_url' | sed -n '1p')"
[ -n "$ZAPRET_BUNDLE_URL" ] || fail "Failed to resolve the zapret download URL for $ZAPRET_BUNDLE_NAME"
if [ -z "$ZAPRET_BUNDLE_URL" ]; then
warn "Failed to resolve the zapret download URL for $ZAPRET_BUNDLE_NAME. Continuing without zapret."
ZAPRET_SKIPPED_REASON="download URL unavailable"
clear_zapret_download_state
return 0
fi
}
decide_zapret_installation() {
if is_zapret_present; then
ZAPRET_ALREADY_PRESENT=1
msg "Detected an existing zapret installation. Skipping zapret installation."
return 0
fi
if confirm_prompt "Install optional zapret package?"; then
ZAPRET_REQUESTED=1
return 0
fi
ZAPRET_SKIPPED_REASON="installation declined by user"
warn "Continuing without zapret."
}
download_podkop_plus_packages() {
@@ -617,7 +730,12 @@ download_and_extract_zapret_package() {
[ -n "$ZAPRET_BUNDLE_URL" ] || return 0
bundle_file="$TMP_DIR/$ZAPRET_BUNDLE_NAME"
download_with_retry "$ZAPRET_BUNDLE_URL" "$bundle_file" "$ZAPRET_BUNDLE_NAME" || fail "Failed to download $ZAPRET_BUNDLE_NAME"
if ! download_with_retry "$ZAPRET_BUNDLE_URL" "$bundle_file" "$ZAPRET_BUNDLE_NAME"; then
warn "Failed to download $ZAPRET_BUNDLE_NAME. Continuing without zapret."
ZAPRET_SKIPPED_REASON="download failed"
clear_zapret_download_state
return 0
fi
if [ "$PKG_IS_APK" -eq 1 ]; then
inner_package_path="$(unzip -l "$bundle_file" | awk '{print $4}' | grep -E '^apk/zapret-.*\.apk$' | sed -n '1p')"
@@ -626,24 +744,41 @@ download_and_extract_zapret_package() {
[ -n "$inner_package_path" ] || inner_package_path="$(unzip -l "$bundle_file" | awk '{print $4}' | grep -E '^zapret_.*\.ipk$' | sed -n '1p')"
fi
[ -n "$inner_package_path" ] || fail "Failed to locate the zapret package inside $ZAPRET_BUNDLE_NAME"
if [ -z "$inner_package_path" ]; then
warn "Failed to locate the zapret package inside $ZAPRET_BUNDLE_NAME. Continuing without zapret."
ZAPRET_SKIPPED_REASON="package archive layout is unsupported"
clear_zapret_download_state
return 0
fi
ZAPRET_PACKAGE_NAME="$(basename "$inner_package_path")"
ZAPRET_PACKAGE_FILE="$TMP_DIR/$ZAPRET_PACKAGE_NAME"
ZAPRET_PACKAGE_VERSION="$(extract_package_version "$ZAPRET_PACKAGE_NAME")"
unzip -p "$bundle_file" "$inner_package_path" > "$ZAPRET_PACKAGE_FILE" || fail "Failed to extract $ZAPRET_PACKAGE_NAME"
[ -s "$ZAPRET_PACKAGE_FILE" ] || fail "The extracted zapret package is empty"
}
install_packages() {
if [ "$PODKOP_PLUS_KEEP_EXISTING_ZAPRET" = "1" ] && pkg_is_installed "zapret"; then
pkg_install_files "$PODKOP_PLUS_PACKAGE_FILE" "$PODKOP_PLUS_I18N_FILE" || fail "Podkop Plus package installation failed"
if ! unzip -p "$bundle_file" "$inner_package_path" > "$ZAPRET_PACKAGE_FILE"; then
warn "Failed to extract $ZAPRET_PACKAGE_NAME. Continuing without zapret."
ZAPRET_SKIPPED_REASON="package extraction failed"
clear_zapret_download_state
return 0
fi
pkg_remove_if_installed "zapret"
pkg_install_files "$ZAPRET_PACKAGE_FILE" "$PODKOP_PLUS_PACKAGE_FILE" "$PODKOP_PLUS_I18N_FILE" || fail "Package installation failed"
if [ ! -s "$ZAPRET_PACKAGE_FILE" ]; then
warn "The extracted zapret package is empty. Continuing without zapret."
ZAPRET_SKIPPED_REASON="empty package archive"
clear_zapret_download_state
return 0
fi
}
install_packages() {
set -- "$PODKOP_PLUS_PACKAGE_FILE" "$PODKOP_PLUS_I18N_FILE"
if [ -n "$ZAPRET_PACKAGE_FILE" ]; then
pkg_remove_if_installed "zapret"
set -- "$ZAPRET_PACKAGE_FILE" "$@"
fi
pkg_install_files "$@" || fail "Package installation failed"
}
post_install() {
@@ -673,6 +808,7 @@ main() {
remove_conflicting_dns_proxy
remove_old_sing_box_if_needed
resolve_arch_candidates
decide_zapret_installation
resolve_zapret_release
cleanup_legacy_installation
@@ -687,8 +823,10 @@ main() {
if [ -n "$ZAPRET_PACKAGE_VERSION" ]; then
msg "zapret $ZAPRET_PACKAGE_VERSION installed for architecture $ZAPRET_ARCH"
msg "zapret source: remittor/zapret-openwrt@${ZAPRET_RELEASE_TAG_RESOLVED}"
elif [ "$PODKOP_PLUS_KEEP_EXISTING_ZAPRET" = "1" ] && pkg_is_installed "zapret"; then
warn "Keeping the existing zapret package"
elif [ "$ZAPRET_ALREADY_PRESENT" -eq 1 ]; then
msg "Using the existing zapret installation"
elif [ -n "$ZAPRET_SKIPPED_REASON" ]; then
warn "zapret was not installed: $ZAPRET_SKIPPED_REASON"
fi
warn "Open LuCI and review your rules before enabling Podkop Plus"
@@ -1198,6 +1198,7 @@ var initialDiagnosticStore = {
luci_app_version: "loading",
sing_box_version: "loading",
zapret_version: "loading",
zapret_installed: 0,
openwrt_version: "loading",
device_model: "loading"
},
@@ -1445,7 +1446,13 @@ var initialStore = {
servicesInfoWidget: {
loading: true,
failed: false,
data: { singbox: 0, podkopRunning: 0, podkopEnabled: 0, zapret: 0 }
data: {
singbox: 0,
podkopRunning: 0,
podkopEnabled: 0,
zapret: 0,
zapretInstalled: 0
}
},
sectionsWidget: {
loading: true,
@@ -1617,6 +1624,30 @@ var PodkopLogWatcher = class _PodkopLogWatcher {
};
// src/podkop/services/core.service.ts
var LOG_NOTIFICATION_DEDUPE_WINDOW_MS = 15e3;
var recentErrorNotifications = /* @__PURE__ */ new Map();
function getNotificationKey(line) {
const lower = line.toLowerCase();
const errorIndex = lower.indexOf("[error]");
const fatalIndex = lower.indexOf("[fatal]");
const markerIndex = errorIndex >= 0 && fatalIndex >= 0 ? Math.min(errorIndex, fatalIndex) : Math.max(errorIndex, fatalIndex);
return (markerIndex >= 0 ? line.slice(markerIndex) : line).trim();
}
function shouldNotifyAboutLogLine(line) {
const key = getNotificationKey(line);
const now = Date.now();
const lastShownAt = recentErrorNotifications.get(key) ?? 0;
recentErrorNotifications.forEach((shownAt, storedKey) => {
if (now - shownAt > LOG_NOTIFICATION_DEDUPE_WINDOW_MS) {
recentErrorNotifications.delete(storedKey);
}
});
if (now - lastShownAt < LOG_NOTIFICATION_DEDUPE_WINDOW_MS) {
return false;
}
recentErrorNotifications.set(key, now);
return true;
}
function coreService() {
TabServiceInstance.onChange((activeId, tabs) => {
logger.info("[TAB]", activeId);
@@ -1639,12 +1670,8 @@ function coreService() {
{
intervalMs: 3e3,
onNewLog: (line) => {
if (line.toLowerCase().includes("[error]") || line.toLowerCase().includes("[fatal]")) {
ui.addNotification(
"Podkop Plus Error",
E("div", {}, line),
"error"
);
if ((line.toLowerCase().includes("[error]") || line.toLowerCase().includes("[fatal]")) && shouldNotifyAboutLogLine(line)) {
ui.addNotification("Podkop Plus Error", E("div", {}, line), "error");
}
}
}
@@ -2048,10 +2075,7 @@ async function fetchServicesInfo() {
return;
}
const podkop = getSettledMethodResponse("getStatus", podkopResult);
const singbox = getSettledMethodResponse(
"getSingBoxStatus",
singboxResult
);
const singbox = getSettledMethodResponse("getSingBoxStatus", singboxResult);
const zapret = getSettledMethodResponse("getZapretStatus", zapretResult);
store.set({
servicesInfoWidget: {
@@ -2061,7 +2085,8 @@ async function fetchServicesInfo() {
singbox: singbox.success ? singbox.data.running : 0,
podkopRunning: podkop.success ? podkop.data.running : 0,
podkopEnabled: podkop.success ? podkop.data.enabled : 0,
zapret: zapret.success ? zapret.data.ready : 0
zapret: zapret.success ? zapret.data.ready : 0,
zapretInstalled: zapret.success ? zapret.data.installed : 0
}
}
});
@@ -2364,9 +2389,9 @@ async function renderServicesInfoWidget() {
},
{
key: _("Zapret"),
value: servicesInfoWidget.data.zapret ? _("\u2714 Running") : _("\u2718 Stopped"),
value: !servicesInfoWidget.data.zapretInstalled ? _("\u2718 Not installed") : servicesInfoWidget.data.zapret ? _("\u2714 Running") : _("\u2718 Stopped"),
attributes: {
class: servicesInfoWidget.data.zapret ? "pdk_dashboard-page__widgets-section__item__row--success" : "pdk_dashboard-page__widgets-section__item__row--error"
class: servicesInfoWidget.data.zapretInstalled && servicesInfoWidget.data.zapret ? "pdk_dashboard-page__widgets-section__item__row--success" : "pdk_dashboard-page__widgets-section__item__row--error"
}
}
]
@@ -2915,8 +2940,8 @@ async function runZapretCheck() {
state: "loading",
items: []
});
const zapretChecks = await PodkopShellMethods.checkZapretRuntime();
if (!zapretChecks.success) {
const zapretStatus = await PodkopShellMethods.getZapretStatus();
if (!zapretStatus.success) {
updateCheckStore({
order,
code,
@@ -2927,24 +2952,71 @@ async function runZapretCheck() {
});
throw new Error("Zapret checks failed");
}
const installed = Boolean(zapretChecks.data.zapret_installed);
const installed = Boolean(zapretStatus.data.installed);
const hasZapretRules = Number(zapretStatus.data.enabled_rule_count || 0) > 0;
if (installed) {
updateCheckStore({
order,
code,
title,
description: _("Checks passed"),
state: "success",
items: [
{
state: "success",
key: _("Zapret installed"),
value: ""
},
{
state: "success",
key: hasZapretRules ? _("There are rules using zapret") : _("No rules use zapret"),
value: ""
}
]
});
return;
}
if (hasZapretRules) {
updateCheckStore({
order,
code,
title,
description: _("Zapret not installed"),
state: "error",
items: [
{
state: "error",
key: _("Zapret not installed"),
value: ""
},
{
state: "error",
key: _("There are rules using zapret"),
value: ""
}
]
});
return;
}
updateCheckStore({
order,
code,
title,
description: installed ? _("Checks passed") : _("Checks failed"),
state: installed ? "success" : "error",
description: _("Zapret not installed"),
state: "warning",
items: [
{
state: installed ? "success" : "error",
key: installed ? _("Zapret installed") : _("Zapret not installed"),
state: "warning",
key: _("Zapret not installed"),
value: ""
},
{
state: "success",
key: _("No rules use zapret"),
value: ""
}
]
});
if (!installed) {
throw new Error("Zapret checks failed");
}
}
// src/partials/button/styles.ts
@@ -4260,6 +4332,7 @@ var UNKNOWN_DIAGNOSTICS_SYSTEM_INFO = {
luci_app_version: _("unknown"),
sing_box_version: _("unknown"),
zapret_version: _("unknown"),
zapret_installed: 0,
openwrt_version: _("unknown"),
device_model: _("unknown")
};
@@ -4684,7 +4757,7 @@ function renderDiagnosticSystemInfoWidget() {
},
{
key: "Zapret",
value: diagnosticsSystemInfo.zapret_version
value: diagnosticsSystemInfo.zapret_installed ? diagnosticsSystemInfo.zapret_version : _("not installed")
},
{
key: "OS",
@@ -164,6 +164,125 @@ const NFQWS_REQUIRED_ARG_OPTIONS = new Set([
"--wssize-cutoff",
"--wssize-forced-cutoff",
]);
const zapretAvailabilityState = {
loaded: false,
installed: true,
};
let zapretAvailabilityPromise = null;
function ensureZapretAvailabilityLoaded() {
if (zapretAvailabilityState.loaded) {
return Promise.resolve(zapretAvailabilityState);
}
if (zapretAvailabilityPromise) {
return zapretAvailabilityPromise;
}
zapretAvailabilityPromise = main.PodkopShellMethods.getZapretStatus()
.then((result) => {
zapretAvailabilityState.loaded = true;
zapretAvailabilityState.installed = Boolean(
result && result.success && result.data && result.data.installed,
);
return zapretAvailabilityState;
})
.catch(() => {
zapretAvailabilityState.loaded = true;
zapretAvailabilityState.installed = true;
return zapretAvailabilityState;
})
.finally(() => {
zapretAvailabilityPromise = null;
});
return zapretAvailabilityPromise;
}
function isZapretInstalledForUi() {
return zapretAvailabilityState.installed;
}
function getRuleResolvedAction(section_id) {
const action = uci.get("podkop", section_id, "action");
if (action) {
return `${action}`;
}
const connectionType = uci.get("podkop", section_id, "connection_type");
switch (connectionType) {
case "proxy":
case "vpn":
return "proxy";
case "block":
return "block";
case "exclusion":
return "direct";
default:
return "proxy";
}
}
function getActionOptionLabel(action) {
switch (`${action}`) {
case "block":
return _("Block");
case "direct":
return "Direct";
case "zapret":
return isZapretInstalledForUi()
? _("Zapret")
: _("Zapret (package not installed)");
case "proxy":
default:
return _("Proxy");
}
}
function getRuleActionDisplayValue(section_id) {
const action = getRuleResolvedAction(section_id);
if (action === "zapret") {
return _("Zapret");
}
return getActionOptionLabel(action);
}
function getRuleActionDisplayMarkup(section_id) {
return getRuleActionDisplayValue(section_id);
}
function populateActionOptionValues(option) {
delete option.keylist;
delete option.vallist;
option.value("proxy", _("Proxy"));
option.value("direct", "Direct");
option.value("block", _("Block"));
option.value("zapret", getActionOptionLabel("zapret"));
}
function disableUnavailableZapretOption(node) {
if (!node || isZapretInstalledForUi()) {
return;
}
const select =
typeof node.querySelector === "function"
? node.querySelector("select")
: null;
if (!select || !select.options) {
return;
}
Array.from(select.options).forEach((option) => {
if (option.value === "zapret") {
option.disabled = true;
option.textContent = _("Zapret (package not installed)");
}
});
}
function getConfigListValues(section_id, key) {
return normalizeOptionValues(uci.get("podkop", section_id, key));
@@ -360,7 +479,10 @@ function applyTextareaInputAttributes(textarea) {
if (nextMinHeight > 0) {
if (storedMinHeight <= 0) {
textarea.setAttribute("data-pdk-default-min-height", `${nextMinHeight}`);
textarea.setAttribute(
"data-pdk-default-min-height",
`${nextMinHeight}`,
);
}
textarea.style.minHeight = `${nextMinHeight}px`;
@@ -1383,36 +1505,6 @@ function getCustomRulesetReferences(section_id) {
);
}
function getRuleActionDisplayValue(section_id) {
const action = uci.get("podkop", section_id, "action");
if (action) {
switch (`${action}`) {
case "block":
return "Block";
case "direct":
return "Direct";
case "zapret":
return "Zapret";
case "proxy":
default:
return "Proxy";
}
}
const connectionType = uci.get("podkop", section_id, "connection_type");
switch (connectionType) {
case "proxy":
case "vpn":
return "Proxy";
case "block":
return "Block";
case "exclusion":
return "Direct";
default:
return "Proxy";
}
}
function createSectionContent(section) {
let o;
@@ -1432,6 +1524,13 @@ function createSectionContent(section) {
_("Action"),
);
o.modalonly = false;
o.rawhtml = true;
o.load = function () {
return ensureZapretAvailabilityLoaded();
};
o.cfgvalue = function (section_id) {
return getRuleActionDisplayMarkup(section_id);
};
o.textvalue = function (section_id) {
return getRuleActionDisplayValue(section_id);
};
@@ -1457,13 +1556,28 @@ function createSectionContent(section) {
_("Action"),
_("What Podkop Plus should do when this section matches"),
);
o.value("proxy", "Proxy");
o.value("direct", "Direct");
o.value("block", "Block");
o.value("zapret", "Zapret");
populateActionOptionValues(o);
o.default = "proxy";
o.rmempty = false;
o.modalonly = true;
o.load = function () {
return ensureZapretAvailabilityLoaded().then(() => {
populateActionOptionValues(this);
});
};
{
const originalRenderWidget = o.renderWidget;
o.renderWidget = function (section_id, option_index, cfgvalue) {
const node = originalRenderWidget.call(
this,
section_id,
option_index,
cfgvalue,
);
disableUnavailableZapretOption(node);
return node;
};
}
o = section.taboption(
"settings",
+23 -2
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PODKOP PLUS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-07 21:03+0300\n"
"PO-Revision-Date: 2026-04-07 21:03+0300\n"
"POT-Creation-Date: 2026-04-11 21:16+0300\n"
"PO-Revision-Date: 2026-04-11 21:16+0300\n"
"Last-Translator: ushan0v\n"
"Language-Team: none\n"
"Language: ru\n"
@@ -20,6 +20,9 @@ msgstr ""
msgid "✔ Running"
msgstr "✔ Работает"
msgid "✘ Not installed"
msgstr "✘ Не установлен"
msgid "✘ Stopped"
msgstr "✘ Остановлен"
@@ -77,6 +80,9 @@ msgstr "Backend-проверка завершилась ошибкой: %s"
msgid "Binary file"
msgstr "Бинарный файл"
msgid "Block"
msgstr ""
msgid "Bootsrap DNS"
msgstr "Bootstrap DNS"
@@ -551,12 +557,18 @@ msgstr "Стратегия NFQWS не может быть пустой"
msgid "No other marking rules found"
msgstr "Другие правила маркировки не найдены"
msgid "No rules use zapret"
msgstr "Нет правил использующих zapret"
msgid "Node Type"
msgstr "Тип узла"
msgid "Not implement yet"
msgstr "Ещё не реализовано"
msgid "not installed"
msgstr "не установлен"
msgid "Not responding"
msgstr "Не отвечает"
@@ -620,6 +632,9 @@ msgstr "Порт не может быть пустым"
msgid "Port for the local mixed proxy of this section"
msgstr "Порт локального смешанного прокси для этой секции"
msgid "Proxy"
msgstr ""
msgid "Proxy Configuration URL"
msgstr "URL конфигурации прокси"
@@ -824,6 +839,9 @@ msgstr "DNS-сервер, используемый для поиска IP-адр
msgid "The NFQUEUE number is assigned by Podkop Plus for each rule and must not be overridden here."
msgstr "Номер NFQUEUE назначается Podkop Plus для каждого правила и не должен переопределяться здесь."
msgid "There are rules using zapret"
msgstr "Есть правила использующие zapret"
msgid "This field must start a working nfqws strategy; --dry-run exits immediately and is not allowed here."
msgstr "Это поле должно запускать рабочую стратегию nfqws; --dry-run сразу завершает процесс и здесь запрещён."
@@ -959,6 +977,9 @@ msgstr "Вы можете выбрать выходной сетевой инт
msgid "Zapret"
msgstr "Zapret"
msgid "Zapret (package not installed)"
msgstr "Zapret (пакет не установлен)"
msgid "Zapret hostlist templates are not supported here because Podkop Plus does not expand them for per-rule NFQWS strategies."
msgstr "Шаблоны hostlist zapret здесь не поддерживаются, потому что Podkop Plus не разворачивает их для per-rule стратегий NFQWS."
+169 -134
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PODKOP PLUS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-07 18:03+0300\n"
"PO-Revision-Date: 2026-04-07 18:03+0300\n"
"POT-Creation-Date: 2026-04-11 18:16+0300\n"
"PO-Revision-Date: 2026-04-11 18:16+0300\n"
"Last-Translator: ushan0v <ushan0v@users.noreply.github.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
@@ -18,13 +18,17 @@ msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:345
#: src/podkop/tabs/dashboard/initController.ts:356
#: src/podkop/tabs/dashboard/initController.ts:367
#: src/podkop/tabs/dashboard/initController.ts:369
msgid "✔ Running"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:367
msgid "✘ Not installed"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:346
#: src/podkop/tabs/dashboard/initController.ts:357
#: src/podkop/tabs/dashboard/initController.ts:368
#: src/podkop/tabs/dashboard/initController.ts:370
msgid "✘ Stopped"
msgstr ""
@@ -32,7 +36,7 @@ msgstr ""
msgid "A latency-tested group of proxy URLs for this node"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1551
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1700
msgid "A latency-tested group of proxy URLs for this section"
msgstr ""
@@ -40,12 +44,12 @@ msgstr ""
msgid "A manual group of proxy URLs for this node"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1533
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1682
msgid "A manual group of proxy URLs for this section"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1401
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1426
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1524
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1556
msgid "Action"
msgstr ""
@@ -57,7 +61,7 @@ msgstr ""
msgid "Add a section"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1935
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:2084
msgid "Add URLs or local paths to .srs lists"
msgstr ""
@@ -74,15 +78,15 @@ msgid "An error occurred while saving the form:"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:170
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1646
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1795
msgid "Applicable for SOCKS and Shadowsocks links"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:681
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:834
msgid "At least one valid domain must be specified."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:692
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:845
msgid "At least one valid IP or subnet must be specified."
msgstr ""
@@ -94,7 +98,7 @@ msgstr ""
msgid "Available actions"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:783
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:936
msgid "Backend validation failed: %s"
msgstr ""
@@ -102,6 +106,11 @@ msgstr ""
msgid "Binary file"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:229
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:262
msgid "Block"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:65
msgid "Bootsrap DNS"
msgstr ""
@@ -118,7 +127,7 @@ msgstr ""
msgid "Browser is using FakeIP correctly"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1840
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1989
msgid "Built-in rule sets"
msgstr ""
@@ -151,12 +160,12 @@ msgstr ""
msgid "checks"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:38
#: src/podkop/tabs/diagnostic/helpers/getMeta.ts:26
msgid "Checks failed"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:38
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:40
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:82
#: src/podkop/tabs/diagnostic/helpers/getMeta.ts:13
msgid "Checks passed"
msgstr ""
@@ -173,7 +182,7 @@ msgstr ""
msgid "Close"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1389
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1512
msgid "Conditions"
msgstr ""
@@ -185,16 +194,16 @@ msgstr ""
msgid "Configuration for Podkop Plus service"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1492
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1637
msgid "Connection"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1475
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1620
msgid "Connection Type"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:19
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1478
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1623
msgid "Connection URL"
msgstr ""
@@ -256,18 +265,18 @@ msgid "DNS on router"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:227
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1711
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1860
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/settings.js:15
msgid "DNS over HTTPS (DoH)"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:228
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1712
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1861
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/settings.js:16
msgid "DNS over TLS (DoT)"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1709
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1858
msgid "DNS protocol"
msgstr ""
@@ -283,7 +292,7 @@ msgstr ""
msgid "DNS Rewrite TTL"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1727
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1876
msgid "DNS server"
msgstr ""
@@ -300,15 +309,15 @@ msgstr ""
msgid "Do not panic, everything can be fixed, just..."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1810
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1959
msgid "Domain keyword"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1817
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1966
msgid "Domain regex"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1782
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1931
msgid "Domains"
msgstr ""
@@ -349,15 +358,15 @@ msgstr ""
msgid "Drag rows to change priority. The rule at the top is checked first."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:248
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:263
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:283
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:367
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:382
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:402
msgid "Duplicate value"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:8
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/ruleset.js:8
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1391
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1514
msgid "Enable"
msgstr ""
@@ -365,7 +374,7 @@ msgstr ""
msgid "Enable a dedicated DNS resolver when this node uses an interface"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1698
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1847
msgid "Enable a dedicated DNS resolver when this section uses an interface"
msgstr ""
@@ -373,7 +382,7 @@ msgstr ""
msgid "Enable autostart"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1749
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1898
msgid "Enable Mixed Proxy"
msgstr ""
@@ -390,31 +399,31 @@ msgid "Enable YACD WAN Access"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:52
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1514
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1660
msgid "Enter a complete sing-box outbound object"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:103
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1572
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1721
msgid "Every 3 minutes"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:101
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1570
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1719
msgid "Every 30 seconds"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:104
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1573
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1722
msgid "Every 5 minutes"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:102
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1571
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1720
msgid "Every minute"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1796
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1945
msgid "Exact full domain"
msgstr ""
@@ -430,11 +439,11 @@ msgstr ""
msgid "Expecting: %s"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1750
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1899
msgid "Expose this section as a local HTTP+SOCKS proxy"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:844
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:997
msgid "External nfqws config files bypass Podkop Plus queue management and explicit validation."
msgstr ""
@@ -442,12 +451,12 @@ msgstr ""
msgid "Failed to copy!"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:250
#: src/podkop/tabs/diagnostic/initController.ts:254
#: src/podkop/tabs/diagnostic/initController.ts:300
#: src/podkop/tabs/diagnostic/initController.ts:304
#: src/podkop/tabs/diagnostic/initController.ts:341
#: src/podkop/tabs/diagnostic/initController.ts:345
#: src/podkop/tabs/diagnostic/initController.ts:251
#: src/podkop/tabs/diagnostic/initController.ts:255
#: src/podkop/tabs/diagnostic/initController.ts:301
#: src/podkop/tabs/diagnostic/initController.ts:305
#: src/podkop/tabs/diagnostic/initController.ts:342
#: src/podkop/tabs/diagnostic/initController.ts:346
msgid "Failed to execute!"
msgstr ""
@@ -464,7 +473,7 @@ msgstr ""
msgid "Get global check"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:245
#: src/podkop/tabs/diagnostic/initController.ts:246
msgid "Global check"
msgstr ""
@@ -472,7 +481,7 @@ msgstr ""
msgid "How often this remote rule set should be refreshed"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1476
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1621
msgid "How to configure the proxy connection for this section"
msgstr ""
@@ -482,8 +491,8 @@ msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:23
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:179
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1482
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1657
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1627
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1806
msgid "Interface"
msgstr ""
@@ -576,12 +585,12 @@ msgstr ""
msgid "Invalid path format. Path must start with \"/\" and contain valid characters"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1777
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1926
#: src/validators/validateShadowsocksUrl.ts:85
msgid "Invalid port number. Must be between 1 and 65535"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:191
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:310
msgid "Invalid regular expression"
msgstr ""
@@ -682,7 +691,7 @@ msgstr ""
msgid "IP address 0.0.0.0 is not allowed"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1789
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1938
msgid "IPs"
msgstr ""
@@ -690,11 +699,11 @@ msgstr ""
msgid "Issues detected"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:201
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:320
msgid "Keyword must not contain spaces"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:501
#: src/podkop/tabs/diagnostic/initController.ts:502
msgid "Latest"
msgstr ""
@@ -718,32 +727,32 @@ msgstr ""
msgid "Main DNS"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1790
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1939
msgid "Match destination IPs or subnets"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1811
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1960
msgid "Match domains containing a substring"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1783
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1932
msgid "Match domains including all subdomains"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1818
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1967
msgid "Match domains using a regular expression"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1797
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1946
msgid "Match only one exact full domain name"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1825
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1974
msgid "Match source IPs or subnets"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:114
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1584
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1733
msgid "Maximum response time delta in milliseconds"
msgstr ""
@@ -751,7 +760,7 @@ msgstr ""
msgid "Memory Usage"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1761
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1910
msgid "Mixed Proxy Port"
msgstr ""
@@ -760,15 +769,15 @@ msgid "Monitored Interfaces"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:136
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1606
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1755
msgid "Must be a number in the range of 50 - 1000"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1441
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1586
msgid "NFQWS Strategy"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:974
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1127
msgid "NFQWS strategy cannot be empty"
msgstr ""
@@ -776,6 +785,10 @@ msgstr ""
msgid "No other marking rules found"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:45
msgid "No rules use zapret"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:16
msgid "Node Type"
msgstr ""
@@ -784,18 +797,22 @@ msgstr ""
msgid "Not implement yet"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:523
msgid "not installed"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:75
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:81
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:100
msgid "Not responding"
msgstr ""
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:56
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:64
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:72
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:80
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:88
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:96
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:57
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:65
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:73
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:81
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:89
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:97
msgid "Not running"
msgstr ""
@@ -811,18 +828,18 @@ msgstr ""
msgid "Optional node used to download this remote rule set"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1052
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1205
msgid "Optional values must be attached with '=' here; a separate token would be ignored by nfqws."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:22
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:51
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1481
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1513
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1626
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1659
msgid "Outbound JSON"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:491
#: src/podkop/tabs/diagnostic/initController.ts:492
msgid "Outdated"
msgstr ""
@@ -850,12 +867,12 @@ msgstr ""
msgid "Path must end with cache.db"
msgstr ""
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:112
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:120
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:128
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:136
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:144
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:152
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:113
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:121
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:129
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:137
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:145
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:153
msgid "Pending"
msgstr ""
@@ -863,7 +880,7 @@ msgstr ""
msgid "Podkop Plus"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:862
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1015
msgid "Podkop Plus manages the nfqws process lifecycle itself, so daemon mode is not allowed here."
msgstr ""
@@ -875,14 +892,19 @@ msgstr ""
msgid "Podkop Plus will not modify your DHCP configuration"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1769
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1918
msgid "Port cannot be empty"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1762
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1911
msgid "Port for the local mixed proxy of this section"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:238
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:260
msgid "Proxy"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:31
msgid "Proxy Configuration URL"
msgstr ""
@@ -895,7 +917,7 @@ msgstr ""
msgid "Proxy traffic is routed via FakeIP"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1879
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:2028
msgid "Regional options cannot be used together"
msgstr ""
@@ -907,7 +929,7 @@ msgstr ""
msgid "Remote URL to a sing-box rule set"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1697
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1846
msgid "Resolver for interface outbound"
msgstr ""
@@ -915,11 +937,11 @@ msgstr ""
msgid "Resolver For Interface Outbound"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:847
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1000
msgid "Resource selection by hostname inside nfqws is not supported here; sing-box selects resources before NFQUEUE."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:850
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1003
msgid "Resource selection by IP or CIDR inside nfqws is not supported here; sing-box selects resources before NFQUEUE."
msgstr ""
@@ -939,9 +961,9 @@ msgstr ""
msgid "Routing Excluded IPs"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1313
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1322
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1325
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1466
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1475
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1478
msgid "Rule set must be a direct .srs URL or a local .srs path"
msgstr ""
@@ -949,7 +971,7 @@ msgstr ""
msgid "Rule set URL"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1934
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:2083
msgid "Rule sets"
msgstr ""
@@ -981,7 +1003,7 @@ msgstr ""
msgid "Run Diagnostic"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1898
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:2047
msgid "Russia inside restrictions"
msgstr ""
@@ -997,7 +1019,7 @@ msgstr ""
msgid "Section"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1413
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1543
msgid "Section name"
msgstr ""
@@ -1005,7 +1027,7 @@ msgstr ""
msgid "Sections"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1841
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1990
msgid "Select a predefined list for routing"
msgstr ""
@@ -1046,11 +1068,11 @@ msgid "Select the WAN interfaces to be monitored"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:20
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1479
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1624
msgid "Selector"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1532
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1681
msgid "Selector connections"
msgstr ""
@@ -1058,7 +1080,7 @@ msgstr ""
msgid "Selector Links"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1844
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1993
msgid "Service list"
msgstr ""
@@ -1067,11 +1089,11 @@ msgid "Services info"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/podkop.js:391
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1388
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1511
msgid "Settings"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:329
#: src/podkop/tabs/diagnostic/initController.ts:330
#: src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:116
msgid "Show sing-box config"
msgstr ""
@@ -1108,7 +1130,7 @@ msgstr ""
msgid "Source file"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1824
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1973
msgid "Source IPs"
msgstr ""
@@ -1148,7 +1170,7 @@ msgstr ""
msgid "Test latency"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:859
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1012
msgid "The desync fwmark is managed by Podkop Plus for loop prevention and must not be overridden here."
msgstr ""
@@ -1156,23 +1178,28 @@ msgstr ""
msgid "The DNS server used to look up the IP address of an upstream DNS server"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:856
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1009
msgid "The NFQUEUE number is assigned by Podkop Plus for each rule and must not be overridden here."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:865
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:69
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:92
msgid "There are rules using zapret"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1018
msgid "This field must start a working nfqws strategy; --dry-run exits immediately and is not allowed here."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:868
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1021
msgid "This field must start a working nfqws strategy; --version exits immediately and is not allowed here."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1037
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1190
msgid "This flag does not accept a value."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1068
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1221
msgid "This option requires a value."
msgstr ""
@@ -1205,7 +1232,7 @@ msgid "Type"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:229
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1713
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1862
msgid "UDP"
msgstr ""
@@ -1214,15 +1241,15 @@ msgid "UDP (Unprotected DNS)"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:169
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1645
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1794
msgid "UDP over TCP"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:779
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:932
msgid "Unable to validate the NFQWS strategy through the backend parser."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1017
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1170
msgid "Unexpected standalone token. Use explicit flags such as --name or --name=value."
msgstr ""
@@ -1235,9 +1262,9 @@ msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:28
#: src/podkop/tabs/diagnostic/initController.ts:29
#: src/podkop/tabs/diagnostic/initController.ts:30
#: src/podkop/tabs/diagnostic/initController.ts:31
#: src/podkop/tabs/diagnostic/initController.ts:32
#: src/podkop/tabs/diagnostic/initController.ts:463
#: src/podkop/tabs/diagnostic/initController.ts:33
#: src/podkop/tabs/diagnostic/initController.ts:464
msgid "unknown"
msgstr ""
@@ -1245,7 +1272,7 @@ msgstr ""
msgid "Unknown error"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1028
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1181
msgid "Unknown NFQWS flag."
msgstr ""
@@ -1267,15 +1294,15 @@ msgid "URL must use one of the following protocols:"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:21
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1480
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1625
msgid "URLTest"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1550
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1699
msgid "URLTest connections"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1568
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1717
msgid "URLTest interval"
msgstr ""
@@ -1287,7 +1314,7 @@ msgstr ""
msgid "URLTest Links"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1583
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1732
msgid "URLTest tolerance"
msgstr ""
@@ -1296,7 +1323,7 @@ msgid "URLTest Tolerance"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:139
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1613
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1762
msgid "URLTest URL"
msgstr ""
@@ -1304,7 +1331,7 @@ msgstr ""
msgid "Use a network interface as the outbound for this node"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1658
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1807
msgid "Use a network interface as the outbound for this section"
msgstr ""
@@ -1325,35 +1352,35 @@ msgstr ""
msgid "Valid"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:255
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:275
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:279
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:374
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:394
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:398
msgid "Validation errors:"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:289
#: src/podkop/tabs/diagnostic/initController.ts:290
#: src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:107
msgid "View logs"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1414
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1544
msgid "Visible name of this section"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/node.js:32
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1493
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1638
msgid "vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1881
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:2030
msgid "Warning: %s cannot be used together with %s. Previous selections have been removed."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1900
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:2049
msgid "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection."
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1427
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1557
msgid "What Podkop Plus should do when this section matches"
msgstr ""
@@ -1365,18 +1392,26 @@ msgstr ""
msgid "You can select Output Network Interface, by default autodetect"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:234
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:246
#: src/podkop/tabs/dashboard/initController.ts:365
msgid "Zapret"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:853
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:235
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:282
msgid "Zapret (package not installed)"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:1006
msgid "Zapret hostlist templates are not supported here because Podkop Plus does not expand them for per-rule NFQWS strategies."
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:43
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:87
msgid "Zapret installed"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:43
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:59
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:64
msgid "Zapret not installed"
msgstr ""
+25 -4
View File
@@ -38,6 +38,7 @@ PODKOP_RUNTIME_STATE_DIR="/var/run/podkop-plus"
PODKOP_RELOAD_STATE_FILE="$PODKOP_RUNTIME_STATE_DIR/reload-state"
PODKOP_RELOAD_STATE_FORMAT=1
PODKOP_NFT_POPULATE_ENABLED=1
PODKOP_ZAPRET_MISSING_WARNING_EMITTED=0
config_load "$PODKOP_CONFIG"
@@ -1182,6 +1183,16 @@ process_validate_rule() {
action="$(get_rule_action "$section")"
if [ "$action" = "zapret" ]; then
if ! is_zapret_installed; then
if [ "$PODKOP_ZAPRET_MISSING_WARNING_EMITTED" -eq 0 ]; then
log "There are enabled rules with action 'zapret', but the zapret package is not installed. These rules will be skipped." "error"
PODKOP_ZAPRET_MISSING_WARNING_EMITTED=1
fi
config_list_foreach "$section" "community_lists" validate_service
config_list_foreach "$section" "rule_set" validate_ruleset_reference
return 0
fi
validate_rule_nfqws_opt "$section"
fi
@@ -1769,6 +1780,10 @@ configure_outbound_handler() {
proxy_config_type="$(get_proxy_config_type "$section")"
if [ "$action" = "zapret" ]; then
if ! is_zapret_installed; then
return 0
fi
local routing_mark outbound_tag zapret_index
zapret_index="$(get_zapret_rule_index "$section")"
@@ -2225,6 +2240,10 @@ configure_route_rule_handler() {
action="$(get_rule_action "$section")"
[ -n "$action" ] || return 0
if [ "$action" = "zapret" ] && ! is_zapret_installed; then
return 0
fi
log "Configuring route rule '$section' with action '$action'"
if ! rule_has_primary_matchers "$section"; then
@@ -3535,7 +3554,7 @@ get_podkop_latest_version() {
}
get_system_info() {
local podkop_version podkop_latest_version luci_app_version sing_box_version zapret_version openwrt_version device_model
local podkop_version podkop_latest_version luci_app_version sing_box_version zapret_version zapret_installed openwrt_version device_model
podkop_version="$PODKOP_VERSION"
@@ -3555,7 +3574,9 @@ get_system_info() {
sing_box_version="not installed"
fi
if [ -x "$ZAPRET_SOURCE_NFQWS_BIN" ]; then
zapret_installed=0
if is_zapret_installed; then
zapret_installed=1
zapret_version="$(get_zapret_package_version)"
[ -z "$zapret_version" ] && zapret_version="unknown"
else
@@ -3582,6 +3603,7 @@ get_system_info() {
--arg luci_app_version "$luci_app_version" \
--arg sing_box_version "$sing_box_version" \
--arg zapret_version "$zapret_version" \
--argjson zapret_installed "$zapret_installed" \
--arg openwrt_version "$openwrt_version" \
--arg device_model "$device_model" \
'{
@@ -3590,6 +3612,7 @@ get_system_info() {
luci_app_version: $luci_app_version,
sing_box_version: $sing_box_version,
zapret_version: $zapret_version,
zapret_installed: $zapret_installed,
openwrt_version: $openwrt_version,
device_model: $device_model
}'
@@ -4553,5 +4576,3 @@ validate_nfqws_strategy_json)
exit 1
;;
esac
+13 -3
View File
@@ -436,6 +436,10 @@ run_nfqws_dry_run_validation() {
local raw_opt="$1"
local old_ifs output_file output summary needles rc
if ! is_zapret_installed; then
return 0
fi
if ! prepare_zapret_runtime; then
set_nfqws_validation_failure \
"The Podkop Plus zapret runtime is unavailable. Install the upstream zapret package so $ZAPRET_SOURCE_NFQWS_BIN exists."
@@ -650,6 +654,10 @@ prepare_zapret_runtime() {
return 0
}
is_zapret_installed() {
[ -x "$ZAPRET_SOURCE_NFQWS_BIN" ]
}
rewrite_zapret_runtime_paths() {
local source_path runtime_path
@@ -869,9 +877,9 @@ build_generated_zapret_hostlist() {
check_zapret_requirements() {
has_enabled_zapret_rules || return 0
if [ ! -x "$ZAPRET_SOURCE_NFQWS_BIN" ]; then
log "Action 'zapret' requires the upstream zapret runtime package. Missing binary: $ZAPRET_SOURCE_NFQWS_BIN. Aborted." "fatal"
exit 1
if ! is_zapret_installed; then
log "Zapret package is not installed. Rules with action 'zapret' will be skipped until zapret is installed." "error"
return 0
fi
if ! prepare_zapret_runtime; then
@@ -1100,6 +1108,7 @@ _create_zapret_nft_rule_handler() {
create_zapret_nft_rules() {
has_enabled_zapret_rules || return 0
is_zapret_installed || return 0
nft add rule inet "$NFT_TABLE_NAME" mangle_output meta mark \& "$ZAPRET_DESYNC_MARK" == "$ZAPRET_DESYNC_MARK" return
nft add rule inet "$NFT_TABLE_NAME" mangle_output meta mark \& "$ZAPRET_DESYNC_MARK_POSTNAT" == "$ZAPRET_DESYNC_MARK_POSTNAT" return
@@ -1158,6 +1167,7 @@ _start_zapret_runtime_handler() {
start_zapret_runtime() {
has_enabled_zapret_rules || return 0
is_zapret_installed || return 0
stop_zapret_runtime
check_zapret_requirements