Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

podkop-sub-addon

Поддержка ссылок-подписок для podkop. Podkop переключается в режим URLTest и выбирается сервер с наименьшим пингом.

Возможности

  • Ссылка вставляется в LuCI, серверы уезжают в podkop по кнопке
  • Подписка в base64 или обычным текстом
  • Обновление раз в сутки по расписанию, с выключателем в интерфейсе
  • Заголовок x-hwid для панелей, которые прячут список за лимитом устройств
  • Серверы с транспортом, который podkop не соберёт, отсеиваются — мёртвых выходов в пуле не будет
  • Конфигурация podkop откатывается, если он отверг новый список
  • Обновление без изменений не трогает ни podkop, ни соединение

Пакеты

Пакет Содержимое
podkop-sub CLI (podkop-sub update), UCI-конфиг и задание в cron
luci-app-podkop-sub Страница в LuCI

Как это работает

ссылка подписки → base64 (или обычный текст) → строки vless:// / ss:// / trojan:// …
                → uci: podkop.<секция>.urltest_proxy_links
                → перезапуск podkop → группа urltest в sing-box

Warning

Понимается только подписка-список ссылок — обычным текстом или в base64. Конфиги-объекты не разбираются: ни JSON для xray (панели отдают его клиентам вроде Happ), ни JSON для sing-box, ни YAML для Clash.

Серверы с транспортом, которого podkop не понимает, отбрасываются: он собирает только tcp, ws и grpc, а для остальных (например xhttp) пишет в лог «Unknown transport» и всё равно создаёт outbound — без транспорта, то есть заведомо нерабочий. Сколько ссылок отброшено, видно в выводе обновления.

Podkop проверяет сгенерированный конфиг sing-box и при ошибке оставляет предыдущий. podkop-sub это отслеживает и сообщает о неудаче, а не рапортует об успехе вслепую.

Важно, что при отказе возвращается и конфигурация podkop: запись в UCI проходит раньше, чем podkop успевает её отвергнуть, поэтому битая подписка иначе оставила бы конфиг, который ломается только при следующей перезагрузке. Перед перезаписью /etc/config/podkop копируется целиком, и при неудаче копия возвращается на место (целиком — потому что теги ссылок могут содержать пробелы, и разобрать UCI-список обратно на элементы нельзя надёжно).

Панели с лимитом устройств

Панели на Remnawave прячут список за идентификатором устройства: без заголовка x-hwid они отвечают 200 и одной ссылкой-заглушкой на 0.0.0.0 («App not supported»). Заголовок отправляется всегда; значение создаётся при первом обновлении из MAC-адреса и сохраняется в опции hwid — панель считает разные идентификаторы разными устройствами и тратит на них лимит. Чтобы занять новый слот, достаточно очистить опцию: id создастся заново.

User-Agent при этом остаётся своим. Формат ответа панель выбирает именно по нему, и под видом клиента придёт формат этого клиента: например, для Happ — xray-конфиг в JSON вместо списка ссылок.

Ссылки на 0.0.0.0 отбрасываются. Если после этого не осталось ни одной, обновление прерывается с ошибкой, не трогая конфигурацию podkop, — иначе роутер получил бы формально рабочий конфиг с мёртвым выходом.

Требования

Сам podkop должен быть установлен — дополнение только пишет в его конфигурацию. В DEPENDS его нет намеренно: podkop распространяется через GitHub Releases, а не через фид OpenWrt, поэтому SDK такую зависимость разрешить не может. Отсутствие podkop CLI обнаружит сам и сообщит об этом.

Установка

Готовые пакеты прикреплены к релизам. Скачайте оба и поставьте одной командой — тогда apk сам разрешит зависимость luci-app-podkop-subpodkop-sub:

apk add --allow-untrusted podkop-sub-*.apk luci-app-podkop-sub-*.apk

Пакеты собраны как noarch и подходят любому роутеру независимо от платформы. После установки в LuCI появляется страница Services → Подписка Podkop.

Настройка

/etc/config/podkop-sub:

config subscription 'main'
	option url ''           # ссылка подписки
	option target 'main'    # в какую секцию podkop писать
	option auto_update '1'  # обновлять раз в сутки
	option hwid ''          # id устройства, создаётся сам при первом обновлении

Автообновление

При включённом auto_update в crontab пользователя root появляется строка:

0 5 * * * /usr/bin/podkop-sub update >/dev/null 2>&1

Время — по часовому поясу роутера (System → System → Timezone), а не по вашему: на свежей прошивке это UTC. Вывод уходит в syslog, поэтому из cron он не нужен.

При сохранении в LuCI строка обновляется сама: /etc/init.d/podkop-sub подписан на procd-триггер config.change, который LuCI посылает при применении настроек. Простой uci commit такого события не создаёт, поэтому после правки из консоли синхронизацию нужно позвать самому:

uci set podkop-sub.main.auto_update=0
uci commit podkop-sub
podkop-sub cron

Пока ссылка не задана, задание не создаётся: иначе каждую ночь в лог падала бы одна и та же ошибка. Если на роутере не было ни одного задания, crond не запущен — тогда он включается и стартует вместе с созданием строки.

Границы ответственности

Дополнение владеет ровно двумя опциями в целевой секции podkop: proxy_config_type и urltest_proxy_links. Всё остальное — списки маршрутизации, DNS, интерфейсы — настраивается в интерфейсе самого podkop. Эти две опции руками нельзя трогать: они перезаписываются при каждом обновлении.

Сборка

Локально нужен OpenWrt SDK под Linux — WSL или Docker. В CI собирается через openwrt/gh-action-sdk: по тегу v* (пакеты прикрепляются к релизу) либо вручную из вкладки Actions.

Оба пакета собираются как PKGARCH:=all, поэтому одной сборки хватает на любую платформу. Версия SDK определяет формат пакета: 25.12 даёт .apk, 24.10 — .ipk. Чтобы собрать под обе, достаточно добавить строку в matrix.arch.

Лицензия

MIT — см. LICENSE.md.

Сам podkop распространяется под GPL-2.0, но это дополнение — отдельная программа: его код не копируется и не линкуется, взаимодействие идёт через UCI-конфигурацию и вызов CLI.

About

No description or website provided.

Topics

Resources

Stars

Watchers

Forks

Releases

Contributors

Languages