891 lines
30 KiB
Bash
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 |