Compare commits

..

23 Commits
0.7.0 ... 0.7.4

Author SHA1 Message Date
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
Kirill Sobakin
c3fac995d5 Merge pull request #224 from itdoginfo/feat/fe-improvements
Some FE improvements
2025-10-23 21:12:03 +03:00
divocat
21ecfbbeca fix: correct types on ru translations 2025-10-23 20:43:46 +03:00
divocat
2918487845 feat: add custom port support to dns 2025-10-23 20:33:18 +03:00
divocat
ac258c53c0 fix: alert displaying 2025-10-23 20:05:55 +03:00
divocat
9a389c47bf fix: actualize locales 2025-10-23 20:02:49 +03:00
divocat
7cd70468c5 feat: add wiki disclaimer to diagnostics 2025-10-23 20:00:55 +03:00
divocat
13d27dab21 feat: add toast when shell exec failed 2025-10-23 19:08:27 +03:00
divocat
9f8f032dce feat: increase shell timeout to 15s 2025-10-23 19:01:06 +03:00
divocat
8301f4c271 feat: update checks displaying 2025-10-23 18:59:23 +03:00
divocat
c4078c8242 feat: update some translations 2025-10-23 18:35:34 +03:00
Kirill Sobakin
e0d149f03a fix 2025-10-23 16:39:41 +03:00
Kirill Sobakin
0f77867ca2 Merge pull request #223 from itdoginfo/fix/version-check
fix: correct versions comparison
2025-10-23 16:21:01 +03:00
divocat
fb5ae9c1e8 fix: correct versions comparison 2025-10-23 16:19:13 +03:00
Kirill Sobakin
9e9bd5a2bd fix: some fixes 2025-10-23 16:15:08 +03:00
Kirill Sobakin
005574a01f feat: rm tiny 2025-10-23 16:14:44 +03:00
34 changed files with 1275 additions and 794 deletions

View File

@@ -38,7 +38,7 @@
"call": "Additional marking rules found", "call": "Additional marking rules found",
"key": "Additional marking rules found", "key": "Additional marking rules found",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:117" "src/podkop/tabs/diagnostic/checks/runNftCheck.ts:106"
] ]
}, },
{ {
@@ -62,11 +62,18 @@
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:437" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:437"
] ]
}, },
{
"call": "Available actions",
"key": "Available actions",
"places": [
"src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:43"
]
},
{ {
"call": "Bootsrap DNS", "call": "Bootsrap DNS",
"key": "Bootsrap DNS", "key": "Bootsrap DNS",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:72" "src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:65"
] ]
}, },
{ {
@@ -80,77 +87,70 @@
"call": "Browser is not using FakeIP", "call": "Browser is not using FakeIP",
"key": "Browser is not using FakeIP", "key": "Browser is not using FakeIP",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:81" "src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:58"
] ]
}, },
{ {
"call": "Browser is using FakeIP correctly", "call": "Browser is using FakeIP correctly",
"key": "Browser is using FakeIP correctly", "key": "Browser is using FakeIP correctly",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:80" "src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:57"
] ]
}, },
{ {
"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:322" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:329"
] ]
}, },
{ {
"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:336" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:343"
] ]
}, },
{ {
"call": "Cannot receive DNS checks result", "call": "Cannot receive checks result",
"key": "Cannot receive DNS checks result", "key": "Cannot receive checks result",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:26" "src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:27",
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:28",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:27",
"src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:25"
] ]
}, },
{ {
"call": "Cannot receive nftables checks result", "call": "Checking, please wait",
"key": "Cannot receive nftables checks result", "key": "Checking, please wait",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:27" "src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:15",
"src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:15",
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:13",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:15",
"src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:13"
] ]
}, },
{ {
"call": "Cannot receive Sing-box checks result", "call": "checks",
"key": "Cannot receive Sing-box checks result", "key": "checks",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:24" "src/podkop/tabs/diagnostic/helpers/getCheckTitle.ts:2"
] ]
}, },
{ {
"call": "Checking dns, please wait", "call": "Checks failed",
"key": "Checking dns, please wait", "key": "Checks failed",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:14" "src/podkop/tabs/diagnostic/helpers/getMeta.ts:26"
] ]
}, },
{ {
"call": "Checking FakeIP, please wait", "call": "Checks passed",
"key": "Checking FakeIP, please wait", "key": "Checks passed",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:14" "src/podkop/tabs/diagnostic/helpers/getMeta.ts:13"
]
},
{
"call": "Checking nftables, please wait",
"key": "Checking nftables, please wait",
"places": [
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:12"
]
},
{
"call": "Checking sing-box, please wait",
"key": "Checking sing-box, please wait",
"places": [
"src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:12"
] ]
}, },
{ {
@@ -178,7 +178,7 @@
"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:309" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:316"
] ]
}, },
{ {
@@ -241,21 +241,21 @@
"call": "Delay in milliseconds before reloading podkop after interface UP", "call": "Delay in milliseconds before reloading podkop after interface UP",
"key": "Delay in milliseconds before reloading podkop after interface UP", "key": "Delay in milliseconds before reloading podkop after interface UP",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:215" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:222"
] ]
}, },
{ {
"call": "Delay value cannot be empty", "call": "Delay value cannot be empty",
"key": "Delay value cannot be empty", "key": "Delay value cannot be empty",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:222" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:229"
] ]
}, },
{ {
"call": "DHCP has DNS server", "call": "DHCP has DNS server",
"key": "DHCP has DNS server", "key": "DHCP has DNS server",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:89" "src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:82"
] ]
}, },
{ {
@@ -276,14 +276,14 @@
"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:239" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:246"
] ]
}, },
{ {
"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:240" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:247"
] ]
}, },
{ {
@@ -294,25 +294,11 @@
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:382" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:382"
] ]
}, },
{
"call": "DNS checks",
"key": "DNS checks",
"places": [
"src/podkop/tabs/diagnostic/checks/contstants.ts:14"
]
},
{
"call": "DNS checks passed",
"key": "DNS checks passed",
"places": [
"src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:64"
]
},
{ {
"call": "DNS on router", "call": "DNS on router",
"key": "DNS on router", "key": "DNS on router",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:84" "src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:77"
] ]
}, },
{ {
@@ -361,6 +347,13 @@
"src/validators/validateDns.ts:7" "src/validators/validateDns.ts:7"
] ]
}, },
{
"call": "Do not panic, everything can be fixed, just...",
"key": "Do not panic, everything can be fixed, just...",
"places": [
"src/podkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts:26"
]
},
{ {
"call": "Domain Resolver", "call": "Domain Resolver",
"key": "Domain Resolver", "key": "Domain Resolver",
@@ -372,7 +365,7 @@
"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:300" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:307"
] ]
}, },
{ {
@@ -394,28 +387,28 @@
"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:262" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:269"
] ]
}, },
{ {
"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:271" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:278"
] ]
}, },
{ {
"call": "Downloading all lists via main Proxy/VPN", "call": "Downloading all lists via main Proxy/VPN",
"key": "Downloading all lists via main Proxy/VPN", "key": "Downloading all lists via main Proxy/VPN",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:263" "../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:272" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:279"
] ]
}, },
{ {
@@ -465,7 +458,7 @@
"call": "Enable YACD", "call": "Enable YACD",
"key": "Enable YACD", "key": "Enable YACD",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:230" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:237"
] ]
}, },
{ {
@@ -500,14 +493,14 @@
"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:358" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:365"
] ]
}, },
{ {
"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:359" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:366"
] ]
}, },
{ {
@@ -518,31 +511,15 @@
] ]
}, },
{ {
"call": "FakeIP checks", "call": "Failed to execute!",
"key": "FakeIP checks", "key": "Failed to execute!",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/contstants.ts:29" "src/podkop/tabs/diagnostic/initController.ts:227",
] "src/podkop/tabs/diagnostic/initController.ts:231",
}, "src/podkop/tabs/diagnostic/initController.ts:261",
{ "src/podkop/tabs/diagnostic/initController.ts:265",
"call": "FakeIP checks failed", "src/podkop/tabs/diagnostic/initController.ts:299",
"key": "FakeIP checks failed", "src/podkop/tabs/diagnostic/initController.ts:303"
"places": [
"src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:57"
]
},
{
"call": "FakeIP checks partially passed",
"key": "FakeIP checks partially passed",
"places": [
"src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:51"
]
},
{
"call": "FakeIP checks passed",
"key": "FakeIP checks passed",
"places": [
"src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:44"
] ]
}, },
{ {
@@ -570,7 +547,7 @@
"call": "Global check", "call": "Global check",
"key": "Global check", "key": "Global check",
"places": [ "places": [
"src/podkop/tabs/diagnostic/initController.ts:218" "src/podkop/tabs/diagnostic/initController.ts:222"
] ]
}, },
{ {
@@ -584,28 +561,28 @@
"call": "Interface Monitoring", "call": "Interface Monitoring",
"key": "Interface Monitoring", "key": "Interface Monitoring",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:182" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:189"
] ]
}, },
{ {
"call": "Interface Monitoring Delay", "call": "Interface Monitoring Delay",
"key": "Interface Monitoring Delay", "key": "Interface Monitoring Delay",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:214" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:221"
] ]
}, },
{ {
"call": "Interface monitoring for Bad WAN", "call": "Interface monitoring for Bad WAN",
"key": "Interface monitoring for Bad WAN", "key": "Interface monitoring for Bad WAN",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:183" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:190"
] ]
}, },
{ {
"call": "Invalid DNS server format. Examples: 8.8.8.8 or dns.example.com or dns.example.com/nicedns for DoH", "call": "Invalid DNS server format. Examples: 8.8.8.8 or dns.example.com or dns.example.com/nicedns for DoH",
"key": "Invalid DNS server format. Examples: 8.8.8.8 or dns.example.com or dns.example.com/nicedns for DoH", "key": "Invalid DNS server format. Examples: 8.8.8.8 or dns.example.com or dns.example.com/nicedns for DoH",
"places": [ "places": [
"src/validators/validateDns.ts:20" "src/validators/validateDns.ts:23"
] ]
}, },
{ {
@@ -809,7 +786,7 @@
"call": "Invalid VLESS URL: parsing failed", "call": "Invalid VLESS URL: parsing failed",
"key": "Invalid VLESS URL: parsing failed", "key": "Invalid VLESS URL: parsing failed",
"places": [ "places": [
"src/validators/validateVlessUrl.ts:109" "src/validators/validateVlessUrl.ts:110"
] ]
}, },
{ {
@@ -819,18 +796,25 @@
"src/validators/validateSubnet.ts:18" "src/validators/validateSubnet.ts:18"
] ]
}, },
{
"call": "Issues detected",
"key": "Issues detected",
"places": [
"src/podkop/tabs/diagnostic/helpers/getMeta.ts:20"
]
},
{ {
"call": "Latest", "call": "Latest",
"key": "Latest", "key": "Latest",
"places": [ "places": [
"src/podkop/tabs/diagnostic/initController.ts:404" "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:250" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:257"
] ]
}, },
{ {
@@ -851,7 +835,7 @@
"call": "Main DNS", "call": "Main DNS",
"key": "Main DNS", "key": "Main DNS",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:79" "src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:72"
] ]
}, },
{ {
@@ -872,7 +856,7 @@
"call": "Monitored Interfaces", "call": "Monitored Interfaces",
"key": "Monitored Interfaces", "key": "Monitored Interfaces",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:191" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:198"
] ]
}, },
{ {
@@ -882,32 +866,11 @@
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:120" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:120"
] ]
}, },
{
"call": "Nftables checks",
"key": "Nftables checks",
"places": [
"src/podkop/tabs/diagnostic/checks/contstants.ts:24"
]
},
{
"call": "Nftables checks partially passed",
"key": "Nftables checks partially passed",
"places": [
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:75"
]
},
{
"call": "Nftables checks passed",
"key": "Nftables checks passed",
"places": [
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:74"
]
},
{ {
"call": "No other marking rules found", "call": "No other marking rules found",
"key": "No other marking rules found", "key": "No other marking rules found",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:116" "src/podkop/tabs/diagnostic/checks/runNftCheck.ts:105"
] ]
}, },
{ {
@@ -917,6 +880,14 @@
"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:59",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:79"
]
},
{ {
"call": "Not running", "call": "Not running",
"key": "Not running", "key": "Not running",
@@ -924,7 +895,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"
] ]
}, },
{ {
@@ -959,7 +931,7 @@
"call": "Outdated", "call": "Outdated",
"key": "Outdated", "key": "Outdated",
"places": [ "places": [
"src/podkop/tabs/diagnostic/initController.ts:394" "src/podkop/tabs/diagnostic/initController.ts:443"
] ]
}, },
{ {
@@ -980,21 +952,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:340" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:347"
] ]
}, },
{ {
"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:349" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:356"
] ]
}, },
{ {
"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:344" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:351"
]
},
{
"call": "Pending",
"key": "Pending",
"places": [
"src/podkop/tabs/diagnostic/diagnostic.store.ts:103",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:111",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:119",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:127",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:135"
] ]
}, },
{ {
@@ -1015,7 +998,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:301" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:308"
] ]
}, },
{ {
@@ -1029,24 +1012,14 @@
"call": "Proxy traffic is not routed via FakeIP", "call": "Proxy traffic is not routed via FakeIP",
"key": "Proxy traffic is not routed via FakeIP", "key": "Proxy traffic is not routed via FakeIP",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:89" "src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:66"
] ]
}, },
{ {
"call": "Proxy traffic is routed via FakeIP", "call": "Proxy traffic is routed via FakeIP",
"key": "Proxy traffic is routed via FakeIP", "key": "Proxy traffic is routed via FakeIP",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:88" "src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:65"
]
},
{
"call": "Queued",
"key": "Queued",
"places": [
"src/podkop/tabs/diagnostic/diagnostic.store.ts:95",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:103",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:111",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:119"
] ]
}, },
{ {
@@ -1081,63 +1054,63 @@
"call": "Router DNS is not routed through sing-box", "call": "Router DNS is not routed through sing-box",
"key": "Router DNS is not routed through sing-box", "key": "Router DNS is not routed through sing-box",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:74" "src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:51"
] ]
}, },
{ {
"call": "Router DNS is routed through sing-box", "call": "Router DNS is routed through sing-box",
"key": "Router DNS is routed through sing-box", "key": "Router DNS is routed through sing-box",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:73" "src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:50"
] ]
}, },
{ {
"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:369" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:376"
] ]
}, },
{ {
"call": "Rules mangle counters", "call": "Rules mangle counters",
"key": "Rules mangle counters", "key": "Rules mangle counters",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:90" "src/podkop/tabs/diagnostic/checks/runNftCheck.ts:79"
] ]
}, },
{ {
"call": "Rules mangle exist", "call": "Rules mangle exist",
"key": "Rules mangle exist", "key": "Rules mangle exist",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:85" "src/podkop/tabs/diagnostic/checks/runNftCheck.ts:74"
] ]
}, },
{ {
"call": "Rules mangle output counters", "call": "Rules mangle output counters",
"key": "Rules mangle output counters", "key": "Rules mangle output counters",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:100" "src/podkop/tabs/diagnostic/checks/runNftCheck.ts:89"
] ]
}, },
{ {
"call": "Rules mangle output exist", "call": "Rules mangle output exist",
"key": "Rules mangle output exist", "key": "Rules mangle output exist",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:95" "src/podkop/tabs/diagnostic/checks/runNftCheck.ts:84"
] ]
}, },
{ {
"call": "Rules proxy counters", "call": "Rules proxy counters",
"key": "Rules proxy counters", "key": "Rules proxy counters",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:110" "src/podkop/tabs/diagnostic/checks/runNftCheck.ts:99"
] ]
}, },
{ {
"call": "Rules proxy exist", "call": "Rules proxy exist",
"key": "Rules proxy exist", "key": "Rules proxy exist",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:105" "src/podkop/tabs/diagnostic/checks/runNftCheck.ts:94"
] ]
}, },
{ {
@@ -1186,7 +1159,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:251" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:258"
] ]
}, },
{ {
@@ -1215,14 +1188,14 @@
"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:323" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:330"
] ]
}, },
{ {
"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:310" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:317"
] ]
}, },
{ {
@@ -1264,7 +1237,7 @@
"call": "Select the WAN interfaces to be monitored", "call": "Select the WAN interfaces to be monitored",
"key": "Select the WAN interfaces to be monitored", "key": "Select the WAN interfaces to be monitored",
"places": [ "places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:192" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:199"
] ]
}, },
{ {
@@ -1285,7 +1258,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:278", "src/podkop/tabs/diagnostic/initController.ts:290",
"src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:116" "src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:116"
] ]
}, },
@@ -1300,56 +1273,42 @@
"call": "Sing-box autostart disabled", "call": "Sing-box autostart disabled",
"key": "Sing-box autostart disabled", "key": "Sing-box autostart disabled",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:86" "src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:77"
]
},
{
"call": "Sing-box checks",
"key": "Sing-box checks",
"places": [
"src/podkop/tabs/diagnostic/checks/contstants.ts:19"
]
},
{
"call": "Sing-box checks passed",
"key": "Sing-box checks passed",
"places": [
"src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:66"
] ]
}, },
{ {
"call": "Sing-box installed", "call": "Sing-box installed",
"key": "Sing-box installed", "key": "Sing-box installed",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:71" "src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:62"
] ]
}, },
{ {
"call": "Sing-box listening ports", "call": "Sing-box listening ports",
"key": "Sing-box listening ports", "key": "Sing-box listening ports",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:96" "src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:87"
] ]
}, },
{ {
"call": "Sing-box process running", "call": "Sing-box process running",
"key": "Sing-box process running", "key": "Sing-box process running",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:91" "src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:82"
] ]
}, },
{ {
"call": "Sing-box service exist", "call": "Sing-box service exist",
"key": "Sing-box service exist", "key": "Sing-box service exist",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:81" "src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:72"
] ]
}, },
{ {
"call": "Sing-box version >= 1.12.4", "call": "Sing-box version >= 1.12.4",
"key": "Sing-box version >= 1.12.4", "key": "Sing-box version >= 1.12.4",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:76" "src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:67"
] ]
}, },
{ {
@@ -1363,7 +1322,7 @@
"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:370" "../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:377"
] ]
}, },
{ {
@@ -1423,11 +1382,18 @@
"src/podkop/tabs/dashboard/initController.ts:301" "src/podkop/tabs/dashboard/initController.ts:301"
] ]
}, },
{
"call": "System information",
"key": "System information",
"places": [
"src/podkop/tabs/diagnostic/partials/renderSystemInfo.ts:21"
]
},
{ {
"call": "Table exist", "call": "Table exist",
"key": "Table exist", "key": "Table exist",
"places": [ "places": [
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:80" "src/podkop/tabs/diagnostic/checks/runNftCheck.ts:69"
] ]
}, },
{ {
@@ -1479,6 +1445,13 @@
"src/podkop/tabs/dashboard/initController.ts:265" "src/podkop/tabs/dashboard/initController.ts:265"
] ]
}, },
{
"call": "Troubleshooting",
"key": "Troubleshooting",
"places": [
"src/podkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts:25"
]
},
{ {
"call": "TTL must be a positive number", "call": "TTL must be a positive number",
"key": "TTL must be a positive number", "key": "TTL must be a positive number",
@@ -1512,13 +1485,13 @@
"call": "unknown", "call": "unknown",
"key": "unknown", "key": "unknown",
"places": [ "places": [
"src/podkop/tabs/diagnostic/initController.ts:34",
"src/podkop/tabs/diagnostic/initController.ts:35",
"src/podkop/tabs/diagnostic/initController.ts:36",
"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:373" "src/podkop/tabs/diagnostic/initController.ts:40",
"src/podkop/tabs/diagnostic/initController.ts:41",
"src/podkop/tabs/diagnostic/initController.ts:42",
"src/podkop/tabs/diagnostic/initController.ts:43",
"src/podkop/tabs/diagnostic/initController.ts:417"
] ]
}, },
{ {
@@ -1540,7 +1513,7 @@
"call": "URL must start with vless://, ss://, trojan://, or socks4/5://", "call": "URL must start with vless://, ss://, trojan://, or socks4/5://",
"key": "URL must start with vless://, ss://, trojan://, or socks4/5://", "key": "URL must start with vless://, ss://, trojan://, or socks4/5://",
"places": [ "places": [
"src/validators/validateProxyUrl.ts:27" "src/validators/validateProxyUrl.ts:29"
] ]
}, },
{ {
@@ -1610,8 +1583,8 @@
"call": "Valid", "call": "Valid",
"key": "Valid", "key": "Valid",
"places": [ "places": [
"src/validators/validateDns.ts:11", "src/validators/validateDns.ts:14",
"src/validators/validateDns.ts:15", "src/validators/validateDns.ts:18",
"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",
@@ -1622,7 +1595,7 @@
"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:16",
"src/validators/validateVlessUrl.ts:107" "src/validators/validateVlessUrl.ts:108"
] ]
}, },
{ {
@@ -1637,10 +1610,17 @@
"call": "View logs", "call": "View logs",
"key": "View logs", "key": "View logs",
"places": [ "places": [
"src/podkop/tabs/diagnostic/initController.ts:248", "src/podkop/tabs/diagnostic/initController.ts:256",
"src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:107" "src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:107"
] ]
}, },
{
"call": "Visit Wiki",
"key": "Visit Wiki",
"places": [
"src/podkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts:31"
]
},
{ {
"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.",

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-21 20:02+0300\n" "POT-Creation-Date: 2025-10-25 22:08+0300\n"
"PO-Revision-Date: 2025-10-21 20:02+0300\n" "PO-Revision-Date: 2025-10-25 22:08+0300\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"
@@ -36,7 +36,7 @@ msgstr ""
msgid "Active Connections" msgid "Active Connections"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:117 #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:106
msgid "Additional marking rules found" msgid "Additional marking rules found"
msgstr "" msgstr ""
@@ -52,7 +52,11 @@ msgstr ""
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 ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:72 #: src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:43
msgid "Available actions"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:65
msgid "Bootsrap DNS" msgid "Bootsrap DNS"
msgstr "" msgstr ""
@@ -60,48 +64,47 @@ msgstr ""
msgid "Bootstrap DNS server" msgid "Bootstrap DNS server"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:81 #: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:58
msgid "Browser is not using FakeIP" msgid "Browser is not using FakeIP"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:80 #: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:57
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:322 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:329
msgid "Cache File Path" msgid "Cache File Path"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:336 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:343
msgid "Cache file path cannot be empty" msgid "Cache file path cannot be empty"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:26 #: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:27
msgid "Cannot receive DNS checks result" #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:28
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:27
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:25
msgid "Cannot receive checks result"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:27 #: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:15
msgid "Cannot receive nftables checks result" #: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:15
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:13
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:15
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:13
msgid "Checking, please wait"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:24 #: src/podkop/tabs/diagnostic/helpers/getCheckTitle.ts:2
msgid "Cannot receive Sing-box checks result" msgid "checks"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:14 #: src/podkop/tabs/diagnostic/helpers/getMeta.ts:26
msgid "Checking dns, please wait" msgid "Checks failed"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:14 #: src/podkop/tabs/diagnostic/helpers/getMeta.ts:13
msgid "Checking FakeIP, please wait" msgid "Checks passed"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:12
msgid "Checking nftables, please wait"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:12
msgid "Checking sing-box, please wait"
msgstr "" msgstr ""
#: src/validators/validateSubnet.ts:33 #: src/validators/validateSubnet.ts:33
@@ -116,7 +119,7 @@ msgstr ""
msgid "Community Lists" msgid "Community Lists"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:309 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:316
msgid "Config File Path" msgid "Config File Path"
msgstr "" msgstr ""
@@ -152,15 +155,15 @@ msgstr ""
msgid "Dashboard currently unavailable" msgid "Dashboard currently unavailable"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:215 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:222
msgid "Delay in milliseconds before reloading podkop after interface UP" msgid "Delay in milliseconds before reloading podkop after interface UP"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:222 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:229
msgid "Delay value cannot be empty" msgid "Delay value cannot be empty"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:89 #: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:82
msgid "DHCP has DNS server" msgid "DHCP has DNS server"
msgstr "" msgstr ""
@@ -172,11 +175,11 @@ msgstr ""
msgid "Disable autostart" msgid "Disable autostart"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:239 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:246
msgid "Disable QUIC" msgid "Disable QUIC"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:240 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:247
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 ""
@@ -185,15 +188,7 @@ msgstr ""
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/contstants.ts:14 #: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:77
msgid "DNS checks"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:64
msgid "DNS checks passed"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:84
msgid "DNS on router" msgid "DNS on router"
msgstr "" msgstr ""
@@ -225,11 +220,15 @@ msgstr ""
msgid "DNS server address cannot be empty" msgid "DNS server address cannot be empty"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts:26
msgid "Do not panic, everything can be fixed, just..."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:166 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:166
msgid "Domain Resolver" msgid "Domain Resolver"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:300 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:307
msgid "Dont Touch My DHCP!" msgid "Dont Touch My DHCP!"
msgstr "" msgstr ""
@@ -242,19 +241,19 @@ msgstr ""
msgid "Download" msgid "Download"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:262 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:269
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:271 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:278
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:263 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:270
msgid "Downloading all lists via main Proxy/VPN" msgid "Downloading all lists via main Proxy/VPN"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:272 #: ../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 ""
@@ -283,7 +282,7 @@ msgstr ""
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 ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:230 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:237
msgid "Enable YACD" msgid "Enable YACD"
msgstr "" msgstr ""
@@ -303,11 +302,11 @@ 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 "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:358 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:365
msgid "Exclude NTP" msgid "Exclude NTP"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:359 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:366
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 ""
@@ -315,20 +314,13 @@ msgstr ""
msgid "Failed to copy!" msgid "Failed to copy!"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/contstants.ts:29 #: src/podkop/tabs/diagnostic/initController.ts:227
msgid "FakeIP checks" #: src/podkop/tabs/diagnostic/initController.ts:231
msgstr "" #: src/podkop/tabs/diagnostic/initController.ts:261
#: src/podkop/tabs/diagnostic/initController.ts:265
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:57 #: src/podkop/tabs/diagnostic/initController.ts:299
msgid "FakeIP checks failed" #: src/podkop/tabs/diagnostic/initController.ts:303
msgstr "" msgid "Failed to execute!"
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:51
msgid "FakeIP checks partially passed"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:44
msgid "FakeIP checks passed"
msgstr "" msgstr ""
#: src/podkop/methods/custom/getDashboardSections.ts:117 #: src/podkop/methods/custom/getDashboardSections.ts:117
@@ -343,7 +335,7 @@ msgstr ""
msgid "Get global check" msgid "Get global check"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:218 #: src/podkop/tabs/diagnostic/initController.ts:222
msgid "Global check" msgid "Global check"
msgstr "" msgstr ""
@@ -351,19 +343,19 @@ msgstr ""
msgid "HTTP error" msgid "HTTP error"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:182 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:189
msgid "Interface Monitoring" msgid "Interface Monitoring"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:214 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:221
msgid "Interface Monitoring Delay" msgid "Interface Monitoring Delay"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:183 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:190
msgid "Interface monitoring for Bad WAN" msgid "Interface monitoring for Bad WAN"
msgstr "" msgstr ""
#: src/validators/validateDns.ts:20 #: src/validators/validateDns.ts:23
msgid "Invalid DNS server format. Examples: 8.8.8.8 or dns.example.com or dns.example.com/nicedns for DoH" msgid "Invalid DNS server format. Examples: 8.8.8.8 or dns.example.com or dns.example.com/nicedns for DoH"
msgstr "" msgstr ""
@@ -480,7 +472,7 @@ msgstr ""
msgid "Invalid URL format" msgid "Invalid URL format"
msgstr "" msgstr ""
#: src/validators/validateVlessUrl.ts:109 #: src/validators/validateVlessUrl.ts:110
msgid "Invalid VLESS URL: parsing failed" msgid "Invalid VLESS URL: parsing failed"
msgstr "" msgstr ""
@@ -488,11 +480,15 @@ msgstr ""
msgid "IP address 0.0.0.0 is not allowed" msgid "IP address 0.0.0.0 is not allowed"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:404 #: src/podkop/tabs/diagnostic/helpers/getMeta.ts:20
msgid "Issues detected"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:453
msgid "Latest" msgid "Latest"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:250 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:257
msgid "List Update Frequency" msgid "List Update Frequency"
msgstr "" msgstr ""
@@ -504,7 +500,7 @@ msgstr ""
msgid "Local Subnet Lists" msgid "Local Subnet Lists"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:79 #: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:72
msgid "Main DNS" msgid "Main DNS"
msgstr "" msgstr ""
@@ -516,7 +512,7 @@ msgstr ""
msgid "Mixed Proxy Port" msgid "Mixed Proxy Port"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:191 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:198
msgid "Monitored Interfaces" msgid "Monitored Interfaces"
msgstr "" msgstr ""
@@ -524,19 +520,7 @@ msgstr ""
msgid "Network Interface" msgid "Network Interface"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/contstants.ts:24 #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:105
msgid "Nftables checks"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:75
msgid "Nftables checks partially passed"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:74
msgid "Nftables checks passed"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:116
msgid "No other marking rules found" msgid "No other marking rules found"
msgstr "" msgstr ""
@@ -544,10 +528,16 @@ msgstr ""
msgid "Not implement yet" msgid "Not implement yet"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:59
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:79
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 ""
@@ -567,7 +557,7 @@ msgstr ""
msgid "Outbound JSON must contain at least \"type\", \"server\" and \"server_port\" fields" msgid "Outbound JSON must contain at least \"type\", \"server\" and \"server_port\" fields"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:394 #: src/podkop/tabs/diagnostic/initController.ts:443
msgid "Outdated" msgid "Outdated"
msgstr "" msgstr ""
@@ -579,18 +569,26 @@ msgstr ""
msgid "Path cannot be empty" msgid "Path cannot be empty"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:340 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:347
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:349 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:356
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:344 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:351
msgid "Path must end with cache.db" msgid "Path must end with cache.db"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:103
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:111
#: 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"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:340 #: src/podkop/tabs/dashboard/initController.ts:340
msgid "Podkop" msgid "Podkop"
msgstr "" msgstr ""
@@ -599,7 +597,7 @@ msgstr ""
msgid "Podkop Settings" msgid "Podkop Settings"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:301 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:308
msgid "Podkop will not modify your DHCP configuration" msgid "Podkop will not modify your DHCP configuration"
msgstr "" msgstr ""
@@ -607,21 +605,14 @@ msgstr ""
msgid "Proxy Configuration URL" msgid "Proxy Configuration URL"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:89 #: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:66
msgid "Proxy traffic is not routed via FakeIP" msgid "Proxy traffic is not routed via FakeIP"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:88 #: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:65
msgid "Proxy traffic is routed via FakeIP" msgid "Proxy traffic is routed via FakeIP"
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:111
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:119
msgid "Queued"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:245 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:245
msgid "Regional options cannot be used together" msgid "Regional options cannot be used together"
msgstr "" msgstr ""
@@ -638,39 +629,39 @@ msgstr ""
msgid "Restart podkop" msgid "Restart podkop"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:74 #: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:51
msgid "Router DNS is not routed through sing-box" msgid "Router DNS is not routed through sing-box"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:73 #: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:50
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:369 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:376
msgid "Routing Excluded IPs" msgid "Routing Excluded IPs"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:90 #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:79
msgid "Rules mangle counters" msgid "Rules mangle counters"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:85 #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:74
msgid "Rules mangle exist" msgid "Rules mangle exist"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:100 #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:89
msgid "Rules mangle output counters" msgid "Rules mangle output counters"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:95 #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:84
msgid "Rules mangle output exist" msgid "Rules mangle output exist"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:110 #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:99
msgid "Rules proxy counters" msgid "Rules proxy counters"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:105 #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:94
msgid "Rules proxy exist" msgid "Rules proxy exist"
msgstr "" msgstr ""
@@ -698,7 +689,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:251 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:258
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 ""
@@ -715,11 +706,11 @@ msgstr ""
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:323 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:330
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:310 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:317
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 ""
@@ -743,7 +734,7 @@ msgstr ""
msgid "Select the network interface to which the traffic will originate" msgid "Select the network interface to which the traffic will originate"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:192 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:199
msgid "Select the WAN interfaces to be monitored" msgid "Select the WAN interfaces to be monitored"
msgstr "" msgstr ""
@@ -755,7 +746,7 @@ msgstr ""
msgid "Settings" msgid "Settings"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:278 #: 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 ""
@@ -764,35 +755,27 @@ msgstr ""
msgid "Sing-box" msgid "Sing-box"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:86 #: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:77
msgid "Sing-box autostart disabled" msgid "Sing-box autostart disabled"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/contstants.ts:19 #: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:62
msgid "Sing-box checks"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:66
msgid "Sing-box checks passed"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:71
msgid "Sing-box installed" msgid "Sing-box installed"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:96 #: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:87
msgid "Sing-box listening ports" msgid "Sing-box listening ports"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:91 #: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:82
msgid "Sing-box process running" msgid "Sing-box process running"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:81 #: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:72
msgid "Sing-box service exist" msgid "Sing-box service exist"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:76 #: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:67
msgid "Sing-box version >= 1.12.4" msgid "Sing-box version >= 1.12.4"
msgstr "" msgstr ""
@@ -800,7 +783,7 @@ msgstr ""
msgid "Source Network Interface" msgid "Source Network Interface"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:370 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:377
msgid "Specify a local IP address to be excluded from routing" msgid "Specify a local IP address to be excluded from routing"
msgstr "" msgstr ""
@@ -837,7 +820,11 @@ msgstr ""
msgid "System info" msgid "System info"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:80 #: src/podkop/tabs/diagnostic/partials/renderSystemInfo.ts:21
msgid "System information"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:69
msgid "Table exist" msgid "Table exist"
msgstr "" msgstr ""
@@ -869,6 +856,10 @@ msgstr ""
msgid "Traffic Total" msgid "Traffic Total"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts:25
msgid "Troubleshooting"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:80 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:80
msgid "TTL must be a positive number" msgid "TTL must be a positive number"
msgstr "" msgstr ""
@@ -886,13 +877,13 @@ msgstr ""
msgid "UDP over TCP" msgid "UDP over TCP"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:34
#: src/podkop/tabs/diagnostic/initController.ts:35
#: src/podkop/tabs/diagnostic/initController.ts:36
#: 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:373 #: src/podkop/tabs/diagnostic/initController.ts:40
#: src/podkop/tabs/diagnostic/initController.ts:41
#: src/podkop/tabs/diagnostic/initController.ts:42
#: src/podkop/tabs/diagnostic/initController.ts:43
#: src/podkop/tabs/diagnostic/initController.ts:417
msgid "unknown" msgid "unknown"
msgstr "" msgstr ""
@@ -905,7 +896,7 @@ msgstr ""
msgid "Uplink" msgid "Uplink"
msgstr "" msgstr ""
#: src/validators/validateProxyUrl.ts:27 #: src/validators/validateProxyUrl.ts:29
msgid "URL must start with vless://, ss://, trojan://, or socks4/5://" msgid "URL must start with vless://, ss://, trojan://, or socks4/5://"
msgstr "" msgstr ""
@@ -945,8 +936,8 @@ msgstr ""
msgid "User Subnets List" msgid "User Subnets List"
msgstr "" msgstr ""
#: src/validators/validateDns.ts:11 #: src/validators/validateDns.ts:14
#: src/validators/validateDns.ts:15 #: src/validators/validateDns.ts:18
#: 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
@@ -957,7 +948,7 @@ msgstr ""
#: 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:16
#: src/validators/validateVlessUrl.ts:107 #: src/validators/validateVlessUrl.ts:108
msgid "Valid" msgid "Valid"
msgstr "" msgstr ""
@@ -966,11 +957,15 @@ msgstr ""
msgid "Validation errors:" msgid "Validation errors:"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:248 #: 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 ""
#: src/podkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts:31
msgid "Visit Wiki"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:247 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:247
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 ""

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-21 23:02+0300\n" "POT-Creation-Date: 2025-10-25 01:08+0300\n"
"PO-Revision-Date: 2025-10-21 23:02+0300\n" "PO-Revision-Date: 2025-10-25 01:08+0300\n"
"Last-Translator: divocat\n" "Last-Translator: divocat\n"
"Language-Team: none\n" "Language-Team: none\n"
"Language: ru\n" "Language: ru\n"
@@ -44,6 +44,9 @@ msgstr "Необходимо указать хотя бы один действ
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 "Необходимо указать хотя бы одну действительную подсеть или IP. Только комментарии недопустимы." msgstr "Необходимо указать хотя бы одну действительную подсеть или IP. Только комментарии недопустимы."
msgid "Available actions"
msgstr "Доступные действия"
msgid "Bootsrap DNS" msgid "Bootsrap DNS"
msgstr "Bootstrap DNS" msgstr "Bootstrap DNS"
@@ -62,26 +65,20 @@ msgstr "Путь к файлу кэша"
msgid "Cache file path cannot be empty" msgid "Cache file path cannot be empty"
msgstr "Путь к файлу кэша не может быть пустым" msgstr "Путь к файлу кэша не может быть пустым"
msgid "Cannot receive DNS checks result" msgid "Cannot receive checks result"
msgstr "Не удалось получить результаты проверки DNS" msgstr "Не удалось получить результаты проверки"
msgid "Cannot receive nftables checks result" msgid "Checking, please wait"
msgstr "Не удалось получить результаты проверки nftables" msgstr "Проверяем, пожалуйста подождите"
msgid "Cannot receive Sing-box checks result" msgid "checks"
msgstr "Не удалось получить результаты проверки Sing-box" msgstr "проверки"
msgid "Checking dns, please wait" msgid "Checks failed"
msgstr "Проверка dns, пожалуйста подождите" msgstr "Проверки не выполнены"
msgid "Checking FakeIP, please wait" msgid "Checks passed"
msgstr "Проверка FakeIP, пожалуйста подождите" msgstr "Проверки пройдены"
msgid "Checking nftables, please wait"
msgstr "Проверка nftables, пожалуйста подождите"
msgid "Checking sing-box, please wait"
msgstr "Проверка sing-box, пожалуйста подождите"
msgid "CIDR must be between 0 and 32" msgid "CIDR must be between 0 and 32"
msgstr "CIDR должен быть между 0 и 32" msgstr "CIDR должен быть между 0 и 32"
@@ -143,12 +140,6 @@ msgstr "Отключить QUIC протокол для улучшения со
msgid "Disabled" msgid "Disabled"
msgstr "Отключено" msgstr "Отключено"
msgid "DNS checks"
msgstr "DNS проверки"
msgid "DNS checks passed"
msgstr "DNS проверки успешно завершены"
msgid "DNS on router" msgid "DNS on router"
msgstr "DNS на роутере" msgstr "DNS на роутере"
@@ -170,6 +161,9 @@ msgstr "DNS-сервер"
msgid "DNS server address cannot be empty" msgid "DNS server address cannot be empty"
msgstr "Адрес DNS-сервера не может быть пустым" msgstr "Адрес DNS-сервера не может быть пустым"
msgid "Do not panic, everything can be fixed, just..."
msgstr "Не паникуйте, всё можно исправить, просто..."
msgid "Domain Resolver" msgid "Domain Resolver"
msgstr "Резолвер доменов" msgstr "Резолвер доменов"
@@ -236,17 +230,8 @@ msgstr "Исключите трафик протокола NTP из туннел
msgid "Failed to copy!" msgid "Failed to copy!"
msgstr "Не удалось скопировать!" msgstr "Не удалось скопировать!"
msgid "FakeIP checks" msgid "Failed to execute!"
msgstr "Проверка FakeIP" msgstr "Не удалось выполнить!"
msgid "FakeIP checks failed"
msgstr "Проверки FakeIP не пройдены"
msgid "FakeIP checks partially passed"
msgstr "Проверка FakeIP частично пройдена"
msgid "FakeIP checks passed"
msgstr "Проверки FakeIP пройдены"
msgid "Fastest" msgid "Fastest"
msgstr "Самый быстрый" msgstr "Самый быстрый"
@@ -365,6 +350,9 @@ msgstr "Неверный URL VLESS: ошибка разбора"
msgid "IP address 0.0.0.0 is not allowed" msgid "IP address 0.0.0.0 is not allowed"
msgstr "IP-адрес 0.0.0.0 не допускается" msgstr "IP-адрес 0.0.0.0 не допускается"
msgid "Issues detected"
msgstr "Обнаружены проблемы"
msgid "Latest" msgid "Latest"
msgstr "Последняя" msgstr "Последняя"
@@ -392,21 +380,15 @@ msgstr "Наблюдаемые интерфейсы"
msgid "Network Interface" msgid "Network Interface"
msgstr "Сетевой интерфейс" msgstr "Сетевой интерфейс"
msgid "Nftables checks"
msgstr "Проверки Nftables"
msgid "Nftables checks partially passed"
msgstr "Проверки Nftables частично пройдена"
msgid "Nftables checks passed"
msgstr "Nftables проверки успешно завершены"
msgid "No other marking rules found" msgid "No other marking rules found"
msgstr "Другие правила маркировки не найдены" msgstr "Другие правила маркировки не найдены"
msgid "Not implement yet" msgid "Not implement yet"
msgstr "Ещё не реализовано" msgstr "Ещё не реализовано"
msgid "Not responding"
msgstr "Не отвечает"
msgid "Not running" msgid "Not running"
msgstr "Не запущено" msgstr "Не запущено"
@@ -440,6 +422,9 @@ msgstr "Путь должен содержать хотя бы одну дире
msgid "Path must end with cache.db" msgid "Path must end with cache.db"
msgstr "Путь должен заканчиваться на cache.db" msgstr "Путь должен заканчиваться на cache.db"
msgid "Pending"
msgstr "Ожидает запуска"
msgid "Podkop" msgid "Podkop"
msgstr "Podkop" msgstr "Podkop"
@@ -458,17 +443,14 @@ msgstr "Прокси-трафик не маршрутизируется чере
msgid "Proxy traffic is routed via FakeIP" msgid "Proxy traffic is routed via FakeIP"
msgstr "Прокси-трафик направляется через FakeIP" msgstr "Прокси-трафик направляется через FakeIP"
msgid "Queued"
msgstr "В очереди"
msgid "Regional options cannot be used together" msgid "Regional options cannot be used together"
msgstr "Нельзя использовать несколько региональных опций одновременно" msgstr "Нельзя использовать несколько региональных опций одновременно"
msgid "Remote Domain Lists" msgid "Remote Domain Lists"
msgstr "Удалённые списки доменов" msgstr "Внешние списки доменов"
msgid "Remote Subnet Lists" msgid "Remote Subnet Lists"
msgstr "Удалённые списки подсетей" msgstr "Внешние списки подсетей"
msgid "Restart podkop" msgid "Restart podkop"
msgstr "Перезапустить Podkop" msgstr "Перезапустить Podkop"
@@ -569,12 +551,6 @@ msgstr "Sing-box"
msgid "Sing-box autostart disabled" msgid "Sing-box autostart disabled"
msgstr "Автостарт sing-box отключен" msgstr "Автостарт sing-box отключен"
msgid "Sing-box checks"
msgstr "Sing-box проверки"
msgid "Sing-box checks passed"
msgstr "Sing-box проверки успешно завершены"
msgid "Sing-box installed" msgid "Sing-box installed"
msgstr "Sing-box установлен" msgstr "Sing-box установлен"
@@ -600,10 +576,10 @@ msgid "Specify local IP addresses or subnets whose traffic will always be routed
msgstr "Укажите локальные IP-адреса или подсети, трафик которых всегда будет направляться через настроенный маршрут." msgstr "Укажите локальные IP-адреса или подсети, трафик которых всегда будет направляться через настроенный маршрут."
msgid "Specify remote URLs to download and use domain lists" msgid "Specify remote URLs to download and use domain lists"
msgstr "Укажите удаленные URL-адреса для загрузки и использования списков доменов." msgstr "Укажите URL-адреса для загрузки и использования списков доменов."
msgid "Specify remote URLs to download and use subnet lists" msgid "Specify remote URLs to download and use subnet lists"
msgstr "Укажите удаленные URL-адреса для загрузки и использования списков подсетей." msgstr "Укажите URL-адреса для загрузки и использования списков подсетей."
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 "Укажите путь к файлу списка, расположенному в файловой системе маршрутизатора."
@@ -620,11 +596,14 @@ msgstr "Успешно скопировано!"
msgid "System info" msgid "System info"
msgstr "Системная информация" msgstr "Системная информация"
msgid "System information"
msgstr "Системная информация"
msgid "Table exist" msgid "Table exist"
msgstr "Таблица существует" msgstr "Таблица существует"
msgid "Test latency" msgid "Test latency"
msgstr "Измерить задержки" msgstr "Тестирование задержки"
msgid "Text List" msgid "Text List"
msgstr "Текстовый список" msgstr "Текстовый список"
@@ -644,6 +623,9 @@ msgstr "Трафик"
msgid "Traffic Total" msgid "Traffic Total"
msgstr "Всего трафика" msgstr "Всего трафика"
msgid "Troubleshooting"
msgstr "Устранение неполадок"
msgid "TTL must be a positive number" msgid "TTL must be a positive number"
msgstr "TTL должно быть положительным числом" msgstr "TTL должно быть положительным числом"
@@ -704,6 +686,9 @@ msgstr "Ошибки валидации:"
msgid "View logs" msgid "View logs"
msgstr "Посмотреть логи" msgstr "Посмотреть логи"
msgid "Visit Wiki"
msgstr "Перейти в wiki"
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 "Предупреждение: %s нельзя использовать вместе с %s. Предыдущие варианты были удалены." msgstr "Предупреждение: %s нельзя использовать вместе с %s. Предыдущие варианты были удалены."

View File

@@ -15,3 +15,4 @@ export * from './renderCircleCheckBigIcon24';
export * from './renderSquareChartGanttIcon24'; export * from './renderSquareChartGanttIcon24';
export * from './renderCogIcon24'; export * from './renderCogIcon24';
export * from './renderSearchIcon24'; export * from './renderSearchIcon24';
export * from './renderBookOpenTextIcon24';

View File

@@ -0,0 +1,28 @@
import { svgEl } from '../helpers';
export function renderBookOpenTextIcon24() {
const NS = 'http://www.w3.org/2000/svg';
return svgEl(
'svg',
{
xmlns: NS,
viewBox: '0 0 24 24',
fill: 'none',
stroke: 'currentColor',
'stroke-width': '2',
'stroke-linecap': 'round',
'stroke-linejoin': 'round',
class: 'lucide lucide-book-open-text-icon lucide-book-open-text',
},
[
svgEl('path', { d: 'M12 7v14' }),
svgEl('path', { d: 'M16 12h2' }),
svgEl('path', { d: 'M16 8h2' }),
svgEl('path', {
d: 'M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z',
}),
svgEl('path', { d: 'M6 12h2' }),
svgEl('path', { d: 'M6 8h2' }),
],
);
}

View File

@@ -9,7 +9,7 @@ export async function callBaseMethod<T>(
const response = await executeShellCommand({ const response = await executeShellCommand({
command, command,
args: [method as string, ...args], args: [method as string, ...args],
timeout: 10000, timeout: 15000,
}); });
if (response.stdout) { if (response.stdout) {

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],
]), ),
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],
]), ),
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

@@ -1,8 +1,11 @@
import { getCheckTitle } from '../helpers/getCheckTitle';
export enum DIAGNOSTICS_CHECKS { export enum DIAGNOSTICS_CHECKS {
DNS = 'DNS', DNS = 'DNS',
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<
@@ -11,22 +14,27 @@ export const DIAGNOSTICS_CHECKS_MAP: Record<
> = { > = {
[DIAGNOSTICS_CHECKS.DNS]: { [DIAGNOSTICS_CHECKS.DNS]: {
order: 1, order: 1,
title: _('DNS checks'), title: getCheckTitle('DNS'),
code: DIAGNOSTICS_CHECKS.DNS, code: DIAGNOSTICS_CHECKS.DNS,
}, },
[DIAGNOSTICS_CHECKS.SINGBOX]: { [DIAGNOSTICS_CHECKS.SINGBOX]: {
order: 2, order: 2,
title: _('Sing-box checks'), title: getCheckTitle('Sing-box'),
code: DIAGNOSTICS_CHECKS.SINGBOX, code: DIAGNOSTICS_CHECKS.SINGBOX,
}, },
[DIAGNOSTICS_CHECKS.NFT]: { [DIAGNOSTICS_CHECKS.NFT]: {
order: 3, order: 3,
title: _('Nftables checks'), title: getCheckTitle('Nftables'),
code: DIAGNOSTICS_CHECKS.NFT, code: DIAGNOSTICS_CHECKS.NFT,
}, },
[DIAGNOSTICS_CHECKS.FAKEIP]: { [DIAGNOSTICS_CHECKS.OUTBOUNDS]: {
order: 4, order: 4,
title: _('FakeIP checks'), title: getCheckTitle('Outbounds'),
code: DIAGNOSTICS_CHECKS.OUTBOUNDS,
},
[DIAGNOSTICS_CHECKS.FAKEIP]: {
order: 5,
title: getCheckTitle('FakeIP'),
code: DIAGNOSTICS_CHECKS.FAKEIP, code: DIAGNOSTICS_CHECKS.FAKEIP,
}, },
}; };

View File

@@ -3,6 +3,7 @@ import { DIAGNOSTICS_CHECKS_MAP } from './contstants';
import { PodkopShellMethods } from '../../../methods'; import { PodkopShellMethods } from '../../../methods';
import { IDiagnosticsChecksItem } from '../../../services'; import { IDiagnosticsChecksItem } from '../../../services';
import { updateCheckStore } from './updateCheckStore'; import { updateCheckStore } from './updateCheckStore';
import { getMeta } from '../helpers/getMeta';
export async function runDnsCheck() { export async function runDnsCheck() {
const { order, title, code } = DIAGNOSTICS_CHECKS_MAP.DNS; const { order, title, code } = DIAGNOSTICS_CHECKS_MAP.DNS;
@@ -11,7 +12,7 @@ export async function runDnsCheck() {
order, order,
code, code,
title, title,
description: _('Checking dns, please wait'), description: _('Checking, please wait'),
state: 'loading', state: 'loading',
items: [], items: [],
}); });
@@ -23,7 +24,7 @@ export async function runDnsCheck() {
order, order,
code, code,
title, title,
description: _('Cannot receive DNS checks result'), description: _('Cannot receive checks result'),
state: 'error', state: 'error',
items: [], items: [],
}); });
@@ -45,27 +46,19 @@ export async function runDnsCheck() {
Boolean(data.bootstrap_dns_status) || Boolean(data.bootstrap_dns_status) ||
Boolean(data.dns_status); Boolean(data.dns_status);
function getStatus() { const { state, description } = getMeta({ atLeastOneGood, allGood });
if (allGood) {
return 'success';
}
if (atLeastOneGood) {
return 'warning';
}
return 'error';
}
updateCheckStore({ updateCheckStore({
order, order,
code, code,
title, title,
description: _('DNS checks passed'), description,
state: getStatus(), state,
items: [ items: [
...insertIf<IDiagnosticsChecksItem>( ...insertIf<IDiagnosticsChecksItem>(
data.dns_type === 'doh' || data.dns_type === 'dot', data.dns_type === 'doh' ||
data.dns_type === 'dot' ||
!data.bootstrap_dns_status,
[ [
{ {
state: data.bootstrap_dns_status ? 'success' : 'error', state: data.bootstrap_dns_status ? 'success' : 'error',

View File

@@ -3,6 +3,7 @@ import { DIAGNOSTICS_CHECKS_MAP } from './contstants';
import { PodkopShellMethods, RemoteFakeIPMethods } from '../../../methods'; import { PodkopShellMethods, RemoteFakeIPMethods } from '../../../methods';
import { IDiagnosticsChecksItem } from '../../../services'; import { IDiagnosticsChecksItem } from '../../../services';
import { updateCheckStore } from './updateCheckStore'; import { updateCheckStore } from './updateCheckStore';
import { getMeta } from '../helpers/getMeta';
export async function runFakeIPCheck() { export async function runFakeIPCheck() {
const { order, title, code } = DIAGNOSTICS_CHECKS_MAP.FAKEIP; const { order, title, code } = DIAGNOSTICS_CHECKS_MAP.FAKEIP;
@@ -11,7 +12,7 @@ export async function runFakeIPCheck() {
order, order,
code, code,
title, title,
description: _('Checking FakeIP, please wait'), description: _('Checking, please wait'),
state: 'loading', state: 'loading',
items: [], items: [],
}); });
@@ -34,31 +35,7 @@ export async function runFakeIPCheck() {
const atLeastOneGood = const atLeastOneGood =
checks.router && checks.browserFakeIP && checks.differentIP; checks.router && checks.browserFakeIP && checks.differentIP;
function getMeta(): { const { state, description } = getMeta({ atLeastOneGood, allGood });
description: string;
state: 'loading' | 'warning' | 'success' | 'error' | 'skipped';
} {
if (allGood) {
return {
state: 'success',
description: _('FakeIP checks passed'),
};
}
if (atLeastOneGood) {
return {
state: 'warning',
description: _('FakeIP checks partially passed'),
};
}
return {
state: 'error',
description: _('FakeIP checks failed'),
};
}
const { state, description } = getMeta();
updateCheckStore({ updateCheckStore({
order, order,

View File

@@ -1,6 +1,7 @@
import { DIAGNOSTICS_CHECKS_MAP } from './contstants'; import { DIAGNOSTICS_CHECKS_MAP } from './contstants';
import { RemoteFakeIPMethods, PodkopShellMethods } from '../../../methods'; import { RemoteFakeIPMethods, PodkopShellMethods } from '../../../methods';
import { updateCheckStore } from './updateCheckStore'; import { updateCheckStore } from './updateCheckStore';
import { getMeta } from '../helpers/getMeta';
export async function runNftCheck() { export async function runNftCheck() {
const { order, title, code } = DIAGNOSTICS_CHECKS_MAP.NFT; const { order, title, code } = DIAGNOSTICS_CHECKS_MAP.NFT;
@@ -9,7 +10,7 @@ export async function runNftCheck() {
order, order,
code, code,
title, title,
description: _('Checking nftables, please wait'), description: _('Checking, please wait'),
state: 'loading', state: 'loading',
items: [], items: [],
}); });
@@ -24,7 +25,7 @@ export async function runNftCheck() {
order, order,
code, code,
title, title,
description: _('Cannot receive nftables checks result'), description: _('Cannot receive checks result'),
state: 'error', state: 'error',
items: [], items: [],
}); });
@@ -54,26 +55,14 @@ export async function runNftCheck() {
Boolean(data.rules_proxy_counters) || Boolean(data.rules_proxy_counters) ||
!data.rules_other_mark_exist; !data.rules_other_mark_exist;
function getStatus() { const { state, description } = getMeta({ atLeastOneGood, allGood });
if (allGood) {
return 'success';
}
if (atLeastOneGood) {
return 'warning';
}
return 'error';
}
updateCheckStore({ updateCheckStore({
order, order,
code, code,
title, title,
description: allGood description,
? _('Nftables checks passed') state,
: _('Nftables checks partially passed'),
state: getStatus(),
items: [ items: [
{ {
state: data.table_exist ? 'success' : 'error', state: data.table_exist ? 'success' : 'error',

View File

@@ -0,0 +1,131 @@
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?.code ?? ''}] ${selectedProxyDelay}ms`,
};
}
return {
success: false,
latency: `[${selectedOutbound?.code ?? ''}] ${_('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

@@ -1,6 +1,7 @@
import { DIAGNOSTICS_CHECKS_MAP } from './contstants'; import { DIAGNOSTICS_CHECKS_MAP } from './contstants';
import { PodkopShellMethods } from '../../../methods'; import { PodkopShellMethods } from '../../../methods';
import { updateCheckStore } from './updateCheckStore'; import { updateCheckStore } from './updateCheckStore';
import { getMeta } from '../helpers/getMeta';
export async function runSingBoxCheck() { export async function runSingBoxCheck() {
const { order, title, code } = DIAGNOSTICS_CHECKS_MAP.SINGBOX; const { order, title, code } = DIAGNOSTICS_CHECKS_MAP.SINGBOX;
@@ -9,7 +10,7 @@ export async function runSingBoxCheck() {
order, order,
code, code,
title, title,
description: _('Checking sing-box, please wait'), description: _('Checking, please wait'),
state: 'loading', state: 'loading',
items: [], items: [],
}); });
@@ -21,7 +22,7 @@ export async function runSingBoxCheck() {
order, order,
code, code,
title, title,
description: _('Cannot receive Sing-box checks result'), description: _('Cannot receive checks result'),
state: 'error', state: 'error',
items: [], items: [],
}); });
@@ -47,24 +48,14 @@ export async function runSingBoxCheck() {
Boolean(data.sing_box_process_running) || Boolean(data.sing_box_process_running) ||
Boolean(data.sing_box_ports_listening); Boolean(data.sing_box_ports_listening);
function getStatus() { const { state, description } = getMeta({ atLeastOneGood, allGood });
if (allGood) {
return 'success';
}
if (atLeastOneGood) {
return 'warning';
}
return 'error';
}
updateCheckStore({ updateCheckStore({
order, order,
code, code,
title, title,
description: _('Sing-box checks passed'), description,
state: getStatus(), state,
items: [ items: [
{ {
state: data.sing_box_installed ? 'success' : 'error', state: data.sing_box_installed ? 'success' : 'error',

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,
@@ -92,7 +100,7 @@ export const loadingDiagnosticsChecksStore: Pick<
code: DIAGNOSTICS_CHECKS.DNS, code: DIAGNOSTICS_CHECKS.DNS,
title: DIAGNOSTICS_CHECKS_MAP.DNS.title, title: DIAGNOSTICS_CHECKS_MAP.DNS.title,
order: DIAGNOSTICS_CHECKS_MAP.DNS.order, order: DIAGNOSTICS_CHECKS_MAP.DNS.order,
description: _('Queued'), description: _('Pending'),
items: [], items: [],
state: 'skipped', state: 'skipped',
}, },
@@ -100,7 +108,7 @@ export const loadingDiagnosticsChecksStore: Pick<
code: DIAGNOSTICS_CHECKS.SINGBOX, code: DIAGNOSTICS_CHECKS.SINGBOX,
title: DIAGNOSTICS_CHECKS_MAP.SINGBOX.title, title: DIAGNOSTICS_CHECKS_MAP.SINGBOX.title,
order: DIAGNOSTICS_CHECKS_MAP.SINGBOX.order, order: DIAGNOSTICS_CHECKS_MAP.SINGBOX.order,
description: _('Queued'), description: _('Pending'),
items: [], items: [],
state: 'skipped', state: 'skipped',
}, },
@@ -108,7 +116,15 @@ export const loadingDiagnosticsChecksStore: Pick<
code: DIAGNOSTICS_CHECKS.NFT, code: DIAGNOSTICS_CHECKS.NFT,
title: DIAGNOSTICS_CHECKS_MAP.NFT.title, title: DIAGNOSTICS_CHECKS_MAP.NFT.title,
order: DIAGNOSTICS_CHECKS_MAP.NFT.order, order: DIAGNOSTICS_CHECKS_MAP.NFT.order,
description: _('Queued'), description: _('Pending'),
items: [],
state: 'skipped',
},
{
code: DIAGNOSTICS_CHECKS.OUTBOUNDS,
title: DIAGNOSTICS_CHECKS_MAP.OUTBOUNDS.title,
order: DIAGNOSTICS_CHECKS_MAP.OUTBOUNDS.order,
description: _('Pending'),
items: [], items: [],
state: 'skipped', state: 'skipped',
}, },
@@ -116,7 +132,7 @@ export const loadingDiagnosticsChecksStore: Pick<
code: DIAGNOSTICS_CHECKS.FAKEIP, code: DIAGNOSTICS_CHECKS.FAKEIP,
title: DIAGNOSTICS_CHECKS_MAP.FAKEIP.title, title: DIAGNOSTICS_CHECKS_MAP.FAKEIP.title,
order: DIAGNOSTICS_CHECKS_MAP.FAKEIP.order, order: DIAGNOSTICS_CHECKS_MAP.FAKEIP.order,
description: _('Queued'), description: _('Pending'),
items: [], items: [],
state: 'skipped', state: 'skipped',
}, },

View File

@@ -0,0 +1,3 @@
export function getCheckTitle(name: string) {
return `${name} ${_('checks')}`;
}

View File

@@ -0,0 +1,28 @@
interface IGetMetaProps {
allGood: boolean;
atLeastOneGood: boolean;
}
export function getMeta({ allGood, atLeastOneGood }: IGetMetaProps): {
description: string;
state: 'loading' | 'warning' | 'success' | 'error' | 'skipped';
} {
if (allGood) {
return {
state: 'success',
description: _('Checks passed'),
};
}
if (atLeastOneGood) {
return {
state: 'warning',
description: _('Issues detected'),
};
}
return {
state: 'error',
description: _('Checks failed'),
};
}

View File

@@ -16,6 +16,10 @@ import { PodkopShellMethods } from '../../methods';
import { fetchServicesInfo } from '../../fetchers'; import { fetchServicesInfo } from '../../fetchers';
import { normalizeCompiledVersion } from '../../../helpers/normalizeCompiledVersion'; import { normalizeCompiledVersion } from '../../../helpers/normalizeCompiledVersion';
import { renderModal } from '../../../partials'; import { renderModal } from '../../../partials';
import { PODKOP_LUCI_APP_VERSION } from '../../../constants';
import { showToast } from '../../../helpers/showToast';
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();
@@ -218,9 +222,13 @@ async function handleShowGlobalCheck() {
_('Global check'), _('Global check'),
renderModal(globalCheck.data as string, 'global_check'), renderModal(globalCheck.data as string, 'global_check'),
); );
} else {
logger.error('[DIAGNOSTIC]', 'handleShowGlobalCheck - e', globalCheck);
showToast(_('Failed to execute!'), 'error');
} }
} catch (e) { } catch (e) {
logger.error('[DIAGNOSTIC]', 'handleShowGlobalCheck - e', e); logger.error('[DIAGNOSTIC]', 'handleShowGlobalCheck - e', e);
showToast(_('Failed to execute!'), 'error');
} finally { } finally {
store.set({ store.set({
diagnosticsActions: { diagnosticsActions: {
@@ -248,9 +256,13 @@ async function handleViewLogs() {
_('View logs'), _('View logs'),
renderModal(viewLogs.data as string, 'view_logs'), renderModal(viewLogs.data as string, 'view_logs'),
); );
} else {
logger.error('[DIAGNOSTIC]', 'handleViewLogs - e', viewLogs);
showToast(_('Failed to execute!'), 'error');
} }
} catch (e) { } catch (e) {
logger.error('[DIAGNOSTIC]', 'handleViewLogs - e', e); logger.error('[DIAGNOSTIC]', 'handleViewLogs - e', e);
showToast(_('Failed to execute!'), 'error');
} finally { } finally {
store.set({ store.set({
diagnosticsActions: { diagnosticsActions: {
@@ -278,9 +290,17 @@ async function handleShowSingBoxConfig() {
_('Show sing-box config'), _('Show sing-box config'),
renderModal(showSingBoxConfig.data as string, 'show_sing_box_config'), renderModal(showSingBoxConfig.data as string, 'show_sing_box_config'),
); );
} else {
logger.error(
'[DIAGNOSTIC]',
'handleShowSingBoxConfig - e',
showSingBoxConfig,
);
showToast(_('Failed to execute!'), 'error');
} }
} catch (e) { } catch (e) {
logger.error('[DIAGNOSTIC]', 'handleShowSingBoxConfig - e', e); logger.error('[DIAGNOSTIC]', 'handleShowSingBoxConfig - e', e);
showToast(_('Failed to execute!'), 'error');
} finally { } finally {
store.set({ store.set({
diagnosticsActions: { diagnosticsActions: {
@@ -291,6 +311,30 @@ async function handleShowSingBoxConfig() {
} }
} }
function renderWikiDisclaimerWidget() {
const diagnosticsChecks = store.get().diagnosticsChecks;
function getWikiKind() {
const allResults = diagnosticsChecks.map((check) => check.state);
if (allResults.includes('error')) {
return 'error';
}
if (allResults.includes('warning')) {
return 'warning';
}
return 'default';
}
const container = document.getElementById('pdk_diagnostic-page-wiki');
return preserveScrollForPage(() => {
container!.replaceChildren(renderWikiDisclaimer(getWikiKind()));
});
}
function renderDiagnosticAvailableActionsWidget() { function renderDiagnosticAvailableActionsWidget() {
const diagnosticsActions = store.get().diagnosticsActions; const diagnosticsActions = store.get().diagnosticsActions;
const servicesInfoWidget = store.get().servicesInfoWidget; const servicesInfoWidget = store.get().servicesInfoWidget;
@@ -386,7 +430,12 @@ function renderDiagnosticSystemInfoWidget() {
}; };
} }
if (version !== diagnosticsSystemInfo.podkop_latest_version) { if (version !== `v${diagnosticsSystemInfo.podkop_latest_version}`) {
logger.debug(
'[DIAGNOSTIC]',
'diagnosticsSystemInfo',
diagnosticsSystemInfo,
);
return { return {
key: 'Podkop', key: 'Podkop',
value: version, value: version,
@@ -412,7 +461,7 @@ function renderDiagnosticSystemInfoWidget() {
getPodkopVersionRow(), getPodkopVersionRow(),
{ {
key: 'Luci App', key: 'Luci App',
value: normalizeCompiledVersion(diagnosticsSystemInfo.luci_app_version), value: normalizeCompiledVersion(PODKOP_LUCI_APP_VERSION),
}, },
{ {
key: 'Sing-box', key: 'Sing-box',
@@ -441,6 +490,7 @@ async function onStoreUpdate(
) { ) {
if (diff.diagnosticsChecks) { if (diff.diagnosticsChecks) {
renderDiagnosticsChecks(); renderDiagnosticsChecks();
renderWikiDisclaimerWidget();
} }
if (diff.diagnosticsRunAction) { if (diff.diagnosticsRunAction) {
@@ -469,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);
@@ -496,6 +548,9 @@ function onPageMount() {
// Initial system info render // Initial system info render
renderDiagnosticSystemInfoWidget(); renderDiagnosticSystemInfoWidget();
// Initial Wiki disclaimer render
renderWikiDisclaimerWidget();
// Initial services info fetch // Initial services info fetch
fetchServicesInfo(); fetchServicesInfo();

View File

@@ -40,7 +40,7 @@ export function renderAvailableActions({
showSingBoxConfig, showSingBoxConfig,
}: IRenderAvailableActionsProps) { }: IRenderAvailableActionsProps) {
return E('div', { class: 'pdk_diagnostic-page__right-bar__actions' }, [ return E('div', { class: 'pdk_diagnostic-page__right-bar__actions' }, [
E('b', {}, 'Available actions'), E('b', {}, _('Available actions')),
...insertIf(restart.visible, [ ...insertIf(restart.visible, [
renderButton({ renderButton({
classNames: ['cbi-button-apply'], classNames: ['cbi-button-apply'],

View File

@@ -18,7 +18,7 @@ export function renderSystemInfo({ items }: IRenderSystemInfoProps) {
E( E(
'b', 'b',
{ class: 'pdk_diagnostic-page__right-bar__system-info__title' }, { class: 'pdk_diagnostic-page__right-bar__system-info__title' },
'System information', _('System information'),
), ),
...items.map((item) => { ...items.map((item) => {
const tagClass = [ const tagClass = [

View File

@@ -0,0 +1,40 @@
import { renderBookOpenTextIcon24 } from '../../../../icons';
import { renderButton } from '../../../../partials';
import { insertIf } from '../../../../helpers';
export function renderWikiDisclaimer(kind: 'default' | 'error' | 'warning') {
const iconWrap = E('span', {
class: 'pdk_diagnostic-page__right-bar__wiki__icon',
});
iconWrap.appendChild(renderBookOpenTextIcon24());
const className = [
'pdk_diagnostic-page__right-bar__wiki',
...insertIf(kind === 'error', [
'pdk_diagnostic-page__right-bar__wiki--error',
]),
...insertIf(kind === 'warning', [
'pdk_diagnostic-page__right-bar__wiki--warning',
]),
].join(' ');
return E('div', { class: className }, [
E('div', { class: 'pdk_diagnostic-page__right-bar__wiki__content' }, [
iconWrap,
E('div', { class: 'pdk_diagnostic-page__right-bar__wiki__texts' }, [
E('b', {}, _('Troubleshooting')),
E('div', {}, _('Do not panic, everything can be fixed, just...')),
]),
]),
renderButton({
classNames: ['cbi-button-save'],
text: _('Visit Wiki'),
onClick: () =>
window.open(
'https://podkop.net/docs/troubleshooting/?utm_source=podkop',
'_blank',
'noopener,noreferrer',
),
}),
]);
}

View File

@@ -8,6 +8,7 @@ export function render() {
}), }),
]), ]),
E('div', { class: 'pdk_diagnostic-page__right-bar' }, [ E('div', { class: 'pdk_diagnostic-page__right-bar' }, [
E('div', { id: 'pdk_diagnostic-page-wiki' }),
E('div', { id: 'pdk_diagnostic-page-actions' }), E('div', { id: 'pdk_diagnostic-page-actions' }),
E('div', { id: 'pdk_diagnostic-page-system-info' }), E('div', { id: 'pdk_diagnostic-page-system-info' }),
]), ]),

View File

@@ -28,6 +28,31 @@ export const styles = `
grid-row-gap: 10px; grid-row-gap: 10px;
} }
.pdk_diagnostic-page__right-bar__wiki {
border: 2px var(--background-color-low, lightgray) solid;
border-radius: 4px;
padding: 10px;
display: grid;
grid-template-columns: auto;
grid-row-gap: 10px;
}
.pdk_diagnostic-page__right-bar__wiki--warning {
border: 2px var(--warn-color-medium, orange) solid;
}
.pdk_diagnostic-page__right-bar__wiki--error {
border: 2px var(--error-color-medium, red) solid;
}
.pdk_diagnostic-page__right-bar__wiki__content {
display: grid;
grid-template-columns: 1fr 5fr;
grid-column-gap: 10px;
}
.pdk_diagnostic-page__right-bar__wiki__texts {}
.pdk_diagnostic-page__right-bar__actions { .pdk_diagnostic-page__right-bar__actions {
border: 2px var(--background-color-low, lightgray) solid; border: 2px var(--background-color-low, lightgray) solid;
border-radius: 4px; border-radius: 4px;

View File

@@ -196,4 +196,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

@@ -3,7 +3,18 @@ import { validateDNS } from '../validateDns.js';
import { invalidIPs, validIPs } from './validateIp.test'; import { invalidIPs, validIPs } from './validateIp.test';
import { invalidDomains, validDomains } from './validateDomain.test'; import { invalidDomains, validDomains } from './validateDomain.test';
const validDns = [...validIPs, ...validDomains]; export const additionalValidDns = [
['Google DNS (port 53)', '8.8.8.8:53'],
['Google DNS (port 5353)', '8.8.8.8:5353'],
['Cloudflare DNS (port 853)', '1.1.1.1:853'],
['Cloudflare domain (port 853)', 'cloudflare-dns.com:853'],
['DoH IP', '1.1.1.1/dns-query'],
['DoH IP with port 443', '1.1.1.1:443/dns-query'],
['DoH domain', 'cloudflare-dns.com/dns-query'],
['DoH domain with port 443', 'cloudflare-dns.com:443/dns-query'],
];
const validDns = [...validIPs, ...validDomains, ...additionalValidDns];
const invalidDns = [...invalidIPs, ...invalidDomains]; const invalidDns = [...invalidIPs, ...invalidDomains];

View File

@@ -7,11 +7,14 @@ export function validateDNS(value: string): ValidationResult {
return { valid: false, message: _('DNS server address cannot be empty') }; return { valid: false, message: _('DNS server address cannot be empty') };
} }
if (validateIPV4(value).valid) { const cleanedValueWithoutPort = value.replace(/:(\d+)(?=\/|$)/, '');
const cleanedIpWithoutPath = cleanedValueWithoutPort.split('/')[0];
if (validateIPV4(cleanedIpWithoutPath).valid) {
return { valid: true, message: _('Valid') }; return { valid: true, message: _('Valid') };
} }
if (validateDomain(value).valid) { if (validateDomain(cleanedValueWithoutPort).valid) {
return { valid: true, message: _('Valid') }; return { valid: true, message: _('Valid') };
} }

View File

@@ -6,20 +6,22 @@ import { validateSocksUrl } from './validateSocksUrl';
// TODO refactor current validation and add tests // TODO refactor current validation and add tests
export function validateProxyUrl(url: string): ValidationResult { export function validateProxyUrl(url: string): ValidationResult {
if (url.startsWith('ss://')) { const trimmedUrl = url.trim();
return validateShadowsocksUrl(url);
if (trimmedUrl.startsWith('ss://')) {
return validateShadowsocksUrl(trimmedUrl);
} }
if (url.startsWith('vless://')) { if (trimmedUrl.startsWith('vless://')) {
return validateVlessUrl(url); return validateVlessUrl(trimmedUrl);
} }
if (url.startsWith('trojan://')) { if (trimmedUrl.startsWith('trojan://')) {
return validateTrojanUrl(url); return validateTrojanUrl(trimmedUrl);
} }
if (/^socks(4|4a|5):\/\//.test(url)) { if (/^socks(4|4a|5):\/\//.test(trimmedUrl)) {
return validateSocksUrl(url); return validateSocksUrl(trimmedUrl);
} }
return { return {

View File

@@ -43,7 +43,8 @@ export function validateVlessUrl(url: string): ValidationResult {
if (!port) if (!port)
return { valid: false, message: 'Invalid VLESS URL: missing port' }; return { valid: false, message: 'Invalid VLESS URL: missing port' };
const portNum = Number(port); const cleanedPort = port.replace('/', '');
const portNum = Number(cleanedPort);
if (!Number.isInteger(portNum) || portNum < 1 || portNum > 65535) if (!Number.isInteger(portNum) || portNum < 1 || portNum > 65535)
return { return {
valid: false, valid: false,

View File

@@ -240,7 +240,7 @@ check_system() {
exit 1 exit 1
fi fi
Check version # Check version
if command -v podkop > /dev/null 2>&1; then if command -v podkop > /dev/null 2>&1; then
local version local version
version=$(/usr/bin/podkop show_version 2> /dev/null) version=$(/usr/bin/podkop show_version 2> /dev/null)

View File

@@ -40,10 +40,12 @@ function validateDNS(value) {
if (!value) { if (!value) {
return { valid: false, message: _("DNS server address cannot be empty") }; return { valid: false, message: _("DNS server address cannot be empty") };
} }
if (validateIPV4(value).valid) { const cleanedValueWithoutPort = value.replace(/:(\d+)(?=\/|$)/, "");
const cleanedIpWithoutPath = cleanedValueWithoutPort.split("/")[0];
if (validateIPV4(cleanedIpWithoutPath).valid) {
return { valid: true, message: _("Valid") }; return { valid: true, message: _("Valid") };
} }
if (validateDomain(value).valid) { if (validateDomain(cleanedValueWithoutPort).valid) {
return { valid: true, message: _("Valid") }; return { valid: true, message: _("Valid") };
} }
return { return {
@@ -259,7 +261,8 @@ function validateVlessUrl(url) {
return { valid: false, message: "Invalid VLESS URL: missing hostname" }; return { valid: false, message: "Invalid VLESS URL: missing hostname" };
if (!port) if (!port)
return { valid: false, message: "Invalid VLESS URL: missing port" }; return { valid: false, message: "Invalid VLESS URL: missing port" };
const portNum = Number(port); const cleanedPort = port.replace("/", "");
const portNum = Number(cleanedPort);
if (!Number.isInteger(portNum) || portNum < 1 || portNum > 65535) if (!Number.isInteger(portNum) || portNum < 1 || portNum > 65535)
return { return {
valid: false, valid: false,
@@ -451,17 +454,18 @@ function validateSocksUrl(url) {
// src/validators/validateProxyUrl.ts // src/validators/validateProxyUrl.ts
function validateProxyUrl(url) { function validateProxyUrl(url) {
if (url.startsWith("ss://")) { const trimmedUrl = url.trim();
return validateShadowsocksUrl(url); if (trimmedUrl.startsWith("ss://")) {
return validateShadowsocksUrl(trimmedUrl);
} }
if (url.startsWith("vless://")) { if (trimmedUrl.startsWith("vless://")) {
return validateVlessUrl(url); return validateVlessUrl(trimmedUrl);
} }
if (url.startsWith("trojan://")) { if (trimmedUrl.startsWith("trojan://")) {
return validateTrojanUrl(url); return validateTrojanUrl(trimmedUrl);
} }
if (/^socks(4|4a|5):\/\//.test(url)) { if (/^socks(4|4a|5):\/\//.test(trimmedUrl)) {
return validateSocksUrl(url); return validateSocksUrl(trimmedUrl);
} }
return { return {
valid: false, valid: false,
@@ -486,7 +490,7 @@ async function callBaseMethod(method, args = [], command = "/usr/bin/podkop") {
const response = await executeShellCommand({ const response = await executeShellCommand({
command, command,
args: [method, ...args], args: [method, ...args],
timeout: 1e4 timeout: 15e3
}); });
if (response.stdout) { if (response.stdout) {
try { try {
@@ -559,14 +563,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]
]), ),
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]
]), ),
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,
@@ -978,26 +982,36 @@ var TabService = class _TabService {
}; };
var TabServiceInstance = TabService.getInstance(); var TabServiceInstance = TabService.getInstance();
// src/podkop/tabs/diagnostic/helpers/getCheckTitle.ts
function getCheckTitle(name) {
return `${name} ${_("checks")}`;
}
// src/podkop/tabs/diagnostic/checks/contstants.ts // src/podkop/tabs/diagnostic/checks/contstants.ts
var DIAGNOSTICS_CHECKS_MAP = { var DIAGNOSTICS_CHECKS_MAP = {
["DNS" /* DNS */]: { ["DNS" /* DNS */]: {
order: 1, order: 1,
title: _("DNS checks"), title: getCheckTitle("DNS"),
code: "DNS" /* DNS */ code: "DNS" /* DNS */
}, },
["SINGBOX" /* SINGBOX */]: { ["SINGBOX" /* SINGBOX */]: {
order: 2, order: 2,
title: _("Sing-box checks"), title: getCheckTitle("Sing-box"),
code: "SINGBOX" /* SINGBOX */ code: "SINGBOX" /* SINGBOX */
}, },
["NFT" /* NFT */]: { ["NFT" /* NFT */]: {
order: 3, order: 3,
title: _("Nftables checks"), title: getCheckTitle("Nftables"),
code: "NFT" /* NFT */ code: "NFT" /* NFT */
}, },
["FAKEIP" /* FAKEIP */]: { ["OUTBOUNDS" /* OUTBOUNDS */]: {
order: 4, order: 4,
title: _("FakeIP checks"), title: getCheckTitle("Outbounds"),
code: "OUTBOUNDS" /* OUTBOUNDS */
},
["FAKEIP" /* FAKEIP */]: {
order: 5,
title: getCheckTitle("FakeIP"),
code: "FAKEIP" /* FAKEIP */ code: "FAKEIP" /* FAKEIP */
} }
}; };
@@ -1065,6 +1079,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,
@@ -1081,7 +1103,7 @@ var loadingDiagnosticsChecksStore = {
code: "DNS" /* DNS */, code: "DNS" /* DNS */,
title: DIAGNOSTICS_CHECKS_MAP.DNS.title, title: DIAGNOSTICS_CHECKS_MAP.DNS.title,
order: DIAGNOSTICS_CHECKS_MAP.DNS.order, order: DIAGNOSTICS_CHECKS_MAP.DNS.order,
description: _("Queued"), description: _("Pending"),
items: [], items: [],
state: "skipped" state: "skipped"
}, },
@@ -1089,7 +1111,7 @@ var loadingDiagnosticsChecksStore = {
code: "SINGBOX" /* SINGBOX */, code: "SINGBOX" /* SINGBOX */,
title: DIAGNOSTICS_CHECKS_MAP.SINGBOX.title, title: DIAGNOSTICS_CHECKS_MAP.SINGBOX.title,
order: DIAGNOSTICS_CHECKS_MAP.SINGBOX.order, order: DIAGNOSTICS_CHECKS_MAP.SINGBOX.order,
description: _("Queued"), description: _("Pending"),
items: [], items: [],
state: "skipped" state: "skipped"
}, },
@@ -1097,7 +1119,15 @@ var loadingDiagnosticsChecksStore = {
code: "NFT" /* NFT */, code: "NFT" /* NFT */,
title: DIAGNOSTICS_CHECKS_MAP.NFT.title, title: DIAGNOSTICS_CHECKS_MAP.NFT.title,
order: DIAGNOSTICS_CHECKS_MAP.NFT.order, order: DIAGNOSTICS_CHECKS_MAP.NFT.order,
description: _("Queued"), description: _("Pending"),
items: [],
state: "skipped"
},
{
code: "OUTBOUNDS" /* OUTBOUNDS */,
title: DIAGNOSTICS_CHECKS_MAP.OUTBOUNDS.title,
order: DIAGNOSTICS_CHECKS_MAP.OUTBOUNDS.order,
description: _("Pending"),
items: [], items: [],
state: "skipped" state: "skipped"
}, },
@@ -1105,7 +1135,7 @@ var loadingDiagnosticsChecksStore = {
code: "FAKEIP" /* FAKEIP */, code: "FAKEIP" /* FAKEIP */,
title: DIAGNOSTICS_CHECKS_MAP.FAKEIP.title, title: DIAGNOSTICS_CHECKS_MAP.FAKEIP.title,
order: DIAGNOSTICS_CHECKS_MAP.FAKEIP.order, order: DIAGNOSTICS_CHECKS_MAP.FAKEIP.order,
description: _("Queued"), description: _("Pending"),
items: [], items: [],
state: "skipped" state: "skipped"
} }
@@ -2335,6 +2365,7 @@ function render2() {
}) })
]), ]),
E("div", { class: "pdk_diagnostic-page__right-bar" }, [ E("div", { class: "pdk_diagnostic-page__right-bar" }, [
E("div", { id: "pdk_diagnostic-page-wiki" }),
E("div", { id: "pdk_diagnostic-page-actions" }), E("div", { id: "pdk_diagnostic-page-actions" }),
E("div", { id: "pdk_diagnostic-page-system-info" }) E("div", { id: "pdk_diagnostic-page-system-info" })
]) ])
@@ -2355,6 +2386,26 @@ function updateCheckStore(check, minified) {
}); });
} }
// src/podkop/tabs/diagnostic/helpers/getMeta.ts
function getMeta({ allGood, atLeastOneGood }) {
if (allGood) {
return {
state: "success",
description: _("Checks passed")
};
}
if (atLeastOneGood) {
return {
state: "warning",
description: _("Issues detected")
};
}
return {
state: "error",
description: _("Checks failed")
};
}
// src/podkop/tabs/diagnostic/checks/runDnsCheck.ts // src/podkop/tabs/diagnostic/checks/runDnsCheck.ts
async function runDnsCheck() { async function runDnsCheck() {
const { order, title, code } = DIAGNOSTICS_CHECKS_MAP.DNS; const { order, title, code } = DIAGNOSTICS_CHECKS_MAP.DNS;
@@ -2362,7 +2413,7 @@ async function runDnsCheck() {
order, order,
code, code,
title, title,
description: _("Checking dns, please wait"), description: _("Checking, please wait"),
state: "loading", state: "loading",
items: [] items: []
}); });
@@ -2372,7 +2423,7 @@ async function runDnsCheck() {
order, order,
code, code,
title, title,
description: _("Cannot receive DNS checks result"), description: _("Cannot receive checks result"),
state: "error", state: "error",
items: [] items: []
}); });
@@ -2381,24 +2432,16 @@ async function runDnsCheck() {
const data = dnsChecks.data; const data = dnsChecks.data;
const allGood = Boolean(data.dns_on_router) && Boolean(data.dhcp_config_status) && Boolean(data.bootstrap_dns_status) && Boolean(data.dns_status); const allGood = Boolean(data.dns_on_router) && Boolean(data.dhcp_config_status) && Boolean(data.bootstrap_dns_status) && Boolean(data.dns_status);
const atLeastOneGood = Boolean(data.dns_on_router) || Boolean(data.dhcp_config_status) || Boolean(data.bootstrap_dns_status) || Boolean(data.dns_status); const atLeastOneGood = Boolean(data.dns_on_router) || Boolean(data.dhcp_config_status) || Boolean(data.bootstrap_dns_status) || Boolean(data.dns_status);
function getStatus() { const { state, description } = getMeta({ atLeastOneGood, allGood });
if (allGood) {
return "success";
}
if (atLeastOneGood) {
return "warning";
}
return "error";
}
updateCheckStore({ updateCheckStore({
order, order,
code, code,
title, title,
description: _("DNS checks passed"), description,
state: getStatus(), state,
items: [ items: [
...insertIf( ...insertIf(
data.dns_type === "doh" || data.dns_type === "dot", data.dns_type === "doh" || data.dns_type === "dot" || !data.bootstrap_dns_status,
[ [
{ {
state: data.bootstrap_dns_status ? "success" : "error", state: data.bootstrap_dns_status ? "success" : "error",
@@ -2436,7 +2479,7 @@ async function runSingBoxCheck() {
order, order,
code, code,
title, title,
description: _("Checking sing-box, please wait"), description: _("Checking, please wait"),
state: "loading", state: "loading",
items: [] items: []
}); });
@@ -2446,7 +2489,7 @@ async function runSingBoxCheck() {
order, order,
code, code,
title, title,
description: _("Cannot receive Sing-box checks result"), description: _("Cannot receive checks result"),
state: "error", state: "error",
items: [] items: []
}); });
@@ -2455,21 +2498,13 @@ async function runSingBoxCheck() {
const data = singBoxChecks.data; const data = singBoxChecks.data;
const allGood = Boolean(data.sing_box_installed) && Boolean(data.sing_box_version_ok) && Boolean(data.sing_box_service_exist) && Boolean(data.sing_box_autostart_disabled) && Boolean(data.sing_box_process_running) && Boolean(data.sing_box_ports_listening); const allGood = Boolean(data.sing_box_installed) && Boolean(data.sing_box_version_ok) && Boolean(data.sing_box_service_exist) && Boolean(data.sing_box_autostart_disabled) && Boolean(data.sing_box_process_running) && Boolean(data.sing_box_ports_listening);
const atLeastOneGood = Boolean(data.sing_box_installed) || Boolean(data.sing_box_version_ok) || Boolean(data.sing_box_service_exist) || Boolean(data.sing_box_autostart_disabled) || Boolean(data.sing_box_process_running) || Boolean(data.sing_box_ports_listening); const atLeastOneGood = Boolean(data.sing_box_installed) || Boolean(data.sing_box_version_ok) || Boolean(data.sing_box_service_exist) || Boolean(data.sing_box_autostart_disabled) || Boolean(data.sing_box_process_running) || Boolean(data.sing_box_ports_listening);
function getStatus() { const { state, description } = getMeta({ atLeastOneGood, allGood });
if (allGood) {
return "success";
}
if (atLeastOneGood) {
return "warning";
}
return "error";
}
updateCheckStore({ updateCheckStore({
order, order,
code, code,
title, title,
description: _("Sing-box checks passed"), description,
state: getStatus(), state,
items: [ items: [
{ {
state: data.sing_box_installed ? "success" : "error", state: data.sing_box_installed ? "success" : "error",
@@ -2515,7 +2550,7 @@ async function runNftCheck() {
order, order,
code, code,
title, title,
description: _("Checking nftables, please wait"), description: _("Checking, please wait"),
state: "loading", state: "loading",
items: [] items: []
}); });
@@ -2527,7 +2562,7 @@ async function runNftCheck() {
order, order,
code, code,
title, title,
description: _("Cannot receive nftables checks result"), description: _("Cannot receive checks result"),
state: "error", state: "error",
items: [] items: []
}); });
@@ -2536,21 +2571,13 @@ async function runNftCheck() {
const data = nftablesChecks.data; const data = nftablesChecks.data;
const allGood = Boolean(data.table_exist) && Boolean(data.rules_mangle_exist) && Boolean(data.rules_mangle_counters) && Boolean(data.rules_mangle_output_exist) && Boolean(data.rules_mangle_output_counters) && Boolean(data.rules_proxy_exist) && Boolean(data.rules_proxy_counters) && !data.rules_other_mark_exist; const allGood = Boolean(data.table_exist) && Boolean(data.rules_mangle_exist) && Boolean(data.rules_mangle_counters) && Boolean(data.rules_mangle_output_exist) && Boolean(data.rules_mangle_output_counters) && Boolean(data.rules_proxy_exist) && Boolean(data.rules_proxy_counters) && !data.rules_other_mark_exist;
const atLeastOneGood = Boolean(data.table_exist) || Boolean(data.rules_mangle_exist) || Boolean(data.rules_mangle_counters) || Boolean(data.rules_mangle_output_exist) || Boolean(data.rules_mangle_output_counters) || Boolean(data.rules_proxy_exist) || Boolean(data.rules_proxy_counters) || !data.rules_other_mark_exist; const atLeastOneGood = Boolean(data.table_exist) || Boolean(data.rules_mangle_exist) || Boolean(data.rules_mangle_counters) || Boolean(data.rules_mangle_output_exist) || Boolean(data.rules_mangle_output_counters) || Boolean(data.rules_proxy_exist) || Boolean(data.rules_proxy_counters) || !data.rules_other_mark_exist;
function getStatus() { const { state, description } = getMeta({ atLeastOneGood, allGood });
if (allGood) {
return "success";
}
if (atLeastOneGood) {
return "warning";
}
return "error";
}
updateCheckStore({ updateCheckStore({
order, order,
code, code,
title, title,
description: allGood ? _("Nftables checks passed") : _("Nftables checks partially passed"), description,
state: getStatus(), state,
items: [ items: [
{ {
state: data.table_exist ? "success" : "error", state: data.table_exist ? "success" : "error",
@@ -2606,7 +2633,7 @@ async function runFakeIPCheck() {
order, order,
code, code,
title, title,
description: _("Checking FakeIP, please wait"), description: _("Checking, please wait"),
state: "loading", state: "loading",
items: [] items: []
}); });
@@ -2620,25 +2647,7 @@ async function runFakeIPCheck() {
}; };
const allGood = checks.router || checks.browserFakeIP || checks.differentIP; const allGood = checks.router || checks.browserFakeIP || checks.differentIP;
const atLeastOneGood = checks.router && checks.browserFakeIP && checks.differentIP; const atLeastOneGood = checks.router && checks.browserFakeIP && checks.differentIP;
function getMeta() { const { state, description } = getMeta({ atLeastOneGood, allGood });
if (allGood) {
return {
state: "success",
description: _("FakeIP checks passed")
};
}
if (atLeastOneGood) {
return {
state: "warning",
description: _("FakeIP checks partially passed")
};
}
return {
state: "error",
description: _("FakeIP checks failed")
};
}
const { state, description } = getMeta();
updateCheckStore({ updateCheckStore({
order, order,
code, code,
@@ -3211,6 +3220,34 @@ function renderSearchIcon24() {
); );
} }
// src/icons/renderBookOpenTextIcon24.ts
function renderBookOpenTextIcon24() {
const NS = "http://www.w3.org/2000/svg";
return svgEl(
"svg",
{
xmlns: NS,
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
"stroke-width": "2",
"stroke-linecap": "round",
"stroke-linejoin": "round",
class: "lucide lucide-book-open-text-icon lucide-book-open-text"
},
[
svgEl("path", { d: "M12 7v14" }),
svgEl("path", { d: "M16 12h2" }),
svgEl("path", { d: "M16 8h2" }),
svgEl("path", {
d: "M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z"
}),
svgEl("path", { d: "M6 12h2" }),
svgEl("path", { d: "M6 8h2" })
]
);
}
// src/partials/button/renderButton.ts // src/partials/button/renderButton.ts
function renderButton({ function renderButton({
classNames = [], classNames = [],
@@ -3341,7 +3378,7 @@ function renderAvailableActions({
showSingBoxConfig showSingBoxConfig
}) { }) {
return E("div", { class: "pdk_diagnostic-page__right-bar__actions" }, [ return E("div", { class: "pdk_diagnostic-page__right-bar__actions" }, [
E("b", {}, "Available actions"), E("b", {}, _("Available actions")),
...insertIf(restart.visible, [ ...insertIf(restart.visible, [
renderButton({ renderButton({
classNames: ["cbi-button-apply"], classNames: ["cbi-button-apply"],
@@ -3599,7 +3636,7 @@ function renderSystemInfo({ items }) {
E( E(
"b", "b",
{ class: "pdk_diagnostic-page__right-bar__system-info__title" }, { class: "pdk_diagnostic-page__right-bar__system-info__title" },
"System information" _("System information")
), ),
...items.map((item) => { ...items.map((item) => {
const tagClass = [ const tagClass = [
@@ -3634,6 +3671,140 @@ function normalizeCompiledVersion(version) {
return version; return version;
} }
// src/podkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts
function renderWikiDisclaimer(kind) {
const iconWrap = E("span", {
class: "pdk_diagnostic-page__right-bar__wiki__icon"
});
iconWrap.appendChild(renderBookOpenTextIcon24());
const className = [
"pdk_diagnostic-page__right-bar__wiki",
...insertIf(kind === "error", [
"pdk_diagnostic-page__right-bar__wiki--error"
]),
...insertIf(kind === "warning", [
"pdk_diagnostic-page__right-bar__wiki--warning"
])
].join(" ");
return E("div", { class: className }, [
E("div", { class: "pdk_diagnostic-page__right-bar__wiki__content" }, [
iconWrap,
E("div", { class: "pdk_diagnostic-page__right-bar__wiki__texts" }, [
E("b", {}, _("Troubleshooting")),
E("div", {}, _("Do not panic, everything can be fixed, just..."))
])
]),
renderButton({
classNames: ["cbi-button-save"],
text: _("Visit Wiki"),
onClick: () => window.open(
"https://podkop.net/docs/troubleshooting/?utm_source=podkop",
"_blank",
"noopener,noreferrer"
)
})
]);
}
// 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?.code ?? ""}] ${selectedProxyDelay}ms`
};
}
return {
success: false,
latency: `[${selectedOutbound?.code ?? ""}] ${_("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();
@@ -3813,9 +3984,13 @@ async function handleShowGlobalCheck() {
_("Global check"), _("Global check"),
renderModal(globalCheck.data, "global_check") renderModal(globalCheck.data, "global_check")
); );
} else {
logger.error("[DIAGNOSTIC]", "handleShowGlobalCheck - e", globalCheck);
showToast(_("Failed to execute!"), "error");
} }
} catch (e) { } catch (e) {
logger.error("[DIAGNOSTIC]", "handleShowGlobalCheck - e", e); logger.error("[DIAGNOSTIC]", "handleShowGlobalCheck - e", e);
showToast(_("Failed to execute!"), "error");
} finally { } finally {
store.set({ store.set({
diagnosticsActions: { diagnosticsActions: {
@@ -3840,9 +4015,13 @@ async function handleViewLogs() {
_("View logs"), _("View logs"),
renderModal(viewLogs.data, "view_logs") renderModal(viewLogs.data, "view_logs")
); );
} else {
logger.error("[DIAGNOSTIC]", "handleViewLogs - e", viewLogs);
showToast(_("Failed to execute!"), "error");
} }
} catch (e) { } catch (e) {
logger.error("[DIAGNOSTIC]", "handleViewLogs - e", e); logger.error("[DIAGNOSTIC]", "handleViewLogs - e", e);
showToast(_("Failed to execute!"), "error");
} finally { } finally {
store.set({ store.set({
diagnosticsActions: { diagnosticsActions: {
@@ -3867,9 +4046,17 @@ async function handleShowSingBoxConfig() {
_("Show sing-box config"), _("Show sing-box config"),
renderModal(showSingBoxConfig.data, "show_sing_box_config") renderModal(showSingBoxConfig.data, "show_sing_box_config")
); );
} else {
logger.error(
"[DIAGNOSTIC]",
"handleShowSingBoxConfig - e",
showSingBoxConfig
);
showToast(_("Failed to execute!"), "error");
} }
} catch (e) { } catch (e) {
logger.error("[DIAGNOSTIC]", "handleShowSingBoxConfig - e", e); logger.error("[DIAGNOSTIC]", "handleShowSingBoxConfig - e", e);
showToast(_("Failed to execute!"), "error");
} finally { } finally {
store.set({ store.set({
diagnosticsActions: { diagnosticsActions: {
@@ -3879,6 +4066,23 @@ async function handleShowSingBoxConfig() {
}); });
} }
} }
function renderWikiDisclaimerWidget() {
const diagnosticsChecks = store.get().diagnosticsChecks;
function getWikiKind() {
const allResults = diagnosticsChecks.map((check) => check.state);
if (allResults.includes("error")) {
return "error";
}
if (allResults.includes("warning")) {
return "warning";
}
return "default";
}
const container = document.getElementById("pdk_diagnostic-page-wiki");
return preserveScrollForPage(() => {
container.replaceChildren(renderWikiDisclaimer(getWikiKind()));
});
}
function renderDiagnosticAvailableActionsWidget() { function renderDiagnosticAvailableActionsWidget() {
const diagnosticsActions = store.get().diagnosticsActions; const diagnosticsActions = store.get().diagnosticsActions;
const servicesInfoWidget = store.get().servicesInfoWidget; const servicesInfoWidget = store.get().servicesInfoWidget;
@@ -3961,7 +4165,12 @@ function renderDiagnosticSystemInfoWidget() {
value: version value: version
}; };
} }
if (version !== diagnosticsSystemInfo.podkop_latest_version) { if (version !== `v${diagnosticsSystemInfo.podkop_latest_version}`) {
logger.debug(
"[DIAGNOSTIC]",
"diagnosticsSystemInfo",
diagnosticsSystemInfo
);
return { return {
key: "Podkop", key: "Podkop",
value: version, value: version,
@@ -3985,7 +4194,7 @@ function renderDiagnosticSystemInfoWidget() {
getPodkopVersionRow(), getPodkopVersionRow(),
{ {
key: "Luci App", key: "Luci App",
value: normalizeCompiledVersion(diagnosticsSystemInfo.luci_app_version) value: normalizeCompiledVersion(PODKOP_LUCI_APP_VERSION)
}, },
{ {
key: "Sing-box", key: "Sing-box",
@@ -4008,6 +4217,7 @@ function renderDiagnosticSystemInfoWidget() {
async function onStoreUpdate2(next, prev, diff) { async function onStoreUpdate2(next, prev, diff) {
if (diff.diagnosticsChecks) { if (diff.diagnosticsChecks) {
renderDiagnosticsChecks(); renderDiagnosticsChecks();
renderWikiDisclaimerWidget();
} }
if (diff.diagnosticsRunAction) { if (diff.diagnosticsRunAction) {
renderDiagnosticRunActionWidget(); renderDiagnosticRunActionWidget();
@@ -4028,6 +4238,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);
@@ -4042,6 +4253,7 @@ function onPageMount2() {
renderDiagnosticRunActionWidget(); renderDiagnosticRunActionWidget();
renderDiagnosticAvailableActionsWidget(); renderDiagnosticAvailableActionsWidget();
renderDiagnosticSystemInfoWidget(); renderDiagnosticSystemInfoWidget();
renderWikiDisclaimerWidget();
fetchServicesInfo(); fetchServicesInfo();
fetchSystemInfo(); fetchSystemInfo();
} }
@@ -4120,6 +4332,31 @@ var styles4 = `
grid-row-gap: 10px; grid-row-gap: 10px;
} }
.pdk_diagnostic-page__right-bar__wiki {
border: 2px var(--background-color-low, lightgray) solid;
border-radius: 4px;
padding: 10px;
display: grid;
grid-template-columns: auto;
grid-row-gap: 10px;
}
.pdk_diagnostic-page__right-bar__wiki--warning {
border: 2px var(--warn-color-medium, orange) solid;
}
.pdk_diagnostic-page__right-bar__wiki--error {
border: 2px var(--error-color-medium, red) solid;
}
.pdk_diagnostic-page__right-bar__wiki__content {
display: grid;
grid-template-columns: 1fr 5fr;
grid-column-gap: 10px;
}
.pdk_diagnostic-page__right-bar__wiki__texts {}
.pdk_diagnostic-page__right-bar__actions { .pdk_diagnostic-page__right-bar__actions {
border: 2px var(--background-color-low, lightgray) solid; border: 2px var(--background-color-low, lightgray) solid;
border-radius: 4px; border-radius: 4px;

View File

@@ -241,7 +241,7 @@ function createSectionContent(section) {
(v) => v === lastSelected || !main.REGIONAL_OPTIONS.includes(v), (v) => v === lastSelected || !main.REGIONAL_OPTIONS.includes(v),
); );
notifications.push( notifications.push(
E("p", { class: "alert-message warning" }, [ E("p", {}, [
E("strong", {}, _("Regional options cannot be used together")), E("strong", {}, _("Regional options cannot be used together")),
E("br"), E("br"),
_( _(

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-21 23:02+0300\n" "POT-Creation-Date: 2025-10-25 01:08+0300\n"
"PO-Revision-Date: 2025-10-21 23:02+0300\n" "PO-Revision-Date: 2025-10-25 01:08+0300\n"
"Last-Translator: divocat\n" "Last-Translator: divocat\n"
"Language-Team: none\n" "Language-Team: none\n"
"Language: ru\n" "Language: ru\n"
@@ -44,6 +44,9 @@ msgstr "Необходимо указать хотя бы один действ
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 "Необходимо указать хотя бы одну действительную подсеть или IP. Только комментарии недопустимы." msgstr "Необходимо указать хотя бы одну действительную подсеть или IP. Только комментарии недопустимы."
msgid "Available actions"
msgstr "Доступные действия"
msgid "Bootsrap DNS" msgid "Bootsrap DNS"
msgstr "Bootstrap DNS" msgstr "Bootstrap DNS"
@@ -62,26 +65,20 @@ msgstr "Путь к файлу кэша"
msgid "Cache file path cannot be empty" msgid "Cache file path cannot be empty"
msgstr "Путь к файлу кэша не может быть пустым" msgstr "Путь к файлу кэша не может быть пустым"
msgid "Cannot receive DNS checks result" msgid "Cannot receive checks result"
msgstr "Не удалось получить результаты проверки DNS" msgstr "Не удалось получить результаты проверки"
msgid "Cannot receive nftables checks result" msgid "Checking, please wait"
msgstr "Не удалось получить результаты проверки nftables" msgstr "Проверяем, пожалуйста подождите"
msgid "Cannot receive Sing-box checks result" msgid "checks"
msgstr "Не удалось получить результаты проверки Sing-box" msgstr "проверки"
msgid "Checking dns, please wait" msgid "Checks failed"
msgstr "Проверка dns, пожалуйста подождите" msgstr "Проверки не выполнены"
msgid "Checking FakeIP, please wait" msgid "Checks passed"
msgstr "Проверка FakeIP, пожалуйста подождите" msgstr "Проверки пройдены"
msgid "Checking nftables, please wait"
msgstr "Проверка nftables, пожалуйста подождите"
msgid "Checking sing-box, please wait"
msgstr "Проверка sing-box, пожалуйста подождите"
msgid "CIDR must be between 0 and 32" msgid "CIDR must be between 0 and 32"
msgstr "CIDR должен быть между 0 и 32" msgstr "CIDR должен быть между 0 и 32"
@@ -143,12 +140,6 @@ msgstr "Отключить QUIC протокол для улучшения со
msgid "Disabled" msgid "Disabled"
msgstr "Отключено" msgstr "Отключено"
msgid "DNS checks"
msgstr "DNS проверки"
msgid "DNS checks passed"
msgstr "DNS проверки успешно завершены"
msgid "DNS on router" msgid "DNS on router"
msgstr "DNS на роутере" msgstr "DNS на роутере"
@@ -170,6 +161,9 @@ msgstr "DNS-сервер"
msgid "DNS server address cannot be empty" msgid "DNS server address cannot be empty"
msgstr "Адрес DNS-сервера не может быть пустым" msgstr "Адрес DNS-сервера не может быть пустым"
msgid "Do not panic, everything can be fixed, just..."
msgstr "Не паникуйте, всё можно исправить, просто..."
msgid "Domain Resolver" msgid "Domain Resolver"
msgstr "Резолвер доменов" msgstr "Резолвер доменов"
@@ -236,17 +230,8 @@ msgstr "Исключите трафик протокола NTP из туннел
msgid "Failed to copy!" msgid "Failed to copy!"
msgstr "Не удалось скопировать!" msgstr "Не удалось скопировать!"
msgid "FakeIP checks" msgid "Failed to execute!"
msgstr "Проверка FakeIP" msgstr "Не удалось выполнить!"
msgid "FakeIP checks failed"
msgstr "Проверки FakeIP не пройдены"
msgid "FakeIP checks partially passed"
msgstr "Проверка FakeIP частично пройдена"
msgid "FakeIP checks passed"
msgstr "Проверки FakeIP пройдены"
msgid "Fastest" msgid "Fastest"
msgstr "Самый быстрый" msgstr "Самый быстрый"
@@ -365,6 +350,9 @@ msgstr "Неверный URL VLESS: ошибка разбора"
msgid "IP address 0.0.0.0 is not allowed" msgid "IP address 0.0.0.0 is not allowed"
msgstr "IP-адрес 0.0.0.0 не допускается" msgstr "IP-адрес 0.0.0.0 не допускается"
msgid "Issues detected"
msgstr "Обнаружены проблемы"
msgid "Latest" msgid "Latest"
msgstr "Последняя" msgstr "Последняя"
@@ -392,21 +380,15 @@ msgstr "Наблюдаемые интерфейсы"
msgid "Network Interface" msgid "Network Interface"
msgstr "Сетевой интерфейс" msgstr "Сетевой интерфейс"
msgid "Nftables checks"
msgstr "Проверки Nftables"
msgid "Nftables checks partially passed"
msgstr "Проверки Nftables частично пройдена"
msgid "Nftables checks passed"
msgstr "Nftables проверки успешно завершены"
msgid "No other marking rules found" msgid "No other marking rules found"
msgstr "Другие правила маркировки не найдены" msgstr "Другие правила маркировки не найдены"
msgid "Not implement yet" msgid "Not implement yet"
msgstr "Ещё не реализовано" msgstr "Ещё не реализовано"
msgid "Not responding"
msgstr "Не отвечает"
msgid "Not running" msgid "Not running"
msgstr "Не запущено" msgstr "Не запущено"
@@ -440,6 +422,9 @@ msgstr "Путь должен содержать хотя бы одну дире
msgid "Path must end with cache.db" msgid "Path must end with cache.db"
msgstr "Путь должен заканчиваться на cache.db" msgstr "Путь должен заканчиваться на cache.db"
msgid "Pending"
msgstr "Ожидает запуска"
msgid "Podkop" msgid "Podkop"
msgstr "Podkop" msgstr "Podkop"
@@ -458,17 +443,14 @@ msgstr "Прокси-трафик не маршрутизируется чере
msgid "Proxy traffic is routed via FakeIP" msgid "Proxy traffic is routed via FakeIP"
msgstr "Прокси-трафик направляется через FakeIP" msgstr "Прокси-трафик направляется через FakeIP"
msgid "Queued"
msgstr "В очереди"
msgid "Regional options cannot be used together" msgid "Regional options cannot be used together"
msgstr "Нельзя использовать несколько региональных опций одновременно" msgstr "Нельзя использовать несколько региональных опций одновременно"
msgid "Remote Domain Lists" msgid "Remote Domain Lists"
msgstr "Удалённые списки доменов" msgstr "Внешние списки доменов"
msgid "Remote Subnet Lists" msgid "Remote Subnet Lists"
msgstr "Удалённые списки подсетей" msgstr "Внешние списки подсетей"
msgid "Restart podkop" msgid "Restart podkop"
msgstr "Перезапустить Podkop" msgstr "Перезапустить Podkop"
@@ -569,12 +551,6 @@ msgstr "Sing-box"
msgid "Sing-box autostart disabled" msgid "Sing-box autostart disabled"
msgstr "Автостарт sing-box отключен" msgstr "Автостарт sing-box отключен"
msgid "Sing-box checks"
msgstr "Sing-box проверки"
msgid "Sing-box checks passed"
msgstr "Sing-box проверки успешно завершены"
msgid "Sing-box installed" msgid "Sing-box installed"
msgstr "Sing-box установлен" msgstr "Sing-box установлен"
@@ -600,10 +576,10 @@ msgid "Specify local IP addresses or subnets whose traffic will always be routed
msgstr "Укажите локальные IP-адреса или подсети, трафик которых всегда будет направляться через настроенный маршрут." msgstr "Укажите локальные IP-адреса или подсети, трафик которых всегда будет направляться через настроенный маршрут."
msgid "Specify remote URLs to download and use domain lists" msgid "Specify remote URLs to download and use domain lists"
msgstr "Укажите удаленные URL-адреса для загрузки и использования списков доменов." msgstr "Укажите URL-адреса для загрузки и использования списков доменов."
msgid "Specify remote URLs to download and use subnet lists" msgid "Specify remote URLs to download and use subnet lists"
msgstr "Укажите удаленные URL-адреса для загрузки и использования списков подсетей." msgstr "Укажите URL-адреса для загрузки и использования списков подсетей."
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 "Укажите путь к файлу списка, расположенному в файловой системе маршрутизатора."
@@ -620,11 +596,14 @@ msgstr "Успешно скопировано!"
msgid "System info" msgid "System info"
msgstr "Системная информация" msgstr "Системная информация"
msgid "System information"
msgstr "Системная информация"
msgid "Table exist" msgid "Table exist"
msgstr "Таблица существует" msgstr "Таблица существует"
msgid "Test latency" msgid "Test latency"
msgstr "Измерить задержки" msgstr "Тестирование задержки"
msgid "Text List" msgid "Text List"
msgstr "Текстовый список" msgstr "Текстовый список"
@@ -644,6 +623,9 @@ msgstr "Трафик"
msgid "Traffic Total" msgid "Traffic Total"
msgstr "Всего трафика" msgstr "Всего трафика"
msgid "Troubleshooting"
msgstr "Устранение неполадок"
msgid "TTL must be a positive number" msgid "TTL must be a positive number"
msgstr "TTL должно быть положительным числом" msgstr "TTL должно быть положительным числом"
@@ -704,6 +686,9 @@ msgstr "Ошибки валидации:"
msgid "View logs" msgid "View logs"
msgstr "Посмотреть логи" msgstr "Посмотреть логи"
msgid "Visit Wiki"
msgstr "Перейти в wiki"
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 "Предупреждение: %s нельзя использовать вместе с %s. Предыдущие варианты были удалены." msgstr "Предупреждение: %s нельзя использовать вместе с %s. Предыдущие варианты были удалены."

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-21 20:02+0300\n" "POT-Creation-Date: 2025-10-25 22:08+0300\n"
"PO-Revision-Date: 2025-10-21 20:02+0300\n" "PO-Revision-Date: 2025-10-25 22:08+0300\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"
@@ -36,7 +36,7 @@ msgstr ""
msgid "Active Connections" msgid "Active Connections"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:117 #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:106
msgid "Additional marking rules found" msgid "Additional marking rules found"
msgstr "" msgstr ""
@@ -52,7 +52,11 @@ msgstr ""
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 ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:72 #: src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:43
msgid "Available actions"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:65
msgid "Bootsrap DNS" msgid "Bootsrap DNS"
msgstr "" msgstr ""
@@ -60,48 +64,47 @@ msgstr ""
msgid "Bootstrap DNS server" msgid "Bootstrap DNS server"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:81 #: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:58
msgid "Browser is not using FakeIP" msgid "Browser is not using FakeIP"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:80 #: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:57
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:322 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:329
msgid "Cache File Path" msgid "Cache File Path"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:336 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:343
msgid "Cache file path cannot be empty" msgid "Cache file path cannot be empty"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:26 #: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:27
msgid "Cannot receive DNS checks result" #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:28
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:27
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:25
msgid "Cannot receive checks result"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:27 #: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:15
msgid "Cannot receive nftables checks result" #: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:15
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:13
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:15
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:13
msgid "Checking, please wait"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:24 #: src/podkop/tabs/diagnostic/helpers/getCheckTitle.ts:2
msgid "Cannot receive Sing-box checks result" msgid "checks"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:14 #: src/podkop/tabs/diagnostic/helpers/getMeta.ts:26
msgid "Checking dns, please wait" msgid "Checks failed"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:14 #: src/podkop/tabs/diagnostic/helpers/getMeta.ts:13
msgid "Checking FakeIP, please wait" msgid "Checks passed"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:12
msgid "Checking nftables, please wait"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:12
msgid "Checking sing-box, please wait"
msgstr "" msgstr ""
#: src/validators/validateSubnet.ts:33 #: src/validators/validateSubnet.ts:33
@@ -116,7 +119,7 @@ msgstr ""
msgid "Community Lists" msgid "Community Lists"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:309 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:316
msgid "Config File Path" msgid "Config File Path"
msgstr "" msgstr ""
@@ -152,15 +155,15 @@ msgstr ""
msgid "Dashboard currently unavailable" msgid "Dashboard currently unavailable"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:215 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:222
msgid "Delay in milliseconds before reloading podkop after interface UP" msgid "Delay in milliseconds before reloading podkop after interface UP"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:222 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:229
msgid "Delay value cannot be empty" msgid "Delay value cannot be empty"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:89 #: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:82
msgid "DHCP has DNS server" msgid "DHCP has DNS server"
msgstr "" msgstr ""
@@ -172,11 +175,11 @@ msgstr ""
msgid "Disable autostart" msgid "Disable autostart"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:239 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:246
msgid "Disable QUIC" msgid "Disable QUIC"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:240 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:247
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 ""
@@ -185,15 +188,7 @@ msgstr ""
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/contstants.ts:14 #: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:77
msgid "DNS checks"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:64
msgid "DNS checks passed"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:84
msgid "DNS on router" msgid "DNS on router"
msgstr "" msgstr ""
@@ -225,11 +220,15 @@ msgstr ""
msgid "DNS server address cannot be empty" msgid "DNS server address cannot be empty"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts:26
msgid "Do not panic, everything can be fixed, just..."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:166 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:166
msgid "Domain Resolver" msgid "Domain Resolver"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:300 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:307
msgid "Dont Touch My DHCP!" msgid "Dont Touch My DHCP!"
msgstr "" msgstr ""
@@ -242,19 +241,19 @@ msgstr ""
msgid "Download" msgid "Download"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:262 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:269
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:271 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:278
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:263 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:270
msgid "Downloading all lists via main Proxy/VPN" msgid "Downloading all lists via main Proxy/VPN"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:272 #: ../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 ""
@@ -283,7 +282,7 @@ msgstr ""
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 ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:230 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:237
msgid "Enable YACD" msgid "Enable YACD"
msgstr "" msgstr ""
@@ -303,11 +302,11 @@ 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 "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:358 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:365
msgid "Exclude NTP" msgid "Exclude NTP"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:359 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:366
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 ""
@@ -315,20 +314,13 @@ msgstr ""
msgid "Failed to copy!" msgid "Failed to copy!"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/contstants.ts:29 #: src/podkop/tabs/diagnostic/initController.ts:227
msgid "FakeIP checks" #: src/podkop/tabs/diagnostic/initController.ts:231
msgstr "" #: src/podkop/tabs/diagnostic/initController.ts:261
#: src/podkop/tabs/diagnostic/initController.ts:265
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:57 #: src/podkop/tabs/diagnostic/initController.ts:299
msgid "FakeIP checks failed" #: src/podkop/tabs/diagnostic/initController.ts:303
msgstr "" msgid "Failed to execute!"
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:51
msgid "FakeIP checks partially passed"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:44
msgid "FakeIP checks passed"
msgstr "" msgstr ""
#: src/podkop/methods/custom/getDashboardSections.ts:117 #: src/podkop/methods/custom/getDashboardSections.ts:117
@@ -343,7 +335,7 @@ msgstr ""
msgid "Get global check" msgid "Get global check"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:218 #: src/podkop/tabs/diagnostic/initController.ts:222
msgid "Global check" msgid "Global check"
msgstr "" msgstr ""
@@ -351,19 +343,19 @@ msgstr ""
msgid "HTTP error" msgid "HTTP error"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:182 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:189
msgid "Interface Monitoring" msgid "Interface Monitoring"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:214 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:221
msgid "Interface Monitoring Delay" msgid "Interface Monitoring Delay"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:183 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:190
msgid "Interface monitoring for Bad WAN" msgid "Interface monitoring for Bad WAN"
msgstr "" msgstr ""
#: src/validators/validateDns.ts:20 #: src/validators/validateDns.ts:23
msgid "Invalid DNS server format. Examples: 8.8.8.8 or dns.example.com or dns.example.com/nicedns for DoH" msgid "Invalid DNS server format. Examples: 8.8.8.8 or dns.example.com or dns.example.com/nicedns for DoH"
msgstr "" msgstr ""
@@ -480,7 +472,7 @@ msgstr ""
msgid "Invalid URL format" msgid "Invalid URL format"
msgstr "" msgstr ""
#: src/validators/validateVlessUrl.ts:109 #: src/validators/validateVlessUrl.ts:110
msgid "Invalid VLESS URL: parsing failed" msgid "Invalid VLESS URL: parsing failed"
msgstr "" msgstr ""
@@ -488,11 +480,15 @@ msgstr ""
msgid "IP address 0.0.0.0 is not allowed" msgid "IP address 0.0.0.0 is not allowed"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:404 #: src/podkop/tabs/diagnostic/helpers/getMeta.ts:20
msgid "Issues detected"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:453
msgid "Latest" msgid "Latest"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:250 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:257
msgid "List Update Frequency" msgid "List Update Frequency"
msgstr "" msgstr ""
@@ -504,7 +500,7 @@ msgstr ""
msgid "Local Subnet Lists" msgid "Local Subnet Lists"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:79 #: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:72
msgid "Main DNS" msgid "Main DNS"
msgstr "" msgstr ""
@@ -516,7 +512,7 @@ msgstr ""
msgid "Mixed Proxy Port" msgid "Mixed Proxy Port"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:191 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:198
msgid "Monitored Interfaces" msgid "Monitored Interfaces"
msgstr "" msgstr ""
@@ -524,19 +520,7 @@ msgstr ""
msgid "Network Interface" msgid "Network Interface"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/contstants.ts:24 #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:105
msgid "Nftables checks"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:75
msgid "Nftables checks partially passed"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:74
msgid "Nftables checks passed"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:116
msgid "No other marking rules found" msgid "No other marking rules found"
msgstr "" msgstr ""
@@ -544,10 +528,16 @@ msgstr ""
msgid "Not implement yet" msgid "Not implement yet"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:59
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:79
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 ""
@@ -567,7 +557,7 @@ msgstr ""
msgid "Outbound JSON must contain at least \"type\", \"server\" and \"server_port\" fields" msgid "Outbound JSON must contain at least \"type\", \"server\" and \"server_port\" fields"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:394 #: src/podkop/tabs/diagnostic/initController.ts:443
msgid "Outdated" msgid "Outdated"
msgstr "" msgstr ""
@@ -579,18 +569,26 @@ msgstr ""
msgid "Path cannot be empty" msgid "Path cannot be empty"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:340 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:347
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:349 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:356
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:344 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:351
msgid "Path must end with cache.db" msgid "Path must end with cache.db"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:103
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:111
#: 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"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:340 #: src/podkop/tabs/dashboard/initController.ts:340
msgid "Podkop" msgid "Podkop"
msgstr "" msgstr ""
@@ -599,7 +597,7 @@ msgstr ""
msgid "Podkop Settings" msgid "Podkop Settings"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:301 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:308
msgid "Podkop will not modify your DHCP configuration" msgid "Podkop will not modify your DHCP configuration"
msgstr "" msgstr ""
@@ -607,21 +605,14 @@ msgstr ""
msgid "Proxy Configuration URL" msgid "Proxy Configuration URL"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:89 #: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:66
msgid "Proxy traffic is not routed via FakeIP" msgid "Proxy traffic is not routed via FakeIP"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:88 #: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:65
msgid "Proxy traffic is routed via FakeIP" msgid "Proxy traffic is routed via FakeIP"
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:111
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:119
msgid "Queued"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:245 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:245
msgid "Regional options cannot be used together" msgid "Regional options cannot be used together"
msgstr "" msgstr ""
@@ -638,39 +629,39 @@ msgstr ""
msgid "Restart podkop" msgid "Restart podkop"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:74 #: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:51
msgid "Router DNS is not routed through sing-box" msgid "Router DNS is not routed through sing-box"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:73 #: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:50
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:369 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:376
msgid "Routing Excluded IPs" msgid "Routing Excluded IPs"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:90 #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:79
msgid "Rules mangle counters" msgid "Rules mangle counters"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:85 #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:74
msgid "Rules mangle exist" msgid "Rules mangle exist"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:100 #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:89
msgid "Rules mangle output counters" msgid "Rules mangle output counters"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:95 #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:84
msgid "Rules mangle output exist" msgid "Rules mangle output exist"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:110 #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:99
msgid "Rules proxy counters" msgid "Rules proxy counters"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:105 #: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:94
msgid "Rules proxy exist" msgid "Rules proxy exist"
msgstr "" msgstr ""
@@ -698,7 +689,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:251 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:258
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 ""
@@ -715,11 +706,11 @@ msgstr ""
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:323 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:330
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:310 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:317
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 ""
@@ -743,7 +734,7 @@ msgstr ""
msgid "Select the network interface to which the traffic will originate" msgid "Select the network interface to which the traffic will originate"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:192 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:199
msgid "Select the WAN interfaces to be monitored" msgid "Select the WAN interfaces to be monitored"
msgstr "" msgstr ""
@@ -755,7 +746,7 @@ msgstr ""
msgid "Settings" msgid "Settings"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:278 #: 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 ""
@@ -764,35 +755,27 @@ msgstr ""
msgid "Sing-box" msgid "Sing-box"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:86 #: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:77
msgid "Sing-box autostart disabled" msgid "Sing-box autostart disabled"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/contstants.ts:19 #: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:62
msgid "Sing-box checks"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:66
msgid "Sing-box checks passed"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:71
msgid "Sing-box installed" msgid "Sing-box installed"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:96 #: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:87
msgid "Sing-box listening ports" msgid "Sing-box listening ports"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:91 #: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:82
msgid "Sing-box process running" msgid "Sing-box process running"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:81 #: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:72
msgid "Sing-box service exist" msgid "Sing-box service exist"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:76 #: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:67
msgid "Sing-box version >= 1.12.4" msgid "Sing-box version >= 1.12.4"
msgstr "" msgstr ""
@@ -800,7 +783,7 @@ msgstr ""
msgid "Source Network Interface" msgid "Source Network Interface"
msgstr "" msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:370 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:377
msgid "Specify a local IP address to be excluded from routing" msgid "Specify a local IP address to be excluded from routing"
msgstr "" msgstr ""
@@ -837,7 +820,11 @@ msgstr ""
msgid "System info" msgid "System info"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:80 #: src/podkop/tabs/diagnostic/partials/renderSystemInfo.ts:21
msgid "System information"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:69
msgid "Table exist" msgid "Table exist"
msgstr "" msgstr ""
@@ -869,6 +856,10 @@ msgstr ""
msgid "Traffic Total" msgid "Traffic Total"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts:25
msgid "Troubleshooting"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:80 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:80
msgid "TTL must be a positive number" msgid "TTL must be a positive number"
msgstr "" msgstr ""
@@ -886,13 +877,13 @@ msgstr ""
msgid "UDP over TCP" msgid "UDP over TCP"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:34
#: src/podkop/tabs/diagnostic/initController.ts:35
#: src/podkop/tabs/diagnostic/initController.ts:36
#: 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:373 #: src/podkop/tabs/diagnostic/initController.ts:40
#: src/podkop/tabs/diagnostic/initController.ts:41
#: src/podkop/tabs/diagnostic/initController.ts:42
#: src/podkop/tabs/diagnostic/initController.ts:43
#: src/podkop/tabs/diagnostic/initController.ts:417
msgid "unknown" msgid "unknown"
msgstr "" msgstr ""
@@ -905,7 +896,7 @@ msgstr ""
msgid "Uplink" msgid "Uplink"
msgstr "" msgstr ""
#: src/validators/validateProxyUrl.ts:27 #: src/validators/validateProxyUrl.ts:29
msgid "URL must start with vless://, ss://, trojan://, or socks4/5://" msgid "URL must start with vless://, ss://, trojan://, or socks4/5://"
msgstr "" msgstr ""
@@ -945,8 +936,8 @@ msgstr ""
msgid "User Subnets List" msgid "User Subnets List"
msgstr "" msgstr ""
#: src/validators/validateDns.ts:11 #: src/validators/validateDns.ts:14
#: src/validators/validateDns.ts:15 #: src/validators/validateDns.ts:18
#: 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
@@ -957,7 +948,7 @@ msgstr ""
#: 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:16
#: src/validators/validateVlessUrl.ts:107 #: src/validators/validateVlessUrl.ts:108
msgid "Valid" msgid "Valid"
msgstr "" msgstr ""
@@ -966,11 +957,15 @@ msgstr ""
msgid "Validation errors:" msgid "Validation errors:"
msgstr "" msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:248 #: 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 ""
#: src/podkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts:31
msgid "Visit Wiki"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:247 #: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:247
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 ""

View File

@@ -14,7 +14,7 @@ include $(INCLUDE_DIR)/package.mk
define Package/podkop define Package/podkop
SECTION:=net SECTION:=net
CATEGORY:=Network CATEGORY:=Network
DEPENDS:=+sing-box-tiny +curl +jq +kmod-nft-tproxy +coreutils-base64 +bind-dig DEPENDS:=+sing-box +curl +jq +kmod-nft-tproxy +coreutils-base64 +bind-dig
CONFLICTS:=https-dns-proxy nextdns luci-app-passwall luci-app-passwall2 CONFLICTS:=https-dns-proxy nextdns luci-app-passwall luci-app-passwall2
TITLE:=Domain routing app TITLE:=Domain routing app
URL:=https://podkop.net URL:=https://podkop.net

View File

@@ -767,7 +767,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")
@@ -1684,16 +1684,10 @@ 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" \
"$PODKOP_CONFIG" > "$tmp_config" "$PODKOP_CONFIG" > "$tmp_config"
cat "$tmp_config" cat "$tmp_config"