diff --git a/base/pref-new.yml b/base/pref-new.yml index e9fd9d6..92a41be 100644 --- a/base/pref-new.yml +++ b/base/pref-new.yml @@ -62,6 +62,7 @@ managed_config: surge_external_proxy: surge_ssr_path: "" # /usr/bin/ssr-local + resolve_hostname: true emojis: add_emoji: true diff --git a/base/pref.ini b/base/pref.ini index 5bd8001..c538e86 100644 --- a/base/pref.ini +++ b/base/pref.ini @@ -132,6 +132,7 @@ quanx_device_id= [surge_external_proxy] ;surge_ssr_path=/usr/bin/ssr-local +resolve_hostname=true [emojis] add_emoji=true diff --git a/src/interfaces.cpp b/src/interfaces.cpp index af87266..db9f222 100644 --- a/src/interfaces.cpp +++ b/src/interfaces.cpp @@ -30,7 +30,7 @@ std::string listen_address = "127.0.0.1", default_url, insert_url, managed_confi int listen_port = 25500, max_pending_connections = 10, max_concurrent_threads = 4; bool prepend_insert_url = true; bool api_mode = true, write_managed_config = false, enable_rule_generator = true, update_ruleset_on_request = false, overwrite_original_rules = true; -bool print_debug_info = false, cfw_child_process = false, append_userinfo = true, enable_base_gen = false, async_fetch_ruleset = false; +bool print_debug_info = false, cfw_child_process = false, append_userinfo = true, enable_base_gen = false, async_fetch_ruleset = false, surge_ssr_resolve = true; std::string access_token, base_path = "base"; extern std::string custom_group; extern int global_log_level; @@ -676,7 +676,10 @@ void readYAMLConf(YAML::Node &node) } if(node["surge_external_proxy"].IsDefined()) + { node["surge_external_proxy"]["surge_ssr_path"] >> surge_ssr_path; + node["surge_external_proxy"]["resolve_hostname"] >> surge_ssr_resolve; + } if(node["emojis"].IsDefined()) { @@ -869,6 +872,7 @@ void readConf() { ini.EnterSection("surge_external_proxy"); ini.GetIfExist("surge_ssr_path", surge_ssr_path); + ini.GetBoolIfExist("resolve_hostname", surge_ssr_resolve); } if(ini.SectionExist("node_pref")) diff --git a/src/subexport.cpp b/src/subexport.cpp index c9a375d..56acc3a 100644 --- a/src/subexport.cpp +++ b/src/subexport.cpp @@ -24,7 +24,7 @@ #include "yamlcpp_extra.h" #include "interfaces.h" -extern bool api_mode; +extern bool api_mode, surge_ssr_resolve; extern string_array ss_ciphers, ssr_ciphers; extern size_t max_allowed_rules; @@ -1611,8 +1611,11 @@ std::string netchToSurge(std::vector &nodes, const std::string &base_c { return std::move(a) + "\", args=\"" + std::move(b); }); - proxy += "\", local-port=" + std::to_string(local_port) + ", addresses=" + ((isIPv4(hostname) || isIPv6(hostname)) ? hostname : hostnameToIPAddr(hostname)); - //proxy += "\", local-port=" + std::to_string(local_port); + proxy += "\", local-port=" + std::to_string(local_port); + if(isIPv4(hostname) || isIPv6(hostname)) + proxy += ", addresses=" + hostname; + else if(surge_ssr_resolve) + proxy += ", addresses=" + hostnameToIPAddr(hostname); local_port++; break; case SPEEDTEST_MESSAGE_FOUNDSOCKS: diff --git a/src/templates.cpp b/src/templates.cpp index b6f560d..6e89ce5 100644 --- a/src/templates.cpp +++ b/src/templates.cpp @@ -232,8 +232,8 @@ std::string findFileName(const std::string &path) pos = 0; } string_size pos2 = path.rfind('.'); - if(pos2 < pos) - pos2 = path.size() - 1; + if(pos2 < pos || pos2 == path.npos) + pos2 = path.size(); return path.substr(pos + 1, pos2 - pos - 1); } @@ -246,7 +246,7 @@ int renderClashScript(YAML::Node &base_rule, std::vector &rules string_array vArray, groups; string_map keywords, urls, names; std::map has_domain, has_ipcidr; - std::map ruleset_interval; + std::map ruleset_interval, rule_type; string_array rules; int index = 0; @@ -293,6 +293,7 @@ int renderClashScript(YAML::Node &base_rule, std::vector &rules rule_name = old_rule_name + "_" + std::to_string(idx++); names[rule_name] = rule_group; urls[rule_name] = "*" + rule_path; + rule_type[rule_name] = x.rule_type; ruleset_interval[rule_name] = x.update_interval; switch(x.rule_type) { @@ -400,13 +401,31 @@ int renderClashScript(YAML::Node &base_rule, std::vector &rules if(clash_classical_ruleset) { std::string yaml_key = x; + + switch(rule_type[yaml_key]) + { + case RULESET_CLASH_CLASSICAL: + base_rule["rule-providers"][yaml_key]["behavior"] = "classical"; + base_rule["rule-providers"][yaml_key]["path"] = "./providers/rule-provider_" + x + "_classical.yaml"; + break; + case RULESET_CLASH_DOMAIN: + yaml_key += "_domain"; + base_rule["rule-providers"][yaml_key]["behavior"] = "domain"; + base_rule["rule-providers"][yaml_key]["path"] = "./providers/rule-provider_" + x + "_domain.yaml"; + break; + case RULESET_CLASH_IPCIDR: + yaml_key += "_ipcidr"; + base_rule["rule-providers"][yaml_key]["behavior"] = "ipcidr"; + base_rule["rule-providers"][yaml_key]["path"] = "./providers/rule-provider_" + x + "_ipcidr.yaml"; + break; + } base_rule["rule-providers"][yaml_key]["type"] = "http"; - base_rule["rule-providers"][yaml_key]["behavior"] = "classical"; + if(url[0] == '*') base_rule["rule-providers"][yaml_key]["url"] = url.substr(1); else base_rule["rule-providers"][yaml_key]["url"] = remote_path_prefix + "/getruleset?type=6&url=" + urlsafe_base64_encode(url); - base_rule["rule-providers"][yaml_key]["path"] = "./providers/rule-provider_" + x + "_classical.yaml"; + if(interval) base_rule["rule-providers"][yaml_key]["interval"] = interval; }