211 lines
6.4 KiB
Bash
211 lines
6.4 KiB
Bash
#!/bin/bash
|
|
# Author: Jrohy
|
|
# github: https://github.com/Jrohy/trojan
|
|
|
|
# Supported invocation modes:
|
|
# bash install.sh [--remove]
|
|
# source <(curl -fsSL https://<your-domain>/install.sh) [--remove]
|
|
if (return 0 2>/dev/null); then
|
|
sourced=1
|
|
else
|
|
sourced=0
|
|
fi
|
|
|
|
#定义操作变量, 0为否, 1为是
|
|
help=0
|
|
|
|
remove=0
|
|
|
|
update=0
|
|
|
|
download_url="https://github.com/Jrohy/trojan/releases/download/"
|
|
|
|
version_check="https://api.github.com/repos/Jrohy/trojan/releases/latest"
|
|
|
|
service_url="https://raw.githubusercontent.com/Jrohy/trojan/master/asset/trojan-web.service"
|
|
|
|
[[ -e /var/lib/trojan-manager ]] && update=1
|
|
|
|
#Centos 临时取消别名
|
|
[[ -f /etc/redhat-release && -z $(echo $SHELL|grep zsh) ]] && unalias -a
|
|
|
|
[[ -z $(echo $SHELL|grep zsh) ]] && shell_way="bash" || shell_way="zsh"
|
|
|
|
#######color code########
|
|
red="31m"
|
|
green="32m"
|
|
yellow="33m"
|
|
blue="36m"
|
|
fuchsia="35m"
|
|
|
|
colorEcho(){
|
|
color=$1
|
|
echo -e "\033[${color}${@:2}\033[0m"
|
|
}
|
|
|
|
#######get params#########
|
|
while [[ $# > 0 ]];do
|
|
key="$1"
|
|
case $key in
|
|
--remove)
|
|
remove=1
|
|
;;
|
|
-h|--help)
|
|
help=1
|
|
;;
|
|
*)
|
|
# unknown option
|
|
;;
|
|
esac
|
|
shift # past argument or value
|
|
done
|
|
#############################
|
|
|
|
help(){
|
|
echo "Usage: bash install.sh [-h|--help] [--remove]"
|
|
echo " or: source <(curl -fsSL https://<your-domain>/install.sh) [--remove]"
|
|
echo " -h, --help Show help"
|
|
echo " --remove remove trojan"
|
|
return 0
|
|
}
|
|
|
|
removeTrojan() {
|
|
#移除trojan
|
|
rm -rf /usr/bin/trojan >/dev/null 2>&1
|
|
rm -rf /usr/local/etc/trojan >/dev/null 2>&1
|
|
rm -f /etc/systemd/system/trojan.service >/dev/null 2>&1
|
|
|
|
#移除trojan管理程序
|
|
rm -f /usr/local/bin/trojan >/dev/null 2>&1
|
|
rm -rf /var/lib/trojan-manager >/dev/null 2>&1
|
|
rm -f /etc/systemd/system/trojan-web.service >/dev/null 2>&1
|
|
|
|
systemctl daemon-reload
|
|
|
|
#移除trojan的专用db
|
|
docker rm -f trojan-mysql trojan-mariadb >/dev/null 2>&1
|
|
rm -rf /home/mysql /home/mariadb >/dev/null 2>&1
|
|
|
|
#移除环境变量
|
|
sed -i '/trojan/d' ~/.${shell_way}rc
|
|
source ~/.${shell_way}rc
|
|
|
|
colorEcho ${green} "uninstall success!"
|
|
}
|
|
|
|
checkSys() {
|
|
#检查是否为Root
|
|
[ $(id -u) != "0" ] && { colorEcho ${red} "Error: You must be root to run this script"; return 1; }
|
|
|
|
arch=$(uname -m 2> /dev/null)
|
|
if [[ $arch != x86_64 && $arch != aarch64 ]];then
|
|
colorEcho $yellow "not support $arch machine".
|
|
return 1
|
|
fi
|
|
|
|
if [[ `command -v apt-get` ]];then
|
|
package_manager='apt-get'
|
|
elif [[ `command -v dnf` ]];then
|
|
package_manager='dnf'
|
|
elif [[ `command -v yum` ]];then
|
|
package_manager='yum'
|
|
else
|
|
colorEcho $red "Not support OS!"
|
|
return 1
|
|
fi
|
|
|
|
# 缺失/usr/local/bin路径时自动添加
|
|
[[ -z `echo $PATH|grep /usr/local/bin` ]] && { echo 'export PATH=$PATH:/usr/local/bin' >> /etc/bashrc; source /etc/bashrc; }
|
|
}
|
|
|
|
#安装依赖
|
|
installDependent(){
|
|
if [[ ${package_manager} == 'dnf' || ${package_manager} == 'yum' ]];then
|
|
${package_manager} install socat crontabs bash-completion -y
|
|
else
|
|
${package_manager} update
|
|
${package_manager} install socat cron bash-completion xz-utils -y
|
|
fi
|
|
}
|
|
|
|
setupCron() {
|
|
if [[ `crontab -l 2>/dev/null|grep acme` ]]; then
|
|
if [[ -z `crontab -l 2>/dev/null|grep trojan-web` || `crontab -l 2>/dev/null|grep trojan-web|grep "&"` ]]; then
|
|
#计算北京时间早上3点时VPS的实际时间
|
|
origin_time_zone=$(date -R|awk '{printf"%d",$6}')
|
|
local_time_zone=${origin_time_zone%00}
|
|
beijing_zone=8
|
|
beijing_update_time=3
|
|
diff_zone=$[$beijing_zone-$local_time_zone]
|
|
local_time=$[$beijing_update_time-$diff_zone]
|
|
if [ $local_time -lt 0 ];then
|
|
local_time=$[24+$local_time]
|
|
elif [ $local_time -ge 24 ];then
|
|
local_time=$[$local_time-24]
|
|
fi
|
|
crontab -l 2>/dev/null|sed '/acme.sh/d' > crontab.txt
|
|
echo "0 ${local_time}"' * * * systemctl stop trojan-web; "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null; systemctl start trojan-web' >> crontab.txt
|
|
crontab crontab.txt
|
|
rm -f crontab.txt
|
|
fi
|
|
fi
|
|
}
|
|
|
|
installTrojan(){
|
|
local show_tip=0
|
|
if [[ $update == 1 ]];then
|
|
systemctl stop trojan-web >/dev/null 2>&1
|
|
rm -f /usr/local/bin/trojan
|
|
fi
|
|
lastest_version=$(curl -H 'Cache-Control: no-cache' -s "$version_check" | grep 'tag_name' | cut -d\" -f4)
|
|
echo "正在下载管理程序`colorEcho $blue $lastest_version`版本..."
|
|
[[ $arch == x86_64 ]] && bin="trojan-linux-amd64" || bin="trojan-linux-arm64"
|
|
curl -L "$download_url/$lastest_version/$bin" -o /usr/local/bin/trojan
|
|
chmod +x /usr/local/bin/trojan
|
|
if [[ ! -e /etc/systemd/system/trojan-web.service ]];then
|
|
show_tip=1
|
|
curl -L $service_url -o /etc/systemd/system/trojan-web.service
|
|
systemctl daemon-reload
|
|
systemctl enable trojan-web
|
|
fi
|
|
#命令补全环境变量
|
|
[[ -z $(grep trojan ~/.${shell_way}rc) ]] && echo "source <(trojan completion ${shell_way})" >> ~/.${shell_way}rc
|
|
source ~/.${shell_way}rc
|
|
if [[ $update == 0 ]];then
|
|
colorEcho $green "安装trojan管理程序成功!\n"
|
|
echo -e "运行命令`colorEcho $blue trojan`可进行trojan管理\n"
|
|
/usr/local/bin/trojan
|
|
else
|
|
if [[ `cat /usr/local/etc/trojan/config.json|grep -w "\"db\""` ]];then
|
|
sed -i "s/\"db\"/\"database\"/g" /usr/local/etc/trojan/config.json
|
|
systemctl restart trojan
|
|
fi
|
|
/usr/local/bin/trojan upgrade db
|
|
if [[ -z `cat /usr/local/etc/trojan/config.json|grep sni` ]];then
|
|
/usr/local/bin/trojan upgrade config
|
|
fi
|
|
systemctl restart trojan-web
|
|
colorEcho $green "更新trojan管理程序成功!\n"
|
|
fi
|
|
setupCron
|
|
[[ $show_tip == 1 ]] && echo "浏览器访问'`colorEcho $blue https://域名`'可在线trojan多用户管理"
|
|
}
|
|
|
|
main(){
|
|
[[ ${help} == 1 ]] && help && return
|
|
[[ ${remove} == 1 ]] && removeTrojan && return
|
|
[[ $update == 0 ]] && echo "正在安装trojan管理程序.." || echo "正在更新trojan管理程序.."
|
|
checkSys || return 1
|
|
[[ $update == 0 ]] && installDependent
|
|
installTrojan
|
|
}
|
|
|
|
main "$@"
|
|
result=$?
|
|
|
|
# Do not terminate the interactive shell when the script was invoked by source.
|
|
if [[ $sourced == 1 ]]; then
|
|
return $result
|
|
fi
|
|
exit $result
|