Compare commits

..

56 Commits
0.7.8 ... main

Author SHA1 Message Date
Kirill Sobakin
41e696c9b2 Merge pull request #366 from itdoginfo/discord
fix: include UDP port range 19000-20000 in Discord nft rule
2026-05-14 10:29:52 +03:00
Andrey Petelin
835b455915 fix: include UDP port range 19000-20000 in Discord nft rule 2026-05-14 12:23:50 +05:00
Slava-Shchipunov
6089ef4c9b Fix/fix version check (#278) 2026-05-12 19:31:43 +03:00
Kirill Sobakin
617e9a93bc Merge pull request #363 from itdoginfo/version
Fix LuCI Version
2026-05-12 10:11:25 +03:00
Kirill Sobakin
6d9aedd236 Merge pull request #364 from itdoginfo/sdk052026
Update SDK version
2026-05-12 10:05:50 +03:00
Kirill Sobakin
fc9cf79221 fix/literal 2026-05-12 10:04:09 +03:00
Kirill Sobakin
2184c0c7d4 update/SDK version 2026-05-12 10:00:03 +03:00
Kirill Sobakin
03736c613b update/SDK version 2026-05-12 09:58:20 +03:00
Kirill Sobakin
c37ea6a4d3 fix/luci version 2026-05-12 09:35:11 +03:00
Kirill Sobakin
a0869da4a5 fix/luci version 2026-05-12 09:34:56 +03:00
Kirill Sobakin
23ac3a8d12 Merge pull request #361 from romanvht/resolve-action
Add func to insert resolve action in route.rules section
2026-05-12 09:25:19 +03:00
romanvht
d8bd87a7da update locale for action resolve 2026-05-09 14:51:34 +10:00
romanvht
b93403c3e3 distribute locales 2026-05-09 13:03:40 +10:00
romanvht
5629425853 add localisation strings to fe-app-podkop, actualize po&pot 2026-05-09 12:55:15 +10:00
romanvht
8b2abc0b28 add func to insert resolve action in route.rules section 2026-05-09 02:49:40 +10:00
Kirill Sobakin
21085f3ac3 Update README.md 2026-03-07 20:12:30 +03:00
Kirill Sobakin
9a015bbde4 Merge pull request #309 from itdoginfo/fix/default-dns
chore: set dns_server to 77.88.8.8
2026-02-16 07:29:48 +03:00
Andrey Petelin
a7b6c36dfb chore: set dns_server to 77.88.8.8 2026-01-29 12:03:25 +05:00
Kirill Sobakin
f39e2d9ca9 Merge pull request #307 from itdoginfo/fix/dns-check
fix: use nslookup_attempts for DNS check loop
2026-01-28 10:49:34 +03:00
Andrey Petelin
00594f23fd fix: use nslookup_attempts for DNS check loop instead of nslookup_timeout 2026-01-28 12:45:35 +05:00
Kirill Sobakin
0379cf5966 Merge pull request #304 from itdoginfo/fix/diagnostic-singbox-config
feat(diagnostic): stringify sb config json
2026-01-24 12:45:33 +03:00
divocatt
cfee6cec9a feat(diagnostic): stringify sb config json 2026-01-23 16:06:54 +02:00
Kirill Sobakin
ad760a78bf Merge pull request #303 from itdoginfo/fix/minor-fixes
Fix/minor fixes
2026-01-23 15:57:24 +03:00
Andrey Petelin
d854caa4cc fix: Disable dnsmasq noresolv when restoring or using default resolvfile; ensure resolvfile is applied 2026-01-23 17:42:05 +05:00
Andrey Petelin
b44274d7f2 fix: mask selector_proxy_links in podkop redaction to hide sensitive proxy selectors 2026-01-23 16:00:34 +05:00
Andrey Petelin
12d8537d90 fix: only print colored timestamp and message when stdout is a terminal 2026-01-23 15:59:26 +05:00
Kirill Sobakin
8e18426a53 Merge pull request #302 from itdoginfo/fix/log_level
fix: set default log_level to "warn" when missing in settings
2026-01-22 19:23:06 +03:00
Andrey Petelin
41a4f67fd0 fix: set default log_level to "warn" when missing in settings 2026-01-22 21:02:15 +05:00
Kirill Sobakin
c30160d8d3 Merge pull request #296 from itdoginfo/firewall-new-mark
New mark and mask
2026-01-22 13:03:36 +03:00
Kirill Sobakin
42f75c3374 fix: new mark 2026-01-22 13:01:36 +03:00
Kirill Sobakin
2cce383b33 Merge pull request #294 from itdoginfo/roblox
Add Roblox to lists
2026-01-21 18:20:06 +03:00
Kirill Sobakin
81963bfbdf feat: roblox 2026-01-21 18:09:12 +03:00
Kirill Sobakin
f3d2fa5a52 Merge pull request #290 from itdoginfo/feat/exclusion
feat: Add 'exclusion' connection type with direct route rule
2026-01-21 17:34:47 +03:00
Andrey Petelin
474f4b197f Update luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-01-21 19:32:25 +05:00
Andrey Petelin
6083009c80 feat: Add 'exclusion' connection type with direct route rule 2026-01-19 16:10:09 +05:00
Kirill Sobakin
0672c55188 Merge pull request #284 from itdoginfo/fix/firewall
Fix/firewall
2026-01-15 00:39:14 +03:00
Kirill Sobakin
e14a7e7dd1 Merge pull request #286 from itdoginfo/feat/dashboard-selector
Add selector support to dashboard
2026-01-15 00:15:29 +03:00
divocatt
3f7e7cbc4b feat(dashboard): add selector support to dashboard 2026-01-14 21:04:52 +02:00
divocatt
782f08b71b feat(lang): add translations for selector 2026-01-14 20:21:39 +02:00
Andrey Petelin
a40240bb3f fix: use fwmark/mask and bitwise meta mark comparison to correctly match packet marks 2026-01-14 14:09:51 +05:00
Andrey Petelin
1e9a7bffa4 fix: avoid outbound traffic loop by adding NFT_OUTBOUND_MARK (0x90000) and mangle_output return rule (#248) 2026-01-14 10:29:13 +05:00
Andrey Petelin
4448c09c34 fix: replace fakeip mark 0x105 with 0x80000 to avoid conflict with mwan3 (#275) 2026-01-14 10:25:03 +05:00
Kirill Sobakin
af95c0dcd0 Merge pull request #283 from itdoginfo/feat/selector
feat: add selector proxy type support
2026-01-13 13:11:55 +03:00
Andrey Petelin
d2fbff17bf feat: add selector proxy type support 2026-01-09 23:32:58 +05:00
Kirill Sobakin
a73def1f9a Merge pull request #271 from itdoginfo/fix/fully_routed_ips_priority
fix: lower priority of fully_routed_ips relative to routing_excluded_ips
2025-12-21 16:31:22 +03:00
divocat
9976065696 feat: add locales for log level 2025-12-13 18:15:25 +02:00
Andrey Petelin
aa8f2cef41 feat: Add log_level option in LuCI and use configured value for sing-box logging 2025-12-10 17:58:22 +05:00
Andrey Petelin
96f6def701 fix: lower priority of fully_routed_ips relative to routing_excluded_ips 2025-12-10 16:55:23 +05:00
Kirill Sobakin
0152f073b7 Merge pull request #270 from itdoginfo/fix/267-determine-dhcp-ip
Use network_get_ipaddr to obtain LAN listen IP
2025-12-09 16:40:41 +03:00
Andrey Petelin
06ce944e1c fix: add and source network functions, use network_get_ipaddr to obtain LAN listen IP 2025-12-09 15:15:58 +05:00
Kirill Sobakin
64369a93b0 Merge pull request #263 from kjljxybr/main
Translation update for the installation script
2025-12-03 11:48:57 +03:00
Kirill Sobakin
53a3c943f0 Merge pull request #265 from itdoginfo/fix/service_listen_address
Fix/service listen address
2025-12-03 11:46:53 +03:00
Andrey Petelin
7c7e1c6244 fix: take first LAN IP address and strip CIDR suffix 2025-12-03 10:21:51 +05:00
Andrey Petelin
7fc1f39dd6 fix: have service_listen_address option override automatic detection of listening IP address 2025-12-03 09:58:28 +05:00
Artem Kireev
1c4285dfa8 translations 2025-12-02 10:34:38 +03:00
Kirill Sobakin
ea1273e05e Fix: UDP is lost. Double function call 2025-12-01 23:30:33 +03:00
27 changed files with 941 additions and 447 deletions

View File

@@ -1,4 +1,4 @@
FROM itdoginfo/openwrt-sdk-apk:09102025
FROM itdoginfo/openwrt-sdk-apk:25.12.3
ARG PODKOP_VERSION
ENV PODKOP_VERSION=${PODKOP_VERSION}
@@ -7,5 +7,5 @@ COPY ./podkop /builder/package/feeds/utilities/podkop
COPY ./luci-app-podkop /builder/package/feeds/luci/luci-app-podkop
RUN make defconfig && \
make package/podkop/compile -j1 V=s && \
make package/luci-app-podkop/compile -j1 V=s
make package/podkop/compile -j4 V=s && \
make package/luci-app-podkop/compile -j4 V=s

View File

@@ -1,4 +1,4 @@
FROM itdoginfo/openwrt-sdk-ipk:24.10.3
FROM itdoginfo/openwrt-sdk-ipk:24.10.6
ARG PODKOP_VERSION

View File

@@ -45,7 +45,7 @@ wget -O /etc/config/podkop https://raw.githubusercontent.com/itdoginfo/podkop/re
# ToDo
> [!IMPORTANT]
> PR принимаются только по issues, у которых стоит label "enhancement". Либо по согласованию с авторами в ТГ-чате. Остальные PR на данный момент не рассматриваются.
> PR принимаются только по согласованию с авторами в ТГ-чате. Остальные PR на данный момент не рассматриваются. Не тратьте зря своё время.
## Будущее
- [ ] [Подписка](https://github.com/itdoginfo/podkop/issues/118). Здесь нужна реализация, чтоб для каждой секции помимо ручного выбора, был выбор фильтрации по тегу. Например, для main выбираем ключевые слова NL, DE, FI. А для extra секции фильтруем по RU. И создаётся outbound c urltest в которых перечислены outbound из фильтров.

View File

@@ -52,21 +52,21 @@
"call": "Applicable for SOCKS and Shadowsocks proxy",
"key": "Applicable for SOCKS and Shadowsocks proxy",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:175"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:199"
]
},
{
"call": "At least one valid domain must be specified. Comments-only content is not allowed.",
"key": "At least one valid domain must be specified. Comments-only content is not allowed.",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:420"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:444"
]
},
{
"call": "At least one valid subnet or IP must be specified. Comments-only content is not allowed.",
"key": "At least one valid subnet or IP must be specified. Comments-only content is not allowed.",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:501"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:525"
]
},
{
@@ -178,7 +178,7 @@
"call": "Community Lists",
"key": "Community Lists",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:275"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:299"
]
},
{
@@ -199,7 +199,7 @@
"call": "Configuration Type",
"key": "Configuration Type",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:22"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:23"
]
},
{
@@ -213,7 +213,7 @@
"call": "Connection URL",
"key": "Connection URL",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:25"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:26"
]
},
{
@@ -297,8 +297,8 @@
"call": "Disabled",
"key": "Disabled",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:366",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:446"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:390",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:470"
]
},
{
@@ -312,7 +312,7 @@
"call": "DNS over HTTPS (DoH)",
"key": "DNS over HTTPS (DoH)",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:243",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:267",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:15"
]
},
@@ -320,7 +320,7 @@
"call": "DNS over TLS (DoT)",
"key": "DNS over TLS (DoT)",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:244",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:268",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:16"
]
},
@@ -328,7 +328,7 @@
"call": "DNS Protocol Type",
"key": "DNS Protocol Type",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:240",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:264",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:12"
]
},
@@ -343,7 +343,7 @@
"call": "DNS Server",
"key": "DNS Server",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:253",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:277",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:24"
]
},
@@ -365,7 +365,7 @@
"call": "Domain Resolver",
"key": "Domain Resolver",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:230"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:254"
]
},
{
@@ -416,8 +416,8 @@
"call": "Dynamic List",
"key": "Dynamic List",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:367",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:447"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:391",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:471"
]
},
{
@@ -431,14 +431,21 @@
"call": "Enable built-in DNS resolver for domains handled by this section",
"key": "Enable built-in DNS resolver for domains handled by this section",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:231"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:255"
]
},
{
"call": "Enable DNS resolve to get real IP when routing",
"key": "Enable DNS resolve to get real IP when routing",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:691"
]
},
{
"call": "Enable Mixed Proxy",
"key": "Enable Mixed Proxy",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:639"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:665"
]
},
{
@@ -452,7 +459,7 @@
"call": "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies",
"key": "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:640"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:666"
]
},
{
@@ -473,70 +480,70 @@
"call": "Enter complete outbound configuration in JSON format",
"key": "Enter complete outbound configuration in JSON format",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:65"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:66"
]
},
{
"call": "Enter domain names separated by commas, spaces, or newlines. You can add comments using //",
"key": "Enter domain names separated by commas, spaces, or newlines. You can add comments using //",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:402"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:426"
]
},
{
"call": "Enter domain names without protocols, e.g. example.com or sub.example.com",
"key": "Enter domain names without protocols, e.g. example.com or sub.example.com",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:376"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:400"
]
},
{
"call": "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses",
"key": "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:456"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:480"
]
},
{
"call": "Every 1 minute",
"key": "Every 1 minute",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:114"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:138"
]
},
{
"call": "Every 3 minutes",
"key": "Every 3 minutes",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:115"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:139"
]
},
{
"call": "Every 30 seconds",
"key": "Every 30 seconds",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:113"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:137"
]
},
{
"call": "Every 5 minutes",
"key": "Every 5 minutes",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:116"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:140"
]
},
{
"call": "Exclude NTP",
"key": "Exclude NTP",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:384"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:402"
]
},
{
"call": "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN",
"key": "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:385"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:403"
]
},
{
@@ -554,15 +561,15 @@
"src/podkop/tabs/diagnostic/initController.ts:231",
"src/podkop/tabs/diagnostic/initController.ts:261",
"src/podkop/tabs/diagnostic/initController.ts:265",
"src/podkop/tabs/diagnostic/initController.ts:299",
"src/podkop/tabs/diagnostic/initController.ts:303"
"src/podkop/tabs/diagnostic/initController.ts:302",
"src/podkop/tabs/diagnostic/initController.ts:306"
]
},
{
"call": "Fastest",
"key": "Fastest",
"places": [
"src/podkop/methods/custom/getDashboardSections.ts:117",
"src/podkop/methods/custom/getDashboardSections.ts:148",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:59"
]
},
@@ -570,7 +577,7 @@
"call": "Fully Routed IPs",
"key": "Fully Routed IPs",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:614"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:638"
]
},
{
@@ -711,14 +718,14 @@
"call": "Invalid HY2 URL: parsing failed",
"key": "Invalid HY2 URL: parsing failed",
"places": [
"src/validators/validateHysteriaUrl.ts:113"
"src/validators/validateHysteriaUrl.ts:115"
]
},
{
"call": "Invalid HY2 URL: sni cannot be empty",
"key": "Invalid HY2 URL: sni cannot be empty",
"places": [
"src/validators/validateHysteriaUrl.ts:106"
"src/validators/validateHysteriaUrl.ts:108"
]
},
{
@@ -936,7 +943,7 @@
"call": "Latest",
"key": "Latest",
"places": [
"src/podkop/tabs/diagnostic/initController.ts:453"
"src/podkop/tabs/diagnostic/initController.ts:456"
]
},
{
@@ -950,14 +957,21 @@
"call": "Local Domain Lists",
"key": "Local Domain Lists",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:522"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:546"
]
},
{
"call": "Local Subnet Lists",
"key": "Local Subnet Lists",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:545"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:569"
]
},
{
"call": "Log Level",
"key": "Log Level",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:384"
]
},
{
@@ -978,7 +992,7 @@
"call": "Mixed Proxy Port",
"key": "Mixed Proxy Port",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:650"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:678"
]
},
{
@@ -992,14 +1006,14 @@
"call": "Must be a number in the range of 50 - 1000",
"key": "Must be a number in the range of 50 - 1000",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:140"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:164"
]
},
{
"call": "Network Interface",
"key": "Network Interface",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:184"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:208"
]
},
{
@@ -1047,21 +1061,21 @@
"call": "Outbound Config",
"key": "Outbound Config",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:26"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:29"
]
},
{
"call": "Outbound Configuration",
"key": "Outbound Configuration",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:64"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:65"
]
},
{
"call": "Outdated",
"key": "Outdated",
"places": [
"src/podkop/tabs/diagnostic/initController.ts:443"
"src/podkop/tabs/diagnostic/initController.ts:446"
]
},
{
@@ -1135,7 +1149,7 @@
"call": "Proxy Configuration URL",
"key": "Proxy Configuration URL",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:34"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:36"
]
},
{
@@ -1156,21 +1170,28 @@
"call": "Regional options cannot be used together",
"key": "Regional options cannot be used together",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:309"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:333"
]
},
{
"call": "Remote Domain Lists",
"key": "Remote Domain Lists",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:568"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592"
]
},
{
"call": "Remote Subnet Lists",
"key": "Remote Subnet Lists",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:591"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:615"
]
},
{
"call": "Resolve real IP for routing",
"key": "Resolve real IP for routing",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:690"
]
},
{
@@ -1198,7 +1219,7 @@
"call": "Routing Excluded IPs",
"key": "Routing Excluded IPs",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:395"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:413"
]
},
{
@@ -1254,7 +1275,7 @@
"call": "Russia inside restrictions",
"key": "Russia inside restrictions",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:328"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:352"
]
},
{
@@ -1275,7 +1296,7 @@
"call": "Select a predefined list for routing",
"key": "Select a predefined list for routing",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:276"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:300"
]
},
{
@@ -1303,21 +1324,21 @@
"call": "Select how to configure the proxy",
"key": "Select how to configure the proxy",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:23"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:24"
]
},
{
"call": "Select network interface for VPN connection",
"key": "Select network interface for VPN connection",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:185"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:209"
]
},
{
"call": "Select or enter DNS server address",
"key": "Select or enter DNS server address",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:254",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:278",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:25"
]
},
@@ -1339,21 +1360,28 @@
"call": "Select the DNS protocol type for the domain resolver",
"key": "Select the DNS protocol type for the domain resolver",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:241"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:265"
]
},
{
"call": "Select the list type for adding custom domains",
"key": "Select the list type for adding custom domains",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:364"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:388"
]
},
{
"call": "Select the list type for adding custom subnets",
"key": "Select the list type for adding custom subnets",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:444"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:468"
]
},
{
"call": "Select the log level for sing-box",
"key": "Select the log level for sing-box",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:385"
]
},
{
@@ -1377,6 +1405,20 @@
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:199"
]
},
{
"call": "Selector",
"key": "Selector",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:27"
]
},
{
"call": "Selector Proxy Links",
"key": "Selector Proxy Links",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:88"
]
},
{
"call": "Services info",
"key": "Services info",
@@ -1459,36 +1501,36 @@
"call": "Specify a local IP address to be excluded from routing",
"key": "Specify a local IP address to be excluded from routing",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:396"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:414"
]
},
{
"call": "Specify local IP addresses or subnets whose traffic will always be routed through the configured route",
"key": "Specify local IP addresses or subnets whose traffic will always be routed through the configured route",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:615"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:639"
]
},
{
"call": "Specify remote URLs to download and use domain lists",
"key": "Specify remote URLs to download and use domain lists",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:569"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:593"
]
},
{
"call": "Specify remote URLs to download and use subnet lists",
"key": "Specify remote URLs to download and use subnet lists",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:616"
]
},
{
"call": "Specify the path to the list file located on the router filesystem",
"key": "Specify the path to the list file located on the router filesystem",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:523",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:546"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:547",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:570"
]
},
{
@@ -1544,8 +1586,8 @@
"call": "Text List",
"key": "Text List",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:368",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:448"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:392",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:472"
]
},
{
@@ -1559,21 +1601,21 @@
"call": "The interval between connectivity tests",
"key": "The interval between connectivity tests",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:135"
]
},
{
"call": "The maximum difference in response times (ms) allowed when comparing servers",
"key": "The maximum difference in response times (ms) allowed when comparing servers",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:124"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:148"
]
},
{
"call": "The URL used to test server connectivity",
"key": "The URL used to test server connectivity",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:147"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:171"
]
},
{
@@ -1622,7 +1664,7 @@
"call": "UDP (Unprotected DNS)",
"key": "UDP (Unprotected DNS)",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:245",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:269",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:17"
]
},
@@ -1630,7 +1672,7 @@
"call": "UDP over TCP",
"key": "UDP over TCP",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:174"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:198"
]
},
{
@@ -1643,7 +1685,7 @@
"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"
"src/podkop/tabs/diagnostic/initController.ts:420"
]
},
{
@@ -1679,77 +1721,77 @@
"call": "URLTest",
"key": "URLTest",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:27"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:28"
]
},
{
"call": "URLTest Check Interval",
"key": "URLTest Check Interval",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:134"
]
},
{
"call": "URLTest Proxy Links",
"key": "URLTest Proxy Links",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:87"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111"
]
},
{
"call": "URLTest Testing URL",
"key": "URLTest Testing URL",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:146"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:170"
]
},
{
"call": "URLTest Tolerance",
"key": "URLTest Tolerance",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:123"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:147"
]
},
{
"call": "User Domain List Type",
"key": "User Domain List Type",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:363"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:387"
]
},
{
"call": "User Domains",
"key": "User Domains",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:375"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:399"
]
},
{
"call": "User Domains List",
"key": "User Domains List",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:401"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:425"
]
},
{
"call": "User Subnet List Type",
"key": "User Subnet List Type",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:443"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:467"
]
},
{
"call": "User Subnets",
"key": "User Subnets",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:455"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:479"
]
},
{
"call": "User Subnets List",
"key": "User Subnets List",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:481"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:505"
]
},
{
@@ -1760,7 +1802,7 @@
"src/validators/validateDns.ts:18",
"src/validators/validateDomain.ts:13",
"src/validators/validateDomain.ts:30",
"src/validators/validateHysteriaUrl.ts:111",
"src/validators/validateHysteriaUrl.ts:113",
"src/validators/validateIp.ts:8",
"src/validators/validateOutboundJson.ts:7",
"src/validators/validatePath.ts:16",
@@ -1776,8 +1818,8 @@
"call": "Validation errors:",
"key": "Validation errors:",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:434",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:513"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:458",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:537"
]
},
{
@@ -1795,18 +1837,27 @@
"src/podkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts:31"
]
},
{
"call": "vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links",
"key": "vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:37",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:89",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:112"
]
},
{
"call": "Warning: %s cannot be used together with %s. Previous selections have been removed.",
"key": "Warning: %s cannot be used together with %s. Previous selections have been removed.",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:311"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:335"
]
},
{
"call": "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection.",
"key": "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection.",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:330"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:354"
]
},
{

View File

@@ -1,15 +1,15 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER
# Copyright (C) 2026 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PODKOP package.
# divocat <divocatt@gmail.com>, 2025.
# romanvht <romanvht@gmail.com>, 2026.
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PODKOP\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-01 14:30+0200\n"
"PO-Revision-Date: 2025-12-01 14:30+0200\n"
"Last-Translator: divocat <divocatt@gmail.com>\n"
"POT-Creation-Date: 2026-05-09 02:49+1000\n"
"PO-Revision-Date: 2026-05-09 02:49+1000\n"
"Last-Translator: romanvht <romanvht@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
@@ -44,15 +44,15 @@ msgstr ""
msgid "Allows access to YACD from the WAN. Make sure to open the appropriate port in your firewall."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:175
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:199
msgid "Applicable for SOCKS and Shadowsocks proxy"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:420
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:444
msgid "At least one valid domain must be specified. Comments-only content is not allowed."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:501
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:525
msgid "At least one valid subnet or IP must be specified. Comments-only content is not allowed."
msgstr ""
@@ -119,7 +119,7 @@ msgstr ""
msgid "Close"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:275
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:299
msgid "Community Lists"
msgstr ""
@@ -131,7 +131,7 @@ msgstr ""
msgid "Configuration for Podkop service"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:22
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:23
msgid "Configuration Type"
msgstr ""
@@ -139,7 +139,7 @@ msgstr ""
msgid "Connection Type"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:25
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:26
msgid "Connection URL"
msgstr ""
@@ -187,8 +187,8 @@ msgstr ""
msgid "Disable the QUIC protocol to improve compatibility or fix issues with video streaming"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:366
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:446
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:390
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:470
msgid "Disabled"
msgstr ""
@@ -196,17 +196,17 @@ msgstr ""
msgid "DNS on router"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:243
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:267
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:15
msgid "DNS over HTTPS (DoH)"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:244
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:268
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:16
msgid "DNS over TLS (DoT)"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:240
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:264
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:12
msgid "DNS Protocol Type"
msgstr ""
@@ -215,7 +215,7 @@ msgstr ""
msgid "DNS Rewrite TTL"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:253
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:277
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:24
msgid "DNS Server"
msgstr ""
@@ -228,7 +228,7 @@ msgstr ""
msgid "Do not panic, everything can be fixed, just..."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:230
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:254
msgid "Domain Resolver"
msgstr ""
@@ -258,8 +258,8 @@ msgstr ""
msgid "Downloading all lists via specific Proxy/VPN"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:367
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:447
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:391
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:471
msgid "Dynamic List"
msgstr ""
@@ -267,11 +267,15 @@ msgstr ""
msgid "Enable autostart"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:231
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:255
msgid "Enable built-in DNS resolver for domains handled by this section"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:639
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:691
msgid "Enable DNS resolve to get real IP when routing"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:665
msgid "Enable Mixed Proxy"
msgstr ""
@@ -279,7 +283,7 @@ msgstr ""
msgid "Enable Output Network Interface"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:640
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:666
msgid "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies"
msgstr ""
@@ -291,43 +295,43 @@ msgstr ""
msgid "Enable YACD WAN Access"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:65
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:66
msgid "Enter complete outbound configuration in JSON format"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:402
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:426
msgid "Enter domain names separated by commas, spaces, or newlines. You can add comments using //"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:376
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:400
msgid "Enter domain names without protocols, e.g. example.com or sub.example.com"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:456
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:480
msgid "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:114
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:138
msgid "Every 1 minute"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:115
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:139
msgid "Every 3 minutes"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:113
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:137
msgid "Every 30 seconds"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:116
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:140
msgid "Every 5 minutes"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:384
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:402
msgid "Exclude NTP"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:385
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:403
msgid "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN"
msgstr ""
@@ -339,17 +343,17 @@ msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:231
#: src/podkop/tabs/diagnostic/initController.ts:261
#: src/podkop/tabs/diagnostic/initController.ts:265
#: src/podkop/tabs/diagnostic/initController.ts:299
#: src/podkop/tabs/diagnostic/initController.ts:303
#: src/podkop/tabs/diagnostic/initController.ts:302
#: src/podkop/tabs/diagnostic/initController.ts:306
msgid "Failed to execute!"
msgstr ""
#: src/podkop/methods/custom/getDashboardSections.ts:117
#: src/podkop/methods/custom/getDashboardSections.ts:148
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:59
msgid "Fastest"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:614
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:638
msgid "Fully Routed IPs"
msgstr ""
@@ -430,11 +434,11 @@ msgstr ""
msgid "Invalid HY2 URL: obfs-password required when obfs is set"
msgstr ""
#: src/validators/validateHysteriaUrl.ts:113
#: src/validators/validateHysteriaUrl.ts:115
msgid "Invalid HY2 URL: parsing failed"
msgstr ""
#: src/validators/validateHysteriaUrl.ts:106
#: src/validators/validateHysteriaUrl.ts:108
msgid "Invalid HY2 URL: sni cannot be empty"
msgstr ""
@@ -559,7 +563,7 @@ msgstr ""
msgid "Issues detected"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:453
#: src/podkop/tabs/diagnostic/initController.ts:456
msgid "Latest"
msgstr ""
@@ -567,14 +571,18 @@ msgstr ""
msgid "List Update Frequency"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:522
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:546
msgid "Local Domain Lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:545
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:569
msgid "Local Subnet Lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:384
msgid "Log Level"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:72
msgid "Main DNS"
msgstr ""
@@ -583,7 +591,7 @@ msgstr ""
msgid "Memory Usage"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:650
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:678
msgid "Mixed Proxy Port"
msgstr ""
@@ -591,11 +599,11 @@ msgstr ""
msgid "Monitored Interfaces"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:140
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:164
msgid "Must be a number in the range of 50 - 1000"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:184
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:208
msgid "Network Interface"
msgstr ""
@@ -625,15 +633,15 @@ msgstr ""
msgid "Operation timed out"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:26
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:29
msgid "Outbound Config"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:64
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:65
msgid "Outbound Configuration"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:443
#: src/podkop/tabs/diagnostic/initController.ts:446
msgid "Outdated"
msgstr ""
@@ -677,7 +685,7 @@ msgstr ""
msgid "Podkop will not modify your DHCP configuration"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:34
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:36
msgid "Proxy Configuration URL"
msgstr ""
@@ -689,18 +697,22 @@ msgstr ""
msgid "Proxy traffic is routed via FakeIP"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:309
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:333
msgid "Regional options cannot be used together"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:568
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592
msgid "Remote Domain Lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:591
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:615
msgid "Remote Subnet Lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:690
msgid "Resolve real IP for routing"
msgstr ""
#: src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:49
msgid "Restart podkop"
msgstr ""
@@ -713,7 +725,7 @@ msgstr ""
msgid "Router DNS is routed through sing-box"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:395
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:413
msgid "Routing Excluded IPs"
msgstr ""
@@ -745,7 +757,7 @@ msgstr ""
msgid "Run Diagnostic"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:328
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:352
msgid "Russia inside restrictions"
msgstr ""
@@ -757,7 +769,7 @@ msgstr ""
msgid "Sections"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:276
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:300
msgid "Select a predefined list for routing"
msgstr ""
@@ -773,15 +785,15 @@ msgstr ""
msgid "Select how often the domain or subnet lists are updated automatically"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:23
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:24
msgid "Select how to configure the proxy"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:185
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:209
msgid "Select network interface for VPN connection"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:254
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:278
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:25
msgid "Select or enter DNS server address"
msgstr ""
@@ -794,18 +806,22 @@ msgstr ""
msgid "Select path for sing-box config file. Change this ONLY if you know what you are doing"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:241
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:265
msgid "Select the DNS protocol type for the domain resolver"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:364
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:388
msgid "Select the list type for adding custom domains"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:444
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:468
msgid "Select the list type for adding custom subnets"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:385
msgid "Select the log level for sing-box"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:90
msgid "Select the network interface from which the traffic will originate"
msgstr ""
@@ -818,6 +834,14 @@ msgstr ""
msgid "Select the WAN interfaces to be monitored"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:27
msgid "Selector"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:88
msgid "Selector Proxy Links"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:340
msgid "Services info"
msgstr ""
@@ -863,24 +887,24 @@ msgstr ""
msgid "Source Network Interface"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:396
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:414
msgid "Specify a local IP address to be excluded from routing"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:615
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:639
msgid "Specify local IP addresses or subnets whose traffic will always be routed through the configured route"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:569
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:593
msgid "Specify remote URLs to download and use domain lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:616
msgid "Specify remote URLs to download and use subnet lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:523
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:546
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:547
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:570
msgid "Specify the path to the list file located on the router filesystem"
msgstr ""
@@ -912,8 +936,8 @@ msgstr ""
msgid "Test latency"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:368
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:448
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:392
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:472
msgid "Text List"
msgstr ""
@@ -921,15 +945,15 @@ msgstr ""
msgid "The DNS server used to look up the IP address of an upstream DNS server"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:135
msgid "The interval between connectivity tests"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:124
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:148
msgid "The maximum difference in response times (ms) allowed when comparing servers"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:147
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:171
msgid "The URL used to test server connectivity"
msgstr ""
@@ -957,12 +981,12 @@ msgstr ""
msgid "TTL value cannot be empty"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:245
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:269
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:17
msgid "UDP (Unprotected DNS)"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:174
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:198
msgid "UDP over TCP"
msgstr ""
@@ -972,7 +996,7 @@ msgstr ""
#: 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
#: src/podkop/tabs/diagnostic/initController.ts:420
msgid "unknown"
msgstr ""
@@ -993,47 +1017,47 @@ msgstr ""
msgid "URL must use one of the following protocols:"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:27
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:28
msgid "URLTest"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:134
msgid "URLTest Check Interval"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:87
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111
msgid "URLTest Proxy Links"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:146
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:170
msgid "URLTest Testing URL"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:123
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:147
msgid "URLTest Tolerance"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:363
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:387
msgid "User Domain List Type"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:375
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:399
msgid "User Domains"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:401
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:425
msgid "User Domains List"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:443
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:467
msgid "User Subnet List Type"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:455
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:479
msgid "User Subnets"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:481
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:505
msgid "User Subnets List"
msgstr ""
@@ -1041,7 +1065,7 @@ msgstr ""
#: src/validators/validateDns.ts:18
#: src/validators/validateDomain.ts:13
#: src/validators/validateDomain.ts:30
#: src/validators/validateHysteriaUrl.ts:111
#: src/validators/validateHysteriaUrl.ts:113
#: src/validators/validateIp.ts:8
#: src/validators/validateOutboundJson.ts:7
#: src/validators/validatePath.ts:16
@@ -1054,8 +1078,8 @@ msgstr ""
msgid "Valid"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:434
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:513
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:458
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:537
msgid "Validation errors:"
msgstr ""
@@ -1068,11 +1092,17 @@ msgstr ""
msgid "Visit Wiki"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:311
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:37
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:89
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:112
msgid "vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:335
msgid "Warning: %s cannot be used together with %s. Previous selections have been removed."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:330
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:354
msgid "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection."
msgstr ""

View File

@@ -1,15 +1,15 @@
# RU translations for PODKOP package.
# Copyright (C) 2025 THE PODKOP'S COPYRIGHT HOLDER
# Copyright (C) 2026 THE PODKOP'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PODKOP package.
# divocat, 2025.
# romanvht, 2026.
#
msgid ""
msgstr ""
"Project-Id-Version: PODKOP\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-01 16:30+0200\n"
"PO-Revision-Date: 2025-12-01 16:30+0200\n"
"Last-Translator: divocat\n"
"POT-Creation-Date: 2026-05-09 12:50+1000\n"
"PO-Revision-Date: 2026-05-09 12:50+1000\n"
"Last-Translator: romanvht\n"
"Language-Team: none\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
@@ -197,6 +197,9 @@ msgstr "Включить автостарт"
msgid "Enable built-in DNS resolver for domains handled by this section"
msgstr "Включить встроенный DNS-резолвер для доменов, обрабатываемых в этом разделе"
msgid "Enable DNS resolve to get real IP when routing"
msgstr "Разрешать домены в реальные IP-адреса перед маршрутизацией в outbound"
msgid "Enable Mixed Proxy"
msgstr "Включить смешанный прокси"
@@ -419,6 +422,9 @@ msgstr "Локальные списки доменов"
msgid "Local Subnet Lists"
msgstr "Локальные списки подсетей"
msgid "Log Level"
msgstr "Уровень логов"
msgid "Main DNS"
msgstr "Основной DNS"
@@ -506,6 +512,9 @@ msgstr "Внешние списки доменов"
msgid "Remote Subnet Lists"
msgstr "Внешние списки подсетей"
msgid "Resolve real IP for routing"
msgstr "Разрешение реальных IP-адресов"
msgid "Restart podkop"
msgstr "Перезапустить Podkop"
@@ -584,6 +593,9 @@ msgstr "Выберите тип списка для добавления пол
msgid "Select the list type for adding custom subnets"
msgstr "Выберите тип списка для добавления пользовательских подсетей"
msgid "Select the log level for sing-box"
msgstr "Выберите уровень логов для sing-box"
msgid "Select the network interface from which the traffic will originate"
msgstr "Выберите сетевой интерфейс, с которого будет исходить трафик"
@@ -593,6 +605,12 @@ msgstr "Выберите сетевой интерфейс, на который
msgid "Select the WAN interfaces to be monitored"
msgstr "Выберите WAN интерфейсы для мониторинга"
msgid "Selector"
msgstr "Selector"
msgid "Selector Proxy Links"
msgstr "Ссылки прокси для Selector"
msgid "Services info"
msgstr "Информация о сервисах"
@@ -761,6 +779,9 @@ msgstr "Посмотреть логи"
msgid "Visit Wiki"
msgstr "Перейти в wiki"
msgid "vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgstr ""
msgid "Warning: %s cannot be used together with %s. Previous selections have been removed."
msgstr "Предупреждение: %s нельзя использовать вместе с %s. Предыдущие варианты были удалены."

View File

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

View File

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

View File

@@ -0,0 +1,3 @@
export function removeVersionPrefix(version: string) {
return version.replace(/^v/, '');
}

View File

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

View File

@@ -0,0 +1,52 @@
import { normalizeCompiledVersion } from '../../../../helpers/normalizeCompiledVersion';
import { removeVersionPrefix } from '../../../../helpers/removeVersionPrefix';
import type { StoreType } from '../../../services/store.service';
import type { IRenderSystemInfoRow } from '../partials';
function isUnknownVersion(version?: string | null): boolean {
return version === 'unknown' || version === _('unknown');
}
export function getPodkopVersionRow(
diagnosticsSystemInfo: StoreType['diagnosticsSystemInfo'],
): IRenderSystemInfoRow {
const loading = diagnosticsSystemInfo.loading;
const unknown = isUnknownVersion(diagnosticsSystemInfo.podkop_version);
const hasActualVersion =
Boolean(diagnosticsSystemInfo.podkop_latest_version) &&
!isUnknownVersion(diagnosticsSystemInfo.podkop_latest_version);
const version = normalizeCompiledVersion(
diagnosticsSystemInfo.podkop_version,
);
const isDevVersion = version === 'dev';
if (loading || unknown || !hasActualVersion || isDevVersion) {
return {
key: 'Podkop',
value: version,
};
}
if (
removeVersionPrefix(version) !==
removeVersionPrefix(diagnosticsSystemInfo.podkop_latest_version)
) {
return {
key: 'Podkop',
value: version,
tag: {
label: _('Outdated'),
kind: 'warning',
},
};
}
return {
key: 'Podkop',
value: version,
tag: {
label: _('Latest'),
kind: 'success',
},
};
}

View File

@@ -6,7 +6,6 @@ import { runFakeIPCheck } from './checks/runFakeIPCheck';
import { loadingDiagnosticsChecksStore } from './diagnostic.store';
import { logger, store, StoreType } from '../../services';
import {
IRenderSystemInfoRow,
renderAvailableActions,
renderCheckSection,
renderRunAction,
@@ -20,6 +19,7 @@ import { PODKOP_LUCI_APP_VERSION } from '../../../constants';
import { showToast } from '../../../helpers/showToast';
import { renderWikiDisclaimer } from './partials/renderWikiDisclaimer';
import { runSectionsCheck } from './checks/runSectionsCheck';
import { getPodkopVersionRow } from './helpers/getPodkopVersionRow';
async function fetchSystemInfo() {
const systemInfo = await PodkopShellMethods.getSystemInfo();
@@ -288,7 +288,10 @@ async function handleShowSingBoxConfig() {
if (showSingBoxConfig.success) {
ui.showModal(
_('Show sing-box config'),
renderModal(showSingBoxConfig.data as string, 'show_sing_box_config'),
renderModal(
JSON.stringify(showSingBoxConfig.data, null, 2),
'show_sing_box_config',
),
);
} else {
logger.error(
@@ -412,53 +415,9 @@ function renderDiagnosticSystemInfoWidget() {
const container = document.getElementById('pdk_diagnostic-page-system-info');
function getPodkopVersionRow(): IRenderSystemInfoRow {
const loading = diagnosticsSystemInfo.loading;
const unknown = diagnosticsSystemInfo.podkop_version === _('unknown');
const hasActualVersion =
Boolean(diagnosticsSystemInfo.podkop_latest_version) &&
diagnosticsSystemInfo.podkop_latest_version !== 'unknown';
const version = normalizeCompiledVersion(
diagnosticsSystemInfo.podkop_version,
);
const isDevVersion = version === 'dev';
if (loading || unknown || !hasActualVersion || isDevVersion) {
return {
key: 'Podkop',
value: version,
};
}
if (version !== `v${diagnosticsSystemInfo.podkop_latest_version}`) {
logger.debug(
'[DIAGNOSTIC]',
'diagnosticsSystemInfo',
diagnosticsSystemInfo,
);
return {
key: 'Podkop',
value: version,
tag: {
label: _('Outdated'),
kind: 'warning',
},
};
}
return {
key: 'Podkop',
value: version,
tag: {
label: _('Latest'),
kind: 'success',
},
};
}
const renderedSystemInfo = renderSystemInfo({
items: [
getPodkopVersionRow(),
getPodkopVersionRow(diagnosticsSystemInfo),
{
key: 'Luci App',
value: normalizeCompiledVersion(PODKOP_LUCI_APP_VERSION),

View File

@@ -0,0 +1,69 @@
import { describe, expect, it } from 'vitest';
import { getPodkopVersionRow } from '../helpers/getPodkopVersionRow';
import type { StoreType } from '../../../services/store.service';
function makeDiagnosticsSystemInfo(
patch: Partial<StoreType['diagnosticsSystemInfo']> = {},
): StoreType['diagnosticsSystemInfo'] {
return {
loading: false,
podkop_version: '1.2.3',
podkop_latest_version: '1.2.3',
luci_app_version: '1.0.0',
sing_box_version: '1.11.0',
openwrt_version: 'OpenWrt 25.12',
device_model: 'Test Router',
...patch,
};
}
describe('getPodkopVersionRow', () => {
it('returns Latest when versions differ only by leading v', () => {
const row = getPodkopVersionRow(
makeDiagnosticsSystemInfo({
podkop_version: 'v1.2.3',
podkop_latest_version: '1.2.3',
}),
);
expect(row).toEqual({
key: 'Podkop',
value: 'v1.2.3',
tag: {
label: 'Latest',
kind: 'success',
},
});
});
it('returns Outdated when versions differ', () => {
const row = getPodkopVersionRow(
makeDiagnosticsSystemInfo({
podkop_version: '1.2.2',
podkop_latest_version: '1.2.3',
}),
);
expect(row).toEqual({
key: 'Podkop',
value: '1.2.2',
tag: {
label: 'Outdated',
kind: 'warning',
},
});
});
it('returns plain row without tag for dev build', () => {
const row = getPodkopVersionRow(
makeDiagnosticsSystemInfo({
podkop_version: 'COMPILED_VERSION',
}),
);
expect(row).toEqual({
key: 'Podkop',
value: 'dev',
});
});
});

View File

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

View File

@@ -109,16 +109,16 @@ main() {
pkg_list_update || { echo "Packages list update failed"; exit 1; }
if [ -f "/etc/init.d/podkop" ]; then
msg "Podkop is already installed. Upgraded..."
msg "Podkop is already installed. Upgrading..."
else
msg "Installed podkop..."
msg "Installing podkop..."
fi
if command -v curl >/dev/null 2>&1; then
check_response=$(curl -s "https://api.github.com/repos/itdoginfo/podkop/releases/latest")
if echo "$check_response" | grep -q 'API rate limit '; then
msg "You've reached rate limit from GitHub. Repeat in five minutes."
msg "You've reached the GitHub rate limit. Repeat in five minutes."
exit 1
fi
fi
@@ -143,7 +143,7 @@ main() {
break
fi
fi
msg "Download error $filename. Retry..."
msg "Download error for $filename. Retrying..."
rm -f "$filepath"
attempt=$((attempt+1))
done
@@ -168,7 +168,7 @@ main() {
fi
done
if [ -n "$file" ]; then
msg "Installing $file"
msg "Installing $file..."
pkg_install "$DOWNLOAD_DIR/$file"
sleep 3
fi
@@ -183,11 +183,11 @@ main() {
done
if [ -n "$ru" ]; then
if pkg_is_installed luci-i18n-podkop-ru; then
msg "Upgraded ru translation..."
msg "Upgrading Russian translation..."
pkg_remove luci-i18n-podkop*
pkg_install "$DOWNLOAD_DIR/$ru"
else
msg "Русский язык интерфейса ставим? y/n (Need a Russian translation?)"
msg "Русский язык интерфейса ставим? y/n (Install the Russian interface language?)"
while true; do
read -r -p '' RUS
case $RUS in
@@ -236,7 +236,7 @@ check_system() {
fi
if ! nslookup google.com >/dev/null 2>&1; then
msg "DNS not working"
msg "DNS is not working."
exit 1
fi
@@ -270,7 +270,7 @@ check_system() {
fi
if pkg_is_installed https-dns-proxy; then
msg "Сonflicting package detected: https-dns-proxy. Remove?"
msg "Conflicting package detected: https-dns-proxy. Remove?"
while true; do
read -r -p '' DNSPROXY
@@ -300,7 +300,7 @@ sing_box() {
required_version="1.12.4"
if [ "$(printf '%s\n%s\n' "$sing_box_version" "$required_version" | sort -V | head -n 1)" != "$required_version" ]; then
msg "sing-box version $sing_box_version is older than required $required_version"
msg "sing-box version $sing_box_version is older than the required version $required_version."
msg "Removing old version..."
service podkop stop
pkg_remove sing-box

View File

@@ -757,6 +757,30 @@ async function getDashboardSections() {
]
};
}
if (section.proxy_config_type === "selector") {
const selector = proxies.find(
(proxy) => proxy.code === `${section[".name"]}-out`
);
const links = section.selector_proxy_links ?? [];
const outbounds = links.map((link, index) => ({
link,
outbound: proxies.find(
(item) => item.code === `${section[".name"]}-${index + 1}-out`
)
})).map((item) => ({
code: item?.outbound?.code || "",
displayName: getProxyUrlName(item.link) || item?.outbound?.value?.name || "",
latency: item?.outbound?.value?.history?.[0]?.delay || 0,
type: item?.outbound?.value?.type || "",
selected: selector?.value?.now === item?.outbound?.code
}));
return {
withTagSelect: true,
code: selector?.code || section[".name"],
displayName: section[".name"],
outbounds
};
}
if (section.proxy_config_type === "urltest") {
const selector = proxies.find(
(proxy) => proxy.code === `${section[".name"]}-out`
@@ -860,6 +884,7 @@ var ALLOWED_WITH_RUSSIA_INSIDE = [
"hetzner",
"ovh",
"hodca",
"roblox",
"digitalocean",
"cloudfront"
];
@@ -883,6 +908,7 @@ var DOMAIN_LIST_OPTIONS = {
google_ai: "Google AI",
google_play: "Google Play",
hodca: "H.O.D.C.A",
roblox: "Roblox",
hetzner: "Hetzner ASN",
ovh: "OVH ASN",
digitalocean: "Digital Ocean ASN",
@@ -3899,6 +3925,49 @@ async function runSectionsCheck() {
}
}
// src/helpers/removeVersionPrefix.ts
function removeVersionPrefix(version) {
return version.replace(/^v/, "");
}
// src/podkop/tabs/diagnostic/helpers/getPodkopVersionRow.ts
function isUnknownVersion(version) {
return version === "unknown" || version === _("unknown");
}
function getPodkopVersionRow(diagnosticsSystemInfo) {
const loading = diagnosticsSystemInfo.loading;
const unknown = isUnknownVersion(diagnosticsSystemInfo.podkop_version);
const hasActualVersion = Boolean(diagnosticsSystemInfo.podkop_latest_version) && !isUnknownVersion(diagnosticsSystemInfo.podkop_latest_version);
const version = normalizeCompiledVersion(
diagnosticsSystemInfo.podkop_version
);
const isDevVersion = version === "dev";
if (loading || unknown || !hasActualVersion || isDevVersion) {
return {
key: "Podkop",
value: version
};
}
if (removeVersionPrefix(version) !== removeVersionPrefix(diagnosticsSystemInfo.podkop_latest_version)) {
return {
key: "Podkop",
value: version,
tag: {
label: _("Outdated"),
kind: "warning"
}
};
}
return {
key: "Podkop",
value: version,
tag: {
label: _("Latest"),
kind: "success"
}
};
}
// src/podkop/tabs/diagnostic/initController.ts
async function fetchSystemInfo() {
const systemInfo = await PodkopShellMethods.getSystemInfo();
@@ -4138,7 +4207,10 @@ async function handleShowSingBoxConfig() {
if (showSingBoxConfig.success) {
ui.showModal(
_("Show sing-box config"),
renderModal(showSingBoxConfig.data, "show_sing_box_config")
renderModal(
JSON.stringify(showSingBoxConfig.data, null, 2),
"show_sing_box_config"
)
);
} else {
logger.error(
@@ -4243,47 +4315,9 @@ function renderDiagnosticSystemInfoWidget() {
logger.debug("[DIAGNOSTIC]", "renderDiagnosticSystemInfoWidget");
const diagnosticsSystemInfo = store.get().diagnosticsSystemInfo;
const container = document.getElementById("pdk_diagnostic-page-system-info");
function getPodkopVersionRow() {
const loading = diagnosticsSystemInfo.loading;
const unknown = diagnosticsSystemInfo.podkop_version === _("unknown");
const hasActualVersion = Boolean(diagnosticsSystemInfo.podkop_latest_version) && diagnosticsSystemInfo.podkop_latest_version !== "unknown";
const version = normalizeCompiledVersion(
diagnosticsSystemInfo.podkop_version
);
const isDevVersion = version === "dev";
if (loading || unknown || !hasActualVersion || isDevVersion) {
return {
key: "Podkop",
value: version
};
}
if (version !== `v${diagnosticsSystemInfo.podkop_latest_version}`) {
logger.debug(
"[DIAGNOSTIC]",
"diagnosticsSystemInfo",
diagnosticsSystemInfo
);
return {
key: "Podkop",
value: version,
tag: {
label: _("Outdated"),
kind: "warning"
}
};
}
return {
key: "Podkop",
value: version,
tag: {
label: _("Latest"),
kind: "success"
}
};
}
const renderedSystemInfo = renderSystemInfo({
items: [
getPodkopVersionRow(),
getPodkopVersionRow(diagnosticsSystemInfo),
{
key: "Luci App",
value: normalizeCompiledVersion(PODKOP_LUCI_APP_VERSION)

View File

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

View File

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

View File

@@ -1,15 +1,15 @@
# RU translations for PODKOP package.
# Copyright (C) 2025 THE PODKOP'S COPYRIGHT HOLDER
# Copyright (C) 2026 THE PODKOP'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PODKOP package.
# divocat, 2025.
# romanvht, 2026.
#
msgid ""
msgstr ""
"Project-Id-Version: PODKOP\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-01 16:30+0200\n"
"PO-Revision-Date: 2025-12-01 16:30+0200\n"
"Last-Translator: divocat\n"
"POT-Creation-Date: 2026-05-09 12:50+1000\n"
"PO-Revision-Date: 2026-05-09 12:50+1000\n"
"Last-Translator: romanvht\n"
"Language-Team: none\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
@@ -197,6 +197,9 @@ msgstr "Включить автостарт"
msgid "Enable built-in DNS resolver for domains handled by this section"
msgstr "Включить встроенный DNS-резолвер для доменов, обрабатываемых в этом разделе"
msgid "Enable DNS resolve to get real IP when routing"
msgstr "Разрешать домены в реальные IP-адреса перед маршрутизацией в outbound"
msgid "Enable Mixed Proxy"
msgstr "Включить смешанный прокси"
@@ -419,6 +422,9 @@ msgstr "Локальные списки доменов"
msgid "Local Subnet Lists"
msgstr "Локальные списки подсетей"
msgid "Log Level"
msgstr "Уровень логов"
msgid "Main DNS"
msgstr "Основной DNS"
@@ -506,6 +512,9 @@ msgstr "Внешние списки доменов"
msgid "Remote Subnet Lists"
msgstr "Внешние списки подсетей"
msgid "Resolve real IP for routing"
msgstr "Разрешение реальных IP-адресов"
msgid "Restart podkop"
msgstr "Перезапустить Podkop"
@@ -584,6 +593,9 @@ msgstr "Выберите тип списка для добавления пол
msgid "Select the list type for adding custom subnets"
msgstr "Выберите тип списка для добавления пользовательских подсетей"
msgid "Select the log level for sing-box"
msgstr "Выберите уровень логов для sing-box"
msgid "Select the network interface from which the traffic will originate"
msgstr "Выберите сетевой интерфейс, с которого будет исходить трафик"
@@ -593,6 +605,12 @@ msgstr "Выберите сетевой интерфейс, на который
msgid "Select the WAN interfaces to be monitored"
msgstr "Выберите WAN интерфейсы для мониторинга"
msgid "Selector"
msgstr "Selector"
msgid "Selector Proxy Links"
msgstr "Ссылки прокси для Selector"
msgid "Services info"
msgstr "Информация о сервисах"
@@ -761,6 +779,9 @@ msgstr "Посмотреть логи"
msgid "Visit Wiki"
msgstr "Перейти в wiki"
msgid "vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgstr ""
msgid "Warning: %s cannot be used together with %s. Previous selections have been removed."
msgstr "Предупреждение: %s нельзя использовать вместе с %s. Предыдущие варианты были удалены."

View File

@@ -1,15 +1,15 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER
# Copyright (C) 2026 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PODKOP package.
# divocat <divocatt@gmail.com>, 2025.
# romanvht <romanvht@gmail.com>, 2026.
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PODKOP\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-01 14:30+0200\n"
"PO-Revision-Date: 2025-12-01 14:30+0200\n"
"Last-Translator: divocat <divocatt@gmail.com>\n"
"POT-Creation-Date: 2026-05-09 02:49+1000\n"
"PO-Revision-Date: 2026-05-09 02:49+1000\n"
"Last-Translator: romanvht <romanvht@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
@@ -44,15 +44,15 @@ msgstr ""
msgid "Allows access to YACD from the WAN. Make sure to open the appropriate port in your firewall."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:175
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:199
msgid "Applicable for SOCKS and Shadowsocks proxy"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:420
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:444
msgid "At least one valid domain must be specified. Comments-only content is not allowed."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:501
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:525
msgid "At least one valid subnet or IP must be specified. Comments-only content is not allowed."
msgstr ""
@@ -119,7 +119,7 @@ msgstr ""
msgid "Close"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:275
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:299
msgid "Community Lists"
msgstr ""
@@ -131,7 +131,7 @@ msgstr ""
msgid "Configuration for Podkop service"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:22
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:23
msgid "Configuration Type"
msgstr ""
@@ -139,7 +139,7 @@ msgstr ""
msgid "Connection Type"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:25
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:26
msgid "Connection URL"
msgstr ""
@@ -187,8 +187,8 @@ msgstr ""
msgid "Disable the QUIC protocol to improve compatibility or fix issues with video streaming"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:366
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:446
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:390
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:470
msgid "Disabled"
msgstr ""
@@ -196,17 +196,17 @@ msgstr ""
msgid "DNS on router"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:243
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:267
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:15
msgid "DNS over HTTPS (DoH)"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:244
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:268
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:16
msgid "DNS over TLS (DoT)"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:240
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:264
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:12
msgid "DNS Protocol Type"
msgstr ""
@@ -215,7 +215,7 @@ msgstr ""
msgid "DNS Rewrite TTL"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:253
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:277
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:24
msgid "DNS Server"
msgstr ""
@@ -228,7 +228,7 @@ msgstr ""
msgid "Do not panic, everything can be fixed, just..."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:230
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:254
msgid "Domain Resolver"
msgstr ""
@@ -258,8 +258,8 @@ msgstr ""
msgid "Downloading all lists via specific Proxy/VPN"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:367
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:447
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:391
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:471
msgid "Dynamic List"
msgstr ""
@@ -267,11 +267,15 @@ msgstr ""
msgid "Enable autostart"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:231
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:255
msgid "Enable built-in DNS resolver for domains handled by this section"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:639
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:691
msgid "Enable DNS resolve to get real IP when routing"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:665
msgid "Enable Mixed Proxy"
msgstr ""
@@ -279,7 +283,7 @@ msgstr ""
msgid "Enable Output Network Interface"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:640
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:666
msgid "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies"
msgstr ""
@@ -291,43 +295,43 @@ msgstr ""
msgid "Enable YACD WAN Access"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:65
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:66
msgid "Enter complete outbound configuration in JSON format"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:402
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:426
msgid "Enter domain names separated by commas, spaces, or newlines. You can add comments using //"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:376
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:400
msgid "Enter domain names without protocols, e.g. example.com or sub.example.com"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:456
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:480
msgid "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:114
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:138
msgid "Every 1 minute"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:115
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:139
msgid "Every 3 minutes"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:113
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:137
msgid "Every 30 seconds"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:116
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:140
msgid "Every 5 minutes"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:384
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:402
msgid "Exclude NTP"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:385
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:403
msgid "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN"
msgstr ""
@@ -339,17 +343,17 @@ msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:231
#: src/podkop/tabs/diagnostic/initController.ts:261
#: src/podkop/tabs/diagnostic/initController.ts:265
#: src/podkop/tabs/diagnostic/initController.ts:299
#: src/podkop/tabs/diagnostic/initController.ts:303
#: src/podkop/tabs/diagnostic/initController.ts:302
#: src/podkop/tabs/diagnostic/initController.ts:306
msgid "Failed to execute!"
msgstr ""
#: src/podkop/methods/custom/getDashboardSections.ts:117
#: src/podkop/methods/custom/getDashboardSections.ts:148
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:59
msgid "Fastest"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:614
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:638
msgid "Fully Routed IPs"
msgstr ""
@@ -430,11 +434,11 @@ msgstr ""
msgid "Invalid HY2 URL: obfs-password required when obfs is set"
msgstr ""
#: src/validators/validateHysteriaUrl.ts:113
#: src/validators/validateHysteriaUrl.ts:115
msgid "Invalid HY2 URL: parsing failed"
msgstr ""
#: src/validators/validateHysteriaUrl.ts:106
#: src/validators/validateHysteriaUrl.ts:108
msgid "Invalid HY2 URL: sni cannot be empty"
msgstr ""
@@ -559,7 +563,7 @@ msgstr ""
msgid "Issues detected"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:453
#: src/podkop/tabs/diagnostic/initController.ts:456
msgid "Latest"
msgstr ""
@@ -567,14 +571,18 @@ msgstr ""
msgid "List Update Frequency"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:522
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:546
msgid "Local Domain Lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:545
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:569
msgid "Local Subnet Lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:384
msgid "Log Level"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:72
msgid "Main DNS"
msgstr ""
@@ -583,7 +591,7 @@ msgstr ""
msgid "Memory Usage"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:650
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:678
msgid "Mixed Proxy Port"
msgstr ""
@@ -591,11 +599,11 @@ msgstr ""
msgid "Monitored Interfaces"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:140
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:164
msgid "Must be a number in the range of 50 - 1000"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:184
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:208
msgid "Network Interface"
msgstr ""
@@ -625,15 +633,15 @@ msgstr ""
msgid "Operation timed out"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:26
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:29
msgid "Outbound Config"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:64
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:65
msgid "Outbound Configuration"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:443
#: src/podkop/tabs/diagnostic/initController.ts:446
msgid "Outdated"
msgstr ""
@@ -677,7 +685,7 @@ msgstr ""
msgid "Podkop will not modify your DHCP configuration"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:34
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:36
msgid "Proxy Configuration URL"
msgstr ""
@@ -689,18 +697,22 @@ msgstr ""
msgid "Proxy traffic is routed via FakeIP"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:309
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:333
msgid "Regional options cannot be used together"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:568
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592
msgid "Remote Domain Lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:591
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:615
msgid "Remote Subnet Lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:690
msgid "Resolve real IP for routing"
msgstr ""
#: src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:49
msgid "Restart podkop"
msgstr ""
@@ -713,7 +725,7 @@ msgstr ""
msgid "Router DNS is routed through sing-box"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:395
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:413
msgid "Routing Excluded IPs"
msgstr ""
@@ -745,7 +757,7 @@ msgstr ""
msgid "Run Diagnostic"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:328
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:352
msgid "Russia inside restrictions"
msgstr ""
@@ -757,7 +769,7 @@ msgstr ""
msgid "Sections"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:276
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:300
msgid "Select a predefined list for routing"
msgstr ""
@@ -773,15 +785,15 @@ msgstr ""
msgid "Select how often the domain or subnet lists are updated automatically"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:23
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:24
msgid "Select how to configure the proxy"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:185
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:209
msgid "Select network interface for VPN connection"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:254
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:278
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:25
msgid "Select or enter DNS server address"
msgstr ""
@@ -794,18 +806,22 @@ msgstr ""
msgid "Select path for sing-box config file. Change this ONLY if you know what you are doing"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:241
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:265
msgid "Select the DNS protocol type for the domain resolver"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:364
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:388
msgid "Select the list type for adding custom domains"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:444
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:468
msgid "Select the list type for adding custom subnets"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:385
msgid "Select the log level for sing-box"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:90
msgid "Select the network interface from which the traffic will originate"
msgstr ""
@@ -818,6 +834,14 @@ msgstr ""
msgid "Select the WAN interfaces to be monitored"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:27
msgid "Selector"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:88
msgid "Selector Proxy Links"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:340
msgid "Services info"
msgstr ""
@@ -863,24 +887,24 @@ msgstr ""
msgid "Source Network Interface"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:396
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:414
msgid "Specify a local IP address to be excluded from routing"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:615
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:639
msgid "Specify local IP addresses or subnets whose traffic will always be routed through the configured route"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:569
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:593
msgid "Specify remote URLs to download and use domain lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:616
msgid "Specify remote URLs to download and use subnet lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:523
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:546
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:547
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:570
msgid "Specify the path to the list file located on the router filesystem"
msgstr ""
@@ -912,8 +936,8 @@ msgstr ""
msgid "Test latency"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:368
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:448
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:392
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:472
msgid "Text List"
msgstr ""
@@ -921,15 +945,15 @@ msgstr ""
msgid "The DNS server used to look up the IP address of an upstream DNS server"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:135
msgid "The interval between connectivity tests"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:124
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:148
msgid "The maximum difference in response times (ms) allowed when comparing servers"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:147
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:171
msgid "The URL used to test server connectivity"
msgstr ""
@@ -957,12 +981,12 @@ msgstr ""
msgid "TTL value cannot be empty"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:245
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:269
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:17
msgid "UDP (Unprotected DNS)"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:174
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:198
msgid "UDP over TCP"
msgstr ""
@@ -972,7 +996,7 @@ msgstr ""
#: 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
#: src/podkop/tabs/diagnostic/initController.ts:420
msgid "unknown"
msgstr ""
@@ -993,47 +1017,47 @@ msgstr ""
msgid "URL must use one of the following protocols:"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:27
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:28
msgid "URLTest"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:134
msgid "URLTest Check Interval"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:87
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111
msgid "URLTest Proxy Links"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:146
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:170
msgid "URLTest Testing URL"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:123
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:147
msgid "URLTest Tolerance"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:363
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:387
msgid "User Domain List Type"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:375
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:399
msgid "User Domains"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:401
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:425
msgid "User Domains List"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:443
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:467
msgid "User Subnet List Type"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:455
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:479
msgid "User Subnets"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:481
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:505
msgid "User Subnets List"
msgstr ""
@@ -1041,7 +1065,7 @@ msgstr ""
#: src/validators/validateDns.ts:18
#: src/validators/validateDomain.ts:13
#: src/validators/validateDomain.ts:30
#: src/validators/validateHysteriaUrl.ts:111
#: src/validators/validateHysteriaUrl.ts:113
#: src/validators/validateIp.ts:8
#: src/validators/validateOutboundJson.ts:7
#: src/validators/validatePath.ts:16
@@ -1054,8 +1078,8 @@ msgstr ""
msgid "Valid"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:434
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:513
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:458
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:537
msgid "Validation errors:"
msgstr ""
@@ -1068,11 +1092,17 @@ msgstr ""
msgid "Visit Wiki"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:311
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:37
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:89
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:112
msgid "vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:335
msgid "Warning: %s cannot be used together with %s. Previous selections have been removed."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:330
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:354
msgid "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection."
msgstr ""

View File

@@ -1,6 +1,6 @@
config settings 'settings'
option dns_type 'udp'
option dns_server '8.8.8.8'
option dns_server '77.88.8.8'
option bootstrap_dns_server '77.88.8.8'
option dns_rewrite_ttl '60'
list source_network_interfaces 'br-lan'
@@ -16,6 +16,7 @@ config settings 'settings'
option dont_touch_dhcp '0'
option config_path '/etc/sing-box/config.json'
option cache_path '/tmp/sing-box/cache.db'
option log_level 'warn'
option exclude_ntp '0'
option shutdown_correctly '0'
#list routing_excluded_ips '192.168.1.3'

View File

@@ -12,6 +12,7 @@ check_required_file() {
PODKOP_LIB="/usr/lib/podkop"
check_required_file /lib/functions.sh
check_required_file /lib/config/uci.sh
check_required_file /lib/functions/network.sh
check_required_file "$PODKOP_LIB/constants.sh"
check_required_file "$PODKOP_LIB/nft.sh"
check_required_file "$PODKOP_LIB/helpers.sh"
@@ -19,8 +20,9 @@ check_required_file "$PODKOP_LIB/sing_box_config_manager.sh"
check_required_file "$PODKOP_LIB/sing_box_config_facade.sh"
check_required_file "$PODKOP_LIB/logging.sh"
check_required_file "$PODKOP_LIB/rulesets.sh"
. /lib/config/uci.sh
. /lib/functions.sh
. /lib/config/uci.sh
. /lib/functions/network.sh
. "$PODKOP_LIB/constants.sh"
. "$PODKOP_LIB/nft.sh"
. "$PODKOP_LIB/helpers.sh"
@@ -76,7 +78,7 @@ check_requirements() {
if has_outbound_section; then
log "Outbound section found" "debug"
else
log "Outbound section not found. Please check your configuration file (missing proxy_string, interface, outbound_json, or urltest_proxy_links). Aborted." "error"
log "Outbound section not found. Please check your configuration file (missing proxy_string, selector_proxy_links, urltest_proxy_links, outbound_json, or interface). Aborted." "error"
exit 1
fi
}
@@ -86,12 +88,13 @@ _check_outbound_section() {
local proxy_string interface outbound_json urltest_proxy_links
config_get proxy_string "$section" "proxy_string"
config_get interface "$section" "interface"
config_get outbound_json "$section" "outbound_json"
config_get selector_proxy_links "$section" "selector_proxy_links"
config_get urltest_proxy_links "$section" "urltest_proxy_links"
config_get outbound_json "$section" "outbound_json"
config_get interface "$section" "interface"
if [ -n "$proxy_string" ] || [ -n "$interface" ] ||
[ -n "$outbound_json" ] || [ -n "$urltest_proxy_links" ]; then
if [ -n "$proxy_string" ] || [ -n "$selector_proxy_links" ] || [ -n "$urltest_proxy_links" ] ||
[ -n "$outbound_json" ] || [ -n "$interface" ]; then
section_exists=0
fi
}
@@ -161,12 +164,12 @@ stop_main() {
log "Flush ip rule"
if ip rule list | grep -q "podkop"; then
ip rule del fwmark 0x105 table podkop priority 105
ip rule del fwmark "$NFT_FAKEIP_MARK"/"$NFT_FAKEIP_MARK" table "$RT_TABLE_NAME" priority 105
fi
log "Flush ip route"
if ip route list table podkop > /dev/null 2>&1; then
ip route flush table podkop
if ip route list table "$RT_TABLE_NAME" > /dev/null 2>&1; then
ip route flush table "$RT_TABLE_NAME"
fi
log "Stop sing-box"
@@ -248,20 +251,18 @@ br_netfilter_disable() {
# Main funcs
route_table_rule_mark() {
local table=podkop
grep -q "105 $RT_TABLE_NAME" /etc/iproute2/rt_tables || echo "105 $RT_TABLE_NAME" >> /etc/iproute2/rt_tables
grep -q "105 $table" /etc/iproute2/rt_tables || echo "105 $table" >> /etc/iproute2/rt_tables
if ! ip route list table $table | grep -q "local default dev lo scope host"; then
if ! ip route list table "$RT_TABLE_NAME" 2> /dev/null | grep -q "local default dev lo scope host"; then
log "Added route for tproxy" "debug"
ip route add local 0.0.0.0/0 dev lo table $table
ip route add local 0.0.0.0/0 dev lo table "$RT_TABLE_NAME"
else
log "Route for tproxy exists" "debug"
fi
if ! ip rule list | grep -q "from all fwmark 0x105 lookup $table"; then
if ! ip rule list | grep -q "from all fwmark $NFT_FAKEIP_MARK/$NFT_FAKEIP_MARK lookup $RT_TABLE_NAME"; then
log "Create marking rule" "debug"
ip -4 rule add fwmark 0x105 table $table priority 105
ip -4 rule add fwmark "$NFT_FAKEIP_MARK"/"$NFT_FAKEIP_MARK" table "$RT_TABLE_NAME" priority 105
else
log "Marking rule exist" "debug"
fi
@@ -282,8 +283,6 @@ create_nft_rules() {
log "Create nft table"
nft_create_table "$NFT_TABLE_NAME"
nft_init_interfaces_set
log "Create localv4 set"
nft_create_ipv4_set "$NFT_TABLE_NAME" "$NFT_LOCALV4_SET_NAME"
nft add element inet "$NFT_TABLE_NAME" localv4 '{
@@ -313,19 +312,20 @@ create_nft_rules() {
nft add chain inet "$NFT_TABLE_NAME" mangle_output '{ type route hook output priority -150; policy accept; }'
nft add chain inet "$NFT_TABLE_NAME" proxy '{ type filter hook prerouting priority -100; policy accept; }'
nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr "@$NFT_COMMON_SET_NAME" meta l4proto tcp meta mark set 0x105 counter
nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr "@$NFT_COMMON_SET_NAME" meta l4proto udp meta mark set 0x105 counter
nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr "$SB_FAKEIP_INET4_RANGE" meta l4proto tcp meta mark set 0x105 counter
nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr "$SB_FAKEIP_INET4_RANGE" meta l4proto udp meta mark set 0x105 counter
nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr "@$NFT_COMMON_SET_NAME" meta l4proto tcp meta mark set "$NFT_FAKEIP_MARK" counter
nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr "@$NFT_COMMON_SET_NAME" meta l4proto udp meta mark set "$NFT_FAKEIP_MARK" counter
nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr "$SB_FAKEIP_INET4_RANGE" meta l4proto tcp meta mark set "$NFT_FAKEIP_MARK" counter
nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr "$SB_FAKEIP_INET4_RANGE" meta l4proto udp meta mark set "$NFT_FAKEIP_MARK" counter
nft add rule inet "$NFT_TABLE_NAME" proxy meta mark 0x105 meta l4proto tcp tproxy ip to 127.0.0.1:1602 counter
nft add rule inet "$NFT_TABLE_NAME" proxy meta mark 0x105 meta l4proto udp tproxy ip to 127.0.0.1:1602 counter
nft add rule inet "$NFT_TABLE_NAME" proxy meta mark \& "$NFT_FAKEIP_MARK" == "$NFT_FAKEIP_MARK" meta l4proto tcp tproxy ip to 127.0.0.1:1602 counter
nft add rule inet "$NFT_TABLE_NAME" proxy meta mark \& "$NFT_FAKEIP_MARK" == "$NFT_FAKEIP_MARK" meta l4proto udp tproxy ip to 127.0.0.1:1602 counter
nft add rule inet "$NFT_TABLE_NAME" mangle_output ip daddr "@$NFT_LOCALV4_SET_NAME" return
nft add rule inet "$NFT_TABLE_NAME" mangle_output ip daddr "@$NFT_COMMON_SET_NAME" meta l4proto tcp meta mark set 0x105 counter
nft add rule inet "$NFT_TABLE_NAME" mangle_output ip daddr "@$NFT_COMMON_SET_NAME" meta l4proto udp meta mark set 0x105 counter
nft add rule inet "$NFT_TABLE_NAME" mangle_output ip daddr "$SB_FAKEIP_INET4_RANGE" meta l4proto tcp meta mark set 0x105 counter
nft add rule inet "$NFT_TABLE_NAME" mangle_output ip daddr "$SB_FAKEIP_INET4_RANGE" meta l4proto tcp meta mark set 0x105 counter
nft add rule inet "$NFT_TABLE_NAME" mangle_output meta mark "$NFT_OUTBOUND_MARK" counter return
nft add rule inet "$NFT_TABLE_NAME" mangle_output ip daddr "@$NFT_COMMON_SET_NAME" meta l4proto tcp meta mark set "$NFT_FAKEIP_MARK" counter
nft add rule inet "$NFT_TABLE_NAME" mangle_output ip daddr "@$NFT_COMMON_SET_NAME" meta l4proto udp meta mark set "$NFT_FAKEIP_MARK" counter
nft add rule inet "$NFT_TABLE_NAME" mangle_output ip daddr "$SB_FAKEIP_INET4_RANGE" meta l4proto tcp meta mark set "$NFT_FAKEIP_MARK" counter
nft add rule inet "$NFT_TABLE_NAME" mangle_output ip daddr "$SB_FAKEIP_INET4_RANGE" meta l4proto udp meta mark set "$NFT_FAKEIP_MARK" counter
local exclude_ntp
config_get_bool exclude_ntp "settings" "exclude_ntp" "0"
@@ -400,7 +400,6 @@ dnsmasq_restore() {
log "Restoring noresolv" "debug"
noresolv="$(uci_get "dhcp" "@dnsmasq[0]" "podkop_noresolv")"
if [ -z "$noresolv" ]; then
uci_remove "dhcp" "@dnsmasq[0]" "noresolv"
uci_set "dhcp" "@dnsmasq[0]" "noresolv" 0
else
uci_set "dhcp" "@dnsmasq[0]" "noresolv" "$noresolv"
@@ -419,6 +418,10 @@ dnsmasq_restore() {
elif file_exists "$resolvfile"; then
log "Backup DNS servers not found, using default resolvfile" "debug"
uci_set "dhcp" "@dnsmasq[0]" "resolvfile" "$resolvfile"
if [ -n "$noresolv" ] && [ "$noresolv" -eq 1 ]; then
log "Disabling noresolv option to use system resolvfile" "debug"
uci_set "dhcp" "@dnsmasq[0]" "noresolv" 0
fi
else
log "Backup DNS servers and default resolvfile not found, possible resolving issues" "warn"
fi
@@ -487,7 +490,7 @@ list_update() {
local i
# DNS Check
for i in $(seq 1 $nslookup_timeout); do
for i in $(seq 1 $nslookup_attempts); do
if nslookup -timeout=$nslookup_timeout openwrt.org > /dev/null 2>&1; then
echolog "✅ DNS check passed"
break
@@ -590,7 +593,9 @@ sing_box_init_config() {
sing_box_configure_log() {
log "Configure the log section of a sing-box JSON configuration"
config=$(sing_box_cm_configure_log "$config" false "$SB_DEFAULT_LOG_LEVEL" false)
local log_level
config_get log_level "settings" "log_level" "warn"
config=$(sing_box_cm_configure_log "$config" false "$log_level" false)
}
sing_box_configure_inbounds() {
@@ -643,6 +648,35 @@ configure_outbound_handler() {
config_get json_outbound "$section" "outbound_json"
config=$(sing_box_cf_add_json_outbound "$config" "$section" "$json_outbound")
;;
selector)
log "Detected proxy configuration type: selector" "debug"
local selector_proxy_links udp_over_tcp i outbound_tags outbound_tag default_outbound
config_get selector_proxy_links "$section" "selector_proxy_links"
config_get udp_over_tcp "$section" "enable_udp_over_tcp"
if [ -z "$selector_proxy_links" ]; then
log "URLTest proxy links is not set. Aborted." "fatal"
exit 1
fi
i=1
for link in $selector_proxy_links; do
config="$(sing_box_cf_add_proxy_outbound "$config" "$section-$i" "$link" "$udp_over_tcp")"
outbound_tag="$(get_outbound_tag_by_section "$section-$i")"
if [ -z "$outbound_tags" ]; then
outbound_tags="$outbound_tag"
default_outbound="$outbound_tag"
else
outbound_tags="$outbound_tags,$outbound_tag"
fi
i=$((i + 1))
done
selector_tag="$(get_outbound_tag_by_section "$section")"
selector_outbounds="$(comma_string_to_json_array "$outbound_tags")"
config="$(sing_box_cm_add_selector_outbound "$config" "$selector_tag" "$selector_outbounds" \
"$default_outbound")"
;;
urltest)
log "Detected proxy configuration type: urltest" "debug"
local urltest_proxy_links udp_over_tcp i urltest_tag selector_tag outbound_tag outbound_tags \
@@ -717,6 +751,9 @@ configure_outbound_handler() {
block)
log "Connection type 'block' detected for the $section section no outbound will be created (handled via reject route rules)"
;;
exclusion)
log "Connection type 'exclusion' detected for the $section section no outbound will be created (handled via route rules)"
;;
*)
log "Unknown connection type '$connection_type' for the $section section. Aborted." "fatal"
exit 1
@@ -785,9 +822,8 @@ sing_box_configure_route() {
config=$(sing_box_cf_proxy_domain "$config" "$SB_TPROXY_INBOUND_TAG" "$CHECK_PROXY_IP_DOMAIN" "$first_outbound_tag")
config=$(sing_box_cf_override_domain_port "$config" "$FAKEIP_TEST_DOMAIN" 8443)
config_foreach include_source_ips_in_routing_handler "section"
configure_common_reject_route_rule
configure_common_direct_route_rule
local routing_excluded_ips
config_get routing_excluded_ips "settings" "routing_excluded_ips"
@@ -797,6 +833,8 @@ sing_box_configure_route() {
config_list_foreach "settings" "routing_excluded_ips" exclude_source_ip_from_routing_handler "$rule_tag"
fi
config_foreach include_source_ips_in_routing_handler "section"
config_foreach configure_routing_for_section_lists "section"
}
@@ -817,7 +855,7 @@ include_source_ips_in_routing_handler() {
configure_common_reject_route_rule() {
local block_sections block_section_lists_enabled
block_sections="$(get_block_sections)"
block_sections="$(get_sections_by_connection_type "block")"
block_section_lists_enabled=0
if [ -n "$block_sections" ]; then
@@ -835,6 +873,27 @@ configure_common_reject_route_rule() {
fi
}
configure_common_direct_route_rule() {
local exclusion_sections exclusion_section_list_enabled
exclusion_sections="$(get_sections_by_connection_type "exclusion")"
exclusion_section_list_enabled=0
if [ -n "$exclusion_sections" ]; then
for exclusion_section in $exclusion_sections; do
if section_has_enabled_lists "$exclusion_section"; then
exclusion_section_list_enabled=1
break
fi
done
if [ "$exclusion_section_list_enabled" -eq 1 ]; then
config=$(sing_box_cm_add_route_rule "$config" "$SB_EXCLUSION_RULE_TAG" "$SB_TPROXY_INBOUND_TAG" \
"$SB_DIRECT_OUTBOUND_TAG")
else
log "Exclusion sections does not have any enabled list, route rule is not required" "warn"
fi
fi
}
include_source_ip_in_routing_handler() {
local source_ip="$1"
local rule_tag="$2"
@@ -859,7 +918,7 @@ configure_routing_for_section_lists() {
fi
local community_lists user_domain_list_type user_subnet_list_type local_domain_lists local_subnet_lists \
remote_domain_lists remote_subnet_lists section_connection_type route_rule_tag
remote_domain_lists remote_subnet_lists section_connection_type route_rule_tag resolve_real_ip_for_routing
config_get community_lists "$section" "community_lists"
config_get user_domain_list_type "$section" "user_domain_list_type" "disabled"
config_get user_subnet_list_type "$section" "user_subnet_list_type" "disabled"
@@ -868,14 +927,25 @@ configure_routing_for_section_lists() {
config_get remote_domain_lists "$section" "remote_domain_lists"
config_get remote_subnet_lists "$section" "remote_subnet_lists"
config_get section_connection_type "$section" "connection_type"
config_get_bool resolve_real_ip_for_routing "$section" "resolve_real_ip_for_routing" 0
if [ "$section_connection_type" = "block" ]; then
route_rule_tag="$SB_REJECT_RULE_TAG"
else
case "$section_connection_type" in
proxy | vpn)
route_rule_tag="$(gen_id)"
outbound_tag=$(get_outbound_tag_by_section "$section")
config=$(sing_box_cm_add_route_rule "$config" "$route_rule_tag" "$SB_TPROXY_INBOUND_TAG" "$outbound_tag")
fi
;;
block)
route_rule_tag="$SB_REJECT_RULE_TAG"
;;
exclusion)
route_rule_tag="$SB_EXCLUSION_RULE_TAG"
;;
*)
log "Unsupported '$section_connection_type' connection type. Skipping routing for '$section' section" "fatal"
exit 1
;;
esac
if [ -n "$community_lists" ]; then
log "Processing community list routing rules for '$section' section"
@@ -913,6 +983,11 @@ configure_routing_for_section_lists() {
config_list_foreach "$section" "remote_subnet_lists" configure_remote_domain_or_subnet_list_handler \
"subnets" "$section" "$route_rule_tag"
fi
if [ "$resolve_real_ip_for_routing" -eq 1 ]; then
config=$(sing_box_cm_add_resolve_rule "$config" "$route_rule_tag" "$(gen_id)" "$SB_DNS_SERVER_TAG")
log "Added resolve rule for '$section' section" "debug"
fi
}
configure_community_list_handler() {
@@ -1241,7 +1316,10 @@ import_community_service_subnet_list_handler() {
URL=$SUBNETS_DISCORD
nft_create_ipv4_set "$NFT_TABLE_NAME" "$NFT_DISCORD_SET_NAME"
nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr \
"@$NFT_DISCORD_SET_NAME" udp dport '{ 50000-65535 }' meta mark set 0x105 counter
"@$NFT_DISCORD_SET_NAME" udp dport '{ 19000-20000, 50000-65535 }' meta mark set "$NFT_FAKEIP_MARK" counter
;;
"roblox")
URL=$SUBNETS_ROBLOX
;;
*) return 0 ;;
esac
@@ -1466,12 +1544,16 @@ get_first_outbound_section() {
echo "$first_section"
}
get_block_sections() {
uci show podkop | grep "\.connection_type='block'" | cut -d'.' -f2
get_sections_by_connection_type() {
local connection_type="$1"
uci show podkop | grep "\.connection_type='$connection_type'" | cut -d'.' -f2
}
block_section_exists() {
if uci show podkop | grep -q "\.connection_type='block'"; then
section_by_connection_type_exists() {
local connection_type="$1"
if uci show podkop | grep -q "\.connection_type='$connection_type'"; then
return 0
else
return 1
@@ -1507,12 +1589,16 @@ section_has_enabled_lists() {
get_service_listen_address() {
local service_listen_address
service_listen_address="$(uci_get "network" "lan" "ipaddr")"
if [ -z "$service_listen_address" ]; then
config_get service_listen_address "settings" "service_listen_address" # TODO(ampetelin): Remove after testing
config_get service_listen_address "settings" "service_listen_address"
if [ -n "$service_listen_address" ]; then
log "Attention! The service_listen_address option is being used, overriding the automatic detection of the listening IP address!" "warn"
echo "$service_listen_address"
return 0
fi
local interface="lan"
network_get_ipaddr service_listen_address "$interface"
if [ -z "$service_listen_address" ]; then
log "Failed to determine the listening IP address. Please open an issue to report this problem: https://github.com/itdoginfo/podkop/issues" "error"
return 1
@@ -1526,8 +1612,10 @@ nft_list_all_traffic_from_ip() {
local ip="$1"
if ! nft list chain inet "$NFT_TABLE_NAME" mangle | grep -q "ip saddr $ip"; then
nft insert rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip saddr "$ip" meta l4proto tcp meta mark set 0x105 counter
nft insert rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip saddr "$ip" meta l4proto udp meta mark set 0x105 counter
nft insert rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip saddr "$ip" \
meta l4proto tcp meta mark set "$NFT_FAKEIP_MARK" counter
nft insert rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip saddr "$ip" \
meta l4proto udp meta mark set "$NFT_FAKEIP_MARK" counter
nft insert rule inet "$NFT_TABLE_NAME" mangle ip saddr "$ip" ip daddr @localv4 return
fi
}
@@ -1752,6 +1840,7 @@ show_config() {
sed -e 's/\(option proxy_string\).*/\1 '\''MASKED'\''/g' \
-e '/option outbound_json/,/^}/c\ option outbound_json '\''MASKED'\''' \
-e 's/\(list urltest_proxy_links\).*/\1 '\''MASKED'\''/g' \
-e 's/\(list selector_proxy_links\).*/\1 '\''MASKED'\''/g' \
-e "s@\\(option dns_server '[^/]*\\)/[^']*'@\\1/MASKED'@g" \
-e "s@\\(option domain_resolver_dns_server '[^/]*\\)/[^']*'@\\1/MASKED'@g" \
-e 's/\(option yacd_secret_key\).*/\1 '\''MASKED'\''/g' \

View File

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

View File

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

View File

@@ -1090,6 +1090,42 @@ sing_box_cm_add_route_rule() {
}]'
}
#######################################
# Insert a resolve rule immediately before a route rule.
# Copies rule_set from the target route rule.
# Arguments:
# config: string (JSON), sing-box configuration to modify
# route_rule_tag: string, tag of the route rule to precede
# resolve_rule_tag: string, tag for the new resolve rule
# server: string, DNS server tag (optional, default: "dns-server")
# Outputs:
# Updated JSON config to stdout
#######################################
sing_box_cm_add_resolve_rule() {
local config="$1"
local route_rule_tag="$2"
local resolve_rule_tag="$3"
local server="${4:-dns-server}"
echo "$config" | jq \
--arg service_tag "$SERVICE_TAG" \
--arg route_tag "$route_rule_tag" \
--arg resolve_tag "$resolve_rule_tag" \
--arg server "$server" \
'.route.rules |= [
.[] |
if .[$service_tag] == $route_tag then
{
action: "resolve",
rule_set: (.rule_set // []),
server: $server,
($service_tag): $resolve_tag
}, .
else .
end
]'
}
#######################################
# Patch a routing rule in the route section of a sing-box JSON configuration.
# Arguments:

View File

@@ -1,4 +1,4 @@
FROM openwrt/sdk:x86-64-SNAPSHOT
FROM openwrt/sdk:x86_64-v25.12.3
WORKDIR /builder
RUN ./setup.sh \
&& ./scripts/feeds update -a \

View File

@@ -1,4 +1,4 @@
FROM openwrt/sdk:x86_64-v24.10.3
FROM openwrt/sdk:x86_64-v24.10.6
WORKDIR /builder
RUN ./scripts/feeds update -a \
&& ./scripts/feeds install luci-base \