clash-for-linux/start.sh
2023-12-12 20:02:01 +08:00

172 lines
4.3 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 加载系统函数库(Only for RHEL Linux)
# [ -f /etc/init.d/functions ] && source /etc/init.d/functions
#################### 脚本初始化任务 ####################
# 获取脚本工作目录绝对路径
export Server_Dir=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
# 加载.env变量文件
source $Server_Dir/.env
# 给二进制启动程序、脚本等添加可执行权限
chmod +x $Server_Dir/bin/*
chmod +x $Server_Dir/scripts/*
chmod +x $Server_Dir/tools/subconverter/subconverter
#################### 变量设置 ####################
Conf_Dir="$Server_Dir/conf"
Temp_Dir="$Server_Dir/temp"
Log_Dir="$Server_Dir/logs"
# 将 CLASH_URL 变量的值赋给 URL 变量,并检查 CLASH_URL 是否为空
URL=${CLASH_URL:?Error: CLASH_URL variable is not set or empty}
export URL
export Conf_Dir
export Server_Dir
export Temp_Dir
# 获取 CLASH_SECRET 值,如果不存在则生成一个随机数
Secret=${CLASH_SECRET:-$(openssl rand -hex 32)}
#################### 函数定义 ####################
# 自定义action函数实现通用action功能
success() {
echo -en "\\033[60G[\\033[1;32m OK \\033[0;39m]\r"
return 0
}
failure() {
local rc=$?
echo -en "\\033[60G[\\033[1;31mFAILED\\033[0;39m]\r"
[ -x /bin/plymouth ] && /bin/plymouth --details
return $rc
}
action() {
local STRING rc
STRING=$1
echo -n "$STRING "
shift
"$@" && success $"$STRING" || failure $"$STRING"
rc=$?
echo
return $rc
}
# 判断命令是否正常执行 函数
if_success() {
local ReturnStatus=$3
if [ $ReturnStatus -eq 0 ]; then
action "$1" /bin/true
else
action "$2" /bin/false
exit 1
fi
}
#################### 任务执行 ####################
## 获取CPU架构信息
# Source the script to get CPU architecture
source $Server_Dir/scripts/get_cpu_arch.sh
# Check if we obtained CPU architecture
if [[ -z "$CpuArch" ]]; then
echo "Failed to obtain CPU architecture"
exit 1
fi
## 临时取消环境变量
unset http_proxy
unset https_proxy
unset no_proxy
unset HTTP_PROXY
unset HTTPS_PROXY
unset NO_PROXY
# create logs folder
if [ -d $Server_Dir"/logs" ]; then
echo "" > /dev/null
else
echo -e "\nlogs 文件夹缺失,正在创建..."
mkdir logs
fi
Actual_Conf="$Conf_Dir/config.yaml"
if [ -f $Actual_Conf ]; then
# 获取文件的修改时间(秒级时间戳)
modified_time=$(stat -c %Y "$Actual_Conf")
# 获取当前时间(秒级时间戳)
current_time=$(date +%s)
# 计算文件修改时间距离现在的时间差(秒)
time_diff=$((current_time - modified_time))
# 计算24小时对应的秒数
tf_hours=$((24 * 60 * 60))
echo -e "正在检查先前配置文件"
if [ "$time_diff" -lt "$tf_hours" ]; then
echo -e "\n当前配置文件有效跳过更新"
else
echo -e "\n配置文件已过期重新更新..."
bash update.sh
fi
else
echo -e "\n配置文件不存在重新更新..."
bash update.sh
fi
# Configure Clash Dashboard
Work_Dir=$(cd $(dirname $0); pwd)
Dashboard_Dir="${Work_Dir}/dashboard/public"
sed -ri "s@^# external-ui:.*@external-ui: ${Dashboard_Dir}@g" $Conf_Dir/config.yaml
sed -r -i '/^secret: /s@(secret: ).*@\1'${Secret}'@g' $Conf_Dir/config.yaml
PID=`ps -ef | grep [c]lash-linux-a | awk '{print $2}'`
## Prevent clash instance is started again
if [ -z "$PID" ]; then
echo -e "\nClash 未在运行"
else
echo -e "\n已检测到正在运行的 Clash 实例"
echo -e "\n正在停止 Clash... PID:"$PID
sudo kill -9 $PID
fi
## 启动Clash服务
echo -e '\n正在启动 Clash 服务...'
Text5="服务启动成功!"
Text6="服务启动失败!"
if [[ $CpuArch =~ "x86_64" || $CpuArch =~ "amd64" ]]; then
nohup $Server_Dir/bin/clash-linux-amd64 -d $Conf_Dir &> $Log_Dir/clash.log &
ReturnStatus=$?
if_success $Text5 $Text6 $ReturnStatus
elif [[ $CpuArch =~ "aarch64" || $CpuArch =~ "arm64" ]]; then
nohup $Server_Dir/bin/clash-linux-arm64 -d $Conf_Dir &> $Log_Dir/clash.log &
ReturnStatus=$?
if_success $Text5 $Text6 $ReturnStatus
elif [[ $CpuArch =~ "armv7" ]]; then
nohup $Server_Dir/bin/clash-linux-armv7 -d $Conf_Dir &> $Log_Dir/clash.log &
ReturnStatus=$?
if_success $Text5 $Text6 $ReturnStatus
else
echo -e "\033[31m\n[ERROR] Unsupported CPU Architecture\033[0m"
exit 1
fi
# Output Dashboard access address and Secret
echo ''
echo -e "Clash Dashboard 访问地址: http://localhost:9090/ui"
echo -e "Secret: ${Secret}"
echo ''