#!/bin/bash
#author:wos
#a script to simplify clash configuration
WORK_DIR=$(dirname $0)
SCRIPT_NAME=$(basename $0)
CFG_PATH=${WORK_DIR}/clash.yml
CFG_TEMP=/tmp/clash.yml
CFG_TEMP_2=/tmp/clash2.yml
CFG_P2C_PATH=${WORK_DIR}/p2c.yml
NODE_NAME=/tmp/nodename
DEL_NODE=/tmp/delnode
CLASH_PATH=/usr/bin/clash
SUB1="https://clashnode.com/wp-content/uploads/$(date -d now +%Y)/$(date -d now +%m)/$(date -d now +%Y%m%d).yaml"
SUB2="https://clashnode.com/wp-content/uploads/$(date -d yesterday +%Y)/$(date -d yesterday +%m)/$(date -d yesterday +%Y%m%d).yaml"
function logo()
{
echo -e "\033[96;40m"
base64 -d <<<"H4sIAAAAAAAAA4WOwQ3AIAwD/0zhX/uoxEJIZpAMXzsBiU9VRyQHOAEgRfyKaM5kIFzMyGD1L/aV
LDJ3pFkFQ2nq+BK6P4onat+0vWuyerp4mxQnr8nD32BkUXqYpmIs9qLNXwr6qVPtBYezLN0OAQAA"|gunzip
echo -e "\033[0m"
}
function usage()
{
echo "${SCRIPT_NAME} [clash_config_link]"
echo "${SCRIPT_NAME} [local_clash_config_file_path]"
echo "${SCRIPT_NAME} -f [proxy_list_file] #convert proxy list to clash configuration file and connect"
echo "${SCRIPT_NAME} -f #direct connect previous p2c configuration file"
echo "${SCRIPT_NAME} #direct connect inner subscribe clash link"
exit -1
}
####################################################################
#convert normal proxy list to clash configuration file
#proxy list foramt,you can combine http and socks5 in one file,one server one line
#recommend socks5 type
# http ip port
# socks5 ip port
function p2c()
{
cat ${CFG_TEMP}|awk '{print " - "$1"_"NR"_"}' > ${NODE_NAME}
cat ${CFG_TEMP}|awk '{print " - {name: "$1"_"NR"_, type: "$1", server: "$2", port: "$3"}"}' > ${CFG_TEMP_2}
cat <<BOF > ${CFG_P2C_PATH}
port: 7890
socks-port: 7891
allow-lan: false
mode: Rule
log-level: info
dns:
enable: true
ipv6: false
nameserver:
- 127.0.0.1
fallback:
- 127.0.0.1
proxies:
BOF
cat ${CFG_TEMP_2} >> ${CFG_P2C_PATH}
cat <<BOF >> ${CFG_P2C_PATH}
proxy-groups:
- name: auto
type: load-balance
url: 'https://httpbin.org/status/200'
interval: 300
strategy: round-robin
proxies:
BOF
cat ${NODE_NAME} >> ${CFG_P2C_PATH}
cat <<BOF >> ${CFG_P2C_PATH}
rules:
- GEOIP,CN,DIRECT
- MATCH,auto
BOF
}
###################################################################
#speicial binary configuration file cleaner
function clean_bin_yml()
{
sed -i 's/外部控制器/external-controller/g' ${CFG_TEMP_2}
sed -i 's/代理组/proxy-groups/g' ${CFG_TEMP_2}
sed -i 's/代理/proxies/g' ${CFG_TEMP_2}
sed -i 's/名称/name/g' ${CFG_TEMP_2}
sed -i 's/服务器/server/g' ${CFG_TEMP_2}
sed -i 's/端口/port/g' ${CFG_TEMP_2}
sed -i 's/类型/type/g' ${CFG_TEMP_2}
sed -i 's/真/true/g' ${CFG_TEMP_2}
sed -i 's/假/false/g' ${CFG_TEMP_2}
sed -i 's/网络/network/g' ${CFG_TEMP_2}
sed -i 's/跳过证书验证/skip-cert-verify/g' ${CFG_TEMP_2}
sed -i 's/验证/verify/g' ${CFG_TEMP_2}
sed -i 's/路径/path/g' ${CFG_TEMP_2}
sed -i 's/标头/headers/g' ${CFG_TEMP_2}
sed -i 's/主机/Host/g' ${CFG_TEMP_2}
sed -i 's/密码:auto/cipher: auto/g' ${CFG_TEMP_2}
sed -i 's/密码:aes/cipher: aes/g' ${CFG_TEMP_2}
sed -i 's/密码/password/g' ${CFG_TEMP_2}
sed -i 's/ :/: /g' ${CFG_TEMP_2}
sed -i 's/:/: /g' ${CFG_TEMP_2}
sed -i 's/,/, /g' ${CFG_TEMP_2}
sed -i 's/"/"/g' ${CFG_TEMP_2}
#get all node name
cat ${CFG_TEMP_2}|grep ", server:"|awk -F "server:" '{print " - ""server_"NR"_"}' > ${NODE_NAME}
cat ${CFG_TEMP_2}|grep ",\"type\":"|awk -F "\"type\":" '{print " - ""server_"NR"_"}' >> ${NODE_NAME}
cat ${CFG_TEMP_2}|grep ", server:"|awk -F "server:" '{print " - {name: ""server_"NR"_, server: "$2}' > ${CFG_TEMP}
cat ${CFG_TEMP_2}|grep ",\"type\":"|awk -F "\"type\":" '{print " - {name: ""server_"NR"_, \"type\": "$2}' >> ${CFG_TEMP}
CNT=$(cat ${NODE_NAME}|wc -l)
#special node name
if [ $CNT == 0 ];then
cat ${CFG_TEMP_2} |grep "\- name: \""|awk -F\" '{print " - "$2}' > ${NODE_NAME}
ST=$(($(sed -n "/proxies:/=" ${CFG_TEMP_2}|head -1)+1))
ED=$(($(sed -n "/proxy-groups:/=" ${CFG_TEMP_2}|head -1)-1))
sed -n ${ST},${ED}p ${CFG_TEMP_2} > ${CFG_TEMP}
fi
#get unsupport plugin node
cat ${CFG_TEMP}|grep "v2ray-plugin"|awk -F, '{print $1}'|awk -F: '{print $2}' > ${DEL_NODE}
cat ${CFG_TEMP}|grep "microsoft.com"|awk -F, '{print $1}'|awk -F: '{print $2}' >> ${DEL_NODE}
cat ${CFG_TEMP}|grep "singapore.com"|awk -F, '{print $1}'|awk -F: '{print $2}' >> ${DEL_NODE}
cat ${CFG_TEMP}|grep "127.0.0.1"|awk -F, '{print $1}'|awk -F: '{print $2}' >> ${DEL_NODE}
cat ${CFG_TEMP}|grep "::ffff"|awk -F, '{print $1}'|awk -F: '{print $2}' >> ${DEL_NODE}
cat ${CFG_TEMP}|grep "vless"|awk -F, '{print $1}'|awk -F: '{print $2}' >> ${DEL_NODE}
cat ${CFG_TEMP}|grep "sni:"|awk -F, '{print $1}'|awk -F: '{print $2}' >> ${DEL_NODE}
cat ${CFG_TEMP}|grep "argo-vmess?"|awk -F, '{print $1}'|awk -F: '{print $2}' >> ${DEL_NODE}
cat <<BOF > ${CFG_PATH}
port: 7890
socks-port: 7891
allow-lan: false
mode: Rule
log-level: info
dns:
enable: true
ipv6: false
nameserver:
- 127.0.0.1
fallback:
- 127.0.0.1
proxies:
BOF
cat ${CFG_TEMP} >> ${CFG_PATH}
cat <<BOF >> ${CFG_PATH}
proxy-groups:
- name: auto
type: load-balance
url: 'https://httpbin.org/status/200'
interval: 300
strategy: round-robin
proxies:
BOF
cat ${NODE_NAME} >> ${CFG_PATH}
cat <<BOF >> ${CFG_PATH}
rules:
- GEOIP,CN,DIRECT
- MATCH,auto
BOF
#delete unsupport node
cat ${DEL_NODE}|xargs -I {} sh -c "sed -i \"/{}/d\" ${CFG_PATH}"
}
###################################################################
logo
if [ $# == 0 ]; then
echo "connect inner subscribe server..."
${CLASH_PATH} -f ${CFG_PATH}
for i in {1..2};do
SUB=`eval echo '$'"SUB"$i`
echo -e "Subscribe Link:\033[96;40m${SUB}\033[0m"
echo -e "Ctrl+C:\033[96;40mNext Subscribe\033[0m"
rm /tmp/clash.yml 2>/dev/null
aria2c --connect-timeout=3 ${SUB} --dir=/tmp --out=clash.yml -q
strings ${CFG_TEMP} > ${CFG_TEMP_2} && clean_bin_yml && ${CLASH_PATH} -f ${CFG_PATH}
sleep 1
done
exit -1
elif [ $# == 1 ]; then
if [ ${1} == '-f' ] && [ -f "${CFG_P2C_PATH}" ]; then
echo "connect p2c config file..."
${CLASH_PATH} -f ${CFG_P2C_PATH}
exit -1
elif [[ "${1}" =~ ^(http(s)?:\/\/).* ]]; then
echo "connect clash config link..."
rm /tmp/clash.yml 2>/dev/null
aria2c --connect-timeout=3 ${1} --dir=/tmp --out=clash.yml -q
strings ${CFG_TEMP} > ${CFG_TEMP_2} && clean_bin_yml && ${CLASH_PATH} -f ${CFG_PATH}
exit -1
elif [ -n "${1}" ] && [ -f "${1}" ]; then
echo "connect local clash file..."
strings ${1} > ${CFG_TEMP_2}
clean_bin_yml
${CLASH_PATH} -f ${CFG_PATH}
exit -1
else
usage
fi
elif [ $# == 2 ] && [ ${1} == '-f' ]; then
if [ -n "${2}" ] && [ -f "${2}" ]; then
echo "convert proxy list to clash config..."
CFG_TEMP="${2}"
p2c
echo "connect p2c config file..."
${CLASH_PATH} -f ${CFG_P2C_PATH}
exit -1
else
usage
fi
else
usage
fi