mirror of
https://github.com/itdoginfo/podkop.git
synced 2026-06-10 13:28:14 +03:00
Compare commits
66 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
de7b73af3c | ||
|
|
3c34bd1fd0 | ||
|
|
847895598d | ||
|
|
4146804e5a | ||
|
|
daef80b7b8 | ||
|
|
6e7b8a6be2 | ||
|
|
1365febaa4 | ||
|
|
1543d974cc | ||
|
|
4b03c28c41 | ||
|
|
c3281773d5 | ||
|
|
c9e0b54f2c | ||
|
|
7f33cfcb98 | ||
|
|
177469e212 | ||
|
|
1802818044 | ||
|
|
c62cb2de14 | ||
|
|
f253e4e36f | ||
|
|
41e696c9b2 | ||
|
|
835b455915 | ||
|
|
6089ef4c9b | ||
|
|
617e9a93bc | ||
|
|
6d9aedd236 | ||
|
|
fc9cf79221 | ||
|
|
2184c0c7d4 | ||
|
|
03736c613b | ||
|
|
c37ea6a4d3 | ||
|
|
a0869da4a5 | ||
|
|
23ac3a8d12 | ||
|
|
d8bd87a7da | ||
|
|
b93403c3e3 | ||
|
|
5629425853 | ||
|
|
8b2abc0b28 | ||
|
|
21085f3ac3 | ||
|
|
9a015bbde4 | ||
|
|
a7b6c36dfb | ||
|
|
f39e2d9ca9 | ||
|
|
00594f23fd | ||
|
|
0379cf5966 | ||
|
|
cfee6cec9a | ||
|
|
ad760a78bf | ||
|
|
d854caa4cc | ||
|
|
b44274d7f2 | ||
|
|
12d8537d90 | ||
|
|
8e18426a53 | ||
|
|
41a4f67fd0 | ||
|
|
c30160d8d3 | ||
|
|
42f75c3374 | ||
|
|
2cce383b33 | ||
|
|
81963bfbdf | ||
|
|
f3d2fa5a52 | ||
|
|
474f4b197f | ||
|
|
6083009c80 | ||
|
|
0672c55188 | ||
|
|
e14a7e7dd1 | ||
|
|
3f7e7cbc4b | ||
|
|
782f08b71b | ||
|
|
a40240bb3f | ||
|
|
1e9a7bffa4 | ||
|
|
4448c09c34 | ||
|
|
af95c0dcd0 | ||
|
|
d2fbff17bf | ||
|
|
a73def1f9a | ||
|
|
9976065696 | ||
|
|
aa8f2cef41 | ||
|
|
96f6def701 | ||
|
|
0152f073b7 | ||
|
|
06ce944e1c |
29
.github/workflows/close-invalid-issues.yml
vendored
Normal file
29
.github/workflows/close-invalid-issues.yml
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
name: Close Invalid Issues
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [labeled]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
close-invalid:
|
||||||
|
if: github.event.label.name == 'Close as invalid'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
steps:
|
||||||
|
- name: Close issue
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
await github.rest.issues.createComment({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
body: 'This issue has been marked as invalid and is being closed automatically.'
|
||||||
|
});
|
||||||
|
await github.rest.issues.update({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
state: 'closed'
|
||||||
|
});
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM itdoginfo/openwrt-sdk-apk:09102025
|
FROM itdoginfo/openwrt-sdk-apk:25.12.3
|
||||||
|
|
||||||
ARG PODKOP_VERSION
|
ARG PODKOP_VERSION
|
||||||
ENV PODKOP_VERSION=${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
|
COPY ./luci-app-podkop /builder/package/feeds/luci/luci-app-podkop
|
||||||
|
|
||||||
RUN make defconfig && \
|
RUN make defconfig && \
|
||||||
make package/podkop/compile -j1 V=s && \
|
make package/podkop/compile -j4 V=s && \
|
||||||
make package/luci-app-podkop/compile -j1 V=s
|
make package/luci-app-podkop/compile -j4 V=s
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM itdoginfo/openwrt-sdk-ipk:24.10.3
|
FROM itdoginfo/openwrt-sdk-ipk:24.10.6
|
||||||
|
|
||||||
ARG PODKOP_VERSION
|
ARG PODKOP_VERSION
|
||||||
|
|
||||||
|
|||||||
83
README.md
83
README.md
@@ -1,61 +1,54 @@
|
|||||||
# Вещи, которые вам нужно знать перед установкой
|
# Podkop
|
||||||
|
|
||||||
|
Маршрутизация трафика для OpenWrt.
|
||||||
|
|
||||||
|
Направляйте нужные ресурсы в туннель, а остальное — напрямую. Открытое программное обеспечение на базе [sing-box](https://github.com/SagerNet/sing-box).
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> Проект находится в стадии бета-версии. Возможны ошибки, нестабильная работа и существенные изменения функциональности.
|
||||||
|
|
||||||
|
# Вещи, которые необходимо знать перед установкой
|
||||||
|
|
||||||
|
### Обновления и конфигурация
|
||||||
|
- При обновлении **обязательно** [очищайте кэш LuCI](https://podkop.net/docs/clear-browser-cache/).
|
||||||
|
- После обновления проверяйте конфигурацию — она может изменяться между версиями.
|
||||||
|
- При старте Podkop модифицируется конфигурация Dnsmasq.
|
||||||
|
- Podkop изменяет конфигурацию sing-box. Если вы используете собственную конфигурацию, заранее сохраните её.
|
||||||
|
|
||||||
|
### Системные требования
|
||||||
|
- Требуется OpenWrt 24.10 или выше.
|
||||||
|
- Необходимо минимум 25 МБ свободного места на устройстве. Устройства с флеш-памятью 16 МБ не поддерживаются.
|
||||||
|
|
||||||
|
### Важные ограничения и особенности
|
||||||
|
- Если установлен Getdomains, его [необходимо удалить](https://github.com/itdoginfo/domain-routing-openwrt?tab=readme-ov-file#скрипт-для-удаления)
|
||||||
|
- Dashboard доступен только при подключении по HTTP (из-за особенностей Clash API). При использовании HTTPS или домена работа может быть недоступна.
|
||||||
|
|
||||||
|
### Поддержка и диагностика
|
||||||
|
- [Руководство по диагностике](https://podkop.net/docs/diagnostics/)
|
||||||
|
- Актуальные изменения публикуются в [Telegram-чате](https://t.me/itdogchat/81758/420321). Пожалуйста, ознакомьтесь с закрепленными сообщениями.
|
||||||
|
- При возникновении проблем оставляйте технически грамотный фидбэк в GitHub Issues и Telegram-чате.
|
||||||
|
|
||||||
- Это бета-версия, которая находится в активной разработке. Из версии в версию что-то может меняться.
|
|
||||||
- При возникновении проблем, нужен технически грамотный фидбэк в чат. Ознакомьтесь с закрепом в топике.
|
|
||||||
- При обновлении **обязательно** [сбрасывайте кэш LuCI](https://podkop.net/docs/clear-browser-cache/).
|
|
||||||
- Также при обновлении всегда заходите в конфигурацию и проверяйте свои настройки. Конфигурация может измениться.
|
|
||||||
- Необходимо минимум 25МБ свободного места на роутере. Роутеры с флешками на 16МБ сразу мимо.
|
|
||||||
- При старте программы редактируется конфиг Dnsmasq.
|
|
||||||
- Podkop редактирует конфиг sing-box. Обязательно сохраните ваш конфиг sing-box перед установкой, если он вам нужен.
|
|
||||||
- Информация здесь может быть устаревшей. Все изменения фиксируются в [телеграм-чате](https://t.me/itdogchat/81758/420321).
|
|
||||||
- [Если у вас что-то не работает.](https://podkop.net/docs/diagnostics/)
|
|
||||||
- Если у вас установлен Getdomains, [его следует удалить](https://github.com/itdoginfo/domain-routing-openwrt?tab=readme-ov-file#%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82-%D0%B4%D0%BB%D1%8F-%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F).
|
|
||||||
- Требуется версия OpenWrt 24.10.
|
|
||||||
- Dashboard доступен, если вы заходите по http (из-за особенностей clash api). И не будет работать, если вы заходите по https и/или домену.
|
|
||||||
|
|
||||||
# Документация
|
# Документация
|
||||||
https://podkop.net/
|
https://podkop.net/
|
||||||
|
|
||||||
# Установка Podkop
|
# Установка Podkop
|
||||||
Полная информация в [документации](https://podkop.net/docs/install/)
|
Полное руководство доступно в [документации](https://podkop.net/docs/install/)
|
||||||
|
|
||||||
Вкратце, достаточно одного скрипта для установки и обновления:
|
Для установки и обновления достаточно выполнить один скрипт:
|
||||||
```
|
```
|
||||||
sh <(wget -O - https://raw.githubusercontent.com/itdoginfo/podkop/refs/heads/main/install.sh)
|
sh <(wget -O - https://raw.githubusercontent.com/itdoginfo/podkop/refs/heads/main/install.sh)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Изменения 0.7.0
|
## Будущее
|
||||||
Начиная с версии 0.7.0 изменена структура конфига `/etc/config/podkop`. Старые значения несовместимы с новыми. Нужно заново настроить Podkop.
|
Планы развития проекта в настоящее время не публикуются в виде открытого roadmap. Обсуждение направлений и задач разработки ведётся авторами и контрибьюторами.
|
||||||
|
|
||||||
Скрипт установки обнаружит старую версию и предупредит вас об этом. Если вы согласитесь, то он сделает автоматически написанное ниже.
|
|
||||||
|
|
||||||
При обновлении вручную нужно:
|
|
||||||
|
|
||||||
0. Не ныть в issue и чатик.
|
|
||||||
1. Забэкапить старый конфиг:
|
|
||||||
```
|
|
||||||
mv /etc/config/podkop /etc/config/podkop-070
|
|
||||||
```
|
|
||||||
2. Стянуть новый дефолтный конфиг:
|
|
||||||
```
|
|
||||||
wget -O /etc/config/podkop https://raw.githubusercontent.com/itdoginfo/podkop/refs/heads/main/podkop/files/etc/config/podkop
|
|
||||||
```
|
|
||||||
3. Настроить заново ваш Podkop через Luci или UCI.
|
|
||||||
|
|
||||||
# ToDo
|
|
||||||
|
|
||||||
> [!IMPORTANT]
|
> [!IMPORTANT]
|
||||||
> PR принимаются только по issues, у которых стоит label "enhancement". Либо по согласованию с авторами в ТГ-чате. Остальные PR на данный момент не рассматриваются.
|
> Pull Request принимаются только после согласования с авторами в Telegram-чате. На данный момент PR без предварительного обсуждения не рассматриваются.
|
||||||
|
|
||||||
## Будущее
|
> [!WARNING]
|
||||||
- [ ] [Подписка](https://github.com/itdoginfo/podkop/issues/118). Здесь нужна реализация, чтоб для каждой секции помимо ручного выбора, был выбор фильтрации по тегу. Например, для main выбираем ключевые слова NL, DE, FI. А для extra секции фильтруем по RU. И создаётся outbound c urltest в которых перечислены outbound из фильтров.
|
> Данное программное обеспечение предоставляется «как есть», без каких-либо явных или подразумеваемых гарантий, включая гарантии коммерческой пригодности и соответствия определённой цели.
|
||||||
- [ ] Весь трафик в sing-box и маршрутизация полностью на его уровне.
|
>
|
||||||
- [ ] При успешном запуске переходит в фоновый режим и следит за состоянием sing-box. Если вдруг идёт exit 1, выполняется dnsmasq restore и снова следит за состоянием. Вопрос в том, как это искусственно провернуть. Попробовать положить прокси и посмотреть, останется ли работать DNS в этом случае. И здесь, вероятно, можно обойтись триггером в init.d. [Issue](https://github.com/itdoginfo/podkop/issues/111)
|
> Правообладатели и участники проекта не несут ответственности за любые прямые, косвенные, случайные, специальные или иные убытки, возникшие в результате использования программного обеспечения, включая потерю данных, прибыли или прерывание деятельности, даже если они были предупреждены о возможности таких последствий.
|
||||||
- [ ] Галочка, которая режет доступ к doh серверам.
|
|
||||||
- [ ] IPv6. Только после наполнения Wiki.
|
|
||||||
|
|
||||||
## Тесты
|
|
||||||
- [ ] Unit тесты (BATS)
|
|
||||||
- [ ] Интеграционные тесты бекенда (OpenWrt rootfs + BATS)
|
|
||||||
|
|
||||||
[](https://deepwiki.com/itdoginfo/podkop)
|
[](https://deepwiki.com/itdoginfo/podkop)
|
||||||
63
TRADEMARK.md
Normal file
63
TRADEMARK.md
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
Trademark Guidelines
|
||||||
|
|
||||||
|
Version 1.0 dated May 28, 2026
|
||||||
|
|
||||||
|
This trademark policy was prepared to help you understand how to use the Podkop trademarks, service marks, and logos in connection with the Podkop open source project and related software.
|
||||||
|
|
||||||
|
While the Podkop software is available under an open source license, that license does not grant permission to use the Podkop trademarks, service marks, or logos. This policy explains acceptable use of the Podkop brand and related marks.
|
||||||
|
|
||||||
|
This Policy covers:
|
||||||
|
1. Our word trademarks and service marks: Podkop
|
||||||
|
2. Our logos, icons, and other Podkop brand assets
|
||||||
|
|
||||||
|
This policy encompasses all trademarks and service marks, whether they are registered or not.
|
||||||
|
|
||||||
|
## 1. General Guidelines
|
||||||
|
|
||||||
|
Whenever you use one of our marks, you must always do so in a way that does not mislead anyone about what they are getting and from whom. For example, you cannot say you are distributing Podkop software when you are distributing a modified version of it, because recipients may not understand the differences between your modified versions and our own.
|
||||||
|
|
||||||
|
You also cannot use our logo on your website in a way that suggests that your website is an official website or that we endorse your website.
|
||||||
|
|
||||||
|
You can, however, say that you like the Podkop project, that you participate in the Podkop community, or that you are providing an unmodified version of the Podkop software.
|
||||||
|
|
||||||
|
You may not use or register our marks, or variations of them as part of your own trademark, service mark, domain name, company name, trade name, product name or service name.
|
||||||
|
|
||||||
|
Trademark law does not allow your use of names or trademarks that are too similar to ours. You therefore may not use an obvious variation of any of our marks or any phonetic equivalent, foreign language equivalent, takeoff, or abbreviation for a similar or compatible product or service. For example, we would consider the following too similar to one of our Marks:
|
||||||
|
|
||||||
|
- MyPodkop
|
||||||
|
- Open-Podkop
|
||||||
|
- PodkopX
|
||||||
|
- Podkop Lite
|
||||||
|
- Podkop Pro
|
||||||
|
|
||||||
|
## 2. Acceptable Uses
|
||||||
|
### Unmodified Code
|
||||||
|
|
||||||
|
When you redistribute an unmodified copy of Podkop software, you must not remove any Podkop trademarks, notices, or branding included in the original distribution.
|
||||||
|
|
||||||
|
### Modified Code
|
||||||
|
|
||||||
|
If you distribute a modified version of Podkop software, you may not use the Podkop name, trademarks, or logos in connection with your modified version, except to accurately describe the origin of the software in factual statements.
|
||||||
|
|
||||||
|
You must replace any Podkop branding, including names displayed in user interfaces, logs, documentation, and other user-facing elements, with your own distinct name and branding, so that your modified version is clearly distinguishable from the original Podkop software.
|
||||||
|
|
||||||
|
You must remove all Podkop logos and any other brand assets from the modified version.
|
||||||
|
|
||||||
|
You may not present your modified version as Podkop or as an official Podkop release, nor may you use the Podkop name in a way that suggests endorsement, affiliation, or official status.
|
||||||
|
|
||||||
|
You may only refer to Podkop in a factual and descriptive manner, for example: “This software is derived from Podkop open-source software.”
|
||||||
|
|
||||||
|
### Statements about Compatibility
|
||||||
|
|
||||||
|
You may use the word marks, exclusively for descriptive and factual purposes, to truthfully and accurately describe the relationship between your software and ours, including compatibility or origin. Any other use may imply that we have certified or approved your software.
|
||||||
|
|
||||||
|
### No Domain Names
|
||||||
|
|
||||||
|
You must not register any domain that includes our word marks or any variant or combination of them.
|
||||||
|
|
||||||
|
## 3. How to Display our Marks
|
||||||
|
### Use of Trademarks in Text
|
||||||
|
|
||||||
|
Always use trademarks in their exact form with correct spelling. They must not be abbreviated, modified, hyphenated, or combined with other words in a way that creates a new product or service name.
|
||||||
|
|
||||||
|
Unacceptable: Podcop
|
||||||
65
TRADEMARK_RU.md
Normal file
65
TRADEMARK_RU.md
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
Руководство по использованию товарных знаков
|
||||||
|
|
||||||
|
Версия 1.0 от 28 мая 2026 года
|
||||||
|
|
||||||
|
Настоящая политика в отношении товарных знаков подготовлена для того, чтобы помочь вам понять, как использовать товарные знаки, знаки обслуживания и логотипы Podkop в связи с открытым исходным кодом проекта Podkop и связанным программным обеспечением.
|
||||||
|
|
||||||
|
Хотя программное обеспечение Podkop распространяется под лицензией с открытым исходным кодом, эта лицензия не предоставляет разрешения на использование товарных знаков Podkop, знаков обслуживания или логотипов. Данная политика объясняет допустимое использование бренда Podkop и связанных обозначений.
|
||||||
|
|
||||||
|
Настоящая Политика охватывает:
|
||||||
|
1. Наши словесные товарные знаки и знаки обслуживания: Podkop
|
||||||
|
2. Наши логотипы, иконки и другие бренд-активы Podkop
|
||||||
|
|
||||||
|
Данная политика распространяется на все товарные знаки и знаки обслуживания, независимо от того, зарегистрированы они или нет.
|
||||||
|
|
||||||
|
## 1. Общие рекомендации
|
||||||
|
|
||||||
|
При использовании любого из наших знаков вы всегда должны делать это таким образом, чтобы никого не вводить в заблуждение относительно того, что именно они получают и от кого. Например, вы не можете утверждать, что распространяете программное обеспечение Podkop, если вы распространяете его модифицированную версию, поскольку получатели могут не понимать различий между вашей модифицированной версией и нашей оригинальной.
|
||||||
|
|
||||||
|
Вы также не можете использовать наш логотип на своём сайте таким образом, чтобы это создавало впечатление, что ваш сайт является официальным сайтом или что мы одобряем ваш сайт.
|
||||||
|
|
||||||
|
Однако вы можете указывать, что вам нравится проект Podkop, что вы участвуете в сообществе Podkop или что вы распространяете немодифицированную версию программного обеспечения Podkop.
|
||||||
|
|
||||||
|
Вы не имеете права использовать или регистрировать наши знаки, а также их вариации, как часть вашего собственного товарного знака, знака обслуживания, доменного имени, названия компании, коммерческого наименования, названия продукта или услуги.
|
||||||
|
|
||||||
|
Закон о товарных знаках не допускает использование названий или знаков, которые слишком похожи на наши. Поэтому вы не можете использовать очевидные вариации наших знаков или любые фонетически, иностранно-языковые эквиваленты, производные, аббревиатуры для похожего или совместимого продукта или услуги. Например, мы считаем слишком похожими на наши знаки следующие варианты:
|
||||||
|
|
||||||
|
- MyPodkop
|
||||||
|
- Open-Podkop
|
||||||
|
- PodkopX
|
||||||
|
- Podkop Lite
|
||||||
|
- Podkop Pro
|
||||||
|
|
||||||
|
## 2. Допустимое использование
|
||||||
|
|
||||||
|
### Немодифицированный код
|
||||||
|
|
||||||
|
При распространении немодифицированной копии программного обеспечения Podkop вы не должны удалять товарные знаки, уведомления или брендинг Podkop, включённые в исходное распространение.
|
||||||
|
|
||||||
|
### Модифицированный код
|
||||||
|
|
||||||
|
Если вы распространяете модифицированную версию программного обеспечения Podkop, вы не можете использовать название Podkop, товарные знаки или логотипы в связи с вашей модифицированной версией, за исключением точного описания происхождения программного обеспечения в фактических утверждениях.
|
||||||
|
|
||||||
|
Вы обязаны заменить все элементы брендинга Podkop, включая названия, отображаемые в пользовательском интерфейсе, логах, документации и других пользовательских элементах, на собственное отличительное название и брендинг, чтобы ваша модифицированная версия была явно отличима от оригинального программного обеспечения Podkop.
|
||||||
|
|
||||||
|
Вы должны удалить все логотипы Podkop и любые другие бренд-материалы из модифицированной версии.
|
||||||
|
|
||||||
|
Вы не можете представлять вашу модифицированную версию как Podkop или как официальную версию Podkop, а также использовать название Podkop таким образом, чтобы это подразумевало одобрение, аффилированность или официальный статус.
|
||||||
|
|
||||||
|
Вы можете ссылаться на Podkop только в фактическом и описательном контексте, например: «Это программное обеспечение основано на программном обеспечении Podkop с открытым исходным кодом».
|
||||||
|
|
||||||
|
### Упоминания о совместимости
|
||||||
|
|
||||||
|
Вы можете использовать словесные знаки исключительно в описательных и фактических целях для правдивого и точного описания связи вашего программного обеспечения с нашим, включая совместимость или происхождение. Любое другое использование может создавать впечатление, что мы сертифицировали или одобрили ваше программное обеспечение.
|
||||||
|
|
||||||
|
### Запрет на доменные имена
|
||||||
|
|
||||||
|
Вы не должны регистрировать доменные имена, содержащие наши словесные знаки или любые их варианты или комбинации.
|
||||||
|
|
||||||
|
## 3. Как отображать наши знаки
|
||||||
|
|
||||||
|
### Использование товарных знаков в тексте
|
||||||
|
|
||||||
|
Всегда используйте товарные знаки в их точной форме с корректным написанием. Их нельзя сокращать, изменять, соединять дефисами или объединять с другими словами таким образом, чтобы это создавало новое название продукта или услуги.
|
||||||
|
|
||||||
|
Недопустимо: Podcop
|
||||||
@@ -52,21 +52,21 @@
|
|||||||
"call": "Applicable for SOCKS and Shadowsocks proxy",
|
"call": "Applicable for SOCKS and Shadowsocks proxy",
|
||||||
"key": "Applicable for SOCKS and Shadowsocks proxy",
|
"key": "Applicable for SOCKS and Shadowsocks proxy",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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.",
|
"call": "At least one valid domain must be specified. Comments-only content is not allowed.",
|
||||||
"key": "At least one valid domain must be specified. Comments-only content is not allowed.",
|
"key": "At least one valid domain must be specified. Comments-only content is not allowed.",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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.",
|
"call": "At least one valid subnet or IP must be specified. Comments-only content is not allowed.",
|
||||||
"key": "At least one valid subnet or IP must be specified. Comments-only content is not allowed.",
|
"key": "At least one valid subnet or IP must be specified. Comments-only content is not allowed.",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:501"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:525"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -178,7 +178,7 @@
|
|||||||
"call": "Community Lists",
|
"call": "Community Lists",
|
||||||
"key": "Community Lists",
|
"key": "Community Lists",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:275"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:299"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -199,7 +199,7 @@
|
|||||||
"call": "Configuration Type",
|
"call": "Configuration Type",
|
||||||
"key": "Configuration Type",
|
"key": "Configuration Type",
|
||||||
"places": [
|
"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",
|
"call": "Connection URL",
|
||||||
"key": "Connection URL",
|
"key": "Connection URL",
|
||||||
"places": [
|
"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",
|
"call": "Disabled",
|
||||||
"key": "Disabled",
|
"key": "Disabled",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:366",
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:390",
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:446"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:470"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -312,7 +312,7 @@
|
|||||||
"call": "DNS over HTTPS (DoH)",
|
"call": "DNS over HTTPS (DoH)",
|
||||||
"key": "DNS over HTTPS (DoH)",
|
"key": "DNS over HTTPS (DoH)",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:15"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -320,7 +320,7 @@
|
|||||||
"call": "DNS over TLS (DoT)",
|
"call": "DNS over TLS (DoT)",
|
||||||
"key": "DNS over TLS (DoT)",
|
"key": "DNS over TLS (DoT)",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:16"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -328,7 +328,7 @@
|
|||||||
"call": "DNS Protocol Type",
|
"call": "DNS Protocol Type",
|
||||||
"key": "DNS Protocol Type",
|
"key": "DNS Protocol Type",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:12"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -343,7 +343,7 @@
|
|||||||
"call": "DNS Server",
|
"call": "DNS Server",
|
||||||
"key": "DNS Server",
|
"key": "DNS Server",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:24"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -365,7 +365,7 @@
|
|||||||
"call": "Domain Resolver",
|
"call": "Domain Resolver",
|
||||||
"key": "Domain Resolver",
|
"key": "Domain Resolver",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:230"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:254"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -416,8 +416,8 @@
|
|||||||
"call": "Dynamic List",
|
"call": "Dynamic List",
|
||||||
"key": "Dynamic List",
|
"key": "Dynamic List",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:367",
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:391",
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:447"
|
"../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",
|
"call": "Enable built-in DNS resolver for domains handled by this section",
|
||||||
"key": "Enable built-in DNS resolver for domains handled by this section",
|
"key": "Enable built-in DNS resolver for domains handled by this section",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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",
|
"call": "Enable Mixed Proxy",
|
||||||
"key": "Enable Mixed Proxy",
|
"key": "Enable Mixed Proxy",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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",
|
"call": "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies",
|
||||||
"key": "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies",
|
"key": "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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",
|
"call": "Enter complete outbound configuration in JSON format",
|
||||||
"key": "Enter complete outbound configuration in JSON format",
|
"key": "Enter complete outbound configuration in JSON format",
|
||||||
"places": [
|
"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 //",
|
"call": "Enter domain names separated by commas, spaces, or newlines. You can add comments using //",
|
||||||
"key": "Enter domain names separated by commas, spaces, or newlines. You can add comments using //",
|
"key": "Enter domain names separated by commas, spaces, or newlines. You can add comments using //",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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",
|
"call": "Enter domain names without protocols, e.g. example.com or sub.example.com",
|
||||||
"key": "Enter domain names without protocols, e.g. example.com or sub.example.com",
|
"key": "Enter domain names without protocols, e.g. example.com or sub.example.com",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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",
|
"call": "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses",
|
||||||
"key": "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses",
|
"key": "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:456"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:480"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "Every 1 minute",
|
"call": "Every 1 minute",
|
||||||
"key": "Every 1 minute",
|
"key": "Every 1 minute",
|
||||||
"places": [
|
"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",
|
"call": "Every 3 minutes",
|
||||||
"key": "Every 3 minutes",
|
"key": "Every 3 minutes",
|
||||||
"places": [
|
"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",
|
"call": "Every 30 seconds",
|
||||||
"key": "Every 30 seconds",
|
"key": "Every 30 seconds",
|
||||||
"places": [
|
"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",
|
"call": "Every 5 minutes",
|
||||||
"key": "Every 5 minutes",
|
"key": "Every 5 minutes",
|
||||||
"places": [
|
"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",
|
"call": "Exclude NTP",
|
||||||
"key": "Exclude NTP",
|
"key": "Exclude NTP",
|
||||||
"places": [
|
"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",
|
"call": "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN",
|
||||||
"key": "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN",
|
"key": "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js: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:231",
|
||||||
"src/podkop/tabs/diagnostic/initController.ts:261",
|
"src/podkop/tabs/diagnostic/initController.ts:261",
|
||||||
"src/podkop/tabs/diagnostic/initController.ts:265",
|
"src/podkop/tabs/diagnostic/initController.ts:265",
|
||||||
"src/podkop/tabs/diagnostic/initController.ts:299",
|
"src/podkop/tabs/diagnostic/initController.ts:302",
|
||||||
"src/podkop/tabs/diagnostic/initController.ts:303"
|
"src/podkop/tabs/diagnostic/initController.ts:306"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "Fastest",
|
"call": "Fastest",
|
||||||
"key": "Fastest",
|
"key": "Fastest",
|
||||||
"places": [
|
"places": [
|
||||||
"src/podkop/methods/custom/getDashboardSections.ts:117",
|
"src/podkop/methods/custom/getDashboardSections.ts:148",
|
||||||
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:59"
|
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:59"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -570,7 +577,7 @@
|
|||||||
"call": "Fully Routed IPs",
|
"call": "Fully Routed IPs",
|
||||||
"key": "Fully Routed IPs",
|
"key": "Fully Routed IPs",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:614"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:638"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -641,56 +648,56 @@
|
|||||||
"call": "Invalid HY2 URL: insecure must be 0 or 1",
|
"call": "Invalid HY2 URL: insecure must be 0 or 1",
|
||||||
"key": "Invalid HY2 URL: insecure must be 0 or 1",
|
"key": "Invalid HY2 URL: insecure must be 0 or 1",
|
||||||
"places": [
|
"places": [
|
||||||
"src/validators/validateHysteriaUrl.ts:76"
|
"src/validators/validateHysteriaUrl.ts:90"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "Invalid HY2 URL: invalid port number",
|
"call": "Invalid HY2 URL: invalid port number",
|
||||||
"key": "Invalid HY2 URL: invalid port number",
|
"key": "Invalid HY2 URL: invalid port number",
|
||||||
"places": [
|
"places": [
|
||||||
"src/validators/validateHysteriaUrl.ts:62"
|
"src/validators/validateHysteriaUrl.ts:77"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "Invalid HY2 URL: missing credentials/server",
|
"call": "Invalid HY2 URL: missing credentials/server",
|
||||||
"key": "Invalid HY2 URL: missing credentials/server",
|
"key": "Invalid HY2 URL: missing credentials/server",
|
||||||
"places": [
|
"places": [
|
||||||
"src/validators/validateHysteriaUrl.ts:32"
|
"src/validators/validateHysteriaUrl.ts:30"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "Invalid HY2 URL: missing host",
|
"call": "Invalid HY2 URL: missing host",
|
||||||
"key": "Invalid HY2 URL: missing host",
|
"key": "Invalid HY2 URL: missing host",
|
||||||
"places": [
|
"places": [
|
||||||
"src/validators/validateHysteriaUrl.ts:49"
|
"src/validators/validateHysteriaUrl.ts:47"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "Invalid HY2 URL: missing host & port",
|
"call": "Invalid HY2 URL: missing host & port",
|
||||||
"key": "Invalid HY2 URL: missing host & port",
|
"key": "Invalid HY2 URL: missing host & port",
|
||||||
"places": [
|
"places": [
|
||||||
"src/validators/validateHysteriaUrl.ts:43"
|
"src/validators/validateHysteriaUrl.ts:41"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "Invalid HY2 URL: missing password",
|
"call": "Invalid HY2 URL: missing password",
|
||||||
"key": "Invalid HY2 URL: missing password",
|
"key": "Invalid HY2 URL: missing password",
|
||||||
"places": [
|
"places": [
|
||||||
"src/validators/validateHysteriaUrl.ts:38"
|
"src/validators/validateHysteriaUrl.ts:36"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "Invalid HY2 URL: missing port",
|
"call": "Invalid HY2 URL: missing port",
|
||||||
"key": "Invalid HY2 URL: missing port",
|
"key": "Invalid HY2 URL: missing port",
|
||||||
"places": [
|
"places": [
|
||||||
"src/validators/validateHysteriaUrl.ts:53"
|
"src/validators/validateHysteriaUrl.ts:50"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "Invalid HY2 URL: must not contain spaces",
|
"call": "Invalid HY2 URL: must not contain spaces",
|
||||||
"key": "Invalid HY2 URL: must not contain spaces",
|
"key": "Invalid HY2 URL: must not contain spaces",
|
||||||
"places": [
|
"places": [
|
||||||
"src/validators/validateHysteriaUrl.ts:19"
|
"src/validators/validateHysteriaUrl.ts:18"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -704,28 +711,28 @@
|
|||||||
"call": "Invalid HY2 URL: obfs-password required when obfs is set",
|
"call": "Invalid HY2 URL: obfs-password required when obfs is set",
|
||||||
"key": "Invalid HY2 URL: obfs-password required when obfs is set",
|
"key": "Invalid HY2 URL: obfs-password required when obfs is set",
|
||||||
"places": [
|
"places": [
|
||||||
"src/validators/validateHysteriaUrl.ts:99"
|
"src/validators/validateHysteriaUrl.ts:108"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "Invalid HY2 URL: parsing failed",
|
"call": "Invalid HY2 URL: parsing failed",
|
||||||
"key": "Invalid HY2 URL: parsing failed",
|
"key": "Invalid HY2 URL: parsing failed",
|
||||||
"places": [
|
"places": [
|
||||||
"src/validators/validateHysteriaUrl.ts:113"
|
"src/validators/validateHysteriaUrl.ts:122"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "Invalid HY2 URL: sni cannot be empty",
|
"call": "Invalid HY2 URL: sni cannot be empty",
|
||||||
"key": "Invalid HY2 URL: sni cannot be empty",
|
"key": "Invalid HY2 URL: sni cannot be empty",
|
||||||
"places": [
|
"places": [
|
||||||
"src/validators/validateHysteriaUrl.ts:106"
|
"src/validators/validateHysteriaUrl.ts:116"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "Invalid HY2 URL: unsupported obfs type",
|
"call": "Invalid HY2 URL: unsupported obfs type",
|
||||||
"key": "Invalid HY2 URL: unsupported obfs type",
|
"key": "Invalid HY2 URL: unsupported obfs type",
|
||||||
"places": [
|
"places": [
|
||||||
"src/validators/validateHysteriaUrl.ts:88"
|
"src/validators/validateHysteriaUrl.ts:98"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -936,7 +943,7 @@
|
|||||||
"call": "Latest",
|
"call": "Latest",
|
||||||
"key": "Latest",
|
"key": "Latest",
|
||||||
"places": [
|
"places": [
|
||||||
"src/podkop/tabs/diagnostic/initController.ts:453"
|
"src/podkop/tabs/diagnostic/helpers/getPodkopVersionRow.ts:48"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -950,14 +957,21 @@
|
|||||||
"call": "Local Domain Lists",
|
"call": "Local Domain Lists",
|
||||||
"key": "Local Domain Lists",
|
"key": "Local Domain Lists",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:522"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:546"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "Local Subnet Lists",
|
"call": "Local Subnet Lists",
|
||||||
"key": "Local Subnet Lists",
|
"key": "Local Subnet Lists",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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",
|
"call": "Mixed Proxy Port",
|
||||||
"key": "Mixed Proxy Port",
|
"key": "Mixed Proxy Port",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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",
|
"call": "Must be a number in the range of 50 - 1000",
|
||||||
"key": "Must be a number in the range of 50 - 1000",
|
"key": "Must be a number in the range of 50 - 1000",
|
||||||
"places": [
|
"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",
|
"call": "Network Interface",
|
||||||
"key": "Network Interface",
|
"key": "Network Interface",
|
||||||
"places": [
|
"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",
|
"call": "Outbound Config",
|
||||||
"key": "Outbound Config",
|
"key": "Outbound Config",
|
||||||
"places": [
|
"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",
|
"call": "Outbound Configuration",
|
||||||
"key": "Outbound Configuration",
|
"key": "Outbound Configuration",
|
||||||
"places": [
|
"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",
|
"call": "Outdated",
|
||||||
"key": "Outdated",
|
"key": "Outdated",
|
||||||
"places": [
|
"places": [
|
||||||
"src/podkop/tabs/diagnostic/initController.ts:443"
|
"src/podkop/tabs/diagnostic/helpers/getPodkopVersionRow.ts:38"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1135,7 +1149,7 @@
|
|||||||
"call": "Proxy Configuration URL",
|
"call": "Proxy Configuration URL",
|
||||||
"key": "Proxy Configuration URL",
|
"key": "Proxy Configuration URL",
|
||||||
"places": [
|
"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",
|
"call": "Regional options cannot be used together",
|
||||||
"key": "Regional options cannot be used together",
|
"key": "Regional options cannot be used together",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:309"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:333"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "Remote Domain Lists",
|
"call": "Remote Domain Lists",
|
||||||
"key": "Remote Domain Lists",
|
"key": "Remote Domain Lists",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:568"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "Remote Subnet Lists",
|
"call": "Remote Subnet Lists",
|
||||||
"key": "Remote Subnet Lists",
|
"key": "Remote Subnet Lists",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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",
|
"call": "Routing Excluded IPs",
|
||||||
"key": "Routing Excluded IPs",
|
"key": "Routing Excluded IPs",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:395"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:413"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1254,7 +1275,7 @@
|
|||||||
"call": "Russia inside restrictions",
|
"call": "Russia inside restrictions",
|
||||||
"key": "Russia inside restrictions",
|
"key": "Russia inside restrictions",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:328"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:352"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1275,7 +1296,7 @@
|
|||||||
"call": "Select a predefined list for routing",
|
"call": "Select a predefined list for routing",
|
||||||
"key": "Select a predefined list for routing",
|
"key": "Select a predefined list for routing",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:276"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:300"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1303,21 +1324,21 @@
|
|||||||
"call": "Select how to configure the proxy",
|
"call": "Select how to configure the proxy",
|
||||||
"key": "Select how to configure the proxy",
|
"key": "Select how to configure the proxy",
|
||||||
"places": [
|
"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",
|
"call": "Select network interface for VPN connection",
|
||||||
"key": "Select network interface for VPN connection",
|
"key": "Select network interface for VPN connection",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:185"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:209"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "Select or enter DNS server address",
|
"call": "Select or enter DNS server address",
|
||||||
"key": "Select or enter DNS server address",
|
"key": "Select or enter DNS server address",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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"
|
"../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",
|
"call": "Select the DNS protocol type for the domain resolver",
|
||||||
"key": "Select the DNS protocol type for the domain resolver",
|
"key": "Select the DNS protocol type for the domain resolver",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:241"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:265"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "Select the list type for adding custom domains",
|
"call": "Select the list type for adding custom domains",
|
||||||
"key": "Select the list type for adding custom domains",
|
"key": "Select the list type for adding custom domains",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:364"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:388"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "Select the list type for adding custom subnets",
|
"call": "Select the list type for adding custom subnets",
|
||||||
"key": "Select the list type for adding custom subnets",
|
"key": "Select the list type for adding custom subnets",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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"
|
"../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",
|
"call": "Services info",
|
||||||
"key": "Services info",
|
"key": "Services info",
|
||||||
@@ -1459,36 +1501,36 @@
|
|||||||
"call": "Specify a local IP address to be excluded from routing",
|
"call": "Specify a local IP address to be excluded from routing",
|
||||||
"key": "Specify a local IP address to be excluded from routing",
|
"key": "Specify a local IP address to be excluded from routing",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js: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",
|
"call": "Specify local IP addresses or subnets whose traffic will always be routed through the configured route",
|
||||||
"key": "Specify local IP addresses or subnets whose traffic will always be routed through the configured route",
|
"key": "Specify local IP addresses or subnets whose traffic will always be routed through the configured route",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:615"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:639"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "Specify remote URLs to download and use domain lists",
|
"call": "Specify remote URLs to download and use domain lists",
|
||||||
"key": "Specify remote URLs to download and use domain lists",
|
"key": "Specify remote URLs to download and use domain lists",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:569"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:593"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "Specify remote URLs to download and use subnet lists",
|
"call": "Specify remote URLs to download and use subnet lists",
|
||||||
"key": "Specify remote URLs to download and use subnet lists",
|
"key": "Specify remote URLs to download and use subnet lists",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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",
|
"call": "Specify the path to the list file located on the router filesystem",
|
||||||
"key": "Specify the path to the list file located on the router filesystem",
|
"key": "Specify the path to the list file located on the router filesystem",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:523",
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:547",
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:546"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:570"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1544,8 +1586,8 @@
|
|||||||
"call": "Text List",
|
"call": "Text List",
|
||||||
"key": "Text List",
|
"key": "Text List",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:368",
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:392",
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:448"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:472"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1559,21 +1601,21 @@
|
|||||||
"call": "The interval between connectivity tests",
|
"call": "The interval between connectivity tests",
|
||||||
"key": "The interval between connectivity tests",
|
"key": "The interval between connectivity tests",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:135"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "The maximum difference in response times (ms) allowed when comparing servers",
|
"call": "The maximum difference in response times (ms) allowed when comparing servers",
|
||||||
"key": "The maximum difference in response times (ms) allowed when comparing servers",
|
"key": "The maximum difference in response times (ms) allowed when comparing servers",
|
||||||
"places": [
|
"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",
|
"call": "The URL used to test server connectivity",
|
||||||
"key": "The URL used to test server connectivity",
|
"key": "The URL used to test server connectivity",
|
||||||
"places": [
|
"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)",
|
"call": "UDP (Unprotected DNS)",
|
||||||
"key": "UDP (Unprotected DNS)",
|
"key": "UDP (Unprotected DNS)",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:17"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -1630,7 +1672,7 @@
|
|||||||
"call": "UDP over TCP",
|
"call": "UDP over TCP",
|
||||||
"key": "UDP over TCP",
|
"key": "UDP over TCP",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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:41",
|
||||||
"src/podkop/tabs/diagnostic/initController.ts:42",
|
"src/podkop/tabs/diagnostic/initController.ts:42",
|
||||||
"src/podkop/tabs/diagnostic/initController.ts:43",
|
"src/podkop/tabs/diagnostic/initController.ts:43",
|
||||||
"src/podkop/tabs/diagnostic/initController.ts:417"
|
"src/podkop/tabs/diagnostic/helpers/getPodkopVersionRow.ts:7"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1679,77 +1721,77 @@
|
|||||||
"call": "URLTest",
|
"call": "URLTest",
|
||||||
"key": "URLTest",
|
"key": "URLTest",
|
||||||
"places": [
|
"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",
|
"call": "URLTest Check Interval",
|
||||||
"key": "URLTest Check Interval",
|
"key": "URLTest Check Interval",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:134"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "URLTest Proxy Links",
|
"call": "URLTest Proxy Links",
|
||||||
"key": "URLTest Proxy Links",
|
"key": "URLTest Proxy Links",
|
||||||
"places": [
|
"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",
|
"call": "URLTest Testing URL",
|
||||||
"key": "URLTest Testing URL",
|
"key": "URLTest Testing URL",
|
||||||
"places": [
|
"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",
|
"call": "URLTest Tolerance",
|
||||||
"key": "URLTest Tolerance",
|
"key": "URLTest Tolerance",
|
||||||
"places": [
|
"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",
|
"call": "User Domain List Type",
|
||||||
"key": "User Domain List Type",
|
"key": "User Domain List Type",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:363"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:387"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "User Domains",
|
"call": "User Domains",
|
||||||
"key": "User Domains",
|
"key": "User Domains",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:375"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:399"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "User Domains List",
|
"call": "User Domains List",
|
||||||
"key": "User Domains List",
|
"key": "User Domains List",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:401"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:425"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "User Subnet List Type",
|
"call": "User Subnet List Type",
|
||||||
"key": "User Subnet List Type",
|
"key": "User Subnet List Type",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:443"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:467"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "User Subnets",
|
"call": "User Subnets",
|
||||||
"key": "User Subnets",
|
"key": "User Subnets",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:455"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:479"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"call": "User Subnets List",
|
"call": "User Subnets List",
|
||||||
"key": "User Subnets List",
|
"key": "User Subnets List",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:481"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:505"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1760,7 +1802,7 @@
|
|||||||
"src/validators/validateDns.ts:18",
|
"src/validators/validateDns.ts:18",
|
||||||
"src/validators/validateDomain.ts:13",
|
"src/validators/validateDomain.ts:13",
|
||||||
"src/validators/validateDomain.ts:30",
|
"src/validators/validateDomain.ts:30",
|
||||||
"src/validators/validateHysteriaUrl.ts:111",
|
"src/validators/validateHysteriaUrl.ts:120",
|
||||||
"src/validators/validateIp.ts:8",
|
"src/validators/validateIp.ts:8",
|
||||||
"src/validators/validateOutboundJson.ts:7",
|
"src/validators/validateOutboundJson.ts:7",
|
||||||
"src/validators/validatePath.ts:16",
|
"src/validators/validatePath.ts:16",
|
||||||
@@ -1776,8 +1818,8 @@
|
|||||||
"call": "Validation errors:",
|
"call": "Validation errors:",
|
||||||
"key": "Validation errors:",
|
"key": "Validation errors:",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:434",
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:458",
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:513"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:537"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1795,18 +1837,27 @@
|
|||||||
"src/podkop/tabs/diagnostic/partials/renderWikiDisclaimer.ts:31"
|
"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.",
|
"call": "Warning: %s cannot be used together with %s. Previous selections have been removed.",
|
||||||
"key": "Warning: %s cannot be used together with %s. Previous selections have been removed.",
|
"key": "Warning: %s cannot be used together with %s. Previous selections have been removed.",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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.",
|
"call": "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection.",
|
||||||
"key": "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection.",
|
"key": "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection.",
|
||||||
"places": [
|
"places": [
|
||||||
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:330"
|
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:354"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
# SOME DESCRIPTIVE TITLE.
|
# 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.
|
# This file is distributed under the same license as the PODKOP package.
|
||||||
# divocat <divocatt@gmail.com>, 2025.
|
# divocatt <210179590+divocatt@users.noreply.github.com>, 2026.
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PODKOP\n"
|
"Project-Id-Version: PODKOP\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2025-12-01 14:30+0200\n"
|
"POT-Creation-Date: 2026-05-29 13:40+0300\n"
|
||||||
"PO-Revision-Date: 2025-12-01 14:30+0200\n"
|
"PO-Revision-Date: 2026-05-29 13:40+0300\n"
|
||||||
"Last-Translator: divocat <divocatt@gmail.com>\n"
|
"Last-Translator: divocatt <210179590+divocatt@users.noreply.github.com>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
"Language: \n"
|
"Language: \n"
|
||||||
"MIME-Version: 1.0\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."
|
msgid "Allows access to YACD from the WAN. Make sure to open the appropriate port in your firewall."
|
||||||
msgstr ""
|
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"
|
msgid "Applicable for SOCKS and Shadowsocks proxy"
|
||||||
msgstr ""
|
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."
|
msgid "At least one valid domain must be specified. Comments-only content is not allowed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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."
|
msgid "At least one valid subnet or IP must be specified. Comments-only content is not allowed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -119,7 +119,7 @@ msgstr ""
|
|||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr ""
|
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"
|
msgid "Community Lists"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -131,7 +131,7 @@ msgstr ""
|
|||||||
msgid "Configuration for Podkop service"
|
msgid "Configuration for Podkop service"
|
||||||
msgstr ""
|
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"
|
msgid "Configuration Type"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -139,7 +139,7 @@ msgstr ""
|
|||||||
msgid "Connection Type"
|
msgid "Connection Type"
|
||||||
msgstr ""
|
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"
|
msgid "Connection URL"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -187,8 +187,8 @@ msgstr ""
|
|||||||
msgid "Disable the QUIC protocol to improve compatibility or fix issues with video streaming"
|
msgid "Disable the QUIC protocol to improve compatibility or fix issues with video streaming"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:366
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:390
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:446
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:470
|
||||||
msgid "Disabled"
|
msgid "Disabled"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -196,17 +196,17 @@ msgstr ""
|
|||||||
msgid "DNS on router"
|
msgid "DNS on router"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:15
|
||||||
msgid "DNS over HTTPS (DoH)"
|
msgid "DNS over HTTPS (DoH)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:16
|
||||||
msgid "DNS over TLS (DoT)"
|
msgid "DNS over TLS (DoT)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:12
|
||||||
msgid "DNS Protocol Type"
|
msgid "DNS Protocol Type"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -215,7 +215,7 @@ msgstr ""
|
|||||||
msgid "DNS Rewrite TTL"
|
msgid "DNS Rewrite TTL"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:24
|
||||||
msgid "DNS Server"
|
msgid "DNS Server"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -228,7 +228,7 @@ msgstr ""
|
|||||||
msgid "Do not panic, everything can be fixed, just..."
|
msgid "Do not panic, everything can be fixed, just..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:230
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:254
|
||||||
msgid "Domain Resolver"
|
msgid "Domain Resolver"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -258,8 +258,8 @@ msgstr ""
|
|||||||
msgid "Downloading all lists via specific Proxy/VPN"
|
msgid "Downloading all lists via specific Proxy/VPN"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:367
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:391
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:447
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:471
|
||||||
msgid "Dynamic List"
|
msgid "Dynamic List"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -267,11 +267,15 @@ msgstr ""
|
|||||||
msgid "Enable autostart"
|
msgid "Enable autostart"
|
||||||
msgstr ""
|
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"
|
msgid "Enable built-in DNS resolver for domains handled by this section"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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"
|
msgid "Enable Mixed Proxy"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -279,7 +283,7 @@ msgstr ""
|
|||||||
msgid "Enable Output Network Interface"
|
msgid "Enable Output Network Interface"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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"
|
msgid "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -291,43 +295,43 @@ msgstr ""
|
|||||||
msgid "Enable YACD WAN Access"
|
msgid "Enable YACD WAN Access"
|
||||||
msgstr ""
|
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"
|
msgid "Enter complete outbound configuration in JSON format"
|
||||||
msgstr ""
|
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 //"
|
msgid "Enter domain names separated by commas, spaces, or newlines. You can add comments using //"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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"
|
msgid "Enter domain names without protocols, e.g. example.com or sub.example.com"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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"
|
msgid "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:114
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:138
|
||||||
msgid "Every 1 minute"
|
msgid "Every 1 minute"
|
||||||
msgstr ""
|
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"
|
msgid "Every 3 minutes"
|
||||||
msgstr ""
|
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"
|
msgid "Every 30 seconds"
|
||||||
msgstr ""
|
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"
|
msgid "Every 5 minutes"
|
||||||
msgstr ""
|
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"
|
msgid "Exclude NTP"
|
||||||
msgstr ""
|
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"
|
msgid "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -339,17 +343,17 @@ msgstr ""
|
|||||||
#: src/podkop/tabs/diagnostic/initController.ts:231
|
#: src/podkop/tabs/diagnostic/initController.ts:231
|
||||||
#: src/podkop/tabs/diagnostic/initController.ts:261
|
#: src/podkop/tabs/diagnostic/initController.ts:261
|
||||||
#: src/podkop/tabs/diagnostic/initController.ts:265
|
#: src/podkop/tabs/diagnostic/initController.ts:265
|
||||||
#: src/podkop/tabs/diagnostic/initController.ts:299
|
#: src/podkop/tabs/diagnostic/initController.ts:302
|
||||||
#: src/podkop/tabs/diagnostic/initController.ts:303
|
#: src/podkop/tabs/diagnostic/initController.ts:306
|
||||||
msgid "Failed to execute!"
|
msgid "Failed to execute!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/podkop/methods/custom/getDashboardSections.ts:117
|
#: src/podkop/methods/custom/getDashboardSections.ts:148
|
||||||
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:59
|
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:59
|
||||||
msgid "Fastest"
|
msgid "Fastest"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:614
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:638
|
||||||
msgid "Fully Routed IPs"
|
msgid "Fully Routed IPs"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -390,35 +394,35 @@ msgstr ""
|
|||||||
msgid "Invalid format. Use X.X.X.X or X.X.X.X/Y"
|
msgid "Invalid format. Use X.X.X.X or X.X.X.X/Y"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:76
|
#: src/validators/validateHysteriaUrl.ts:90
|
||||||
msgid "Invalid HY2 URL: insecure must be 0 or 1"
|
msgid "Invalid HY2 URL: insecure must be 0 or 1"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:62
|
#: src/validators/validateHysteriaUrl.ts:77
|
||||||
msgid "Invalid HY2 URL: invalid port number"
|
msgid "Invalid HY2 URL: invalid port number"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:32
|
#: src/validators/validateHysteriaUrl.ts:30
|
||||||
msgid "Invalid HY2 URL: missing credentials/server"
|
msgid "Invalid HY2 URL: missing credentials/server"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:49
|
#: src/validators/validateHysteriaUrl.ts:47
|
||||||
msgid "Invalid HY2 URL: missing host"
|
msgid "Invalid HY2 URL: missing host"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:43
|
#: src/validators/validateHysteriaUrl.ts:41
|
||||||
msgid "Invalid HY2 URL: missing host & port"
|
msgid "Invalid HY2 URL: missing host & port"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:38
|
#: src/validators/validateHysteriaUrl.ts:36
|
||||||
msgid "Invalid HY2 URL: missing password"
|
msgid "Invalid HY2 URL: missing password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:53
|
#: src/validators/validateHysteriaUrl.ts:50
|
||||||
msgid "Invalid HY2 URL: missing port"
|
msgid "Invalid HY2 URL: missing port"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:19
|
#: src/validators/validateHysteriaUrl.ts:18
|
||||||
msgid "Invalid HY2 URL: must not contain spaces"
|
msgid "Invalid HY2 URL: must not contain spaces"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -426,19 +430,19 @@ msgstr ""
|
|||||||
msgid "Invalid HY2 URL: must start with hysteria2:// or hy2://"
|
msgid "Invalid HY2 URL: must start with hysteria2:// or hy2://"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:99
|
#: src/validators/validateHysteriaUrl.ts:108
|
||||||
msgid "Invalid HY2 URL: obfs-password required when obfs is set"
|
msgid "Invalid HY2 URL: obfs-password required when obfs is set"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:113
|
#: src/validators/validateHysteriaUrl.ts:122
|
||||||
msgid "Invalid HY2 URL: parsing failed"
|
msgid "Invalid HY2 URL: parsing failed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:106
|
#: src/validators/validateHysteriaUrl.ts:116
|
||||||
msgid "Invalid HY2 URL: sni cannot be empty"
|
msgid "Invalid HY2 URL: sni cannot be empty"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:88
|
#: src/validators/validateHysteriaUrl.ts:98
|
||||||
msgid "Invalid HY2 URL: unsupported obfs type"
|
msgid "Invalid HY2 URL: unsupported obfs type"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -559,7 +563,7 @@ msgstr ""
|
|||||||
msgid "Issues detected"
|
msgid "Issues detected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/podkop/tabs/diagnostic/initController.ts:453
|
#: src/podkop/tabs/diagnostic/helpers/getPodkopVersionRow.ts:48
|
||||||
msgid "Latest"
|
msgid "Latest"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -567,14 +571,18 @@ msgstr ""
|
|||||||
msgid "List Update Frequency"
|
msgid "List Update Frequency"
|
||||||
msgstr ""
|
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"
|
msgid "Local Domain Lists"
|
||||||
msgstr ""
|
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"
|
msgid "Local Subnet Lists"
|
||||||
msgstr ""
|
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
|
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:72
|
||||||
msgid "Main DNS"
|
msgid "Main DNS"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -583,7 +591,7 @@ msgstr ""
|
|||||||
msgid "Memory Usage"
|
msgid "Memory Usage"
|
||||||
msgstr ""
|
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"
|
msgid "Mixed Proxy Port"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -591,11 +599,11 @@ msgstr ""
|
|||||||
msgid "Monitored Interfaces"
|
msgid "Monitored Interfaces"
|
||||||
msgstr ""
|
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"
|
msgid "Must be a number in the range of 50 - 1000"
|
||||||
msgstr ""
|
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"
|
msgid "Network Interface"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -625,15 +633,15 @@ msgstr ""
|
|||||||
msgid "Operation timed out"
|
msgid "Operation timed out"
|
||||||
msgstr ""
|
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"
|
msgid "Outbound Config"
|
||||||
msgstr ""
|
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"
|
msgid "Outbound Configuration"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/podkop/tabs/diagnostic/initController.ts:443
|
#: src/podkop/tabs/diagnostic/helpers/getPodkopVersionRow.ts:38
|
||||||
msgid "Outdated"
|
msgid "Outdated"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -677,7 +685,7 @@ msgstr ""
|
|||||||
msgid "Podkop will not modify your DHCP configuration"
|
msgid "Podkop will not modify your DHCP configuration"
|
||||||
msgstr ""
|
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"
|
msgid "Proxy Configuration URL"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -689,18 +697,22 @@ msgstr ""
|
|||||||
msgid "Proxy traffic is routed via FakeIP"
|
msgid "Proxy traffic is routed via FakeIP"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:309
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:333
|
||||||
msgid "Regional options cannot be used together"
|
msgid "Regional options cannot be used together"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:568
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592
|
||||||
msgid "Remote Domain Lists"
|
msgid "Remote Domain Lists"
|
||||||
msgstr ""
|
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"
|
msgid "Remote Subnet Lists"
|
||||||
msgstr ""
|
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
|
#: src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:49
|
||||||
msgid "Restart podkop"
|
msgid "Restart podkop"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -713,7 +725,7 @@ msgstr ""
|
|||||||
msgid "Router DNS is routed through sing-box"
|
msgid "Router DNS is routed through sing-box"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:395
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:413
|
||||||
msgid "Routing Excluded IPs"
|
msgid "Routing Excluded IPs"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -745,7 +757,7 @@ msgstr ""
|
|||||||
msgid "Run Diagnostic"
|
msgid "Run Diagnostic"
|
||||||
msgstr ""
|
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"
|
msgid "Russia inside restrictions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -757,7 +769,7 @@ msgstr ""
|
|||||||
msgid "Sections"
|
msgid "Sections"
|
||||||
msgstr ""
|
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"
|
msgid "Select a predefined list for routing"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -773,15 +785,15 @@ msgstr ""
|
|||||||
msgid "Select how often the domain or subnet lists are updated automatically"
|
msgid "Select how often the domain or subnet lists are updated automatically"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../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"
|
msgid "Select how to configure the proxy"
|
||||||
msgstr ""
|
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"
|
msgid "Select network interface for VPN connection"
|
||||||
msgstr ""
|
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
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:25
|
||||||
msgid "Select or enter DNS server address"
|
msgid "Select or enter DNS server address"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -794,18 +806,22 @@ msgstr ""
|
|||||||
msgid "Select path for sing-box config file. Change this ONLY if you know what you are doing"
|
msgid "Select path for sing-box config file. Change this ONLY if you know what you are doing"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:241
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:265
|
||||||
msgid "Select the DNS protocol type for the domain resolver"
|
msgid "Select the DNS protocol type for the domain resolver"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:364
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:388
|
||||||
msgid "Select the list type for adding custom domains"
|
msgid "Select the list type for adding custom domains"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:444
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:468
|
||||||
msgid "Select the list type for adding custom subnets"
|
msgid "Select the list type for adding custom subnets"
|
||||||
msgstr ""
|
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
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:90
|
||||||
msgid "Select the network interface from which the traffic will originate"
|
msgid "Select the network interface from which the traffic will originate"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -818,6 +834,14 @@ msgstr ""
|
|||||||
msgid "Select the WAN interfaces to be monitored"
|
msgid "Select the WAN interfaces to be monitored"
|
||||||
msgstr ""
|
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
|
#: src/podkop/tabs/dashboard/initController.ts:340
|
||||||
msgid "Services info"
|
msgid "Services info"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -863,24 +887,24 @@ msgstr ""
|
|||||||
msgid "Source Network Interface"
|
msgid "Source Network Interface"
|
||||||
msgstr ""
|
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"
|
msgid "Specify a local IP address to be excluded from routing"
|
||||||
msgstr ""
|
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"
|
msgid "Specify local IP addresses or subnets whose traffic will always be routed through the configured route"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:569
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:593
|
||||||
msgid "Specify remote URLs to download and use domain lists"
|
msgid "Specify remote URLs to download and use domain lists"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:616
|
||||||
msgid "Specify remote URLs to download and use subnet lists"
|
msgid "Specify remote URLs to download and use subnet lists"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:523
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:547
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:546
|
#: ../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"
|
msgid "Specify the path to the list file located on the router filesystem"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -912,8 +936,8 @@ msgstr ""
|
|||||||
msgid "Test latency"
|
msgid "Test latency"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:368
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:392
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:448
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:472
|
||||||
msgid "Text List"
|
msgid "Text List"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -921,15 +945,15 @@ msgstr ""
|
|||||||
msgid "The DNS server used to look up the IP address of an upstream DNS server"
|
msgid "The DNS server used to look up the IP address of an upstream DNS server"
|
||||||
msgstr ""
|
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"
|
msgid "The interval between connectivity tests"
|
||||||
msgstr ""
|
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"
|
msgid "The maximum difference in response times (ms) allowed when comparing servers"
|
||||||
msgstr ""
|
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"
|
msgid "The URL used to test server connectivity"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -957,12 +981,12 @@ msgstr ""
|
|||||||
msgid "TTL value cannot be empty"
|
msgid "TTL value cannot be empty"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:17
|
||||||
msgid "UDP (Unprotected DNS)"
|
msgid "UDP (Unprotected DNS)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:174
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:198
|
||||||
msgid "UDP over TCP"
|
msgid "UDP over TCP"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -972,7 +996,7 @@ msgstr ""
|
|||||||
#: src/podkop/tabs/diagnostic/initController.ts:41
|
#: src/podkop/tabs/diagnostic/initController.ts:41
|
||||||
#: src/podkop/tabs/diagnostic/initController.ts:42
|
#: src/podkop/tabs/diagnostic/initController.ts:42
|
||||||
#: src/podkop/tabs/diagnostic/initController.ts:43
|
#: src/podkop/tabs/diagnostic/initController.ts:43
|
||||||
#: src/podkop/tabs/diagnostic/initController.ts:417
|
#: src/podkop/tabs/diagnostic/helpers/getPodkopVersionRow.ts:7
|
||||||
msgid "unknown"
|
msgid "unknown"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -993,47 +1017,47 @@ msgstr ""
|
|||||||
msgid "URL must use one of the following protocols:"
|
msgid "URL must use one of the following protocols:"
|
||||||
msgstr ""
|
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"
|
msgid "URLTest"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:134
|
||||||
msgid "URLTest Check Interval"
|
msgid "URLTest Check Interval"
|
||||||
msgstr ""
|
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"
|
msgid "URLTest Proxy Links"
|
||||||
msgstr ""
|
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"
|
msgid "URLTest Testing URL"
|
||||||
msgstr ""
|
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"
|
msgid "URLTest Tolerance"
|
||||||
msgstr ""
|
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"
|
msgid "User Domain List Type"
|
||||||
msgstr ""
|
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"
|
msgid "User Domains"
|
||||||
msgstr ""
|
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"
|
msgid "User Domains List"
|
||||||
msgstr ""
|
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"
|
msgid "User Subnet List Type"
|
||||||
msgstr ""
|
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"
|
msgid "User Subnets"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:481
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:505
|
||||||
msgid "User Subnets List"
|
msgid "User Subnets List"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1041,7 +1065,7 @@ msgstr ""
|
|||||||
#: src/validators/validateDns.ts:18
|
#: src/validators/validateDns.ts:18
|
||||||
#: src/validators/validateDomain.ts:13
|
#: src/validators/validateDomain.ts:13
|
||||||
#: src/validators/validateDomain.ts:30
|
#: src/validators/validateDomain.ts:30
|
||||||
#: src/validators/validateHysteriaUrl.ts:111
|
#: src/validators/validateHysteriaUrl.ts:120
|
||||||
#: src/validators/validateIp.ts:8
|
#: src/validators/validateIp.ts:8
|
||||||
#: src/validators/validateOutboundJson.ts:7
|
#: src/validators/validateOutboundJson.ts:7
|
||||||
#: src/validators/validatePath.ts:16
|
#: src/validators/validatePath.ts:16
|
||||||
@@ -1054,8 +1078,8 @@ msgstr ""
|
|||||||
msgid "Valid"
|
msgid "Valid"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:434
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:458
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:513
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:537
|
||||||
msgid "Validation errors:"
|
msgid "Validation errors:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1068,11 +1092,17 @@ msgstr ""
|
|||||||
msgid "Visit Wiki"
|
msgid "Visit Wiki"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:311
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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."
|
msgid "Warning: %s cannot be used together with %s. Previous selections have been removed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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."
|
msgid "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
# RU translations for PODKOP package.
|
# 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.
|
# This file is distributed under the same license as the PODKOP package.
|
||||||
# divocat, 2025.
|
# divocatt, 2026.
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PODKOP\n"
|
"Project-Id-Version: PODKOP\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2025-12-01 16:30+0200\n"
|
"POT-Creation-Date: 2026-05-29 16:40+0300\n"
|
||||||
"PO-Revision-Date: 2025-12-01 16:30+0200\n"
|
"PO-Revision-Date: 2026-05-29 16:40+0300\n"
|
||||||
"Last-Translator: divocat\n"
|
"Last-Translator: divocatt\n"
|
||||||
"Language-Team: none\n"
|
"Language-Team: none\n"
|
||||||
"Language: ru\n"
|
"Language: ru\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
@@ -197,6 +197,9 @@ msgstr "Включить автостарт"
|
|||||||
msgid "Enable built-in DNS resolver for domains handled by this section"
|
msgid "Enable built-in DNS resolver for domains handled by this section"
|
||||||
msgstr "Включить встроенный DNS-резолвер для доменов, обрабатываемых в этом разделе"
|
msgstr "Включить встроенный DNS-резолвер для доменов, обрабатываемых в этом разделе"
|
||||||
|
|
||||||
|
msgid "Enable DNS resolve to get real IP when routing"
|
||||||
|
msgstr "Разрешать домены в реальные IP-адреса перед маршрутизацией в outbound"
|
||||||
|
|
||||||
msgid "Enable Mixed Proxy"
|
msgid "Enable Mixed Proxy"
|
||||||
msgstr "Включить смешанный прокси"
|
msgstr "Включить смешанный прокси"
|
||||||
|
|
||||||
@@ -419,6 +422,9 @@ msgstr "Локальные списки доменов"
|
|||||||
msgid "Local Subnet Lists"
|
msgid "Local Subnet Lists"
|
||||||
msgstr "Локальные списки подсетей"
|
msgstr "Локальные списки подсетей"
|
||||||
|
|
||||||
|
msgid "Log Level"
|
||||||
|
msgstr "Уровень логов"
|
||||||
|
|
||||||
msgid "Main DNS"
|
msgid "Main DNS"
|
||||||
msgstr "Основной DNS"
|
msgstr "Основной DNS"
|
||||||
|
|
||||||
@@ -506,6 +512,9 @@ msgstr "Внешние списки доменов"
|
|||||||
msgid "Remote Subnet Lists"
|
msgid "Remote Subnet Lists"
|
||||||
msgstr "Внешние списки подсетей"
|
msgstr "Внешние списки подсетей"
|
||||||
|
|
||||||
|
msgid "Resolve real IP for routing"
|
||||||
|
msgstr "Разрешение реальных IP-адресов"
|
||||||
|
|
||||||
msgid "Restart podkop"
|
msgid "Restart podkop"
|
||||||
msgstr "Перезапустить Podkop"
|
msgstr "Перезапустить Podkop"
|
||||||
|
|
||||||
@@ -584,6 +593,9 @@ msgstr "Выберите тип списка для добавления пол
|
|||||||
msgid "Select the list type for adding custom subnets"
|
msgid "Select the list type for adding custom subnets"
|
||||||
msgstr "Выберите тип списка для добавления пользовательских подсетей"
|
msgstr "Выберите тип списка для добавления пользовательских подсетей"
|
||||||
|
|
||||||
|
msgid "Select the log level for sing-box"
|
||||||
|
msgstr "Выберите уровень логов для sing-box"
|
||||||
|
|
||||||
msgid "Select the network interface from which the traffic will originate"
|
msgid "Select the network interface from which the traffic will originate"
|
||||||
msgstr "Выберите сетевой интерфейс, с которого будет исходить трафик"
|
msgstr "Выберите сетевой интерфейс, с которого будет исходить трафик"
|
||||||
|
|
||||||
@@ -593,6 +605,12 @@ msgstr "Выберите сетевой интерфейс, на который
|
|||||||
msgid "Select the WAN interfaces to be monitored"
|
msgid "Select the WAN interfaces to be monitored"
|
||||||
msgstr "Выберите WAN интерфейсы для мониторинга"
|
msgstr "Выберите WAN интерфейсы для мониторинга"
|
||||||
|
|
||||||
|
msgid "Selector"
|
||||||
|
msgstr "Selector"
|
||||||
|
|
||||||
|
msgid "Selector Proxy Links"
|
||||||
|
msgstr "Ссылки прокси для Selector"
|
||||||
|
|
||||||
msgid "Services info"
|
msgid "Services info"
|
||||||
msgstr "Информация о сервисах"
|
msgstr "Информация о сервисах"
|
||||||
|
|
||||||
@@ -761,6 +779,9 @@ msgstr "Посмотреть логи"
|
|||||||
msgid "Visit Wiki"
|
msgid "Visit Wiki"
|
||||||
msgstr "Перейти в 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."
|
msgid "Warning: %s cannot be used together with %s. Previous selections have been removed."
|
||||||
msgstr "Предупреждение: %s нельзя использовать вместе с %s. Предыдущие варианты были удалены."
|
msgstr "Предупреждение: %s нельзя использовать вместе с %s. Предыдущие варианты были удалены."
|
||||||
|
|
||||||
|
|||||||
@@ -13,11 +13,11 @@
|
|||||||
"test": "vitest",
|
"test": "vitest",
|
||||||
"ci": "yarn format && yarn lint --max-warnings=0 && yarn test --run && yarn build",
|
"ci": "yarn format && yarn lint --max-warnings=0 && yarn test --run && yarn build",
|
||||||
"watch:sftp": "node watch-upload.js",
|
"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-pot": "node generate-pot.js",
|
||||||
"locales:generate-po:ru": "node generate-po.js ru",
|
"locales:generate-po:ru": "node generate-po.js ru",
|
||||||
"locales:distribute": "node distribute-locales.js",
|
"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": {
|
"devDependencies": {
|
||||||
"@babel/parser": "7.28.4",
|
"@babel/parser": "7.28.4",
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ export const ALLOWED_WITH_RUSSIA_INSIDE = [
|
|||||||
'hetzner',
|
'hetzner',
|
||||||
'ovh',
|
'ovh',
|
||||||
'hodca',
|
'hodca',
|
||||||
|
'roblox',
|
||||||
'digitalocean',
|
'digitalocean',
|
||||||
'cloudfront',
|
'cloudfront',
|
||||||
];
|
];
|
||||||
@@ -50,6 +51,7 @@ export const DOMAIN_LIST_OPTIONS = {
|
|||||||
google_ai: 'Google AI',
|
google_ai: 'Google AI',
|
||||||
google_play: 'Google Play',
|
google_play: 'Google Play',
|
||||||
hodca: 'H.O.D.C.A',
|
hodca: 'H.O.D.C.A',
|
||||||
|
roblox: 'Roblox',
|
||||||
hetzner: 'Hetzner ASN',
|
hetzner: 'Hetzner ASN',
|
||||||
ovh: 'OVH ASN',
|
ovh: 'OVH ASN',
|
||||||
digitalocean: 'Digital Ocean ASN',
|
digitalocean: 'Digital Ocean ASN',
|
||||||
|
|||||||
3
fe-app-podkop/src/helpers/removeVersionPrefix.ts
Normal file
3
fe-app-podkop/src/helpers/removeVersionPrefix.ts
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
export function removeVersionPrefix(version: string) {
|
||||||
|
return version.replace(/^v/, '');
|
||||||
|
}
|
||||||
@@ -29,7 +29,9 @@ export async function getDashboardSections(): Promise<IGetDashboardSectionsRespo
|
|||||||
const data = configSections
|
const data = configSections
|
||||||
.filter(
|
.filter(
|
||||||
(section) =>
|
(section) =>
|
||||||
section.connection_type !== 'block' && section['.type'] !== 'settings',
|
section.connection_type !== 'block' &&
|
||||||
|
section.connection_type !== 'exclusion' &&
|
||||||
|
section['.type'] !== 'settings',
|
||||||
)
|
)
|
||||||
.map((section) => {
|
.map((section) => {
|
||||||
if (section.connection_type === 'proxy') {
|
if (section.connection_type === 'proxy') {
|
||||||
@@ -86,6 +88,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') {
|
if (section.proxy_config_type === 'urltest') {
|
||||||
const selector = proxies.find(
|
const selector = proxies.find(
|
||||||
(proxy) => proxy.code === `${section['.name']}-out`,
|
(proxy) => proxy.code === `${section['.name']}-out`,
|
||||||
|
|||||||
@@ -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',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -6,7 +6,6 @@ import { runFakeIPCheck } from './checks/runFakeIPCheck';
|
|||||||
import { loadingDiagnosticsChecksStore } from './diagnostic.store';
|
import { loadingDiagnosticsChecksStore } from './diagnostic.store';
|
||||||
import { logger, store, StoreType } from '../../services';
|
import { logger, store, StoreType } from '../../services';
|
||||||
import {
|
import {
|
||||||
IRenderSystemInfoRow,
|
|
||||||
renderAvailableActions,
|
renderAvailableActions,
|
||||||
renderCheckSection,
|
renderCheckSection,
|
||||||
renderRunAction,
|
renderRunAction,
|
||||||
@@ -20,6 +19,7 @@ import { PODKOP_LUCI_APP_VERSION } from '../../../constants';
|
|||||||
import { showToast } from '../../../helpers/showToast';
|
import { showToast } from '../../../helpers/showToast';
|
||||||
import { renderWikiDisclaimer } from './partials/renderWikiDisclaimer';
|
import { renderWikiDisclaimer } from './partials/renderWikiDisclaimer';
|
||||||
import { runSectionsCheck } from './checks/runSectionsCheck';
|
import { runSectionsCheck } from './checks/runSectionsCheck';
|
||||||
|
import { getPodkopVersionRow } from './helpers/getPodkopVersionRow';
|
||||||
|
|
||||||
async function fetchSystemInfo() {
|
async function fetchSystemInfo() {
|
||||||
const systemInfo = await PodkopShellMethods.getSystemInfo();
|
const systemInfo = await PodkopShellMethods.getSystemInfo();
|
||||||
@@ -288,7 +288,10 @@ async function handleShowSingBoxConfig() {
|
|||||||
if (showSingBoxConfig.success) {
|
if (showSingBoxConfig.success) {
|
||||||
ui.showModal(
|
ui.showModal(
|
||||||
_('Show sing-box config'),
|
_('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 {
|
} else {
|
||||||
logger.error(
|
logger.error(
|
||||||
@@ -412,53 +415,9 @@ function renderDiagnosticSystemInfoWidget() {
|
|||||||
|
|
||||||
const container = document.getElementById('pdk_diagnostic-page-system-info');
|
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({
|
const renderedSystemInfo = renderSystemInfo({
|
||||||
items: [
|
items: [
|
||||||
getPodkopVersionRow(),
|
getPodkopVersionRow(diagnosticsSystemInfo),
|
||||||
{
|
{
|
||||||
key: 'Luci App',
|
key: 'Luci App',
|
||||||
value: normalizeCompiledVersion(PODKOP_LUCI_APP_VERSION),
|
value: normalizeCompiledVersion(PODKOP_LUCI_APP_VERSION),
|
||||||
|
|||||||
@@ -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',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -95,6 +95,12 @@ export namespace Podkop {
|
|||||||
urltest_proxy_links: string[];
|
urltest_proxy_links: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ConfigProxySelectorSection {
|
||||||
|
connection_type: 'proxy';
|
||||||
|
proxy_config_type: 'selector';
|
||||||
|
selector_proxy_links: string[];
|
||||||
|
}
|
||||||
|
|
||||||
export interface ConfigProxyUrlSection {
|
export interface ConfigProxyUrlSection {
|
||||||
connection_type: 'proxy';
|
connection_type: 'proxy';
|
||||||
proxy_config_type: 'url';
|
proxy_config_type: 'url';
|
||||||
@@ -116,12 +122,18 @@ export namespace Podkop {
|
|||||||
connection_type: 'block';
|
connection_type: 'block';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ConfigExclusionSection {
|
||||||
|
connection_type: 'exclusion';
|
||||||
|
}
|
||||||
|
|
||||||
export type ConfigBaseSection =
|
export type ConfigBaseSection =
|
||||||
| ConfigProxyUrlTestSection
|
| ConfigProxyUrlTestSection
|
||||||
|
| ConfigProxySelectorSection
|
||||||
| ConfigProxyUrlSection
|
| ConfigProxyUrlSection
|
||||||
| ConfigProxyOutboundSection
|
| ConfigProxyOutboundSection
|
||||||
| ConfigVpnSection
|
| ConfigVpnSection
|
||||||
| ConfigBlockSection;
|
| ConfigBlockSection
|
||||||
|
| ConfigExclusionSection;
|
||||||
|
|
||||||
export type ConfigSection = ConfigBaseSection & {
|
export type ConfigSection = ConfigBaseSection & {
|
||||||
'.name': string;
|
'.name': string;
|
||||||
|
|||||||
@@ -28,6 +28,11 @@ const validUrls = [
|
|||||||
|
|
||||||
// Explicit obfs=none (valid)
|
// Explicit obfs=none (valid)
|
||||||
['obfs none = ok', 'hysteria2://pw@example.com:443/?obfs=none#hy2-none'],
|
['obfs none = ok', 'hysteria2://pw@example.com:443/?obfs=none#hy2-none'],
|
||||||
|
|
||||||
|
[
|
||||||
|
'port range 5000-6000',
|
||||||
|
'hysteria2://letmein@example.com:123,5000-6000/?insecure=1&obfs=salamander&obfs-password=gawrgura&pinSHA256=deadbeef&sni=real.example.com',
|
||||||
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
const invalidUrls = [
|
const invalidUrls = [
|
||||||
|
|||||||
@@ -6,19 +6,17 @@ export function validateHysteria2Url(url: string): ValidationResult {
|
|||||||
const isHY2 = url.startsWith('hysteria2://');
|
const isHY2 = url.startsWith('hysteria2://');
|
||||||
const isHY2Short = url.startsWith('hy2://');
|
const isHY2Short = url.startsWith('hy2://');
|
||||||
|
|
||||||
if (!isHY2 && !isHY2Short) {
|
if (!isHY2 && !isHY2Short)
|
||||||
return {
|
return {
|
||||||
valid: false,
|
valid: false,
|
||||||
message: _('Invalid HY2 URL: must start with hysteria2:// or hy2://'),
|
message: _('Invalid HY2 URL: must start with hysteria2:// or hy2://'),
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
if (/\s/.test(url)) {
|
if (/\s/.test(url))
|
||||||
return {
|
return {
|
||||||
valid: false,
|
valid: false,
|
||||||
message: _('Invalid HY2 URL: must not contain spaces'),
|
message: _('Invalid HY2 URL: must not contain spaces'),
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
const prefix = isHY2 ? 'hysteria2://' : 'hy2://';
|
const prefix = isHY2 ? 'hysteria2://' : 'hy2://';
|
||||||
const body = url.slice(prefix.length);
|
const body = url.slice(prefix.length);
|
||||||
@@ -45,23 +43,39 @@ export function validateHysteria2Url(url: string): ValidationResult {
|
|||||||
|
|
||||||
const [host, port] = hostPortPart.split(':');
|
const [host, port] = hostPortPart.split(':');
|
||||||
|
|
||||||
if (!host) {
|
if (!host)
|
||||||
return { valid: false, message: _('Invalid HY2 URL: missing host') };
|
return { valid: false, message: _('Invalid HY2 URL: missing host') };
|
||||||
}
|
|
||||||
|
|
||||||
if (!port) {
|
if (!port)
|
||||||
return { valid: false, message: _('Invalid HY2 URL: missing port') };
|
return { valid: false, message: _('Invalid HY2 URL: missing port') };
|
||||||
}
|
|
||||||
|
|
||||||
const cleanedPort = port.replace('/', '');
|
const cleanedPort = port.replace('/', '');
|
||||||
const portNum = Number(cleanedPort);
|
const portEntries = cleanedPort.split(',');
|
||||||
|
|
||||||
if (!Number.isInteger(portNum) || portNum < 1 || portNum > 65535) {
|
const isValidPortNumber = (value: string) => {
|
||||||
|
if (!/^\d+$/.test(value)) return false;
|
||||||
|
const num = Number(value);
|
||||||
|
return num >= 1 && num <= 65535;
|
||||||
|
};
|
||||||
|
|
||||||
|
const isValidPortEntry = (entry: string) => {
|
||||||
|
if (!entry) return false;
|
||||||
|
if (!entry.includes('-')) return isValidPortNumber(entry);
|
||||||
|
|
||||||
|
const rangeParts = entry.split('-');
|
||||||
|
if (rangeParts.length !== 2) return false;
|
||||||
|
|
||||||
|
const [start, end] = rangeParts;
|
||||||
|
if (!isValidPortNumber(start) || !isValidPortNumber(end)) return false;
|
||||||
|
|
||||||
|
return Number(start) <= Number(end);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!portEntries.every(isValidPortEntry))
|
||||||
return {
|
return {
|
||||||
valid: false,
|
valid: false,
|
||||||
message: _('Invalid HY2 URL: invalid port number'),
|
message: _('Invalid HY2 URL: invalid port number'),
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
if (queryString) {
|
if (queryString) {
|
||||||
const params = parseQueryString(queryString);
|
const params = parseQueryString(queryString);
|
||||||
@@ -70,44 +84,37 @@ export function validateHysteria2Url(url: string): ValidationResult {
|
|||||||
if (
|
if (
|
||||||
paramsKeys.includes('insecure') &&
|
paramsKeys.includes('insecure') &&
|
||||||
!['0', '1'].includes(params.insecure)
|
!['0', '1'].includes(params.insecure)
|
||||||
) {
|
)
|
||||||
return {
|
return {
|
||||||
valid: false,
|
valid: false,
|
||||||
message: _('Invalid HY2 URL: insecure must be 0 or 1'),
|
message: _('Invalid HY2 URL: insecure must be 0 or 1'),
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
const validObfsTypes = ['none', 'salamander'];
|
const validObfsTypes = ['none', 'salamander'];
|
||||||
|
|
||||||
if (
|
if (paramsKeys.includes('obfs') && !validObfsTypes.includes(params.obfs))
|
||||||
paramsKeys.includes('obfs') &&
|
|
||||||
!validObfsTypes.includes(params.obfs)
|
|
||||||
) {
|
|
||||||
return {
|
return {
|
||||||
valid: false,
|
valid: false,
|
||||||
message: _('Invalid HY2 URL: unsupported obfs type'),
|
message: _('Invalid HY2 URL: unsupported obfs type'),
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
if (
|
||||||
paramsKeys.includes('obfs') &&
|
paramsKeys.includes('obfs') &&
|
||||||
params.obfs !== 'none' &&
|
params.obfs !== 'none' &&
|
||||||
!params['obfs-password']
|
!params['obfs-password']
|
||||||
) {
|
)
|
||||||
return {
|
return {
|
||||||
valid: false,
|
valid: false,
|
||||||
message: _(
|
message: _(
|
||||||
'Invalid HY2 URL: obfs-password required when obfs is set',
|
'Invalid HY2 URL: obfs-password required when obfs is set',
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
if (paramsKeys.includes('sni') && !params.sni) {
|
if (paramsKeys.includes('sni') && !params.sni)
|
||||||
return {
|
return {
|
||||||
valid: false,
|
valid: false,
|
||||||
message: _('Invalid HY2 URL: sni cannot be empty'),
|
message: _('Invalid HY2 URL: sni cannot be empty'),
|
||||||
};
|
};
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return { valid: true, message: _('Valid') };
|
return { valid: true, message: _('Valid') };
|
||||||
|
|||||||
@@ -453,18 +453,16 @@ function validateHysteria2Url(url) {
|
|||||||
try {
|
try {
|
||||||
const isHY2 = url.startsWith("hysteria2://");
|
const isHY2 = url.startsWith("hysteria2://");
|
||||||
const isHY2Short = url.startsWith("hy2://");
|
const isHY2Short = url.startsWith("hy2://");
|
||||||
if (!isHY2 && !isHY2Short) {
|
if (!isHY2 && !isHY2Short)
|
||||||
return {
|
return {
|
||||||
valid: false,
|
valid: false,
|
||||||
message: _("Invalid HY2 URL: must start with hysteria2:// or hy2://")
|
message: _("Invalid HY2 URL: must start with hysteria2:// or hy2://")
|
||||||
};
|
};
|
||||||
}
|
if (/\s/.test(url))
|
||||||
if (/\s/.test(url)) {
|
|
||||||
return {
|
return {
|
||||||
valid: false,
|
valid: false,
|
||||||
message: _("Invalid HY2 URL: must not contain spaces")
|
message: _("Invalid HY2 URL: must not contain spaces")
|
||||||
};
|
};
|
||||||
}
|
|
||||||
const prefix = isHY2 ? "hysteria2://" : "hy2://";
|
const prefix = isHY2 ? "hysteria2://" : "hy2://";
|
||||||
const body = url.slice(prefix.length);
|
const body = url.slice(prefix.length);
|
||||||
const [mainPart] = body.split("#");
|
const [mainPart] = body.split("#");
|
||||||
@@ -483,50 +481,57 @@ function validateHysteria2Url(url) {
|
|||||||
message: _("Invalid HY2 URL: missing host & port")
|
message: _("Invalid HY2 URL: missing host & port")
|
||||||
};
|
};
|
||||||
const [host, port] = hostPortPart.split(":");
|
const [host, port] = hostPortPart.split(":");
|
||||||
if (!host) {
|
if (!host)
|
||||||
return { valid: false, message: _("Invalid HY2 URL: missing host") };
|
return { valid: false, message: _("Invalid HY2 URL: missing host") };
|
||||||
}
|
if (!port)
|
||||||
if (!port) {
|
|
||||||
return { valid: false, message: _("Invalid HY2 URL: missing port") };
|
return { valid: false, message: _("Invalid HY2 URL: missing port") };
|
||||||
}
|
|
||||||
const cleanedPort = port.replace("/", "");
|
const cleanedPort = port.replace("/", "");
|
||||||
const portNum = Number(cleanedPort);
|
const portEntries = cleanedPort.split(",");
|
||||||
if (!Number.isInteger(portNum) || portNum < 1 || portNum > 65535) {
|
const isValidPortNumber = (value) => {
|
||||||
|
if (!/^\d+$/.test(value)) return false;
|
||||||
|
const num = Number(value);
|
||||||
|
return num >= 1 && num <= 65535;
|
||||||
|
};
|
||||||
|
const isValidPortEntry = (entry) => {
|
||||||
|
if (!entry) return false;
|
||||||
|
if (!entry.includes("-")) return isValidPortNumber(entry);
|
||||||
|
const rangeParts = entry.split("-");
|
||||||
|
if (rangeParts.length !== 2) return false;
|
||||||
|
const [start, end] = rangeParts;
|
||||||
|
if (!isValidPortNumber(start) || !isValidPortNumber(end)) return false;
|
||||||
|
return Number(start) <= Number(end);
|
||||||
|
};
|
||||||
|
if (!portEntries.every(isValidPortEntry))
|
||||||
return {
|
return {
|
||||||
valid: false,
|
valid: false,
|
||||||
message: _("Invalid HY2 URL: invalid port number")
|
message: _("Invalid HY2 URL: invalid port number")
|
||||||
};
|
};
|
||||||
}
|
|
||||||
if (queryString) {
|
if (queryString) {
|
||||||
const params = parseQueryString(queryString);
|
const params = parseQueryString(queryString);
|
||||||
const paramsKeys = Object.keys(params);
|
const paramsKeys = Object.keys(params);
|
||||||
if (paramsKeys.includes("insecure") && !["0", "1"].includes(params.insecure)) {
|
if (paramsKeys.includes("insecure") && !["0", "1"].includes(params.insecure))
|
||||||
return {
|
return {
|
||||||
valid: false,
|
valid: false,
|
||||||
message: _("Invalid HY2 URL: insecure must be 0 or 1")
|
message: _("Invalid HY2 URL: insecure must be 0 or 1")
|
||||||
};
|
};
|
||||||
}
|
|
||||||
const validObfsTypes = ["none", "salamander"];
|
const validObfsTypes = ["none", "salamander"];
|
||||||
if (paramsKeys.includes("obfs") && !validObfsTypes.includes(params.obfs)) {
|
if (paramsKeys.includes("obfs") && !validObfsTypes.includes(params.obfs))
|
||||||
return {
|
return {
|
||||||
valid: false,
|
valid: false,
|
||||||
message: _("Invalid HY2 URL: unsupported obfs type")
|
message: _("Invalid HY2 URL: unsupported obfs type")
|
||||||
};
|
};
|
||||||
}
|
if (paramsKeys.includes("obfs") && params.obfs !== "none" && !params["obfs-password"])
|
||||||
if (paramsKeys.includes("obfs") && params.obfs !== "none" && !params["obfs-password"]) {
|
|
||||||
return {
|
return {
|
||||||
valid: false,
|
valid: false,
|
||||||
message: _(
|
message: _(
|
||||||
"Invalid HY2 URL: obfs-password required when obfs is set"
|
"Invalid HY2 URL: obfs-password required when obfs is set"
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
}
|
if (paramsKeys.includes("sni") && !params.sni)
|
||||||
if (paramsKeys.includes("sni") && !params.sni) {
|
|
||||||
return {
|
return {
|
||||||
valid: false,
|
valid: false,
|
||||||
message: _("Invalid HY2 URL: sni cannot be empty")
|
message: _("Invalid HY2 URL: sni cannot be empty")
|
||||||
};
|
};
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return { valid: true, message: _("Valid") };
|
return { valid: true, message: _("Valid") };
|
||||||
} catch (_e) {
|
} catch (_e) {
|
||||||
@@ -711,7 +716,7 @@ async function getDashboardSections() {
|
|||||||
})
|
})
|
||||||
);
|
);
|
||||||
const data = configSections.filter(
|
const data = configSections.filter(
|
||||||
(section) => section.connection_type !== "block" && section[".type"] !== "settings"
|
(section) => section.connection_type !== "block" && section.connection_type !== "exclusion" && section[".type"] !== "settings"
|
||||||
).map((section) => {
|
).map((section) => {
|
||||||
if (section.connection_type === "proxy") {
|
if (section.connection_type === "proxy") {
|
||||||
if (section.proxy_config_type === "url") {
|
if (section.proxy_config_type === "url") {
|
||||||
@@ -757,6 +762,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") {
|
if (section.proxy_config_type === "urltest") {
|
||||||
const selector = proxies.find(
|
const selector = proxies.find(
|
||||||
(proxy) => proxy.code === `${section[".name"]}-out`
|
(proxy) => proxy.code === `${section[".name"]}-out`
|
||||||
@@ -860,6 +889,7 @@ var ALLOWED_WITH_RUSSIA_INSIDE = [
|
|||||||
"hetzner",
|
"hetzner",
|
||||||
"ovh",
|
"ovh",
|
||||||
"hodca",
|
"hodca",
|
||||||
|
"roblox",
|
||||||
"digitalocean",
|
"digitalocean",
|
||||||
"cloudfront"
|
"cloudfront"
|
||||||
];
|
];
|
||||||
@@ -883,6 +913,7 @@ var DOMAIN_LIST_OPTIONS = {
|
|||||||
google_ai: "Google AI",
|
google_ai: "Google AI",
|
||||||
google_play: "Google Play",
|
google_play: "Google Play",
|
||||||
hodca: "H.O.D.C.A",
|
hodca: "H.O.D.C.A",
|
||||||
|
roblox: "Roblox",
|
||||||
hetzner: "Hetzner ASN",
|
hetzner: "Hetzner ASN",
|
||||||
ovh: "OVH ASN",
|
ovh: "OVH ASN",
|
||||||
digitalocean: "Digital Ocean ASN",
|
digitalocean: "Digital Ocean ASN",
|
||||||
@@ -3899,6 +3930,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
|
// src/podkop/tabs/diagnostic/initController.ts
|
||||||
async function fetchSystemInfo() {
|
async function fetchSystemInfo() {
|
||||||
const systemInfo = await PodkopShellMethods.getSystemInfo();
|
const systemInfo = await PodkopShellMethods.getSystemInfo();
|
||||||
@@ -4138,7 +4212,10 @@ async function handleShowSingBoxConfig() {
|
|||||||
if (showSingBoxConfig.success) {
|
if (showSingBoxConfig.success) {
|
||||||
ui.showModal(
|
ui.showModal(
|
||||||
_("Show sing-box config"),
|
_("Show sing-box config"),
|
||||||
renderModal(showSingBoxConfig.data, "show_sing_box_config")
|
renderModal(
|
||||||
|
JSON.stringify(showSingBoxConfig.data, null, 2),
|
||||||
|
"show_sing_box_config"
|
||||||
|
)
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
logger.error(
|
logger.error(
|
||||||
@@ -4243,47 +4320,9 @@ function renderDiagnosticSystemInfoWidget() {
|
|||||||
logger.debug("[DIAGNOSTIC]", "renderDiagnosticSystemInfoWidget");
|
logger.debug("[DIAGNOSTIC]", "renderDiagnosticSystemInfoWidget");
|
||||||
const diagnosticsSystemInfo = store.get().diagnosticsSystemInfo;
|
const diagnosticsSystemInfo = store.get().diagnosticsSystemInfo;
|
||||||
const container = document.getElementById("pdk_diagnostic-page-system-info");
|
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({
|
const renderedSystemInfo = renderSystemInfo({
|
||||||
items: [
|
items: [
|
||||||
getPodkopVersionRow(),
|
getPodkopVersionRow(diagnosticsSystemInfo),
|
||||||
{
|
{
|
||||||
key: "Luci App",
|
key: "Luci App",
|
||||||
value: normalizeCompiledVersion(PODKOP_LUCI_APP_VERSION)
|
value: normalizeCompiledVersion(PODKOP_LUCI_APP_VERSION)
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ function createSectionContent(section) {
|
|||||||
o.value("proxy", "Proxy");
|
o.value("proxy", "Proxy");
|
||||||
o.value("vpn", "VPN");
|
o.value("vpn", "VPN");
|
||||||
o.value("block", "Block");
|
o.value("block", "Block");
|
||||||
|
o.value("exclusion", "Exclusion");
|
||||||
|
|
||||||
o = section.option(
|
o = section.option(
|
||||||
form.ListValue,
|
form.ListValue,
|
||||||
@@ -23,8 +24,9 @@ function createSectionContent(section) {
|
|||||||
_("Select how to configure the proxy"),
|
_("Select how to configure the proxy"),
|
||||||
);
|
);
|
||||||
o.value("url", _("Connection URL"));
|
o.value("url", _("Connection URL"));
|
||||||
o.value("outbound", _("Outbound Config"));
|
o.value("selector", _("Selector"));
|
||||||
o.value("urltest", _("URLTest"));
|
o.value("urltest", _("URLTest"));
|
||||||
|
o.value("outbound", _("Outbound Config"));
|
||||||
o.default = "url";
|
o.default = "url";
|
||||||
o.depends("connection_type", "proxy");
|
o.depends("connection_type", "proxy");
|
||||||
|
|
||||||
@@ -32,7 +34,7 @@ function createSectionContent(section) {
|
|||||||
form.TextValue,
|
form.TextValue,
|
||||||
"proxy_string",
|
"proxy_string",
|
||||||
_("Proxy Configuration URL"),
|
_("Proxy Configuration URL"),
|
||||||
"",
|
_("vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links")
|
||||||
);
|
);
|
||||||
o.depends("proxy_config_type", "url");
|
o.depends("proxy_config_type", "url");
|
||||||
o.rows = 5;
|
o.rows = 5;
|
||||||
@@ -42,7 +44,6 @@ function createSectionContent(section) {
|
|||||||
o.textarea = true;
|
o.textarea = true;
|
||||||
o.rmempty = false;
|
o.rmempty = false;
|
||||||
o.sectionDescriptions = new Map();
|
o.sectionDescriptions = new Map();
|
||||||
o.placeholder = "vless://uuid@server:port?type=tcp&security=tls#main";
|
|
||||||
o.validate = function (section_id, value) {
|
o.validate = function (section_id, value) {
|
||||||
// Optional
|
// Optional
|
||||||
if (!value || value.length === 0) {
|
if (!value || value.length === 0) {
|
||||||
@@ -81,13 +82,36 @@ function createSectionContent(section) {
|
|||||||
return validation.message;
|
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(
|
o = section.option(
|
||||||
form.DynamicList,
|
form.DynamicList,
|
||||||
"urltest_proxy_links",
|
"urltest_proxy_links",
|
||||||
_("URLTest Proxy Links"),
|
_("URLTest Proxy Links"),
|
||||||
|
_("vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links")
|
||||||
);
|
);
|
||||||
o.depends("proxy_config_type", "urltest");
|
o.depends("proxy_config_type", "urltest");
|
||||||
o.placeholder = "vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links";
|
|
||||||
o.rmempty = false;
|
o.rmempty = false;
|
||||||
o.validate = function (section_id, value) {
|
o.validate = function (section_id, value) {
|
||||||
// Optional
|
// Optional
|
||||||
@@ -618,6 +642,8 @@ function createSectionContent(section) {
|
|||||||
);
|
);
|
||||||
o.placeholder = "192.168.1.2 or 192.168.1.0/24";
|
o.placeholder = "192.168.1.2 or 192.168.1.0/24";
|
||||||
o.rmempty = true;
|
o.rmempty = true;
|
||||||
|
o.depends("connection_type", "proxy");
|
||||||
|
o.depends("connection_type", "vpn");
|
||||||
o.validate = function (section_id, value) {
|
o.validate = function (section_id, value) {
|
||||||
// Optional
|
// Optional
|
||||||
if (!value || value.length === 0) {
|
if (!value || value.length === 0) {
|
||||||
@@ -643,6 +669,8 @@ function createSectionContent(section) {
|
|||||||
);
|
);
|
||||||
o.default = "0";
|
o.default = "0";
|
||||||
o.rmempty = false;
|
o.rmempty = false;
|
||||||
|
o.depends("connection_type", "proxy");
|
||||||
|
o.depends("connection_type", "vpn");
|
||||||
|
|
||||||
o = section.option(
|
o = section.option(
|
||||||
form.Value,
|
form.Value,
|
||||||
@@ -655,6 +683,17 @@ function createSectionContent(section) {
|
|||||||
);
|
);
|
||||||
o.rmempty = false;
|
o.rmempty = false;
|
||||||
o.depends("mixed_proxy_enabled", "1");
|
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 = {
|
const EntryPoint = {
|
||||||
|
|||||||
@@ -311,7 +311,7 @@ function createSettingsContent(section) {
|
|||||||
|
|
||||||
for (const secName in sections) {
|
for (const secName in sections) {
|
||||||
const sec = sections[secName];
|
const sec = sections[secName];
|
||||||
if (sec[".type"] === "section") {
|
if (sec[".type"] === "section" && sec['connection_type'] !== 'block' && sec['connection_type'] !== 'exclusion') {
|
||||||
this.keylist.push(secName);
|
this.keylist.push(secName);
|
||||||
this.vallist.push(secName);
|
this.vallist.push(secName);
|
||||||
}
|
}
|
||||||
@@ -378,6 +378,24 @@ function createSettingsContent(section) {
|
|||||||
return true;
|
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(
|
o = section.option(
|
||||||
form.Flag,
|
form.Flag,
|
||||||
"exclude_ntp",
|
"exclude_ntp",
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
# RU translations for PODKOP package.
|
# 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.
|
# This file is distributed under the same license as the PODKOP package.
|
||||||
# divocat, 2025.
|
# divocatt, 2026.
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PODKOP\n"
|
"Project-Id-Version: PODKOP\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2025-12-01 16:30+0200\n"
|
"POT-Creation-Date: 2026-05-29 16:40+0300\n"
|
||||||
"PO-Revision-Date: 2025-12-01 16:30+0200\n"
|
"PO-Revision-Date: 2026-05-29 16:40+0300\n"
|
||||||
"Last-Translator: divocat\n"
|
"Last-Translator: divocatt\n"
|
||||||
"Language-Team: none\n"
|
"Language-Team: none\n"
|
||||||
"Language: ru\n"
|
"Language: ru\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
@@ -197,6 +197,9 @@ msgstr "Включить автостарт"
|
|||||||
msgid "Enable built-in DNS resolver for domains handled by this section"
|
msgid "Enable built-in DNS resolver for domains handled by this section"
|
||||||
msgstr "Включить встроенный DNS-резолвер для доменов, обрабатываемых в этом разделе"
|
msgstr "Включить встроенный DNS-резолвер для доменов, обрабатываемых в этом разделе"
|
||||||
|
|
||||||
|
msgid "Enable DNS resolve to get real IP when routing"
|
||||||
|
msgstr "Разрешать домены в реальные IP-адреса перед маршрутизацией в outbound"
|
||||||
|
|
||||||
msgid "Enable Mixed Proxy"
|
msgid "Enable Mixed Proxy"
|
||||||
msgstr "Включить смешанный прокси"
|
msgstr "Включить смешанный прокси"
|
||||||
|
|
||||||
@@ -419,6 +422,9 @@ msgstr "Локальные списки доменов"
|
|||||||
msgid "Local Subnet Lists"
|
msgid "Local Subnet Lists"
|
||||||
msgstr "Локальные списки подсетей"
|
msgstr "Локальные списки подсетей"
|
||||||
|
|
||||||
|
msgid "Log Level"
|
||||||
|
msgstr "Уровень логов"
|
||||||
|
|
||||||
msgid "Main DNS"
|
msgid "Main DNS"
|
||||||
msgstr "Основной DNS"
|
msgstr "Основной DNS"
|
||||||
|
|
||||||
@@ -506,6 +512,9 @@ msgstr "Внешние списки доменов"
|
|||||||
msgid "Remote Subnet Lists"
|
msgid "Remote Subnet Lists"
|
||||||
msgstr "Внешние списки подсетей"
|
msgstr "Внешние списки подсетей"
|
||||||
|
|
||||||
|
msgid "Resolve real IP for routing"
|
||||||
|
msgstr "Разрешение реальных IP-адресов"
|
||||||
|
|
||||||
msgid "Restart podkop"
|
msgid "Restart podkop"
|
||||||
msgstr "Перезапустить Podkop"
|
msgstr "Перезапустить Podkop"
|
||||||
|
|
||||||
@@ -584,6 +593,9 @@ msgstr "Выберите тип списка для добавления пол
|
|||||||
msgid "Select the list type for adding custom subnets"
|
msgid "Select the list type for adding custom subnets"
|
||||||
msgstr "Выберите тип списка для добавления пользовательских подсетей"
|
msgstr "Выберите тип списка для добавления пользовательских подсетей"
|
||||||
|
|
||||||
|
msgid "Select the log level for sing-box"
|
||||||
|
msgstr "Выберите уровень логов для sing-box"
|
||||||
|
|
||||||
msgid "Select the network interface from which the traffic will originate"
|
msgid "Select the network interface from which the traffic will originate"
|
||||||
msgstr "Выберите сетевой интерфейс, с которого будет исходить трафик"
|
msgstr "Выберите сетевой интерфейс, с которого будет исходить трафик"
|
||||||
|
|
||||||
@@ -593,6 +605,12 @@ msgstr "Выберите сетевой интерфейс, на который
|
|||||||
msgid "Select the WAN interfaces to be monitored"
|
msgid "Select the WAN interfaces to be monitored"
|
||||||
msgstr "Выберите WAN интерфейсы для мониторинга"
|
msgstr "Выберите WAN интерфейсы для мониторинга"
|
||||||
|
|
||||||
|
msgid "Selector"
|
||||||
|
msgstr "Selector"
|
||||||
|
|
||||||
|
msgid "Selector Proxy Links"
|
||||||
|
msgstr "Ссылки прокси для Selector"
|
||||||
|
|
||||||
msgid "Services info"
|
msgid "Services info"
|
||||||
msgstr "Информация о сервисах"
|
msgstr "Информация о сервисах"
|
||||||
|
|
||||||
@@ -761,6 +779,9 @@ msgstr "Посмотреть логи"
|
|||||||
msgid "Visit Wiki"
|
msgid "Visit Wiki"
|
||||||
msgstr "Перейти в 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."
|
msgid "Warning: %s cannot be used together with %s. Previous selections have been removed."
|
||||||
msgstr "Предупреждение: %s нельзя использовать вместе с %s. Предыдущие варианты были удалены."
|
msgstr "Предупреждение: %s нельзя использовать вместе с %s. Предыдущие варианты были удалены."
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
# SOME DESCRIPTIVE TITLE.
|
# 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.
|
# This file is distributed under the same license as the PODKOP package.
|
||||||
# divocat <divocatt@gmail.com>, 2025.
|
# divocatt <210179590+divocatt@users.noreply.github.com>, 2026.
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PODKOP\n"
|
"Project-Id-Version: PODKOP\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2025-12-01 14:30+0200\n"
|
"POT-Creation-Date: 2026-05-29 13:40+0300\n"
|
||||||
"PO-Revision-Date: 2025-12-01 14:30+0200\n"
|
"PO-Revision-Date: 2026-05-29 13:40+0300\n"
|
||||||
"Last-Translator: divocat <divocatt@gmail.com>\n"
|
"Last-Translator: divocatt <210179590+divocatt@users.noreply.github.com>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
"Language: \n"
|
"Language: \n"
|
||||||
"MIME-Version: 1.0\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."
|
msgid "Allows access to YACD from the WAN. Make sure to open the appropriate port in your firewall."
|
||||||
msgstr ""
|
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"
|
msgid "Applicable for SOCKS and Shadowsocks proxy"
|
||||||
msgstr ""
|
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."
|
msgid "At least one valid domain must be specified. Comments-only content is not allowed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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."
|
msgid "At least one valid subnet or IP must be specified. Comments-only content is not allowed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -119,7 +119,7 @@ msgstr ""
|
|||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr ""
|
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"
|
msgid "Community Lists"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -131,7 +131,7 @@ msgstr ""
|
|||||||
msgid "Configuration for Podkop service"
|
msgid "Configuration for Podkop service"
|
||||||
msgstr ""
|
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"
|
msgid "Configuration Type"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -139,7 +139,7 @@ msgstr ""
|
|||||||
msgid "Connection Type"
|
msgid "Connection Type"
|
||||||
msgstr ""
|
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"
|
msgid "Connection URL"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -187,8 +187,8 @@ msgstr ""
|
|||||||
msgid "Disable the QUIC protocol to improve compatibility or fix issues with video streaming"
|
msgid "Disable the QUIC protocol to improve compatibility or fix issues with video streaming"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:366
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:390
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:446
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:470
|
||||||
msgid "Disabled"
|
msgid "Disabled"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -196,17 +196,17 @@ msgstr ""
|
|||||||
msgid "DNS on router"
|
msgid "DNS on router"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:15
|
||||||
msgid "DNS over HTTPS (DoH)"
|
msgid "DNS over HTTPS (DoH)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:16
|
||||||
msgid "DNS over TLS (DoT)"
|
msgid "DNS over TLS (DoT)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:12
|
||||||
msgid "DNS Protocol Type"
|
msgid "DNS Protocol Type"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -215,7 +215,7 @@ msgstr ""
|
|||||||
msgid "DNS Rewrite TTL"
|
msgid "DNS Rewrite TTL"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:24
|
||||||
msgid "DNS Server"
|
msgid "DNS Server"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -228,7 +228,7 @@ msgstr ""
|
|||||||
msgid "Do not panic, everything can be fixed, just..."
|
msgid "Do not panic, everything can be fixed, just..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:230
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:254
|
||||||
msgid "Domain Resolver"
|
msgid "Domain Resolver"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -258,8 +258,8 @@ msgstr ""
|
|||||||
msgid "Downloading all lists via specific Proxy/VPN"
|
msgid "Downloading all lists via specific Proxy/VPN"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:367
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:391
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:447
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:471
|
||||||
msgid "Dynamic List"
|
msgid "Dynamic List"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -267,11 +267,15 @@ msgstr ""
|
|||||||
msgid "Enable autostart"
|
msgid "Enable autostart"
|
||||||
msgstr ""
|
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"
|
msgid "Enable built-in DNS resolver for domains handled by this section"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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"
|
msgid "Enable Mixed Proxy"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -279,7 +283,7 @@ msgstr ""
|
|||||||
msgid "Enable Output Network Interface"
|
msgid "Enable Output Network Interface"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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"
|
msgid "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -291,43 +295,43 @@ msgstr ""
|
|||||||
msgid "Enable YACD WAN Access"
|
msgid "Enable YACD WAN Access"
|
||||||
msgstr ""
|
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"
|
msgid "Enter complete outbound configuration in JSON format"
|
||||||
msgstr ""
|
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 //"
|
msgid "Enter domain names separated by commas, spaces, or newlines. You can add comments using //"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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"
|
msgid "Enter domain names without protocols, e.g. example.com or sub.example.com"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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"
|
msgid "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:114
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:138
|
||||||
msgid "Every 1 minute"
|
msgid "Every 1 minute"
|
||||||
msgstr ""
|
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"
|
msgid "Every 3 minutes"
|
||||||
msgstr ""
|
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"
|
msgid "Every 30 seconds"
|
||||||
msgstr ""
|
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"
|
msgid "Every 5 minutes"
|
||||||
msgstr ""
|
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"
|
msgid "Exclude NTP"
|
||||||
msgstr ""
|
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"
|
msgid "Exclude NTP protocol traffic from the tunnel to prevent it from being routed through the proxy or VPN"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -339,17 +343,17 @@ msgstr ""
|
|||||||
#: src/podkop/tabs/diagnostic/initController.ts:231
|
#: src/podkop/tabs/diagnostic/initController.ts:231
|
||||||
#: src/podkop/tabs/diagnostic/initController.ts:261
|
#: src/podkop/tabs/diagnostic/initController.ts:261
|
||||||
#: src/podkop/tabs/diagnostic/initController.ts:265
|
#: src/podkop/tabs/diagnostic/initController.ts:265
|
||||||
#: src/podkop/tabs/diagnostic/initController.ts:299
|
#: src/podkop/tabs/diagnostic/initController.ts:302
|
||||||
#: src/podkop/tabs/diagnostic/initController.ts:303
|
#: src/podkop/tabs/diagnostic/initController.ts:306
|
||||||
msgid "Failed to execute!"
|
msgid "Failed to execute!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/podkop/methods/custom/getDashboardSections.ts:117
|
#: src/podkop/methods/custom/getDashboardSections.ts:148
|
||||||
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:59
|
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:59
|
||||||
msgid "Fastest"
|
msgid "Fastest"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:614
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:638
|
||||||
msgid "Fully Routed IPs"
|
msgid "Fully Routed IPs"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -390,35 +394,35 @@ msgstr ""
|
|||||||
msgid "Invalid format. Use X.X.X.X or X.X.X.X/Y"
|
msgid "Invalid format. Use X.X.X.X or X.X.X.X/Y"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:76
|
#: src/validators/validateHysteriaUrl.ts:90
|
||||||
msgid "Invalid HY2 URL: insecure must be 0 or 1"
|
msgid "Invalid HY2 URL: insecure must be 0 or 1"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:62
|
#: src/validators/validateHysteriaUrl.ts:77
|
||||||
msgid "Invalid HY2 URL: invalid port number"
|
msgid "Invalid HY2 URL: invalid port number"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:32
|
#: src/validators/validateHysteriaUrl.ts:30
|
||||||
msgid "Invalid HY2 URL: missing credentials/server"
|
msgid "Invalid HY2 URL: missing credentials/server"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:49
|
#: src/validators/validateHysteriaUrl.ts:47
|
||||||
msgid "Invalid HY2 URL: missing host"
|
msgid "Invalid HY2 URL: missing host"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:43
|
#: src/validators/validateHysteriaUrl.ts:41
|
||||||
msgid "Invalid HY2 URL: missing host & port"
|
msgid "Invalid HY2 URL: missing host & port"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:38
|
#: src/validators/validateHysteriaUrl.ts:36
|
||||||
msgid "Invalid HY2 URL: missing password"
|
msgid "Invalid HY2 URL: missing password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:53
|
#: src/validators/validateHysteriaUrl.ts:50
|
||||||
msgid "Invalid HY2 URL: missing port"
|
msgid "Invalid HY2 URL: missing port"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:19
|
#: src/validators/validateHysteriaUrl.ts:18
|
||||||
msgid "Invalid HY2 URL: must not contain spaces"
|
msgid "Invalid HY2 URL: must not contain spaces"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -426,19 +430,19 @@ msgstr ""
|
|||||||
msgid "Invalid HY2 URL: must start with hysteria2:// or hy2://"
|
msgid "Invalid HY2 URL: must start with hysteria2:// or hy2://"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:99
|
#: src/validators/validateHysteriaUrl.ts:108
|
||||||
msgid "Invalid HY2 URL: obfs-password required when obfs is set"
|
msgid "Invalid HY2 URL: obfs-password required when obfs is set"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:113
|
#: src/validators/validateHysteriaUrl.ts:122
|
||||||
msgid "Invalid HY2 URL: parsing failed"
|
msgid "Invalid HY2 URL: parsing failed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:106
|
#: src/validators/validateHysteriaUrl.ts:116
|
||||||
msgid "Invalid HY2 URL: sni cannot be empty"
|
msgid "Invalid HY2 URL: sni cannot be empty"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/validators/validateHysteriaUrl.ts:88
|
#: src/validators/validateHysteriaUrl.ts:98
|
||||||
msgid "Invalid HY2 URL: unsupported obfs type"
|
msgid "Invalid HY2 URL: unsupported obfs type"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -559,7 +563,7 @@ msgstr ""
|
|||||||
msgid "Issues detected"
|
msgid "Issues detected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/podkop/tabs/diagnostic/initController.ts:453
|
#: src/podkop/tabs/diagnostic/helpers/getPodkopVersionRow.ts:48
|
||||||
msgid "Latest"
|
msgid "Latest"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -567,14 +571,18 @@ msgstr ""
|
|||||||
msgid "List Update Frequency"
|
msgid "List Update Frequency"
|
||||||
msgstr ""
|
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"
|
msgid "Local Domain Lists"
|
||||||
msgstr ""
|
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"
|
msgid "Local Subnet Lists"
|
||||||
msgstr ""
|
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
|
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:72
|
||||||
msgid "Main DNS"
|
msgid "Main DNS"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -583,7 +591,7 @@ msgstr ""
|
|||||||
msgid "Memory Usage"
|
msgid "Memory Usage"
|
||||||
msgstr ""
|
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"
|
msgid "Mixed Proxy Port"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -591,11 +599,11 @@ msgstr ""
|
|||||||
msgid "Monitored Interfaces"
|
msgid "Monitored Interfaces"
|
||||||
msgstr ""
|
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"
|
msgid "Must be a number in the range of 50 - 1000"
|
||||||
msgstr ""
|
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"
|
msgid "Network Interface"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -625,15 +633,15 @@ msgstr ""
|
|||||||
msgid "Operation timed out"
|
msgid "Operation timed out"
|
||||||
msgstr ""
|
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"
|
msgid "Outbound Config"
|
||||||
msgstr ""
|
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"
|
msgid "Outbound Configuration"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/podkop/tabs/diagnostic/initController.ts:443
|
#: src/podkop/tabs/diagnostic/helpers/getPodkopVersionRow.ts:38
|
||||||
msgid "Outdated"
|
msgid "Outdated"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -677,7 +685,7 @@ msgstr ""
|
|||||||
msgid "Podkop will not modify your DHCP configuration"
|
msgid "Podkop will not modify your DHCP configuration"
|
||||||
msgstr ""
|
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"
|
msgid "Proxy Configuration URL"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -689,18 +697,22 @@ msgstr ""
|
|||||||
msgid "Proxy traffic is routed via FakeIP"
|
msgid "Proxy traffic is routed via FakeIP"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:309
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:333
|
||||||
msgid "Regional options cannot be used together"
|
msgid "Regional options cannot be used together"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:568
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592
|
||||||
msgid "Remote Domain Lists"
|
msgid "Remote Domain Lists"
|
||||||
msgstr ""
|
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"
|
msgid "Remote Subnet Lists"
|
||||||
msgstr ""
|
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
|
#: src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:49
|
||||||
msgid "Restart podkop"
|
msgid "Restart podkop"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -713,7 +725,7 @@ msgstr ""
|
|||||||
msgid "Router DNS is routed through sing-box"
|
msgid "Router DNS is routed through sing-box"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:395
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:413
|
||||||
msgid "Routing Excluded IPs"
|
msgid "Routing Excluded IPs"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -745,7 +757,7 @@ msgstr ""
|
|||||||
msgid "Run Diagnostic"
|
msgid "Run Diagnostic"
|
||||||
msgstr ""
|
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"
|
msgid "Russia inside restrictions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -757,7 +769,7 @@ msgstr ""
|
|||||||
msgid "Sections"
|
msgid "Sections"
|
||||||
msgstr ""
|
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"
|
msgid "Select a predefined list for routing"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -773,15 +785,15 @@ msgstr ""
|
|||||||
msgid "Select how often the domain or subnet lists are updated automatically"
|
msgid "Select how often the domain or subnet lists are updated automatically"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../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"
|
msgid "Select how to configure the proxy"
|
||||||
msgstr ""
|
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"
|
msgid "Select network interface for VPN connection"
|
||||||
msgstr ""
|
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
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:25
|
||||||
msgid "Select or enter DNS server address"
|
msgid "Select or enter DNS server address"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -794,18 +806,22 @@ msgstr ""
|
|||||||
msgid "Select path for sing-box config file. Change this ONLY if you know what you are doing"
|
msgid "Select path for sing-box config file. Change this ONLY if you know what you are doing"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:241
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:265
|
||||||
msgid "Select the DNS protocol type for the domain resolver"
|
msgid "Select the DNS protocol type for the domain resolver"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:364
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:388
|
||||||
msgid "Select the list type for adding custom domains"
|
msgid "Select the list type for adding custom domains"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:444
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:468
|
||||||
msgid "Select the list type for adding custom subnets"
|
msgid "Select the list type for adding custom subnets"
|
||||||
msgstr ""
|
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
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:90
|
||||||
msgid "Select the network interface from which the traffic will originate"
|
msgid "Select the network interface from which the traffic will originate"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -818,6 +834,14 @@ msgstr ""
|
|||||||
msgid "Select the WAN interfaces to be monitored"
|
msgid "Select the WAN interfaces to be monitored"
|
||||||
msgstr ""
|
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
|
#: src/podkop/tabs/dashboard/initController.ts:340
|
||||||
msgid "Services info"
|
msgid "Services info"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -863,24 +887,24 @@ msgstr ""
|
|||||||
msgid "Source Network Interface"
|
msgid "Source Network Interface"
|
||||||
msgstr ""
|
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"
|
msgid "Specify a local IP address to be excluded from routing"
|
||||||
msgstr ""
|
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"
|
msgid "Specify local IP addresses or subnets whose traffic will always be routed through the configured route"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:569
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:593
|
||||||
msgid "Specify remote URLs to download and use domain lists"
|
msgid "Specify remote URLs to download and use domain lists"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:616
|
||||||
msgid "Specify remote URLs to download and use subnet lists"
|
msgid "Specify remote URLs to download and use subnet lists"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:523
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:547
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:546
|
#: ../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"
|
msgid "Specify the path to the list file located on the router filesystem"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -912,8 +936,8 @@ msgstr ""
|
|||||||
msgid "Test latency"
|
msgid "Test latency"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:368
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:392
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:448
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:472
|
||||||
msgid "Text List"
|
msgid "Text List"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -921,15 +945,15 @@ msgstr ""
|
|||||||
msgid "The DNS server used to look up the IP address of an upstream DNS server"
|
msgid "The DNS server used to look up the IP address of an upstream DNS server"
|
||||||
msgstr ""
|
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"
|
msgid "The interval between connectivity tests"
|
||||||
msgstr ""
|
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"
|
msgid "The maximum difference in response times (ms) allowed when comparing servers"
|
||||||
msgstr ""
|
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"
|
msgid "The URL used to test server connectivity"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -957,12 +981,12 @@ msgstr ""
|
|||||||
msgid "TTL value cannot be empty"
|
msgid "TTL value cannot be empty"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:17
|
||||||
msgid "UDP (Unprotected DNS)"
|
msgid "UDP (Unprotected DNS)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:174
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:198
|
||||||
msgid "UDP over TCP"
|
msgid "UDP over TCP"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -972,7 +996,7 @@ msgstr ""
|
|||||||
#: src/podkop/tabs/diagnostic/initController.ts:41
|
#: src/podkop/tabs/diagnostic/initController.ts:41
|
||||||
#: src/podkop/tabs/diagnostic/initController.ts:42
|
#: src/podkop/tabs/diagnostic/initController.ts:42
|
||||||
#: src/podkop/tabs/diagnostic/initController.ts:43
|
#: src/podkop/tabs/diagnostic/initController.ts:43
|
||||||
#: src/podkop/tabs/diagnostic/initController.ts:417
|
#: src/podkop/tabs/diagnostic/helpers/getPodkopVersionRow.ts:7
|
||||||
msgid "unknown"
|
msgid "unknown"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -993,47 +1017,47 @@ msgstr ""
|
|||||||
msgid "URL must use one of the following protocols:"
|
msgid "URL must use one of the following protocols:"
|
||||||
msgstr ""
|
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"
|
msgid "URLTest"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:134
|
||||||
msgid "URLTest Check Interval"
|
msgid "URLTest Check Interval"
|
||||||
msgstr ""
|
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"
|
msgid "URLTest Proxy Links"
|
||||||
msgstr ""
|
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"
|
msgid "URLTest Testing URL"
|
||||||
msgstr ""
|
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"
|
msgid "URLTest Tolerance"
|
||||||
msgstr ""
|
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"
|
msgid "User Domain List Type"
|
||||||
msgstr ""
|
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"
|
msgid "User Domains"
|
||||||
msgstr ""
|
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"
|
msgid "User Domains List"
|
||||||
msgstr ""
|
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"
|
msgid "User Subnet List Type"
|
||||||
msgstr ""
|
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"
|
msgid "User Subnets"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:481
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:505
|
||||||
msgid "User Subnets List"
|
msgid "User Subnets List"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1041,7 +1065,7 @@ msgstr ""
|
|||||||
#: src/validators/validateDns.ts:18
|
#: src/validators/validateDns.ts:18
|
||||||
#: src/validators/validateDomain.ts:13
|
#: src/validators/validateDomain.ts:13
|
||||||
#: src/validators/validateDomain.ts:30
|
#: src/validators/validateDomain.ts:30
|
||||||
#: src/validators/validateHysteriaUrl.ts:111
|
#: src/validators/validateHysteriaUrl.ts:120
|
||||||
#: src/validators/validateIp.ts:8
|
#: src/validators/validateIp.ts:8
|
||||||
#: src/validators/validateOutboundJson.ts:7
|
#: src/validators/validateOutboundJson.ts:7
|
||||||
#: src/validators/validatePath.ts:16
|
#: src/validators/validatePath.ts:16
|
||||||
@@ -1054,8 +1078,8 @@ msgstr ""
|
|||||||
msgid "Valid"
|
msgid "Valid"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:434
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:458
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:513
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:537
|
||||||
msgid "Validation errors:"
|
msgid "Validation errors:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1068,11 +1092,17 @@ msgstr ""
|
|||||||
msgid "Visit Wiki"
|
msgid "Visit Wiki"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:311
|
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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."
|
msgid "Warning: %s cannot be used together with %s. Previous selections have been removed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js: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."
|
msgid "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
config settings 'settings'
|
config settings 'settings'
|
||||||
option dns_type 'udp'
|
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 bootstrap_dns_server '77.88.8.8'
|
||||||
option dns_rewrite_ttl '60'
|
option dns_rewrite_ttl '60'
|
||||||
list source_network_interfaces 'br-lan'
|
list source_network_interfaces 'br-lan'
|
||||||
@@ -16,6 +16,7 @@ config settings 'settings'
|
|||||||
option dont_touch_dhcp '0'
|
option dont_touch_dhcp '0'
|
||||||
option config_path '/etc/sing-box/config.json'
|
option config_path '/etc/sing-box/config.json'
|
||||||
option cache_path '/tmp/sing-box/cache.db'
|
option cache_path '/tmp/sing-box/cache.db'
|
||||||
|
option log_level 'warn'
|
||||||
option exclude_ntp '0'
|
option exclude_ntp '0'
|
||||||
option shutdown_correctly '0'
|
option shutdown_correctly '0'
|
||||||
#list routing_excluded_ips '192.168.1.3'
|
#list routing_excluded_ips '192.168.1.3'
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ check_required_file() {
|
|||||||
PODKOP_LIB="/usr/lib/podkop"
|
PODKOP_LIB="/usr/lib/podkop"
|
||||||
check_required_file /lib/functions.sh
|
check_required_file /lib/functions.sh
|
||||||
check_required_file /lib/config/uci.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/constants.sh"
|
||||||
check_required_file "$PODKOP_LIB/nft.sh"
|
check_required_file "$PODKOP_LIB/nft.sh"
|
||||||
check_required_file "$PODKOP_LIB/helpers.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/sing_box_config_facade.sh"
|
||||||
check_required_file "$PODKOP_LIB/logging.sh"
|
check_required_file "$PODKOP_LIB/logging.sh"
|
||||||
check_required_file "$PODKOP_LIB/rulesets.sh"
|
check_required_file "$PODKOP_LIB/rulesets.sh"
|
||||||
. /lib/config/uci.sh
|
|
||||||
. /lib/functions.sh
|
. /lib/functions.sh
|
||||||
|
. /lib/config/uci.sh
|
||||||
|
. /lib/functions/network.sh
|
||||||
. "$PODKOP_LIB/constants.sh"
|
. "$PODKOP_LIB/constants.sh"
|
||||||
. "$PODKOP_LIB/nft.sh"
|
. "$PODKOP_LIB/nft.sh"
|
||||||
. "$PODKOP_LIB/helpers.sh"
|
. "$PODKOP_LIB/helpers.sh"
|
||||||
@@ -76,7 +78,7 @@ check_requirements() {
|
|||||||
if has_outbound_section; then
|
if has_outbound_section; then
|
||||||
log "Outbound section found" "debug"
|
log "Outbound section found" "debug"
|
||||||
else
|
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
|
exit 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -86,12 +88,13 @@ _check_outbound_section() {
|
|||||||
local proxy_string interface outbound_json urltest_proxy_links
|
local proxy_string interface outbound_json urltest_proxy_links
|
||||||
|
|
||||||
config_get proxy_string "$section" "proxy_string"
|
config_get proxy_string "$section" "proxy_string"
|
||||||
config_get interface "$section" "interface"
|
config_get selector_proxy_links "$section" "selector_proxy_links"
|
||||||
config_get outbound_json "$section" "outbound_json"
|
|
||||||
config_get urltest_proxy_links "$section" "urltest_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" ] ||
|
if [ -n "$proxy_string" ] || [ -n "$selector_proxy_links" ] || [ -n "$urltest_proxy_links" ] ||
|
||||||
[ -n "$outbound_json" ] || [ -n "$urltest_proxy_links" ]; then
|
[ -n "$outbound_json" ] || [ -n "$interface" ]; then
|
||||||
section_exists=0
|
section_exists=0
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -161,12 +164,12 @@ stop_main() {
|
|||||||
|
|
||||||
log "Flush ip rule"
|
log "Flush ip rule"
|
||||||
if ip rule list | grep -q "podkop"; then
|
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
|
fi
|
||||||
|
|
||||||
log "Flush ip route"
|
log "Flush ip route"
|
||||||
if ip route list table podkop > /dev/null 2>&1; then
|
if ip route list table "$RT_TABLE_NAME" > /dev/null 2>&1; then
|
||||||
ip route flush table podkop
|
ip route flush table "$RT_TABLE_NAME"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log "Stop sing-box"
|
log "Stop sing-box"
|
||||||
@@ -248,20 +251,18 @@ br_netfilter_disable() {
|
|||||||
# Main funcs
|
# Main funcs
|
||||||
|
|
||||||
route_table_rule_mark() {
|
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 "$RT_TABLE_NAME" 2> /dev/null | grep -q "local default dev lo scope host"; then
|
||||||
|
|
||||||
if ! ip route list table $table | grep -q "local default dev lo scope host"; then
|
|
||||||
log "Added route for tproxy" "debug"
|
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
|
else
|
||||||
log "Route for tproxy exists" "debug"
|
log "Route for tproxy exists" "debug"
|
||||||
fi
|
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"
|
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
|
else
|
||||||
log "Marking rule exist" "debug"
|
log "Marking rule exist" "debug"
|
||||||
fi
|
fi
|
||||||
@@ -311,19 +312,21 @@ 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" 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 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 ct status dnat return
|
||||||
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 "@$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 "$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 "@$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 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 "$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 \& "$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 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 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_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 meta mark "$NFT_OUTBOUND_MARK" counter return
|
||||||
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 "@$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 "$SB_FAKEIP_INET4_RANGE" 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 "$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 0x105 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
|
local exclude_ntp
|
||||||
config_get_bool exclude_ntp "settings" "exclude_ntp" "0"
|
config_get_bool exclude_ntp "settings" "exclude_ntp" "0"
|
||||||
@@ -398,7 +401,6 @@ dnsmasq_restore() {
|
|||||||
log "Restoring noresolv" "debug"
|
log "Restoring noresolv" "debug"
|
||||||
noresolv="$(uci_get "dhcp" "@dnsmasq[0]" "podkop_noresolv")"
|
noresolv="$(uci_get "dhcp" "@dnsmasq[0]" "podkop_noresolv")"
|
||||||
if [ -z "$noresolv" ]; then
|
if [ -z "$noresolv" ]; then
|
||||||
uci_remove "dhcp" "@dnsmasq[0]" "noresolv"
|
|
||||||
uci_set "dhcp" "@dnsmasq[0]" "noresolv" 0
|
uci_set "dhcp" "@dnsmasq[0]" "noresolv" 0
|
||||||
else
|
else
|
||||||
uci_set "dhcp" "@dnsmasq[0]" "noresolv" "$noresolv"
|
uci_set "dhcp" "@dnsmasq[0]" "noresolv" "$noresolv"
|
||||||
@@ -417,6 +419,10 @@ dnsmasq_restore() {
|
|||||||
elif file_exists "$resolvfile"; then
|
elif file_exists "$resolvfile"; then
|
||||||
log "Backup DNS servers not found, using default resolvfile" "debug"
|
log "Backup DNS servers not found, using default resolvfile" "debug"
|
||||||
uci_set "dhcp" "@dnsmasq[0]" "resolvfile" "$resolvfile"
|
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
|
else
|
||||||
log "Backup DNS servers and default resolvfile not found, possible resolving issues" "warn"
|
log "Backup DNS servers and default resolvfile not found, possible resolving issues" "warn"
|
||||||
fi
|
fi
|
||||||
@@ -485,7 +491,7 @@ list_update() {
|
|||||||
local i
|
local i
|
||||||
|
|
||||||
# DNS Check
|
# 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
|
if nslookup -timeout=$nslookup_timeout openwrt.org > /dev/null 2>&1; then
|
||||||
echolog "✅ DNS check passed"
|
echolog "✅ DNS check passed"
|
||||||
break
|
break
|
||||||
@@ -588,7 +594,9 @@ sing_box_init_config() {
|
|||||||
sing_box_configure_log() {
|
sing_box_configure_log() {
|
||||||
log "Configure the log section of a sing-box JSON configuration"
|
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() {
|
sing_box_configure_inbounds() {
|
||||||
@@ -641,6 +649,35 @@ configure_outbound_handler() {
|
|||||||
config_get json_outbound "$section" "outbound_json"
|
config_get json_outbound "$section" "outbound_json"
|
||||||
config=$(sing_box_cf_add_json_outbound "$config" "$section" "$json_outbound")
|
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)
|
urltest)
|
||||||
log "Detected proxy configuration type: urltest" "debug"
|
log "Detected proxy configuration type: urltest" "debug"
|
||||||
local urltest_proxy_links udp_over_tcp i urltest_tag selector_tag outbound_tag outbound_tags \
|
local urltest_proxy_links udp_over_tcp i urltest_tag selector_tag outbound_tag outbound_tags \
|
||||||
@@ -715,6 +752,9 @@ configure_outbound_handler() {
|
|||||||
block)
|
block)
|
||||||
log "Connection type 'block' detected for the $section section – no outbound will be created (handled via reject route rules)"
|
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"
|
log "Unknown connection type '$connection_type' for the $section section. Aborted." "fatal"
|
||||||
exit 1
|
exit 1
|
||||||
@@ -783,9 +823,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_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=$(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_reject_route_rule
|
||||||
|
configure_common_direct_route_rule
|
||||||
|
|
||||||
local routing_excluded_ips
|
local routing_excluded_ips
|
||||||
config_get routing_excluded_ips "settings" "routing_excluded_ips"
|
config_get routing_excluded_ips "settings" "routing_excluded_ips"
|
||||||
@@ -795,6 +834,8 @@ sing_box_configure_route() {
|
|||||||
config_list_foreach "settings" "routing_excluded_ips" exclude_source_ip_from_routing_handler "$rule_tag"
|
config_list_foreach "settings" "routing_excluded_ips" exclude_source_ip_from_routing_handler "$rule_tag"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
config_foreach include_source_ips_in_routing_handler "section"
|
||||||
|
|
||||||
config_foreach configure_routing_for_section_lists "section"
|
config_foreach configure_routing_for_section_lists "section"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -815,7 +856,7 @@ include_source_ips_in_routing_handler() {
|
|||||||
|
|
||||||
configure_common_reject_route_rule() {
|
configure_common_reject_route_rule() {
|
||||||
local block_sections block_section_lists_enabled
|
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
|
block_section_lists_enabled=0
|
||||||
|
|
||||||
if [ -n "$block_sections" ]; then
|
if [ -n "$block_sections" ]; then
|
||||||
@@ -833,6 +874,27 @@ configure_common_reject_route_rule() {
|
|||||||
fi
|
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() {
|
include_source_ip_in_routing_handler() {
|
||||||
local source_ip="$1"
|
local source_ip="$1"
|
||||||
local rule_tag="$2"
|
local rule_tag="$2"
|
||||||
@@ -857,7 +919,7 @@ configure_routing_for_section_lists() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
local community_lists user_domain_list_type user_subnet_list_type local_domain_lists local_subnet_lists \
|
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 community_lists "$section" "community_lists"
|
||||||
config_get user_domain_list_type "$section" "user_domain_list_type" "disabled"
|
config_get user_domain_list_type "$section" "user_domain_list_type" "disabled"
|
||||||
config_get user_subnet_list_type "$section" "user_subnet_list_type" "disabled"
|
config_get user_subnet_list_type "$section" "user_subnet_list_type" "disabled"
|
||||||
@@ -866,14 +928,25 @@ configure_routing_for_section_lists() {
|
|||||||
config_get remote_domain_lists "$section" "remote_domain_lists"
|
config_get remote_domain_lists "$section" "remote_domain_lists"
|
||||||
config_get remote_subnet_lists "$section" "remote_subnet_lists"
|
config_get remote_subnet_lists "$section" "remote_subnet_lists"
|
||||||
config_get section_connection_type "$section" "connection_type"
|
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
|
case "$section_connection_type" in
|
||||||
route_rule_tag="$SB_REJECT_RULE_TAG"
|
proxy | vpn)
|
||||||
else
|
|
||||||
route_rule_tag="$(gen_id)"
|
route_rule_tag="$(gen_id)"
|
||||||
outbound_tag=$(get_outbound_tag_by_section "$section")
|
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")
|
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
|
if [ -n "$community_lists" ]; then
|
||||||
log "Processing community list routing rules for '$section' section"
|
log "Processing community list routing rules for '$section' section"
|
||||||
@@ -911,6 +984,11 @@ configure_routing_for_section_lists() {
|
|||||||
config_list_foreach "$section" "remote_subnet_lists" configure_remote_domain_or_subnet_list_handler \
|
config_list_foreach "$section" "remote_subnet_lists" configure_remote_domain_or_subnet_list_handler \
|
||||||
"subnets" "$section" "$route_rule_tag"
|
"subnets" "$section" "$route_rule_tag"
|
||||||
fi
|
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() {
|
configure_community_list_handler() {
|
||||||
@@ -1239,7 +1317,10 @@ import_community_service_subnet_list_handler() {
|
|||||||
URL=$SUBNETS_DISCORD
|
URL=$SUBNETS_DISCORD
|
||||||
nft_create_ipv4_set "$NFT_TABLE_NAME" "$NFT_DISCORD_SET_NAME"
|
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 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 ;;
|
*) return 0 ;;
|
||||||
esac
|
esac
|
||||||
@@ -1464,12 +1545,16 @@ get_first_outbound_section() {
|
|||||||
echo "$first_section"
|
echo "$first_section"
|
||||||
}
|
}
|
||||||
|
|
||||||
get_block_sections() {
|
get_sections_by_connection_type() {
|
||||||
uci show podkop | grep "\.connection_type='block'" | cut -d'.' -f2
|
local connection_type="$1"
|
||||||
|
|
||||||
|
uci show podkop | grep "\.connection_type='$connection_type'" | cut -d'.' -f2
|
||||||
}
|
}
|
||||||
|
|
||||||
block_section_exists() {
|
section_by_connection_type_exists() {
|
||||||
if uci show podkop | grep -q "\.connection_type='block'"; then
|
local connection_type="$1"
|
||||||
|
|
||||||
|
if uci show podkop | grep -q "\.connection_type='$connection_type'"; then
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
return 1
|
return 1
|
||||||
@@ -1512,7 +1597,8 @@ get_service_listen_address() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
service_listen_address="$(uci_get "network" "lan" "ipaddr" | awk '{print $1}' | cut -d'/' -f1)"
|
local interface="lan"
|
||||||
|
network_get_ipaddr service_listen_address "$interface"
|
||||||
|
|
||||||
if [ -z "$service_listen_address" ]; then
|
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"
|
log "Failed to determine the listening IP address. Please open an issue to report this problem: https://github.com/itdoginfo/podkop/issues" "error"
|
||||||
@@ -1527,8 +1613,10 @@ nft_list_all_traffic_from_ip() {
|
|||||||
local ip="$1"
|
local ip="$1"
|
||||||
|
|
||||||
if ! nft list chain inet "$NFT_TABLE_NAME" mangle | grep -q "ip saddr $ip"; then
|
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" \
|
||||||
nft insert rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip saddr "$ip" meta l4proto udp meta mark set 0x105 counter
|
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
|
nft insert rule inet "$NFT_TABLE_NAME" mangle ip saddr "$ip" ip daddr @localv4 return
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -1753,6 +1841,7 @@ show_config() {
|
|||||||
sed -e 's/\(option proxy_string\).*/\1 '\''MASKED'\''/g' \
|
sed -e 's/\(option proxy_string\).*/\1 '\''MASKED'\''/g' \
|
||||||
-e '/option outbound_json/,/^}/c\ option outbound_json '\''MASKED'\''' \
|
-e '/option outbound_json/,/^}/c\ option outbound_json '\''MASKED'\''' \
|
||||||
-e 's/\(list urltest_proxy_links\).*/\1 '\''MASKED'\''/g' \
|
-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 dns_server '[^/]*\\)/[^']*'@\\1/MASKED'@g" \
|
||||||
-e "s@\\(option domain_resolver_dns_server '[^/]*\\)/[^']*'@\\1/MASKED'@g" \
|
-e "s@\\(option domain_resolver_dns_server '[^/]*\\)/[^']*'@\\1/MASKED'@g" \
|
||||||
-e 's/\(option yacd_secret_key\).*/\1 '\''MASKED'\''/g' \
|
-e 's/\(option yacd_secret_key\).*/\1 '\''MASKED'\''/g' \
|
||||||
|
|||||||
@@ -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
|
CLOUDFLARE_OCTETS="8.47 162.159 188.114" # Endpoints https://github.com/ampetelin/warp-endpoint-checker
|
||||||
JQ_REQUIRED_VERSION="1.7.1"
|
JQ_REQUIRED_VERSION="1.7.1"
|
||||||
COREUTILS_BASE64_REQUIRED_VERSION="9.7"
|
COREUTILS_BASE64_REQUIRED_VERSION="9.7"
|
||||||
|
RT_TABLE_NAME="podkop"
|
||||||
|
|
||||||
## nft
|
## nft
|
||||||
NFT_TABLE_NAME="PodkopTable"
|
NFT_TABLE_NAME="PodkopTable"
|
||||||
@@ -19,11 +20,11 @@ NFT_LOCALV4_SET_NAME="localv4"
|
|||||||
NFT_COMMON_SET_NAME="podkop_subnets"
|
NFT_COMMON_SET_NAME="podkop_subnets"
|
||||||
NFT_DISCORD_SET_NAME="podkop_discord_subnets"
|
NFT_DISCORD_SET_NAME="podkop_discord_subnets"
|
||||||
NFT_INTERFACE_SET_NAME="interfaces"
|
NFT_INTERFACE_SET_NAME="interfaces"
|
||||||
|
NFT_FAKEIP_MARK="0x00100000"
|
||||||
|
NFT_OUTBOUND_MARK="0x00200000"
|
||||||
|
|
||||||
## sing-box
|
## sing-box
|
||||||
SB_REQUIRED_VERSION="1.12.0"
|
SB_REQUIRED_VERSION="1.12.0"
|
||||||
# Log
|
|
||||||
SB_DEFAULT_LOG_LEVEL="warn"
|
|
||||||
# DNS
|
# DNS
|
||||||
SB_DNS_SERVER_TAG="dns-server"
|
SB_DNS_SERVER_TAG="dns-server"
|
||||||
SB_FAKEIP_DNS_SERVER_TAG="fakeip-server"
|
SB_FAKEIP_DNS_SERVER_TAG="fakeip-server"
|
||||||
@@ -45,23 +46,21 @@ SB_SERVICE_MIXED_INBOUND_PORT=4534
|
|||||||
SB_DIRECT_OUTBOUND_TAG="direct-out"
|
SB_DIRECT_OUTBOUND_TAG="direct-out"
|
||||||
# Route
|
# Route
|
||||||
SB_REJECT_RULE_TAG="reject-rule-tag"
|
SB_REJECT_RULE_TAG="reject-rule-tag"
|
||||||
|
SB_EXCLUSION_RULE_TAG="exclusion-rule-tag"
|
||||||
# Experimental
|
# Experimental
|
||||||
SB_CLASH_API_CONTROLLER_PORT=9090
|
SB_CLASH_API_CONTROLLER_PORT=9090
|
||||||
|
|
||||||
## Lists
|
## Lists
|
||||||
GITHUB_RAW_URL="https://raw.githubusercontent.com/itdoginfo/allow-domains/main"
|
GITHUB_RAW_URL="https://raw.githubusercontent.com/itdoginfo/allow-domains/main"
|
||||||
SRS_MAIN_URL="https://github.com/itdoginfo/allow-domains/releases/latest/download"
|
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_TWITTER="${GITHUB_RAW_URL}/Subnets/IPv4/twitter.lst"
|
||||||
SUBNETS_META="${GITHUB_RAW_URL}/Subnets/IPv4/meta.lst"
|
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_ROBLOX="${GITHUB_RAW_URL}/Subnets/IPv4/roblox.lst"
|
||||||
SUBNETS_TELERAM="${GITHUB_RAW_URL}/Subnets/IPv4/telegram.lst"
|
SUBNETS_TELERAM="${GITHUB_RAW_URL}/Subnets/IPv4/telegram.lst"
|
||||||
SUBNETS_CLOUDFLARE="${GITHUB_RAW_URL}/Subnets/IPv4/cloudflare.lst"
|
SUBNETS_CLOUDFLARE="${GITHUB_RAW_URL}/Subnets/IPv4/cloudflare.lst"
|
||||||
SUBNETS_HETZNER="${GITHUB_RAW_URL}/Subnets/IPv4/hetzner.lst"
|
SUBNETS_HETZNER="${GITHUB_RAW_URL}/Subnets/IPv4/hetzner.lst"
|
||||||
SUBNETS_OVH="${GITHUB_RAW_URL}/Subnets/IPv4/ovh.lst"
|
SUBNETS_OVH="${GITHUB_RAW_URL}/Subnets/IPv4/ovh.lst"
|
||||||
SUBNETS_DIGITALOCEAN="${GITHUB_RAW_URL}/Subnets/IPv4/digitalocean.lst"
|
SUBNETS_DIGITALOCEAN="${GITHUB_RAW_URL}/Subnets/IPv4/digitalocean.lst"
|
||||||
SUBNETS_CLOUDFRONT="${GITHUB_RAW_URL}/Subnets/IPv4/cloudfront.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"
|
||||||
@@ -18,7 +18,9 @@ nolog() {
|
|||||||
local timestamp
|
local timestamp
|
||||||
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
|
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() {
|
echolog() {
|
||||||
|
|||||||
@@ -178,8 +178,9 @@ _add_outbound_security() {
|
|||||||
|
|
||||||
local security scheme
|
local security scheme
|
||||||
security=$(url_get_query_param "$url" "security")
|
security=$(url_get_query_param "$url" "security")
|
||||||
|
scheme="$(url_get_scheme "$url")"
|
||||||
|
|
||||||
if [ -z "$security" ]; then
|
if [ -z "$security" ]; then
|
||||||
scheme="$(url_get_scheme "$url")"
|
|
||||||
if [ "$scheme" = "hysteria2" ] || [ "$scheme" = "hy2" ]; then
|
if [ "$scheme" = "hysteria2" ] || [ "$scheme" = "hy2" ]; then
|
||||||
security="tls"
|
security="tls"
|
||||||
fi
|
fi
|
||||||
@@ -195,6 +196,10 @@ _add_outbound_security() {
|
|||||||
public_key=$(url_get_query_param "$url" "pbk")
|
public_key=$(url_get_query_param "$url" "pbk")
|
||||||
short_id=$(url_get_query_param "$url" "sid")
|
short_id=$(url_get_query_param "$url" "sid")
|
||||||
|
|
||||||
|
if [ "$scheme" = "hysteria2" ] || [ "$scheme" = "hy2" ]; then
|
||||||
|
fingerprint=""
|
||||||
|
fi
|
||||||
|
|
||||||
config=$(
|
config=$(
|
||||||
sing_box_cm_set_tls_for_outbound \
|
sing_box_cm_set_tls_for_outbound \
|
||||||
"$config" \
|
"$config" \
|
||||||
|
|||||||
@@ -692,6 +692,11 @@ sing_box_cm_add_hysteria2_outbound() {
|
|||||||
local download_mbps="$9"
|
local download_mbps="$9"
|
||||||
local network="${10}"
|
local network="${10}"
|
||||||
|
|
||||||
|
local is_multi_port="false"
|
||||||
|
case "$server_port" in
|
||||||
|
*","*|*"-"*) is_multi_port="true" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
echo "$config" | jq \
|
echo "$config" | jq \
|
||||||
--arg tag "$tag" \
|
--arg tag "$tag" \
|
||||||
--arg server_address "$server_address" \
|
--arg server_address "$server_address" \
|
||||||
@@ -702,14 +707,25 @@ sing_box_cm_add_hysteria2_outbound() {
|
|||||||
--arg upload_mbps "$upload_mbps" \
|
--arg upload_mbps "$upload_mbps" \
|
||||||
--arg download_mbps "$download_mbps" \
|
--arg download_mbps "$download_mbps" \
|
||||||
--arg network "$network" \
|
--arg network "$network" \
|
||||||
'.outbounds += [(
|
--argjson is_multi_port "$is_multi_port" \
|
||||||
|
'
|
||||||
|
def parse_port_entry:
|
||||||
|
if index("-") then split("-") | join(":")
|
||||||
|
else . + ":" + .
|
||||||
|
end;
|
||||||
|
|
||||||
|
.outbounds += [(
|
||||||
{
|
{
|
||||||
type: "hysteria2",
|
type: "hysteria2",
|
||||||
tag: $tag,
|
tag: $tag,
|
||||||
server: $server_address,
|
server: $server_address,
|
||||||
server_port: ($server_port | tonumber),
|
|
||||||
password: $password
|
password: $password
|
||||||
}
|
}
|
||||||
|
+ (if $is_multi_port then {
|
||||||
|
server_ports: ($server_port | split(",") | map(ltrimstr(" ") | rtrimstr(" ") | parse_port_entry))
|
||||||
|
} else {
|
||||||
|
server_port: ($server_port | tonumber)
|
||||||
|
} end)
|
||||||
+ (if $obfuscator_type != "" and $obfuscator_password != "" then {
|
+ (if $obfuscator_type != "" and $obfuscator_password != "" then {
|
||||||
obfs: {
|
obfs: {
|
||||||
type: $obfuscator_type,
|
type: $obfuscator_type,
|
||||||
@@ -1090,6 +1106,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.
|
# Patch a routing rule in the route section of a sing-box JSON configuration.
|
||||||
# Arguments:
|
# Arguments:
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM openwrt/sdk:x86-64-SNAPSHOT
|
FROM openwrt/sdk:x86_64-v25.12.3
|
||||||
WORKDIR /builder
|
WORKDIR /builder
|
||||||
RUN ./setup.sh \
|
RUN ./setup.sh \
|
||||||
&& ./scripts/feeds update -a \
|
&& ./scripts/feeds update -a \
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM openwrt/sdk:x86_64-v24.10.3
|
FROM openwrt/sdk:x86_64-v24.10.6
|
||||||
WORKDIR /builder
|
WORKDIR /builder
|
||||||
RUN ./scripts/feeds update -a \
|
RUN ./scripts/feeds update -a \
|
||||||
&& ./scripts/feeds install luci-base \
|
&& ./scripts/feeds install luci-base \
|
||||||
|
|||||||
Reference in New Issue
Block a user