Compare commits

...

37 Commits

Author SHA1 Message Date
Kirill Sobakin
56829c74c8 Merge pull request #246 from itdoginfo/fix/listening_address 2025-11-10 12:58:10 +03:00
Andrey Petelin
9d78cd2ce4 style: add missing semicolons to o.depends calls in luci-app-podkop settings.js 2025-11-06 21:20:05 +05:00
Andrey Petelin
d9ce3b361e chore: correct typo "spedifying" to "specifying" in REST API secret comment 2025-11-06 21:18:15 +05:00
divocat
c67aadf267 feat: add yacd_secret_key support for ws 2025-11-06 16:52:08 +02:00
divocat
ac4d7570f3 feat: add translations for new keys 2025-11-06 16:20:35 +02:00
Andrey Petelin
86897fd0af fix: bind mixed proxy and Clash API to service IP (no 0.0.0.0); add YACD WAN toggle and secret key 2025-11-06 16:33:03 +05:00
Andrey Petelin
230ffbce46 feat: Add optional secret for RESTful API to experimental.clash_api config 2025-11-06 16:30:42 +05:00
Kirill Sobakin
dd5ddd1a14 Merge pull request #240 from itdoginfo/fix/long-nft-command
Import large subnet lists in chunks into nft sets
2025-10-30 16:01:14 +03:00
Andrey Petelin
cc947f9734 fix: import large subnet lists in chunks into nft sets 2025-10-30 14:07:12 +05:00
Kirill Sobakin
f8510cd828 Merge pull request #239 from itdoginfo/fix/crlf-clean
BUG: Clearing CRLF from SRS files
2025-10-29 21:15:47 +03:00
Andrey Petelin
23cbe7be4a fix: include filename in log and remove temp file on CRLF-to-LF conversion 2025-10-29 22:11:29 +05:00
Andrey Petelin
f168fb7e31 refactor: fetch remote JSON to temp files and parse ip_cidr into subnets; remove download_to_stream 2025-10-29 21:52:44 +05:00
Andrey Petelin
fe84b3154f fix: convert Windows CRLF line endings to LF for downloaded files 2025-10-29 21:36:46 +05:00
Kirill Sobakin
d09fdc0b95 Merge pull request #235 from itdoginfo/feat/urltest
feat/urltest
2025-10-27 16:07:13 +03:00
divocat
835cd85970 feat: increase timeouts for delays 2s->5s & 5s -> 10s 2025-10-27 14:56:10 +02:00
divocat
8a3b41ec9c Update fe-app-podkop/locales/podkop.ru.po
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-27 14:18:36 +02:00
divocat
10d7617739 fix: run linter 2025-10-27 14:15:19 +02:00
divocat
68010ed5f7 Update luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-27 14:13:31 +02:00
divocat
557e3666eb Update luci-app-podkop/po/ru/podkop.po
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-27 14:13:20 +02:00
Andrey Petelin
01bff8ccfb chore: refine Russian translations for 'URLTest Testing URL' and 'URLTest Tolerance' 2025-10-27 16:21:51 +05:00
divocat
675a6af89c feat: simplify sb check displaying 2025-10-27 13:16:18 +02:00
divocat
f1a6ff3469 feat: add validations & translations 2025-10-27 13:06:33 +02:00
Andrey Petelin
d4b3377d68 feat: add URLTest check interval, tolerance and testing URL options and wire them into outbound config generation 2025-10-27 15:17:20 +05:00
Kirill Sobakin
d2ef640d76 Merge pull request #233 from itdoginfo/feat/add_display_name
feat: replace outbound code with display name
2025-10-27 12:08:04 +03:00
divocat
47457f2c27 feat: replace outbound code with display name 2025-10-26 16:07:28 +02:00
Kirill Sobakin
8a29e176f2 Merge pull request #232 from itdoginfo/fix/change_json_outbound_validation
small pack of fixes
2025-10-26 16:07:47 +03:00
divocat
9653310208 fix: update locales && possible fix of incorrect outdated 2025-10-26 14:58:09 +02:00
divocat
3540610c78 fix: potential fix of structuredClone for old browsers 2025-10-26 14:52:08 +02:00
divocat
fb54d62a7f feat: actualize json outbound validation 2025-10-26 14:46:39 +02:00
Kirill Sobakin
288b8d4cc2 Merge pull request #230 from itdoginfo/feat/diagnostic-outbound-check
Add outbound check to diagnostic
2025-10-26 09:27:09 +03:00
divocat
e014396ae2 feat: extend selector checks displaying 2025-10-26 01:37:17 +03:00
divocat
694e4ca35a fix: remove extra console log 2025-10-26 01:10:33 +03:00
divocat
788c539e16 feat: add outbounds checks to diagnostics 2025-10-26 01:09:24 +03:00
Kirill Sobakin
743cba8936 Merge pull request #229 from itdoginfo/fix/show-config
Fix masked config
2025-10-25 17:38:45 +03:00
Andrey Petelin
d1d703764c fix: mask outbound_json block and DNS/domain_resolver addresses in podkop config output 2025-10-25 19:27:01 +05:00
Kirill Sobakin
2efd415305 Merge pull request #226 from itdoginfo/fix/excluded_ips
Routing Excluded IPs
2025-10-24 15:34:57 +03:00
Andrey Petelin
407b19b3ed fix: read routing_excluded_ips as non-boolean string with config_get instead of config_get_bool 2025-10-24 17:32:35 +05:00
26 changed files with 1315 additions and 488 deletions

View File

@@ -41,25 +41,32 @@
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:106" "src/podkop/tabs/diagnostic/checks/runNftCheck.ts:106"
] ]
}, },
{
"call": "Allows access to YACD from the WAN. Make sure to open the appropriate port in your firewall.",
"key": "Allows access to YACD from the WAN. Make sure to open the appropriate port in your firewall.",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:247"
]
},
{ {
"call": "Applicable for SOCKS and Shadowsocks proxy", "call": "Applicable for SOCKS and Shadowsocks proxy",
"key": "Applicable for SOCKS and Shadowsocks proxy", "key": "Applicable for SOCKS and Shadowsocks proxy",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:175"
] ]
}, },
{ {
"call": "At least one valid domain must be specified. Comments-only content is not allowed.", "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.", "key": "At least one valid domain must be specified. Comments-only content is not allowed.",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:356" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:420"
] ]
}, },
{ {
"call": "At least one valid subnet or IP must be specified. Comments-only content is not allowed.", "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.", "key": "At least one valid subnet or IP must be specified. Comments-only content is not allowed.",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:437" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:501"
] ]
}, },
{ {
@@ -101,14 +108,14 @@
"call": "Cache File Path", "call": "Cache File Path",
"key": "Cache File Path", "key": "Cache File Path",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:329" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:348"
] ]
}, },
{ {
"call": "Cache file path cannot be empty", "call": "Cache file path cannot be empty",
"key": "Cache file path cannot be empty", "key": "Cache file path cannot be empty",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:343" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:362"
] ]
}, },
{ {
@@ -117,6 +124,7 @@
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:27", "src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:27",
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:28", "src/podkop/tabs/diagnostic/checks/runNftCheck.ts:28",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:27",
"src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:25" "src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:25"
] ]
}, },
@@ -127,6 +135,7 @@
"src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:15", "src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:15",
"src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:15", "src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:15",
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:13", "src/podkop/tabs/diagnostic/checks/runNftCheck.ts:13",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:15",
"src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:13" "src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:13"
] ]
}, },
@@ -169,14 +178,14 @@
"call": "Community Lists", "call": "Community Lists",
"key": "Community Lists", "key": "Community Lists",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:211" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:275"
] ]
}, },
{ {
"call": "Config File Path", "call": "Config File Path",
"key": "Config File Path", "key": "Config File Path",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:316" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:335"
] ]
}, },
{ {
@@ -274,22 +283,22 @@
"call": "Disable QUIC", "call": "Disable QUIC",
"key": "Disable QUIC", "key": "Disable QUIC",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:246" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:265"
] ]
}, },
{ {
"call": "Disable the QUIC protocol to improve compatibility or fix issues with video streaming", "call": "Disable the QUIC protocol to improve compatibility or fix issues with video streaming",
"key": "Disable the QUIC protocol to improve compatibility or fix issues with video streaming", "key": "Disable the QUIC protocol to improve compatibility or fix issues with video streaming",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:247" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:266"
] ]
}, },
{ {
"call": "Disabled", "call": "Disabled",
"key": "Disabled", "key": "Disabled",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:302", "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:366",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:382" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:446"
] ]
}, },
{ {
@@ -303,7 +312,7 @@
"call": "DNS over HTTPS (DoH)", "call": "DNS over HTTPS (DoH)",
"key": "DNS over HTTPS (DoH)", "key": "DNS over HTTPS (DoH)",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:179", "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:243",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:15" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:15"
] ]
}, },
@@ -311,7 +320,7 @@
"call": "DNS over TLS (DoT)", "call": "DNS over TLS (DoT)",
"key": "DNS over TLS (DoT)", "key": "DNS over TLS (DoT)",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:180", "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:244",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:16" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:16"
] ]
}, },
@@ -319,7 +328,7 @@
"call": "DNS Protocol Type", "call": "DNS Protocol Type",
"key": "DNS Protocol Type", "key": "DNS Protocol Type",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:176", "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:240",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:12" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:12"
] ]
}, },
@@ -334,7 +343,7 @@
"call": "DNS Server", "call": "DNS Server",
"key": "DNS Server", "key": "DNS Server",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:189", "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:253",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:24" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:24"
] ]
}, },
@@ -356,14 +365,14 @@
"call": "Domain Resolver", "call": "Domain Resolver",
"key": "Domain Resolver", "key": "Domain Resolver",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:166" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:230"
] ]
}, },
{ {
"call": "Dont Touch My DHCP!", "call": "Dont Touch My DHCP!",
"key": "Dont Touch My DHCP!", "key": "Dont Touch My DHCP!",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:307" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:326"
] ]
}, },
{ {
@@ -385,36 +394,30 @@
"call": "Download Lists via Proxy/VPN", "call": "Download Lists via Proxy/VPN",
"key": "Download Lists via Proxy/VPN", "key": "Download Lists via Proxy/VPN",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:269" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:288"
] ]
}, },
{ {
"call": "Download Lists via specific proxy section", "call": "Download Lists via specific proxy section",
"key": "Download Lists via specific proxy section", "key": "Download Lists via specific proxy section",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:278" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:297"
]
},
{
"call": "Downloading all lists via main Proxy/VPN",
"key": "Downloading all lists via main Proxy/VPN",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:270"
] ]
}, },
{ {
"call": "Downloading all lists via specific Proxy/VPN", "call": "Downloading all lists via specific Proxy/VPN",
"key": "Downloading all lists via specific Proxy/VPN", "key": "Downloading all lists via specific Proxy/VPN",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:279" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:289",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:298"
] ]
}, },
{ {
"call": "Dynamic List", "call": "Dynamic List",
"key": "Dynamic List", "key": "Dynamic List",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:303", "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:367",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:383" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:447"
] ]
}, },
{ {
@@ -428,14 +431,14 @@
"call": "Enable built-in DNS resolver for domains handled by this section", "call": "Enable built-in DNS resolver for domains handled by this section",
"key": "Enable built-in DNS resolver for domains handled by this section", "key": "Enable built-in DNS resolver for domains handled by this section",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:167" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:231"
] ]
}, },
{ {
"call": "Enable Mixed Proxy", "call": "Enable Mixed Proxy",
"key": "Enable Mixed Proxy", "key": "Enable Mixed Proxy",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:575" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:639"
] ]
}, },
{ {
@@ -449,7 +452,7 @@
"call": "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies", "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", "key": "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:576" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:640"
] ]
}, },
{ {
@@ -459,6 +462,13 @@
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:237" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:237"
] ]
}, },
{
"call": "Enable YACD WAN Access",
"key": "Enable YACD WAN Access",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:246"
]
},
{ {
"call": "Enter complete outbound configuration in JSON format", "call": "Enter complete outbound configuration in JSON format",
"key": "Enter complete outbound configuration in JSON format", "key": "Enter complete outbound configuration in JSON format",
@@ -470,35 +480,63 @@
"call": "Enter domain names separated by commas, spaces, or newlines. You can add comments using //", "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 //", "key": "Enter domain names separated by commas, spaces, or newlines. You can add comments using //",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:338" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:402"
] ]
}, },
{ {
"call": "Enter domain names without protocols, e.g. example.com or sub.example.com", "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", "key": "Enter domain names without protocols, e.g. example.com or sub.example.com",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:312" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:376"
] ]
}, },
{ {
"call": "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses", "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", "key": "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:392" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:456"
]
},
{
"call": "Every 1 minute",
"key": "Every 1 minute",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:114"
]
},
{
"call": "Every 3 minutes",
"key": "Every 3 minutes",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:115"
]
},
{
"call": "Every 30 seconds",
"key": "Every 30 seconds",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:113"
]
},
{
"call": "Every 5 minutes",
"key": "Every 5 minutes",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:116"
] ]
}, },
{ {
"call": "Exclude NTP", "call": "Exclude NTP",
"key": "Exclude NTP", "key": "Exclude NTP",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:365" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:384"
] ]
}, },
{ {
"call": "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN", "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", "key": "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:366" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:385"
] ]
}, },
{ {
@@ -512,26 +550,27 @@
"call": "Failed to execute!", "call": "Failed to execute!",
"key": "Failed to execute!", "key": "Failed to execute!",
"places": [ "places": [
"src/podkop/tabs/diagnostic/initController.ts:226", "src/podkop/tabs/diagnostic/initController.ts:227",
"src/podkop/tabs/diagnostic/initController.ts:230", "src/podkop/tabs/diagnostic/initController.ts:231",
"src/podkop/tabs/diagnostic/initController.ts:260", "src/podkop/tabs/diagnostic/initController.ts:261",
"src/podkop/tabs/diagnostic/initController.ts:264", "src/podkop/tabs/diagnostic/initController.ts:265",
"src/podkop/tabs/diagnostic/initController.ts:298", "src/podkop/tabs/diagnostic/initController.ts:299",
"src/podkop/tabs/diagnostic/initController.ts:302" "src/podkop/tabs/diagnostic/initController.ts:303"
] ]
}, },
{ {
"call": "Fastest", "call": "Fastest",
"key": "Fastest", "key": "Fastest",
"places": [ "places": [
"src/podkop/methods/custom/getDashboardSections.ts:117" "src/podkop/methods/custom/getDashboardSections.ts:117",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:59"
] ]
}, },
{ {
"call": "Fully Routed IPs", "call": "Fully Routed IPs",
"key": "Fully Routed IPs", "key": "Fully Routed IPs",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:550" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:614"
] ]
}, },
{ {
@@ -545,7 +584,7 @@
"call": "Global check", "call": "Global check",
"key": "Global check", "key": "Global check",
"places": [ "places": [
"src/podkop/tabs/diagnostic/initController.ts:221" "src/podkop/tabs/diagnostic/initController.ts:222"
] ]
}, },
{ {
@@ -609,7 +648,7 @@
"call": "Invalid JSON format", "call": "Invalid JSON format",
"key": "Invalid JSON format", "key": "Invalid JSON format",
"places": [ "places": [
"src/validators/validateOutboundJson.ts:19" "src/validators/validateOutboundJson.ts:9"
] ]
}, },
{ {
@@ -777,7 +816,8 @@
"call": "Invalid URL format", "call": "Invalid URL format",
"key": "Invalid URL format", "key": "Invalid URL format",
"places": [ "places": [
"src/validators/validateUrl.ts:18" "src/validators/validateUrl.ts:8",
"src/validators/validateUrl.ts:31"
] ]
}, },
{ {
@@ -805,28 +845,28 @@
"call": "Latest", "call": "Latest",
"key": "Latest", "key": "Latest",
"places": [ "places": [
"src/podkop/tabs/diagnostic/initController.ts:452" "src/podkop/tabs/diagnostic/initController.ts:453"
] ]
}, },
{ {
"call": "List Update Frequency", "call": "List Update Frequency",
"key": "List Update Frequency", "key": "List Update Frequency",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:257" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:276"
] ]
}, },
{ {
"call": "Local Domain Lists", "call": "Local Domain Lists",
"key": "Local Domain Lists", "key": "Local Domain Lists",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:458" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:522"
] ]
}, },
{ {
"call": "Local Subnet Lists", "call": "Local Subnet Lists",
"key": "Local Subnet Lists", "key": "Local Subnet Lists",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:481" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:545"
] ]
}, },
{ {
@@ -847,7 +887,7 @@
"call": "Mixed Proxy Port", "call": "Mixed Proxy Port",
"key": "Mixed Proxy Port", "key": "Mixed Proxy Port",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:586" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:650"
] ]
}, },
{ {
@@ -857,11 +897,18 @@
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:198" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:198"
] ]
}, },
{
"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"
]
},
{ {
"call": "Network Interface", "call": "Network Interface",
"key": "Network Interface", "key": "Network Interface",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:120" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:184"
] ]
}, },
{ {
@@ -878,6 +925,15 @@
"src/podkop/tabs/diagnostic/partials/renderCheckSection.ts:189" "src/podkop/tabs/diagnostic/partials/renderCheckSection.ts:189"
] ]
}, },
{
"call": "Not responding",
"key": "Not responding",
"places": [
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:75",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:81",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:100"
]
},
{ {
"call": "Not running", "call": "Not running",
"key": "Not running", "key": "Not running",
@@ -885,7 +941,8 @@
"src/podkop/tabs/diagnostic/diagnostic.store.ts:55", "src/podkop/tabs/diagnostic/diagnostic.store.ts:55",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:63", "src/podkop/tabs/diagnostic/diagnostic.store.ts:63",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:71", "src/podkop/tabs/diagnostic/diagnostic.store.ts:71",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:79" "src/podkop/tabs/diagnostic/diagnostic.store.ts:79",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:87"
] ]
}, },
{ {
@@ -909,18 +966,11 @@
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:64" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:64"
] ]
}, },
{
"call": "Outbound JSON must contain at least \"type\", \"server\" and \"server_port\" fields",
"key": "Outbound JSON must contain at least \"type\", \"server\" and \"server_port\" fields",
"places": [
"src/validators/validateOutboundJson.ts:11"
]
},
{ {
"call": "Outdated", "call": "Outdated",
"key": "Outdated", "key": "Outdated",
"places": [ "places": [
"src/podkop/tabs/diagnostic/initController.ts:442" "src/podkop/tabs/diagnostic/initController.ts:443"
] ]
}, },
{ {
@@ -941,31 +991,32 @@
"call": "Path must be absolute (start with /)", "call": "Path must be absolute (start with /)",
"key": "Path must be absolute (start with /)", "key": "Path must be absolute (start with /)",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:347" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:366"
] ]
}, },
{ {
"call": "Path must contain at least one directory (like /tmp/cache.db)", "call": "Path must contain at least one directory (like /tmp/cache.db)",
"key": "Path must contain at least one directory (like /tmp/cache.db)", "key": "Path must contain at least one directory (like /tmp/cache.db)",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:356" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:375"
] ]
}, },
{ {
"call": "Path must end with cache.db", "call": "Path must end with cache.db",
"key": "Path must end with cache.db", "key": "Path must end with cache.db",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:351" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:370"
] ]
}, },
{ {
"call": "Pending", "call": "Pending",
"key": "Pending", "key": "Pending",
"places": [ "places": [
"src/podkop/tabs/diagnostic/diagnostic.store.ts:95",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:103", "src/podkop/tabs/diagnostic/diagnostic.store.ts:103",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:111", "src/podkop/tabs/diagnostic/diagnostic.store.ts:111",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:119" "src/podkop/tabs/diagnostic/diagnostic.store.ts:119",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:127",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:135"
] ]
}, },
{ {
@@ -986,7 +1037,7 @@
"call": "Podkop will not modify your DHCP configuration", "call": "Podkop will not modify your DHCP configuration",
"key": "Podkop will not modify your DHCP configuration", "key": "Podkop will not modify your DHCP configuration",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:308" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:327"
] ]
}, },
{ {
@@ -1014,21 +1065,21 @@
"call": "Regional options cannot be used together", "call": "Regional options cannot be used together",
"key": "Regional options cannot be used together", "key": "Regional options cannot be used together",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:245" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:309"
] ]
}, },
{ {
"call": "Remote Domain Lists", "call": "Remote Domain Lists",
"key": "Remote Domain Lists", "key": "Remote Domain Lists",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:504" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:568"
] ]
}, },
{ {
"call": "Remote Subnet Lists", "call": "Remote Subnet Lists",
"key": "Remote Subnet Lists", "key": "Remote Subnet Lists",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:527" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:591"
] ]
}, },
{ {
@@ -1056,7 +1107,7 @@
"call": "Routing Excluded IPs", "call": "Routing Excluded IPs",
"key": "Routing Excluded IPs", "key": "Routing Excluded IPs",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:376" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:395"
] ]
}, },
{ {
@@ -1112,7 +1163,14 @@
"call": "Russia inside restrictions", "call": "Russia inside restrictions",
"key": "Russia inside restrictions", "key": "Russia inside restrictions",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:264" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:328"
]
},
{
"call": "Secret key for authenticating remote access to YACD when WAN access is enabled.",
"key": "Secret key for authenticating remote access to YACD when WAN access is enabled.",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:257"
] ]
}, },
{ {
@@ -1126,7 +1184,7 @@
"call": "Select a predefined list for routing", "call": "Select a predefined list for routing",
"key": "Select a predefined list for routing", "key": "Select a predefined list for routing",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:212" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:276"
] ]
}, },
{ {
@@ -1147,7 +1205,7 @@
"call": "Select how often the domain or subnet lists are updated automatically", "call": "Select how often the domain or subnet lists are updated automatically",
"key": "Select how often the domain or subnet lists are updated automatically", "key": "Select how often the domain or subnet lists are updated automatically",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:258" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:277"
] ]
}, },
{ {
@@ -1161,14 +1219,14 @@
"call": "Select network interface for VPN connection", "call": "Select network interface for VPN connection",
"key": "Select network interface for VPN connection", "key": "Select network interface for VPN connection",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:121" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:185"
] ]
}, },
{ {
"call": "Select or enter DNS server address", "call": "Select or enter DNS server address",
"key": "Select or enter DNS server address", "key": "Select or enter DNS server address",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:190", "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:254",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:25" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:25"
] ]
}, },
@@ -1176,35 +1234,35 @@
"call": "Select or enter path for sing-box cache file. Change this ONLY if you know what you are doing", "call": "Select or enter path for sing-box cache file. Change this ONLY if you know what you are doing",
"key": "Select or enter path for sing-box cache file. Change this ONLY if you know what you are doing", "key": "Select or enter path for sing-box cache file. Change this ONLY if you know what you are doing",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:330" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:349"
] ]
}, },
{ {
"call": "Select path for sing-box config file. Change this ONLY if you know what you are doing", "call": "Select path for sing-box config file. Change this ONLY if you know what you are doing",
"key": "Select path for sing-box config file. Change this ONLY if you know what you are doing", "key": "Select path for sing-box config file. Change this ONLY if you know what you are doing",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:317" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:336"
] ]
}, },
{ {
"call": "Select the DNS protocol type for the domain resolver", "call": "Select the DNS protocol type for the domain resolver",
"key": "Select the DNS protocol type for the domain resolver", "key": "Select the DNS protocol type for the domain resolver",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:177" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:241"
] ]
}, },
{ {
"call": "Select the list type for adding custom domains", "call": "Select the list type for adding custom domains",
"key": "Select the list type for adding custom domains", "key": "Select the list type for adding custom domains",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:300" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:364"
] ]
}, },
{ {
"call": "Select the list type for adding custom subnets", "call": "Select the list type for adding custom subnets",
"key": "Select the list type for adding custom subnets", "key": "Select the list type for adding custom subnets",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:380" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:444"
] ]
}, },
{ {
@@ -1246,7 +1304,7 @@
"call": "Show sing-box config", "call": "Show sing-box config",
"key": "Show sing-box config", "key": "Show sing-box config",
"places": [ "places": [
"src/podkop/tabs/diagnostic/initController.ts:289", "src/podkop/tabs/diagnostic/initController.ts:290",
"src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:116" "src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:116"
] ]
}, },
@@ -1293,8 +1351,8 @@
] ]
}, },
{ {
"call": "Sing-box version >= 1.12.4", "call": "Sing-box version is compatible (newer than 1.12.4)",
"key": "Sing-box version >= 1.12.4", "key": "Sing-box version is compatible (newer than 1.12.4)",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:67" "src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:67"
] ]
@@ -1310,36 +1368,36 @@
"call": "Specify a local IP address to be excluded from routing", "call": "Specify a local IP address to be excluded from routing",
"key": "Specify a local IP address to be excluded from routing", "key": "Specify a local IP address to be excluded from routing",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:377" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:396"
] ]
}, },
{ {
"call": "Specify local IP addresses or subnets whose traffic will always be routed through the configured route", "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", "key": "Specify local IP addresses or subnets whose traffic will always be routed through the configured route",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:551" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:615"
] ]
}, },
{ {
"call": "Specify remote URLs to download and use domain lists", "call": "Specify remote URLs to download and use domain lists",
"key": "Specify remote URLs to download and use domain lists", "key": "Specify remote URLs to download and use domain lists",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:505" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:569"
] ]
}, },
{ {
"call": "Specify remote URLs to download and use subnet lists", "call": "Specify remote URLs to download and use subnet lists",
"key": "Specify remote URLs to download and use subnet lists", "key": "Specify remote URLs to download and use subnet lists",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:528" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592"
] ]
}, },
{ {
"call": "Specify the path to the list file located on the router filesystem", "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", "key": "Specify the path to the list file located on the router filesystem",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:459", "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:523",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:482" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:546"
] ]
}, },
{ {
@@ -1395,14 +1453,14 @@
"call": "Text List", "call": "Text List",
"key": "Text List", "key": "Text List",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:304" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:368"
] ]
}, },
{ {
"call": "Text List (comma/space/newline separated)", "call": "Text List (comma/space/newline separated)",
"key": "Text List (comma/space/newline separated)", "key": "Text List (comma/space/newline separated)",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:384" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:448"
] ]
}, },
{ {
@@ -1412,6 +1470,27 @@
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:46" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:46"
] ]
}, },
{
"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"
]
},
{
"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"
]
},
{
"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"
]
},
{ {
"call": "Time in seconds for DNS record caching (default: 60)", "call": "Time in seconds for DNS record caching (default: 60)",
"key": "Time in seconds for DNS record caching (default: 60)", "key": "Time in seconds for DNS record caching (default: 60)",
@@ -1458,7 +1537,7 @@
"call": "UDP (Unprotected DNS)", "call": "UDP (Unprotected DNS)",
"key": "UDP (Unprotected DNS)", "key": "UDP (Unprotected DNS)",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:181", "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:245",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:17" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:17"
] ]
}, },
@@ -1466,20 +1545,20 @@
"call": "UDP over TCP", "call": "UDP over TCP",
"key": "UDP over TCP", "key": "UDP over TCP",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:174"
] ]
}, },
{ {
"call": "unknown", "call": "unknown",
"key": "unknown", "key": "unknown",
"places": [ "places": [
"src/podkop/tabs/diagnostic/initController.ts:37",
"src/podkop/tabs/diagnostic/initController.ts:38", "src/podkop/tabs/diagnostic/initController.ts:38",
"src/podkop/tabs/diagnostic/initController.ts:39", "src/podkop/tabs/diagnostic/initController.ts:39",
"src/podkop/tabs/diagnostic/initController.ts:40", "src/podkop/tabs/diagnostic/initController.ts:40",
"src/podkop/tabs/diagnostic/initController.ts:41", "src/podkop/tabs/diagnostic/initController.ts:41",
"src/podkop/tabs/diagnostic/initController.ts:42", "src/podkop/tabs/diagnostic/initController.ts:42",
"src/podkop/tabs/diagnostic/initController.ts:416" "src/podkop/tabs/diagnostic/initController.ts:43",
"src/podkop/tabs/diagnostic/initController.ts:417"
] ]
}, },
{ {
@@ -1508,7 +1587,7 @@
"call": "URL must use one of the following protocols:", "call": "URL must use one of the following protocols:",
"key": "URL must use one of the following protocols:", "key": "URL must use one of the following protocols:",
"places": [ "places": [
"src/validators/validateUrl.ts:13" "src/validators/validateUrl.ts:17"
] ]
}, },
{ {
@@ -1518,6 +1597,13 @@
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:27" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:27"
] ]
}, },
{
"call": "URLTest Check Interval",
"key": "URLTest Check Interval",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110"
]
},
{ {
"call": "URLTest Proxy Links", "call": "URLTest Proxy Links",
"key": "URLTest Proxy Links", "key": "URLTest Proxy Links",
@@ -1525,46 +1611,60 @@
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:87" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:87"
] ]
}, },
{
"call": "URLTest Testing URL",
"key": "URLTest Testing URL",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:146"
]
},
{
"call": "URLTest Tolerance",
"key": "URLTest Tolerance",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:123"
]
},
{ {
"call": "User Domain List Type", "call": "User Domain List Type",
"key": "User Domain List Type", "key": "User Domain List Type",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:299" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:363"
] ]
}, },
{ {
"call": "User Domains", "call": "User Domains",
"key": "User Domains", "key": "User Domains",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:311" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:375"
] ]
}, },
{ {
"call": "User Domains List", "call": "User Domains List",
"key": "User Domains List", "key": "User Domains List",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:337" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:401"
] ]
}, },
{ {
"call": "User Subnet List Type", "call": "User Subnet List Type",
"key": "User Subnet List Type", "key": "User Subnet List Type",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:379" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:443"
] ]
}, },
{ {
"call": "User Subnets", "call": "User Subnets",
"key": "User Subnets", "key": "User Subnets",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:391" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:455"
] ]
}, },
{ {
"call": "User Subnets List", "call": "User Subnets List",
"key": "User Subnets List", "key": "User Subnets List",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:417" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:481"
] ]
}, },
{ {
@@ -1576,13 +1676,13 @@
"src/validators/validateDomain.ts:13", "src/validators/validateDomain.ts:13",
"src/validators/validateDomain.ts:30", "src/validators/validateDomain.ts:30",
"src/validators/validateIp.ts:8", "src/validators/validateIp.ts:8",
"src/validators/validateOutboundJson.ts:17", "src/validators/validateOutboundJson.ts:7",
"src/validators/validatePath.ts:16", "src/validators/validatePath.ts:16",
"src/validators/validateShadowsocksUrl.ts:95", "src/validators/validateShadowsocksUrl.ts:95",
"src/validators/validateSocksUrl.ts:80", "src/validators/validateSocksUrl.ts:80",
"src/validators/validateSubnet.ts:38", "src/validators/validateSubnet.ts:38",
"src/validators/validateTrojanUrl.ts:59", "src/validators/validateTrojanUrl.ts:59",
"src/validators/validateUrl.ts:16", "src/validators/validateUrl.ts:28",
"src/validators/validateVlessUrl.ts:108" "src/validators/validateVlessUrl.ts:108"
] ]
}, },
@@ -1590,15 +1690,15 @@
"call": "Validation errors:", "call": "Validation errors:",
"key": "Validation errors:", "key": "Validation errors:",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:370", "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:434",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:449" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:513"
] ]
}, },
{ {
"call": "View logs", "call": "View logs",
"key": "View logs", "key": "View logs",
"places": [ "places": [
"src/podkop/tabs/diagnostic/initController.ts:255", "src/podkop/tabs/diagnostic/initController.ts:256",
"src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:107" "src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:107"
] ]
}, },
@@ -1613,14 +1713,21 @@
"call": "Warning: %s cannot be used together with %s. Previous selections have been removed.", "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.", "key": "Warning: %s cannot be used together with %s. Previous selections have been removed.",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:247" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:311"
] ]
}, },
{ {
"call": "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection.", "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.", "key": "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection.",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:266" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:330"
]
},
{
"call": "YACD Secret Key",
"key": "YACD Secret Key",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:256"
] ]
}, },
{ {

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PODKOP\n" "Project-Id-Version: PODKOP\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-23 17:43+0300\n" "POT-Creation-Date: 2025-11-06 14:19+0200\n"
"PO-Revision-Date: 2025-10-23 17:43+0300\n" "PO-Revision-Date: 2025-11-06 14:19+0200\n"
"Last-Translator: divocat <divocatt@gmail.com>\n" "Last-Translator: divocat <divocatt@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n" "Language: \n"
@@ -40,15 +40,19 @@ msgstr ""
msgid "Additional marking rules found" msgid "Additional marking rules found"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:247
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
msgid "Applicable for SOCKS and Shadowsocks proxy" msgid "Applicable for SOCKS and Shadowsocks proxy"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:356 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:420
msgid "At least one valid domain must be specified. Comments-only content is not allowed." msgid "At least one valid domain must be specified. Comments-only content is not allowed."
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:437 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:501
msgid "At least one valid subnet or IP must be specified. Comments-only content is not allowed." msgid "At least one valid subnet or IP must be specified. Comments-only content is not allowed."
msgstr "" msgstr ""
@@ -72,16 +76,17 @@ msgstr ""
msgid "Browser is using FakeIP correctly" msgid "Browser is using FakeIP correctly"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:329 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:348
msgid "Cache File Path" msgid "Cache File Path"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:343 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:362
msgid "Cache file path cannot be empty" msgid "Cache file path cannot be empty"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:27 #: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:27
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:28 #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:28
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:27
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:25 #: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:25
msgid "Cannot receive checks result" msgid "Cannot receive checks result"
msgstr "" msgstr ""
@@ -89,6 +94,7 @@ msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:15 #: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:15
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:15 #: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:15
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:13 #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:13
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:15
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:13 #: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:13
msgid "Checking, please wait" msgid "Checking, please wait"
msgstr "" msgstr ""
@@ -113,11 +119,11 @@ msgstr ""
msgid "Close" msgid "Close"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:211 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:275
msgid "Community Lists" msgid "Community Lists"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:316 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:335
msgid "Config File Path" msgid "Config File Path"
msgstr "" msgstr ""
@@ -173,16 +179,16 @@ msgstr ""
msgid "Disable autostart" msgid "Disable autostart"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:246 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:265
msgid "Disable QUIC" msgid "Disable QUIC"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:247 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:266
msgid "Disable the QUIC protocol to improve compatibility or fix issues with video streaming" msgid "Disable the QUIC protocol to improve compatibility or fix issues with video streaming"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:302 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:366
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:382 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:446
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr ""
@@ -190,17 +196,17 @@ msgstr ""
msgid "DNS on router" msgid "DNS on router"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:179 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:243
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:15 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:15
msgid "DNS over HTTPS (DoH)" msgid "DNS over HTTPS (DoH)"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:180 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:244
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:16 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:16
msgid "DNS over TLS (DoT)" msgid "DNS over TLS (DoT)"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:176 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:240
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:12 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:12
msgid "DNS Protocol Type" msgid "DNS Protocol Type"
msgstr "" msgstr ""
@@ -209,7 +215,7 @@ msgstr ""
msgid "DNS Rewrite TTL" msgid "DNS Rewrite TTL"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:189 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:253
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:24 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:24
msgid "DNS Server" msgid "DNS Server"
msgstr "" msgstr ""
@@ -222,11 +228,11 @@ msgstr ""
msgid "Do not panic, everything can be fixed, just..." msgid "Do not panic, everything can be fixed, just..."
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:166 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:230
msgid "Domain Resolver" msgid "Domain Resolver"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:307 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:326
msgid "Dont Touch My DHCP!" msgid "Dont Touch My DHCP!"
msgstr "" msgstr ""
@@ -239,24 +245,21 @@ msgstr ""
msgid "Download" msgid "Download"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:269 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:288
msgid "Download Lists via Proxy/VPN" msgid "Download Lists via Proxy/VPN"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:278 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:297
msgid "Download Lists via specific proxy section" msgid "Download Lists via specific proxy section"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:270 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:289
msgid "Downloading all lists via main Proxy/VPN" #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:298
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:279
msgid "Downloading all lists via specific Proxy/VPN" msgid "Downloading all lists via specific Proxy/VPN"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:303 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:367
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:383 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:447
msgid "Dynamic List" msgid "Dynamic List"
msgstr "" msgstr ""
@@ -264,11 +267,11 @@ msgstr ""
msgid "Enable autostart" msgid "Enable autostart"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:167 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:231
msgid "Enable built-in DNS resolver for domains handled by this section" msgid "Enable built-in DNS resolver for domains handled by this section"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:575 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:639
msgid "Enable Mixed Proxy" msgid "Enable Mixed Proxy"
msgstr "" msgstr ""
@@ -276,7 +279,7 @@ msgstr ""
msgid "Enable Output Network Interface" msgid "Enable Output Network Interface"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:576 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:640
msgid "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies" msgid "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies"
msgstr "" msgstr ""
@@ -284,27 +287,47 @@ msgstr ""
msgid "Enable YACD" msgid "Enable YACD"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:246
msgid "Enable YACD WAN Access"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:65 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:65
msgid "Enter complete outbound configuration in JSON format" msgid "Enter complete outbound configuration in JSON format"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:338 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:402
msgid "Enter domain names separated by commas, spaces, or newlines. You can add comments using //" msgid "Enter domain names separated by commas, spaces, or newlines. You can add comments using //"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:312 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:376
msgid "Enter domain names without protocols, e.g. example.com or sub.example.com" msgid "Enter domain names without protocols, e.g. example.com or sub.example.com"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:392 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:456
msgid "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses" msgid "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:365 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:114
msgid "Every 1 minute"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:115
msgid "Every 3 minutes"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:113
msgid "Every 30 seconds"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:116
msgid "Every 5 minutes"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:384
msgid "Exclude NTP" msgid "Exclude NTP"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:366 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:385
msgid "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN" msgid "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN"
msgstr "" msgstr ""
@@ -312,20 +335,21 @@ msgstr ""
msgid "Failed to copy!" msgid "Failed to copy!"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:226 #: src/podkop/tabs/diagnostic/initController.ts:227
#: src/podkop/tabs/diagnostic/initController.ts:230 #: src/podkop/tabs/diagnostic/initController.ts:231
#: src/podkop/tabs/diagnostic/initController.ts:260 #: src/podkop/tabs/diagnostic/initController.ts:261
#: src/podkop/tabs/diagnostic/initController.ts:264 #: src/podkop/tabs/diagnostic/initController.ts:265
#: src/podkop/tabs/diagnostic/initController.ts:298 #: src/podkop/tabs/diagnostic/initController.ts:299
#: src/podkop/tabs/diagnostic/initController.ts:302 #: src/podkop/tabs/diagnostic/initController.ts:303
msgid "Failed to execute!" msgid "Failed to execute!"
msgstr "" msgstr ""
#: src/podkop/methods/custom/getDashboardSections.ts:117 #: src/podkop/methods/custom/getDashboardSections.ts:117
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:59
msgid "Fastest" msgid "Fastest"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:550 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:614
msgid "Fully Routed IPs" msgid "Fully Routed IPs"
msgstr "" msgstr ""
@@ -333,7 +357,7 @@ msgstr ""
msgid "Get global check" msgid "Get global check"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:221 #: src/podkop/tabs/diagnostic/initController.ts:222
msgid "Global check" msgid "Global check"
msgstr "" msgstr ""
@@ -370,7 +394,7 @@ msgstr ""
msgid "Invalid IP address" msgid "Invalid IP address"
msgstr "" msgstr ""
#: src/validators/validateOutboundJson.ts:19 #: src/validators/validateOutboundJson.ts:9
msgid "Invalid JSON format" msgid "Invalid JSON format"
msgstr "" msgstr ""
@@ -466,7 +490,8 @@ msgstr ""
msgid "Invalid Trojan URL: parsing failed" msgid "Invalid Trojan URL: parsing failed"
msgstr "" msgstr ""
#: src/validators/validateUrl.ts:18 #: src/validators/validateUrl.ts:8
#: src/validators/validateUrl.ts:31
msgid "Invalid URL format" msgid "Invalid URL format"
msgstr "" msgstr ""
@@ -482,19 +507,19 @@ msgstr ""
msgid "Issues detected" msgid "Issues detected"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:452 #: src/podkop/tabs/diagnostic/initController.ts:453
msgid "Latest" msgid "Latest"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:257 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:276
msgid "List Update Frequency" msgid "List Update Frequency"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:458 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:522
msgid "Local Domain Lists" msgid "Local Domain Lists"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:481 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:545
msgid "Local Subnet Lists" msgid "Local Subnet Lists"
msgstr "" msgstr ""
@@ -506,7 +531,7 @@ msgstr ""
msgid "Memory Usage" msgid "Memory Usage"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:586 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:650
msgid "Mixed Proxy Port" msgid "Mixed Proxy Port"
msgstr "" msgstr ""
@@ -514,7 +539,11 @@ msgstr ""
msgid "Monitored Interfaces" msgid "Monitored Interfaces"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:120 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:140
msgid "Must be a number in the range of 50 - 1000"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:184
msgid "Network Interface" msgid "Network Interface"
msgstr "" msgstr ""
@@ -526,10 +555,17 @@ msgstr ""
msgid "Not implement yet" msgid "Not implement yet"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:75
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:81
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:100
msgid "Not responding"
msgstr ""
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:55 #: src/podkop/tabs/diagnostic/diagnostic.store.ts:55
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:63 #: src/podkop/tabs/diagnostic/diagnostic.store.ts:63
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:71 #: src/podkop/tabs/diagnostic/diagnostic.store.ts:71
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:79 #: src/podkop/tabs/diagnostic/diagnostic.store.ts:79
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:87
msgid "Not running" msgid "Not running"
msgstr "" msgstr ""
@@ -545,11 +581,7 @@ msgstr ""
msgid "Outbound Configuration" msgid "Outbound Configuration"
msgstr "" msgstr ""
#: src/validators/validateOutboundJson.ts:11 #: src/podkop/tabs/diagnostic/initController.ts:443
msgid "Outbound JSON must contain at least \"type\", \"server\" and \"server_port\" fields"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:442
msgid "Outdated" msgid "Outdated"
msgstr "" msgstr ""
@@ -561,22 +593,23 @@ msgstr ""
msgid "Path cannot be empty" msgid "Path cannot be empty"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:347 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:366
msgid "Path must be absolute (start with /)" msgid "Path must be absolute (start with /)"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:356 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:375
msgid "Path must contain at least one directory (like /tmp/cache.db)" msgid "Path must contain at least one directory (like /tmp/cache.db)"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:351 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:370
msgid "Path must end with cache.db" msgid "Path must end with cache.db"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:95
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:103 #: src/podkop/tabs/diagnostic/diagnostic.store.ts:103
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:111 #: src/podkop/tabs/diagnostic/diagnostic.store.ts:111
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:119 #: src/podkop/tabs/diagnostic/diagnostic.store.ts:119
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:127
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:135
msgid "Pending" msgid "Pending"
msgstr "" msgstr ""
@@ -588,7 +621,7 @@ msgstr ""
msgid "Podkop Settings" msgid "Podkop Settings"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:308 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:327
msgid "Podkop will not modify your DHCP configuration" msgid "Podkop will not modify your DHCP configuration"
msgstr "" msgstr ""
@@ -604,15 +637,15 @@ msgstr ""
msgid "Proxy traffic is routed via FakeIP" msgid "Proxy traffic is routed via FakeIP"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:245 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:309
msgid "Regional options cannot be used together" msgid "Regional options cannot be used together"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:504 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:568
msgid "Remote Domain Lists" msgid "Remote Domain Lists"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:527 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:591
msgid "Remote Subnet Lists" msgid "Remote Subnet Lists"
msgstr "" msgstr ""
@@ -628,7 +661,7 @@ msgstr ""
msgid "Router DNS is routed through sing-box" msgid "Router DNS is routed through sing-box"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:376 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:395
msgid "Routing Excluded IPs" msgid "Routing Excluded IPs"
msgstr "" msgstr ""
@@ -660,15 +693,19 @@ msgstr ""
msgid "Run Diagnostic" msgid "Run Diagnostic"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:264 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:328
msgid "Russia inside restrictions" msgid "Russia inside restrictions"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:257
msgid "Secret key for authenticating remote access to YACD when WAN access is enabled."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js:36 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js:36
msgid "Sections" msgid "Sections"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:212 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:276
msgid "Select a predefined list for routing" msgid "Select a predefined list for routing"
msgstr "" msgstr ""
@@ -680,7 +717,7 @@ msgstr ""
msgid "Select DNS protocol to use" msgid "Select DNS protocol to use"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:258 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:277
msgid "Select how often the domain or subnet lists are updated automatically" msgid "Select how often the domain or subnet lists are updated automatically"
msgstr "" msgstr ""
@@ -688,32 +725,32 @@ msgstr ""
msgid "Select how to configure the proxy" msgid "Select how to configure the proxy"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:121 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:185
msgid "Select network interface for VPN connection" msgid "Select network interface for VPN connection"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:190 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:254
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:25 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:25
msgid "Select or enter DNS server address" msgid "Select or enter DNS server address"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:330 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:349
msgid "Select or enter path for sing-box cache file. Change this ONLY if you know what you are doing" msgid "Select or enter path for sing-box cache file. Change this ONLY if you know what you are doing"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:317 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:336
msgid "Select path for sing-box config file. Change this ONLY if you know what you are doing" msgid "Select path for sing-box config file. Change this ONLY if you know what you are doing"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:177 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:241
msgid "Select the DNS protocol type for the domain resolver" msgid "Select the DNS protocol type for the domain resolver"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:300 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:364
msgid "Select the list type for adding custom domains" msgid "Select the list type for adding custom domains"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:380 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:444
msgid "Select the list type for adding custom subnets" msgid "Select the list type for adding custom subnets"
msgstr "" msgstr ""
@@ -737,7 +774,7 @@ msgstr ""
msgid "Settings" msgid "Settings"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:289 #: src/podkop/tabs/diagnostic/initController.ts:290
#: src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:116 #: src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:116
msgid "Show sing-box config" msgid "Show sing-box config"
msgstr "" msgstr ""
@@ -767,31 +804,31 @@ msgid "Sing-box service exist"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:67 #: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:67
msgid "Sing-box version >= 1.12.4" msgid "Sing-box version is compatible (newer than 1.12.4)"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:89 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:89
msgid "Source Network Interface" msgid "Source Network Interface"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:377 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:396
msgid "Specify a local IP address to be excluded from routing" msgid "Specify a local IP address to be excluded from routing"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:551 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:615
msgid "Specify local IP addresses or subnets whose traffic will always be routed through the configured route" msgid "Specify local IP addresses or subnets whose traffic will always be routed through the configured route"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:505 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:569
msgid "Specify remote URLs to download and use domain lists" msgid "Specify remote URLs to download and use domain lists"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:528 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592
msgid "Specify remote URLs to download and use subnet lists" msgid "Specify remote URLs to download and use subnet lists"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:459 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:523
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:482 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:546
msgid "Specify the path to the list file located on the router filesystem" msgid "Specify the path to the list file located on the router filesystem"
msgstr "" msgstr ""
@@ -823,11 +860,11 @@ msgstr ""
msgid "Test latency" msgid "Test latency"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:304 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:368
msgid "Text List" msgid "Text List"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:384 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:448
msgid "Text List (comma/space/newline separated)" msgid "Text List (comma/space/newline separated)"
msgstr "" msgstr ""
@@ -835,6 +872,18 @@ msgstr ""
msgid "The DNS server used to look up the IP address of an upstream DNS server" msgid "The DNS server used to look up the IP address of an upstream DNS server"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111
msgid "The interval between connectivity tests"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:124
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
msgid "The URL used to test server connectivity"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:69 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:69
msgid "Time in seconds for DNS record caching (default: 60)" msgid "Time in seconds for DNS record caching (default: 60)"
msgstr "" msgstr ""
@@ -859,22 +908,22 @@ msgstr ""
msgid "TTL value cannot be empty" msgid "TTL value cannot be empty"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:181 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:245
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:17 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:17
msgid "UDP (Unprotected DNS)" msgid "UDP (Unprotected DNS)"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:174
msgid "UDP over TCP" msgid "UDP over TCP"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:37
#: src/podkop/tabs/diagnostic/initController.ts:38 #: src/podkop/tabs/diagnostic/initController.ts:38
#: src/podkop/tabs/diagnostic/initController.ts:39 #: src/podkop/tabs/diagnostic/initController.ts:39
#: src/podkop/tabs/diagnostic/initController.ts:40 #: src/podkop/tabs/diagnostic/initController.ts:40
#: src/podkop/tabs/diagnostic/initController.ts:41 #: src/podkop/tabs/diagnostic/initController.ts:41
#: src/podkop/tabs/diagnostic/initController.ts:42 #: src/podkop/tabs/diagnostic/initController.ts:42
#: src/podkop/tabs/diagnostic/initController.ts:416 #: src/podkop/tabs/diagnostic/initController.ts:43
#: src/podkop/tabs/diagnostic/initController.ts:417
msgid "unknown" msgid "unknown"
msgstr "" msgstr ""
@@ -891,7 +940,7 @@ msgstr ""
msgid "URL must start with vless://, ss://, trojan://, or socks4/5://" msgid "URL must start with vless://, ss://, trojan://, or socks4/5://"
msgstr "" msgstr ""
#: src/validators/validateUrl.ts:13 #: src/validators/validateUrl.ts:17
msgid "URL must use one of the following protocols:" msgid "URL must use one of the following protocols:"
msgstr "" msgstr ""
@@ -899,31 +948,43 @@ msgstr ""
msgid "URLTest" msgid "URLTest"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110
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:87
msgid "URLTest Proxy Links" msgid "URLTest Proxy Links"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:299 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:146
msgid "URLTest Testing URL"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:123
msgid "URLTest Tolerance"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:363
msgid "User Domain List Type" msgid "User Domain List Type"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:311 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:375
msgid "User Domains" msgid "User Domains"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:337 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:401
msgid "User Domains List" msgid "User Domains List"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:379 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:443
msgid "User Subnet List Type" msgid "User Subnet List Type"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:391 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:455
msgid "User Subnets" msgid "User Subnets"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:417 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:481
msgid "User Subnets List" msgid "User Subnets List"
msgstr "" msgstr ""
@@ -932,23 +993,23 @@ msgstr ""
#: src/validators/validateDomain.ts:13 #: src/validators/validateDomain.ts:13
#: src/validators/validateDomain.ts:30 #: src/validators/validateDomain.ts:30
#: src/validators/validateIp.ts:8 #: src/validators/validateIp.ts:8
#: src/validators/validateOutboundJson.ts:17 #: src/validators/validateOutboundJson.ts:7
#: src/validators/validatePath.ts:16 #: src/validators/validatePath.ts:16
#: src/validators/validateShadowsocksUrl.ts:95 #: src/validators/validateShadowsocksUrl.ts:95
#: src/validators/validateSocksUrl.ts:80 #: src/validators/validateSocksUrl.ts:80
#: src/validators/validateSubnet.ts:38 #: src/validators/validateSubnet.ts:38
#: src/validators/validateTrojanUrl.ts:59 #: src/validators/validateTrojanUrl.ts:59
#: src/validators/validateUrl.ts:16 #: src/validators/validateUrl.ts:28
#: src/validators/validateVlessUrl.ts:108 #: src/validators/validateVlessUrl.ts:108
msgid "Valid" msgid "Valid"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:370 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:434
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:449 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:513
msgid "Validation errors:" msgid "Validation errors:"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:255 #: src/podkop/tabs/diagnostic/initController.ts:256
#: src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:107 #: src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:107
msgid "View logs" msgid "View logs"
msgstr "" msgstr ""
@@ -957,14 +1018,18 @@ msgstr ""
msgid "Visit Wiki" msgid "Visit Wiki"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:247 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:311
msgid "Warning: %s cannot be used together with %s. Previous selections have been removed." msgid "Warning: %s cannot be used together with %s. Previous selections have been removed."
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:266 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:330
msgid "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection." msgid "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection."
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:256
msgid "YACD Secret Key"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:127 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:127
msgid "You can select Output Network Interface, by default autodetect" msgid "You can select Output Network Interface, by default autodetect"
msgstr "" msgstr ""

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PODKOP\n" "Project-Id-Version: PODKOP\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-23 20:43+0300\n" "POT-Creation-Date: 2025-11-06 16:19+0200\n"
"PO-Revision-Date: 2025-10-23 20:43+0300\n" "PO-Revision-Date: 2025-11-06 16:19+0200\n"
"Last-Translator: divocat\n" "Last-Translator: divocat\n"
"Language-Team: none\n" "Language-Team: none\n"
"Language: ru\n" "Language: ru\n"
@@ -35,6 +35,9 @@ msgstr "Активные соединения"
msgid "Additional marking rules found" msgid "Additional marking rules found"
msgstr "Найдены дополнительные правила маркировки" msgstr "Найдены дополнительные правила маркировки"
msgid "Allows access to YACD from the WAN. Make sure to open the appropriate port in your firewall."
msgstr "Обеспечивает доступ к YACD из WAN. Убедитесь, что в брандмауэре открыт соответствующий порт."
msgid "Applicable for SOCKS and Shadowsocks proxy" msgid "Applicable for SOCKS and Shadowsocks proxy"
msgstr "Применимо для SOCKS и Shadowsocks прокси" msgstr "Применимо для SOCKS и Shadowsocks прокси"
@@ -182,9 +185,6 @@ msgstr "Скачивать списки через Proxy/VPN"
msgid "Download Lists via specific proxy section" msgid "Download Lists via specific proxy section"
msgstr "Скачивать списки через выбранную секцию" msgstr "Скачивать списки через выбранную секцию"
msgid "Downloading all lists via main Proxy/VPN"
msgstr "Загрузка всех списков через основной прокси/VPN"
msgid "Downloading all lists via specific Proxy/VPN" msgid "Downloading all lists via specific Proxy/VPN"
msgstr "Загрузка всех списков через указанный прокси/VPN" msgstr "Загрузка всех списков через указанный прокси/VPN"
@@ -209,6 +209,9 @@ msgstr "Включить смешанный прокси-сервер, разр
msgid "Enable YACD" msgid "Enable YACD"
msgstr "Включить YACD" msgstr "Включить YACD"
msgid "Enable YACD WAN Access"
msgstr "Включить доступ YACD WAN"
msgid "Enter complete outbound configuration in JSON format" msgid "Enter complete outbound configuration in JSON format"
msgstr "Введите полную конфигурацию исходящего соединения в формате JSON" msgstr "Введите полную конфигурацию исходящего соединения в формате JSON"
@@ -221,6 +224,18 @@ msgstr "Введите доменные имена без протоколов,
msgid "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses" msgid "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses"
msgstr "Введите подсети в нотации CIDR (например, 103.21.244.0/22) или отдельные IP-адреса" msgstr "Введите подсети в нотации CIDR (например, 103.21.244.0/22) или отдельные IP-адреса"
msgid "Every 1 minute"
msgstr "Каждую минуту"
msgid "Every 3 minutes"
msgstr "Каждые 3 минуты"
msgid "Every 30 seconds"
msgstr "Каждые 30 секунд"
msgid "Every 5 minutes"
msgstr "Каждые 5 минут"
msgid "Exclude NTP" msgid "Exclude NTP"
msgstr "Исключить NTP" msgstr "Исключить NTP"
@@ -377,6 +392,9 @@ msgstr "Порт смешанного прокси"
msgid "Monitored Interfaces" msgid "Monitored Interfaces"
msgstr "Наблюдаемые интерфейсы" msgstr "Наблюдаемые интерфейсы"
msgid "Must be a number in the range of 50 - 1000"
msgstr "Должно быть числом от 50 до 1000"
msgid "Network Interface" msgid "Network Interface"
msgstr "Сетевой интерфейс" msgstr "Сетевой интерфейс"
@@ -386,6 +404,9 @@ msgstr "Другие правила маркировки не найдены"
msgid "Not implement yet" msgid "Not implement yet"
msgstr "Ещё не реализовано" msgstr "Ещё не реализовано"
msgid "Not responding"
msgstr "Не отвечает"
msgid "Not running" msgid "Not running"
msgstr "Не запущено" msgstr "Не запущено"
@@ -398,9 +419,6 @@ msgstr "Конфигурация Outbound"
msgid "Outbound Configuration" msgid "Outbound Configuration"
msgstr "Конфигурация исходящего соединения" msgstr "Конфигурация исходящего соединения"
msgid "Outbound JSON must contain at least \"type\", \"server\" and \"server_port\" fields"
msgstr "JSON должен содержать поля \"type\", \"server\" и \"server_port\""
msgid "Outdated" msgid "Outdated"
msgstr "Устаревшая" msgstr "Устаревшая"
@@ -485,6 +503,9 @@ msgstr "Запустить диагностику"
msgid "Russia inside restrictions" msgid "Russia inside restrictions"
msgstr "Ограничения Russia inside" msgstr "Ограничения Russia inside"
msgid "Secret key for authenticating remote access to YACD when WAN access is enabled."
msgstr "Секретный ключ для аутентификации удаленного доступа к YACD при включенном доступе через WAN."
msgid "Sections" msgid "Sections"
msgstr "Секции" msgstr "Секции"
@@ -560,8 +581,8 @@ msgstr "Процесс sing-box запущен"
msgid "Sing-box service exist" msgid "Sing-box service exist"
msgstr "Сервис sing-box существует" msgstr "Сервис sing-box существует"
msgid "Sing-box version >= 1.12.4" msgid "Sing-box version is compatible (newer than 1.12.4)"
msgstr "Версия sing-box >= 1.12.4" msgstr "Версия Sing-box совместима (новее 1.12.4)"
msgid "Source Network Interface" msgid "Source Network Interface"
msgstr "Сетевой интерфейс источника" msgstr "Сетевой интерфейс источника"
@@ -611,6 +632,15 @@ msgstr "Текстовый список (через запятую, пробел
msgid "The DNS server used to look up the IP address of an upstream DNS server" msgid "The DNS server used to look up the IP address of an upstream DNS server"
msgstr "DNS-сервер, используемый для поиска IP-адреса вышестоящего DNS-сервера" msgstr "DNS-сервер, используемый для поиска IP-адреса вышестоящего DNS-сервера"
msgid "The interval between connectivity tests"
msgstr "Интервал между тестами подключения"
msgid "The maximum difference in response times (ms) allowed when comparing servers"
msgstr "Максимально допустимая разница во времени отклика (мс) при сравнении серверов"
msgid "The URL used to test server connectivity"
msgstr "URL-адрес, используемый для проверки подключения к серверу"
msgid "Time in seconds for DNS record caching (default: 60)" msgid "Time in seconds for DNS record caching (default: 60)"
msgstr "Время в секундах для кэширования DNS записей (по умолчанию: 60)" msgstr "Время в секундах для кэширования DNS записей (по умолчанию: 60)"
@@ -653,9 +683,18 @@ msgstr "URL должен использовать один из следующи
msgid "URLTest" msgid "URLTest"
msgstr "URLTest" msgstr "URLTest"
msgid "URLTest Check Interval"
msgstr "Интервал проверки URLTest"
msgid "URLTest Proxy Links" msgid "URLTest Proxy Links"
msgstr "Ссылки прокси для URLTest" msgstr "Ссылки прокси для URLTest"
msgid "URLTest Testing URL"
msgstr "URLTest ссылка для проверки"
msgid "URLTest Tolerance"
msgstr "URLTest допустимое отклонение"
msgid "User Domain List Type" msgid "User Domain List Type"
msgstr "Тип пользовательского списка доменов" msgstr "Тип пользовательского списка доменов"
@@ -692,5 +731,8 @@ msgstr "Предупреждение: %s нельзя использовать
msgid "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection." msgid "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection."
msgstr "Предупреждение: Russia inside может быть использован только с %s. %s уже есть в Russia inside и будет удален из выбранных." msgstr "Предупреждение: Russia inside может быть использован только с %s. %s уже есть в Russia inside и будет удален из выбранных."
msgid "YACD Secret Key"
msgstr "Секретный ключ YACD"
msgid "You can select Output Network Interface, by default autodetect" msgid "You can select Output Network Interface, by default autodetect"
msgstr "Вы можете выбрать выходной сетевой интерфейс, по умолчанию он определяется автоматически." msgstr "Вы можете выбрать выходной сетевой интерфейс, по умолчанию он определяется автоматически."

View File

@@ -4,6 +4,9 @@
'require uci'; 'require uci';
'require ui'; 'require ui';
if (typeof structuredClone !== 'function')
globalThis.structuredClone = (obj) => JSON.parse(JSON.stringify(obj));
export * from './validators'; export * from './validators';
export * from './helpers'; export * from './helpers';
export * from './podkop'; export * from './podkop';

View File

@@ -0,0 +1,9 @@
import { getConfigSections } from './getConfigSections';
export async function getClashApiSecret() {
const sections = await getConfigSections();
const settings = sections.find((section) => section['.type'] === 'settings');
return settings?.yacd_secret_key || '';
}

View File

@@ -1,7 +1,9 @@
import { getConfigSections } from './getConfigSections'; import { getConfigSections } from './getConfigSections';
import { getDashboardSections } from './getDashboardSections'; import { getDashboardSections } from './getDashboardSections';
import { getClashApiSecret } from './getClashApiSecret';
export const CustomPodkopMethods = { export const CustomPodkopMethods = {
getConfigSections, getConfigSections,
getDashboardSections, getDashboardSections,
getClashApiSecret,
}; };

View File

@@ -29,15 +29,15 @@ export const PodkopShellMethods = {
Podkop.AvailableClashAPIMethods.GET_PROXIES, Podkop.AvailableClashAPIMethods.GET_PROXIES,
]), ]),
getClashApiProxyLatency: async (tag: string) => getClashApiProxyLatency: async (tag: string) =>
callBaseMethod<unknown>(Podkop.AvailableMethods.CLASH_API, [ callBaseMethod<Podkop.GetClashApiProxyLatency>(
Podkop.AvailableClashAPIMethods.GET_PROXY_LATENCY, Podkop.AvailableMethods.CLASH_API,
tag, [Podkop.AvailableClashAPIMethods.GET_PROXY_LATENCY, tag, '5000'],
]), ),
getClashApiGroupLatency: async (tag: string) => getClashApiGroupLatency: async (tag: string) =>
callBaseMethod<unknown>(Podkop.AvailableMethods.CLASH_API, [ callBaseMethod<Podkop.GetClashApiGroupLatency>(
Podkop.AvailableClashAPIMethods.GET_GROUP_LATENCY, Podkop.AvailableMethods.CLASH_API,
tag, [Podkop.AvailableClashAPIMethods.GET_GROUP_LATENCY, tag, '10000'],
]), ),
setClashApiGroupProxy: async (group: string, proxy: string) => setClashApiGroupProxy: async (group: string, proxy: string) =>
callBaseMethod<unknown>(Podkop.AvailableMethods.CLASH_API, [ callBaseMethod<unknown>(Podkop.AvailableMethods.CLASH_API, [
Podkop.AvailableClashAPIMethods.SET_GROUP_PROXY, Podkop.AvailableClashAPIMethods.SET_GROUP_PROXY,

View File

@@ -8,6 +8,7 @@ import { CustomPodkopMethods, PodkopShellMethods } from '../../methods';
import { logger, socket, store, StoreType } from '../../services'; import { logger, socket, store, StoreType } from '../../services';
import { renderSections, renderWidget } from './partials'; import { renderSections, renderWidget } from './partials';
import { fetchServicesInfo } from '../../fetchers'; import { fetchServicesInfo } from '../../fetchers';
import { getClashApiSecret } from '../../methods/custom/getClashApiSecret';
// Fetchers // Fetchers
@@ -38,8 +39,10 @@ async function fetchDashboardSections() {
} }
async function connectToClashSockets() { async function connectToClashSockets() {
const clashApiSecret = await getClashApiSecret();
socket.subscribe( socket.subscribe(
`${getClashWsUrl()}/traffic?token=`, `${getClashWsUrl()}/traffic?token=${clashApiSecret}`,
(msg) => { (msg) => {
const parsedMsg = JSON.parse(msg); const parsedMsg = JSON.parse(msg);
@@ -68,7 +71,7 @@ async function connectToClashSockets() {
); );
socket.subscribe( socket.subscribe(
`${getClashWsUrl()}/connections?token=`, `${getClashWsUrl()}/connections?token=${clashApiSecret}`,
(msg) => { (msg) => {
const parsedMsg = JSON.parse(msg); const parsedMsg = JSON.parse(msg);

View File

@@ -5,6 +5,7 @@ export enum DIAGNOSTICS_CHECKS {
SINGBOX = 'SINGBOX', SINGBOX = 'SINGBOX',
NFT = 'NFT', NFT = 'NFT',
FAKEIP = 'FAKEIP', FAKEIP = 'FAKEIP',
OUTBOUNDS = 'OUTBOUNDS',
} }
export const DIAGNOSTICS_CHECKS_MAP: Record< export const DIAGNOSTICS_CHECKS_MAP: Record<
@@ -26,8 +27,13 @@ export const DIAGNOSTICS_CHECKS_MAP: Record<
title: getCheckTitle('Nftables'), title: getCheckTitle('Nftables'),
code: DIAGNOSTICS_CHECKS.NFT, code: DIAGNOSTICS_CHECKS.NFT,
}, },
[DIAGNOSTICS_CHECKS.FAKEIP]: { [DIAGNOSTICS_CHECKS.OUTBOUNDS]: {
order: 4, order: 4,
title: getCheckTitle('Outbounds'),
code: DIAGNOSTICS_CHECKS.OUTBOUNDS,
},
[DIAGNOSTICS_CHECKS.FAKEIP]: {
order: 5,
title: getCheckTitle('FakeIP'), title: getCheckTitle('FakeIP'),
code: DIAGNOSTICS_CHECKS.FAKEIP, code: DIAGNOSTICS_CHECKS.FAKEIP,
}, },

View File

@@ -0,0 +1,132 @@
import { DIAGNOSTICS_CHECKS_MAP } from './contstants';
import { PodkopShellMethods } from '../../../methods';
import { updateCheckStore } from './updateCheckStore';
import { getMeta } from '../helpers/getMeta';
import { getDashboardSections } from '../../../methods/custom/getDashboardSections';
import { IDiagnosticsChecksItem } from '../../../services';
export async function runSectionsCheck() {
const { order, title, code } = DIAGNOSTICS_CHECKS_MAP.OUTBOUNDS;
updateCheckStore({
order,
code,
title,
description: _('Checking, please wait'),
state: 'loading',
items: [],
});
const sections = await getDashboardSections();
if (!sections.success) {
updateCheckStore({
order,
code,
title,
description: _('Cannot receive checks result'),
state: 'error',
items: [],
});
throw new Error('Sections checks failed');
}
const items = (await Promise.all(
sections.data.map(async (section) => {
async function getLatency() {
if (section.withTagSelect) {
const latencyGroup = await PodkopShellMethods.getClashApiGroupLatency(
section.code,
);
const selectedOutbound = section.outbounds.find(
(item) => item.selected,
);
const isUrlTest = selectedOutbound?.type === 'URLTest';
const success = latencyGroup.success && !latencyGroup.data.message;
if (success) {
if (isUrlTest) {
const latency = Object.values(latencyGroup.data)
.map((item) => (item ? `${item}ms` : 'n/a'))
.join(' / ');
return {
success: true,
latency: `[${_('Fastest')}] ${latency}`,
};
}
const selectedProxyDelay =
latencyGroup.data?.[selectedOutbound?.code ?? ''];
if (selectedProxyDelay) {
return {
success: true,
latency: `[${selectedOutbound?.displayName ?? ''}] ${selectedProxyDelay}ms`,
};
}
return {
success: false,
latency: `[${selectedOutbound?.displayName ?? ''}] ${_('Not responding')}`,
};
}
return {
success: false,
latency: _('Not responding'),
};
}
const latencyProxy = await PodkopShellMethods.getClashApiProxyLatency(
section.code,
);
const success = latencyProxy.success && !latencyProxy.data.message;
if (success) {
return {
success: true,
latency: `${latencyProxy.data.delay} ms`,
};
}
return {
success: false,
latency: _('Not responding'),
};
}
const { latency, success } = await getLatency();
return {
state: success ? 'success' : 'error',
key: section.displayName,
value: latency,
};
}),
)) as Array<IDiagnosticsChecksItem>;
const allGood = items.every((item) => item.state === 'success');
const atLeastOneGood = items.some((item) => item.state === 'success');
const { state, description } = getMeta({ atLeastOneGood, allGood });
updateCheckStore({
order,
code,
title,
description,
state,
items,
});
if (!atLeastOneGood) {
throw new Error('Sections checks failed');
}
}

View File

@@ -64,7 +64,7 @@ export async function runSingBoxCheck() {
}, },
{ {
state: data.sing_box_version_ok ? 'success' : 'error', state: data.sing_box_version_ok ? 'success' : 'error',
key: _('Sing-box version >= 1.12.4'), key: _('Sing-box version is compatible (newer than 1.12.4)'),
value: '', value: '',
}, },
{ {

View File

@@ -72,6 +72,14 @@ export const initialDiagnosticStore: Pick<
items: [], items: [],
state: 'skipped', state: 'skipped',
}, },
{
code: DIAGNOSTICS_CHECKS.OUTBOUNDS,
title: DIAGNOSTICS_CHECKS_MAP.OUTBOUNDS.title,
order: DIAGNOSTICS_CHECKS_MAP.OUTBOUNDS.order,
description: _('Not running'),
items: [],
state: 'skipped',
},
{ {
code: DIAGNOSTICS_CHECKS.FAKEIP, code: DIAGNOSTICS_CHECKS.FAKEIP,
title: DIAGNOSTICS_CHECKS_MAP.FAKEIP.title, title: DIAGNOSTICS_CHECKS_MAP.FAKEIP.title,
@@ -112,6 +120,14 @@ export const loadingDiagnosticsChecksStore: Pick<
items: [], items: [],
state: 'skipped', state: 'skipped',
}, },
{
code: DIAGNOSTICS_CHECKS.OUTBOUNDS,
title: DIAGNOSTICS_CHECKS_MAP.OUTBOUNDS.title,
order: DIAGNOSTICS_CHECKS_MAP.OUTBOUNDS.order,
description: _('Pending'),
items: [],
state: 'skipped',
},
{ {
code: DIAGNOSTICS_CHECKS.FAKEIP, code: DIAGNOSTICS_CHECKS.FAKEIP,
title: DIAGNOSTICS_CHECKS_MAP.FAKEIP.title, title: DIAGNOSTICS_CHECKS_MAP.FAKEIP.title,

View File

@@ -19,6 +19,7 @@ import { renderModal } from '../../../partials';
import { PODKOP_LUCI_APP_VERSION } from '../../../constants'; import { PODKOP_LUCI_APP_VERSION } from '../../../constants';
import { showToast } from '../../../helpers/showToast'; import { showToast } from '../../../helpers/showToast';
import { renderWikiDisclaimer } from './partials/renderWikiDisclaimer'; import { renderWikiDisclaimer } from './partials/renderWikiDisclaimer';
import { runSectionsCheck } from './checks/runSectionsCheck';
async function fetchSystemInfo() { async function fetchSystemInfo() {
const systemInfo = await PodkopShellMethods.getSystemInfo(); const systemInfo = await PodkopShellMethods.getSystemInfo();
@@ -414,9 +415,9 @@ function renderDiagnosticSystemInfoWidget() {
function getPodkopVersionRow(): IRenderSystemInfoRow { function getPodkopVersionRow(): IRenderSystemInfoRow {
const loading = diagnosticsSystemInfo.loading; const loading = diagnosticsSystemInfo.loading;
const unknown = diagnosticsSystemInfo.podkop_version === _('unknown'); const unknown = diagnosticsSystemInfo.podkop_version === _('unknown');
const hasActualVersion = Boolean( const hasActualVersion =
diagnosticsSystemInfo.podkop_latest_version, Boolean(diagnosticsSystemInfo.podkop_latest_version) &&
); diagnosticsSystemInfo.podkop_latest_version !== 'unknown';
const version = normalizeCompiledVersion( const version = normalizeCompiledVersion(
diagnosticsSystemInfo.podkop_version, diagnosticsSystemInfo.podkop_version,
); );
@@ -518,6 +519,8 @@ async function runChecks() {
await runNftCheck(); await runNftCheck();
await runSectionsCheck();
await runFakeIPCheck(); await runFakeIPCheck();
} catch (e) { } catch (e) {
logger.error('[DIAGNOSTIC]', 'runChecks - e', e); logger.error('[DIAGNOSTIC]', 'runChecks - e', e);

View File

@@ -126,6 +126,7 @@ export namespace Podkop {
export type ConfigSection = ConfigBaseSection & { export type ConfigSection = ConfigBaseSection & {
'.name': string; '.name': string;
'.type': 'settings' | 'section'; '.type': 'settings' | 'section';
yacd_secret_key?: string;
}; };
export interface MethodSuccessResponse<T> { export interface MethodSuccessResponse<T> {
@@ -196,4 +197,11 @@ export namespace Podkop {
openwrt_version: string; openwrt_version: string;
device_model: string; device_model: string;
} }
export interface GetClashApiProxyLatency {
delay: number;
message?: string;
}
export type GetClashApiGroupLatency = Record<string, number>;
} }

View File

@@ -16,6 +16,7 @@ const invalidUrls = [
['Unsupported protocol (ftp)', 'ftp://example.com'], ['Unsupported protocol (ftp)', 'ftp://example.com'],
['Unsupported protocol (ws)', 'ws://example.com'], ['Unsupported protocol (ws)', 'ws://example.com'],
['Empty string', ''], ['Empty string', ''],
['Without tld', 'https://google'],
]; ];
describe('validateUrl', () => { describe('validateUrl', () => {

View File

@@ -1,18 +1,8 @@
import { ValidationResult } from './types'; import { ValidationResult } from './types';
// TODO refactor current validation and add tests
export function validateOutboundJson(value: string): ValidationResult { export function validateOutboundJson(value: string): ValidationResult {
try { try {
const parsed = JSON.parse(value); JSON.parse(value);
if (!parsed.type || !parsed.server || !parsed.server_port) {
return {
valid: false,
message: _(
'Outbound JSON must contain at least "type", "server" and "server_port" fields',
),
};
}
return { valid: true, message: _('Valid') }; return { valid: true, message: _('Valid') };
} catch { } catch {

View File

@@ -2,19 +2,31 @@ import { ValidationResult } from './types';
export function validateUrl( export function validateUrl(
url: string, url: string,
protocols: string[] = ['http:', 'https:'], protocols = ['http:', 'https:'],
): ValidationResult { ): ValidationResult {
try { if (!url.length) {
const parsedUrl = new URL(url);
if (!protocols.includes(parsedUrl.protocol)) {
return {
valid: false,
message: `${_('URL must use one of the following protocols:')} ${protocols.join(', ')}`,
};
}
return { valid: true, message: _('Valid') };
} catch (_e) {
return { valid: false, message: _('Invalid URL format') }; return { valid: false, message: _('Invalid URL format') };
} }
const hasValidProtocol = protocols.some((p) => url.indexOf(p + '//') === 0);
if (!hasValidProtocol)
return {
valid: false,
message:
_('URL must use one of the following protocols:') +
' ' +
protocols.join(', '),
};
const regex = new RegExp(
`^(?:${protocols.map((p) => p.replace(':', '')).join('|')})://` +
`(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/[^\\s]*)?$`,
);
if (regex.test(url)) {
return { valid: true, message: _('Valid') };
}
return { valid: false, message: _('Invalid URL format') };
} }

View File

@@ -58,18 +58,22 @@ function validateDNS(value) {
// src/validators/validateUrl.ts // src/validators/validateUrl.ts
function validateUrl(url, protocols = ["http:", "https:"]) { function validateUrl(url, protocols = ["http:", "https:"]) {
try { if (!url.length) {
const parsedUrl = new URL(url);
if (!protocols.includes(parsedUrl.protocol)) {
return {
valid: false,
message: `${_("URL must use one of the following protocols:")} ${protocols.join(", ")}`
};
}
return { valid: true, message: _("Valid") };
} catch (_e) {
return { valid: false, message: _("Invalid URL format") }; return { valid: false, message: _("Invalid URL format") };
} }
const hasValidProtocol = protocols.some((p) => url.indexOf(p + "//") === 0);
if (!hasValidProtocol)
return {
valid: false,
message: _("URL must use one of the following protocols:") + " " + protocols.join(", ")
};
const regex = new RegExp(
`^(?:${protocols.map((p) => p.replace(":", "")).join("|")})://(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/[^\\s]*)?$`
);
if (regex.test(url)) {
return { valid: true, message: _("Valid") };
}
return { valid: false, message: _("Invalid URL format") };
} }
// src/validators/validatePath.ts // src/validators/validatePath.ts
@@ -323,15 +327,7 @@ function validateVlessUrl(url) {
// src/validators/validateOutboundJson.ts // src/validators/validateOutboundJson.ts
function validateOutboundJson(value) { function validateOutboundJson(value) {
try { try {
const parsed = JSON.parse(value); JSON.parse(value);
if (!parsed.type || !parsed.server || !parsed.server_port) {
return {
valid: false,
message: _(
'Outbound JSON must contain at least "type", "server" and "server_port" fields'
)
};
}
return { valid: true, message: _("Valid") }; return { valid: true, message: _("Valid") };
} catch { } catch {
return { valid: false, message: _("Invalid JSON format") }; return { valid: false, message: _("Invalid JSON format") };
@@ -563,14 +559,14 @@ var PodkopShellMethods = {
getClashApiProxies: async () => callBaseMethod(Podkop.AvailableMethods.CLASH_API, [ getClashApiProxies: async () => callBaseMethod(Podkop.AvailableMethods.CLASH_API, [
Podkop.AvailableClashAPIMethods.GET_PROXIES Podkop.AvailableClashAPIMethods.GET_PROXIES
]), ]),
getClashApiProxyLatency: async (tag) => callBaseMethod(Podkop.AvailableMethods.CLASH_API, [ getClashApiProxyLatency: async (tag) => callBaseMethod(
Podkop.AvailableClashAPIMethods.GET_PROXY_LATENCY, Podkop.AvailableMethods.CLASH_API,
tag [Podkop.AvailableClashAPIMethods.GET_PROXY_LATENCY, tag, "5000"]
]), ),
getClashApiGroupLatency: async (tag) => callBaseMethod(Podkop.AvailableMethods.CLASH_API, [ getClashApiGroupLatency: async (tag) => callBaseMethod(
Podkop.AvailableClashAPIMethods.GET_GROUP_LATENCY, Podkop.AvailableMethods.CLASH_API,
tag [Podkop.AvailableClashAPIMethods.GET_GROUP_LATENCY, tag, "10000"]
]), ),
setClashApiGroupProxy: async (group, proxy) => callBaseMethod(Podkop.AvailableMethods.CLASH_API, [ setClashApiGroupProxy: async (group, proxy) => callBaseMethod(Podkop.AvailableMethods.CLASH_API, [
Podkop.AvailableClashAPIMethods.SET_GROUP_PROXY, Podkop.AvailableClashAPIMethods.SET_GROUP_PROXY,
group, group,
@@ -735,10 +731,18 @@ async function getDashboardSections() {
}; };
} }
// src/podkop/methods/custom/getClashApiSecret.ts
async function getClashApiSecret() {
const sections = await getConfigSections();
const settings = sections.find((section) => section[".type"] === "settings");
return settings?.yacd_secret_key || "";
}
// src/podkop/methods/custom/index.ts // src/podkop/methods/custom/index.ts
var CustomPodkopMethods = { var CustomPodkopMethods = {
getConfigSections, getConfigSections,
getDashboardSections getDashboardSections,
getClashApiSecret
}; };
// src/constants.ts // src/constants.ts
@@ -1004,8 +1008,13 @@ var DIAGNOSTICS_CHECKS_MAP = {
title: getCheckTitle("Nftables"), title: getCheckTitle("Nftables"),
code: "NFT" /* NFT */ code: "NFT" /* NFT */
}, },
["FAKEIP" /* FAKEIP */]: { ["OUTBOUNDS" /* OUTBOUNDS */]: {
order: 4, order: 4,
title: getCheckTitle("Outbounds"),
code: "OUTBOUNDS" /* OUTBOUNDS */
},
["FAKEIP" /* FAKEIP */]: {
order: 5,
title: getCheckTitle("FakeIP"), title: getCheckTitle("FakeIP"),
code: "FAKEIP" /* FAKEIP */ code: "FAKEIP" /* FAKEIP */
} }
@@ -1074,6 +1083,14 @@ var initialDiagnosticStore = {
items: [], items: [],
state: "skipped" state: "skipped"
}, },
{
code: "OUTBOUNDS" /* OUTBOUNDS */,
title: DIAGNOSTICS_CHECKS_MAP.OUTBOUNDS.title,
order: DIAGNOSTICS_CHECKS_MAP.OUTBOUNDS.order,
description: _("Not running"),
items: [],
state: "skipped"
},
{ {
code: "FAKEIP" /* FAKEIP */, code: "FAKEIP" /* FAKEIP */,
title: DIAGNOSTICS_CHECKS_MAP.FAKEIP.title, title: DIAGNOSTICS_CHECKS_MAP.FAKEIP.title,
@@ -1110,6 +1127,14 @@ var loadingDiagnosticsChecksStore = {
items: [], items: [],
state: "skipped" state: "skipped"
}, },
{
code: "OUTBOUNDS" /* OUTBOUNDS */,
title: DIAGNOSTICS_CHECKS_MAP.OUTBOUNDS.title,
order: DIAGNOSTICS_CHECKS_MAP.OUTBOUNDS.order,
description: _("Pending"),
items: [],
state: "skipped"
},
{ {
code: "FAKEIP" /* FAKEIP */, code: "FAKEIP" /* FAKEIP */,
title: DIAGNOSTICS_CHECKS_MAP.FAKEIP.title, title: DIAGNOSTICS_CHECKS_MAP.FAKEIP.title,
@@ -1859,8 +1884,9 @@ async function fetchDashboardSections() {
}); });
} }
async function connectToClashSockets() { async function connectToClashSockets() {
const clashApiSecret = await getClashApiSecret();
socket.subscribe( socket.subscribe(
`${getClashWsUrl()}/traffic?token=`, `${getClashWsUrl()}/traffic?token=${clashApiSecret}`,
(msg) => { (msg) => {
const parsedMsg = JSON.parse(msg); const parsedMsg = JSON.parse(msg);
store.set({ store.set({
@@ -1887,7 +1913,7 @@ async function connectToClashSockets() {
} }
); );
socket.subscribe( socket.subscribe(
`${getClashWsUrl()}/connections?token=`, `${getClashWsUrl()}/connections?token=${clashApiSecret}`,
(msg) => { (msg) => {
const parsedMsg = JSON.parse(msg); const parsedMsg = JSON.parse(msg);
store.set({ store.set({
@@ -2492,7 +2518,7 @@ async function runSingBoxCheck() {
}, },
{ {
state: data.sing_box_version_ok ? "success" : "error", state: data.sing_box_version_ok ? "success" : "error",
key: _("Sing-box version >= 1.12.4"), key: _("Sing-box version is compatible (newer than 1.12.4)"),
value: "" value: ""
}, },
{ {
@@ -3685,6 +3711,105 @@ function renderWikiDisclaimer(kind) {
]); ]);
} }
// src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts
async function runSectionsCheck() {
const { order, title, code } = DIAGNOSTICS_CHECKS_MAP.OUTBOUNDS;
updateCheckStore({
order,
code,
title,
description: _("Checking, please wait"),
state: "loading",
items: []
});
const sections = await getDashboardSections();
if (!sections.success) {
updateCheckStore({
order,
code,
title,
description: _("Cannot receive checks result"),
state: "error",
items: []
});
throw new Error("Sections checks failed");
}
const items = await Promise.all(
sections.data.map(async (section) => {
async function getLatency() {
if (section.withTagSelect) {
const latencyGroup = await PodkopShellMethods.getClashApiGroupLatency(
section.code
);
const selectedOutbound = section.outbounds.find(
(item) => item.selected
);
const isUrlTest = selectedOutbound?.type === "URLTest";
const success3 = latencyGroup.success && !latencyGroup.data.message;
if (success3) {
if (isUrlTest) {
const latency2 = Object.values(latencyGroup.data).map((item) => item ? `${item}ms` : "n/a").join(" / ");
return {
success: true,
latency: `[${_("Fastest")}] ${latency2}`
};
}
const selectedProxyDelay = latencyGroup.data?.[selectedOutbound?.code ?? ""];
if (selectedProxyDelay) {
return {
success: true,
latency: `[${selectedOutbound?.displayName ?? ""}] ${selectedProxyDelay}ms`
};
}
return {
success: false,
latency: `[${selectedOutbound?.displayName ?? ""}] ${_("Not responding")}`
};
}
return {
success: false,
latency: _("Not responding")
};
}
const latencyProxy = await PodkopShellMethods.getClashApiProxyLatency(
section.code
);
const success2 = latencyProxy.success && !latencyProxy.data.message;
if (success2) {
return {
success: true,
latency: `${latencyProxy.data.delay} ms`
};
}
return {
success: false,
latency: _("Not responding")
};
}
const { latency, success } = await getLatency();
return {
state: success ? "success" : "error",
key: section.displayName,
value: latency
};
})
);
const allGood = items.every((item) => item.state === "success");
const atLeastOneGood = items.some((item) => item.state === "success");
const { state, description } = getMeta({ atLeastOneGood, allGood });
updateCheckStore({
order,
code,
title,
description,
state,
items
});
if (!atLeastOneGood) {
throw new Error("Sections checks failed");
}
}
// src/podkop/tabs/diagnostic/initController.ts // src/podkop/tabs/diagnostic/initController.ts
async function fetchSystemInfo() { async function fetchSystemInfo() {
const systemInfo = await PodkopShellMethods.getSystemInfo(); const systemInfo = await PodkopShellMethods.getSystemInfo();
@@ -4032,9 +4157,7 @@ function renderDiagnosticSystemInfoWidget() {
function getPodkopVersionRow() { function getPodkopVersionRow() {
const loading = diagnosticsSystemInfo.loading; const loading = diagnosticsSystemInfo.loading;
const unknown = diagnosticsSystemInfo.podkop_version === _("unknown"); const unknown = diagnosticsSystemInfo.podkop_version === _("unknown");
const hasActualVersion = Boolean( const hasActualVersion = Boolean(diagnosticsSystemInfo.podkop_latest_version) && diagnosticsSystemInfo.podkop_latest_version !== "unknown";
diagnosticsSystemInfo.podkop_latest_version
);
const version = normalizeCompiledVersion( const version = normalizeCompiledVersion(
diagnosticsSystemInfo.podkop_version diagnosticsSystemInfo.podkop_version
); );
@@ -4118,6 +4241,7 @@ async function runChecks() {
await runDnsCheck(); await runDnsCheck();
await runSingBoxCheck(); await runSingBoxCheck();
await runNftCheck(); await runNftCheck();
await runSectionsCheck();
await runFakeIPCheck(); await runFakeIPCheck();
} catch (e) { } catch (e) {
logger.error("[DIAGNOSTIC]", "runChecks - e", e); logger.error("[DIAGNOSTIC]", "runChecks - e", e);
@@ -4624,6 +4748,10 @@ function insertIf(condition, elements) {
function insertIfObj(condition, object) { function insertIfObj(condition, object) {
return condition ? object : {}; return condition ? object : {};
} }
// src/main.ts
if (typeof structuredClone !== "function")
globalThis.structuredClone = (obj) => JSON.parse(JSON.stringify(obj));
return baseclass.extend({ return baseclass.extend({
ALLOWED_WITH_RUSSIA_INSIDE, ALLOWED_WITH_RUSSIA_INSIDE,
BOOTSTRAP_DNS_SERVER_OPTIONS, BOOTSTRAP_DNS_SERVER_OPTIONS,

View File

@@ -104,6 +104,70 @@ function createSectionContent(section) {
return validation.message; return validation.message;
}; };
o = section.option(
form.ListValue,
"urltest_check_interval",
_("URLTest Check Interval"),
_("The interval between connectivity tests")
);
o.value("30s", _("Every 30 seconds"));
o.value("1m", _("Every 1 minute"));
o.value("3m", _("Every 3 minutes"));
o.value("5m", _("Every 5 minutes"));
o.default = "3m";
o.depends("proxy_config_type", "urltest");
o = section.option(
form.Value,
"urltest_tolerance",
_("URLTest Tolerance"),
_("The maximum difference in response times (ms) allowed when comparing servers")
);
o.default = "50";
o.rmempty = false;
o.depends("proxy_config_type", "urltest");
o.validate = function (section_id, value) {
if (!value || value.length === 0) {
return true;
}
const parsed = parseFloat(value);
if (/^[0-9]+$/.test(value) && !isNaN(parsed) && isFinite(parsed) && parsed >= 50 && parsed <= 1000) {
return true;
}
return _('Must be a number in the range of 50 - 1000');
};
o = section.option(
form.Value,
"urltest_testing_url",
_("URLTest Testing URL"),
_("The URL used to test server connectivity")
);
o.value("https://www.gstatic.com/generate_204", "https://www.gstatic.com/generate_204 (Google)");
o.value("https://cp.cloudflare.com/generate_204", "https://cp.cloudflare.com/generate_204 (Cloudflare)");
o.value("https://captive.apple.com", "https://captive.apple.com (Apple)");
o.value("https://connectivity-check.ubuntu.com", "https://connectivity-check.ubuntu.com (Ubuntu)")
o.default = "https://www.gstatic.com/generate_204";
o.rmempty = false;
o.depends("proxy_config_type", "urltest");
o.validate = function (section_id, value) {
if (!value || value.length === 0) {
return true;
}
const validation = main.validateUrl(value);
if (validation.valid) {
return true;
}
return validation.message;
};
o = section.option( o = section.option(
form.Flag, form.Flag,
"enable_udp_over_tcp", "enable_udp_over_tcp",

View File

@@ -240,6 +240,25 @@ function createSettingsContent(section) {
o.default = "0"; o.default = "0";
o.rmempty = false; o.rmempty = false;
o = section.option(
form.Flag,
"enable_yacd_wan_access",
_("Enable YACD WAN Access"),
_("Allows access to YACD from the WAN. Make sure to open the appropriate port in your firewall."),
);
o.depends("enable_yacd", "1");
o.default = "0";
o.rmempty = false;
o = section.option(
form.Value,
"yacd_secret_key",
_("YACD Secret Key"),
_("Secret key for authenticating remote access to YACD when WAN access is enabled."),
);
o.depends("enable_yacd_wan_access", "1");
o.rmempty = false;
o = section.option( o = section.option(
form.Flag, form.Flag,
"disable_quic", "disable_quic",
@@ -267,7 +286,7 @@ function createSettingsContent(section) {
form.Flag, form.Flag,
"download_lists_via_proxy", "download_lists_via_proxy",
_("Download Lists via Proxy/VPN"), _("Download Lists via Proxy/VPN"),
_("Downloading all lists via main Proxy/VPN"), _("Downloading all lists via specific Proxy/VPN"),
); );
o.default = "0"; o.default = "0";
o.rmempty = false; o.rmempty = false;

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PODKOP\n" "Project-Id-Version: PODKOP\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-23 20:43+0300\n" "POT-Creation-Date: 2025-11-06 16:19+0200\n"
"PO-Revision-Date: 2025-10-23 20:43+0300\n" "PO-Revision-Date: 2025-11-06 16:19+0200\n"
"Last-Translator: divocat\n" "Last-Translator: divocat\n"
"Language-Team: none\n" "Language-Team: none\n"
"Language: ru\n" "Language: ru\n"
@@ -35,6 +35,9 @@ msgstr "Активные соединения"
msgid "Additional marking rules found" msgid "Additional marking rules found"
msgstr "Найдены дополнительные правила маркировки" msgstr "Найдены дополнительные правила маркировки"
msgid "Allows access to YACD from the WAN. Make sure to open the appropriate port in your firewall."
msgstr "Обеспечивает доступ к YACD из WAN. Убедитесь, что в брандмауэре открыт соответствующий порт."
msgid "Applicable for SOCKS and Shadowsocks proxy" msgid "Applicable for SOCKS and Shadowsocks proxy"
msgstr "Применимо для SOCKS и Shadowsocks прокси" msgstr "Применимо для SOCKS и Shadowsocks прокси"
@@ -182,9 +185,6 @@ msgstr "Скачивать списки через Proxy/VPN"
msgid "Download Lists via specific proxy section" msgid "Download Lists via specific proxy section"
msgstr "Скачивать списки через выбранную секцию" msgstr "Скачивать списки через выбранную секцию"
msgid "Downloading all lists via main Proxy/VPN"
msgstr "Загрузка всех списков через основной прокси/VPN"
msgid "Downloading all lists via specific Proxy/VPN" msgid "Downloading all lists via specific Proxy/VPN"
msgstr "Загрузка всех списков через указанный прокси/VPN" msgstr "Загрузка всех списков через указанный прокси/VPN"
@@ -209,6 +209,9 @@ msgstr "Включить смешанный прокси-сервер, разр
msgid "Enable YACD" msgid "Enable YACD"
msgstr "Включить YACD" msgstr "Включить YACD"
msgid "Enable YACD WAN Access"
msgstr "Включить доступ YACD WAN"
msgid "Enter complete outbound configuration in JSON format" msgid "Enter complete outbound configuration in JSON format"
msgstr "Введите полную конфигурацию исходящего соединения в формате JSON" msgstr "Введите полную конфигурацию исходящего соединения в формате JSON"
@@ -221,6 +224,18 @@ msgstr "Введите доменные имена без протоколов,
msgid "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses" msgid "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses"
msgstr "Введите подсети в нотации CIDR (например, 103.21.244.0/22) или отдельные IP-адреса" msgstr "Введите подсети в нотации CIDR (например, 103.21.244.0/22) или отдельные IP-адреса"
msgid "Every 1 minute"
msgstr "Каждую минуту"
msgid "Every 3 minutes"
msgstr "Каждые 3 минуты"
msgid "Every 30 seconds"
msgstr "Каждые 30 секунд"
msgid "Every 5 minutes"
msgstr "Каждые 5 минут"
msgid "Exclude NTP" msgid "Exclude NTP"
msgstr "Исключить NTP" msgstr "Исключить NTP"
@@ -377,6 +392,9 @@ msgstr "Порт смешанного прокси"
msgid "Monitored Interfaces" msgid "Monitored Interfaces"
msgstr "Наблюдаемые интерфейсы" msgstr "Наблюдаемые интерфейсы"
msgid "Must be a number in the range of 50 - 1000"
msgstr "Должно быть числом от 50 до 1000"
msgid "Network Interface" msgid "Network Interface"
msgstr "Сетевой интерфейс" msgstr "Сетевой интерфейс"
@@ -386,6 +404,9 @@ msgstr "Другие правила маркировки не найдены"
msgid "Not implement yet" msgid "Not implement yet"
msgstr "Ещё не реализовано" msgstr "Ещё не реализовано"
msgid "Not responding"
msgstr "Не отвечает"
msgid "Not running" msgid "Not running"
msgstr "Не запущено" msgstr "Не запущено"
@@ -398,9 +419,6 @@ msgstr "Конфигурация Outbound"
msgid "Outbound Configuration" msgid "Outbound Configuration"
msgstr "Конфигурация исходящего соединения" msgstr "Конфигурация исходящего соединения"
msgid "Outbound JSON must contain at least \"type\", \"server\" and \"server_port\" fields"
msgstr "JSON должен содержать поля \"type\", \"server\" и \"server_port\""
msgid "Outdated" msgid "Outdated"
msgstr "Устаревшая" msgstr "Устаревшая"
@@ -485,6 +503,9 @@ msgstr "Запустить диагностику"
msgid "Russia inside restrictions" msgid "Russia inside restrictions"
msgstr "Ограничения Russia inside" msgstr "Ограничения Russia inside"
msgid "Secret key for authenticating remote access to YACD when WAN access is enabled."
msgstr "Секретный ключ для аутентификации удаленного доступа к YACD при включенном доступе через WAN."
msgid "Sections" msgid "Sections"
msgstr "Секции" msgstr "Секции"
@@ -560,8 +581,8 @@ msgstr "Процесс sing-box запущен"
msgid "Sing-box service exist" msgid "Sing-box service exist"
msgstr "Сервис sing-box существует" msgstr "Сервис sing-box существует"
msgid "Sing-box version >= 1.12.4" msgid "Sing-box version is compatible (newer than 1.12.4)"
msgstr "Версия sing-box >= 1.12.4" msgstr "Версия Sing-box совместима (новее 1.12.4)"
msgid "Source Network Interface" msgid "Source Network Interface"
msgstr "Сетевой интерфейс источника" msgstr "Сетевой интерфейс источника"
@@ -611,6 +632,15 @@ msgstr "Текстовый список (через запятую, пробел
msgid "The DNS server used to look up the IP address of an upstream DNS server" msgid "The DNS server used to look up the IP address of an upstream DNS server"
msgstr "DNS-сервер, используемый для поиска IP-адреса вышестоящего DNS-сервера" msgstr "DNS-сервер, используемый для поиска IP-адреса вышестоящего DNS-сервера"
msgid "The interval between connectivity tests"
msgstr "Интервал между тестами подключения"
msgid "The maximum difference in response times (ms) allowed when comparing servers"
msgstr "Максимально допустимая разница во времени отклика (мс) при сравнении серверов"
msgid "The URL used to test server connectivity"
msgstr "URL-адрес, используемый для проверки подключения к серверу"
msgid "Time in seconds for DNS record caching (default: 60)" msgid "Time in seconds for DNS record caching (default: 60)"
msgstr "Время в секундах для кэширования DNS записей (по умолчанию: 60)" msgstr "Время в секундах для кэширования DNS записей (по умолчанию: 60)"
@@ -653,9 +683,18 @@ msgstr "URL должен использовать один из следующи
msgid "URLTest" msgid "URLTest"
msgstr "URLTest" msgstr "URLTest"
msgid "URLTest Check Interval"
msgstr "Интервал проверки URLTest"
msgid "URLTest Proxy Links" msgid "URLTest Proxy Links"
msgstr "Ссылки прокси для URLTest" msgstr "Ссылки прокси для URLTest"
msgid "URLTest Testing URL"
msgstr "URLTest ссылка для проверки"
msgid "URLTest Tolerance"
msgstr "URLTest допустимое отклонение"
msgid "User Domain List Type" msgid "User Domain List Type"
msgstr "Тип пользовательского списка доменов" msgstr "Тип пользовательского списка доменов"
@@ -692,5 +731,8 @@ msgstr "Предупреждение: %s нельзя использовать
msgid "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection." msgid "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection."
msgstr "Предупреждение: Russia inside может быть использован только с %s. %s уже есть в Russia inside и будет удален из выбранных." msgstr "Предупреждение: Russia inside может быть использован только с %s. %s уже есть в Russia inside и будет удален из выбранных."
msgid "YACD Secret Key"
msgstr "Секретный ключ YACD"
msgid "You can select Output Network Interface, by default autodetect" msgid "You can select Output Network Interface, by default autodetect"
msgstr "Вы можете выбрать выходной сетевой интерфейс, по умолчанию он определяется автоматически." msgstr "Вы можете выбрать выходной сетевой интерфейс, по умолчанию он определяется автоматически."

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PODKOP\n" "Project-Id-Version: PODKOP\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-23 17:43+0300\n" "POT-Creation-Date: 2025-11-06 14:19+0200\n"
"PO-Revision-Date: 2025-10-23 17:43+0300\n" "PO-Revision-Date: 2025-11-06 14:19+0200\n"
"Last-Translator: divocat <divocatt@gmail.com>\n" "Last-Translator: divocat <divocatt@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n" "Language: \n"
@@ -40,15 +40,19 @@ msgstr ""
msgid "Additional marking rules found" msgid "Additional marking rules found"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:247
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
msgid "Applicable for SOCKS and Shadowsocks proxy" msgid "Applicable for SOCKS and Shadowsocks proxy"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:356 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:420
msgid "At least one valid domain must be specified. Comments-only content is not allowed." msgid "At least one valid domain must be specified. Comments-only content is not allowed."
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:437 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:501
msgid "At least one valid subnet or IP must be specified. Comments-only content is not allowed." msgid "At least one valid subnet or IP must be specified. Comments-only content is not allowed."
msgstr "" msgstr ""
@@ -72,16 +76,17 @@ msgstr ""
msgid "Browser is using FakeIP correctly" msgid "Browser is using FakeIP correctly"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:329 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:348
msgid "Cache File Path" msgid "Cache File Path"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:343 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:362
msgid "Cache file path cannot be empty" msgid "Cache file path cannot be empty"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:27 #: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:27
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:28 #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:28
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:27
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:25 #: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:25
msgid "Cannot receive checks result" msgid "Cannot receive checks result"
msgstr "" msgstr ""
@@ -89,6 +94,7 @@ msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:15 #: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:15
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:15 #: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:15
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:13 #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:13
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:15
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:13 #: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:13
msgid "Checking, please wait" msgid "Checking, please wait"
msgstr "" msgstr ""
@@ -113,11 +119,11 @@ msgstr ""
msgid "Close" msgid "Close"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:211 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:275
msgid "Community Lists" msgid "Community Lists"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:316 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:335
msgid "Config File Path" msgid "Config File Path"
msgstr "" msgstr ""
@@ -173,16 +179,16 @@ msgstr ""
msgid "Disable autostart" msgid "Disable autostart"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:246 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:265
msgid "Disable QUIC" msgid "Disable QUIC"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:247 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:266
msgid "Disable the QUIC protocol to improve compatibility or fix issues with video streaming" msgid "Disable the QUIC protocol to improve compatibility or fix issues with video streaming"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:302 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:366
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:382 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:446
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr ""
@@ -190,17 +196,17 @@ msgstr ""
msgid "DNS on router" msgid "DNS on router"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:179 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:243
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:15 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:15
msgid "DNS over HTTPS (DoH)" msgid "DNS over HTTPS (DoH)"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:180 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:244
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:16 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:16
msgid "DNS over TLS (DoT)" msgid "DNS over TLS (DoT)"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:176 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:240
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:12 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:12
msgid "DNS Protocol Type" msgid "DNS Protocol Type"
msgstr "" msgstr ""
@@ -209,7 +215,7 @@ msgstr ""
msgid "DNS Rewrite TTL" msgid "DNS Rewrite TTL"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:189 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:253
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:24 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:24
msgid "DNS Server" msgid "DNS Server"
msgstr "" msgstr ""
@@ -222,11 +228,11 @@ msgstr ""
msgid "Do not panic, everything can be fixed, just..." msgid "Do not panic, everything can be fixed, just..."
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:166 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:230
msgid "Domain Resolver" msgid "Domain Resolver"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:307 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:326
msgid "Dont Touch My DHCP!" msgid "Dont Touch My DHCP!"
msgstr "" msgstr ""
@@ -239,24 +245,21 @@ msgstr ""
msgid "Download" msgid "Download"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:269 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:288
msgid "Download Lists via Proxy/VPN" msgid "Download Lists via Proxy/VPN"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:278 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:297
msgid "Download Lists via specific proxy section" msgid "Download Lists via specific proxy section"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:270 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:289
msgid "Downloading all lists via main Proxy/VPN" #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:298
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:279
msgid "Downloading all lists via specific Proxy/VPN" msgid "Downloading all lists via specific Proxy/VPN"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:303 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:367
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:383 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:447
msgid "Dynamic List" msgid "Dynamic List"
msgstr "" msgstr ""
@@ -264,11 +267,11 @@ msgstr ""
msgid "Enable autostart" msgid "Enable autostart"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:167 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:231
msgid "Enable built-in DNS resolver for domains handled by this section" msgid "Enable built-in DNS resolver for domains handled by this section"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:575 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:639
msgid "Enable Mixed Proxy" msgid "Enable Mixed Proxy"
msgstr "" msgstr ""
@@ -276,7 +279,7 @@ msgstr ""
msgid "Enable Output Network Interface" msgid "Enable Output Network Interface"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:576 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:640
msgid "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies" msgid "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies"
msgstr "" msgstr ""
@@ -284,27 +287,47 @@ msgstr ""
msgid "Enable YACD" msgid "Enable YACD"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:246
msgid "Enable YACD WAN Access"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:65 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:65
msgid "Enter complete outbound configuration in JSON format" msgid "Enter complete outbound configuration in JSON format"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:338 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:402
msgid "Enter domain names separated by commas, spaces, or newlines. You can add comments using //" msgid "Enter domain names separated by commas, spaces, or newlines. You can add comments using //"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:312 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:376
msgid "Enter domain names without protocols, e.g. example.com or sub.example.com" msgid "Enter domain names without protocols, e.g. example.com or sub.example.com"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:392 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:456
msgid "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses" msgid "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:365 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:114
msgid "Every 1 minute"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:115
msgid "Every 3 minutes"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:113
msgid "Every 30 seconds"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:116
msgid "Every 5 minutes"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:384
msgid "Exclude NTP" msgid "Exclude NTP"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:366 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:385
msgid "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN" msgid "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN"
msgstr "" msgstr ""
@@ -312,20 +335,21 @@ msgstr ""
msgid "Failed to copy!" msgid "Failed to copy!"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:226 #: src/podkop/tabs/diagnostic/initController.ts:227
#: src/podkop/tabs/diagnostic/initController.ts:230 #: src/podkop/tabs/diagnostic/initController.ts:231
#: src/podkop/tabs/diagnostic/initController.ts:260 #: src/podkop/tabs/diagnostic/initController.ts:261
#: src/podkop/tabs/diagnostic/initController.ts:264 #: src/podkop/tabs/diagnostic/initController.ts:265
#: src/podkop/tabs/diagnostic/initController.ts:298 #: src/podkop/tabs/diagnostic/initController.ts:299
#: src/podkop/tabs/diagnostic/initController.ts:302 #: src/podkop/tabs/diagnostic/initController.ts:303
msgid "Failed to execute!" msgid "Failed to execute!"
msgstr "" msgstr ""
#: src/podkop/methods/custom/getDashboardSections.ts:117 #: src/podkop/methods/custom/getDashboardSections.ts:117
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:59
msgid "Fastest" msgid "Fastest"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:550 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:614
msgid "Fully Routed IPs" msgid "Fully Routed IPs"
msgstr "" msgstr ""
@@ -333,7 +357,7 @@ msgstr ""
msgid "Get global check" msgid "Get global check"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:221 #: src/podkop/tabs/diagnostic/initController.ts:222
msgid "Global check" msgid "Global check"
msgstr "" msgstr ""
@@ -370,7 +394,7 @@ msgstr ""
msgid "Invalid IP address" msgid "Invalid IP address"
msgstr "" msgstr ""
#: src/validators/validateOutboundJson.ts:19 #: src/validators/validateOutboundJson.ts:9
msgid "Invalid JSON format" msgid "Invalid JSON format"
msgstr "" msgstr ""
@@ -466,7 +490,8 @@ msgstr ""
msgid "Invalid Trojan URL: parsing failed" msgid "Invalid Trojan URL: parsing failed"
msgstr "" msgstr ""
#: src/validators/validateUrl.ts:18 #: src/validators/validateUrl.ts:8
#: src/validators/validateUrl.ts:31
msgid "Invalid URL format" msgid "Invalid URL format"
msgstr "" msgstr ""
@@ -482,19 +507,19 @@ msgstr ""
msgid "Issues detected" msgid "Issues detected"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:452 #: src/podkop/tabs/diagnostic/initController.ts:453
msgid "Latest" msgid "Latest"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:257 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:276
msgid "List Update Frequency" msgid "List Update Frequency"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:458 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:522
msgid "Local Domain Lists" msgid "Local Domain Lists"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:481 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:545
msgid "Local Subnet Lists" msgid "Local Subnet Lists"
msgstr "" msgstr ""
@@ -506,7 +531,7 @@ msgstr ""
msgid "Memory Usage" msgid "Memory Usage"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:586 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:650
msgid "Mixed Proxy Port" msgid "Mixed Proxy Port"
msgstr "" msgstr ""
@@ -514,7 +539,11 @@ msgstr ""
msgid "Monitored Interfaces" msgid "Monitored Interfaces"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:120 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:140
msgid "Must be a number in the range of 50 - 1000"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:184
msgid "Network Interface" msgid "Network Interface"
msgstr "" msgstr ""
@@ -526,10 +555,17 @@ msgstr ""
msgid "Not implement yet" msgid "Not implement yet"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:75
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:81
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:100
msgid "Not responding"
msgstr ""
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:55 #: src/podkop/tabs/diagnostic/diagnostic.store.ts:55
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:63 #: src/podkop/tabs/diagnostic/diagnostic.store.ts:63
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:71 #: src/podkop/tabs/diagnostic/diagnostic.store.ts:71
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:79 #: src/podkop/tabs/diagnostic/diagnostic.store.ts:79
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:87
msgid "Not running" msgid "Not running"
msgstr "" msgstr ""
@@ -545,11 +581,7 @@ msgstr ""
msgid "Outbound Configuration" msgid "Outbound Configuration"
msgstr "" msgstr ""
#: src/validators/validateOutboundJson.ts:11 #: src/podkop/tabs/diagnostic/initController.ts:443
msgid "Outbound JSON must contain at least \"type\", \"server\" and \"server_port\" fields"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:442
msgid "Outdated" msgid "Outdated"
msgstr "" msgstr ""
@@ -561,22 +593,23 @@ msgstr ""
msgid "Path cannot be empty" msgid "Path cannot be empty"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:347 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:366
msgid "Path must be absolute (start with /)" msgid "Path must be absolute (start with /)"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:356 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:375
msgid "Path must contain at least one directory (like /tmp/cache.db)" msgid "Path must contain at least one directory (like /tmp/cache.db)"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:351 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:370
msgid "Path must end with cache.db" msgid "Path must end with cache.db"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:95
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:103 #: src/podkop/tabs/diagnostic/diagnostic.store.ts:103
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:111 #: src/podkop/tabs/diagnostic/diagnostic.store.ts:111
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:119 #: src/podkop/tabs/diagnostic/diagnostic.store.ts:119
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:127
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:135
msgid "Pending" msgid "Pending"
msgstr "" msgstr ""
@@ -588,7 +621,7 @@ msgstr ""
msgid "Podkop Settings" msgid "Podkop Settings"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:308 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:327
msgid "Podkop will not modify your DHCP configuration" msgid "Podkop will not modify your DHCP configuration"
msgstr "" msgstr ""
@@ -604,15 +637,15 @@ msgstr ""
msgid "Proxy traffic is routed via FakeIP" msgid "Proxy traffic is routed via FakeIP"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:245 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:309
msgid "Regional options cannot be used together" msgid "Regional options cannot be used together"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:504 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:568
msgid "Remote Domain Lists" msgid "Remote Domain Lists"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:527 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:591
msgid "Remote Subnet Lists" msgid "Remote Subnet Lists"
msgstr "" msgstr ""
@@ -628,7 +661,7 @@ msgstr ""
msgid "Router DNS is routed through sing-box" msgid "Router DNS is routed through sing-box"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:376 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:395
msgid "Routing Excluded IPs" msgid "Routing Excluded IPs"
msgstr "" msgstr ""
@@ -660,15 +693,19 @@ msgstr ""
msgid "Run Diagnostic" msgid "Run Diagnostic"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:264 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:328
msgid "Russia inside restrictions" msgid "Russia inside restrictions"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:257
msgid "Secret key for authenticating remote access to YACD when WAN access is enabled."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js:36 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js:36
msgid "Sections" msgid "Sections"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:212 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:276
msgid "Select a predefined list for routing" msgid "Select a predefined list for routing"
msgstr "" msgstr ""
@@ -680,7 +717,7 @@ msgstr ""
msgid "Select DNS protocol to use" msgid "Select DNS protocol to use"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:258 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:277
msgid "Select how often the domain or subnet lists are updated automatically" msgid "Select how often the domain or subnet lists are updated automatically"
msgstr "" msgstr ""
@@ -688,32 +725,32 @@ msgstr ""
msgid "Select how to configure the proxy" msgid "Select how to configure the proxy"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:121 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:185
msgid "Select network interface for VPN connection" msgid "Select network interface for VPN connection"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:190 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:254
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:25 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:25
msgid "Select or enter DNS server address" msgid "Select or enter DNS server address"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:330 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:349
msgid "Select or enter path for sing-box cache file. Change this ONLY if you know what you are doing" msgid "Select or enter path for sing-box cache file. Change this ONLY if you know what you are doing"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:317 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:336
msgid "Select path for sing-box config file. Change this ONLY if you know what you are doing" msgid "Select path for sing-box config file. Change this ONLY if you know what you are doing"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:177 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:241
msgid "Select the DNS protocol type for the domain resolver" msgid "Select the DNS protocol type for the domain resolver"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:300 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:364
msgid "Select the list type for adding custom domains" msgid "Select the list type for adding custom domains"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:380 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:444
msgid "Select the list type for adding custom subnets" msgid "Select the list type for adding custom subnets"
msgstr "" msgstr ""
@@ -737,7 +774,7 @@ msgstr ""
msgid "Settings" msgid "Settings"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:289 #: src/podkop/tabs/diagnostic/initController.ts:290
#: src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:116 #: src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:116
msgid "Show sing-box config" msgid "Show sing-box config"
msgstr "" msgstr ""
@@ -767,31 +804,31 @@ msgid "Sing-box service exist"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:67 #: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:67
msgid "Sing-box version >= 1.12.4" msgid "Sing-box version is compatible (newer than 1.12.4)"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:89 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:89
msgid "Source Network Interface" msgid "Source Network Interface"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:377 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:396
msgid "Specify a local IP address to be excluded from routing" msgid "Specify a local IP address to be excluded from routing"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:551 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:615
msgid "Specify local IP addresses or subnets whose traffic will always be routed through the configured route" msgid "Specify local IP addresses or subnets whose traffic will always be routed through the configured route"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:505 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:569
msgid "Specify remote URLs to download and use domain lists" msgid "Specify remote URLs to download and use domain lists"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:528 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592
msgid "Specify remote URLs to download and use subnet lists" msgid "Specify remote URLs to download and use subnet lists"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:459 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:523
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:482 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:546
msgid "Specify the path to the list file located on the router filesystem" msgid "Specify the path to the list file located on the router filesystem"
msgstr "" msgstr ""
@@ -823,11 +860,11 @@ msgstr ""
msgid "Test latency" msgid "Test latency"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:304 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:368
msgid "Text List" msgid "Text List"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:384 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:448
msgid "Text List (comma/space/newline separated)" msgid "Text List (comma/space/newline separated)"
msgstr "" msgstr ""
@@ -835,6 +872,18 @@ msgstr ""
msgid "The DNS server used to look up the IP address of an upstream DNS server" msgid "The DNS server used to look up the IP address of an upstream DNS server"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111
msgid "The interval between connectivity tests"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:124
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
msgid "The URL used to test server connectivity"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:69 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:69
msgid "Time in seconds for DNS record caching (default: 60)" msgid "Time in seconds for DNS record caching (default: 60)"
msgstr "" msgstr ""
@@ -859,22 +908,22 @@ msgstr ""
msgid "TTL value cannot be empty" msgid "TTL value cannot be empty"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:181 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:245
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:17 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:17
msgid "UDP (Unprotected DNS)" msgid "UDP (Unprotected DNS)"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:174
msgid "UDP over TCP" msgid "UDP over TCP"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:37
#: src/podkop/tabs/diagnostic/initController.ts:38 #: src/podkop/tabs/diagnostic/initController.ts:38
#: src/podkop/tabs/diagnostic/initController.ts:39 #: src/podkop/tabs/diagnostic/initController.ts:39
#: src/podkop/tabs/diagnostic/initController.ts:40 #: src/podkop/tabs/diagnostic/initController.ts:40
#: src/podkop/tabs/diagnostic/initController.ts:41 #: src/podkop/tabs/diagnostic/initController.ts:41
#: src/podkop/tabs/diagnostic/initController.ts:42 #: src/podkop/tabs/diagnostic/initController.ts:42
#: src/podkop/tabs/diagnostic/initController.ts:416 #: src/podkop/tabs/diagnostic/initController.ts:43
#: src/podkop/tabs/diagnostic/initController.ts:417
msgid "unknown" msgid "unknown"
msgstr "" msgstr ""
@@ -891,7 +940,7 @@ msgstr ""
msgid "URL must start with vless://, ss://, trojan://, or socks4/5://" msgid "URL must start with vless://, ss://, trojan://, or socks4/5://"
msgstr "" msgstr ""
#: src/validators/validateUrl.ts:13 #: src/validators/validateUrl.ts:17
msgid "URL must use one of the following protocols:" msgid "URL must use one of the following protocols:"
msgstr "" msgstr ""
@@ -899,31 +948,43 @@ msgstr ""
msgid "URLTest" msgid "URLTest"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110
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:87
msgid "URLTest Proxy Links" msgid "URLTest Proxy Links"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:299 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:146
msgid "URLTest Testing URL"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:123
msgid "URLTest Tolerance"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:363
msgid "User Domain List Type" msgid "User Domain List Type"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:311 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:375
msgid "User Domains" msgid "User Domains"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:337 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:401
msgid "User Domains List" msgid "User Domains List"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:379 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:443
msgid "User Subnet List Type" msgid "User Subnet List Type"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:391 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:455
msgid "User Subnets" msgid "User Subnets"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:417 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:481
msgid "User Subnets List" msgid "User Subnets List"
msgstr "" msgstr ""
@@ -932,23 +993,23 @@ msgstr ""
#: src/validators/validateDomain.ts:13 #: src/validators/validateDomain.ts:13
#: src/validators/validateDomain.ts:30 #: src/validators/validateDomain.ts:30
#: src/validators/validateIp.ts:8 #: src/validators/validateIp.ts:8
#: src/validators/validateOutboundJson.ts:17 #: src/validators/validateOutboundJson.ts:7
#: src/validators/validatePath.ts:16 #: src/validators/validatePath.ts:16
#: src/validators/validateShadowsocksUrl.ts:95 #: src/validators/validateShadowsocksUrl.ts:95
#: src/validators/validateSocksUrl.ts:80 #: src/validators/validateSocksUrl.ts:80
#: src/validators/validateSubnet.ts:38 #: src/validators/validateSubnet.ts:38
#: src/validators/validateTrojanUrl.ts:59 #: src/validators/validateTrojanUrl.ts:59
#: src/validators/validateUrl.ts:16 #: src/validators/validateUrl.ts:28
#: src/validators/validateVlessUrl.ts:108 #: src/validators/validateVlessUrl.ts:108
msgid "Valid" msgid "Valid"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:370 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:434
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:449 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:513
msgid "Validation errors:" msgid "Validation errors:"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:255 #: src/podkop/tabs/diagnostic/initController.ts:256
#: src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:107 #: src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:107
msgid "View logs" msgid "View logs"
msgstr "" msgstr ""
@@ -957,14 +1018,18 @@ msgstr ""
msgid "Visit Wiki" msgid "Visit Wiki"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:247 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:311
msgid "Warning: %s cannot be used together with %s. Previous selections have been removed." msgid "Warning: %s cannot be used together with %s. Previous selections have been removed."
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:266 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:330
msgid "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection." msgid "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection."
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:256
msgid "YACD Secret Key"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:127 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:127
msgid "You can select Output Network Interface, by default autodetect" msgid "You can select Output Network Interface, by default autodetect"
msgstr "" msgstr ""

View File

@@ -627,9 +627,12 @@ configure_outbound_handler() {
urltest) urltest)
log "Detected proxy configuration type: urltest" "debug" log "Detected proxy configuration type: urltest" "debug"
local urltest_proxy_links udp_over_tcp i urltest_tag selector_tag outbound_tag outbound_tags \ local urltest_proxy_links udp_over_tcp i urltest_tag selector_tag outbound_tag outbound_tags \
urltest_outbounds selector_outbounds urltest_outbounds selector_outbounds urltest_check_interval urltest_tolerance urltest_testing_url
config_get urltest_proxy_links "$section" "urltest_proxy_links" config_get urltest_proxy_links "$section" "urltest_proxy_links"
config_get udp_over_tcp "$section" "enable_udp_over_tcp" config_get udp_over_tcp "$section" "enable_udp_over_tcp"
config_get urltest_check_interval "$section" "urltest_check_interval" "3m"
config_get urltest_tolerance "$section" "urltest_tolerance" 50
config_get urltest_testing_url "$section" "urltest_testing_url" "https://www.gstatic.com/generate_204"
if [ -z "$urltest_proxy_links" ]; then if [ -z "$urltest_proxy_links" ]; then
log "URLTest proxy links is not set. Aborted." "fatal" log "URLTest proxy links is not set. Aborted." "fatal"
@@ -652,7 +655,8 @@ configure_outbound_handler() {
selector_tag="$(get_outbound_tag_by_section "$section")" selector_tag="$(get_outbound_tag_by_section "$section")"
urltest_outbounds="$(comma_string_to_json_array "$outbound_tags")" urltest_outbounds="$(comma_string_to_json_array "$outbound_tags")"
selector_outbounds="$(comma_string_to_json_array "$outbound_tags,$urltest_tag")" selector_outbounds="$(comma_string_to_json_array "$outbound_tags,$urltest_tag")"
config="$(sing_box_cm_add_urltest_outbound "$config" "$urltest_tag" "$urltest_outbounds")" config="$(sing_box_cm_add_urltest_outbound "$config" "$urltest_tag" "$urltest_outbounds" \
"$urltest_testing_url" "$urltest_check_interval" "$urltest_tolerance")"
config="$(sing_box_cm_add_selector_outbound "$config" "$selector_tag" "$selector_outbounds" "$urltest_tag")" config="$(sing_box_cm_add_selector_outbound "$config" "$selector_tag" "$selector_outbounds" "$urltest_tag")"
;; ;;
*) *)
@@ -767,7 +771,7 @@ sing_box_configure_route() {
configure_common_reject_route_rule configure_common_reject_route_rule
local routing_excluded_ips local routing_excluded_ips
config_get_bool routing_excluded_ips "settings" "routing_excluded_ips" config_get routing_excluded_ips "settings" "routing_excluded_ips"
if [ -n "$routing_excluded_ips" ]; then if [ -n "$routing_excluded_ips" ]; then
rule_tag="$(gen_id)" rule_tag="$(gen_id)"
config=$(sing_box_cm_add_route_rule "$config" "$rule_tag" "$SB_TPROXY_INBOUND_TAG" "$SB_DIRECT_OUTBOUND_TAG") config=$(sing_box_cm_add_route_rule "$config" "$rule_tag" "$SB_TPROXY_INBOUND_TAG" "$SB_DIRECT_OUTBOUND_TAG")
@@ -1028,7 +1032,7 @@ import_local_domain_or_subnet_list() {
domains) sing_box_cm_patch_local_source_ruleset_rules "$ruleset_filepath" "domain_suffix" "$json_array" ;; domains) sing_box_cm_patch_local_source_ruleset_rules "$ruleset_filepath" "domain_suffix" "$json_array" ;;
subnets) subnets)
sing_box_cm_patch_local_source_ruleset_rules "$ruleset_filepath" "ip_cidr" "$json_array" sing_box_cm_patch_local_source_ruleset_rules "$ruleset_filepath" "ip_cidr" "$json_array"
nft_add_set_elements "$NFT_TABLE_NAME" "$NFT_COMMON_SET_NAME" "$items" nft_add_set_elements_from_file_chunked "$filepath" "$NFT_TABLE_NAME" "$NFT_COMMON_SET_NAME"
;; ;;
esac esac
} }
@@ -1075,16 +1079,39 @@ sing_box_configure_experimental() {
config_get cache_file "settings" "cache_path" "/tmp/sing-box/cache.db" config_get cache_file "settings" "cache_path" "/tmp/sing-box/cache.db"
config=$(sing_box_cm_configure_cache_file "$config" true "$cache_file" true) config=$(sing_box_cm_configure_cache_file "$config" true "$cache_file" true)
local enable_yacd external_controller_ui
config_get_bool enable_yacd "settings" "enable_yacd" 0
log "Configuring Clash API" log "Configuring Clash API"
local enable_yacd enable_yacd_wan_access clash_api_controller_address
config_get_bool enable_yacd "settings" "enable_yacd" 0
config_get_bool enable_yacd_wan_access "settings" "enable_yacd_wan_access" 0
if [ "$enable_yacd" -eq 1 ] && [ "$enable_yacd_wan_access" -eq 1 ]; then
clash_api_controller_address="0.0.0.0"
else
clash_api_controller_address="$(get_service_listen_address)"
if [ -z "$clash_api_controller_address" ]; then
log "Could not determine the listening IP address for the Clash API controller. It will run only on localhost." "warn"
clash_api_controller_address="127.0.0.1"
fi
fi
if [ "$enable_yacd" -eq 1 ]; then if [ "$enable_yacd" -eq 1 ]; then
log "YACD is enabled, enabling Clash API with downloadable YACD" "debug" log "YACD is enabled, enabling Clash API with downloadable YACD" "debug"
local external_controller_ui="ui" local yacd_secret_key external_controller_ui
config=$(sing_box_cm_configure_clash_api "$config" "$SB_CLASH_API_CONTROLLER" "$external_controller_ui") config_get yacd_secret_key "settings" "yacd_secret_key"
external_controller_ui="ui"
config=$(
sing_box_cm_configure_clash_api \
"$config" \
"$clash_api_controller_address:$SB_CLASH_API_CONTROLLER_PORT" \
"$external_controller_ui" \
"$yacd_secret_key"
)
else else
log "YACD is disabled, enabling Clash API in online mode" "debug" log "YACD is disabled, enabling Clash API in online mode" "debug"
config=$(sing_box_cm_configure_clash_api "$config" "$SB_CLASH_API_CONTROLLER") config=$(
sing_box_cm_configure_clash_api "$config" "$clash_api_controller_address:$SB_CLASH_API_CONTROLLER_PORT"
)
fi fi
} }
@@ -1113,8 +1140,13 @@ sing_box_additional_inbounds() {
configure_section_mixed_proxy() { configure_section_mixed_proxy() {
local section="$1" local section="$1"
local mixed_inbound_enabled mixed_proxy_port mixed_inbound_tag mixed_outbound_tag local mixed_inbound_enabled mixed_proxy_port mixed_inbound_tag mixed_outbound_tag mixed_proxy_address
config_get_bool mixed_inbound_enabled "$section" "mixed_proxy_enabled" 0 config_get_bool mixed_inbound_enabled "$section" "mixed_proxy_enabled" 0
mixed_proxy_address="$(get_service_listen_address)"
if [ -z "$mixed_proxy_address" ]; then
log "Could not determine the listening IP address for the Mixed Proxy. The proxy will not be created." "warn"
return 1
fi
config_get mixed_proxy_port "$section" "mixed_proxy_port" config_get mixed_proxy_port "$section" "mixed_proxy_port"
if [ "$mixed_inbound_enabled" -eq 1 ]; then if [ "$mixed_inbound_enabled" -eq 1 ]; then
mixed_inbound_tag="$(get_inbound_tag_by_section "$section-mixed")" mixed_inbound_tag="$(get_inbound_tag_by_section "$section-mixed")"
@@ -1123,7 +1155,7 @@ configure_section_mixed_proxy() {
sing_box_cf_add_mixed_inbound_and_route_rule \ sing_box_cf_add_mixed_inbound_and_route_rule \
"$config" \ "$config" \
"$mixed_inbound_tag" \ "$mixed_inbound_tag" \
"$SB_MIXED_INBOUND_ADDRESS" \ "$mixed_proxy_address" \
"$mixed_proxy_port" \ "$mixed_proxy_port" \
"$mixed_outbound_tag" "$mixed_outbound_tag"
) )
@@ -1209,7 +1241,7 @@ import_community_service_subnet_list_handler() {
*) return 0 ;; *) return 0 ;;
esac esac
local tmpfile http_proxy_address subnets local tmpfile http_proxy_address
tmpfile=$(mktemp) tmpfile=$(mktemp)
http_proxy_address="$(get_service_proxy_address)" http_proxy_address="$(get_service_proxy_address)"
@@ -1220,14 +1252,13 @@ import_community_service_subnet_list_handler() {
return 1 return 1
fi fi
subnets="$(parse_domain_or_subnet_file_to_comma_string "$tmpfile" "subnets")"
rm -f "$tmpfile"
if [ "$service" = "discord" ]; then if [ "$service" = "discord" ]; then
nft_add_set_elements "$NFT_TABLE_NAME" "$NFT_DISCORD_SET_NAME" "$subnets" nft_add_set_elements_from_file_chunked "$tmpfile" "$NFT_TABLE_NAME" "$NFT_DISCORD_SET_NAME"
else else
nft_add_set_elements "$NFT_TABLE_NAME" "$NFT_COMMON_SET_NAME" "$subnets" nft_add_set_elements_from_file_chunked "$tmpfile" "$NFT_TABLE_NAME" "$NFT_COMMON_SET_NAME"
fi fi
rm -f "$tmpfile"
} }
import_domains_from_remote_domain_lists() { import_domains_from_remote_domain_lists() {
@@ -1309,8 +1340,8 @@ import_domains_or_subnets_from_remote_file() {
return 1 return 1
fi fi
convert_crlf_to_lf "$tmpfile"
items="$(parse_domain_or_subnet_file_to_comma_string "$tmpfile" "$type")" items="$(parse_domain_or_subnet_file_to_comma_string "$tmpfile" "$type")"
rm -f "$tmpfile"
if [ -z "$items" ]; then if [ -z "$items" ]; then
log "No valid $type found in $url" "warn" log "No valid $type found in $url" "warn"
@@ -1325,33 +1356,36 @@ import_domains_or_subnets_from_remote_file() {
domains) sing_box_cm_patch_local_source_ruleset_rules "$ruleset_filepath" "domain_suffix" "$json_array" ;; domains) sing_box_cm_patch_local_source_ruleset_rules "$ruleset_filepath" "domain_suffix" "$json_array" ;;
subnets) subnets)
sing_box_cm_patch_local_source_ruleset_rules "$ruleset_filepath" "ip_cidr" "$json_array" sing_box_cm_patch_local_source_ruleset_rules "$ruleset_filepath" "ip_cidr" "$json_array"
nft_add_set_elements "$NFT_TABLE_NAME" "$NFT_COMMON_SET_NAME" "$items" nft_add_set_elements_from_file_chunked "$tmpfile" "$NFT_TABLE_NAME" "$NFT_COMMON_SET_NAME"
;; ;;
esac esac
rm -f "$tmpfile"
} }
import_subnets_from_remote_json_file() { import_subnets_from_remote_json_file() {
local url="$1" local url="$1"
local tmpfile subnets http_proxy_address local json_tmpfile subnets_tmpfile http_proxy_address
tmpfile="$(mktemp)" json_tmpfile="$(mktemp)"
subnets_tmpfile="$(mktemp)"
http_proxy_address="$(get_service_proxy_address)" http_proxy_address="$(get_service_proxy_address)"
download_to_stream "$url" "$http_proxy_address" | jq -r '.rules[].ip_cidr[]?' > "$tmpfile" download_to_file "$url" "$json_tmpfile" "$http_proxy_address"
if [ $? -ne 0 ] || [ ! -s "$tmpfile" ]; then if [ $? -ne 0 ] || [ ! -s "$json_tmpfile" ]; then
log "Download $url list failed" "error" log "Download $url list failed" "error"
return 1 return 1
fi fi
subnets="$(parse_domain_or_subnet_file_to_comma_string "$tmpfile" "subnets")" extract_ip_cidr_from_json_ruleset_to_file "$json_tmpfile" "$subnets_tmpfile"
rm -f "$tmpfile" nft_add_set_elements_from_file_chunked "$subnets_tmpfile" "$NFT_TABLE_NAME" "$NFT_COMMON_SET_NAME"
nft_add_set_elements "$NFT_TABLE_NAME" "$NFT_COMMON_SET_NAME" "$subnets" rm -f "$json_tmpfile" "$subnets_tmpfile"
} }
import_subnets_from_remote_srs_file() { import_subnets_from_remote_srs_file() {
local url="$1" local url="$1"
local binary_tmpfile json_tmpfile subnets_tmpfile subnets http_proxy_address local binary_tmpfile json_tmpfile subnets_tmpfile http_proxy_address
binary_tmpfile="$(mktemp)" binary_tmpfile="$(mktemp)"
json_tmpfile="$(mktemp)" json_tmpfile="$(mktemp)"
subnets_tmpfile="$(mktemp)" subnets_tmpfile="$(mktemp)"
@@ -1369,10 +1403,9 @@ import_subnets_from_remote_srs_file() {
return 1 return 1
fi fi
jq -r '.rules[].ip_cidr[]' "$json_tmpfile" > "$subnets_tmpfile" extract_ip_cidr_from_json_ruleset_to_file "$json_tmpfile" "$subnets_tmpfile"
subnets="$(parse_domain_or_subnet_file_to_comma_string "$subnets_tmpfile" "subnets")" nft_add_set_elements_from_file_chunked "$subnets_tmpfile" "$NFT_TABLE_NAME" "$NFT_COMMON_SET_NAME"
rm -f "$binary_tmpfile" "$json_tmpfile" "$subnets_tmpfile" rm -f "$binary_tmpfile" "$json_tmpfile" "$subnets_tmpfile"
nft_add_set_elements "$NFT_TABLE_NAME" "$NFT_COMMON_SET_NAME" "$subnets"
} }
## Support functions ## Support functions
@@ -1455,6 +1488,23 @@ section_has_enabled_lists() {
fi fi
} }
get_service_listen_address() {
local service_listen_address
service_listen_address="$(uci_get "network" "lan" "ipaddr")"
if [ -z "$service_listen_address" ]; then
config_get service_listen_address "settings" "service_listen_address" # TODO(ampetelin): Remove after testing
fi
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"
return 1
fi
echo "$service_listen_address"
}
## nftables ## nftables
nft_list_all_traffic_from_ip() { nft_list_all_traffic_from_ip() {
local ip="$1" local ip="$1"
@@ -1466,6 +1516,46 @@ nft_list_all_traffic_from_ip() {
fi fi
} }
nft_add_set_elements_from_file_chunked() {
local filepath="$1"
local nft_table_name="$2"
local nft_set_name="$3"
local chunk_size="${4:-5000}"
local array count
count=0
while IFS= read -r line; do
line=$(echo "$line" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
[ -z "$line" ] && continue
if ! is_ipv4 "$line" && ! is_ipv4_cidr "$line"; then
log "'$line' is not IPv4 or IPv4 CIDR" "debug"
continue
fi
if [ -z "$array" ]; then
array="$line"
else
array="$array,$line"
fi
count=$((count + 1))
if [ "$count" = "$chunk_size" ]; then
log "Adding $count elements to nft set $nft_set_name" "debug"
nft_add_set_elements "$nft_table_name" "$nft_set_name" "$array"
array=""
count=0
fi
done < "$filepath"
if [ -n "$array" ]; then
log "Adding $count elements to nft set $nft_set_name" "debug"
nft_add_set_elements "$nft_table_name" "$nft_set_name" "$array"
fi
}
# Diagnotics # Diagnotics
check_proxy() { check_proxy() {
local sing_box_config_path local sing_box_config_path
@@ -1626,7 +1716,7 @@ check_logs() {
nolog "Logs not found" nolog "Logs not found"
return 1 return 1
fi fi
ы
# Find the last occurrence of "Starting podkop" # Find the last occurrence of "Starting podkop"
local start_line local start_line
start_line=$(echo "$logs" | grep -n "podkop.*Starting podkop" | tail -n 1 | cut -d: -f1) start_line=$(echo "$logs" | grep -n "podkop.*Starting podkop" | tail -n 1 | cut -d: -f1)
@@ -1684,16 +1774,11 @@ show_config() {
tmp_config=$(mktemp) tmp_config=$(mktemp)
sed -e 's/\(option proxy_string\).*/\1 '\''MASKED'\''/g' \ sed -e 's/\(option proxy_string\).*/\1 '\''MASKED'\''/g' \
-e 's/\(option outbound_json\).*/\1 '\''MASKED'\''/g' \ -e '/option outbound_json/,/^}/c\ option outbound_json '\''MASKED'\''' \
-e 's/\(option second_proxy_string\).*/\1 '\''MASKED'\''/g' \
-e 's/\(option second_outbound_json\).*/\1 '\''MASKED'\''/g' \
-e 's/\(vless:\/\/[^@]*@\)/vless:\/\/MASKED@/g' \
-e 's/\(ss:\/\/[^@]*@\)/ss:\/\/MASKED@/g' \
-e 's/\(pbk=[^&]*\)/pbk=MASKED/g' \
-e 's/\(sid=[^&]*\)/sid=MASKED/g' \
-e 's/\(option dns_server '\''[^'\'']*\.dns\.nextdns\.io'\''\)/option dns_server '\''MASKED.dns.nextdns.io'\''/g' \
-e "s|\(option dns_server 'dns\.nextdns\.io\)/[^']*|\1/MASKED|" \
-e 's/\(list urltest_proxy_links\).*/\1 '\''MASKED'\''/g' \ -e 's/\(list urltest_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' \
"$PODKOP_CONFIG" > "$tmp_config" "$PODKOP_CONFIG" > "$tmp_config"
cat "$tmp_config" cat "$tmp_config"
@@ -2073,13 +2158,28 @@ check_fakeip() {
####################################### #######################################
clash_api() { clash_api() {
local CLASH_URL="127.0.0.1:9090"
local TEST_URL="https://www.gstatic.com/generate_204"
local action="$1" local action="$1"
local clash_api_controller_address CLASH_URL TEST_URL
clash_api_controller_address="$(get_service_listen_address)"
if [ -z "$clash_api_controller_address" ]; then
clash_api_controller_address="127.0.0.1"
fi
CLASH_URL="$clash_api_controller_address:$SB_CLASH_API_CONTROLLER_PORT"
TEST_URL="https://www.gstatic.com/generate_204"
local enable_yacd_wan_access yacd_secret_key auth_header
config_get_bool enable_yacd_wan_access "settings" "enable_yacd_wan_access" 0
config_get yacd_secret_key "settings" "yacd_secret_key"
if [ "$enable_yacd_wan_access" -eq 1 ]; then
auth_header="Authorization: Bearer $yacd_secret_key"
else
auth_header=""
fi
case "$action" in case "$action" in
get_proxies) get_proxies)
curl -s "$CLASH_URL/proxies" | jq . curl -s --header "$auth_header" "$CLASH_URL/proxies" | jq .
;; ;;
get_proxy_latency) get_proxy_latency)
@@ -2092,6 +2192,7 @@ clash_api() {
fi fi
curl -G -s "$CLASH_URL/proxies/$proxy_tag/delay" \ curl -G -s "$CLASH_URL/proxies/$proxy_tag/delay" \
--header "$auth_header" \
--data-urlencode "url=$TEST_URL" \ --data-urlencode "url=$TEST_URL" \
--data-urlencode "timeout=$timeout" | jq . --data-urlencode "timeout=$timeout" | jq .
;; ;;
@@ -2106,6 +2207,7 @@ clash_api() {
fi fi
curl -G -s "$CLASH_URL/group/$group_tag/delay" \ curl -G -s "$CLASH_URL/group/$group_tag/delay" \
--header "$auth_header" \
--data-urlencode "url=$TEST_URL" \ --data-urlencode "url=$TEST_URL" \
--data-urlencode "timeout=$timeout" | jq . --data-urlencode "timeout=$timeout" | jq .
;; ;;
@@ -2120,8 +2222,11 @@ clash_api() {
fi fi
local response local response
response=$(curl -X PUT -s -w "\n%{http_code}" "$CLASH_URL/proxies/$group_tag" \ response=$(
--data-raw "{\"name\":\"$proxy_tag\"}") curl -X PUT -s -w "\n%{http_code}" "$CLASH_URL/proxies/$group_tag" \
--header "$auth_header" \
--data-raw "{\"name\":\"$proxy_tag\"}"
)
local http_code local http_code
local body local body
@@ -2279,9 +2384,9 @@ global_check() {
fi fi
if [ "$sing_box_version_ok" -eq 1 ]; then if [ "$sing_box_version_ok" -eq 1 ]; then
print_global "✅ Sing-box version >= 1.12.4" print_global "✅ Sing-box version is compatible (newer than 1.12.4)"
else else
print_global "❌ Sing-box version >= 1.12.4" print_global "❌ Sing-box version is not compatible (older than 1.12.4)"
fi fi
if [ "$sing_box_service_exist" -eq 1 ]; then if [ "$sing_box_service_exist" -eq 1 ]; then

View File

@@ -38,7 +38,6 @@ SB_TPROXY_INBOUND_PORT=1602
SB_DNS_INBOUND_TAG="dns-in" SB_DNS_INBOUND_TAG="dns-in"
SB_DNS_INBOUND_ADDRESS="127.0.0.42" SB_DNS_INBOUND_ADDRESS="127.0.0.42"
SB_DNS_INBOUND_PORT=53 SB_DNS_INBOUND_PORT=53
SB_MIXED_INBOUND_ADDRESS="0.0.0.0" # TODO(ampetelin): maybe to determine address?
SB_SERVICE_MIXED_INBOUND_TAG="service-mixed-in" SB_SERVICE_MIXED_INBOUND_TAG="service-mixed-in"
SB_SERVICE_MIXED_INBOUND_ADDRESS="127.0.0.1" SB_SERVICE_MIXED_INBOUND_ADDRESS="127.0.0.1"
SB_SERVICE_MIXED_INBOUND_PORT=4534 SB_SERVICE_MIXED_INBOUND_PORT=4534
@@ -47,7 +46,7 @@ SB_DIRECT_OUTBOUND_TAG="direct-out"
# Route # Route
SB_REJECT_RULE_TAG="reject-rule-tag" SB_REJECT_RULE_TAG="reject-rule-tag"
# Experimental # Experimental
SB_CLASH_API_CONTROLLER="0.0.0.0:9090" SB_CLASH_API_CONTROLLER_PORT=9090
## Lists ## Lists
GITHUB_RAW_URL="https://raw.githubusercontent.com/itdoginfo/allow-domains/main" GITHUB_RAW_URL="https://raw.githubusercontent.com/itdoginfo/allow-domains/main"

View File

@@ -268,25 +268,6 @@ migration_rename_config_key() {
fi fi
} }
# Download URL content directly
download_to_stream() {
local url="$1"
local http_proxy_address="$2"
local retries="${3:-3}"
local wait="${4:-2}"
for attempt in $(seq 1 "$retries"); do
if [ -n "$http_proxy_address" ]; then
http_proxy="http://$http_proxy_address" https_proxy="http://$http_proxy_address" wget -qO- "$url" | sed 's/\r$//' && break
else
wget -qO- "$url" | sed 's/\r$//' && break
fi
log "Attempt $attempt/$retries to download $url failed" "warn"
sleep "$wait"
done
}
# Download URL to file # Download URL to file
download_to_file() { download_to_file() {
local url="$1" local url="$1"
@@ -305,10 +286,17 @@ download_to_file() {
log "Attempt $attempt/$retries to download $url failed" "warn" log "Attempt $attempt/$retries to download $url failed" "warn"
sleep "$wait" sleep "$wait"
done done
}
# Converts Windows-style line endings (CRLF) to Unix-style (LF)
convert_crlf_to_lf() {
local filepath="$1"
if grep -q $'\r' "$filepath"; then if grep -q $'\r' "$filepath"; then
log "Downloaded file has Windows line endings (CRLF). Converting to Unix (LF)" log "File '$filepath' contains CRLF line endings. Converting to LF..." "debug"
sed -i 's/\r$//' "$filepath" local tmpfile
tmpfile=$(mktemp)
tr -d '\r' < "$filepath" > "$tmpfile" && mv "$tmpfile" "$filepath" || rm -f "$tmpfile"
fi fi
} }
@@ -400,3 +388,17 @@ parse_domain_or_subnet_file_to_comma_string() {
echo "$result" echo "$result"
} }
# Extracts all ip_cidr entries from a JSON ruleset file and writes them to an output file.
extract_ip_cidr_from_json_ruleset_to_file() {
local json_file="$1"
local output_file="$2"
if [ ! -f "$json_file" ]; then
log "JSON file not found: $json_file" "error"
return 1
fi
log "Extracting ip_cidr entries from $json_file to $output_file" "debug"
jq -r '.rules[].ip_cidr[]' "$json_file" > "$output_file"
}

View File

@@ -1339,9 +1339,10 @@ sing_box_cm_configure_cache_file() {
####################################### #######################################
# Configure the experimental clash_api section of a sing-box JSON configuration. # Configure the experimental clash_api section of a sing-box JSON configuration.
# Arguments: # Arguments:
# config: JSON configuration (string) # config: string, JSON configuration
# external_controller: API listening address; Clash API will be disabled if empty # external_controller: string, API listening address; Clash API will be disabled if empty
# external_ui: Optional path to static web resources to serve at http://{{external-controller}}/ui # external_ui: string, Optional path to static web resources to serve at http://{{external-controller}}/ui
# secret: string, Optional secret for the RESTful API Authenticate by specifying HTTP header
# Outputs: # Outputs:
# Writes updated JSON configuration to stdout # Writes updated JSON configuration to stdout
# Example: # Example:
@@ -1351,14 +1352,17 @@ sing_box_cm_configure_clash_api() {
local config="$1" local config="$1"
local external_controller="$2" local external_controller="$2"
local external_ui="$3" local external_ui="$3"
local secret="$4"
echo "$config" | jq \ echo "$config" | jq \
--arg external_controller "$external_controller" \ --arg external_controller "$external_controller" \
--arg external_ui "$external_ui" \ --arg external_ui "$external_ui" \
--arg secret "$secret" \
'.experimental.clash_api = { '.experimental.clash_api = {
external_controller: $external_controller, external_controller: $external_controller,
} }
+ (if $external_ui != "" then { external_ui: $external_ui } else {} end)' + (if $external_ui != "" then { external_ui: $external_ui } else {} end)
+ (if $secret != "" then { secret: $secret } else {} end)'
} }
####################################### #######################################