240 lines
7.8 KiB
Bash
Executable File
240 lines
7.8 KiB
Bash
Executable File
#!/bin/bash
|
|
. /lib/functions.sh
|
|
|
|
status=$(ps|grep -c /usr/share/openclash/openclash.sh)
|
|
[ "$status" -gt 3 ] && exit 0
|
|
|
|
START_LOG="/tmp/openclash_start.log"
|
|
LOGTIME=$(date "+%Y-%m-%d %H:%M:%S")
|
|
LOG_FILE="/tmp/openclash.log"
|
|
CFG_FILE="/tmp/config.yaml"
|
|
CRON_FILE="/etc/crontabs/root"
|
|
CONFIG_PATH=$(uci get openclash.config.config_path 2>/dev/null)
|
|
servers_update=$(uci get openclash.config.servers_update 2>/dev/null)
|
|
dns_port=$(uci get openclash.config.dns_port 2>/dev/null)
|
|
enable_redirect_dns=$(uci get openclash.config.enable_redirect_dns 2>/dev/null)
|
|
disable_masq_cache=$(uci get openclash.config.disable_masq_cache 2>/dev/null)
|
|
if_restart=0
|
|
|
|
urlencode() {
|
|
local data
|
|
if [ "$#" -eq 1 ]; then
|
|
data=$(curl -s -o /dev/null -w %{url_effective} --get --data-urlencode "$1" "")
|
|
if [ ! -z "$data" ]; then
|
|
echo "${data##/?}"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
kill_watchdog() {
|
|
watchdog_pids=$(ps |grep openclash_watchdog.sh |grep -v grep |awk '{print $1}' 2>/dev/null)
|
|
for watchdog_pid in $watchdog_pids; do
|
|
kill -9 "$watchdog_pid" >/dev/null 2>&1
|
|
done
|
|
}
|
|
|
|
config_download()
|
|
{
|
|
if [ "$URL_TYPE" == "v2rayn" ]; then
|
|
subscribe_url=$(urlencode "$subscribe_url")
|
|
curl -sL --connect-timeout 10 --retry 2 https://tgbot.lbyczf.com/v2rayn2clash?url="$subscribe_url" -o "$CFG_FILE" >/dev/null 2>&1
|
|
elif [ "$URL_TYPE" == "surge" ]; then
|
|
subscribe_url=$(urlencode "$subscribe_url")
|
|
curl -sL --connect-timeout 10 --retry 2 https://tgbot.lbyczf.com/surge2clash?url="$subscribe_url" -o "$CFG_FILE" >/dev/null 2>&1
|
|
else
|
|
curl -sL --connect-timeout 10 --retry 2 --user-agent "clash" "$subscribe_url" -o "$CFG_FILE" >/dev/null 2>&1
|
|
fi
|
|
}
|
|
|
|
config_cus_up()
|
|
{
|
|
if [ -z "$CONFIG_PATH" ]; then
|
|
CONFIG_PATH="/etc/openclash/config/$(ls -lt /etc/openclash/config/ | grep -E '.yaml|.yml' | head -n 1 |awk '{print $9}')"
|
|
uci set openclash.config.config_path="$CONFIG_PATH"
|
|
uci commit openclash
|
|
fi
|
|
if [ "$servers_update" -eq 1 ] || [ ! -z "$keyword" ] || [ ! -z "$ex_keyword" ]; then
|
|
echo "配置文件【$name】替换成功,开始挑选节点..." >$START_LOG
|
|
uci set openclash.config.config_update_path="/etc/openclash/config/$name.yaml"
|
|
uci set openclash.config.servers_if_update=1
|
|
uci commit openclash
|
|
/usr/share/openclash/yml_groups_get.sh
|
|
uci set openclash.config.servers_if_update=1
|
|
uci commit openclash
|
|
/usr/share/openclash/yml_groups_set.sh
|
|
if [ "$CONFIG_FILE" == "$CONFIG_PATH" ]; then
|
|
if_restart=1
|
|
fi
|
|
echo "${LOGTIME} Config 【$name】 Update Successful" >>$LOG_FILE
|
|
echo "配置文件【$name】更新成功!" >$START_LOG
|
|
sleep 3
|
|
echo "" >$START_LOG
|
|
elif [ "$CONFIG_FILE" == "$CONFIG_PATH" ]; then
|
|
echo "${LOGTIME} Config 【$name】 Update Successful" >>$LOG_FILE
|
|
echo "配置文件【$name】更新成功!" >$START_LOG
|
|
sleep 3
|
|
if_restart=1
|
|
else
|
|
echo "配置文件【$name】更新成功!" >$START_LOG
|
|
echo "${LOGTIME} Config 【$name】 Update Successful" >>$LOG_FILE
|
|
sleep 3
|
|
echo "" >$START_LOG
|
|
fi
|
|
rm -rf /tmp/Proxy_Group 2>/dev/null
|
|
}
|
|
|
|
config_su_check()
|
|
{
|
|
echo "配置文件下载成功,检查是否有更新..." >$START_LOG
|
|
if [ -f "$CONFIG_FILE" ]; then
|
|
cmp -s "$BACKPACK_FILE" "$CFG_FILE"
|
|
if [ "$?" -ne 0 ]; then
|
|
echo "配置文件【$name】有更新,开始替换..." >$START_LOG
|
|
mv "$CFG_FILE" "$CONFIG_FILE" 2>/dev/null
|
|
cp "$CONFIG_FILE" "$BACKPACK_FILE"
|
|
config_cus_up
|
|
else
|
|
echo "配置文件【$name】没有任何更新,停止继续操作..." >$START_LOG
|
|
rm -rf "$CFG_FILE"
|
|
echo "${LOGTIME} Updated Config【$name】 No Change, Do Nothing" >>$LOG_FILE
|
|
sleep 5
|
|
echo "" >$START_LOG
|
|
fi
|
|
else
|
|
echo "配置文件下载成功,本地没有配置文件,开始创建 ..." >$START_LOG
|
|
mv "$CFG_FILE" "$CONFIG_FILE" 2>/dev/null
|
|
cp "$CONFIG_FILE" "$BACKPACK_FILE"
|
|
config_cus_up
|
|
fi
|
|
}
|
|
|
|
config_encode()
|
|
{
|
|
/usr/share/openclash/yml_field_name_ch.sh "$CFG_FILE"
|
|
}
|
|
|
|
config_error()
|
|
{
|
|
echo "配置文件【$name】下载失败,请检查网络或稍后再试!" >$START_LOG
|
|
echo "${LOGTIME} Config 【$name】Update Error" >>$LOG_FILE
|
|
rm -rf "$CFG_FILE" 2>/dev/null
|
|
sleep 5
|
|
echo "" >$START_LOG
|
|
}
|
|
|
|
change_dns()
|
|
{
|
|
if pidof clash >/dev/null; then
|
|
if [ "$enable_redirect_dns" -ne 0 ]; then
|
|
uci del dhcp.@dnsmasq[-1].server >/dev/null 2>&1
|
|
uci add_list dhcp.@dnsmasq[0].server=127.0.0.1#"$dns_port" >/dev/null 2>&1
|
|
uci delete dhcp.@dnsmasq[0].resolvfile >/dev/null 2>&1
|
|
uci set dhcp.@dnsmasq[0].noresolv=1 >/dev/null 2>&1
|
|
[ "$disable_masq_cache" -eq 1 ] && {
|
|
uci set dhcp.@dnsmasq[0].cachesize=0 >/dev/null 2>&1
|
|
}
|
|
uci commit dhcp
|
|
/etc/init.d/dnsmasq restart >/dev/null 2>&1
|
|
fi
|
|
nohup /usr/share/openclash/openclash_watchdog.sh &
|
|
fi
|
|
}
|
|
|
|
config_download_direct()
|
|
{
|
|
if pidof clash >/dev/null; then
|
|
echo "配置文件【$name】下载失败,尝试不使用代理下载配置文件..." >$START_LOG
|
|
|
|
kill_watchdog
|
|
|
|
uci del_list dhcp.@dnsmasq[0].server=127.0.0.1#"$dns_port" >/dev/null 2>&1
|
|
uci set dhcp.@dnsmasq[0].resolvfile=/tmp/resolv.conf.auto >/dev/null 2>&1
|
|
uci set dhcp.@dnsmasq[0].noresolv=0 >/dev/null 2>&1
|
|
uci delete dhcp.@dnsmasq[0].cachesize >/dev/null 2>&1
|
|
uci commit dhcp
|
|
/etc/init.d/dnsmasq restart >/dev/null 2>&1
|
|
sleep 3
|
|
|
|
config_download
|
|
|
|
if [ "$?" -eq 0 ] && [ -s "$CFG_FILE" ]; then
|
|
change_dns
|
|
config_su_check
|
|
else
|
|
change_dns
|
|
config_error
|
|
fi
|
|
else
|
|
config_error
|
|
fi
|
|
}
|
|
|
|
sub_info_get()
|
|
{
|
|
local section="$1"
|
|
config_get_bool "enabled" "$section" "enabled" "1"
|
|
config_get "name" "$section" "name" ""
|
|
config_get "type" "$section" "type" ""
|
|
config_get "address" "$section" "address" ""
|
|
config_get "keyword" "$section" "keyword" ""
|
|
config_get "ex_keyword" "$section" "ex_keyword" ""
|
|
|
|
if [ "$enabled" -eq 0 ]; then
|
|
return
|
|
fi
|
|
|
|
if [ -z "$address" ]; then
|
|
return
|
|
else
|
|
subscribe_url="$address"
|
|
fi
|
|
|
|
if [ -z "$name" ]; then
|
|
name="config"
|
|
CONFIG_FILE="/etc/openclash/config/config.yaml"
|
|
BACKPACK_FILE="/etc/openclash/backup/config.yaml"
|
|
else
|
|
CONFIG_FILE="/etc/openclash/config/$name.yaml"
|
|
BACKPACK_FILE="/etc/openclash/backup/$name.yaml"
|
|
fi
|
|
|
|
URL_TYPE="$type"
|
|
|
|
echo "开始更新配置文件【$name】..." >$START_LOG
|
|
|
|
config_download
|
|
|
|
if [ "$?" -eq 0 ] && [ -s "$CFG_FILE" ]; then
|
|
config_encode
|
|
if [ -n "$(grep "^ \{0,\}proxy-groups:" "$CFG_FILE")" ]; then
|
|
if [ -n "$(grep "^ \{0,\}Proxy:" "$CFG_FILE" 2>/dev/null)" ] || [ -n "$(grep "^ \{0,\}proxy-providers:" "$CFG_FILE" 2>/dev/null)" ]; then
|
|
if [ -n "$(grep "^ \{0,\}rules:" "$CFG_FILE" 2>/dev/null)" ] || [ -n "$(grep "^ \{0,\}script:" "$CFG_FILE" 2>/dev/null)" ]; then
|
|
config_su_check
|
|
else
|
|
config_download_direct
|
|
fi
|
|
else
|
|
config_download_direct
|
|
fi
|
|
else
|
|
config_download_direct
|
|
fi
|
|
else
|
|
config_download_direct
|
|
fi
|
|
}
|
|
|
|
#分别获取订阅信息进行处理
|
|
config_load "openclash"
|
|
config_foreach sub_info_get "config_subscribe"
|
|
uci delete openclash.config.config_update_path >/dev/null 2>&1
|
|
uci commit openclash
|
|
|
|
if [ "$if_restart" -eq 1 ]; then
|
|
/etc/init.d/openclash restart >/dev/null 2>&1
|
|
else
|
|
sed -i '/openclash.sh/d' $CRON_FILE 2>/dev/null
|
|
[ "$(uci get openclash.config.auto_update 2>/dev/null)" -eq 1 ] && [ "$(uci get openclash.config.config_auto_update_mode 2>/dev/null)" -ne 1 ] && echo "0 $(uci get openclash.config.auto_update_time 2>/dev/null) * * $(uci get openclash.config.config_update_week_time 2>/dev/null) /usr/share/openclash/openclash.sh" >> $CRON_FILE
|
|
/etc/init.d/cron restart
|
|
fi
|