diff --git a/README.md b/README.md index 7e13c27..d6d44f8 100644 --- a/README.md +++ b/README.md @@ -80,12 +80,15 @@ Luci: Services/podkop # ToDo Этот раздел не означает задачи, которые нужно брать и делать. Это общий список хотелок. Если вы хотите помочь, пожалуйста, спросите сначала в телеграмме. +- [ ] Interface trigger +- [ ] Управление sing-box с помощью podkop. sing-box disable - [ ] Сделать галку запрещающую подкопу редачить dhcp. Допилить в исключение вместе с пустыми полями proxy и vpn (нужно wiki) - [ ] Рестарт сервиса без рестарта dnsmasq - [ ] `ash: can't kill pid 9848: No such process` при обновлении - [ ] Luci: Добавить валидацию "Proxy Configuration URL". Если пустое, то ошибка. Как с интерфейсом. - [ ] После выключения и включения может быть: `Dnsmasq save config error: server=127.0.0.42` - [ ] Не грузится диагностика полностью при одной нерабочей комманде. Подумать как это можно дебажить легко. https://t.me/itdogchat/142500/378956 +- [ ] DoH возможность добавлять сервера c path. Взять пример из NextDNS Низкий приоритет - [ ] Галочка, которая режет доступ к doh серверам @@ -97,6 +100,17 @@ Luci: Services/podkop - [ ] Unit тесты (BATS) - [ ] Интеграционые тесты бекенда (OpenWrt rootfs + BATS) +# Don't touch my dhcp +Нужно в первую очередь, чтоб использовать опцию `server`. + +В случае если опция активна, podkop не трогает /etc/config/dhcp. И вам требуется самостоятельно указать следующие значения: +``` + option noresolv '1' + option cachesize '0' + list server '127.0.0.42' +``` +Без этого podkop работать не будет. + # Разработка Есть два варианта: - Просто поставить пакет на роутер или виртуалку и прям редактировать через SFTP (opkg install openssh-sftp-server) diff --git a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js index f7df280..c9f2d87 100644 --- a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js +++ b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js @@ -62,6 +62,23 @@ function getNetworkInterfaces(o, section_id, excludeInterfaces = []) { }); } +function getNetworkNetworks(o, section_id, excludeInterfaces = []) { + return network.getNetworks().then(networks => { + o.keylist = []; + o.vallist = []; + + networks.forEach(net => { + const name = net.getName(); + const ifname = net.getIfname(); + if (name && !excludeInterfaces.includes(name)) { + o.value(name, ifname ? `${name} (${ifname})` : name); + } + }); + }).catch(error => { + console.error('Failed to get networks:', error); + }); +} + function createConfigSection(section, map, network) { const s = section; @@ -1087,6 +1104,20 @@ return view.extend({ }); }; + o = mainSection.taboption('additional', form.MultiValue, 'restart_ifaces', _('Interface for monitoring'), _('Select the WAN interfaces to be monitored')); + o.ucisection = 'main'; + o.default = 'wan'; + o.load = function (section_id) { + return getNetworkNetworks(this, section_id, ['lan', 'loopback']).then(() => { + return this.super('load', section_id); + }); + }; + + o = mainSection.taboption('additional', form.Flag, 'dont_touch_dhcp', _('Dont touch my DHCP!'), _('Podkop will not change the DHCP config')); + o.default = '0'; + o.rmempty = false; + o.ucisection = 'main'; + // Extra IPs and exclusions (main section) o = mainSection.taboption('basic', form.Flag, 'exclude_from_ip_enabled', _('IP for exclusion'), _('Specify local IP addresses that will never use the configured route')); o.default = '0'; diff --git a/podkop/files/etc/config/podkop b/podkop/files/etc/config/podkop index 1511b7a..059022a 100644 --- a/podkop/files/etc/config/podkop +++ b/podkop/files/etc/config/podkop @@ -36,4 +36,5 @@ config main 'main' option dns_rewrite_ttl '60' option cache_file '/tmp/cache.db' list iface 'br-lan' + list restart_ifaces 'wan' option ss_uot '0' \ No newline at end of file diff --git a/podkop/files/etc/init.d/podkop b/podkop/files/etc/init.d/podkop index c82f5d6..0eed045 100755 --- a/podkop/files/etc/init.d/podkop +++ b/podkop/files/etc/init.d/podkop @@ -6,13 +6,15 @@ USE_PROCD=1 script=$(readlink "$initscript") NAME="$(basename ${script:-$initscript})" config_load "$NAME" -RESOLV_CONF="/etc/resolv.conf" start_service() { echo "Start podkop" + config_get restart_ifaces "main" "restart_ifaces" + procd_open_instance - procd_set_param command /bin/sh -c "/usr/bin/podkop start" + procd_set_param command /usr/bin/podkop start + [ -z "$restart_ifaces" ] || procd_set_param netdev $restart_ifaces procd_set_param stdout 1 procd_set_param stderr 1 procd_close_instance @@ -22,17 +24,19 @@ stop_service() { /usr/bin/podkop stop } -restart_service() { - stop - start -} - reload_service() { - stop - start + /usr/bin/podkop reload > /dev/null 2>&1 } service_triggers() { echo "service_triggers start" - procd_add_config_trigger "config.change" "$NAME" "$initscript" reload 'on_config_change' + + config_get restart_ifaces "main" "restart_ifaces" + procd_open_trigger + procd_add_config_trigger "config.change" "$NAME" "$initscript" reload 'on_config_change' + + for iface in $restart_ifaces; do + procd_add_reload_interface_trigger $iface + done + procd_close_trigger } \ No newline at end of file diff --git a/podkop/files/usr/bin/podkop b/podkop/files/usr/bin/podkop index 4bd39d3..9a7c169 100755 --- a/podkop/files/usr/bin/podkop +++ b/podkop/files/usr/bin/podkop @@ -45,7 +45,7 @@ nolog() { echo -e "${CYAN}[$timestamp]${RESET} ${GREEN}$message${RESET}" } -start() { +start_main() { log "Starting podkop" # checking @@ -136,7 +136,12 @@ start() { sing_box_config_check /etc/init.d/sing-box start - /etc/init.d/sing-box enable + #/etc/init.d/sing-box enable + log "Nice" +} + +start() { + start_main config_get proxy_string "main" "proxy_string" config_get interface "main" "interface" @@ -150,7 +155,7 @@ start() { fi } -stop() { +stop_main() { log "Stopping the podkop" if [ -f /var/run/podkop_list_update.pid ]; then @@ -164,11 +169,6 @@ stop() { remove_cron_job - config_get_bool dont_touch_dhcp "main" "dont_touch_dhcp" "0" - if [ "$dont_touch_dhcp" -eq 0 ]; then - dnsmasq_restore - fi - rm -rf /tmp/podkop/*.lst log "Flush nft" @@ -188,8 +188,22 @@ stop() { log "Stop sing-box" /etc/init.d/sing-box stop - /etc/init.d/sing-box disable + #/etc/init.d/sing-box disable +} +stop() { + config_get_bool dont_touch_dhcp "main" "dont_touch_dhcp" "0" + if [ "$dont_touch_dhcp" -eq 0 ]; then + dnsmasq_restore + fi + + stop_main +} + +reload() { + log "Podkop reload" + stop_main + start_main } # Migrations and validation funcs @@ -592,10 +606,12 @@ sing_box_uci() { log "Change sing-box UCI config" fi - if grep -q '#\s*list ifaces' "$config"; then - sed -i '/ifaces/s/#//g' $config - log "Uncommented list ifaces" - fi + [ -f /etc/rc.d/S99sing-box ] && log "Disable sing-box" && /etc/init.d/sing-box disable + + # if grep -q '#\s*list ifaces' "$config"; then + # sed -i '/ifaces/s/#//g' $config + # log "Uncommented list ifaces" + # fi } add_socks5_for_section() { @@ -2156,9 +2172,8 @@ case "$1" in stop) stop ;; - restart) - stop - start + reload) + reload ;; main) main @@ -2218,7 +2233,7 @@ case "$1" in check_dns_available ;; *) - echo "Usage: $0 {start|stop|restart|reload|enable|disable|main|list_update|check_proxy|check_nft|check_github|check_logs|check_sing_box_connections|check_sing_box_logs|check_fakeip|check_dnsmasq|show_config|show_version|show_sing_box_config|show_luci_version|show_sing_box_version|show_system_info|get_status|get_sing_box_status|check_dns_available}" + echo "Usage: $0 {start|stop|reload|enable|disable|main|list_update|check_proxy|check_nft|check_github|check_logs|check_sing_box_connections|check_sing_box_logs|check_fakeip|check_dnsmasq|show_config|show_version|show_sing_box_config|show_luci_version|show_sing_box_version|show_system_info|get_status|get_sing_box_status|check_dns_available}" exit 1 ;; esac \ No newline at end of file