Compare commits

..

30 Commits

Author SHA1 Message Date
Kirill Sobakin
0379cf5966 Merge pull request #304 from itdoginfo/fix/diagnostic-singbox-config
feat(diagnostic): stringify sb config json
2026-01-24 12:45:33 +03:00
divocatt
cfee6cec9a feat(diagnostic): stringify sb config json 2026-01-23 16:06:54 +02:00
Kirill Sobakin
ad760a78bf Merge pull request #303 from itdoginfo/fix/minor-fixes
Fix/minor fixes
2026-01-23 15:57:24 +03:00
Andrey Petelin
d854caa4cc fix: Disable dnsmasq noresolv when restoring or using default resolvfile; ensure resolvfile is applied 2026-01-23 17:42:05 +05:00
Andrey Petelin
b44274d7f2 fix: mask selector_proxy_links in podkop redaction to hide sensitive proxy selectors 2026-01-23 16:00:34 +05:00
Andrey Petelin
12d8537d90 fix: only print colored timestamp and message when stdout is a terminal 2026-01-23 15:59:26 +05:00
Kirill Sobakin
8e18426a53 Merge pull request #302 from itdoginfo/fix/log_level
fix: set default log_level to "warn" when missing in settings
2026-01-22 19:23:06 +03:00
Andrey Petelin
41a4f67fd0 fix: set default log_level to "warn" when missing in settings 2026-01-22 21:02:15 +05:00
Kirill Sobakin
c30160d8d3 Merge pull request #296 from itdoginfo/firewall-new-mark
New mark and mask
2026-01-22 13:03:36 +03:00
Kirill Sobakin
42f75c3374 fix: new mark 2026-01-22 13:01:36 +03:00
Kirill Sobakin
2cce383b33 Merge pull request #294 from itdoginfo/roblox
Add Roblox to lists
2026-01-21 18:20:06 +03:00
Kirill Sobakin
81963bfbdf feat: roblox 2026-01-21 18:09:12 +03:00
Kirill Sobakin
f3d2fa5a52 Merge pull request #290 from itdoginfo/feat/exclusion
feat: Add 'exclusion' connection type with direct route rule
2026-01-21 17:34:47 +03:00
Andrey Petelin
474f4b197f Update luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-01-21 19:32:25 +05:00
Andrey Petelin
6083009c80 feat: Add 'exclusion' connection type with direct route rule 2026-01-19 16:10:09 +05:00
Kirill Sobakin
0672c55188 Merge pull request #284 from itdoginfo/fix/firewall
Fix/firewall
2026-01-15 00:39:14 +03:00
Kirill Sobakin
e14a7e7dd1 Merge pull request #286 from itdoginfo/feat/dashboard-selector
Add selector support to dashboard
2026-01-15 00:15:29 +03:00
divocatt
3f7e7cbc4b feat(dashboard): add selector support to dashboard 2026-01-14 21:04:52 +02:00
divocatt
782f08b71b feat(lang): add translations for selector 2026-01-14 20:21:39 +02:00
Andrey Petelin
a40240bb3f fix: use fwmark/mask and bitwise meta mark comparison to correctly match packet marks 2026-01-14 14:09:51 +05:00
Andrey Petelin
1e9a7bffa4 fix: avoid outbound traffic loop by adding NFT_OUTBOUND_MARK (0x90000) and mangle_output return rule (#248) 2026-01-14 10:29:13 +05:00
Andrey Petelin
4448c09c34 fix: replace fakeip mark 0x105 with 0x80000 to avoid conflict with mwan3 (#275) 2026-01-14 10:25:03 +05:00
Kirill Sobakin
af95c0dcd0 Merge pull request #283 from itdoginfo/feat/selector
feat: add selector proxy type support
2026-01-13 13:11:55 +03:00
Andrey Petelin
d2fbff17bf feat: add selector proxy type support 2026-01-09 23:32:58 +05:00
Kirill Sobakin
a73def1f9a Merge pull request #271 from itdoginfo/fix/fully_routed_ips_priority
fix: lower priority of fully_routed_ips relative to routing_excluded_ips
2025-12-21 16:31:22 +03:00
divocat
9976065696 feat: add locales for log level 2025-12-13 18:15:25 +02:00
Andrey Petelin
aa8f2cef41 feat: Add log_level option in LuCI and use configured value for sing-box logging 2025-12-10 17:58:22 +05:00
Andrey Petelin
96f6def701 fix: lower priority of fully_routed_ips relative to routing_excluded_ips 2025-12-10 16:55:23 +05:00
Kirill Sobakin
0152f073b7 Merge pull request #270 from itdoginfo/fix/267-determine-dhcp-ip
Use network_get_ipaddr to obtain LAN listen IP
2025-12-09 16:40:41 +03:00
Andrey Petelin
06ce944e1c fix: add and source network functions, use network_get_ipaddr to obtain LAN listen IP 2025-12-09 15:15:58 +05:00
17 changed files with 612 additions and 299 deletions

View File

@@ -52,21 +52,21 @@
"call": "Applicable for SOCKS and Shadowsocks proxy",
"key": "Applicable for SOCKS and Shadowsocks proxy",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:175"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:198"
]
},
{
"call": "At least one valid domain must be specified. Comments-only content is not allowed.",
"key": "At least one valid domain must be specified. Comments-only content is not allowed.",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:420"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:443"
]
},
{
"call": "At least one valid subnet or IP must be specified. Comments-only content is not allowed.",
"key": "At least one valid subnet or IP must be specified. Comments-only content is not allowed.",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:501"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:524"
]
},
{
@@ -178,7 +178,7 @@
"call": "Community Lists",
"key": "Community Lists",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:275"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:298"
]
},
{
@@ -297,8 +297,8 @@
"call": "Disabled",
"key": "Disabled",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:366",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:446"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:389",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:469"
]
},
{
@@ -312,7 +312,7 @@
"call": "DNS over HTTPS (DoH)",
"key": "DNS over HTTPS (DoH)",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:243",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:266",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:15"
]
},
@@ -320,7 +320,7 @@
"call": "DNS over TLS (DoT)",
"key": "DNS over TLS (DoT)",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:244",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:267",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:16"
]
},
@@ -328,7 +328,7 @@
"call": "DNS Protocol Type",
"key": "DNS Protocol Type",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:240",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:263",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:12"
]
},
@@ -343,7 +343,7 @@
"call": "DNS Server",
"key": "DNS Server",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:253",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:276",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:24"
]
},
@@ -365,7 +365,7 @@
"call": "Domain Resolver",
"key": "Domain Resolver",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:230"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:253"
]
},
{
@@ -416,8 +416,8 @@
"call": "Dynamic List",
"key": "Dynamic List",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:367",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:447"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:390",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:470"
]
},
{
@@ -431,14 +431,14 @@
"call": "Enable built-in DNS resolver for domains handled by this section",
"key": "Enable built-in DNS resolver for domains handled by this section",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:231"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:254"
]
},
{
"call": "Enable Mixed Proxy",
"key": "Enable Mixed Proxy",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:639"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:662"
]
},
{
@@ -452,7 +452,7 @@
"call": "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies",
"key": "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:640"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:663"
]
},
{
@@ -480,63 +480,63 @@
"call": "Enter domain names separated by commas, spaces, or newlines. You can add comments using //",
"key": "Enter domain names separated by commas, spaces, or newlines. You can add comments using //",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:402"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:425"
]
},
{
"call": "Enter domain names without protocols, e.g. example.com or sub.example.com",
"key": "Enter domain names without protocols, e.g. example.com or sub.example.com",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:376"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:399"
]
},
{
"call": "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses",
"key": "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:456"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:479"
]
},
{
"call": "Every 1 minute",
"key": "Every 1 minute",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:114"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:137"
]
},
{
"call": "Every 3 minutes",
"key": "Every 3 minutes",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:115"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:138"
]
},
{
"call": "Every 30 seconds",
"key": "Every 30 seconds",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:113"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:136"
]
},
{
"call": "Every 5 minutes",
"key": "Every 5 minutes",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:116"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:139"
]
},
{
"call": "Exclude NTP",
"key": "Exclude NTP",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:384"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:402"
]
},
{
"call": "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN",
"key": "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:385"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:403"
]
},
{
@@ -570,7 +570,7 @@
"call": "Fully Routed IPs",
"key": "Fully Routed IPs",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:614"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:637"
]
},
{
@@ -711,14 +711,14 @@
"call": "Invalid HY2 URL: parsing failed",
"key": "Invalid HY2 URL: parsing failed",
"places": [
"src/validators/validateHysteriaUrl.ts:113"
"src/validators/validateHysteriaUrl.ts:115"
]
},
{
"call": "Invalid HY2 URL: sni cannot be empty",
"key": "Invalid HY2 URL: sni cannot be empty",
"places": [
"src/validators/validateHysteriaUrl.ts:106"
"src/validators/validateHysteriaUrl.ts:108"
]
},
{
@@ -950,14 +950,21 @@
"call": "Local Domain Lists",
"key": "Local Domain Lists",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:522"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:545"
]
},
{
"call": "Local Subnet Lists",
"key": "Local Subnet Lists",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:545"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:568"
]
},
{
"call": "Log Level",
"key": "Log Level",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:384"
]
},
{
@@ -978,7 +985,7 @@
"call": "Mixed Proxy Port",
"key": "Mixed Proxy Port",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:650"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:673"
]
},
{
@@ -992,14 +999,14 @@
"call": "Must be a number in the range of 50 - 1000",
"key": "Must be a number in the range of 50 - 1000",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:140"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:163"
]
},
{
"call": "Network Interface",
"key": "Network Interface",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:184"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:207"
]
},
{
@@ -1047,7 +1054,7 @@
"call": "Outbound Config",
"key": "Outbound Config",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:26"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:28"
]
},
{
@@ -1135,7 +1142,7 @@
"call": "Proxy Configuration URL",
"key": "Proxy Configuration URL",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:34"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:35"
]
},
{
@@ -1156,21 +1163,21 @@
"call": "Regional options cannot be used together",
"key": "Regional options cannot be used together",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:309"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:332"
]
},
{
"call": "Remote Domain Lists",
"key": "Remote Domain Lists",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:568"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:591"
]
},
{
"call": "Remote Subnet Lists",
"key": "Remote Subnet Lists",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:591"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:614"
]
},
{
@@ -1198,7 +1205,7 @@
"call": "Routing Excluded IPs",
"key": "Routing Excluded IPs",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:395"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:413"
]
},
{
@@ -1254,7 +1261,7 @@
"call": "Russia inside restrictions",
"key": "Russia inside restrictions",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:328"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:351"
]
},
{
@@ -1275,7 +1282,7 @@
"call": "Select a predefined list for routing",
"key": "Select a predefined list for routing",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:276"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:299"
]
},
{
@@ -1310,14 +1317,14 @@
"call": "Select network interface for VPN connection",
"key": "Select network interface for VPN connection",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:185"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:208"
]
},
{
"call": "Select or enter DNS server address",
"key": "Select or enter DNS server address",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:254",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:277",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:25"
]
},
@@ -1339,21 +1346,28 @@
"call": "Select the DNS protocol type for the domain resolver",
"key": "Select the DNS protocol type for the domain resolver",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:241"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:264"
]
},
{
"call": "Select the list type for adding custom domains",
"key": "Select the list type for adding custom domains",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:364"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:387"
]
},
{
"call": "Select the list type for adding custom subnets",
"key": "Select the list type for adding custom subnets",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:444"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:467"
]
},
{
"call": "Select the log level for sing-box",
"key": "Select the log level for sing-box",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:385"
]
},
{
@@ -1377,6 +1391,20 @@
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:199"
]
},
{
"call": "Selector",
"key": "Selector",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:26"
]
},
{
"call": "Selector Proxy Links",
"key": "Selector Proxy Links",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:87"
]
},
{
"call": "Services info",
"key": "Services info",
@@ -1459,36 +1487,36 @@
"call": "Specify a local IP address to be excluded from routing",
"key": "Specify a local IP address to be excluded from routing",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:396"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:414"
]
},
{
"call": "Specify local IP addresses or subnets whose traffic will always be routed through the configured route",
"key": "Specify local IP addresses or subnets whose traffic will always be routed through the configured route",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:615"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:638"
]
},
{
"call": "Specify remote URLs to download and use domain lists",
"key": "Specify remote URLs to download and use domain lists",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:569"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592"
]
},
{
"call": "Specify remote URLs to download and use subnet lists",
"key": "Specify remote URLs to download and use subnet lists",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:615"
]
},
{
"call": "Specify the path to the list file located on the router filesystem",
"key": "Specify the path to the list file located on the router filesystem",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:523",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:546"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:546",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:569"
]
},
{
@@ -1544,8 +1572,8 @@
"call": "Text List",
"key": "Text List",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:368",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:448"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:391",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:471"
]
},
{
@@ -1559,21 +1587,21 @@
"call": "The interval between connectivity tests",
"key": "The interval between connectivity tests",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:134"
]
},
{
"call": "The maximum difference in response times (ms) allowed when comparing servers",
"key": "The maximum difference in response times (ms) allowed when comparing servers",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:124"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:147"
]
},
{
"call": "The URL used to test server connectivity",
"key": "The URL used to test server connectivity",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:147"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:170"
]
},
{
@@ -1622,7 +1650,7 @@
"call": "UDP (Unprotected DNS)",
"key": "UDP (Unprotected DNS)",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:245",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:268",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:17"
]
},
@@ -1630,7 +1658,7 @@
"call": "UDP over TCP",
"key": "UDP over TCP",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:174"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:197"
]
},
{
@@ -1686,70 +1714,70 @@
"call": "URLTest Check Interval",
"key": "URLTest Check Interval",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:133"
]
},
{
"call": "URLTest Proxy Links",
"key": "URLTest Proxy Links",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:87"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110"
]
},
{
"call": "URLTest Testing URL",
"key": "URLTest Testing URL",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:146"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:169"
]
},
{
"call": "URLTest Tolerance",
"key": "URLTest Tolerance",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:123"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:146"
]
},
{
"call": "User Domain List Type",
"key": "User Domain List Type",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:363"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:386"
]
},
{
"call": "User Domains",
"key": "User Domains",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:375"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:398"
]
},
{
"call": "User Domains List",
"key": "User Domains List",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:401"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:424"
]
},
{
"call": "User Subnet List Type",
"key": "User Subnet List Type",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:443"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:466"
]
},
{
"call": "User Subnets",
"key": "User Subnets",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:455"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:478"
]
},
{
"call": "User Subnets List",
"key": "User Subnets List",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:481"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:504"
]
},
{
@@ -1760,7 +1788,7 @@
"src/validators/validateDns.ts:18",
"src/validators/validateDomain.ts:13",
"src/validators/validateDomain.ts:30",
"src/validators/validateHysteriaUrl.ts:111",
"src/validators/validateHysteriaUrl.ts:113",
"src/validators/validateIp.ts:8",
"src/validators/validateOutboundJson.ts:7",
"src/validators/validatePath.ts:16",
@@ -1776,8 +1804,8 @@
"call": "Validation errors:",
"key": "Validation errors:",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:434",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:513"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:457",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:536"
]
},
{
@@ -1795,18 +1823,27 @@
"src/podkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts:31"
]
},
{
"call": "vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links",
"key": "vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:36",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:88",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111"
]
},
{
"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/htdocs/luci-static/resources/view/podkop/section.js:311"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:334"
]
},
{
"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/htdocs/luci-static/resources/view/podkop/section.js:330"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:353"
]
},
{

View File

@@ -1,15 +1,15 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER
# Copyright (C) 2026 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PODKOP package.
# divocat <divocatt@gmail.com>, 2025.
# divocatt <210179590+divocatt@users.noreply.github.com>, 2026.
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PODKOP\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-01 14:30+0200\n"
"PO-Revision-Date: 2025-12-01 14:30+0200\n"
"Last-Translator: divocat <divocatt@gmail.com>\n"
"POT-Creation-Date: 2026-01-14 18:21+0200\n"
"PO-Revision-Date: 2026-01-14 18:21+0200\n"
"Last-Translator: divocatt <210179590+divocatt@users.noreply.github.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
@@ -44,15 +44,15 @@ msgstr ""
msgid "Allows access to YACD from the WAN. Make sure to open the appropriate port in your firewall."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:175
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:198
msgid "Applicable for SOCKS and Shadowsocks proxy"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:420
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:443
msgid "At least one valid domain must be specified. Comments-only content is not allowed."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:501
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:524
msgid "At least one valid subnet or IP must be specified. Comments-only content is not allowed."
msgstr ""
@@ -119,7 +119,7 @@ msgstr ""
msgid "Close"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:275
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:298
msgid "Community Lists"
msgstr ""
@@ -187,8 +187,8 @@ msgstr ""
msgid "Disable the QUIC protocol to improve compatibility or fix issues with video streaming"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:366
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:446
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:389
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:469
msgid "Disabled"
msgstr ""
@@ -196,17 +196,17 @@ msgstr ""
msgid "DNS on router"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:243
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:266
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:15
msgid "DNS over HTTPS (DoH)"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:244
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:267
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:16
msgid "DNS over TLS (DoT)"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:240
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:263
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:12
msgid "DNS Protocol Type"
msgstr ""
@@ -215,7 +215,7 @@ msgstr ""
msgid "DNS Rewrite TTL"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:253
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:276
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:24
msgid "DNS Server"
msgstr ""
@@ -228,7 +228,7 @@ msgstr ""
msgid "Do not panic, everything can be fixed, just..."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:230
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:253
msgid "Domain Resolver"
msgstr ""
@@ -258,8 +258,8 @@ msgstr ""
msgid "Downloading all lists via specific Proxy/VPN"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:367
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:447
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:390
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:470
msgid "Dynamic List"
msgstr ""
@@ -267,11 +267,11 @@ msgstr ""
msgid "Enable autostart"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:231
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:254
msgid "Enable built-in DNS resolver for domains handled by this section"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:639
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:662
msgid "Enable Mixed Proxy"
msgstr ""
@@ -279,7 +279,7 @@ msgstr ""
msgid "Enable Output Network Interface"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:640
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:663
msgid "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies"
msgstr ""
@@ -295,39 +295,39 @@ msgstr ""
msgid "Enter complete outbound configuration in JSON format"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:402
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:425
msgid "Enter domain names separated by commas, spaces, or newlines. You can add comments using //"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:376
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:399
msgid "Enter domain names without protocols, e.g. example.com or sub.example.com"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:456
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:479
msgid "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:114
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:137
msgid "Every 1 minute"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:115
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:138
msgid "Every 3 minutes"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:113
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:136
msgid "Every 30 seconds"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:116
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:139
msgid "Every 5 minutes"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:384
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:402
msgid "Exclude NTP"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:385
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:403
msgid "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN"
msgstr ""
@@ -349,7 +349,7 @@ msgstr ""
msgid "Fastest"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:614
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:637
msgid "Fully Routed IPs"
msgstr ""
@@ -430,11 +430,11 @@ msgstr ""
msgid "Invalid HY2 URL: obfs-password required when obfs is set"
msgstr ""
#: src/validators/validateHysteriaUrl.ts:113
#: src/validators/validateHysteriaUrl.ts:115
msgid "Invalid HY2 URL: parsing failed"
msgstr ""
#: src/validators/validateHysteriaUrl.ts:106
#: src/validators/validateHysteriaUrl.ts:108
msgid "Invalid HY2 URL: sni cannot be empty"
msgstr ""
@@ -567,14 +567,18 @@ msgstr ""
msgid "List Update Frequency"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:522
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:545
msgid "Local Domain Lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:545
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:568
msgid "Local Subnet Lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:384
msgid "Log Level"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:72
msgid "Main DNS"
msgstr ""
@@ -583,7 +587,7 @@ msgstr ""
msgid "Memory Usage"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:650
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:673
msgid "Mixed Proxy Port"
msgstr ""
@@ -591,11 +595,11 @@ msgstr ""
msgid "Monitored Interfaces"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:140
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:163
msgid "Must be a number in the range of 50 - 1000"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:184
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:207
msgid "Network Interface"
msgstr ""
@@ -625,7 +629,7 @@ msgstr ""
msgid "Operation timed out"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:26
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:28
msgid "Outbound Config"
msgstr ""
@@ -677,7 +681,7 @@ msgstr ""
msgid "Podkop will not modify your DHCP configuration"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:34
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:35
msgid "Proxy Configuration URL"
msgstr ""
@@ -689,15 +693,15 @@ msgstr ""
msgid "Proxy traffic is routed via FakeIP"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:309
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:332
msgid "Regional options cannot be used together"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:568
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:591
msgid "Remote Domain Lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:591
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:614
msgid "Remote Subnet Lists"
msgstr ""
@@ -713,7 +717,7 @@ msgstr ""
msgid "Router DNS is routed through sing-box"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:395
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:413
msgid "Routing Excluded IPs"
msgstr ""
@@ -745,7 +749,7 @@ msgstr ""
msgid "Run Diagnostic"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:328
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:351
msgid "Russia inside restrictions"
msgstr ""
@@ -757,7 +761,7 @@ msgstr ""
msgid "Sections"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:276
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:299
msgid "Select a predefined list for routing"
msgstr ""
@@ -777,11 +781,11 @@ msgstr ""
msgid "Select how to configure the proxy"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:185
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:208
msgid "Select network interface for VPN connection"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:254
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:277
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:25
msgid "Select or enter DNS server address"
msgstr ""
@@ -794,18 +798,22 @@ msgstr ""
msgid "Select path for sing-box config file. Change this ONLY if you know what you are doing"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:241
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:264
msgid "Select the DNS protocol type for the domain resolver"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:364
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:387
msgid "Select the list type for adding custom domains"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:444
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:467
msgid "Select the list type for adding custom subnets"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:385
msgid "Select the log level for sing-box"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:90
msgid "Select the network interface from which the traffic will originate"
msgstr ""
@@ -818,6 +826,14 @@ msgstr ""
msgid "Select the WAN interfaces to be monitored"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:26
msgid "Selector"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:87
msgid "Selector Proxy Links"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:340
msgid "Services info"
msgstr ""
@@ -863,24 +879,24 @@ msgstr ""
msgid "Source Network Interface"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:396
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:414
msgid "Specify a local IP address to be excluded from routing"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:615
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:638
msgid "Specify local IP addresses or subnets whose traffic will always be routed through the configured route"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:569
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592
msgid "Specify remote URLs to download and use domain lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:615
msgid "Specify remote URLs to download and use subnet lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:523
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:546
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:569
msgid "Specify the path to the list file located on the router filesystem"
msgstr ""
@@ -912,8 +928,8 @@ msgstr ""
msgid "Test latency"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:368
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:448
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:391
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:471
msgid "Text List"
msgstr ""
@@ -921,15 +937,15 @@ msgstr ""
msgid "The DNS server used to look up the IP address of an upstream DNS server"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:134
msgid "The interval between connectivity tests"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:124
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:147
msgid "The maximum difference in response times (ms) allowed when comparing servers"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:147
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:170
msgid "The URL used to test server connectivity"
msgstr ""
@@ -957,12 +973,12 @@ msgstr ""
msgid "TTL value cannot be empty"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:245
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:268
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:17
msgid "UDP (Unprotected DNS)"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:174
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:197
msgid "UDP over TCP"
msgstr ""
@@ -997,43 +1013,43 @@ msgstr ""
msgid "URLTest"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:133
msgid "URLTest Check Interval"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:87
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110
msgid "URLTest Proxy Links"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:146
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:169
msgid "URLTest Testing URL"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:123
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:146
msgid "URLTest Tolerance"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:363
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:386
msgid "User Domain List Type"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:375
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:398
msgid "User Domains"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:401
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:424
msgid "User Domains List"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:443
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:466
msgid "User Subnet List Type"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:455
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:478
msgid "User Subnets"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:481
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:504
msgid "User Subnets List"
msgstr ""
@@ -1041,7 +1057,7 @@ msgstr ""
#: src/validators/validateDns.ts:18
#: src/validators/validateDomain.ts:13
#: src/validators/validateDomain.ts:30
#: src/validators/validateHysteriaUrl.ts:111
#: src/validators/validateHysteriaUrl.ts:113
#: src/validators/validateIp.ts:8
#: src/validators/validateOutboundJson.ts:7
#: src/validators/validatePath.ts:16
@@ -1054,8 +1070,8 @@ msgstr ""
msgid "Valid"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:434
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:513
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:457
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:536
msgid "Validation errors:"
msgstr ""
@@ -1068,11 +1084,17 @@ msgstr ""
msgid "Visit Wiki"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:311
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:36
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:88
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111
msgid "vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:334
msgid "Warning: %s cannot be used together with %s. Previous selections have been removed."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:330
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:353
msgid "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection."
msgstr ""

View File

@@ -1,15 +1,15 @@
# RU translations for PODKOP package.
# Copyright (C) 2025 THE PODKOP'S COPYRIGHT HOLDER
# Copyright (C) 2026 THE PODKOP'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PODKOP package.
# divocat, 2025.
# divocatt, 2026.
#
msgid ""
msgstr ""
"Project-Id-Version: PODKOP\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-01 16:30+0200\n"
"PO-Revision-Date: 2025-12-01 16:30+0200\n"
"Last-Translator: divocat\n"
"POT-Creation-Date: 2026-01-14 20:21+0200\n"
"PO-Revision-Date: 2026-01-14 20:21+0200\n"
"Last-Translator: divocatt\n"
"Language-Team: none\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
@@ -419,6 +419,9 @@ msgstr "Локальные списки доменов"
msgid "Local Subnet Lists"
msgstr "Локальные списки подсетей"
msgid "Log Level"
msgstr "Уровень логов"
msgid "Main DNS"
msgstr "Основной DNS"
@@ -584,6 +587,9 @@ msgstr "Выберите тип списка для добавления пол
msgid "Select the list type for adding custom subnets"
msgstr "Выберите тип списка для добавления пользовательских подсетей"
msgid "Select the log level for sing-box"
msgstr "Выберите уровень логов для sing-box"
msgid "Select the network interface from which the traffic will originate"
msgstr "Выберите сетевой интерфейс, с которого будет исходить трафик"
@@ -593,6 +599,12 @@ msgstr "Выберите сетевой интерфейс, на который
msgid "Select the WAN interfaces to be monitored"
msgstr "Выберите WAN интерфейсы для мониторинга"
msgid "Selector"
msgstr "Selector"
msgid "Selector Proxy Links"
msgstr "Ссылки прокси для Selector"
msgid "Services info"
msgstr "Информация о сервисах"
@@ -761,6 +773,9 @@ msgstr "Посмотреть логи"
msgid "Visit Wiki"
msgstr "Перейти в wiki"
msgid "vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgstr ""
msgid "Warning: %s cannot be used together with %s. Previous selections have been removed."
msgstr "Предупреждение: %s нельзя использовать вместе с %s. Предыдущие варианты были удалены."

View File

@@ -13,11 +13,11 @@
"test": "vitest",
"ci": "yarn format && yarn lint --max-warnings=0 && yarn test --run && yarn build",
"watch:sftp": "node watch-upload.js",
"locales:exctract-calls": "node extract-calls.js",
"locales:extract-calls": "node extract-calls.js",
"locales:generate-pot": "node generate-pot.js",
"locales:generate-po:ru": "node generate-po.js ru",
"locales:distribute": "node distribute-locales.js",
"locales:actualize": "yarn locales:exctract-calls && yarn locales:generate-pot && yarn locales:generate-po:ru && yarn locales:distribute"
"locales:actualize": "yarn locales:extract-calls && yarn locales:generate-pot && yarn locales:generate-po:ru && yarn locales:distribute"
},
"devDependencies": {
"@babel/parser": "7.28.4",

View File

@@ -26,6 +26,7 @@ export const ALLOWED_WITH_RUSSIA_INSIDE = [
'hetzner',
'ovh',
'hodca',
'roblox',
'digitalocean',
'cloudfront',
];
@@ -50,6 +51,7 @@ export const DOMAIN_LIST_OPTIONS = {
google_ai: 'Google AI',
google_play: 'Google Play',
hodca: 'H.O.D.C.A',
roblox: 'Roblox',
hetzner: 'Hetzner ASN',
ovh: 'OVH ASN',
digitalocean: 'Digital Ocean ASN',

View File

@@ -86,6 +86,37 @@ export async function getDashboardSections(): Promise<IGetDashboardSectionsRespo
};
}
if (section.proxy_config_type === 'selector') {
const selector = proxies.find(
(proxy) => proxy.code === `${section['.name']}-out`,
);
const links = section.selector_proxy_links ?? [];
const outbounds = links
.map((link, index) => ({
link,
outbound: proxies.find(
(item) => item.code === `${section['.name']}-${index + 1}-out`,
),
}))
.map((item) => ({
code: item?.outbound?.code || '',
displayName:
getProxyUrlName(item.link) || item?.outbound?.value?.name || '',
latency: item?.outbound?.value?.history?.[0]?.delay || 0,
type: item?.outbound?.value?.type || '',
selected: selector?.value?.now === item?.outbound?.code,
}));
return {
withTagSelect: true,
code: selector?.code || section['.name'],
displayName: section['.name'],
outbounds,
};
}
if (section.proxy_config_type === 'urltest') {
const selector = proxies.find(
(proxy) => proxy.code === `${section['.name']}-out`,

View File

@@ -288,7 +288,10 @@ async function handleShowSingBoxConfig() {
if (showSingBoxConfig.success) {
ui.showModal(
_('Show sing-box config'),
renderModal(showSingBoxConfig.data as string, 'show_sing_box_config'),
renderModal(
JSON.stringify(showSingBoxConfig.data, null, 2),
'show_sing_box_config',
),
);
} else {
logger.error(

View File

@@ -95,6 +95,12 @@ export namespace Podkop {
urltest_proxy_links: string[];
}
export interface ConfigProxySelectorSection {
connection_type: 'proxy';
proxy_config_type: 'selector';
selector_proxy_links: string[];
}
export interface ConfigProxyUrlSection {
connection_type: 'proxy';
proxy_config_type: 'url';
@@ -118,6 +124,7 @@ export namespace Podkop {
export type ConfigBaseSection =
| ConfigProxyUrlTestSection
| ConfigProxySelectorSection
| ConfigProxyUrlSection
| ConfigProxyOutboundSection
| ConfigVpnSection

View File

@@ -757,6 +757,30 @@ async function getDashboardSections() {
]
};
}
if (section.proxy_config_type === "selector") {
const selector = proxies.find(
(proxy) => proxy.code === `${section[".name"]}-out`
);
const links = section.selector_proxy_links ?? [];
const outbounds = links.map((link, index) => ({
link,
outbound: proxies.find(
(item) => item.code === `${section[".name"]}-${index + 1}-out`
)
})).map((item) => ({
code: item?.outbound?.code || "",
displayName: getProxyUrlName(item.link) || item?.outbound?.value?.name || "",
latency: item?.outbound?.value?.history?.[0]?.delay || 0,
type: item?.outbound?.value?.type || "",
selected: selector?.value?.now === item?.outbound?.code
}));
return {
withTagSelect: true,
code: selector?.code || section[".name"],
displayName: section[".name"],
outbounds
};
}
if (section.proxy_config_type === "urltest") {
const selector = proxies.find(
(proxy) => proxy.code === `${section[".name"]}-out`
@@ -860,6 +884,7 @@ var ALLOWED_WITH_RUSSIA_INSIDE = [
"hetzner",
"ovh",
"hodca",
"roblox",
"digitalocean",
"cloudfront"
];
@@ -883,6 +908,7 @@ var DOMAIN_LIST_OPTIONS = {
google_ai: "Google AI",
google_play: "Google Play",
hodca: "H.O.D.C.A",
roblox: "Roblox",
hetzner: "Hetzner ASN",
ovh: "OVH ASN",
digitalocean: "Digital Ocean ASN",
@@ -4138,7 +4164,10 @@ async function handleShowSingBoxConfig() {
if (showSingBoxConfig.success) {
ui.showModal(
_("Show sing-box config"),
renderModal(showSingBoxConfig.data, "show_sing_box_config")
renderModal(
JSON.stringify(showSingBoxConfig.data, null, 2),
"show_sing_box_config"
)
);
} else {
logger.error(

View File

@@ -15,6 +15,7 @@ function createSectionContent(section) {
o.value("proxy", "Proxy");
o.value("vpn", "VPN");
o.value("block", "Block");
o.value("exclusion", "Exclusion");
o = section.option(
form.ListValue,
@@ -23,8 +24,9 @@ function createSectionContent(section) {
_("Select how to configure the proxy"),
);
o.value("url", _("Connection URL"));
o.value("outbound", _("Outbound Config"));
o.value("selector", _("Selector"));
o.value("urltest", _("URLTest"));
o.value("outbound", _("Outbound Config"));
o.default = "url";
o.depends("connection_type", "proxy");
@@ -32,7 +34,7 @@ function createSectionContent(section) {
form.TextValue,
"proxy_string",
_("Proxy Configuration URL"),
"",
_("vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links")
);
o.depends("proxy_config_type", "url");
o.rows = 5;
@@ -42,7 +44,6 @@ function createSectionContent(section) {
o.textarea = true;
o.rmempty = false;
o.sectionDescriptions = new Map();
o.placeholder = "vless://uuid@server:port?type=tcp&security=tls#main";
o.validate = function (section_id, value) {
// Optional
if (!value || value.length === 0) {
@@ -81,13 +82,36 @@ function createSectionContent(section) {
return validation.message;
};
o = section.option(
form.DynamicList,
"selector_proxy_links",
_("Selector Proxy Links"),
_("vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links")
);
o.depends("proxy_config_type", "selector");
o.rmempty = false;
o.validate = function (section_id, value) {
// Optional
if (!value || value.length === 0) {
return true;
}
const validation = main.validateProxyUrl(value);
if (validation.valid) {
return true;
}
return validation.message;
};
o = section.option(
form.DynamicList,
"urltest_proxy_links",
_("URLTest Proxy Links"),
_("vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links")
);
o.depends("proxy_config_type", "urltest");
o.placeholder = "vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links";
o.rmempty = false;
o.validate = function (section_id, value) {
// Optional
@@ -618,6 +642,8 @@ function createSectionContent(section) {
);
o.placeholder = "192.168.1.2 or 192.168.1.0/24";
o.rmempty = true;
o.depends("connection_type", "proxy");
o.depends("connection_type", "vpn");
o.validate = function (section_id, value) {
// Optional
if (!value || value.length === 0) {
@@ -643,6 +669,8 @@ function createSectionContent(section) {
);
o.default = "0";
o.rmempty = false;
o.depends("connection_type", "proxy");
o.depends("connection_type", "vpn");
o = section.option(
form.Value,

View File

@@ -378,6 +378,24 @@ function createSettingsContent(section) {
return true;
};
o = section.option(
form.ListValue,
"log_level",
_("Log Level"),
_(
"Select the log level for sing-box",
),
);
o.value("trace", "Trace");
o.value("debug", "Debug");
o.value("info", "Info");
o.value("warn", "Warn");
o.value("error", "Error");
o.value("fatal", "Fatal");
o.value("panic", "Panic");
o.default = "warn";
o.rmempty = false;
o = section.option(
form.Flag,
"exclude_ntp",

View File

@@ -1,15 +1,15 @@
# RU translations for PODKOP package.
# Copyright (C) 2025 THE PODKOP'S COPYRIGHT HOLDER
# Copyright (C) 2026 THE PODKOP'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PODKOP package.
# divocat, 2025.
# divocatt, 2026.
#
msgid ""
msgstr ""
"Project-Id-Version: PODKOP\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-01 16:30+0200\n"
"PO-Revision-Date: 2025-12-01 16:30+0200\n"
"Last-Translator: divocat\n"
"POT-Creation-Date: 2026-01-14 20:21+0200\n"
"PO-Revision-Date: 2026-01-14 20:21+0200\n"
"Last-Translator: divocatt\n"
"Language-Team: none\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
@@ -419,6 +419,9 @@ msgstr "Локальные списки доменов"
msgid "Local Subnet Lists"
msgstr "Локальные списки подсетей"
msgid "Log Level"
msgstr "Уровень логов"
msgid "Main DNS"
msgstr "Основной DNS"
@@ -584,6 +587,9 @@ msgstr "Выберите тип списка для добавления пол
msgid "Select the list type for adding custom subnets"
msgstr "Выберите тип списка для добавления пользовательских подсетей"
msgid "Select the log level for sing-box"
msgstr "Выберите уровень логов для sing-box"
msgid "Select the network interface from which the traffic will originate"
msgstr "Выберите сетевой интерфейс, с которого будет исходить трафик"
@@ -593,6 +599,12 @@ msgstr "Выберите сетевой интерфейс, на который
msgid "Select the WAN interfaces to be monitored"
msgstr "Выберите WAN интерфейсы для мониторинга"
msgid "Selector"
msgstr "Selector"
msgid "Selector Proxy Links"
msgstr "Ссылки прокси для Selector"
msgid "Services info"
msgstr "Информация о сервисах"
@@ -761,6 +773,9 @@ msgstr "Посмотреть логи"
msgid "Visit Wiki"
msgstr "Перейти в wiki"
msgid "vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgstr ""
msgid "Warning: %s cannot be used together with %s. Previous selections have been removed."
msgstr "Предупреждение: %s нельзя использовать вместе с %s. Предыдущие варианты были удалены."

View File

@@ -1,15 +1,15 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER
# Copyright (C) 2026 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PODKOP package.
# divocat <divocatt@gmail.com>, 2025.
# divocatt <210179590+divocatt@users.noreply.github.com>, 2026.
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PODKOP\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-01 14:30+0200\n"
"PO-Revision-Date: 2025-12-01 14:30+0200\n"
"Last-Translator: divocat <divocatt@gmail.com>\n"
"POT-Creation-Date: 2026-01-14 18:21+0200\n"
"PO-Revision-Date: 2026-01-14 18:21+0200\n"
"Last-Translator: divocatt <210179590+divocatt@users.noreply.github.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
@@ -44,15 +44,15 @@ msgstr ""
msgid "Allows access to YACD from the WAN. Make sure to open the appropriate port in your firewall."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:175
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:198
msgid "Applicable for SOCKS and Shadowsocks proxy"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:420
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:443
msgid "At least one valid domain must be specified. Comments-only content is not allowed."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:501
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:524
msgid "At least one valid subnet or IP must be specified. Comments-only content is not allowed."
msgstr ""
@@ -119,7 +119,7 @@ msgstr ""
msgid "Close"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:275
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:298
msgid "Community Lists"
msgstr ""
@@ -187,8 +187,8 @@ msgstr ""
msgid "Disable the QUIC protocol to improve compatibility or fix issues with video streaming"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:366
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:446
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:389
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:469
msgid "Disabled"
msgstr ""
@@ -196,17 +196,17 @@ msgstr ""
msgid "DNS on router"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:243
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:266
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:15
msgid "DNS over HTTPS (DoH)"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:244
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:267
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:16
msgid "DNS over TLS (DoT)"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:240
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:263
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:12
msgid "DNS Protocol Type"
msgstr ""
@@ -215,7 +215,7 @@ msgstr ""
msgid "DNS Rewrite TTL"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:253
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:276
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:24
msgid "DNS Server"
msgstr ""
@@ -228,7 +228,7 @@ msgstr ""
msgid "Do not panic, everything can be fixed, just..."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:230
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:253
msgid "Domain Resolver"
msgstr ""
@@ -258,8 +258,8 @@ msgstr ""
msgid "Downloading all lists via specific Proxy/VPN"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:367
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:447
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:390
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:470
msgid "Dynamic List"
msgstr ""
@@ -267,11 +267,11 @@ msgstr ""
msgid "Enable autostart"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:231
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:254
msgid "Enable built-in DNS resolver for domains handled by this section"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:639
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:662
msgid "Enable Mixed Proxy"
msgstr ""
@@ -279,7 +279,7 @@ msgstr ""
msgid "Enable Output Network Interface"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:640
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:663
msgid "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies"
msgstr ""
@@ -295,39 +295,39 @@ msgstr ""
msgid "Enter complete outbound configuration in JSON format"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:402
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:425
msgid "Enter domain names separated by commas, spaces, or newlines. You can add comments using //"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:376
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:399
msgid "Enter domain names without protocols, e.g. example.com or sub.example.com"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:456
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:479
msgid "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:114
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:137
msgid "Every 1 minute"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:115
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:138
msgid "Every 3 minutes"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:113
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:136
msgid "Every 30 seconds"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:116
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:139
msgid "Every 5 minutes"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:384
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:402
msgid "Exclude NTP"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:385
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:403
msgid "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN"
msgstr ""
@@ -349,7 +349,7 @@ msgstr ""
msgid "Fastest"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:614
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:637
msgid "Fully Routed IPs"
msgstr ""
@@ -430,11 +430,11 @@ msgstr ""
msgid "Invalid HY2 URL: obfs-password required when obfs is set"
msgstr ""
#: src/validators/validateHysteriaUrl.ts:113
#: src/validators/validateHysteriaUrl.ts:115
msgid "Invalid HY2 URL: parsing failed"
msgstr ""
#: src/validators/validateHysteriaUrl.ts:106
#: src/validators/validateHysteriaUrl.ts:108
msgid "Invalid HY2 URL: sni cannot be empty"
msgstr ""
@@ -567,14 +567,18 @@ msgstr ""
msgid "List Update Frequency"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:522
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:545
msgid "Local Domain Lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:545
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:568
msgid "Local Subnet Lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:384
msgid "Log Level"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:72
msgid "Main DNS"
msgstr ""
@@ -583,7 +587,7 @@ msgstr ""
msgid "Memory Usage"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:650
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:673
msgid "Mixed Proxy Port"
msgstr ""
@@ -591,11 +595,11 @@ msgstr ""
msgid "Monitored Interfaces"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:140
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:163
msgid "Must be a number in the range of 50 - 1000"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:184
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:207
msgid "Network Interface"
msgstr ""
@@ -625,7 +629,7 @@ msgstr ""
msgid "Operation timed out"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:26
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:28
msgid "Outbound Config"
msgstr ""
@@ -677,7 +681,7 @@ msgstr ""
msgid "Podkop will not modify your DHCP configuration"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:34
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:35
msgid "Proxy Configuration URL"
msgstr ""
@@ -689,15 +693,15 @@ msgstr ""
msgid "Proxy traffic is routed via FakeIP"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:309
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:332
msgid "Regional options cannot be used together"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:568
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:591
msgid "Remote Domain Lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:591
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:614
msgid "Remote Subnet Lists"
msgstr ""
@@ -713,7 +717,7 @@ msgstr ""
msgid "Router DNS is routed through sing-box"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:395
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:413
msgid "Routing Excluded IPs"
msgstr ""
@@ -745,7 +749,7 @@ msgstr ""
msgid "Run Diagnostic"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:328
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:351
msgid "Russia inside restrictions"
msgstr ""
@@ -757,7 +761,7 @@ msgstr ""
msgid "Sections"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:276
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:299
msgid "Select a predefined list for routing"
msgstr ""
@@ -777,11 +781,11 @@ msgstr ""
msgid "Select how to configure the proxy"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:185
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:208
msgid "Select network interface for VPN connection"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:254
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:277
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:25
msgid "Select or enter DNS server address"
msgstr ""
@@ -794,18 +798,22 @@ msgstr ""
msgid "Select path for sing-box config file. Change this ONLY if you know what you are doing"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:241
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:264
msgid "Select the DNS protocol type for the domain resolver"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:364
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:387
msgid "Select the list type for adding custom domains"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:444
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:467
msgid "Select the list type for adding custom subnets"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:385
msgid "Select the log level for sing-box"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:90
msgid "Select the network interface from which the traffic will originate"
msgstr ""
@@ -818,6 +826,14 @@ msgstr ""
msgid "Select the WAN interfaces to be monitored"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:26
msgid "Selector"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:87
msgid "Selector Proxy Links"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:340
msgid "Services info"
msgstr ""
@@ -863,24 +879,24 @@ msgstr ""
msgid "Source Network Interface"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:396
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:414
msgid "Specify a local IP address to be excluded from routing"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:615
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:638
msgid "Specify local IP addresses or subnets whose traffic will always be routed through the configured route"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:569
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592
msgid "Specify remote URLs to download and use domain lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:615
msgid "Specify remote URLs to download and use subnet lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:523
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:546
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:569
msgid "Specify the path to the list file located on the router filesystem"
msgstr ""
@@ -912,8 +928,8 @@ msgstr ""
msgid "Test latency"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:368
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:448
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:391
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:471
msgid "Text List"
msgstr ""
@@ -921,15 +937,15 @@ msgstr ""
msgid "The DNS server used to look up the IP address of an upstream DNS server"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:134
msgid "The interval between connectivity tests"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:124
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:147
msgid "The maximum difference in response times (ms) allowed when comparing servers"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:147
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:170
msgid "The URL used to test server connectivity"
msgstr ""
@@ -957,12 +973,12 @@ msgstr ""
msgid "TTL value cannot be empty"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:245
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:268
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:17
msgid "UDP (Unprotected DNS)"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:174
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:197
msgid "UDP over TCP"
msgstr ""
@@ -997,43 +1013,43 @@ msgstr ""
msgid "URLTest"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:133
msgid "URLTest Check Interval"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:87
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110
msgid "URLTest Proxy Links"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:146
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:169
msgid "URLTest Testing URL"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:123
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:146
msgid "URLTest Tolerance"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:363
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:386
msgid "User Domain List Type"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:375
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:398
msgid "User Domains"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:401
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:424
msgid "User Domains List"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:443
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:466
msgid "User Subnet List Type"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:455
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:478
msgid "User Subnets"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:481
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:504
msgid "User Subnets List"
msgstr ""
@@ -1041,7 +1057,7 @@ msgstr ""
#: src/validators/validateDns.ts:18
#: src/validators/validateDomain.ts:13
#: src/validators/validateDomain.ts:30
#: src/validators/validateHysteriaUrl.ts:111
#: src/validators/validateHysteriaUrl.ts:113
#: src/validators/validateIp.ts:8
#: src/validators/validateOutboundJson.ts:7
#: src/validators/validatePath.ts:16
@@ -1054,8 +1070,8 @@ msgstr ""
msgid "Valid"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:434
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:513
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:457
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:536
msgid "Validation errors:"
msgstr ""
@@ -1068,11 +1084,17 @@ msgstr ""
msgid "Visit Wiki"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:311
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:36
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:88
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111
msgid "vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:334
msgid "Warning: %s cannot be used together with %s. Previous selections have been removed."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:330
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:353
msgid "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection."
msgstr ""

View File

@@ -16,6 +16,7 @@ config settings 'settings'
option dont_touch_dhcp '0'
option config_path '/etc/sing-box/config.json'
option cache_path '/tmp/sing-box/cache.db'
option log_level 'warn'
option exclude_ntp '0'
option shutdown_correctly '0'
#list routing_excluded_ips '192.168.1.3'

View File

@@ -12,6 +12,7 @@ check_required_file() {
PODKOP_LIB="/usr/lib/podkop"
check_required_file /lib/functions.sh
check_required_file /lib/config/uci.sh
check_required_file /lib/functions/network.sh
check_required_file "$PODKOP_LIB/constants.sh"
check_required_file "$PODKOP_LIB/nft.sh"
check_required_file "$PODKOP_LIB/helpers.sh"
@@ -19,8 +20,9 @@ check_required_file "$PODKOP_LIB/sing_box_config_manager.sh"
check_required_file "$PODKOP_LIB/sing_box_config_facade.sh"
check_required_file "$PODKOP_LIB/logging.sh"
check_required_file "$PODKOP_LIB/rulesets.sh"
. /lib/config/uci.sh
. /lib/functions.sh
. /lib/config/uci.sh
. /lib/functions/network.sh
. "$PODKOP_LIB/constants.sh"
. "$PODKOP_LIB/nft.sh"
. "$PODKOP_LIB/helpers.sh"
@@ -76,7 +78,7 @@ check_requirements() {
if has_outbound_section; then
log "Outbound section found" "debug"
else
log "Outbound section not found. Please check your configuration file (missing proxy_string, interface, outbound_json, or urltest_proxy_links). Aborted." "error"
log "Outbound section not found. Please check your configuration file (missing proxy_string, selector_proxy_links, urltest_proxy_links, outbound_json, or interface). Aborted." "error"
exit 1
fi
}
@@ -86,12 +88,13 @@ _check_outbound_section() {
local proxy_string interface outbound_json urltest_proxy_links
config_get proxy_string "$section" "proxy_string"
config_get interface "$section" "interface"
config_get outbound_json "$section" "outbound_json"
config_get selector_proxy_links "$section" "selector_proxy_links"
config_get urltest_proxy_links "$section" "urltest_proxy_links"
config_get outbound_json "$section" "outbound_json"
config_get interface "$section" "interface"
if [ -n "$proxy_string" ] || [ -n "$interface" ] ||
[ -n "$outbound_json" ] || [ -n "$urltest_proxy_links" ]; then
if [ -n "$proxy_string" ] || [ -n "$selector_proxy_links" ] || [ -n "$urltest_proxy_links" ] ||
[ -n "$outbound_json" ] || [ -n "$interface" ]; then
section_exists=0
fi
}
@@ -161,12 +164,12 @@ stop_main() {
log "Flush ip rule"
if ip rule list | grep -q "podkop"; then
ip rule del fwmark 0x105 table podkop priority 105
ip rule del fwmark "$NFT_FAKEIP_MARK"/"$NFT_FAKEIP_MARK" table "$RT_TABLE_NAME" priority 105
fi
log "Flush ip route"
if ip route list table podkop > /dev/null 2>&1; then
ip route flush table podkop
if ip route list table "$RT_TABLE_NAME" > /dev/null 2>&1; then
ip route flush table "$RT_TABLE_NAME"
fi
log "Stop sing-box"
@@ -248,20 +251,18 @@ br_netfilter_disable() {
# Main funcs
route_table_rule_mark() {
local table=podkop
grep -q "105 $RT_TABLE_NAME" /etc/iproute2/rt_tables || echo "105 $RT_TABLE_NAME" >> /etc/iproute2/rt_tables
grep -q "105 $table" /etc/iproute2/rt_tables || echo "105 $table" >> /etc/iproute2/rt_tables
if ! ip route list table $table | grep -q "local default dev lo scope host"; then
if ! ip route list table "$RT_TABLE_NAME" 2> /dev/null | grep -q "local default dev lo scope host"; then
log "Added route for tproxy" "debug"
ip route add local 0.0.0.0/0 dev lo table $table
ip route add local 0.0.0.0/0 dev lo table "$RT_TABLE_NAME"
else
log "Route for tproxy exists" "debug"
fi
if ! ip rule list | grep -q "from all fwmark 0x105 lookup $table"; then
if ! ip rule list | grep -q "from all fwmark $NFT_FAKEIP_MARK/$NFT_FAKEIP_MARK lookup $RT_TABLE_NAME"; then
log "Create marking rule" "debug"
ip -4 rule add fwmark 0x105 table $table priority 105
ip -4 rule add fwmark "$NFT_FAKEIP_MARK"/"$NFT_FAKEIP_MARK" table "$RT_TABLE_NAME" priority 105
else
log "Marking rule exist" "debug"
fi
@@ -311,19 +312,20 @@ create_nft_rules() {
nft add chain inet "$NFT_TABLE_NAME" mangle_output '{ type route hook output priority -150; policy accept; }'
nft add chain inet "$NFT_TABLE_NAME" proxy '{ type filter hook prerouting priority -100; policy accept; }'
nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr "@$NFT_COMMON_SET_NAME" meta l4proto tcp meta mark set 0x105 counter
nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr "@$NFT_COMMON_SET_NAME" meta l4proto udp meta mark set 0x105 counter
nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr "$SB_FAKEIP_INET4_RANGE" meta l4proto tcp meta mark set 0x105 counter
nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr "$SB_FAKEIP_INET4_RANGE" meta l4proto udp meta mark set 0x105 counter
nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr "@$NFT_COMMON_SET_NAME" meta l4proto tcp meta mark set "$NFT_FAKEIP_MARK" counter
nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr "@$NFT_COMMON_SET_NAME" meta l4proto udp meta mark set "$NFT_FAKEIP_MARK" counter
nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr "$SB_FAKEIP_INET4_RANGE" meta l4proto tcp meta mark set "$NFT_FAKEIP_MARK" counter
nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr "$SB_FAKEIP_INET4_RANGE" meta l4proto udp meta mark set "$NFT_FAKEIP_MARK" counter
nft add rule inet "$NFT_TABLE_NAME" proxy meta mark 0x105 meta l4proto tcp tproxy ip to 127.0.0.1:1602 counter
nft add rule inet "$NFT_TABLE_NAME" proxy meta mark 0x105 meta l4proto udp tproxy ip to 127.0.0.1:1602 counter
nft add rule inet "$NFT_TABLE_NAME" proxy meta mark \& "$NFT_FAKEIP_MARK" == "$NFT_FAKEIP_MARK" meta l4proto tcp tproxy ip to 127.0.0.1:1602 counter
nft add rule inet "$NFT_TABLE_NAME" proxy meta mark \& "$NFT_FAKEIP_MARK" == "$NFT_FAKEIP_MARK" meta l4proto udp tproxy ip to 127.0.0.1:1602 counter
nft add rule inet "$NFT_TABLE_NAME" mangle_output ip daddr "@$NFT_LOCALV4_SET_NAME" return
nft add rule inet "$NFT_TABLE_NAME" mangle_output ip daddr "@$NFT_COMMON_SET_NAME" meta l4proto tcp meta mark set 0x105 counter
nft add rule inet "$NFT_TABLE_NAME" mangle_output ip daddr "@$NFT_COMMON_SET_NAME" meta l4proto udp meta mark set 0x105 counter
nft add rule inet "$NFT_TABLE_NAME" mangle_output ip daddr "$SB_FAKEIP_INET4_RANGE" meta l4proto tcp meta mark set 0x105 counter
nft add rule inet "$NFT_TABLE_NAME" mangle_output ip daddr "$SB_FAKEIP_INET4_RANGE" meta l4proto udp meta mark set 0x105 counter
nft add rule inet "$NFT_TABLE_NAME" mangle_output meta mark "$NFT_OUTBOUND_MARK" counter return
nft add rule inet "$NFT_TABLE_NAME" mangle_output ip daddr "@$NFT_COMMON_SET_NAME" meta l4proto tcp meta mark set "$NFT_FAKEIP_MARK" counter
nft add rule inet "$NFT_TABLE_NAME" mangle_output ip daddr "@$NFT_COMMON_SET_NAME" meta l4proto udp meta mark set "$NFT_FAKEIP_MARK" counter
nft add rule inet "$NFT_TABLE_NAME" mangle_output ip daddr "$SB_FAKEIP_INET4_RANGE" meta l4proto tcp meta mark set "$NFT_FAKEIP_MARK" counter
nft add rule inet "$NFT_TABLE_NAME" mangle_output ip daddr "$SB_FAKEIP_INET4_RANGE" meta l4proto udp meta mark set "$NFT_FAKEIP_MARK" counter
local exclude_ntp
config_get_bool exclude_ntp "settings" "exclude_ntp" "0"
@@ -398,7 +400,6 @@ dnsmasq_restore() {
log "Restoring noresolv" "debug"
noresolv="$(uci_get "dhcp" "@dnsmasq[0]" "podkop_noresolv")"
if [ -z "$noresolv" ]; then
uci_remove "dhcp" "@dnsmasq[0]" "noresolv"
uci_set "dhcp" "@dnsmasq[0]" "noresolv" 0
else
uci_set "dhcp" "@dnsmasq[0]" "noresolv" "$noresolv"
@@ -417,6 +418,10 @@ dnsmasq_restore() {
elif file_exists "$resolvfile"; then
log "Backup DNS servers not found, using default resolvfile" "debug"
uci_set "dhcp" "@dnsmasq[0]" "resolvfile" "$resolvfile"
if [ -n "$noresolv" ] && [ "$noresolv" -eq 1 ]; then
log "Disabling noresolv option to use system resolvfile" "debug"
uci_set "dhcp" "@dnsmasq[0]" "noresolv" 0
fi
else
log "Backup DNS servers and default resolvfile not found, possible resolving issues" "warn"
fi
@@ -588,7 +593,9 @@ sing_box_init_config() {
sing_box_configure_log() {
log "Configure the log section of a sing-box JSON configuration"
config=$(sing_box_cm_configure_log "$config" false "$SB_DEFAULT_LOG_LEVEL" false)
local log_level
config_get log_level "settings" "log_level" "warn"
config=$(sing_box_cm_configure_log "$config" false "$log_level" false)
}
sing_box_configure_inbounds() {
@@ -641,6 +648,35 @@ configure_outbound_handler() {
config_get json_outbound "$section" "outbound_json"
config=$(sing_box_cf_add_json_outbound "$config" "$section" "$json_outbound")
;;
selector)
log "Detected proxy configuration type: selector" "debug"
local selector_proxy_links udp_over_tcp i outbound_tags outbound_tag default_outbound
config_get selector_proxy_links "$section" "selector_proxy_links"
config_get udp_over_tcp "$section" "enable_udp_over_tcp"
if [ -z "$selector_proxy_links" ]; then
log "URLTest proxy links is not set. Aborted." "fatal"
exit 1
fi
i=1
for link in $selector_proxy_links; do
config="$(sing_box_cf_add_proxy_outbound "$config" "$section-$i" "$link" "$udp_over_tcp")"
outbound_tag="$(get_outbound_tag_by_section "$section-$i")"
if [ -z "$outbound_tags" ]; then
outbound_tags="$outbound_tag"
default_outbound="$outbound_tag"
else
outbound_tags="$outbound_tags,$outbound_tag"
fi
i=$((i + 1))
done
selector_tag="$(get_outbound_tag_by_section "$section")"
selector_outbounds="$(comma_string_to_json_array "$outbound_tags")"
config="$(sing_box_cm_add_selector_outbound "$config" "$selector_tag" "$selector_outbounds" \
"$default_outbound")"
;;
urltest)
log "Detected proxy configuration type: urltest" "debug"
local urltest_proxy_links udp_over_tcp i urltest_tag selector_tag outbound_tag outbound_tags \
@@ -715,6 +751,9 @@ configure_outbound_handler() {
block)
log "Connection type 'block' detected for the $section section no outbound will be created (handled via reject route rules)"
;;
exclusion)
log "Connection type 'exclusion' detected for the $section section no outbound will be created (handled via route rules)"
;;
*)
log "Unknown connection type '$connection_type' for the $section section. Aborted." "fatal"
exit 1
@@ -783,9 +822,8 @@ sing_box_configure_route() {
config=$(sing_box_cf_proxy_domain "$config" "$SB_TPROXY_INBOUND_TAG" "$CHECK_PROXY_IP_DOMAIN" "$first_outbound_tag")
config=$(sing_box_cf_override_domain_port "$config" "$FAKEIP_TEST_DOMAIN" 8443)
config_foreach include_source_ips_in_routing_handler "section"
configure_common_reject_route_rule
configure_common_direct_route_rule
local routing_excluded_ips
config_get routing_excluded_ips "settings" "routing_excluded_ips"
@@ -795,6 +833,8 @@ sing_box_configure_route() {
config_list_foreach "settings" "routing_excluded_ips" exclude_source_ip_from_routing_handler "$rule_tag"
fi
config_foreach include_source_ips_in_routing_handler "section"
config_foreach configure_routing_for_section_lists "section"
}
@@ -815,7 +855,7 @@ include_source_ips_in_routing_handler() {
configure_common_reject_route_rule() {
local block_sections block_section_lists_enabled
block_sections="$(get_block_sections)"
block_sections="$(get_sections_by_connection_type "block")"
block_section_lists_enabled=0
if [ -n "$block_sections" ]; then
@@ -833,6 +873,27 @@ configure_common_reject_route_rule() {
fi
}
configure_common_direct_route_rule() {
local exclusion_sections exclusion_section_list_enabled
exclusion_sections="$(get_sections_by_connection_type "exclusion")"
exclusion_section_list_enabled=0
if [ -n "$exclusion_sections" ]; then
for exclusion_section in $exclusion_sections; do
if section_has_enabled_lists "$exclusion_section"; then
exclusion_section_list_enabled=1
break
fi
done
if [ "$exclusion_section_list_enabled" -eq 1 ]; then
config=$(sing_box_cm_add_route_rule "$config" "$SB_EXCLUSION_RULE_TAG" "$SB_TPROXY_INBOUND_TAG" \
"$SB_DIRECT_OUTBOUND_TAG")
else
log "Exclusion sections does not have any enabled list, route rule is not required" "warn"
fi
fi
}
include_source_ip_in_routing_handler() {
local source_ip="$1"
local rule_tag="$2"
@@ -867,13 +928,23 @@ configure_routing_for_section_lists() {
config_get remote_subnet_lists "$section" "remote_subnet_lists"
config_get section_connection_type "$section" "connection_type"
if [ "$section_connection_type" = "block" ]; then
route_rule_tag="$SB_REJECT_RULE_TAG"
else
case "$section_connection_type" in
proxy | vpn)
route_rule_tag="$(gen_id)"
outbound_tag=$(get_outbound_tag_by_section "$section")
config=$(sing_box_cm_add_route_rule "$config" "$route_rule_tag" "$SB_TPROXY_INBOUND_TAG" "$outbound_tag")
fi
;;
block)
route_rule_tag="$SB_REJECT_RULE_TAG"
;;
exclusion)
route_rule_tag="$SB_EXCLUSION_RULE_TAG"
;;
*)
log "Unsupported '$section_connection_type' connection type. Skipping routing for '$section' section" "fatal"
exit 1
;;
esac
if [ -n "$community_lists" ]; then
log "Processing community list routing rules for '$section' section"
@@ -1239,7 +1310,10 @@ import_community_service_subnet_list_handler() {
URL=$SUBNETS_DISCORD
nft_create_ipv4_set "$NFT_TABLE_NAME" "$NFT_DISCORD_SET_NAME"
nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr \
"@$NFT_DISCORD_SET_NAME" udp dport '{ 50000-65535 }' meta mark set 0x105 counter
"@$NFT_DISCORD_SET_NAME" udp dport '{ 50000-65535 }' meta mark set "$NFT_FAKEIP_MARK" counter
;;
"roblox")
URL=$SUBNETS_ROBLOX
;;
*) return 0 ;;
esac
@@ -1464,12 +1538,16 @@ get_first_outbound_section() {
echo "$first_section"
}
get_block_sections() {
uci show podkop | grep "\.connection_type='block'" | cut -d'.' -f2
get_sections_by_connection_type() {
local connection_type="$1"
uci show podkop | grep "\.connection_type='$connection_type'" | cut -d'.' -f2
}
block_section_exists() {
if uci show podkop | grep -q "\.connection_type='block'"; then
section_by_connection_type_exists() {
local connection_type="$1"
if uci show podkop | grep -q "\.connection_type='$connection_type'"; then
return 0
else
return 1
@@ -1512,7 +1590,8 @@ get_service_listen_address() {
return 0
fi
service_listen_address="$(uci_get "network" "lan" "ipaddr" | awk '{print $1}' | cut -d'/' -f1)"
local interface="lan"
network_get_ipaddr service_listen_address "$interface"
if [ -z "$service_listen_address" ]; then
log "Failed to determine the listening IP address. Please open an issue to report this problem: https://github.com/itdoginfo/podkop/issues" "error"
@@ -1527,8 +1606,10 @@ nft_list_all_traffic_from_ip() {
local ip="$1"
if ! nft list chain inet "$NFT_TABLE_NAME" mangle | grep -q "ip saddr $ip"; then
nft insert rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip saddr "$ip" meta l4proto tcp meta mark set 0x105 counter
nft insert rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip saddr "$ip" meta l4proto udp meta mark set 0x105 counter
nft insert rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip saddr "$ip" \
meta l4proto tcp meta mark set "$NFT_FAKEIP_MARK" counter
nft insert rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip saddr "$ip" \
meta l4proto udp meta mark set "$NFT_FAKEIP_MARK" counter
nft insert rule inet "$NFT_TABLE_NAME" mangle ip saddr "$ip" ip daddr @localv4 return
fi
}
@@ -1753,6 +1834,7 @@ show_config() {
sed -e 's/\(option proxy_string\).*/\1 '\''MASKED'\''/g' \
-e '/option outbound_json/,/^}/c\ option outbound_json '\''MASKED'\''' \
-e 's/\(list urltest_proxy_links\).*/\1 '\''MASKED'\''/g' \
-e 's/\(list selector_proxy_links\).*/\1 '\''MASKED'\''/g' \
-e "s@\\(option dns_server '[^/]*\\)/[^']*'@\\1/MASKED'@g" \
-e "s@\\(option domain_resolver_dns_server '[^/]*\\)/[^']*'@\\1/MASKED'@g" \
-e 's/\(option yacd_secret_key\).*/\1 '\''MASKED'\''/g' \

View File

@@ -12,6 +12,7 @@ TMP_RULESET_FOLDER="$TMP_SING_BOX_FOLDER/rulesets"
CLOUDFLARE_OCTETS="8.47 162.159 188.114" # Endpoints https://github.com/ampetelin/warp-endpoint-checker
JQ_REQUIRED_VERSION="1.7.1"
COREUTILS_BASE64_REQUIRED_VERSION="9.7"
RT_TABLE_NAME="podkop"
## nft
NFT_TABLE_NAME="PodkopTable"
@@ -19,11 +20,11 @@ NFT_LOCALV4_SET_NAME="localv4"
NFT_COMMON_SET_NAME="podkop_subnets"
NFT_DISCORD_SET_NAME="podkop_discord_subnets"
NFT_INTERFACE_SET_NAME="interfaces"
NFT_FAKEIP_MARK="0x00100000"
NFT_OUTBOUND_MARK="0x00200000"
## sing-box
SB_REQUIRED_VERSION="1.12.0"
# Log
SB_DEFAULT_LOG_LEVEL="warn"
# DNS
SB_DNS_SERVER_TAG="dns-server"
SB_FAKEIP_DNS_SERVER_TAG="fakeip-server"
@@ -45,23 +46,21 @@ SB_SERVICE_MIXED_INBOUND_PORT=4534
SB_DIRECT_OUTBOUND_TAG="direct-out"
# Route
SB_REJECT_RULE_TAG="reject-rule-tag"
SB_EXCLUSION_RULE_TAG="exclusion-rule-tag"
# Experimental
SB_CLASH_API_CONTROLLER_PORT=9090
## Lists
GITHUB_RAW_URL="https://raw.githubusercontent.com/itdoginfo/allow-domains/main"
SRS_MAIN_URL="https://github.com/itdoginfo/allow-domains/releases/latest/download"
DOMAINS_RU_INSIDE="${GITHUB_RAW_URL}/Russia/inside-dnsmasq-nfset.lst"
DOMAINS_RU_OUTSIDE="${GITHUB_RAW_URL}/Russia/outside-dnsmasq-nfset.lst"
DOMAINS_UA="${GITHUB_RAW_URL}/Ukraine/inside-dnsmasq-nfset.lst"
DOMAINS_YOUTUBE="${GITHUB_RAW_URL}/Services/youtube.lst"
SUBNETS_TWITTER="${GITHUB_RAW_URL}/Subnets/IPv4/twitter.lst"
SUBNETS_META="${GITHUB_RAW_URL}/Subnets/IPv4/meta.lst"
SUBNETS_DISCORD="${GITHUB_RAW_URL}/Subnets/IPv4/discord.lst"
SUBNETS_ROBLOX="${GITHUB_RAW_URL}/Subnets/IPv4/roblox.lst"
SUBNETS_TELERAM="${GITHUB_RAW_URL}/Subnets/IPv4/telegram.lst"
SUBNETS_CLOUDFLARE="${GITHUB_RAW_URL}/Subnets/IPv4/cloudflare.lst"
SUBNETS_HETZNER="${GITHUB_RAW_URL}/Subnets/IPv4/hetzner.lst"
SUBNETS_OVH="${GITHUB_RAW_URL}/Subnets/IPv4/ovh.lst"
SUBNETS_DIGITALOCEAN="${GITHUB_RAW_URL}/Subnets/IPv4/digitalocean.lst"
SUBNETS_CLOUDFRONT="${GITHUB_RAW_URL}/Subnets/IPv4/cloudfront.lst"
COMMUNITY_SERVICES="russia_inside russia_outside ukraine_inside geoblock block porn news anime youtube hdrezka tiktok google_ai google_play hodca discord meta twitter cloudflare cloudfront digitalocean hetzner ovh telegram"
COMMUNITY_SERVICES="russia_inside russia_outside ukraine_inside geoblock block porn news anime youtube hdrezka tiktok google_ai google_play hodca discord meta twitter cloudflare cloudfront digitalocean hetzner ovh telegram roblox"

View File

@@ -18,7 +18,9 @@ nolog() {
local timestamp
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
echo -e "${COLOR_CYAN}[$timestamp]${COLOR_RESET} ${COLOR_GREEN}$message${COLOR_RESET}"
if [ -t 1 ]; then
echo -e "${COLOR_CYAN}[$timestamp]${COLOR_RESET} ${COLOR_GREEN}$message${COLOR_RESET}"
fi
}
echolog() {