Compare commits

..

57 Commits

Author SHA1 Message Date
itdoginfo
2074ccecce 0.3.15 2025-02-21 17:41:35 +03:00
itdoginfo
06f9bee038 #42 2025-02-21 17:40:52 +03:00
itdoginfo
891b8f713d Fix 2025-02-21 16:07:27 +03:00
itdoginfo
b96552fb49 Fix #41 2025-02-21 16:06:17 +03:00
itdoginfo
ce9a7cdc45 Fix \n 2025-02-21 15:40:22 +03:00
itdoginfo
6071a96e9c 0.3.14 2025-02-21 15:37:43 +03:00
itdoginfo
e17422a0cf Fix #37 #41 2025-02-21 15:37:20 +03:00
itdoginfo
2e78b2b4b8 Merge pull request #41 from itdoginfo/refactor/deduplicate-sections
Refactor/deduplicate sections
2025-02-21 14:55:03 +03:00
Ivan K
b84f3b6782 feat: add get_proxy_label function to podkop init script 2025-02-21 12:01:46 +03:00
itdoginfo
0f66305e50 Fix 2025-02-21 11:53:08 +03:00
Ivan K
a32a5c600b fix: update domain validation regex to allow single-level domains 2025-02-21 11:47:14 +03:00
Ivan K
89737efcbc refactor: refactor checkFakeIP to return a promise and update updateDiagnostics to use async/await 2025-02-21 11:22:37 +03:00
Ivan K
4608bc31cd refactor: update podkop.js to modularize configuration sections and improve validation logic 2025-02-21 11:09:47 +03:00
itdoginfo
d9e9f2dfe4 Update 2025-02-21 00:50:53 +03:00
Nikita Skryabin
bb9318e96f Merge pull request #37 from vernette/feature/fakeip-cache-path-and-ttl
feat(podkop): add configurable cache file path and dns rewrite_ttl options
2025-02-21 00:20:15 +03:00
Nikita Skryabin
7ff49c3e4e chore(init.d/podkop): remove unused cache file path and constant 2025-02-21 00:17:43 +03:00
Nikita Skryabin
134a79cb3b refactor(podkop.js): remove redundant path validation logic 2025-02-20 23:56:20 +03:00
Nikita Skryabin
560dda8604 feat(podkop): add translations for cache file and rewrite ttl options 2025-02-20 23:49:41 +03:00
Nikita Skryabin
255c08a6de feat(podkop.js): add validation for cache file path to ensure it meets specific criteria 2025-02-20 23:44:32 +03:00
Nikita Skryabin
1f3a65347e feat(podkop): add DNS Rewrite TTL configuration option 2025-02-20 23:27:50 +03:00
Nikita Skryabin
ec936e2369 feat(podkop): add configurable cache file path support 2025-02-20 22:49:58 +03:00
itdoginfo
cee934d139 Merge pull request #34 from itdoginfo/feature/fakeip-updater
feat: enhance FakeIP status check with periodic updates
2025-02-20 21:59:04 +03:00
Ivan K
a25c6b8013 feat: enhance FakeIP status check with periodic updates 2025-02-20 20:28:51 +03:00
itdoginfo
ec3a281cef v0.3.13 2025-02-20 17:22:15 +03:00
itdoginfo
86947e7dee Fix dns_server value 2025-02-20 17:22:03 +03:00
itdoginfo
ff5d017acc Update and rm install 0.2.5 2025-02-20 16:50:06 +03:00
itdoginfo
22d919657c Merge remote-tracking branch 'origin/main' 2025-02-20 16:48:20 +03:00
itdoginfo
3271f23ae0 Fix noresolv bakup 2025-02-20 16:45:22 +03:00
itdoginfo
35ea1a14cf Merge pull request #33 from vernette/feature/dns-server-selection
feat(podkop): add DNS server and protocol selection options
2025-02-20 16:39:05 +03:00
unknown
51a9cc5934 feat(podkop.po): add translations for DNS server address validation messages 2025-02-20 16:34:55 +03:00
unknown
e1df26e62b feat(podkop.js): add DNS server validation for IP and domain formats 2025-02-20 16:33:23 +03:00
unknown
75b8bef0e0 fix(podkop.js): update DNS protocol type and server labels to use translation function 2025-02-20 16:07:38 +03:00
unknown
1a6b0cac46 chore(init.d/podkop): remove redundant comments 2025-02-20 16:03:15 +03:00
unknown
e49bd91109 feat(podkop.po): add translations for DNS protocol and server options 2025-02-20 16:01:23 +03:00
unknown
85642a2585 feat(podkop.pot): add new DNS protocol and server options for translation 2025-02-20 16:01:12 +03:00
unknown
c31785d20e feat(init.d/podkop): add DNS resolver discovery and dynamic configuration 2025-02-20 15:57:52 +03:00
unknown
a0af04037a feat(podkop.js): add DNS protocol type and server options to configuration 2025-02-20 15:57:18 +03:00
itdoginfo
51fb10e30e fix 2025-02-20 00:43:39 +03:00
itdoginfo
069ea41ef8 Hide don't touch my dhcp 2025-02-20 00:25:24 +03:00
itdoginfo
7ee92123bc Fix use-application-dns.net 2025-02-19 23:08:38 +03:00
itdoginfo
5fd0e23cf9 Added backup dhcp and don't touch dhcp. Firefox disable doh FQDN moved to sing-box 2025-02-19 22:40:17 +03:00
itdoginfo
9b25669c8f Merge #30 and #31 2025-02-19 19:48:36 +03:00
itdoginfo
4b020671cc Merge pull request #30 from itdoginfo/feature/web-versions-view
feat: add version information tab to diagnostics
2025-02-19 19:42:40 +03:00
Ivan K
6222221847 docs: update Russian translations and add new strings for FakeIP status check 2025-02-19 19:18:22 +03:00
itdoginfo
6fa215e343 Merge pull request #31 from vernette/feature/dns-check
feat(podkop): add secure DNS probe domain configuration
2025-02-19 18:23:34 +03:00
Nikita Skryabin
a33835415f feat(init.d/podkop): add secure DNS probe domain configuration 2025-02-19 13:11:22 +03:00
Ivan K
f76c657bd7 style: remove unused CSS and JavaScript for tooltips 2025-02-18 22:11:58 +03:00
Ivan K
cceedd6c17 docs: update Russian translations for error messages and UI strings 2025-02-18 21:27:56 +03:00
Ivan K
8fa1986961 docs: update Russian translations for luci-app-podkop 2025-02-18 21:20:15 +03:00
Ivan K
8dec59d118 docs: update Russian translations for new UI elements in luci-app-podkop 2025-02-18 21:17:02 +03:00
Ivan K
c1fac487c7 style: add tooltip functionality and adjust CSS for better UI 2025-02-18 21:05:02 +03:00
Ivan K
d934bcc5e9 refactor: add async to diagnostics section UI 2025-02-18 18:56:34 +03:00
Ivan K
fc99bd7aaa feat: add spacing and line break to diagnostic tools section 2025-02-18 18:28:52 +03:00
Ivan K
b6cf73b974 feat: add service status and diagnostic tools to podkop UI 2025-02-18 18:23:29 +03:00
Ivan K
6df7c8abf8 feat: add URL validation for Shadowsocks and VLESS configurations from examples 2025-02-18 17:18:34 +03:00
Ivan K
8eb97a8023 Merge remote-tracking branch 'origin/main' into feature/web-versions-view 2025-02-18 14:05:22 +03:00
Ivan K
cd43449585 feat: add version information tab to diagnostics 2025-02-18 13:59:04 +03:00
10 changed files with 2354 additions and 1881 deletions

View File

@@ -89,11 +89,8 @@ Luci: Services/podkop
- [x] Сеть рестартится при любом раскладе - [x] Сеть рестартится при любом раскладе
- [x] Выкл-вкл wg через luci не отрабатывает поднятие маршрута - [x] Выкл-вкл wg через luci не отрабатывает поднятие маршрута
- [ ] Если eof после последней строки в rt_tables, то скрипт не добавляет перенос строки - [ ] Если eof после последней строки в rt_tables, то скрипт не добавляет перенос строки
- [ ] Парсинг VLESS не отрабатывает, если в SNI два домена. Пример `sni=telegram.org%3Bwww.telegram.org`
- [ ] `service network restart` ломает маршруты при sing-box
- [ ] Совпадение секции с ruleset ломает конфиг sing-box
- [ ] В каких-то случаях плохо отрабатывает localfile - [ ] В каких-то случаях плохо отрабатывает localfile
- [ ] exit 1 если в конфиге присуствует - [ ] warnging если в конфиге присуствует. Значит в системе есть https-dns-proxy, который тоже может перетирать конфигурацию dhcp. Рекомендовать его выключить и сделать disable. Возможно в будущем добавить несовместимость на уровне Makefile
``` ```
option doh_backup_noresolv '0' option doh_backup_noresolv '0'
list doh_backup_server '' list doh_backup_server ''
@@ -102,6 +99,8 @@ Luci: Services/podkop
list doh_server '127.0.0.1#5054' list doh_server '127.0.0.1#5054'
``` ```
- [x] Только кастомный remote list не создаёт секцию в route-rules-rule-set и dns-rules-ruleset - [x] Только кастомный remote list не создаёт секцию в route-rules-rule-set и dns-rules-ruleset
- [ ] Не отрабатывает service podkop stop, если podkop запущен и не может, к пример, зарезолвить домен с сломанным DNS
- [ ] Длинный label ломает sing-box
# ToDo # ToDo
Этот раздел не означает задачи, которые нужно брать и делать. Это общий список хотелок. Если вы хотите помочь, пожалуйста, спросите сначала в телеграмме. Этот раздел не означает задачи, которые нужно брать и делать. Это общий список хотелок. Если вы хотите помочь, пожалуйста, спросите сначала в телеграмме.
@@ -143,23 +142,19 @@ Luci: Services/podkop
3) включен, версия 1 (старые релизы xray, sing-box на сервере) 3) включен, версия 1 (старые релизы xray, sing-box на сервере)
Проблема в том, что это нужно только если SS. Выставлять выбор при парсинг из конфига вопрос можно ли. Если совсем тупо - сделать костыль в допонительные настройки Проблема в том, что это нужно только если SS. Выставлять выбор при парсинг из конфига вопрос можно ли. Если совсем тупо - сделать костыль в допонительные настройки
- [x] Проверка места в скрипте install. Если доступно меньше 20MB - exit 1 c выводом колько надо и сколько доступно. + показ модели роутера - [x] Проверка места в скрипте install. Если доступно меньше 20MB - exit 1 c выводом колько надо и сколько доступно. + показ модели роутера
- [ ] Правило запрещающее QUIC - [x] Правило запрещающее QUIC
- [ ] Проверить обновление списков, отрабатывает ли - [ ] Проверить обновление списков, отрабатывает ли
- [ ] Проверка на ванильную openwrt - [ ] Проверка на ванильную openwrt
- [ ] Проверка откуда установлен sing-box. Например, проверять установлен ли он из официального репозитория - [ ] Проверка откуда установлен sing-box. Например, проверять установлен ли он из официального репозитория
- [x] TG в сервисы - [x] TG в сервисы
- [ ] Выбор ткуда направлять трафик в туннель. В том числе чтоб откуда угодно, а не только br-lan
- [ ] Диагностика: Proxy check completed successfully предположительно не показывает IP, если вернулся это IPv6. - [ ] Диагностика: Proxy check completed successfully предположительно не показывает IP, если вернулся это IPv6.
- [ ] Диагностика: podkop_domains: 0 elements как проверять что доходят запросы при fakeip? Мб врубать логи dnsmasq и их чекать.
- [ ] Сделать галку запрещающую подкопу редачить dhcp. Допилить в исключение вместе с пустыми полями proxy и vpn - [ ] Сделать галку запрещающую подкопу редачить dhcp. Допилить в исключение вместе с пустыми полями proxy и vpn
- [ ] Валидации предустановленных значений. Если прописаны другие, то вывод в лог о неизвестной переменной и продолжение работы - [x] Валидации предустановленных значений. Если прописаны другие, то вывод в лог о неизвестной переменной и продолжение работы
- [ ] Добавление в список доменов домены первого уровня (LuCI)
- [ ] Проверка, что версия в makefile совпадает с тегом - [ ] Проверка, что версия в makefile совпадает с тегом
- [ ] Don't touch my DHCP!
Приоритет 2 Приоритет 2
- [x] Списки доменов и подсетей с роутера - [x] Списки доменов и подсетей с роутера
- [ ] Кнопка обновления списка доменов и подсетей. Запихнуть в главное меню - [x] Кнопка обновления списка доменов и подсетей. Запихнуть в главное меню
- [ ] IPv6 - [ ] IPv6
Wiki Wiki
@@ -179,17 +174,6 @@ Wiki
- [ ] Unit тесты (BATS) - [ ] Unit тесты (BATS)
- [ ] Интеграционые тесты бекенда (OpenWrt rootfs + BATS) - [ ] Интеграционые тесты бекенда (OpenWrt rootfs + BATS)
Хз как сделать
- [ ] Добавить label от конфига vless\ss\etc в luci.
# Установка версии v0.2.5
Удаляет полностью все пакеты podkop. Удаляет текущую конфигурацию podkop.
После установки **обязательно** сбросьте кэш в LuCI.
```
sh <(wget -O - https://raw.githubusercontent.com/itdoginfo/podkop/refs/heads/main/install-v0.2.5.sh)
```
# Разработка # Разработка
Есть два варианта: Есть два варианта:
- Просто поставить пакет на роутер или виртуалку и прям редактировать через SFTP (opkg install openssh-sftp-server) - Просто поставить пакет на роутер или виртуалку и прям редактировать через SFTP (opkg install openssh-sftp-server)

View File

@@ -1,97 +0,0 @@
#!/bin/sh
REPO="https://api.github.com/repos/itdoginfo/podkop/releases/tags/v0.2.5"
DOWNLOAD_DIR="/tmp/podkop"
COUNT=3
rm -rf "$DOWNLOAD_DIR"
mkdir -p "$DOWNLOAD_DIR"
main() {
check_system
opkg update
if [ -f "/etc/init.d/podkop" ]; then
echo "Remove current vesrion podkop"
opkg remove luci-i18n-podkop-ru luci-app-podkop podkop
rm /etc/config/podkop
else
echo "Installed podkop..."
fi
wget -qO- "$REPO" | grep -o 'https://[^"[:space:]]*\.ipk' | while read -r url; do
filename=$(basename "$url")
filepath="$DOWNLOAD_DIR/$filename"
attempt=0
while [ $attempt -lt $COUNT ]; do
if [ -f "$filepath" ] && [ -s "$filepath" ]; then
echo "$filename has already been uploaded"
break
fi
echo "Download $filename (count $((attempt+1)))..."
wget -q -O "$filepath" "$url"
if [ -s "$filepath" ]; then
echo "$filename successfully downloaded"
else
echo "Download error $filename. Retry..."
rm -f "$filepath"
fi
attempt=$((attempt+1))
done
done
for pkg in podkop luci-app-podkop; do
file=$(ls "$DOWNLOAD_DIR" | grep "^$pkg" | head -n 1)
if [ -n "$file" ]; then
echo "Installing $file"
opkg install "$DOWNLOAD_DIR/$file"
fi
done
ru=$(ls "$DOWNLOAD_DIR" | grep "luci-i18n-podkop-ru" | head -n 1)
if [ -n "$ru" ]; then
printf "\033[32;1mРусский язык интерфейса ставим? y/n (Need a Russian translation?)\033[0m "
while true; do
read -r -p '' RUS
case $RUS in
y)
opkg install "$DOWNLOAD_DIR/$ru"
break
;;
n)
break
;;
*)
echo "Введите y или n"
;;
esac
done
fi
rm -f $DOWNLOAD_DIR/podkop*.ipk $DOWNLOAD_DIR/luci-app-podkop*.ipk $DOWNLOAD_DIR/luci-i18n-podkop-ru*.ipk
}
check_system() {
# Get router model
MODEL=$(cat /tmp/sysinfo/model)
echo "Router model: $MODEL"
if ! nslookup google.com >/dev/null 2>&1; then
log "DNS not working"
exit 1
fi
if opkg list-installed | grep -qE "iptables|kmod-iptab"; then
printf "\033[31;1mFound incompatible iptables packages. If you're using FriendlyWrt: https://t.me/itdogchat/44512/181082\033[0m\n"
fi
}
main

View File

@@ -111,7 +111,7 @@ main() {
} }
add_tunnel() { add_tunnel() {
printf "\033[32;1mWill you be using Wireguard, AmneziaWG, OpenVPN, OpenConnect? If yes, select a number and they will be automatically installed\033[0m " printf "\033[32;1mWill you be using Wireguard, AmneziaWG, OpenVPN, OpenConnect? If yes, select a number and they will be automatically installed\033[0m\n"
echo "1) Wireguard" echo "1) Wireguard"
echo "2) AmneziaWG" echo "2) AmneziaWG"
echo "3) OpenVPN" echo "3) OpenVPN"
@@ -412,7 +412,7 @@ check_system() {
fi fi
if ! nslookup google.com >/dev/null 2>&1; then if ! nslookup google.com >/dev/null 2>&1; then
log "DNS not working" printf "\033[31;1mDNS not working\033[0m\n"
exit 1 exit 1
fi fi

View File

@@ -1,7 +1,7 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-podkop PKG_NAME:=luci-app-podkop
PKG_VERSION:=0.3.10 PKG_VERSION:=0.3.15
PKG_RELEASE:=1 PKG_RELEASE:=1
LUCI_TITLE:=LuCI podkop app LUCI_TITLE:=LuCI podkop app

View File

@@ -25,44 +25,59 @@ msgstr "Тип подключения"
msgid "Select between VPN and Proxy connection methods for traffic routing" msgid "Select between VPN and Proxy connection methods for traffic routing"
msgstr "Выберите между VPN и Proxy методами для маршрутизации трафика" msgstr "Выберите между VPN и Proxy методами для маршрутизации трафика"
msgid "Configuration Type"
msgstr "Тип конфигурации"
msgid "Select how to configure the proxy"
msgstr "Выберите способ настройки прокси"
msgid "Connection URL"
msgstr "URL подключения"
msgid "Outbound Config"
msgstr "Конфигурация Outbound"
msgid "Proxy Configuration URL" msgid "Proxy Configuration URL"
msgstr "URL конфигурации прокси" msgstr "URL конфигурации прокси"
msgid "Enter connection string starting with vless:// or ss:// for proxy configuration" msgid "Enter connection string starting with vless:// or ss:// for proxy configuration"
msgstr "Введите строку подключения, начинающуюся с vless:// или ss:// для настройки прокси" msgstr "Введите строку подключения, начинающуюся с vless:// или ss:// для настройки прокси"
msgid "Outbound Configuration"
msgstr "Конфигурация исходящего соединения"
msgid "Enter complete outbound configuration in JSON format"
msgstr "Введите полную конфигурацию исходящего соединения в формате JSON"
msgid "Network Interface" msgid "Network Interface"
msgstr "Сетевой интерфейс" msgstr "Сетевой интерфейс"
msgid "Select network interface for VPN connection" msgid "Select network interface for VPN connection"
msgstr "Выберите сетевой интерфейс для VPN подключения" msgstr "Выберите сетевой интерфейс для VPN подключения"
msgid "Community Domain Lists" msgid "Community Lists"
msgstr "Предустановленные списки доменов" msgstr "Предустановленные списки"
msgid "Domain List" msgid "Service List"
msgstr "Список доменов" msgstr "Список сервисов"
msgid "Select a list" msgid "Select predefined service for routing"
msgstr "Выберите список доменов" msgstr "Выберите предустановленные сервисы для маршрутизации"
msgid "Community Subnet Lists" msgid "User Domain List Type"
msgstr "Предустановленные сети сервисов" msgstr "Тип пользовательского списка доменов"
msgid "Enable routing for popular services like Twitter, Meta, and Discord" msgid "Select how to add your custom domains"
msgstr "Включить маршрутизацию для популярных сервисов, таких как Twitter, Meta и Discord" msgstr "Выберите способ добавления пользовательских доменов"
msgid "Service Networks" msgid "Disabled"
msgstr "Сети сервисов" msgstr "Отключено"
msgid "Select predefined service networks for routing" msgid "Dynamic List"
msgstr "Выберите предустановленные сети сервисов для маршрутизации" msgstr "Динамический список"
msgid "User Domain List" msgid "Text List"
msgstr "Пользовательский список доменов" msgstr "Текстовый список"
msgid "Enable and manage your custom list of domains for selective routing"
msgstr "Включить и управлять пользовательским списком доменов для выборочной маршрутизации"
msgid "User Domains" msgid "User Domains"
msgstr "Пользовательские домены" msgstr "Пользовательские домены"
@@ -70,6 +85,24 @@ msgstr "Пользовательские домены"
msgid "Enter domain names without protocols (example: sub.example.com or example.com)" msgid "Enter domain names without protocols (example: sub.example.com or example.com)"
msgstr "Введите имена доменов без протоколов (пример: sub.example.com или example.com)" msgstr "Введите имена доменов без протоколов (пример: sub.example.com или example.com)"
msgid "User Domains List"
msgstr "Список пользовательских доменов"
msgid "Enter domain names separated by comma, space or newline (example: sub.example.com, example.com or one domain per line)"
msgstr "Введите имена доменов через запятую, пробел или новую строку (пример: sub.example.com, example.com или один домен на строку)"
msgid "Local Domain Lists"
msgstr "Локальные списки доменов"
msgid "Use the list from the router filesystem"
msgstr "Использовать список из файловой системы роутера"
msgid "Local Domain Lists Path"
msgstr "Путь к локальным спискам доменов"
msgid "Enter to the list file path"
msgstr "Введите путь к файлу списка"
msgid "Remote Domain Lists" msgid "Remote Domain Lists"
msgstr "Удаленные списки доменов" msgstr "Удаленные списки доменов"
@@ -82,17 +115,26 @@ msgstr "URL удаленных доменов"
msgid "Enter full URLs starting with http:// or https://" msgid "Enter full URLs starting with http:// or https://"
msgstr "Введите полные URL, начинающиеся с http:// или https://" msgstr "Введите полные URL, начинающиеся с http:// или https://"
msgid "User Subnet List" msgid "User Subnet List Type"
msgstr "Пользовательский список подсетей" msgstr "Тип пользовательского списка подсетей"
msgid "Enable and manage your custom list of IP subnets for selective routing" msgid "Select how to add your custom subnets"
msgstr "Включить и управлять пользовательским списком IP-подсетей для выборочной маршрутизации" msgstr "Выберите способ добавления пользовательских подсетей"
msgid "Text List (comma/space/newline separated)"
msgstr "Текстовый список (разделенный запятыми/пробелами/новыми строками)"
msgid "User Subnets" msgid "User Subnets"
msgstr "Пользовательские подсети" msgstr "Пользовательские подсети"
msgid "Enter subnet in CIDR notation (example: 103.21.244.0/22)" msgid "Enter subnets in CIDR notation (example: 103.21.244.0/22) or single IP addresses"
msgstr "Введите подсеть в нотации CIDR (пример: 103.21.244.0/22)" msgstr "Введите подсети в нотации CIDR (пример: 103.21.244.0/22) или отдельные IP-адреса"
msgid "User Subnets List"
msgstr "Список пользовательских подсетей"
msgid "Enter subnets in CIDR notation or single IP addresses, separated by comma, space or newline"
msgstr "Введите подсети в нотации CIDR или отдельные IP-адреса через запятую, пробел или новую строку"
msgid "Remote Subnet Lists" msgid "Remote Subnet Lists"
msgstr "Удаленные списки подсетей" msgstr "Удаленные списки подсетей"
@@ -103,18 +145,6 @@ msgstr "Загрузка и использование списков подсе
msgid "Remote Subnet URLs" msgid "Remote Subnet URLs"
msgstr "URL удаленных подсетей" msgstr "URL удаленных подсетей"
msgid "Domain Exclusions"
msgstr "Исключения доменов"
msgid "Exclude specific domains from routing rules"
msgstr "Исключить определенные домены из правил маршрутизации"
msgid "Excluded Domains"
msgstr "Исключенные домены"
msgid "Domains to be excluded from routing"
msgstr "Домены, которые будут исключены из маршрутизации"
msgid "IP for full redirection" msgid "IP for full redirection"
msgstr "Принудительные прокси IP" msgstr "Принудительные прокси IP"
@@ -133,6 +163,27 @@ msgstr "Исключения прокси IP"
msgid "Specify local IP addresses that will never use the configured route" msgid "Specify local IP addresses that will never use the configured route"
msgstr "Укажите локальные IP-адреса, которые никогда не будут использовать настроенный маршрут" msgstr "Укажите локальные IP-адреса, которые никогда не будут использовать настроенный маршрут"
msgid "Mixed enable"
msgstr "Включить смешанный режим"
msgid "Browser port: 2080"
msgstr "Порт браузера: 2080"
msgid "Yacd enable"
msgstr "Включить Yacd"
msgid "Exclude NTP"
msgstr "Исключить NTP"
msgid "For issues with open connections sing-box"
msgstr "Для проблем с открытыми соединениями sing-box"
msgid "QUIC disable"
msgstr "Отключить QUIC"
msgid "For issues with the video stream"
msgstr "Для проблем с видеопотоком"
msgid "List Update Frequency" msgid "List Update Frequency"
msgstr "Частота обновления списков" msgstr "Частота обновления списков"
@@ -145,6 +196,9 @@ msgstr "Каждый час"
msgid "Every 2 hours" msgid "Every 2 hours"
msgstr "Каждые 2 часа" msgstr "Каждые 2 часа"
msgid "Every 3 hours"
msgstr "Каждые 3 часа"
msgid "Every 4 hours" msgid "Every 4 hours"
msgstr "Каждые 4 часа" msgstr "Каждые 4 часа"
@@ -154,51 +208,18 @@ msgstr "Каждые 6 часов"
msgid "Every 12 hours" msgid "Every 12 hours"
msgstr "Каждые 12 часов" msgstr "Каждые 12 часов"
msgid "Every day"
msgstr "Каждый день"
msgid "Every 3 days"
msgstr "Каждые 3 дня"
msgid "Once a day at 04:00" msgid "Once a day at 04:00"
msgstr "Раз в день в 04:00" msgstr "Раз в день в 04:00"
msgid "Once a week on Sunday at 04:00" msgid "Once a week on Sunday at 04:00"
msgstr "Раз в неделю в воскресенье в 04:00" msgstr "Раз в неделю в воскресенье в 04:00"
msgid "Yacd enable"
msgstr "Включить Yacd"
msgid "Mixed enable"
msgstr "Включить смешанный режим"
msgid "Browser port: 2080"
msgstr "Порт браузера: 2080"
msgid "Exclude NTP"
msgstr "Исключить NTP"
msgid "For issues with open connections sing-box"
msgstr "Для проблем с открытыми соединениями sing-box"
msgid "Service Domain List Enable"
msgstr "Включить список доменов сервисов"
msgid "Enable predefined service domain lists for routing"
msgstr "Включить предустановленные списки доменов для маршрутизации"
msgid "Service List"
msgstr "Список сервисов"
msgid "Select predefined services for routing"
msgstr "Выберите предустановленные сервисы для маршрутизации"
msgid "Domains"
msgstr "Домены"
msgid "Subnet List"
msgstr "Список подсетей"
msgid "Configure custom subnets for routing"
msgstr "Настройка пользовательских подсетей для маршрутизации"
msgid "Subnets"
msgstr "Подсети"
msgid "Invalid domain format. Enter domain without protocol (example: sub.example.com)" msgid "Invalid domain format. Enter domain without protocol (example: sub.example.com)"
msgstr "Неверный формат домена. Введите домен без протокола (пример: sub.example.com)" msgstr "Неверный формат домена. Введите домен без протокола (пример: sub.example.com)"
@@ -208,8 +229,8 @@ msgstr "URL должен использовать протокол http:// ил
msgid "Invalid URL format. URL must start with http:// or https://" msgid "Invalid URL format. URL must start with http:// or https://"
msgstr "Неверный формат URL. URL должен начинаться с http:// или https://" msgstr "Неверный формат URL. URL должен начинаться с http:// или https://"
msgid "Invalid subnet format. Use format: X.X.X.X/Y (like 192.168.1.0/24)" msgid "Invalid format. Use format: X.X.X.X or X.X.X.X/Y"
msgstr "Неверный формат подсети. Используйте формат: X.X.X.X/Y (например: 192.168.1.0/24)" msgstr "Неверный формат. Используйте формат: X.X.X.X или X.X.X.X/Y"
msgid "IP address parts must be between 0 and 255" msgid "IP address parts must be between 0 and 255"
msgstr "Части IP-адреса должны быть между 0 и 255" msgstr "Части IP-адреса должны быть между 0 и 255"
@@ -220,71 +241,23 @@ msgstr "CIDR должен быть между 0 и 32"
msgid "Invalid IP format. Use format: X.X.X.X (like 192.168.1.1)" msgid "Invalid IP format. Use format: X.X.X.X (like 192.168.1.1)"
msgstr "Неверный формат IP. Используйте формат: X.X.X.X (например: 192.168.1.1)" msgstr "Неверный формат IP. Используйте формат: X.X.X.X (например: 192.168.1.1)"
msgid "User Domain List Type"
msgstr "Тип пользовательского списка доменов"
msgid "Select how to add your custom domains"
msgstr "Выберите способ добавления пользовательских доменов"
msgid "Disabled"
msgstr "Отключено"
msgid "Dynamic List"
msgstr "Динамический список"
msgid "Text List"
msgstr "Текстовый список"
msgid "User Domains List"
msgstr "Список пользовательских доменов"
msgid "Enter domain names separated by comma, space or newline (example: sub.example.com, example.com or one domain per line)"
msgstr "Введите имена доменов через запятую, пробел или новую строку (пример: sub.example.com, example.com или один домен на строку)"
msgid "Invalid domain format: %s. Enter domain without protocol" msgid "Invalid domain format: %s. Enter domain without protocol"
msgstr "Неверный формат домена: %s. Введите домен без протокола" msgstr "Неверный формат домена: %s. Введите домен без протокола"
msgid "User Subnet List Type" msgid "Invalid format: %s. Use format: X.X.X.X or X.X.X.X/Y"
msgstr "Тип пользовательского списка подсетей" msgstr "Неверный формат: %s. Используйте формат: X.X.X.X или X.X.X.X/Y"
msgid "Select how to add your custom subnets"
msgstr "Выберите способ добавления пользовательских подсетей"
msgid "Text List (comma/space/newline separated)"
msgstr "Текстовый список (разделенный запятыми/пробелами/новыми строками)"
msgid "Enter subnets in CIDR notation (example: 103.21.244.0/22) or single IP addresses"
msgstr "Введите подсети в нотации CIDR (пример: 103.21.244.0/22) или отдельные IP-адреса"
msgid "User Subnets List"
msgstr "Список пользовательских подсетей"
msgid "Enter subnets in CIDR notation or single IP addresses, separated by comma, space or newline"
msgstr "Введите подсети в нотации CIDR или отдельные IP-адреса через запятую, пробел или новую строку"
msgid "Invalid format. Use format: X.X.X.X or X.X.X.X/Y"
msgstr "Неверный формат. Используйте формат: X.X.X.X или X.X.X.X/Y"
msgid "IP parts must be between 0 and 255 in: %s" msgid "IP parts must be between 0 and 255 in: %s"
msgstr "Части IP-адреса должны быть между 0 и 255 в: %s" msgstr "Части IP-адреса должны быть между 0 и 255 в: %s"
msgid "Configuration Type" msgid "CIDR must be between 0 and 32 in: %s"
msgstr "Тип конфигурации" msgstr "CIDR должен быть между 0 и 32 в: %s"
msgid "Select how to configure the proxy" msgid "Invalid path format. Path must start with \"/\" and contain only valid characters (letters, numbers, \"-\", \"_\", \"/\", \".\")"
msgstr "Выберите способ настройки прокси" msgstr "Неверный формат пути. Путь должен начинаться с \"/\" и содержать только допустимые символы (буквы, цифры, \"-\", \"_\", \"/\", \".\")"
msgid "Connection URL" msgid "Invalid path format"
msgstr "URL подключения" msgstr "Неверный формат пути"
msgid "Outbound Config"
msgstr "Конфигурация Outbound"
msgid "Outbound Configuration"
msgstr "Конфигурация исходящего соединения"
msgid "Enter complete outbound configuration in JSON format"
msgstr "Введите полную конфигурацию исходящего соединения в формате JSON"
msgid "JSON must contain at least type, server and server_port fields" msgid "JSON must contain at least type, server and server_port fields"
msgstr "JSON должен содержать как минимум поля type, server и server_port" msgstr "JSON должен содержать как минимум поля type, server и server_port"
@@ -292,189 +265,293 @@ msgstr "JSON должен содержать как минимум поля type
msgid "Invalid JSON format" msgid "Invalid JSON format"
msgstr "Неверный формат JSON" msgstr "Неверный формат JSON"
msgid "Diagnostics" msgid "Warning: %s cannot be used together with %s. Previous selections have been removed."
msgstr "Диагностика" msgstr "Предупреждение: %s нельзя использовать вместе с %s. Предыдущие варианты были удалены."
msgid "Main Check" msgid "Regional options cannot be used together"
msgstr "Основная проверка" msgstr "Нельзя использовать несколько региональных опций"
msgid "Run a comprehensive diagnostic check of all components" msgid "Warning: Russia inside can only be used with Meta, Twitter, Discord, and Telegram. %s already in Russia inside and have been removed from selection."
msgstr "Запустить комплексную диагностическую проверку всех компонентов" msgstr "Внимание: Russia inside может использоваться только с Meta, Twitter, Discord и Telegram. %s были удалены из выбора."
msgid "Run Check" msgid "Russia inside restrictions"
msgstr "Запустить проверку" msgstr "Ограничения Russia inside"
msgid "Full Diagnostic Results" msgid "URL must start with vless:// or ss://"
msgstr "Полные результаты диагностики" msgstr "URL должен начинаться с vless:// или ss://"
msgid "Failed to copy: " msgid "Invalid Shadowsocks URL format: missing method and password separator \":\""
msgstr "Ошибка копирования: " msgstr "Неверный формат URL Shadowsocks: отсутствует разделитель метода и пароля \":\""
msgid "Copy to Clipboard" msgid "Invalid Shadowsocks URL format"
msgstr "Скопировать в буфер" msgstr "Неверный формат URL Shadowsocks"
msgid "Close" msgid "Invalid Shadowsocks URL: missing server address"
msgstr "Закрыть" msgstr "Неверный URL Shadowsocks: отсутствует адрес сервера"
msgid "No output" msgid "Invalid Shadowsocks URL: missing server"
msgstr "Нет данных" msgstr "Неверный URL Shadowsocks: отсутствует сервер"
msgid "System Logs" msgid "Invalid Shadowsocks URL: missing port"
msgstr "Системные логи" msgstr "Неверный URL Shadowsocks: отсутствует порт"
msgid "View recent system logs related to Podkop" msgid "Invalid port number. Must be between 1 and 65535"
msgstr "Просмотр недавних системных логов, связанных с Podkop" msgstr "Неверный номер порта. Должен быть между 1 и 65535"
msgid "View Logs" msgid "Invalid Shadowsocks URL: missing or invalid server/port format"
msgstr "Просмотр логов" msgstr "Неверный URL Shadowsocks: отсутствует или неверный формат сервера/порта"
msgid "Failed to copy logs: " msgid "Invalid VLESS URL: missing UUID"
msgstr "Ошибка копирования логов: " msgstr "Неверный URL VLESS: отсутствует UUID"
msgid "Show Config" msgid "Invalid VLESS URL: missing server address"
msgstr "Показать конфигурацию" msgstr "Неверный URL VLESS: отсутствует адрес сервера"
msgid "Show current podkop configuration with masked sensitive data" msgid "Invalid VLESS URL: missing server"
msgstr "Показать текущую конфигурацию podkop с маскированными конфиденциальными данными" msgstr "Неверный URL VLESS: отсутствует сервер"
msgid "Podkop Configuration" msgid "Invalid VLESS URL: missing port"
msgstr "Конфигурация Podkop" msgstr "Неверный URL VLESS: отсутствует порт"
msgid "Update lists" msgid "Invalid VLESS URL: missing or invalid server/port format"
msgstr "Неверный URL VLESS: отсутствует или неверный формат сервера/порта"
msgid "Invalid VLESS URL: missing query parameters"
msgstr "Неверный URL VLESS: отсутствуют параметры запроса"
msgid "Invalid VLESS URL: missing type parameter"
msgstr "Неверный URL VLESS: отсутствует параметр type"
msgid "Invalid VLESS URL: missing security parameter"
msgstr "Неверный URL VLESS: отсутствует параметр security"
msgid "Invalid VLESS URL: missing pbk parameter for reality security"
msgstr "Неверный URL VLESS: отсутствует параметр pbk для security reality"
msgid "Invalid VLESS URL: missing fp parameter for reality security"
msgstr "Неверный URL VLESS: отсутствует параметр fp для security reality"
msgid "Invalid VLESS URL: missing sni parameter for tls security"
msgstr "Неверный URL VLESS: отсутствует параметр sni для security tls"
msgid "Invalid URL format: %s"
msgstr "Неверный формат URL: %s"
msgid "Remote Domain Lists URL"
msgstr "URL удаленных списков доменов"
msgid "Enter URL to download domain list"
msgstr "Введите URL для загрузки списка доменов"
msgid "Update Interval"
msgstr "Интервал обновления"
msgid "Select how often to update the lists"
msgstr "Выберите, как часто обновлять списки"
msgid "Last Update"
msgstr "Последнее обновление"
msgid "Last update time"
msgstr "Время последнего обновления"
msgid "Next Update"
msgstr "Следующее обновление"
msgid "Next scheduled update time"
msgstr "Время следующего запланированного обновления"
msgid "Version"
msgstr "Версия"
msgid "Component version"
msgstr "Версия компонента"
msgid "Installed"
msgstr "Установлено"
msgid "Not installed"
msgstr "Не установлено"
msgid "Unknown version"
msgstr "Неизвестная версия"
msgid "Error parsing version"
msgstr "Ошибка разбора версии"
msgid "Error parsing status"
msgstr "Ошибка разбора статуса"
msgid "Service is running"
msgstr "Сервис запущен"
msgid "Service is stopped"
msgstr "Сервис остановлен"
msgid "Service is enabled"
msgstr "Сервис включен"
msgid "Service is disabled"
msgstr "Сервис отключен"
msgid "Service Status"
msgstr "Статус сервиса"
msgid "working"
msgstr "работает"
msgid "not working"
msgstr "не работает"
msgid "check error"
msgstr "ошибка проверки"
msgid "Diagnostic check in progress..."
msgstr "Выполняется диагностическая проверка..."
msgid "Diagnostic check completed"
msgstr "Диагностическая проверка завершена"
msgid "Diagnostic check failed"
msgstr "Диагностическая проверка не удалась"
msgid "Update in progress..."
msgstr "Выполняется обновление..."
msgid "Update completed"
msgstr "Обновление завершено"
msgid "Update failed"
msgstr "Обновление не удалось"
msgid "Check in progress..."
msgstr "Выполняется проверка..."
msgid "Check completed"
msgstr "Проверка завершена"
msgid "Check failed"
msgstr "Проверка не удалась"
msgid "Version Information"
msgstr "Информация о версии"
msgid "Copied!"
msgstr "Скопировано!"
msgid "Podkop Status"
msgstr "Статус Podkop"
msgid "Start Podkop"
msgstr "Запустить Podkop"
msgid "Stop Podkop"
msgstr "Остановить Podkop"
msgid "Restart Podkop"
msgstr "Перезапустить Podkop"
msgid "Enable Podkop"
msgstr "Включить Podkop"
msgid "Disable Podkop"
msgstr "Отключить Podkop"
msgid "Loading diagnostics..."
msgstr "Загрузка диагностики..."
msgid "Error loading diagnostics"
msgstr "Ошибка загрузки диагностики"
msgid "Sing-box Status"
msgstr "Статус Sing-box"
msgid "Diagnostic Tools"
msgstr "Инструменты диагностики"
msgid "Unknown"
msgstr "Неизвестно"
msgid "Device Model: "
msgstr "Модель устройства: "
msgid "OpenWrt Version: "
msgstr "Версия OpenWrt: "
msgid "Sing-box: "
msgstr "Sing-box: "
msgid "LuCI App: "
msgstr "LuCI App: "
msgid "Podkop: "
msgstr "Podkop: "
msgid "Check NFT Rules"
msgstr "Проверить правила NFT"
msgid "Update Lists"
msgstr "Обновить списки" msgstr "Обновить списки"
msgid "Update all lists in config"
msgstr "Обновить все списки в конфигурации"
msgid "List Update"
msgstr "Обновление списков"
msgid "Lists will be updated in background. You can check the progress in system logs."
msgstr "Списки будут обновлены в фоновом режиме. Вы можете проверить прогресс в системных логах."
msgid "Extra configurations"
msgstr "Дополнительные конфигурации"
msgid "Extra configuration"
msgstr "Дополнительная конфигурация"
msgid "Add Section"
msgstr "Добавить раздел"
msgid "QUIC disable"
msgstr "Отключить QUIC"
msgid "For issues with the video stream"
msgstr "Для проблем с видеопотоком"
msgid "Community Lists"
msgstr "Списки сообщества"
msgid "Local Domain Lists"
msgstr "Локальные списки доменов"
msgid "Use the list from the router filesystem"
msgstr "Использовать список из файловой системы роутера"
msgid "Local Domain Lists Path"
msgstr "Путь к локальным спискам доменов"
msgid "Enter to the list file path"
msgstr "Введите путь к файлу списка"
msgid "Proxy Check"
msgstr "Проверка прокси"
msgid "Check if sing-box proxy works correctly"
msgstr "Проверить корректность работы прокси sing-box"
msgid "Check Proxy"
msgstr "Проверить прокси"
msgid "Proxy Check Results"
msgstr "Результаты проверки прокси"
msgid "NFT Rules"
msgstr "Правила NFT"
msgid "Show current nftables rules and statistics"
msgstr "Показать текущие правила и статистику nftables"
msgid "Check Rules"
msgstr "Проверить правила"
msgid "GitHub Connectivity"
msgstr "Подключение к GitHub"
msgid "Check GitHub connectivity and lists availability"
msgstr "Проверить подключение к GitHub и доступность списков"
msgid "Check GitHub"
msgstr "Проверить GitHub"
msgid "GitHub Connectivity Results"
msgstr "Результаты проверки подключения к GitHub"
msgid "Sing-Box Logs"
msgstr "Логи Sing-Box"
msgid "View recent sing-box logs from system journal"
msgstr "Просмотр последних логов sing-box из системного журнала"
msgid "View Sing-Box Logs"
msgstr "Просмотр логов Sing-Box"
msgid "Podkop Logs"
msgstr "Логи Podkop"
msgid "View recent podkop logs from system journal"
msgstr "Просмотр последних логов podkop из системного журнала"
msgid "View Podkop Logs"
msgstr "Просмотр логов Podkop"
msgid "Active Connections"
msgstr "Активные соединения"
msgid "View active sing-box network connections"
msgstr "Просмотр активных сетевых соединений sing-box"
msgid "Check Connections"
msgstr "Проверить соединения"
msgid "DNSMasq Configuration"
msgstr "Конфигурация DNSMasq"
msgid "View current DNSMasq configuration settings"
msgstr "Просмотр текущих настроек конфигурации DNSMasq"
msgid "Check DNSMasq"
msgstr "Проверить DNSMasq"
msgid "Sing-Box Configuration"
msgstr "Конфигурация Sing-Box"
msgid "Show current sing-box configuration"
msgstr "Показать текущую конфигурацию sing-box"
msgid "Show Sing-Box Config"
msgstr "Показать конфигурацию Sing-Box"
msgid "Lists Update Results" msgid "Lists Update Results"
msgstr "Результаты обновления списков" msgstr "Результаты обновления списков"
#: applications/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js:XXX msgid "DNS Protocol Type"
msgid "Warning: %s cannot be used together with %s. Previous selections have been removed." msgstr "Тип DNS протокола"
msgstr "Предупреждение: %s нельзя использовать вместе с %s. Предыдущие варианты были удалены."
#: applications/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js:XXX msgid "Select DNS protocol to use"
msgid "Warning: Russia inside can only be used with Meta, Twitter, Discord, and Telegram. %s have been removed from selection." msgstr "Выберите протокол DNS"
msgstr "Внимание: Russia inside может использоваться только с Meta, Twitter, Discord и Telegram. %s были удалены из выбора."
#: applications/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js:XXX msgid "DNS over HTTPS (DoH)"
msgid "Regional options cannot be used together" msgstr "DNS через HTTPS (DoH)"
msgstr "Нельзя использовать несколько региональных опций"
#: applications/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js:XXX msgid "DNS over TLS (DoT)"
msgid "Russia inside restrictions" msgstr "DNS через TLS (DoT)"
msgstr "Ограничения Russia inside"
msgid "UDP (Unprotected DNS)"
msgstr "UDP (Незащищённый DNS)"
msgid "DNS Server"
msgstr "DNS сервер"
msgid "Select or enter DNS server address"
msgstr "Выберите или введите адрес DNS сервера"
msgid "DNS server address cannot be empty"
msgstr "Адрес DNS сервера не может быть пустым"
msgid "Invalid DNS server format. Examples: 8.8.8.8 or dns.example.com"
msgstr "Неверный формат DNS сервера. Примеры: 8.8.8.8 или dns.example.com"
msgid "DNS Rewrite TTL"
msgstr "Перезапись TTL для DNS"
msgid "Time in seconds for DNS record caching (default: 600)"
msgstr "Время в секундах для кэширования DNS записей (по умолчанию: 600)"
msgid "TTL value cannot be empty"
msgstr "Значение TTL не может быть пустым"
msgid "TTL must be a positive number"
msgstr "TTL должно быть положительным числом"
msgid "Cache File Path"
msgstr "Путь к файлу кэша"
msgid "Select or enter path for sing-box cache file. Change this ONLY if you know what you are doing"
msgstr "Выберите или введите путь к файлу кэша sing-box. Меняйте ТОЛЬКО если знаете, что делаете"
msgid "Cache file path cannot be empty"
msgstr "Путь к файлу кэша не может быть пустым"
msgid "Path must be absolute (start with /)"
msgstr "Путь должен быть абсолютным (начинаться с /)"
msgid "Path must end with cache.db"
msgstr "Путь должен заканчиваться на cache.db"
msgid "Path must contain at least one directory (like /tmp/cache.db)"
msgstr "Путь должен содержать хотя бы одну директорию (например /tmp/cache.db)"
msgid "Invalid path format. Must be like /tmp/cache.db"
msgstr "Неверный формат пути. Пример: /tmp/cache.db"

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=podkop PKG_NAME:=podkop
PKG_VERSION:=0.3.10 PKG_VERSION:=0.3.15
PKG_RELEASE:=1 PKG_RELEASE:=1
PKG_MAINTAINER:=ITDog <podkop@itdog.info> PKG_MAINTAINER:=ITDog <podkop@itdog.info>

View File

@@ -29,5 +29,6 @@ config main 'main'
option socks5 '0' option socks5 '0'
option exclude_ntp '0' option exclude_ntp '0'
option quic_disable '0' option quic_disable '0'
option dont_touch_dhcp '0'
option update_interval '1d' option update_interval '1d'
option custom_domains_text option custom_domains_text

View File

@@ -7,7 +7,7 @@ script=$(readlink "$initscript")
NAME="$(basename ${script:-$initscript})" NAME="$(basename ${script:-$initscript})"
config_load "$NAME" config_load "$NAME"
EXTRA_COMMANDS="main list_update check_proxy check_nft check_github check_logs check_sing_box_connections check_sing_box_logs check_dnsmasq show_config show_version show_sing_box_config" EXTRA_COMMANDS="main list_update check_proxy check_nft check_github check_logs check_sing_box_connections check_sing_box_logs check_dnsmasq show_config show_version show_sing_box_config show_luci_version show_sing_box_version show_system_info get_status get_sing_box_status get_proxy_label"
EXTRA_HELP=" list_update Updating domain and subnet lists EXTRA_HELP=" list_update Updating domain and subnet lists
check_proxy Check if sing-box proxy works correctly check_proxy Check if sing-box proxy works correctly
check_nft Show PodkopTable nftables rules check_nft Show PodkopTable nftables rules
@@ -18,7 +18,11 @@ EXTRA_HELP=" list_update Updating domain and subnet lists
check_dnsmasq Show current DNSMasq configuration check_dnsmasq Show current DNSMasq configuration
show_config Show current configuration with masked sensitive data show_config Show current configuration with masked sensitive data
show_version Show current version show_version Show current version
show_sing_box_config Show current sing-box configuration" show_sing_box_config Show current sing-box configuration
show_luci_version Show LuCI app version
show_sing_box_version Show sing-box version
show_system_info Show OpenWrt version and device model
get_sing_box_status Get sing-box status"
[ ! -L /usr/sbin/podkop ] && ln -s /etc/init.d/podkop /usr/sbin/podkop [ ! -L /usr/sbin/podkop ] && ln -s /etc/init.d/podkop /usr/sbin/podkop
@@ -33,9 +37,10 @@ SUBNETS_META="${GITHUB_RAW_URL}/Subnets/IPv4/meta.lst"
SUBNETS_DISCORD="${GITHUB_RAW_URL}/Subnets/IPv4/discord.lst" SUBNETS_DISCORD="${GITHUB_RAW_URL}/Subnets/IPv4/discord.lst"
SUBNETS_TELERAM="${GITHUB_RAW_URL}/Subnets/IPv4/telegram.lst" SUBNETS_TELERAM="${GITHUB_RAW_URL}/Subnets/IPv4/telegram.lst"
SING_BOX_CONFIG="/etc/sing-box/config.json" SING_BOX_CONFIG="/etc/sing-box/config.json"
CACHE_FILE_PATH="/tmp/cache.db"
FAKEIP="198.18.0.0/15" FAKEIP="198.18.0.0/15"
VALID_SERVICES="russia_inside russia_outside ukraine_inside geoblock block porn news anime youtube discord meta twitter hdrezka tiktok telegram" VALID_SERVICES="russia_inside russia_outside ukraine_inside geoblock block porn news anime youtube discord meta twitter hdrezka tiktok telegram"
DNS_RESOLVERS="1.1.1.1 1.0.0.1 8.8.8.8 8.8.4.4 9.9.9.9 9.9.9.11 94.140.14.14 94.140.15.15 208.67.220.220 208.67.222.222 77.88.8.1 77.88.8.8"
TEST_DOMAIN="google.com"
start_service() { start_service() {
log "Start podkop" log "Start podkop"
@@ -71,7 +76,11 @@ start_service() {
stop_service() { stop_service() {
log "Stopping the podkop" log "Stopping the podkop"
remove_cron_job remove_cron_job
dnsmasq_rm
config_get_bool dont_touch_dhcp "main" "dont_touch_dhcp" "0"
if [ "$dont_touch_dhcp" -eq 0 ]; then
dnsmasq_restore
fi
rm -rf /tmp/podkop/*.lst rm -rf /tmp/podkop/*.lst
@@ -149,6 +158,7 @@ main() {
sing_box_dns sing_box_dns
sing_box_dns_rule_fakeip sing_box_dns_rule_fakeip
sing_box_rule_dns sing_box_rule_dns
sing_box_add_secure_dns_probe_domain
sing_box_cache_file sing_box_cache_file
process_socks5 process_socks5
@@ -200,7 +210,10 @@ main() {
config_get interface "main" "interface" config_get interface "main" "interface"
if [ -n "$proxy_string" ] || [ -n "$interface" ]; then if [ -n "$proxy_string" ] || [ -n "$interface" ]; then
dnsmasq_add config_get_bool dont_touch_dhcp "main" "dont_touch_dhcp" "0"
if [ "$dont_touch_dhcp" -eq 0 ]; then
dnsmasq_add_resolver
fi
fi fi
} }
@@ -247,6 +260,12 @@ migration() {
log "Found and removed filter-rr=HTTPS in dnsmasq config" log "Found and removed filter-rr=HTTPS in dnsmasq config"
sed -i '/^filter-rr=HTTPS/d' "/etc/dnsmasq.conf" sed -i '/^filter-rr=HTTPS/d' "/etc/dnsmasq.conf"
fi fi
# dhcp use-application-dns.net
if grep -q "use-application-dns.net" "/etc/config/dhcp"; then
log "Found and removed use-application-dns.net in dhcp config"
sed -i '/use-application-dns/d' "/etc/config/dhcp"
fi
} }
validate_service() { validate_service() {
@@ -310,27 +329,72 @@ create_nft_table() {
nft add rule inet $table proxy meta mark 0x105 meta l4proto udp tproxy ip to :1602 counter nft add rule inet $table proxy meta mark 0x105 meta l4proto udp tproxy ip to :1602 counter
} }
dnsmasq_add() { save_dnsmasq_config() {
## Future: Check config and skip restart local key="$1"
local backup_key="$2"
value=$(uci get "$key" 2>/dev/null)
if [ -z "$value" ]; then
uci set "$backup_key"="unset"
else
uci set "$backup_key"="$value"
fi
}
dnsmasq_add_resolver() {
log "Save dnsmasq config"
save_dnsmasq_config "dhcp.@dnsmasq[0].noresolv" "dhcp.@dnsmasq[0].podkop_noresolv"
save_dnsmasq_config "dhcp.@dnsmasq[0].cachesize" "dhcp.@dnsmasq[0].podkop_cachesize"
uci -q delete dhcp.@dnsmasq[0].podkop_server
for server in $(uci get dhcp.@dnsmasq[0].server 2>/dev/null); do
if [[ "$server" == "127.0.0.42" ]]; then
log "Dnsmasq save config error: server=127.0.0.42"
else
uci add_list dhcp.@dnsmasq[0].podkop_server="$server"
fi
done
log "Configure dnsmasq for sing-box" log "Configure dnsmasq for sing-box"
uci set dhcp.@dnsmasq[0].noresolv="1" uci set dhcp.@dnsmasq[0].noresolv="1"
uci set dhcp.@dnsmasq[0].filter_aaaa="1"
uci set dhcp.@dnsmasq[0].cachesize="0" uci set dhcp.@dnsmasq[0].cachesize="0"
uci -q delete dhcp.@dnsmasq[0].server uci -q delete dhcp.@dnsmasq[0].server
uci add_list dhcp.@dnsmasq[0].server="127.0.0.42" uci add_list dhcp.@dnsmasq[0].server="127.0.0.42"
uci add_list dhcp.@dnsmasq[0].server='/use-application-dns.net/'
uci commit dhcp uci commit dhcp
/etc/init.d/dnsmasq restart /etc/init.d/dnsmasq restart
} }
dnsmasq_rm() { dnsmasq_restore() {
log "Removing configuration for dnsmasq" log "Removing configuration for dnsmasq"
uci set dhcp.@dnsmasq[0].noresolv="0"
uci set dhcp.@dnsmasq[0].filter_aaaa="0" local cachesize=$(uci get dhcp.@dnsmasq[0].podkop_cachesize 2>/dev/null)
uci set dhcp.@dnsmasq[0].cachesize="1000" if [ -z "$cachesize" ]; then
uci -q delete dhcp.@dnsmasq[0].server log "dnsmasq revert: cachesize is unset"
uci add_list dhcp.@dnsmasq[0].server="8.8.8.8" else
uci set dhcp.@dnsmasq[0].cachesize="$cachesize"
fi
local noresolv=$(uci get dhcp.@dnsmasq[0].podkop_noresolv 2>/dev/null)
if [[ "$noresolv" == "unset" ]]; then
log "dnsmasq revert: noresolv is unset"
uci -q delete dhcp.@dnsmasq[0].noresolv
else
uci set dhcp.@dnsmasq[0].noresolv="$noresolv"
fi
local server=$(uci get dhcp.@dnsmasq[0].server 2>/dev/null)
if [[ "$server" == "127.0.0.42" ]]; then
uci -q delete dhcp.@dnsmasq[0].server
for server in $(uci get dhcp.@dnsmasq[0].podkop_server 2>/dev/null); do
uci add_list dhcp.@dnsmasq[0].server="$server"
done
uci delete dhcp.@dnsmasq[0].podkop_server
fi
uci delete dhcp.@dnsmasq[0].podkop_cachesize
uci delete dhcp.@dnsmasq[0].podkop_noresolv
uci commit dhcp uci commit dhcp
/etc/init.d/dnsmasq restart /etc/init.d/dnsmasq restart
@@ -483,6 +547,17 @@ list_update() {
config_foreach process_subnet_for_section_remote config_foreach process_subnet_for_section_remote
} }
find_working_resolver() {
local resolver_found=""
for resolver in $DNS_RESOLVERS; do
if nslookup $TEST_DOMAIN $resolver >/dev/null 2>&1; then
echo "$resolver"
return 0
fi
done
echo "8.8.8.8"
return 1
}
# sing-box funcs # sing-box funcs
@@ -560,32 +635,86 @@ sing_box_inbound_proxy() {
} }
sing_box_dns() { sing_box_dns() {
local dns_type
local dns_server
local resolver_tag="resolver"
config_get dns_type "main" "dns_type" "doh"
config_get dns_server "main" "dns_server" "1.1.1.1"
local server_json
local is_ip=$(echo "$dns_server" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' && echo "1" || echo "0")
if [ "$is_ip" = "0" ]; then
log "Finding working DNS resolver"
local dns_resolver=$(find_working_resolver)
log "Found working resolver: $dns_resolver"
fi
log "Configure DNS in sing-box" log "Configure DNS in sing-box"
server_json=$(jq -n \
--arg type "$dns_type" \
--arg server "$dns_server" \
--arg resolver "$resolver_tag" \
--arg is_ip "$is_ip" \
'{
"servers": [
{
"tag": "dns-server",
"address": (
if $type == "doh" then
"https://" + $server + "/dns-query"
elif $type == "dot" then
"tls://" + $server
else
$server
end
),
"detour": "direct-out"
} + (
if $is_ip == "0" then
{"address_resolver": $resolver}
else
{}
end
)
]
}')
if [ "$is_ip" = "0" ]; then
server_json=$(echo "$server_json" | jq \
--arg resolver "$resolver_tag" \
--arg address "$dns_resolver" \
'.servers += [{
"tag": $resolver,
"address": $address
}]')
fi
server_json=$(echo "$server_json" | jq '.servers += [{"tag": "fakeip-server", "address": "fakeip"}]')
jq \ jq \
--arg FAKEIP "$FAKEIP" \ --argjson dns_config "$server_json" \
'.dns = { --arg fakeip "$FAKEIP" \
"strategy": "ipv4_only", '.dns = {
"fakeip": { "strategy": "ipv4_only",
"enabled": true, "fakeip": {
"inet4_range": $FAKEIP "enabled": true,
}, "inet4_range": $fakeip
"servers": [
{
"tag": "cloudflare-doh-server",
"address": "https://1.1.1.1/dns-query",
"detour": "direct-out"
}, },
{ "servers": $dns_config.servers
"tag": "fakeip-server", }' $SING_BOX_CONFIG > /tmp/sing-box-config-tmp.json && mv /tmp/sing-box-config-tmp.json $SING_BOX_CONFIG
"address": "fakeip"
}
]
}' $SING_BOX_CONFIG >/tmp/sing-box-config-tmp.json && mv /tmp/sing-box-config-tmp.json $SING_BOX_CONFIG
} }
sing_box_dns_rule_fakeip() { sing_box_dns_rule_fakeip() {
log "Configure fakeip route in sing-box" local rewrite_ttl
config_get rewrite_ttl "main" "dns_rewrite_ttl" "600"
log "Configure fakeip route in sing-box and set TTL to $rewrite_ttl seconds"
jq \ jq \
--arg ttl "$rewrite_ttl" \
'.dns += { '.dns += {
"rules": [ "rules": [
{ {
@@ -595,7 +724,15 @@ sing_box_dns_rule_fakeip() {
"action": "reject" "action": "reject"
}, },
{ {
"domain_suffix": [
"use-application-dns.net"
],
"action": "reject"
},
{
"server": "fakeip-server", "server": "fakeip-server",
"domain": "",
"rewrite_ttl": ($ttl | tonumber),
"rule_set": [] "rule_set": []
} }
] ]
@@ -623,14 +760,17 @@ sing_box_dns_rule_fakeip_section() {
} }
sing_box_cache_file() { sing_box_cache_file() {
log "Configure cache.db in sing-box" config_get cache_file "main" "cache_file" "/tmp/cache.db"
log "Configure sing-box cache.db path"
jq \ jq \
--arg CACHE_FILE_PATH "$CACHE_FILE_PATH" \ --arg cache_file "$cache_file" \
'.experimental = { '.experimental = {
"cache_file": { "cache_file": {
"enabled": true, "enabled": true,
"store_fakeip": true, "store_fakeip": true,
"path": $CACHE_FILE_PATH "path": $cache_file
} }
}' $SING_BOX_CONFIG >/tmp/sing-box-config-tmp.json && mv /tmp/sing-box-config-tmp.json $SING_BOX_CONFIG }' $SING_BOX_CONFIG >/tmp/sing-box-config-tmp.json && mv /tmp/sing-box-config-tmp.json $SING_BOX_CONFIG
} }
@@ -1609,3 +1749,135 @@ show_version() {
local version=$(opkg info podkop | grep -m 1 "Version:" | cut -d' ' -f2) local version=$(opkg info podkop | grep -m 1 "Version:" | cut -d' ' -f2)
echo "$version" echo "$version"
} }
show_luci_version() {
local version=$(opkg info luci-app-podkop | grep -m 1 "Version:" | cut -d' ' -f2)
echo "$version"
}
show_sing_box_version() {
local version=$(opkg info sing-box | grep -m 1 "Version:" | cut -d' ' -f2)
echo "$version"
}
show_system_info() {
echo "=== OpenWrt Version ==="
grep OPENWRT_RELEASE /etc/os-release | cut -d'"' -f2
echo
echo "=== Device Model ==="
cat /tmp/sysinfo/model
}
get_sing_box_status() {
local running=0
local enabled=0
local status=""
local version=""
# Check if service is enabled
if [ -x /etc/rc.d/S99sing-box ]; then
enabled=1
fi
# Check if service is running
if pgrep -f "sing-box" >/dev/null; then
running=1
version=$(sing-box version | head -n 1 | awk '{print $3}')
fi
# Format status message
if [ $running -eq 1 ]; then
if [ $enabled -eq 1 ]; then
status="running & enabled"
else
status="running but disabled"
fi
else
if [ $enabled -eq 1 ]; then
status="stopped but enabled"
else
status="stopped & disabled"
fi
fi
echo "{\"running\":$running,\"enabled\":$enabled,\"status\":\"$status\"}"
}
get_status() {
local running=0
local enabled=0
local status=""
# Check if service is enabled
if [ -x /etc/rc.d/S99podkop ]; then
enabled=1
fi
# Check if service is running
if pgrep -f "sing-box" >/dev/null; then
running=1
fi
# Format status message
if [ $running -eq 1 ]; then
if [ $enabled -eq 1 ]; then
status="running & enabled"
else
status="running but disabled"
fi
else
if [ $enabled -eq 1 ]; then
status="stopped but enabled"
else
status="stopped & disabled"
fi
fi
echo "{\"running\":$running,\"enabled\":$enabled,\"status\":\"$status\"}"
}
get_proxy_label() {
local section="$1"
local proxy_string
local label=""
config_get proxy_string "$section" "proxy_string"
if [ -n "$proxy_string" ]; then
label=$(echo "$proxy_string" | sed -n 's/.*#\(.*\)$/\1/p')
echo "$label"
fi
}
sing_box_add_secure_dns_probe_domain() {
local domain="httpbin.org"
local override_address="numbersapi.com"
if [ -z "$override_address" ]; then
log "Error: Could not get br-lan IP address"
return 1
fi
log "Adding DNS probe domain ${domain} to fakeip-server configuration"
jq \
--arg domain "$domain" \
--arg override "$override_address" \
'.dns.rules |= map(
if .server == "fakeip-server" then
. + {
"domain": $domain
}
else
.
end
) |
.route.rules |= . + [
{
"domain": $domain,
"action": "route-options",
"override_address": $override
}
]' "$SING_BOX_CONFIG" >/tmp/sing-box-config-tmp.json && mv /tmp/sing-box-config-tmp.json "$SING_BOX_CONFIG"
log "DNS probe domain ${domain} configured with override to ${override_address}"
}