diff --git a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js index 16f71fd..d5ddc19 100644 --- a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js +++ b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js @@ -37,7 +37,7 @@ function createSectionContent(section) { _("Proxy Configuration URL"), _("vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links") ); - o.depends("proxy_config_type", "url"); + o.depends({ connection_type: "proxy", proxy_config_type: "url" }); o.rows = 5; // Enable soft wrapping for multi-line proxy URLs (e.g., for URLTest proxy links) o.wrap = "soft"; @@ -66,7 +66,7 @@ function createSectionContent(section) { _("Outbound Configuration"), _("Enter complete outbound configuration in JSON format"), ); - o.depends("proxy_config_type", "outbound"); + o.depends({ connection_type: "proxy", proxy_config_type: "outbound" }); o.rows = 10; o.validate = function (section_id, value) { // Optional @@ -89,7 +89,7 @@ function createSectionContent(section) { _("Subscription URL"), _("Enter the subscription URL to fetch proxy configurations from your provider"), ); - o.depends("proxy_config_type", "subscription"); + o.depends({ connection_type: "proxy", proxy_config_type: "subscription" }); o.placeholder = "https://example.com/api/sub"; o.rmempty = false; o.validate = function (section_id, value) { @@ -119,7 +119,7 @@ function createSectionContent(section) { o.value("12h", _("Every 12 hours")); o.value("1d", _("Every day")); o.default = "1h"; - o.depends("proxy_config_type", "subscription"); + o.depends({ connection_type: "proxy", proxy_config_type: "subscription" }); o = section.option( form.DynamicList, @@ -127,7 +127,7 @@ function createSectionContent(section) { _("Selector Proxy Links"), _("vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links") ); - o.depends("proxy_config_type", "selector"); + o.depends({ connection_type: "proxy", proxy_config_type: "selector" }); o.rmempty = false; o.validate = function (section_id, value) { // Optional @@ -150,7 +150,7 @@ function createSectionContent(section) { _("URLTest Proxy Links"), _("vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links") ); - o.depends("proxy_config_type", "urltest"); + o.depends({ connection_type: "proxy", proxy_config_type: "urltest" }); o.rmempty = false; o.validate = function (section_id, value) { // Optional @@ -178,8 +178,8 @@ function createSectionContent(section) { o.value("3m", _("Every 3 minutes")); o.value("5m", _("Every 5 minutes")); o.default = "3m"; - o.depends("proxy_config_type", "urltest"); - o.depends("proxy_config_type", "subscription"); + o.depends({ connection_type: "proxy", proxy_config_type: "urltest" }); + o.depends({ connection_type: "proxy", proxy_config_type: "subscription" }); o = section.option( form.Value, @@ -189,8 +189,8 @@ function createSectionContent(section) { ); o.default = "50"; o.rmempty = false; - o.depends("proxy_config_type", "urltest"); - o.depends("proxy_config_type", "subscription"); + o.depends({ connection_type: "proxy", proxy_config_type: "urltest" }); + o.depends({ connection_type: "proxy", proxy_config_type: "subscription" }); o.validate = function (section_id, value) { if (!value || value.length === 0) { return true; @@ -217,8 +217,8 @@ function createSectionContent(section) { o.value("https://connectivity-check.ubuntu.com", "https://connectivity-check.ubuntu.com (Ubuntu)") o.default = "https://www.gstatic.com/generate_204"; o.rmempty = false; - o.depends("proxy_config_type", "urltest"); - o.depends("proxy_config_type", "subscription"); + o.depends({ connection_type: "proxy", proxy_config_type: "urltest" }); + o.depends({ connection_type: "proxy", proxy_config_type: "subscription" }); o.validate = function (section_id, value) { if (!value || value.length === 0) { @@ -723,7 +723,10 @@ function createSectionContent(section) { "Make sure the selected port is not used by another service", ), ); - o.rmempty = false; + o.default = "2080"; + o.placeholder = "2080"; + o.datatype = "port"; + o.rmempty = true; o.depends("mixed_proxy_enabled", "1"); } diff --git a/podkop/files/usr/bin/podkop b/podkop/files/usr/bin/podkop index 7dd2c57..3e07bb1 100755 --- a/podkop/files/usr/bin/podkop +++ b/podkop/files/usr/bin/podkop @@ -78,23 +78,63 @@ check_requirements() { if has_outbound_section; then log "Outbound section found" "debug" else - log "Outbound section not found. Please check your configuration file (missing proxy_string, selector_proxy_links, urltest_proxy_links, outbound_json, or interface). Aborted." "error" + log "Outbound section not found. Please check your configuration file (missing proxy_string, selector_proxy_links, urltest_proxy_links, subscription_url, outbound_json, or interface according to connection_type/proxy_config_type). Aborted." "error" exit 1 fi } +section_has_configured_outbound() { + local section="$1" + local connection_type proxy_config_type + + config_get connection_type "$section" "connection_type" + + case "$connection_type" in + proxy) + config_get proxy_config_type "$section" "proxy_config_type" "url" + + case "$proxy_config_type" in + url) + local proxy_string + config_get proxy_string "$section" "proxy_string" + [ -n "$proxy_string" ] && return 0 + ;; + selector) + local selector_proxy_links + config_get selector_proxy_links "$section" "selector_proxy_links" + [ -n "$selector_proxy_links" ] && return 0 + ;; + urltest) + local urltest_proxy_links + config_get urltest_proxy_links "$section" "urltest_proxy_links" + [ -n "$urltest_proxy_links" ] && return 0 + ;; + outbound) + local outbound_json + config_get outbound_json "$section" "outbound_json" + [ -n "$outbound_json" ] && return 0 + ;; + subscription) + local subscription_url + config_get subscription_url "$section" "subscription_url" + [ -n "$subscription_url" ] && return 0 + ;; + esac + ;; + vpn) + local interface + config_get interface "$section" "interface" + [ -n "$interface" ] && return 0 + ;; + esac + + return 1 +} + _check_outbound_section() { local section="$1" - local proxy_string interface outbound_json urltest_proxy_links - config_get proxy_string "$section" "proxy_string" - config_get selector_proxy_links "$section" "selector_proxy_links" - config_get urltest_proxy_links "$section" "urltest_proxy_links" - config_get outbound_json "$section" "outbound_json" - config_get interface "$section" "interface" - - if [ -n "$proxy_string" ] || [ -n "$selector_proxy_links" ] || [ -n "$urltest_proxy_links" ] || - [ -n "$outbound_json" ] || [ -n "$interface" ]; then + if section_has_configured_outbound "$section"; then section_exists=0 fi } @@ -482,7 +522,12 @@ remove_cron_job() { add_subscription_cron_job() { local section="$1" - local proxy_config_type subscription_update_interval cron_job + local connection_type proxy_config_type subscription_update_interval cron_job + + config_get connection_type "$section" "connection_type" + if [ "$connection_type" != "proxy" ]; then + return + fi config_get proxy_config_type "$section" "proxy_config_type" if [ "$proxy_config_type" != "subscription" ]; then @@ -599,7 +644,13 @@ subscription_update() { _check_subscription_section() { local section="$1" - local proxy_config_type + local connection_type proxy_config_type + + config_get connection_type "$section" "connection_type" + if [ "$connection_type" != "proxy" ]; then + return + fi + config_get proxy_config_type "$section" "proxy_config_type" if [ "$proxy_config_type" = "subscription" ]; then has_subscription=1 @@ -614,7 +665,13 @@ subscription_update() { _update_subscription_for_section() { local section="$1" - local proxy_config_type subscription_url subscription_json_path + local connection_type proxy_config_type subscription_url subscription_json_path + + config_get connection_type "$section" "connection_type" + if [ "$connection_type" != "proxy" ]; then + return + fi + config_get proxy_config_type "$section" "proxy_config_type" if [ "$proxy_config_type" != "subscription" ]; then @@ -1385,7 +1442,19 @@ configure_section_mixed_proxy() { log "Could not determine the listening IP address for the Mixed Proxy. The proxy will not be created." "warn" return 1 fi - config_get mixed_proxy_port "$section" "mixed_proxy_port" + config_get mixed_proxy_port "$section" "mixed_proxy_port" "2080" + + case "$mixed_proxy_port" in + '' | *[!0-9]*) + log "Invalid mixed_proxy_port '$mixed_proxy_port' for section '$section'. Falling back to 2080." "warn" + mixed_proxy_port="2080" + ;; + esac + + if [ "$mixed_proxy_port" -lt 1 ] || [ "$mixed_proxy_port" -gt 65535 ]; then + log "mixed_proxy_port '$mixed_proxy_port' for section '$section' is out of range (1-65535). Falling back to 2080." "warn" + mixed_proxy_port="2080" + fi if [ "$mixed_inbound_enabled" -eq 1 ]; then mixed_inbound_tag="$(get_inbound_tag_by_section "$section-mixed")" mixed_outbound_tag="$(get_outbound_tag_by_section "$section")" @@ -1686,11 +1755,8 @@ get_download_detour_tag() { _determine_first_outbound_section() { local section="$1" - local connection_type - config_get connection_type "$section" "connection_type" - - if [ "$connection_type" = "proxy" ] || [ "$connection_type" = "vpn" ]; then - [ -z "$first_section" ] && first_section="$1" + if section_has_configured_outbound "$section"; then + [ -z "$first_section" ] && first_section="$section" fi }