Fix implementation of using Clash rule-providers as rule sources

Add option for whether to try to resolve hostnames when generating ShadowsocksR nodes in Surge configurations.
This commit is contained in:
Tindy X
2020-07-10 22:38:17 +08:00
parent c02db5a8f6
commit 081b5adb71
5 changed files with 37 additions and 9 deletions

View File

@@ -62,6 +62,7 @@ managed_config:
surge_external_proxy:
surge_ssr_path: "" # /usr/bin/ssr-local
resolve_hostname: true
emojis:
add_emoji: true

View File

@@ -132,6 +132,7 @@ quanx_device_id=
[surge_external_proxy]
;surge_ssr_path=/usr/bin/ssr-local
resolve_hostname=true
[emojis]
add_emoji=true

View File

@@ -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"))

View File

@@ -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<nodeInfo> &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:

View File

@@ -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<ruleset_content> &rules
string_array vArray, groups;
string_map keywords, urls, names;
std::map<std::string, bool> has_domain, has_ipcidr;
std::map<std::string, int> ruleset_interval;
std::map<std::string, int> ruleset_interval, rule_type;
string_array rules;
int index = 0;
@@ -293,6 +293,7 @@ int renderClashScript(YAML::Node &base_rule, std::vector<ruleset_content> &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<ruleset_content> &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;
}