small-package/luci-app-openclash/root/usr/share/openclash/yml_rules_change.sh

1153 lines
50 KiB
Bash

#!/bin/sh
. /lib/functions.sh
. /usr/share/openclash/ruby.sh
. /usr/share/openclash/log.sh
LOGTIME=$(echo $(date "+%Y-%m-%d %H:%M:%S"))
LOG_FILE="/tmp/openclash.log"
RULE_PROVIDER_FILE="/tmp/yaml_rule_provider.yaml"
GAME_RULE_FILE="/tmp/yaml_game_rule.yaml"
github_address_mod=$(uci -q get openclash.config.github_address_mod || echo 0)
urltest_address_mod=$(uci -q get openclash.config.urltest_address_mod || echo 0)
tolerance=$(uci -q get openclash.config.tolerance || echo 0)
urltest_interval_mod=$(uci -q get openclash.config.urltest_interval_mod || echo 0)
CONFIG_NAME="$5"
#处理自定义规则集
yml_set_custom_rule_provider()
{
local section="$1"
local enabled name config type behavior path url interval group position
config_get_bool "enabled" "$section" "enabled" "1"
config_get "name" "$section" "name" ""
config_get "config" "$section" "config" ""
config_get "type" "$section" "type" ""
config_get "behavior" "$section" "behavior" ""
config_get "path" "$section" "path" ""
config_get "url" "$section" "url" ""
config_get "interval" "$section" "interval" ""
config_get "group" "$section" "group" ""
config_get "position" "$section" "position" ""
if [ "$enabled" = "0" ]; then
return
fi
if [ -n "$(grep "$url" "$RULE_PROVIDER_FILE" 2>/dev/null)" ] && [ -n "$url" ]; then
return
fi
if [ -n "$config" ] && [ "$config" != "$CONFIG_NAME" ] && [ "$config" != "all" ]; then
return
fi
if [ -z "$name" ] || [ -z "$type" ] || [ -z "$behavior" ]; then
return
fi
if [ "$type" = "http" ] && [ -z "$url" ]; then
return
fi
if [ "$path" != "./rule_provider/$name.yaml" ] && [ "$type" = "http" ]; then
path="./rule_provider/$name.yaml"
elif [ -z "$path" ]; then
return
fi
if [ -n "$(grep "$path" "$RULE_PROVIDER_FILE" 2>/dev/null)" ]; then
return
fi
if [ -z "$interval" ] && [ "$type" = "http" ]; then
interval=86400
fi
cat >> "$RULE_PROVIDER_FILE" <<-EOF
$name:
type: $type
behavior: $behavior
path: $path
EOF
if [ "$type" = "http" ]; then
cat >> "$RULE_PROVIDER_FILE" <<-EOF
url: $url
interval: $interval
EOF
fi
yml_rule_set_add "$name" "$group" "$position"
}
yml_rule_set_add()
{
if [ -z "$3" ]; then
return
fi
if [ "$3" == "1" ]; then
if [ -z "$(grep "^ \{0,\}rules:$" /tmp/yaml_rule_set_bottom_custom.yaml 2>/dev/null)" ]; then
echo "rules:" > "/tmp/yaml_rule_set_bottom_custom.yaml"
fi
echo "- RULE-SET,${1},${2}" >> "/tmp/yaml_rule_set_bottom_custom.yaml"
else
if [ -z "$(grep "^ \{0,\}rules:$" /tmp/yaml_rule_set_top_custom.yaml 2>/dev/null)" ]; then
echo "rules:" > "/tmp/yaml_rule_set_top_custom.yaml"
fi
echo "- RULE-SET,${1},${2}" >> "/tmp/yaml_rule_set_top_custom.yaml"
fi
}
yml_gen_rule_provider_file()
{
if [ -z "$1" ]; then
return
fi
RULE_PROVIDER_FILE_NAME=$(grep "^$1," /usr/share/openclash/res/rule_providers.list |awk -F ',' '{print $6}' 2>/dev/null)
if [ -z "$RULE_PROVIDER_FILE_NAME" ]; then
RULE_PROVIDER_FILE_NAME=$(grep "^$1," /usr/share/openclash/res/rule_providers.list |awk -F ',' '{print $5}' 2>/dev/null)
fi
RULE_PROVIDER_FILE_BEHAVIOR=$(grep ",$RULE_PROVIDER_FILE_NAME$" /usr/share/openclash/res/rule_providers.list |awk -F ',' '{print $3}' 2>/dev/null)
RULE_PROVIDER_FILE_PATH="/etc/openclash/rule_provider/$RULE_PROVIDER_FILE_NAME"
RULE_PROVIDER_FILE_URL_PATH="$(grep ",$RULE_PROVIDER_FILE_NAME$" /usr/share/openclash/res/rule_providers.list |awk -F ',' '{print $4$5}' 2>/dev/null)"
if [ "$github_address_mod" -eq 0 ]; then
RULE_PROVIDER_FILE_URL="https://raw.githubusercontent.com/${RULE_PROVIDER_FILE_URL_PATH}"
else
if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then
RULE_PROVIDER_FILE_URL="https://cdn.jsdelivr.net/gh/"$(echo "$RULE_PROVIDER_FILE_URL_PATH" |awk -F '/master' '{print $1}' 2>/dev/null)"@master"$(echo "$RULE_PROVIDER_FILE_URL_PATH" |awk -F 'master' '{print $2}')""
elif [ "$github_address_mod" == "https://raw.fastgit.org/" ]; then
RULE_PROVIDER_FILE_URL="https://raw.fastgit.org/"$(echo "$RULE_PROVIDER_FILE_URL_PATH" |awk -F '/master' '{print $1}' 2>/dev/null)"/master"$(echo "$RULE_PROVIDER_FILE_URL_PATH" |awk -F 'master' '{print $2}')""
else
RULE_PROVIDER_FILE_URL="${github_address_mod}https://raw.githubusercontent.com/${RULE_PROVIDER_FILE_URL_PATH}"
fi
fi
if [ -n "$(grep "$RULE_PROVIDER_FILE_URL" $RULE_PROVIDER_FILE 2>/dev/null)" ]; then
return
fi
cat >> "$RULE_PROVIDER_FILE" <<-EOF
$1:
type: http
behavior: $RULE_PROVIDER_FILE_BEHAVIOR
path: $RULE_PROVIDER_FILE_PATH
url: $RULE_PROVIDER_FILE_URL
EOF
if [ -z "$3" ]; then
cat >> "$RULE_PROVIDER_FILE" <<-EOF
interval=86400
EOF
else
cat >> "$RULE_PROVIDER_FILE" <<-EOF
interval: $3
EOF
fi
yml_rule_set_add "$1" "$2" "$4"
}
yml_get_rule_provider()
{
local section="$1"
local enabled group config interval position
config_get_bool "enabled" "$section" "enabled" "1"
config_get "group" "$section" "group" ""
config_get "config" "$section" "config" ""
config_get "interval" "$section" "interval" ""
config_get "position" "$section" "position" ""
if [ "$enabled" = "0" ]; then
return
fi
if [ -n "$config" ] && [ "$config" != "$CONFIG_NAME" ] && [ "$config" != "all" ]; then
return
fi
if [ -z "$group" ]; then
return
fi
config_list_foreach "$section" "rule_name" yml_gen_rule_provider_file "$group" "$interval" "$position"
}
get_rule_file()
{
if [ -z "$1" ]; then
return
fi
GAME_RULE_FILE_NAME=$(grep "^$1," /usr/share/openclash/res/game_rules.list |awk -F ',' '{print $3}' 2>/dev/null)
if [ -z "$GAME_RULE_FILE_NAME" ]; then
GAME_RULE_FILE_NAME=$(grep "^$1," /usr/share/openclash/res/game_rules.list |awk -F ',' '{print $2}' 2>/dev/null)
fi
GAME_RULE_PATH="./game_rules/$GAME_RULE_FILE_NAME"
yml_rule_set_add "$1" "$2" "1"
cat >> "$RULE_PROVIDER_FILE" <<-EOF
$1:
type: file
behavior: ipcidr
path: '${GAME_RULE_PATH}'
EOF
}
yml_game_rule_get()
{
local section="$1"
local enabled group config
config_get_bool "enabled" "$section" "enabled" "1"
config_get "group" "$section" "group" ""
config_get "config" "$section" "config" ""
if [ "$enabled" = "0" ]; then
return
fi
if [ -n "$config" ] && [ "$config" != "$CONFIG_NAME" ] && [ "$config" != "all" ]; then
return
fi
if [ -z "$group" ]; then
return
fi
config_list_foreach "$section" "rule_name" get_rule_file "$group"
}
yml_rule_group_get()
{
local section="$1"
local enabled group config
config_get_bool "enabled" "$section" "enabled" "1"
config_get "group" "$section" "group" ""
config_get "config" "$section" "config" ""
if [ "$enabled" = "0" ]; then
return
fi
if [ -n "$config" ] && [ "$config" != "$CONFIG_NAME" ] && [ "$config" != "all" ]; then
return
fi
if [ -z "$group" ] || [ "$group" = "DIRECT" ] || [ "$group" = "REJECT" ]; then
return
fi
group_check=$(ruby -ryaml -rYAML -I "/usr/share/openclash" -E UTF-8 -e "
begin
Thread.new{
Value = YAML.load_file('$2');
Value['proxy-groups'].each{
|x|
if x['name'] == '$group' then
if (x.key?('use') and not x['use'].to_a.empty?) or (x.key?('proxies') and not x['proxies'].to_a.empty?) then
puts 'return'
end;
end;
};
}.join;
rescue Exception => e
puts 'return'
end;" 2>/dev/null)
if [ "$group_check" != "return" ]; then
/usr/share/openclash/yml_groups_set.sh >/dev/null 2>&1 "$group"
fi
}
yml_other_set()
{
config_load "openclash"
config_foreach yml_get_rule_provider "rule_provider_config"
config_foreach yml_set_custom_rule_provider "rule_providers"
config_foreach yml_game_rule_get "game_config"
#添加缺失的节点与策略组
config_foreach yml_rule_group_get "rule_provider_config" "$3"
config_foreach yml_rule_group_get "rule_providers" "$3"
config_foreach yml_rule_group_get "game_config" "$3"
local fake_ip="$(echo "${12}" |awk -F '/' '{print $1}')"
ruby -ryaml -rYAML -I "/usr/share/openclash" -E UTF-8 -e "
begin
Value = YAML.load_file('$3');
rescue Exception => e
puts '${LOGTIME} Error: Load File Failed,【' + e.message + '】';
end;
begin
Thread.new{
if $4 == 1 then
Value['rules']=Value['rules'].to_a.insert(0,
'DOMAIN-SUFFIX,awesome-hd.me,DIRECT',
'DOMAIN-SUFFIX,broadcasthe.net,DIRECT',
'DOMAIN-SUFFIX,chdbits.co,DIRECT',
'DOMAIN-SUFFIX,classix-unlimited.co.uk,DIRECT',
'DOMAIN-SUFFIX,empornium.me,DIRECT',
'DOMAIN-SUFFIX,gazellegames.net,DIRECT',
'DOMAIN-SUFFIX,hdchina.org,DIRECT',
'DOMAIN-SUFFIX,hdsky.me,DIRECT',
'DOMAIN-SUFFIX,icetorrent.org,DIRECT',
'DOMAIN-SUFFIX,jpopsuki.eu,DIRECT',
'DOMAIN-SUFFIX,keepfrds.com,DIRECT',
'DOMAIN-SUFFIX,madsrevolution.net,DIRECT',
'DOMAIN-SUFFIX,m-team.cc,DIRECT',
'DOMAIN-SUFFIX,nanyangpt.com,DIRECT',
'DOMAIN-SUFFIX,ncore.cc,DIRECT',
'DOMAIN-SUFFIX,open.cd,DIRECT',
'DOMAIN-SUFFIX,ourbits.club,DIRECT',
'DOMAIN-SUFFIX,passthepopcorn.me,DIRECT',
'DOMAIN-SUFFIX,privatehd.to,DIRECT',
'DOMAIN-SUFFIX,redacted.ch,DIRECT',
'DOMAIN-SUFFIX,springsunday.net,DIRECT',
'DOMAIN-SUFFIX,tjupt.org,DIRECT',
'DOMAIN-SUFFIX,totheglory.im,DIRECT',
'DOMAIN-SUFFIX,smtp,DIRECT',
'DOMAIN-KEYWORD,announce,DIRECT',
'DOMAIN-KEYWORD,torrent,DIRECT',
'DOMAIN-KEYWORD,tracker,DIRECT'
);
match_group=Value['rules'].grep(/(MATCH|FINAL)/)[0];
if not match_group.nil? then
common_port_group=match_group.split(',')[2] or common_port_group=match_group.split(',')[1];
if not common_port_group.nil? then
ruby_add_index = Value['rules'].index(Value['rules'].grep(/(MATCH|FINAL)/).first);
ruby_add_index ||= -1;
Value['rules']=Value['rules'].to_a.insert(ruby_add_index,
'PROCESS-NAME,aria2c,DIRECT',
'PROCESS-NAME,BitComet,DIRECT',
'PROCESS-NAME,fdm,DIRECT',
'PROCESS-NAME,NetTransport,DIRECT',
'PROCESS-NAME,qbittorrent,DIRECT',
'PROCESS-NAME,Thunder,DIRECT',
'PROCESS-NAME,transmission-daemon,DIRECT',
'PROCESS-NAME,transmission-qt,DIRECT',
'PROCESS-NAME,uTorrent,DIRECT',
'PROCESS-NAME,WebTorrent,DIRECT',
'PROCESS-NAME,aria2c,DIRECT',
'PROCESS-NAME,fdm,DIRECT',
'PROCESS-NAME,Folx,DIRECT',
'PROCESS-NAME,NetTransport,DIRECT',
'PROCESS-NAME,qbittorrent,DIRECT',
'PROCESS-NAME,Thunder,DIRECT',
'PROCESS-NAME,Transmission,DIRECT',
'PROCESS-NAME,transmission,DIRECT',
'PROCESS-NAME,uTorrent,DIRECT',
'PROCESS-NAME,WebTorrent,DIRECT',
'PROCESS-NAME,WebTorrent Helper,DIRECT',
'PROCESS-NAME,v2ray,DIRECT',
'PROCESS-NAME,ss-local,DIRECT',
'PROCESS-NAME,ssr-local,DIRECT',
'PROCESS-NAME,ss-redir,DIRECT',
'PROCESS-NAME,ssr-redir,DIRECT',
'PROCESS-NAME,ss-server,DIRECT',
'PROCESS-NAME,trojan-go,DIRECT',
'PROCESS-NAME,xray,DIRECT',
'PROCESS-NAME,hysteria,DIRECT',
'PROCESS-NAME,UUBooster,DIRECT',
'PROCESS-NAME,uugamebooster,DIRECT',
'DST-PORT,80,' + common_port_group,
'DST-PORT,443,' + common_port_group,
'DST-PORT,22,' + common_port_group
);
end;
end
Value['rules'].to_a.collect!{|x|x.to_s.gsub(/(^MATCH.*|^FINAL.*)/, 'MATCH,DIRECT')};
end;
}.join;
rescue Exception => e
puts '${LOGTIME} Error: Set BT/P2P DIRECT Rules Failed,【' + e.message + '】';
end;
begin
Thread.new{
if $6 == 0 and ${10} != 2 then
if Value.has_key?('rules') and not Value['rules'].to_a.empty? then
if Value['rules'].to_a.grep(/(?=.*SRC-IP-CIDR,'${fake_ip}')/).empty? then
Value['rules']=Value['rules'].to_a.insert(0,'SRC-IP-CIDR,${12},DIRECT');
end
if Value['rules'].to_a.grep(/(?=.*SRC-IP-CIDR,'$7')/).empty? and not '$7'.empty? then
Value['rules']=Value['rules'].to_a.insert(0,'SRC-IP-CIDR,$7/32,DIRECT');
end;
else
Value['rules']=['SRC-IP-CIDR,${12},DIRECT','SRC-IP-CIDR,$7/32,DIRECT'];
end;
elsif Value.has_key?('rules') and not Value['rules'].to_a.empty? then
Value['rules'].delete('SRC-IP-CIDR,${12},DIRECT');
Value['rules'].delete('SRC-IP-CIDR,$7/32,DIRECT');
end;
}.join;
rescue Exception => e
puts '${LOGTIME} Error: Set Router Self Proxy Rule Failed,【' + e.message + '】';
end
#处理规则集
begin
Thread.new{
if File::exist?('$RULE_PROVIDER_FILE') then
Value_1 = YAML.load_file('$RULE_PROVIDER_FILE');
if Value.has_key?('rule-providers') and not Value['rule-providers'].to_a.empty? then
Value['rule-providers'].merge!(Value_1);
else
Value['rule-providers']=Value_1;
end;
end;
}.join;
rescue Exception => e
puts '${LOGTIME} Error: Custom Rule Provider Merge Failed,【' + e.message + '】';
end;
begin
Thread.new{
if Value.has_key?('rules') and not Value['rules'].to_a.empty? then
if File::exist?('/tmp/yaml_rule_set_bottom_custom.yaml') then
if $4 != 1 then
ruby_add_index = Value['rules'].index(Value['rules'].grep(/(GEOIP|MATCH|FINAL)/).first);
else
if Value['rules'].grep(/GEOIP/)[0].nil? or Value['rules'].grep(/GEOIP/)[0].empty? then
ruby_add_index = Value['rules'].index(Value['rules'].grep(/DST-PORT,80/).last);
ruby_add_index ||= Value['rules'].index(Value['rules'].grep(/(MATCH|FINAL)/).first);
else
ruby_add_index = Value['rules'].index(Value['rules'].grep(/GEOIP/).first);
end;
end;
ruby_add_index ||= -1;
Value_1 = YAML.load_file('/tmp/yaml_rule_set_bottom_custom.yaml');
if ruby_add_index != -1 then
Value_1['rules'].uniq.reverse.each{|x| Value['rules'].insert(ruby_add_index,x)};
else
Value_1['rules'].uniq.each{|x| Value['rules'].insert(ruby_add_index,x)};
end;
end;
if File::exist?('/tmp/yaml_rule_set_top_custom.yaml') then
Value_1 = YAML.load_file('/tmp/yaml_rule_set_top_custom.yaml');
if Value['rules'].to_a.grep(/(?=.*'${fake_ip}')(?=.*REJECT)/).empty? then
Value_1['rules'].uniq.reverse.each{|x| Value['rules'].insert(0,x)};
else
ruby_add_index = Value['rules'].index(Value['rules'].grep(/(?=.*'${fake_ip}')(?=.*REJECT)/).first);
Value_1['rules'].uniq.reverse.each{|x| Value['rules'].insert(ruby_add_index + 1,x)};
end;
end;
else
if File::exist?('/tmp/yaml_rule_set_top_custom.yaml') then
Value['rules'] = YAML.load_file('/tmp/yaml_rule_set_top_custom.yaml')['rules'].uniq;
end;
if File::exist?('/tmp/yaml_rule_set_bottom_custom.yaml') then
Value_1 = YAML.load_file('/tmp/yaml_rule_set_bottom_custom.yaml');
if File::exist?('/tmp/yaml_rule_set_top_custom.yaml') then
Value['rules'] = Value['rules'] | Value_1['rules'].uniq;
else
Value['rules'] = Value_1['rules'].uniq;
end;
end;
end;
}.join;
rescue Exception => e
puts '${LOGTIME} Error: Rule Set Add Failed,【' + e.message + '】';
end;
begin
Thread.new{
if File::exist?('/tmp/yaml_groups.yaml') or File::exist?('/tmp/yaml_servers.yaml') or File::exist?('/tmp/yaml_provider.yaml') then
if File::exist?('/tmp/yaml_groups.yaml') then
Value_1 = YAML.load_file('/tmp/yaml_groups.yaml');
if Value.has_key?('proxy-groups') and not Value['proxy-groups'].to_a.empty? then
Value['proxy-groups'] = Value['proxy-groups'] + Value_1;
Value['proxy-groups'].uniq;
else
Value['proxy-groups'] = Value_1;
end;
end;
if File::exist?('/tmp/yaml_servers.yaml') then
Value_2 = YAML.load_file('/tmp/yaml_servers.yaml');
if Value.has_key?('proxies') and not Value['proxies'].to_a.empty? then
Value['proxies'] = Value['proxies'] + Value_2['proxies'];
Value['proxies'].uniq;
else
Value['proxies']=Value_2['proxies'];
end
end;
if File::exist?('/tmp/yaml_provider.yaml') then
Value_3 = YAML.load_file('/tmp/yaml_provider.yaml');
if Value.has_key?('proxy-providers') and not Value['proxy-providers'].to_a.empty? then
Value['proxy-providers'].merge!(Value_3['proxy-providers']);
Value['proxy-providers'].uniq;
else
Value['proxy-providers']=Value_3['proxy-providers'];
end;
end;
end;
}.join;
rescue Exception => e
puts '${LOGTIME} Error: Game Proxy Merge Failed,【' + e.message + '】';
end;
begin
Thread.new{
if $2 == 1 then
#script
if ${10} != 1 then
for i in ['/etc/openclash/custom/openclash_custom_rules.list','/etc/openclash/custom/openclash_custom_rules_2.list'] do
if File::exist?(i) then
Value_1 = YAML.load_file(i);
if Value_1 != false then
if Value_1.class.to_s == 'Hash' then
if Value_1['script'] and Value_1['script'].class.to_s != 'Array' then
if Value.key?('script') and not Value_1['script'].to_a.empty? then
if Value['script'].key?('code') and Value_1['script'].key?('code') then
if not Value['script']['code'].include?('def main(ctx, metadata):') then
Value['script']['code'] = Value_1['script']['code'];
else
if i == '/etc/openclash/custom/openclash_custom_rules.list' then
if not Value_1['script']['code'].include?('def main(ctx, metadata):') then
Value['script']['code'].gsub!('def main(ctx, metadata):', \"def main(ctx, metadata):\n\" + Value_1['script']['code']);
else
Value['script']['code'].gsub!('def main(ctx, metadata):', Value_1['script']['code']);
end;
else
insert_index = Value['script']['code'].index(/ctx.geoip/);
insert_index ||= Value['script']['code'].rindex(/return/);
insert_index ||= -1;
if insert_index != -1 then
insert_index = Value['script']['code'].rindex(\"\n\", insert_index) + 1;
end
if not Value_1['script']['code'].include?('def main(ctx, metadata):') then
Value['script']['code'].insert(insert_index, Value_1['script']['code']);
else
Value['script']['code'].insert(insert_index, Value_1['script']['code'].gsub('def main(ctx, metadata):', ''));
end;
end;
end;
elsif Value_1['script'].key?('code') then
Value['script']['code'] = Value_1['script']['code'];
end;
if Value['script'].key?('shortcuts') and Value_1['script'].key?('shortcuts') and not Value_1['script']['shortcuts'].to_a.empty? then
Value['script']['shortcuts'].merge!(Value_1['script']['shortcuts']).uniq;
elsif Value_1['script'].key?('shortcuts') and not Value_1['script']['shortcuts'].to_a.empty? then
Value['script']['shortcuts'] = Value_1['script']['shortcuts'];
end;
else
Value['script'] = Value_1['script'];
end;
end;
end;
end;
end;
end;
end;
#rules
if Value.has_key?('rules') and not Value['rules'].to_a.empty? then
if File::exist?('/etc/openclash/custom/openclash_custom_rules.list') then
Value_1 = YAML.load_file('/etc/openclash/custom/openclash_custom_rules.list');
if Value_1 != false then
if Value_1.class.to_s == 'Hash' then
if not Value_1['rules'].to_a.empty? and Value_1['rules'].class.to_s == 'Array' then
Value_2 = Value_1['rules'].to_a.reverse!;
end;
elsif Value_1.class.to_s == 'Array' then
Value_2 = Value_1.reverse!;
end;
if defined? Value_2 then
Value_2.each{|x|
if ${10} != 1 then
if x =~ /(^GEOSITE,|^AND,|^OR,|^NOT,|^IP-SUFFIX,|^SRC-IP-SUFFIX,|^IN-TYPE,|^SUB-RULE,|PORT,[0-9]+\/+|PORT,[0-9]+-+)/ or x.split(',')[-1] == 'tcp' or x.split(',')[-1] == 'udp' then
puts '${LOGTIME} Warning: Skip the Custom Rule that Core not Support【' + x + '】'
next
end;
end;
Value['rules'].insert(0,x);
};
Value['rules'] = Value['rules'].uniq;
end;
end;
end;
if File::exist?('/etc/openclash/custom/openclash_custom_rules_2.list') then
Value_3 = YAML.load_file('/etc/openclash/custom/openclash_custom_rules_2.list');
if Value_3 != false then
if Value['rules'].grep(/GEOIP/)[0].nil? or Value['rules'].grep(/GEOIP/)[0].empty? then
ruby_add_index = Value['rules'].index(Value['rules'].grep(/DST-PORT,80/).last);
ruby_add_index ||= Value['rules'].index(Value['rules'].grep(/(MATCH|FINAL)/).first);
else
ruby_add_index = Value['rules'].index(Value['rules'].grep(/GEOIP/).first);
end;
ruby_add_index ||= -1;
if Value_3.class.to_s == 'Hash' then
if not Value_3['rules'].to_a.empty? and Value_3['rules'].class.to_s == 'Array' then
Value_4 = Value_3['rules'].to_a.reverse!;
end;
elsif Value_3.class.to_s == 'Array' then
Value_4 = Value_3.reverse!;
end;
if defined? Value_4 then
if ruby_add_index == -1 then
Value_4 = Value_4.reverse!;
end;
Value_4.each{|x|
if ${10} != 1 then
if x =~ /(^GEOSITE,|^AND,|^OR,|^NOT,|^IP-SUFFIX,|^SRC-IP-SUFFIX,|^IN-TYPE,|^SUB-RULE,|PORT,[0-9]+\/+|PORT,[0-9]+-+)/ or x.split(',')[-1] == 'tcp' or x.split(',')[-1] == 'udp' then
puts '${LOGTIME} Warning: Skip the Custom Rule that Core not Support【' + x + '】'
next
end;
end;
Value['rules'].insert(ruby_add_index,x);
};
Value['rules'] = Value['rules'].uniq;
end;
end;
end;
else
if File::exist?('/etc/openclash/custom/openclash_custom_rules.list') then
Value_1 = YAML.load_file('/etc/openclash/custom/openclash_custom_rules.list');
if Value_1 != false then
if Value_1.class.to_s == 'Hash' then
if not Value_1['rules'].to_a.empty? and Value_1['rules'].class.to_s == 'Array' then
Value_1['rules'].each{|x|
if ${10} != 1 then
if x =~ /(^GEOSITE,|^AND,|^OR,|^NOT,|^IP-SUFFIX,|^SRC-IP-SUFFIX,|^IN-TYPE,|^SUB-RULE,|PORT,[0-9]+\/+|PORT,[0-9]+-+)/ or x.split(',')[-1] == 'tcp' or x.split(',')[-1] == 'udp' then
puts '${LOGTIME} Warning: Skip the Custom Rule that Core not Support【' + x + '】'
Value_1.delete(x);
end;
end;
};
Value['rules'] = Value_1['rules'];
Value['rules'] = Value['rules'].uniq;
end;
elsif Value_1.class.to_s == 'Array' then
Value_1.each{|x|
if ${10} != 1 then
if x =~ /(^GEOSITE,|^AND,|^OR,|^NOT,|^IP-SUFFIX,|^SRC-IP-SUFFIX,|^IN-TYPE,|^SUB-RULE,|PORT,[0-9]+\/+|PORT,[0-9]+-+)/ or x.split(',')[-1] == 'tcp' or x.split(',')[-1] == 'udp' then
puts '${LOGTIME} Warning: Skip the Custom Rule that Core not Support【' + x + '】'
Value_1.delete(x);
end;
end;
};
Value['rules'] = Value_1;
Value['rules'] = Value['rules'].uniq;
end;
end;
end;
if File::exist?('/etc/openclash/custom/openclash_custom_rules_2.list') then
Value_2 = YAML.load_file('/etc/openclash/custom/openclash_custom_rules_2.list');
if Value_2 != false then
if Value['rules'].to_a.empty? then
if Value_2.class.to_s == 'Hash' then
if not Value_2['rules'].to_a.empty? and Value_2['rules'].class.to_s == 'Array' then
Value_2['rules'].each{|x|
if ${10} != 1 then
if x =~ /(^GEOSITE,|^AND,|^OR,|^NOT,|^IP-SUFFIX,|^SRC-IP-SUFFIX,|^IN-TYPE,|^SUB-RULE,|PORT,[0-9]+\/+|PORT,[0-9]+-+)/ or x.split(',')[-1] == 'tcp' or x.split(',')[-1] == 'udp' then
puts '${LOGTIME} Warning: Skip the Custom Rule that Core not Support【' + x + '】'
Value_2.delete(x);
end;
end;
};
Value['rules'] = Value_2['rules'];
Value['rules'] = Value['rules'].uniq;
end;
elsif Value_2.class.to_s == 'Array' then
Value_2.each{|x|
if ${10} != 1 then
if x =~ /(^GEOSITE,|^AND,|^OR,|^NOT,|^IP-SUFFIX,|^SRC-IP-SUFFIX,|^IN-TYPE,|^SUB-RULE,|PORT,[0-9]+\/+|PORT,[0-9]+-+)/ or x.split(',')[-1] == 'tcp' or x.split(',')[-1] == 'udp' then
puts '${LOGTIME} Warning: Skip the Custom Rule that Core not Support【' + x + '】'
Value_2.delete(x);
end;
end;
};
Value['rules'] = Value_2;
Value['rules'] = Value['rules'].uniq;
end;
else
if Value['rules'].grep(/GEOIP/)[0].nil? or Value['rules'].grep(/GEOIP/)[0].empty? then
ruby_add_index = Value['rules'].index(Value['rules'].grep(/DST-PORT,80/).last);
ruby_add_index ||= Value['rules'].index(Value['rules'].grep(/(MATCH|FINAL)/).first);
else
ruby_add_index = Value['rules'].index(Value['rules'].grep(/GEOIP/).first);
end;
ruby_add_index ||= -1;
if Value_2.class.to_s == 'Hash' then
if not Value_2['rules'].to_a.empty? and Value_2['rules'].class.to_s == 'Array' then
Value_3 = Value_2['rules'].to_a.reverse!;
end;
elsif Value_2.class.to_s == 'Array' then
Value_3 = Value_2.reverse!;
end;
if defined? Value_3 then
if ruby_add_index == -1 then
Value_3 = Value_3.reverse!;
end
Value_3.each{|x|
if ${10} != 1 then
if x =~ /(^GEOSITE,|^AND,|^OR,|^NOT,|^IP-SUFFIX,|^SRC-IP-SUFFIX,|^IN-TYPE,|^SUB-RULE,|PORT,[0-9]+\/+|PORT,[0-9]+-+)/ or x.split(',')[-1] == 'tcp' or x.split(',')[-1] == 'udp' then
puts '${LOGTIME} Warning: Skip the Custom Rule that Core not Support【' + x + '】'
next
end;
end;
Value['rules'].insert(ruby_add_index,x);
};
Value['rules'] = Value['rules'].uniq;
end;
end;
end;
end;
end;
#SUB-RULE
if Value.has_key?('sub-rules') and not Value['sub-rules'].to_a.empty? then
if File::exist?('/etc/openclash/custom/openclash_custom_rules.list') then
Value_1 = YAML.load_file('/etc/openclash/custom/openclash_custom_rules.list');
if Value_1 != false then
if Value_1.class.to_s == 'Hash' then
if not Value_1['sub-rules'].to_a.empty? and Value_1['sub-rules'].class.to_s == 'Hash' then
if ${10} == 1 then
Value['sub-rules'] = Value['sub-rules'].merge!(Value_1['sub-rules']);
else
puts '${LOGTIME} Warning: Skip the Custom Rule that Core not Support【sub-rules】'
end;
end;
end;
end;
end;
if File::exist?('/etc/openclash/custom/openclash_custom_rules_2.list') then
Value_2 = YAML.load_file('/etc/openclash/custom/openclash_custom_rules_2.list');
if Value_2 != false then
if Value_2.class.to_s == 'Hash' then
if not Value_2['sub-rules'].to_a.empty? and Value_2['sub-rules'].class.to_s == 'Hash' then
if ${10} == 1 then
Value['sub-rules'] = Value['sub-rules'].merge!(Value_2['sub-rules']);
else
puts '${LOGTIME} Warning: Skip the Custom Rule that Core not Support【sub-rules】'
end;
end;
end;
end;
end;
else
if File::exist?('/etc/openclash/custom/openclash_custom_rules.list') then
Value_1 = YAML.load_file('/etc/openclash/custom/openclash_custom_rules.list');
if Value_1 != false then
if Value_1.class.to_s == 'Hash' then
if not Value_1['sub-rules'].to_a.empty? and Value_1['sub-rules'].class.to_s == 'Hash' then
if ${10} == 1 then
Value['sub-rules'] = Value_1['sub-rules'];
else
puts '${LOGTIME} Warning: Skip the Custom Rule that Core not Support【sub-rules】'
end;
end;
end;
end;
end;
if File::exist?('/etc/openclash/custom/openclash_custom_rules_2.list') then
Value_2 = YAML.load_file('/etc/openclash/custom/openclash_custom_rules_2.list');
if Value_2 != false then
if Value_2.class.to_s == 'Hash' then
if not Value_2['sub-rules'].to_a.empty? and Value_2['sub-rules'].class.to_s == 'Hash' then
if ${10} == 1 then
Value['sub-rules'] = Value_2['sub-rules'];
else
puts '${LOGTIME} Warning: Skip the Custom Rule that Core not Support【sub-rules】'
end;
end;
end;
end;
end;
end;
end;
}.join;
rescue Exception => e
puts '${LOGTIME} Error: Set Custom Rules Failed,【' + e.message + '】';
end;
#loop prevent
begin
Thread.new{
if Value.has_key?('rules') and not Value['rules'].to_a.empty? then
if Value['rules'].to_a.grep(/(?=.*'${fake_ip}')(?=.*REJECT)/).empty? then
Value['rules']=Value['rules'].to_a.insert(0,'IP-CIDR,${12},REJECT,no-resolve');
end;
if Value['rules'].to_a.grep(/(?=.*DST-PORT,'$8',REJECT)/).empty? then
Value['rules']=Value['rules'].to_a.insert(0,'DST-PORT,$8,REJECT');
end;
if Value['rules'].to_a.grep(/(?=.*DST-PORT,'$9',REJECT)/).empty? then
Value['rules']=Value['rules'].to_a.insert(0,'DST-PORT,$9,REJECT');
end;
else
Value['rules']=['IP-CIDR,${12},REJECT,no-resolve','DST-PORT,$8,REJECT','DST-PORT,$9,REJECT'];
end;
}.join;
rescue Exception => e
puts '${LOGTIME} Error: Set Loop Protect Rules Failed,【' + e.message + '】';
end;
#修改集路径
begin
Thread.new{
provider = {'proxy-providers' => 'proxy_provider', 'rule-providers' => 'rule_provider'}
provider.each{|i, p|
if Value.key?(i) then
Value[i].values.each{
|x,v|
if x['path'] and not x['path'] =~ /.\/#{p}\/*/ and not x['path'] =~ /.\/game_rules\/*/ then
v=File.basename(x['path']);
x['path']='./'+p+'/'+v;
end;
#CDN Replace
if '$github_address_mod' != '0' then
if '$github_address_mod' == 'https://cdn.jsdelivr.net/' or '$github_address_mod' == 'https://fastly.jsdelivr.net/' or '$github_address_mod' == 'https://testingcf.jsdelivr.net/'then
if x['url'] and x['url'] =~ /^https:\/\/raw.githubusercontent.com/ then
x['url'] = '$github_address_mod' + x['url'].split('/')[3] + '/' + x['url'].split('/')[4] + '@' + x['url'].split(x['url'].split('/')[2] + '/' + x['url'].split('/')[3] + '/' + x['url'].split('/')[4] + '/')[1];
end;
elsif '$github_address_mod' == 'https://raw.fastgit.org/' then
if x['url'] and x['url'] =~ /^https:\/\/raw.githubusercontent.com/ then
x['url'] = 'https://raw.fastgit.org/' + x['url'].split('/')[3] + '/' + x['url'].split('/')[4] + '/' + x['url'].split(x['url'].split('/')[2] + '/' + x['url'].split('/')[3] + '/' + x['url'].split('/')[4] + '/')[1];
end;
else
if x['url'] and x['url'] =~ /^https:\/\/(raw.|gist.)(githubusercontent.com|github.com)/ then
x['url'] = '$github_address_mod' + x['url'];
end;
end;
end;
};
end;
};
}.join;
rescue Exception => e
puts '${LOGTIME} Error: Edit Provider Path Failed,【' + e.message + '】';
end;
#tolerance
begin
Thread.new{
if '$tolerance' != '0' then
Value['proxy-groups'].each{
|x|
if x['type'] == 'url-test' then
x['tolerance']='${tolerance}';
end
};
end;
}.join;
rescue Exception => e
puts '${LOGTIME} Error: Edit URL-Test Group Tolerance Option Failed,【' + e.message + '】';
end;
#URL-Test interval
begin
Thread.new{
if '$urltest_interval_mod' != '0' then
if Value.key?('proxy-groups') then
Value['proxy-groups'].each{
|x|
if x['type'] == 'url-test' or x['type'] == 'fallback' or x['type'] == 'load-balance' then
x['interval']='${urltest_interval_mod}';
end
};
end;
if Value.key?('proxy-providers') then
Value['proxy-providers'].values.each{
|x|
if x['health-check'] and x['health-check']['enable'] and x['health-check']['enable'] == 'true' then
x['health-check']['interval']='${urltest_interval_mod}';
end;
};
end;
end;
}.join;
rescue Exception => e
puts '${LOGTIME} Error: Edit URL-Test Interval Failed,【' + e.message + '】';
end;
#修改测速地址
begin
Thread.new{
if '$urltest_address_mod' != '0' then
if Value.key?('proxy-providers') then
Value['proxy-providers'].values.each{
|x|
if x['health-check'] and x['health-check']['enable'] and x['health-check']['enable'] == 'true' then
x['health-check']['url']='$urltest_address_mod';
end;
};
end;
if Value.key?('proxy-groups') then
Value['proxy-groups'].each{
|x|
if x['type'] == 'url-test' or x['type'] == 'fallback' or x['type'] == 'load-balance' then
x['url']='$urltest_address_mod';
end;
};
end;
end;
}.join;
rescue Exception => e
puts '${LOGTIME} Error: Edit URL-Test URL Failed,【' + e.message + '】';
ensure
File.open('$3','w') {|f| YAML.dump(Value, f)};
end" 2>/dev/null >> $LOG_FILE
}
yml_other_rules_get()
{
local section="$1"
local enabled config
config_get_bool "enabled" "$section" "enabled" "1"
config_get "config" "$section" "config" ""
if [ "$enabled" = "0" ] || [ "$config" != "$2" ]; then
return
fi
if [ -n "$rule_name" ]; then
LOG_OUT "Warning: Multiple Other-Rules-Configurations Enabled, Ignore..."
return
fi
config_get "rule_name" "$section" "rule_name" ""
config_get "GlobalTV" "$section" "GlobalTV" ""
config_get "AsianTV" "$section" "AsianTV" ""
config_get "Proxy" "$section" "Proxy" ""
config_get "Youtube" "$section" "Youtube" ""
config_get "Bilibili" "$section" "Bilibili" ""
config_get "Bahamut" "$section" "Bahamut" ""
config_get "HBOMax" "$section" "HBOMax" "$GlobalTV"
config_get "HBOGo" "$section" "HBOGo" "$GlobalTV"
config_get "Pornhub" "$section" "Pornhub" ""
config_get "Apple" "$section" "Apple" ""
config_get "Scholar" "$section" "Scholar" ""
config_get "Netflix" "$section" "Netflix" ""
config_get "Disney" "$section" "Disney" ""
config_get "Spotify" "$section" "Spotify" ""
config_get "Steam" "$section" "Steam" ""
config_get "AdBlock" "$section" "AdBlock" ""
config_get "Netease_Music" "$section" "Netease_Music" ""
config_get "Speedtest" "$section" "Speedtest" ""
config_get "Telegram" "$section" "Telegram" ""
config_get "Crypto" "$section" "Crypto" "$Proxy"
config_get "Discord" "$section" "Discord" "$Proxy"
config_get "Microsoft" "$section" "Microsoft" ""
config_get "PayPal" "$section" "PayPal" ""
config_get "Domestic" "$section" "Domestic" ""
config_get "Others" "$section" "Others" ""
config_get "GoogleFCM" "$section" "GoogleFCM" "DIRECT"
config_get "Discovery" "$section" "Discovery" "$GlobalTV"
config_get "DAZN" "$section" "DAZN" "$GlobalTV"
config_get "ChatGPT" "$section" "ChatGPT" "$Proxy"
config_get "AppleTV" "$section" "AppleTV" "$GlobalTV"
}
if [ "$1" != "0" ]; then
/usr/share/openclash/yml_groups_name_get.sh
if [ $? -ne 0 ]; then
LOG_OUT "Error: Unable To Parse Config File, Please Check And Try Again!"
exit 0
fi
config_load "openclash"
config_foreach yml_other_rules_get "other_rules" "$5"
if [ -z "$rule_name" ]; then
yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}" "${11}" "${12}"
exit 0
#判断策略组是否存在
elif [ "$rule_name" = "ConnersHua_return" ]; then
if [ -z "$(grep -F "$Proxy" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Others" /tmp/Proxy_Group)" ];then
LOG_OUT "Warning: Because of The Different Porxy-Group's Name, Stop Setting The Other Rules!"
yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}" "${11}" "${12}"
exit 0
fi
elif [ "$rule_name" = "ConnersHua" ]; then
if [ -z "$(grep "$GlobalTV" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$AsianTV" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Proxy" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Others" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Domestic" /tmp/Proxy_Group)" ]; then
LOG_OUT "Warning: Because of The Different Porxy-Group's Name, Stop Setting The Other Rules!"
yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}" "${11}" "${12}"
exit 0
fi
elif [ "$rule_name" = "lhie1" ]; then
if [ -z "$(grep -F "$GlobalTV" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$AsianTV" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Proxy" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Youtube" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Bilibili" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Bahamut" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$HBOMax" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$HBOGo" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Pornhub" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Apple" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$AppleTV" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Scholar" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Netflix" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Disney" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Discovery" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$DAZN" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$ChatGPT" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Spotify" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Steam" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$AdBlock" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Speedtest" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Telegram" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Crypto" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Discord" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Microsoft" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$PayPal" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Others" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$GoogleFCM" /tmp/Proxy_Group)" ]\
|| [ -z "$(grep -F "$Domestic" /tmp/Proxy_Group)" ]; then
LOG_OUT "Warning: Because of The Different Porxy-Group's Name, Stop Setting The Other Rules!"
yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}" "${11}" "${12}"
exit 0
fi
fi
if [ -z "$Proxy" ]; then
LOG_OUT "Error: Missing Porxy-Group's Name, Stop Setting The Other Rules!"
yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}" "${11}" "${12}"
exit 0
else
if [ "$rule_name" = "lhie1" ]; then
ruby -ryaml -rYAML -I "/usr/share/openclash" -E UTF-8 -e "
begin
Value = YAML.load_file('$3');
Value_1 = YAML.load_file('/usr/share/openclash/res/lhie1.yaml');
if Value.has_key?('script') then
Value.delete('script')
end;
if Value.has_key?('rules') then
Value.delete('rules')
end;
if Value_1.has_key?('rule-providers') and not Value_1['rule-providers'].to_a.empty? then
if Value.has_key?('rule-providers') and not Value['rule-providers'].to_a.empty? then
Value['rule-providers'].merge!(Value_1['rule-providers'])
else
Value['rule-providers']=Value_1['rule-providers']
end
end;
Value['script']=Value_1['script'];
Value['rules']=Value_1['rules'];
Value['rules'].to_a.collect!{|x|
x.to_s.gsub(/,Bilibili,Asian TV$/, ',Bilibili,$Bilibili#delete_')
.gsub(/,Bahamut,Global TV$/, ',Bahamut,$Bahamut#delete_')
.gsub(/,HBO Max,Global TV$/, ',HBO Max,$HBOMax#delete_')
.gsub(/,HBO Go,Global TV$/, ',HBO Go,$HBOGo#delete_')
.gsub(/,Discovery Plus,Global TV$/, ',Discovery Plus,$Discovery#delete_')
.gsub(/,DAZN,Global TV$/, ',DAZN,$DAZN#delete_')
.gsub(/,Pornhub,Global TV$/, ',Pornhub,$Pornhub#delete_')
.gsub(/,Global TV$/, ',$GlobalTV#delete_')
.gsub(/,Asian TV$/, ',$AsianTV#delete_')
.gsub(/,Proxy$/, ',$Proxy#delete_')
.gsub(/,YouTube$/, ',$Youtube#delete_')
.gsub(/,Apple$/, ',$Apple#delete_')
.gsub(/,Apple TV$/, ',$AppleTV#delete_')
.gsub(/,Scholar$/, ',$Scholar#delete_')
.gsub(/,Netflix$/, ',$Netflix#delete_')
.gsub(/,Disney$/, ',$Disney#delete_')
.gsub(/,Spotify$/, ',$Spotify#delete_')
.gsub(/,ChatGPT$/, ',$ChatGPT#delete_')
.gsub(/,Steam$/, ',$Steam#delete_')
.gsub(/,AdBlock$/, ',$AdBlock#delete_')
.gsub(/,Speedtest$/, ',$Speedtest#delete_')
.gsub(/,Telegram$/, ',$Telegram#delete_')
.gsub(/,Crypto$/, ',$Crypto#delete_')
.gsub(/,Discord$/, ',$Discord#delete_')
.gsub(/,Microsoft$/, ',$Microsoft#delete_')
.to_s.gsub(/,PayPal$/, ',$PayPal#delete_')
.gsub(/,Domestic$/, ',$Domestic#delete_')
.gsub(/,Others$/, ',$Others#delete_')
.gsub(/,Google FCM$/, ',$GoogleFCM#delete_')
.gsub(/#delete_/, '')
};
Value['script']['code'].to_s.gsub!(/\"Bilibili\": \"Asian TV\"/,'\"Bilibili\": \"$Bilibili#delete_\"')
.gsub!(/\"Bahamut\": \"Global TV\"/,'\"Bahamut\": \"$Bahamut#delete_\"')
.gsub!(/\"HBO Max\": \"Global TV\"/,'\"HBO Max\": \"$HBOMax#delete_\"')
.gsub!(/\"HBO Go\": \"Global TV\"/,'\"HBO Go\": \"$HBOGo#delete_\"')
.gsub!(/\"Discovery Plus\": \"Global TV\"/,'\"Discovery Plus\": \"$Discovery#delete_\"')
.gsub!(/\"DAZN\": \"Global TV\"/,'\"DAZN\": \"$DAZN#delete_\"')
.gsub!(/\"Pornhub\": \"Global TV\"/,'\"Pornhub\": \"$Pornhub#delete_\"')
.gsub!(/: \"Global TV\"/,': \"$GlobalTV#delete_\"')
.gsub!(/: \"Asian TV\"/,': \"$AsianTV#delete_\"')
.gsub!(/: \"Proxy\"/,': \"$Proxy#delete_\"')
.gsub!(/: \"YouTube\"/,': \"$Youtube#delete_\"')
.gsub!(/: \"Apple\"/,': \"$Apple#delete_\"')
.gsub!(/: \"Apple TV\"/,': \"$AppleTV#delete_\"')
.gsub!(/: \"Scholar\"/,': \"$Scholar#delete_\"')
.gsub!(/: \"Netflix\"/,': \"$Netflix#delete_\"')
.gsub!(/: \"Disney\"/,': \"$Disney#delete_\"')
.gsub!(/: \"Spotify\"/,': \"$Spotify#delete_\"')
.gsub!(/: \"ChatGPT\"/,': \"$ChatGPT#delete_\"')
.gsub!(/: \"Steam\"/,': \"$Steam#delete_\"')
.gsub!(/: \"AdBlock\"/,': \"$AdBlock#delete_\"')
.gsub!(/: \"Speedtest\"/,': \"$Speedtest#delete_\"')
.gsub!(/: \"Telegram\"/,': \"$Telegram#delete_\"')
.gsub!(/: \"Crypto\"/,': \"$Crypto#delete_\"')
.gsub!(/: \"Discord\"/,': \"$Discord#delete_\"')
.gsub!(/: \"Microsoft\"/,': \"$Microsoft#delete_\"')
.gsub!(/: \"PayPal\"/,': \"$PayPal#delete_\"')
.gsub!(/: \"Domestic\"/,': \"$Domestic#delete_\"')
.gsub!(/: \"Google FCM\"/,': \"$GoogleFCM#delete_\"')
.gsub!(/return \"Domestic\"$/, 'return \"$Domestic#delete_\"')
.gsub!(/return \"Others\"$/, 'return \"$Others#delete_\"')
.gsub!(/#delete_/, '');
File.open('$3','w') {|f| YAML.dump(Value, f)};
rescue Exception => e
puts '${LOGTIME} Error: Set lhie1 Rules Failed,【' + e.message + '】';
end" 2>/dev/null >> $LOG_FILE
elif [ "$rule_name" = "ConnersHua" ]; then
ruby -ryaml -rYAML -I "/usr/share/openclash" -E UTF-8 -e "
begin
Value = YAML.load_file('$3');
Value_1 = YAML.load_file('/usr/share/openclash/res/ConnersHua.yaml');
if Value.has_key?('script') then
Value.delete('script')
end;
if Value.has_key?('rules') then
Value.delete('rules')
end;
if Value_1.has_key?('rule-providers') and not Value_1['rule-providers'].to_a.empty? then
if Value.has_key?('rule-providers') and not Value['rule-providers'].to_a.empty? then
Value['rule-providers'].merge!(Value_1['rule-providers'])
else
Value['rule-providers']=Value_1['rule-providers']
end
end;
Value['rules']=Value_1['rules'];
Value['rules'].to_a.collect!{|x|
x.to_s.gsub(/,Streaming$/, ',$GlobalTV#delete_')
.gsub(/,StreamingSE$/, ',$AsianTV#delete_')
.gsub(/(,PROXY$|,IP-Blackhole$)/, ',$Proxy#delete_')
.gsub(/,China,DIRECT$/, ',China,$Domestic#delete_')
.gsub(/,ChinaIP,DIRECT$/, ',ChinaIP,$Domestic#delete_')
.gsub(/,CN,DIRECT$/, ',CN,$Domestic#delete_')
.gsub(/,MATCH$/, ',$Others#delete_')
.gsub(/#delete_/, '')
};
File.open('$3','w') {|f| YAML.dump(Value, f)};
rescue Exception => e
puts '${LOGTIME} Error: Set ConnersHua Rules Failed,【' + e.message + '】';
end" 2>/dev/null >> $LOG_FILE
else
ruby -ryaml -rYAML -I "/usr/share/openclash" -E UTF-8 -e "
begin
Value = YAML.load_file('$3');
Value_1 = YAML.load_file('/usr/share/openclash/res/ConnersHua_return.yaml');
if Value.has_key?('script') then
Value.delete('script')
end;
if Value.has_key?('rules') then
Value.delete('rules')
end;
Value['rules']=Value_1['rules'];
Value['rules'].to_a.collect!{|x|
x.to_s.gsub(/,PROXY$/, ',$Proxy#delete_')
.gsub(/MATCH,DIRECT$/, 'MATCH,$Others#delete_')
.gsub(/#delete_/, '')
};
File.open('$3','w') {|f| YAML.dump(Value, f)};
rescue Exception => e
puts '${LOGTIME} Error: Set ConnersHua Return Rules Failed,【' + e.message + '】';
end" 2>/dev/null >> $LOG_FILE
fi
fi
fi
yml_other_set "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}" "${11}" "${12}"