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

891 lines
30 KiB
Bash

#!/bin/bash
. /lib/functions.sh
. /usr/share/openclash/ruby.sh
. /usr/share/openclash/log.sh
set_lock() {
exec 875>"/tmp/lock/openclash_proxies_get.lock" 2>/dev/null
flock -x 875 2>/dev/null
}
del_lock() {
flock -u 875 2>/dev/null
rm -rf "/tmp/lock/openclash_proxies_get.lock"
}
sub_info_get()
{
local section="$1" name
config_get "name" "$section" "name" ""
if [ -z "$name" ] || [ "$name" != "${CONFIG_NAME%%.*}" ]; then
return
else
sub_cfg=true
fi
}
CONFIG_FILE=$(uci get openclash.config.config_path 2>/dev/null)
CONFIG_NAME=$(echo "$CONFIG_FILE" |awk -F '/' '{print $5}' 2>/dev/null)
UPDATE_CONFIG_FILE=$(uci get openclash.config.config_update_path 2>/dev/null)
UPDATE_CONFIG_NAME=$(echo "$UPDATE_CONFIG_FILE" |awk -F '/' '{print $5}' 2>/dev/null)
LOGTIME=$(echo $(date "+%Y-%m-%d %H:%M:%S"))
LOG_FILE="/tmp/openclash.log"
set_lock
if [ ! -z "$UPDATE_CONFIG_FILE" ]; then
CONFIG_FILE="$UPDATE_CONFIG_FILE"
CONFIG_NAME="$UPDATE_CONFIG_NAME"
fi
if [ -z "$CONFIG_FILE" ]; then
CONFIG_FILE="/etc/openclash/config/$(ls -lt /etc/openclash/config/ | grep -E '.yaml|.yml' | head -n 1 |awk '{print $9}')"
CONFIG_NAME=$(echo "$CONFIG_FILE" |awk -F '/' '{print $5}' 2>/dev/null)
fi
if [ -z "$CONFIG_NAME" ]; then
CONFIG_FILE="/etc/openclash/config/config.yaml"
CONFIG_NAME="config.yaml"
fi
BACKUP_FILE="/etc/openclash/backup/$(echo "$CONFIG_FILE" |awk -F '/' '{print $5}' 2>/dev/null)"
if [ ! -s "$CONFIG_FILE" ] && [ ! -s "$BACKUP_FILE" ]; then
del_lock
exit 0
elif [ ! -s "$CONFIG_FILE" ] && [ -s "$BACKUP_FILE" ]; then
mv "$BACKUP_FILE" "$CONFIG_FILE"
fi
#判断订阅配置
config_load "openclash"
config_foreach sub_info_get "config_subscribe"
#提取节点部分
proxy_hash=$(ruby_read "$CONFIG_FILE" ".select {|x| 'proxies' == x or 'proxy-providers' == x}")
CFG_FILE="/etc/config/openclash"
match_servers="/tmp/match_servers.list"
match_provider="/tmp/match_provider.list"
servers_update=$(uci get openclash.config.servers_update 2>/dev/null)
servers_if_update=$(uci get openclash.config.servers_if_update 2>/dev/null)
#proxy
num=$(ruby_read_hash "$proxy_hash" "['proxies'].count")
count=0
#provider
provider_num=$(ruby_read_hash "$proxy_hash" "['proxy-providers'].count")
provider_count=0
#group
group_hash=$(ruby_read "$CONFIG_FILE" ".select {|x| 'proxy-groups' == x}")
if [ -z "$num" ] && [ -z "$provider_num" ]; then
LOG_OUT "Error: Unable To Parse Config File, Please Check And Try Again!"
sleep 3
del_lock
exit 0
fi
cfg_new_servers_groups_check()
{
config_group_exist=$(( $config_group_exist + 1 ))
if [ -z "$1" ]; then
return
fi
config_foreach cfg_group_name "groups" "$1"
}
cfg_group_name()
{
local section="$1"
config_get "name" "$section" "name" ""
config_get "config" "$section" "config" ""
if [ -z "$config" ]; then
return
fi
if [ "$config" != "$CONFIG_NAME" ] && [ "$config" != "all" ]; then
return
fi
if [ -z "$name" ]; then
return
fi
if [ "$name" = "$2" ]; then
config_group_exists=$(( $config_group_exists + 1 ))
fi
}
#判断当前配置文件策略组信息是否包含指定策略组
config_group_exist=0
config_group_exists=0
config_load "openclash"
config_list_foreach "config" "new_servers_group" cfg_new_servers_groups_check
if [ "$config_group_exists" -eq "$config_group_exist" ] && [ "$config_group_exist" -ne 0 ]; then
config_group_exist=1
else
config_group_exist=0
fi
LOG_OUT "Start Getting【$CONFIG_NAME】Proxy-providers Setting..."
yml_provider_name_get()
{
local section="$1"
config_get "name" "$section" "name" ""
[ ! -z "$name" ] && {
echo "$provider_nums.$name" >>"$match_provider"
}
provider_nums=$(( $provider_nums + 1 ))
}
cfg_new_provider_groups_get()
{
if [ -z "$1" ]; then
return
fi
${uci_add}groups="${1}"
}
[ "$servers_update" -eq 1 ] && {
echo "" >"$match_provider"
provider_nums=0
config_load "openclash"
config_foreach yml_provider_name_get "proxy-provider"
}
#获取代理集信息
while [ "$provider_count" -lt "$provider_num" ]
do
#name
provider_name=$(ruby_read_hash "$proxy_hash" "['proxy-providers'].keys[$provider_count]")
#type
provider_type=$(ruby_read_hash "$proxy_hash" "['proxy-providers'].values[$provider_count]['type']")
if [ -z "$provider_name" ] || [ -z "$provider_type" ]; then
let provider_count++
continue
fi
LOG_OUT "Start Getting【$CONFIG_NAME - $provider_name】Proxy-provider Setting..."
#代理集存在时获取代理集编号
provider_nums=$(grep -Fw "$provider_name" "$match_provider" 2>/dev/null|awk -F '.' '{print $1}')
if [ "$servers_update" -eq 1 ] && [ -n "$provider_nums" ]; then
sed -i "/^${provider_nums}\./c\#match#" "$match_provider" 2>/dev/null
uci_set="uci -q set openclash.@proxy-provider["$provider_nums"]."
${uci_set}manual="0"
${uci_set}type="$provider_type"
else
#代理集不存在时添加新代理集
name=openclash
uci_name_tmp=$(uci add $name proxy-provider)
uci_set="uci -q set $name.$uci_name_tmp."
uci_add="uci -q add_list $name.$uci_name_tmp."
if [ "$config_group_exist" -eq 0 ] && [ "$servers_if_update" = "1" ] && [ "$servers_update" -eq 1 ]; then
${uci_set}enabled="0"
else
${uci_set}enabled="1"
fi
if [ "$servers_if_update" = "1" ] || "$sub_cfg"; then
${uci_set}manual="0"
else
${uci_set}manual="1"
fi
${uci_set}config="$CONFIG_NAME"
${uci_set}name="$provider_name"
${uci_set}type="$provider_type"
fi
ruby -ryaml -E UTF-8 -e "
begin
Value = $proxy_hash;
Thread.new{
#path
if Value['proxy-providers'].values[$provider_count].key?('path') then
if '$provider_type' == 'http' then
provider_path = '${uci_set}path=./proxy_provider/${provider_name}.yaml'
else
provider_path = '${uci_set}path=\"' + Value['proxy-providers'].values[$provider_count]['path'].to_s + '\"'
end
system(provider_path)
end
}.join;
Thread.new{
#gen_url
if Value['proxy-providers'].values[$provider_count].key?('url') then
provider_gen_url = '${uci_set}provider_url=\"' + Value['proxy-providers'].values[$provider_count]['url'].to_s + '\"'
system(provider_gen_url)
end
}.join;
Thread.new{
#gen_interval
if Value['proxy-providers'].values[$provider_count].key?('interval') then
provider_gen_interval = '${uci_set}provider_interval=' + Value['proxy-providers'].values[$provider_count]['interval'].to_s
system(provider_gen_interval)
end
}.join;
Thread.new{
#filter
if Value['proxy-providers'].values[$provider_count].key?('filter') then
provider_gen_filter = '${uci_set}provider_filter=' + Value['proxy-providers'].values[$provider_count]['filter'].to_s
system(provider_gen_filter)
end
}.join;
Thread.new{
#che_enable
if Value['proxy-providers'].values[$provider_count].key?('health-check') then
if Value['proxy-providers'].values[$provider_count]['health-check'].key?('enable') then
provider_che_enable = '${uci_set}health_check=' + Value['proxy-providers'].values[$provider_count]['health-check']['enable'].to_s
system(provider_che_enable)
end
end
}.join;
Thread.new{
#che_url
if Value['proxy-providers'].values[$provider_count].key?('health-check') then
if Value['proxy-providers'].values[$provider_count]['health-check'].key?('url') then
provider_che_url = '${uci_set}health_check_url=\"' + Value['proxy-providers'].values[$provider_count]['health-check']['url'].to_s + '\"'
system(provider_che_url)
end
end
}.join;
Thread.new{
#che_interval
if Value['proxy-providers'].values[$provider_count].key?('health-check') then
if Value['proxy-providers'].values[$provider_count]['health-check'].key?('interval') then
provider_che_interval = '${uci_set}health_check_interval=' + Value['proxy-providers'].values[$provider_count]['health-check']['interval'].to_s
system(provider_che_interval)
end
end
}.join;
rescue Exception => e
puts '${LOGTIME} Error: Resolve Proxy-provider Error,【${CONFIG_NAME} - ${provider_name}: ' + e.message + '】'
end
" 2>/dev/null >> $LOG_FILE &
if [ "$servers_update" != 1 ] || [ -z "$provider_nums" ]; then
#加入策略组
if [ "$servers_if_update" == 1 ] && [ "$config_group_exist" == 1 ]; then
#新代理集且设置默认策略组时加入指定策略组
config_load "openclash"
config_list_foreach "config" "new_servers_group" cfg_new_provider_groups_get
else
ruby -ryaml -E UTF-8 -e "
Thread.new{
begin
Value = $group_hash
Value['proxy-groups'].each{
|x|
if x.key?('use') then
if x['use'].include?('$provider_name') then
uci = '${uci_add}groups=\"' + x['name'] + '\"'
system(uci)
end
end
}
rescue Exception => e
puts '${LOGTIME} Error: Resolve Proxy-provider Error,【${CONFIG_NAME} - ${provider_name}: ' + e.message + '】'
end
}.join;
" 2>/dev/null >> $LOG_FILE &
fi
fi
let provider_count++
done 2>/dev/null
#删除订阅中已不存在的代理集
if [ "$servers_if_update" = "1" ]; then
LOG_OUT "Deleting【$CONFIG_NAME】Proxy-providers That no Longer Exists in Subscription"
sed -i '/#match#/d' "$match_provider" 2>/dev/null
cat $match_provider 2>/dev/null|awk -F '.' '{print $1}' |sort -rn |while read line
do
if [ -z "$line" ]; then
continue
fi
if [ "$(uci get openclash.@proxy-provider["$line"].manual)" = "0" ] && [ "$(uci get openclash.@proxy-provider["$line"].config)" = "$CONFIG_NAME" ]; then
uci delete openclash.@proxy-provider["$line"] 2>/dev/null
fi
done
fi
yml_servers_name_get()
{
local section="$1"
config_get "name" "$section" "name" ""
[ ! -z "$name" ] && {
echo "$server_num.$name" >>"$match_servers"
}
server_num=$(( $server_num + 1 ))
}
cfg_new_servers_groups_get()
{
if [ -z "$1" ]; then
return
fi
${uci_add}groups="${1}"
}
LOG_OUT "Start Getting【$CONFIG_NAME】Proxies Setting..."
[ "$servers_update" -eq 1 ] && {
echo "" >"$match_servers"
server_num=0
config_load "openclash"
config_foreach yml_servers_name_get "servers"
}
while [ "$count" -lt "$num" ]
do
#name
server_name=$(ruby_read_hash "$proxy_hash" "['proxies'][$count]['name']")
if [ -z "$server_name" ]; then
let count++
continue
fi
#节点存在时获取节点编号
server_num=$(grep -Fw "$server_name" "$match_servers" 2>/dev/null|awk -F '.' '{print $1}')
if [ "$servers_update" -eq 1 ] && [ -n "$server_num" ]; then
sed -i "/^${server_num}\./c\#match#" "$match_servers" 2>/dev/null
fi
#type
server_type=$(ruby_read_hash "$proxy_hash" "['proxies'][$count]['type']")
LOG_OUT "Start Getting【$CONFIG_NAME - $server_type - $server_name】Proxy Setting..."
if [ "$servers_update" -eq 1 ] && [ ! -z "$server_num" ]; then
#更新已有节点
uci_set="uci -q set openclash.@servers["$server_num"]."
uci_add="uci -q add_list openclash.@servers["$server_num"]."
uci_del="uci -q del_list openclash.@servers["$server_num"]."
${uci_set}manual="0"
${uci_set}name="$server_name"
${uci_set}type="$server_type"
else
#添加新节点
name=openclash
uci_name_tmp=$(uci add $name servers)
uci_set="uci -q set $name.$uci_name_tmp."
uci_add="uci -q add_list $name.$uci_name_tmp."
uci_del="uci -q del_list $name.$uci_name_tmp."
if [ "$config_group_exist" -eq 0 ] && [ "$servers_if_update" = "1" ] && [ "$servers_update" -eq 1 ]; then
${uci_set}enabled="0"
else
${uci_set}enabled="1"
fi
if [ "$servers_if_update" = "1" ] || "$sub_cfg"; then
${uci_set}manual="0"
else
${uci_set}manual="1"
fi
${uci_set}config="$CONFIG_NAME"
${uci_set}name="$server_name"
${uci_set}type="$server_type"
fi
ruby -ryaml -E UTF-8 -e "
begin
Value = $proxy_hash;
Thread.new{
#server
if Value['proxies'][$count].key?('server') then
server = '${uci_set}server=\"' + Value['proxies'][$count]['server'].to_s + '\"'
system(server)
end
}.join;
Thread.new{
#port
if Value['proxies'][$count].key?('port') then
port = '${uci_set}port=' + Value['proxies'][$count]['port'].to_s
system(port)
end
}.join;
Thread.new{
#udp
if Value['proxies'][$count].key?('udp') then
udp = '${uci_set}udp=' + Value['proxies'][$count]['udp'].to_s
system(udp)
end
}.join;
Thread.new{
#interface-name
if Value['proxies'][$count].key?('interface-name') then
interface_name = '${uci_set}interface_name=' + Value['proxies'][$count]['interface-name'].to_s
system(interface_name)
end
}.join;
Thread.new{
#routing-mark
if Value['proxies'][$count].key?('routing-mark') then
routing_mark = '${uci_set}routing_mark=' + Value['proxies'][$count]['routing-mark'].to_s
system(routing_mark)
end
}.join;
if '$server_type' == 'ss' then
Thread.new{
#cipher
if Value['proxies'][$count].key?('cipher') then
cipher = '${uci_set}cipher=' + Value['proxies'][$count]['cipher'].to_s
system(cipher)
end
}.join
Thread.new{
#plugin-opts
if Value['proxies'][$count].key?('plugin-opts') then
#mode
if Value['proxies'][$count]['plugin-opts'].key?('mode') then
mode = '${uci_set}obfs=' + Value['proxies'][$count]['plugin-opts']['mode'].to_s
system(mode)
else
mode = '${uci_set}obfs=none'
system(mode)
end
#host:
if Value['proxies'][$count]['plugin-opts'].key?('host') then
host = '${uci_set}host=\"' + Value['proxies'][$count]['plugin-opts']['host'].to_s + '\"'
system(host)
end
if Value['proxies'][$count]['plugin'].to_s == 'v2ray-plugin' then
#path
if Value['proxies'][$count]['plugin-opts'].key?('path') then
path = '${uci_set}path=\"' + Value['proxies'][$count]['plugin-opts']['path'].to_s + '\"'
system(path)
end
#mux
if Value['proxies'][$count]['plugin-opts'].key?('mux') then
mux = '${uci_set}mux=' + Value['proxies'][$count]['plugin-opts']['mux'].to_s
system(mux)
end
#headers
if Value['proxies'][$count]['plugin-opts'].key?('headers') then
if Value['proxies'][$count]['plugin-opts']['headers'].key?('custom') then
custom = '${uci_set}custom=\"' + Value['proxies'][$count]['plugin-opts']['headers']['custom'].to_s + '\"'
system(custom)
end
end
#tls
if Value['proxies'][$count]['plugin-opts'].key?('tls') then
tls = '${uci_set}tls=' + Value['proxies'][$count]['plugin-opts']['tls'].to_s
system(tls)
end
#skip-cert-verify
if Value['proxies'][$count]['plugin-opts'].key?('skip-cert-verify') then
skip_cert_verify = '${uci_set}skip_cert_verify=' + Value['proxies'][$count]['plugin-opts']['skip-cert-verify'].to_s
system(skip_cert_verify)
end
end
end
}.join
end;
if '$server_type' == 'ssr' then
Thread.new{
#cipher
if Value['proxies'][$count].key?('cipher') then
cipher = '${uci_set}cipher_ssr=' + Value['proxies'][$count]['cipher'].to_s
system(cipher)
end
}.join
Thread.new{
#obfs
if Value['proxies'][$count].key?('obfs') then
obfs = '${uci_set}obfs_ssr=' + Value['proxies'][$count]['obfs'].to_s
system(obfs)
end
}.join
Thread.new{
#protocol
if Value['proxies'][$count].key?('protocol') then
protocol = '${uci_set}protocol=' + Value['proxies'][$count]['protocol'].to_s
system(protocol)
end
}.join
Thread.new{
#obfs-param
if Value['proxies'][$count].key?('obfs-param') then
obfs_param = '${uci_set}obfs_param=\"' + Value['proxies'][$count]['obfs-param'].to_s + '\"'
system(obfs_param)
end
}.join
Thread.new{
#protocol-param
if Value['proxies'][$count].key?('protocol-param') then
protocol_param = '${uci_set}protocol_param=\"' + Value['proxies'][$count]['protocol-param'].to_s + '\"'
system(protocol_param)
end
}.join
end;
if '$server_type' == 'vmess' then
Thread.new{
#uuid
if Value['proxies'][$count].key?('uuid') then
uuid = '${uci_set}uuid=' + Value['proxies'][$count]['uuid'].to_s
system(uuid)
end
}.join
Thread.new{
#alterId
if Value['proxies'][$count].key?('alterId') then
alterId = '${uci_set}alterId=' + Value['proxies'][$count]['alterId'].to_s
system(alterId)
end
}.join
Thread.new{
#cipher
if Value['proxies'][$count].key?('cipher') then
cipher = '${uci_set}securitys=' + Value['proxies'][$count]['cipher'].to_s
system(cipher)
end
}.join
Thread.new{
#tls
if Value['proxies'][$count].key?('tls') then
tls = '${uci_set}tls=' + Value['proxies'][$count]['tls'].to_s
system(tls)
end
}.join
Thread.new{
#skip-cert-verify
if Value['proxies'][$count].key?('skip-cert-verify') then
skip_cert_verify = '${uci_set}skip_cert_verify=' + Value['proxies'][$count]['skip-cert-verify'].to_s
system(skip_cert_verify)
end
}.join
Thread.new{
#servername
if Value['proxies'][$count].key?('servername') then
servername = '${uci_set}servername=\"' + Value['proxies'][$count]['servername'].to_s + '\"'
system(servername)
end
}.join
Thread.new{
#network:
if Value['proxies'][$count].key?('network') then
if Value['proxies'][$count]['network'].to_s == 'ws'
system '${uci_set}obfs_vmess=websocket'
#ws-path:
if Value['proxies'][$count].key?('ws-path') then
path = '${uci_set}ws_opts_path=\"' + Value['proxies'][$count]['ws-path'].to_s + '\"'
system(path)
end
#Host:
if Value['proxies'][$count].key?('ws-headers') then
system '${uci_del}ws_opts_headers >/dev/null 2>&1'
Value['proxies'][$count]['ws-headers'].keys.each{
|v|
custom = '${uci_add}ws_opts_headers=\"' + v.to_s + ': '+ Value['proxies'][$count]['ws-headers'][v].to_s + '\"'
system(custom)
}
end
#ws-opts-path:
if Value['proxies'][$count].key?('ws-opts') then
if Value['proxies'][$count]['ws-opts'].key?('path') then
ws_opts_path = '${uci_set}ws_opts_path=\"' + Value['proxies'][$count]['ws-opts']['path'].to_s + '\"'
system(ws_opts_path)
end
#ws-opts-headers:
if Value['proxies'][$count]['ws-opts'].key?('headers') then
system '${uci_del}ws_opts_headers >/dev/null 2>&1'
Value['proxies'][$count]['ws-opts']['headers'].keys.each{
|v|
ws_opts_headers = '${uci_add}ws_opts_headers=\"' + v.to_s + ': '+ Value['proxies'][$count]['ws-opts']['headers'][v].to_s + '\"'
system(ws_opts_headers)
}
end
#max-early-data:
if Value['proxies'][$count]['ws-opts'].key?('max-early-data') then
max_early_data = '${uci_set}max_early_data=\"' + Value['proxies'][$count]['ws-opts']['max-early-data'].to_s + '\"'
system(max_early_data)
end
#early-data-header-name:
if Value['proxies'][$count]['ws-opts'].key?('early-data-header-name') then
early_data_header_name = '${uci_set}early_data_header_name=\"' + Value['proxies'][$count]['ws-opts']['early-data-header-name'].to_s + '\"'
system(early_data_header_name)
end
end
elsif Value['proxies'][$count]['network'].to_s == 'http'
system '${uci_set}obfs_vmess=http'
if Value['proxies'][$count].key?('http-opts') then
if Value['proxies'][$count]['http-opts'].key?('path') then
system '${uci_del}http_path >/dev/null 2>&1'
Value['proxies'][$count]['http-opts']['path'].each{
|x|
http_path = '${uci_add}http_path=\"' + x.to_s + '\"'
system(http_path)
}
end
if Value['proxies'][$count]['http-opts'].key?('headers') then
if Value['proxies'][$count]['http-opts']['headers'].key?('Connection') then
if Value['proxies'][$count]['http-opts']['headers']['Connection'].include?('keep-alive') then
keep_alive = '${uci_set}keep_alive=true'
else
keep_alive = '${uci_set}keep_alive=false'
end
system(keep_alive)
end
end
end
elsif Value['proxies'][$count]['network'].to_s == 'h2'
system '${uci_set}obfs_vmess=h2'
if Value['proxies'][$count].key?('h2-opts') then
if Value['proxies'][$count]['h2-opts'].key?('host') then
system '${uci_del}h2_host >/dev/null 2>&1'
Value['proxies'][$count]['h2-opts']['host'].each{
|x|
h2_host = '${uci_add}h2_host=\"' + x.to_s + '\"'
system(h2_host)
}
end
if Value['proxies'][$count]['h2-opts'].key?('path') then
h2_path = '${uci_set}h2_path=\"' + Value['proxies'][$count]['h2-opts']['path'].to_s + '\"'
system(h2_path)
end
end
elsif Value['proxies'][$count]['network'].to_s == 'grpc'
#grpc-service-name
system '${uci_set}obfs_vmess=grpc'
if Value['proxies'][$count].key?('grpc-opts') then
if Value['proxies'][$count]['grpc-opts'].key?('grpc-service-name') then
grpc_service_name = '${uci_set}grpc_service_name=\"' + Value['proxies'][$count]['grpc-opts']['grpc-service-name'].to_s + '\"'
system(grpc_service_name)
end
end
else
system '${uci_set}obfs_vmess=none'
end
end
}.join
end;
if '$server_type' == 'snell' then
Thread.new{
if Value['proxies'][$count].key?('obfs-opts') then
if Value['proxies'][$count]['obfs-opts'].key?('mode') then
mode = '${uci_set}obfs_snell=' + Value['proxies'][$count]['obfs-opts']['mode'].to_s
system(mode)
else
system '${uci_set}obfs_snell=none'
end
if Value['proxies'][$count]['obfs-opts'].key?('host') then
host = '${uci_set}host=\"' + Value['proxies'][$count]['obfs-opts']['host'].to_s + '\"'
system(host)
end
end
}.join
Thread.new{
if Value['proxies'][$count].key?('psk') then
psk = '${uci_set}psk=' + Value['proxies'][$count]['psk'].to_s
system(psk)
end
}.join
end;
if '$server_type' == 'socks5' or '$server_type' == 'http' then
Thread.new{
if Value['proxies'][$count].key?('username') then
username = '${uci_set}auth_name=\"' + Value['proxies'][$count]['username'].to_s + '\"'
system(username)
end
}.join
Thread.new{
if Value['proxies'][$count].key?('password') then
password = '${uci_set}auth_pass=\"' + Value['proxies'][$count]['password'].to_s + '\"'
system(password)
end
}.join
Thread.new{
#tls
if Value['proxies'][$count].key?('tls') then
tls = '${uci_set}tls=' + Value['proxies'][$count]['tls'].to_s
system(tls)
end
}.join
Thread.new{
#skip-cert-verify
if Value['proxies'][$count].key?('skip-cert-verify') then
skip_cert_verify = '${uci_set}skip_cert_verify=' + Value['proxies'][$count]['skip-cert-verify'].to_s
system(skip_cert_verify)
end
}.join
else
Thread.new{
if Value['proxies'][$count].key?('password') then
password = '${uci_set}password=\"' + Value['proxies'][$count]['password'].to_s + '\"'
system(password)
end
}.join
end;
if '$server_type' == 'http' or '$server_type' == 'trojan' then
Thread.new{
if Value['proxies'][$count].key?('sni') then
sni = '${uci_set}sni=\"' + Value['proxies'][$count]['sni'].to_s + '\"'
system(sni)
end
}.join
end;
if '$server_type' == 'trojan' then
Thread.new{
#alpn
if Value['proxies'][$count].key?('alpn') then
system '${uci_del}alpn >/dev/null 2>&1'
Value['proxies'][$count]['alpn'].each{
|x|
alpn = '${uci_add}alpn=\"' + x.to_s + '\"'
system(alpn)
}
end
}.join
Thread.new{
#grpc-service-name
if Value['proxies'][$count].key?('grpc-opts') then
system '${uci_set}obfs_trojan=grpc'
if Value['proxies'][$count]['grpc-opts'].key?('grpc-service-name') then
grpc_service_name = '${uci_set}grpc_service_name=\"' + Value['proxies'][$count]['grpc-opts']['grpc-service-name'].to_s + '\"'
system(grpc_service_name)
end
end
}.join
Thread.new{
if Value['proxies'][$count].key?('ws-opts') then
system '${uci_set}obfs_trojan=ws'
#trojan_ws_path
if Value['proxies'][$count]['ws-opts'].key?('path') then
trojan_ws_path = '${uci_set}trojan_ws_path=\"' + Value['proxies'][$count]['ws-opts']['path'].to_s + '\"'
system(trojan_ws_path)
end
#trojan_ws_headers
if Value['proxies'][$count]['ws-opts'].key?('headers') then
system '${uci_del}trojan_ws_headers >/dev/null 2>&1'
Value['proxies'][$count]['ws-opts']['headers'].keys.each{
|v|
trojan_ws_headers = '${uci_add}trojan_ws_headers=\"' + v.to_s + ': '+ Value['proxies'][$count]['ws-opts']['headers'][v].to_s + '\"'
system(trojan_ws_headers)
}
end
end
}.join
Thread.new{
#skip-cert-verify
if Value['proxies'][$count].key?('skip-cert-verify') then
skip_cert_verify = '${uci_set}skip_cert_verify=' + Value['proxies'][$count]['skip-cert-verify'].to_s
system(skip_cert_verify)
end
}.join
end;
rescue Exception => e
puts '${LOGTIME} Error: Resolve Proxy Error,【${CONFIG_NAME} - ${server_type} - ${server_name}: ' + e.message + '】'
end
" 2>/dev/null >> $LOG_FILE &
if [ "$servers_update" != 1 ] || [ -z "$server_num" ]; then
#加入策略组
if [ "$servers_if_update" = 1 ] && [ "$config_group_exist" = 1 ]; then
#新代理且设置默认策略组时加入指定策略组
config_load "openclash"
config_list_foreach "config" "new_servers_group" cfg_new_servers_groups_get
else
ruby -ryaml -E UTF-8 -e "
Thread.new{
begin
Value = $group_hash
#proxy
Value['proxy-groups'].each{
|x|
if x.key?('proxies') then
if x['proxies'].include?('$server_name') then
uci_proxy = '${uci_add}groups=\"' + x['name'] + '\"'
system(uci_proxy)
end
end
}
#relay
Value['proxy-groups'].each{
|x|
if x['type'] == 'relay' then
if x['proxies'].include?('$server_name') then
uci_relay = '${uci_add}relay_groups=\"' + x['name'] + '#relay#' + x['proxies'].index('$server_name') + '\"'
system(uci_relay)
end
end
}
rescue Exception => e
puts '${LOGTIME} Error: Resolve Proxy Error,【${CONFIG_NAME} - ${server_type} - ${server_name}: ' + e.message + '】'
end
}.join;
" 2>/dev/null >> $LOG_FILE &
fi
fi
let count++
done 2>/dev/null
#删除订阅中已不存在的节点
if [ "$servers_if_update" = "1" ]; then
LOG_OUT "Deleting【$CONFIG_NAME】Proxies That no Longer Exists in Subscription"
sed -i '/#match#/d' "$match_servers" 2>/dev/null
cat $match_servers |awk -F '.' '{print $1}' |sort -rn |while read -r line
do
if [ -z "$line" ]; then
continue
fi
if [ "$(uci get openclash.@servers["$line"].manual 2>/dev/null)" = "0" ] && [ "$(uci get openclash.@servers["$line"].config 2>/dev/null)" = "$CONFIG_NAME" ]; then
uci delete openclash.@servers["$line"] 2>/dev/null
fi
done 2>/dev/null
fi
uci set openclash.config.servers_if_update=0
wait
uci commit openclash
/usr/share/openclash/cfg_servers_address_fake_filter.sh
LOG_OUT "Config File【$CONFIG_NAME】Read Successful!"
sleep 3
SLOG_CLEAN
rm -rf /tmp/match_servers.list 2>/dev/null
rm -rf /tmp/match_provider.list 2>/dev/null
rm -rf /tmp/yaml_other_group.yaml 2>/dev/null
del_lock