v2ray-agent/shell/install_en.sh

4291 lines
139 KiB
Bash
Raw Normal View History

2021-08-26 17:42:59 +08:00
#!/usr/bin/env bash
# Detection area
# -------------------------------------------------------------
# Inspection system
export LANG=en_US.UTF-8
echoContent() {
case $1 in
# Red
"red")
# shellcheck disable=SC2154
${echoType} "\033[31m${printN}$2 \033[0m"
;;
# sky blue
"skyBlue")
${echoType} "\033[1;36m${printN}$2 \033[0m"
;;
# green
"green")
${echoType} "\033[32m${printN}$2 \033[0m"
;;
# White
"white")
${echoType} "\033[37m${printN}$2 \033[0m"
;;
"magenta")
${echoType} "\033[31m${printN}$2 \033[0m"
;;
# yellow
"yellow")
${echoType} "\033[33m${printN}$2 \033[0m"
;;
esac
}
checkSystem() {
if [[ -n $(find /etc -name "redhat-release") ]] || grep </proc/version -q -i "centos"; then
mkdir -p /etc/yum.repos.d
if [[ -f "/etc/centos-release" ]];then
centosVersion=$(rpm -q centos-release | awk -F "[-]" '{print $3}' | awk -F "[.]" '{print $1}')
if [[ -z "${centosVersion}" ]] && grep </etc/centos-release -q -i "release 8"; then
centosVersion=8
fi
fi
release="centos"
installType='yum -y install'
removeType='yum -y remove'
upgrade="yum update -y --skip-broken"
elif grep </etc/issue -q -i "debian" && [[ -f "/etc/issue" ]] || grep </etc/issue -q -i "debian" && [[ -f "/proc/version" ]]; then
if grep </etc/issue -i "8"; then
debianVersion=8
fi
release="debian"
installType='apt -y install'
upgrade="apt update"
removeType='apt -y autoremove'
elif grep </etc/issue -q -i "ubuntu" && [[ -f "/etc/issue" ]] || grep </etc/issue -q -i "ubuntu" && [[ -f "/proc/version" ]]; then
release="ubuntu"
installType='apt -y install'
upgrade="apt update"
removeType='apt -y autoremove'
if grep </etc/issue -q -i "16.";then
release=
fi
fi
if [[ -z ${release} ]]; then
echoContent red "\n This script does not support this system, please feed back the following logs to developers \ n"
echoContent yellow "$(cat /etc/issue)"
echoContent yellow "$(cat /proc/version)"
exit 0
fi
}
# Check the CPU provider
checkCPUVendor() {
if [[ -n $(which uname) ]]; then
if [[ "$(uname)" == "Linux" ]];then
case "$(uname -m)" in
'amd64' | 'x86_64')
xrayCoreCPUVendor="Xray-linux-64"
v2rayCoreCPUVendor="v2ray-linux-64"
trojanGoCPUVendor="trojan-go-linux-amd64"
;;
'armv8' | 'aarch64')
xrayCoreCPUVendor="Xray-linux-arm64-v8a"
v2rayCoreCPUVendor="v2ray-linux-arm64-v8a"
trojanGoCPUVendor="trojan-go-linux-armv8"
;;
*)
echo " Does not support this CPU architecture --->"
exit 1
;;
esac
fi
else
echoContent red " Unable to recognize this CPU architecture, default AMD64, X86_64--->"
xrayCoreCPUVendor="Xray-linux-64"
v2rayCoreCPUVendor="v2ray-linux-64"
trojanGoCPUVendor="trojan-go-linux-amd64"
fi
}
# Initialization global variable
initVar() {
installType='yum -y install'
removeType='yum -y remove'
upgrade="yum -y update"
echoType='echo -e'
# Core supported CPU version
xrayCoreCPUVendor=""
v2rayCoreCPUVendor=""
trojanGoCPUVendor=""
# domain name
domain=
# Cdn node Address
add=
# Total installation
totalProgress=1
# 1.xray-core Install
# 2.v2ray-core Install
# 3.v2ray-core[xtls] Install
coreInstallType=
# Core installation PATH
# coreInstallPath=
# v2ctl Path
ctlPath=
# 1.All installation
# 2.Personalization installation
# v2rayAgentInstallType=
# Current personalization installation method 01234
currentInstallProtocolType=
# Pre-type
frontingType=
# Selected personalized installation method
selectCustomInstallType=
# v2ray-core、xray-core Path of the configuration file
configPath=
# Profile path
currentPath=
# Profile host
currentHost=
# Selected when installing core Types of
selectCoreType=
# Default Core version
v2rayCoreVersion=
# Random path
customPath=
# centos version
centosVersion=
# UUID
currentUUID=
# pingIPv6 pingIPv4
# pingIPv4=
pingIP=
pingIPv6=
localIP=
2021-08-30 17:57:24 +08:00
# Integrated Update Certificate Logic No longer use separate scripts--RenewTLS
2021-08-26 17:42:59 +08:00
renewTLS=$1
2021-08-30 17:57:24 +08:00
# Number of attempts after a failed tls installation
2021-08-26 17:42:59 +08:00
installTLSCount=
}
# Detection installation method
readInstallType() {
coreInstallType=
configPath=
# 1.Detection installation directory
if [[ -d "/etc/v2ray-agent" ]]; then
# Detection installation method v2ray-core
if [[ -d "/etc/v2ray-agent/v2ray" && -f "/etc/v2ray-agent/v2ray/v2ray" && -f "/etc/v2ray-agent/v2ray/v2ctl" ]]; then
if [[ -d "/etc/v2ray-agent/v2ray/conf" && -f "/etc/v2ray-agent/v2ray/conf/02_VLESS_TCP_inbounds.json" ]]; then
configPath=/etc/v2ray-agent/v2ray/conf/
if ! grep </etc/v2ray-agent/v2ray/conf/02_VLESS_TCP_inbounds.json -q xtls; then
# V2ray without XTLS-core
coreInstallType=2
# coreInstallPath=/etc/v2ray-agent/v2ray/v2ray
ctlPath=/etc/v2ray-agent/v2ray/v2ctl
elif grep </etc/v2ray-agent/v2ray/conf/02_VLESS_TCP_inbounds.json -q xtls; then
# V2ray with XTLS-core
# coreInstallPath=/etc/v2ray-agent/v2ray/v2ray
ctlPath=/etc/v2ray-agent/v2ray/v2ctl
coreInstallType=3
fi
fi
fi
if [[ -d "/etc/v2ray-agent/xray" && -f "/etc/v2ray-agent/xray/xray" ]]; then
# Test Xray here-core
if [[ -d "/etc/v2ray-agent/xray/conf" ]] && [[ -f "/etc/v2ray-agent/xray/conf/02_VLESS_TCP_inbounds.json" || -f "/etc/v2ray-agent/xray/conf/02_trojan_TCP_inbounds.json" ]]; then
# xray-core
configPath=/etc/v2ray-agent/xray/conf/
# coreInstallPath=/etc/v2ray-agent/xray/xray
ctlPath=/etc/v2ray-agent/xray/xray
coreInstallType=1
fi
fi
fi
}
# Read protocol type
readInstallProtocolType() {
currentInstallProtocolType=
while read -r row; do
if echo ${row} | grep -q 02_trojan_TCP_inbounds; then
currentInstallProtocolType=${currentInstallProtocolType}'trojan'
frontingType=02_trojan_TCP_inbounds
fi
if echo ${row} | grep -q VLESS_TCP_inbounds; then
currentInstallProtocolType=${currentInstallProtocolType}'0'
frontingType=02_VLESS_TCP_inbounds
fi
if echo ${row} | grep -q VLESS_WS_inbounds; then
currentInstallProtocolType=${currentInstallProtocolType}'1'
fi
if echo ${row} | grep -q trojan_gRPC_inbounds; then
currentInstallProtocolType=${currentInstallProtocolType}'2'
fi
if echo ${row} | grep -q VMess_WS_inbounds; then
currentInstallProtocolType=${currentInstallProtocolType}'3'
fi
if echo ${row} | grep -q 04_trojan_TCP_inbounds; then
currentInstallProtocolType=${currentInstallProtocolType}'4'
fi
if echo ${row} | grep -q VLESS_gRPC_inbounds; then
currentInstallProtocolType=${currentInstallProtocolType}'5'
fi
done < <(ls ${configPath} | grep inbounds.json | awk -F "[.]" '{print $1}')
}
# Check file directory and path path
readConfigHostPathUUID() {
currentPath=
currentUUID=
currentHost=
currentPort=
currentAdd=
# 读取path
if [[ -n "${configPath}" ]]; then
local fallback=$(jq -r -c '.inbounds[0].settings.fallbacks[]|select(.path)' ${configPath}${frontingType}.json|head -1)
local path=$(echo "${fallback}"|jq -r .path|awk -F "[/]" '{print $2}')
if [[ $(echo "${fallback}"|jq -r .dest) == 31297 ]]; then
currentPath=$(echo "${path}" | awk -F "[w][s]" '{print $1}')
elif [[ $(echo "${fallback}"|jq -r .dest) == 31298 ]]; then
currentPath=$(echo "${path}" | awk -F "[t][c][p]" '{print $1}')
elif [[ $(echo "${fallback}"|jq -r .dest) == 31299 ]]; then
currentPath=$(echo "${path}" | awk -F "[v][w][s]" '{print $1}')
fi
fi
if [[ "${coreInstallType}" == "1" ]]; then
currentHost=$(jq -r .inbounds[0].streamSettings.xtlsSettings.certificates[0].certificateFile ${configPath}${frontingType}.json | awk -F '[t][l][s][/]' '{print $2}' | awk -F '[.][c][r][t]' '{print $1}')
currentUUID=$(jq -r .inbounds[0].settings.clients[0].id ${configPath}${frontingType}.json)
currentAdd=$(jq -r .inbounds[0].settings.clients[0].add ${configPath}${frontingType}.json)
if [[ "${currentAdd}" == "null" ]];then
currentAdd=${currentHost}
fi
currentPort=$(jq .inbounds[0].port ${configPath}${frontingType}.json)
elif [[ "${coreInstallType}" == "2" || "${coreInstallType}" == "3" ]]; then
if [[ "${coreInstallType}" == "3" ]]; then
currentHost=$(jq -r .inbounds[0].streamSettings.xtlsSettings.certificates[0].certificateFile ${configPath}${frontingType}.json | awk -F '[t][l][s][/]' '{print $2}' | awk -F '[.][c][r][t]' '{print $1}')
else
currentHost=$(jq -r .inbounds[0].streamSettings.tlsSettings.certificates[0].certificateFile ${configPath}${frontingType}.json | awk -F '[t][l][s][/]' '{print $2}' | awk -F '[.][c][r][t]' '{print $1}')
fi
currentAdd=$(jq -r .inbounds[0].settings.clients[0].add ${configPath}${frontingType}.json)
if [[ "${currentAdd}" == "null" ]];then
currentAdd=${currentHost}
fi
currentUUID=$(jq -r .inbounds[0].settings.clients[0].id ${configPath}${frontingType}.json)
currentPort=$(jq .inbounds[0].port ${configPath}${frontingType}.json)
fi
}
# Status display
showInstallStatus() {
if [[ -n "${coreInstallType}" ]]; then
if [[ "${coreInstallType}" == 1 ]]; then
if [[ -n $(pgrep -f xray/xray) ]]; then
echoContent yellow "\n core: xray-core[Run in operation]"
else
echoContent yellow "\n core: xray-core[Not running]"
fi
elif [[ "${coreInstallType}" == 2 || "${coreInstallType}" == 3 ]]; then
if [[ -n $(pgrep -f v2ray/v2ray) ]]; then
echoContent yellow "\n core: v2ray-core[Run in operation]"
else
echoContent yellow "\n core: v2ray-core[Not running]"
fi
fi
# Read protocol type
readInstallProtocolType
if [[ -n ${currentInstallProtocolType} ]]; then
echoContent yellow "Installed protocol:\c"
fi
if echo ${currentInstallProtocolType} | grep -q 0; then
if [[ "${coreInstallType}" == 2 ]]; then
echoContent yellow "VLESS+TCP[TLS] \c"
else
echoContent yellow "VLESS+TCP[TLS/XTLS] \c"
fi
fi
if echo ${currentInstallProtocolType} | grep -q trojan; then
if [[ "${coreInstallType}" == 1 ]]; then
echoContent yellow "Trojan+TCP[TLS/XTLS] \c"
fi
fi
if echo ${currentInstallProtocolType} | grep -q 1; then
echoContent yellow "VLESS+WS[TLS] \c"
fi
if echo ${currentInstallProtocolType} | grep -q 2; then
echoContent yellow "Trojan+gRPC[TLS] \c"
fi
if echo ${currentInstallProtocolType} | grep -q 3; then
echoContent yellow "VMess+WS[TLS] \c"
fi
if echo ${currentInstallProtocolType} | grep -q 4; then
echoContent yellow "Trojan+TCP[TLS] \c"
fi
if echo ${currentInstallProtocolType} | grep -q 5; then
echoContent yellow "VLESS+gRPC[TLS] \c"
fi
fi
}
# Clean up old residue
cleanUp() {
if [[ "$1" == "v2rayClean" ]]; then
rm -rf "$(find /etc/v2ray-agent/v2ray/* | grep -E '(config_full.json|conf)')"
handleV2Ray stop >/dev/null
rm -f /etc/systemd/system/v2ray.service
elif [[ "$1" == "xrayClean" ]]; then
rm -rf "$(find /etc/v2ray-agent/xray/* | grep -E '(config_full.json|conf)')"
handleXray stop >/dev/null
rm -f /etc/systemd/system/xray.service
elif [[ "$1" == "v2rayDel" ]]; then
rm -rf /etc/v2ray-agent/v2ray/*
elif [[ "$1" == "xrayDel" ]]; then
rm -rf /etc/v2ray-agent/xray/*
fi
}
initVar $1
checkSystem
checkCPUVendor
readInstallType
readInstallProtocolType
readConfigHostPathUUID
# -------------------------------------------------------------
# Initialization installation directory
mkdirTools() {
mkdir -p /etc/v2ray-agent/tls
mkdir -p /etc/v2ray-agent/subscribe
mkdir -p /etc/v2ray-agent/subscribe_tmp
mkdir -p /etc/v2ray-agent/v2ray/conf
mkdir -p /etc/v2ray-agent/xray/conf
mkdir -p /etc/v2ray-agent/trojan
mkdir -p /etc/systemd/system/
mkdir -p /tmp/v2ray-agent-tls/
}
# Installation kit
installTools() {
echo 'Installation tool'
2021-08-30 17:57:24 +08:00
echoContent skyBlue "\n progress $1/${totalProgress} : Installation tool"
2021-08-26 17:42:59 +08:00
# Repair Ubuntu Individual System Issues
if [[ "${release}" == "ubuntu" ]]; then
dpkg --configure -a
fi
if [[ -n $(pgrep -f "apt") ]]; then
pgrep -f apt | xargs kill -9
fi
echoContent green " ---> Check, installation update [new machine will be very slow, if there is no response for a long time, please re-execute it manually]"
${upgrade} >/dev/null 2>&1
if [[ "${release}" == "centos" ]]; then
rm -rf /var/run/yum.pid
${installType} epel-release >/dev/null 2>&1
fi
# [[ -z `find /usr/bin /usr/sbin |grep -v grep|grep -w curl` ]]
if ! find /usr/bin /usr/sbin | grep -q -w wget; then
echoContent green " ---> Install wget"
${installType} wget >/dev/null 2>&1
fi
if ! find /usr/bin /usr/sbin | grep -q -w curl; then
echoContent green " ---> Install CURL"
${installType} curl >/dev/null 2>&1
fi
if ! find /usr/bin /usr/sbin | grep -q -w unzip; then
echoContent green " ---> Install unzip"
${installType} unzip >/dev/null 2>&1
fi
if ! find /usr/bin /usr/sbin | grep -q -w socat; then
echoContent green " ---> Install SOCAT"
${installType} socat >/dev/null 2>&1
fi
if ! find /usr/bin /usr/sbin | grep -q -w tar; then
echoContent green " ---> Install tar"
${installType} tar >/dev/null 2>&1
fi
if ! find /usr/bin /usr/sbin | grep -q -w cron; then
echoContent green " ---> Install crontabs"
if [[ "${release}" == "ubuntu" ]] || [[ "${release}" == "debian" ]]; then
${installType} cron >/dev/null 2>&1
else
${installType} crontabs >/dev/null 2>&1
fi
fi
if ! find /usr/bin /usr/sbin | grep -q -w jq; then
echoContent green " ---> Install JQ"
${installType} jq >/dev/null 2>&1
fi
if ! find /usr/bin /usr/sbin | grep -q -w binutils; then
echoContent green " ---> Install binutils"
${installType} binutils >/dev/null 2>&1
fi
if ! find /usr/bin /usr/sbin | grep -q -w ping6; then
echoContent green " ---> Install PING6"
${installType} inetutils-ping >/dev/null 2>&1
fi
if ! find /usr/bin /usr/sbin | grep -q -w qrencode; then
echoContent green " ---> Install QRencode"
${installType} qrencode >/dev/null 2>&1
fi
if ! find /usr/bin /usr/sbin | grep -q -w sudo; then
echoContent green " ---> Cheap Sudo"
${installType} sudo >/dev/null 2>&1
fi
if ! find /usr/bin /usr/sbin | grep -q -w lsb-release; then
echoContent green " ---> Install LSB-RELEASE"
${installType} lsb-release >/dev/null 2>&1
fi
# Detect the NGINX version and provide options to be uninstalled
if ! find /usr/bin /usr/sbin | grep -q -w nginx; then
echoContent green " ---> Install nginx"
installNginxTools
else
nginxVersion=$(nginx -v 2>&1)
nginxVersion=$(echo "${nginxVersion}" | awk -F "[n][g][i][n][x][/]" '{print $2}' | awk -F "[.]" '{print $2}')
if [[ ${nginxVersion} -lt 14 ]]; then
read -r -p "Reading to the current NGINX version does not support GRPC, resulting in failure, whether to uninstall NGINX, reinstall [y/n]:" unInstallNginxStatus
if [[ "${unInstallNginxStatus}" == "y" ]]; then
${removeType} nginx >/dev/null 2>&1
echoContent yellow " ---> Nginx uninstalled completion"
echoContent green " ---> Install nginx"
installNginxTools >/dev/null 2>&1
else
exit 0
fi
fi
fi
if ! find /usr/bin /usr/sbin | grep -q -w semanage; then
echoContent green " ---> Install semanage"
${installType} bash-completion >/dev/null 2>&1
if [[ "${centosVersion}" == "7" ]]; then
policyCoreUtils="policycoreutils-python.x86_64"
elif [[ "${centosVersion}" == "8" ]]; then
policyCoreUtils="policycoreutils-python-utils-2.9-9.el8.noarch"
fi
if [[ -n "${policyCoreUtils}" ]]; then
${installType} ${policyCoreUtils} >/dev/null 2>&1
fi
if [[ -n $(which semanage) ]]; then
semanage port -a -t http_port_t -p tcp 31300
fi
fi
if [[ ! -d "$HOME/.acme.sh" ]] || [[ -d "$HOME/.acme.sh" && -z $(find "$HOME/.acme.sh/acme.sh") ]]; then
echoContent green " ---> Install acme.sh"
curl -s https://get.acme.sh | sh -s >/etc/v2ray-agent/tls/acme.log 2>&1
if [[ ! -d "$HOME/.acme.sh" ]] || [[ -z $(find "$HOME/.acme.sh/acme.sh") ]]; then
echoContent red " acme installation failed--->"
tail -n 100 /etc/v2ray-agent/tls/acme.log
echoContent yellow "Error investigation:"
echoContent red " 1.Get the github file failed, please wait for Gitub to restore, try, recover progress to view [https://www.githubstatus.com/]"
echoContent red " 2.acme.the sh script has bugs, you can view[https://github.com/acmesh-official/acme.sh] issues"
exit 0
fi
fi
}
# Install nginx
installNginxTools() {
if [[ "${release}" == "debian" ]]; then
sudo apt install gnupg2 ca-certificates lsb-release -y >/dev/null 2>&1
echo "deb http://nginx.org/packages/mainline/debian $(lsb_release -cs) nginx" | sudo tee /etc/apt/sources.list.d/nginx.list >/dev/null 2>&1
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" | sudo tee /etc/apt/preferences.d/99nginx >/dev/null 2>&1
curl -o /tmp/nginx_signing.key https://nginx.org/keys/nginx_signing.key >/dev/null 2>&1
# gpg --dry-run --quiet --import --import-options import-show /tmp/nginx_signing.key
sudo mv /tmp/nginx_signing.key /etc/apt/trusted.gpg.d/nginx_signing.asc
sudo apt update >/dev/null 2>&1
elif [[ "${release}" == "ubuntu" ]]; then
sudo apt install gnupg2 ca-certificates lsb-release -y >/dev/null 2>&1
echo "deb http://nginx.org/packages/mainline/ubuntu $(lsb_release -cs) nginx" | sudo tee /etc/apt/sources.list.d/nginx.list >/dev/null 2>&1
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" | sudo tee /etc/apt/preferences.d/99nginx >/dev/null 2>&1
curl -o /tmp/nginx_signing.key https://nginx.org/keys/nginx_signing.key >/dev/null 2>&1
# gpg --dry-run --quiet --import --import-options import-show /tmp/nginx_signing.key
sudo mv /tmp/nginx_signing.key /etc/apt/trusted.gpg.d/nginx_signing.asc
sudo apt update >/dev/null 2>&1
elif [[ "${release}" == "centos" ]]; then
${installType} yum-utils >/dev/null 2>&1
cat <<EOF >/etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
sudo yum-config-manager --enable nginx-mainline >/dev/null 2>&1
fi
${installType} nginx >/dev/null 2>&1
systemctl daemon-reload
systemctl enable nginx
}
# Install WARP
installWarp(){
${installType} gnupg2 -y >/dev/null 2>&1
if [[ "${release}" == "debian" ]]; then
curl -s https://pkg.cloudflareclient.com/pubkey.gpg | sudo apt-key add - >/dev/null 2>&1
echo "deb http://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflare-client.list >/dev/null 2>&1
sudo apt update >/dev/null 2>&1
elif [[ "${release}" == "ubuntu" ]]; then
curl -s https://pkg.cloudflareclient.com/pubkey.gpg | sudo apt-key add - >/dev/null 2>&1
echo "deb http://pkg.cloudflareclient.com/ focal main" | sudo tee /etc/apt/sources.list.d/cloudflare-client.list >/dev/null 2>&1
sudo apt update >/dev/null 2>&1
elif [[ "${release}" == "centos" ]]; then
${installType} yum-utils >/dev/null 2>&1
sudo rpm -ivh http://pkg.cloudflareclient.com/cloudflare-release-el${centosVersion}.rpm >/dev/null 2>&1
fi
echoContent green " ---> Install WARP"
${installType} cloudflare-warp >/dev/null 2>&1
if [[ -z $(which warp-cli) ]];then
echoContent red " ---> Install WARP failed"
exit 0;
fi
systemctl enable warp-svc
warp-cli --accept-tos register
warp-cli --accept-tos set-mode proxy
warp-cli --accept-tos set-proxy-port 31303
warp-cli --accept-tos connect
# if [[]];then
# fi
# todo curl --socks5 127.0.0.1:31303 https://www.cloudflare.com/cdn-cgi/trace
# systemctl daemon-reload
# systemctl enable cloudflare-warp
}
# Initialization Nginx application certificate configuration
initTLSNginxConfig() {
handleNginx stop
echoContent skyBlue "\n progress $1/${totalProgress} : Initialization Nginx application certificate configuration"
if [[ -n "${currentHost}" ]]; then
echo
read -r -p "Read it to the last installation record, whether the domain name when the last installation is used [y/n]:" historyDomainStatus
if [[ "${historyDomainStatus}" == "y" ]]; then
domain=${currentHost}
echoContent yellow "\n ---> domain name:${domain}"
else
echo
echoContent yellow "Please enter the domain name to configurewww.v2ray-agent.com --->"
read -r -p "domain name:" domain
fi
else
echo
echoContent yellow "Please enter the domain name you want to configure examplewww.v2ray-agent.com --->"
read -r -p "domain name:" domain
fi
if [[ -z ${domain} ]]; then
echoContent red " Domain name--->"
initTLSNginxConfig
else
2021-08-30 17:57:24 +08:00
# update config
2021-08-26 17:42:59 +08:00
touch /etc/nginx/conf.d/alone.conf
cat <<EOF >/etc/nginx/conf.d/alone.conf
server {
listen 80;
listen [::]:80;
server_name ${domain};
root /usr/share/nginx/html;
location ~ /.well-known {
allow all;
}
location /test {
return 200 'fjkvymb6len';
}
location /ip {
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header REMOTE-HOST \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
default_type text/plain;
return 200 \$proxy_add_x_forwarded_for;
}
}
EOF
2021-08-30 17:57:24 +08:00
# start nginx
2021-08-26 17:42:59 +08:00
handleNginx start
checkIP
fi
}
# Modify NGINX redirection configuration
updateRedirectNginxConf() {
cat <<EOF >/etc/nginx/conf.d/alone.conf
server {
listen 80;
listen [::]:80;
server_name ${domain};
# shellcheck disable=SC2154
return 301 https://${domain}$request_uri;
}
server {
listen 127.0.0.1:31300;
server_name _;
return 403;
}
EOF
if [[ -n $(echo "${selectCustomInstallType}" |grep 2) && -n $(echo "${selectCustomInstallType}" |grep 5) ]] || [[ -z "${selectCustomInstallType}" ]];then
cat <<EOF >>/etc/nginx/conf.d/alone.conf
server {
listen 127.0.0.1:31302 http2;
server_name ${domain};
root /usr/share/nginx/html;
location /s/ {
add_header Content-Type text/plain;
alias /etc/v2ray-agent/subscribe/;
}
location /${currentPath}grpc {
client_max_body_size 0;
# keepalive_time 1071906480m;
keepalive_requests 4294967296;
client_body_timeout 1071906480m;
send_timeout 1071906480m;
lingering_close always;
grpc_read_timeout 1071906480m;
grpc_send_timeout 1071906480m;
grpc_pass grpc://127.0.0.1:31301;
}
location /${currentPath}trojangrpc {
client_max_body_size 0;
# keepalive_time 1071906480m;
keepalive_requests 4294967296;
client_body_timeout 1071906480m;
send_timeout 1071906480m;
lingering_close always;
grpc_read_timeout 1071906480m;
grpc_send_timeout 1071906480m;
grpc_pass grpc://127.0.0.1:31304;
}
}
EOF
elif echo "${selectCustomInstallType}" |grep -q 5 || [[ -z "${selectCustomInstallType}" ]]; then
cat <<EOF >>/etc/nginx/conf.d/alone.conf
server {
listen 127.0.0.1:31302 http2;
server_name ${domain};
root /usr/share/nginx/html;
location /s/ {
add_header Content-Type text/plain;
alias /etc/v2ray-agent/subscribe/;
}
location /${currentPath}grpc {
client_max_body_size 0;
# keepalive_time 1071906480m;
keepalive_requests 4294967296;
client_body_timeout 1071906480m;
send_timeout 1071906480m;
lingering_close always;
grpc_read_timeout 1071906480m;
grpc_send_timeout 1071906480m;
grpc_pass grpc://127.0.0.1:31301;
}
}
EOF
elif echo "${selectCustomInstallType}" |grep -q 2 || [[ -z "${selectCustomInstallType}" ]];then
cat <<EOF >>/etc/nginx/conf.d/alone.conf
server {
listen 127.0.0.1:31302 http2;
server_name ${domain};
root /usr/share/nginx/html;
location /s/ {
add_header Content-Type text/plain;
alias /etc/v2ray-agent/subscribe/;
}
location /${currentPath}trojangrpc {
client_max_body_size 0;
# keepalive_time 1071906480m;
keepalive_requests 4294967296;
client_body_timeout 1071906480m;
send_timeout 1071906480m;
lingering_close always;
grpc_read_timeout 1071906480m;
grpc_send_timeout 1071906480m;
grpc_pass grpc://127.0.0.1:31301;
}
}
EOF
else
cat <<EOF >>/etc/nginx/conf.d/alone.conf
server {
listen 127.0.0.1:31302 http2;
server_name ${domain};
root /usr/share/nginx/html;
location /s/ {
add_header Content-Type text/plain;
alias /etc/v2ray-agent/subscribe/;
}
location / {
}
}
EOF
fi
cat <<EOF >>/etc/nginx/conf.d/alone.conf
server {
listen 127.0.0.1:31300;
server_name ${domain};
root /usr/share/nginx/html;
location /s/ {
add_header Content-Type text/plain;
alias /etc/v2ray-agent/subscribe/;
}
location / {
add_header Strict-Transport-Security "max-age=15552000; preload" always;
}
}
EOF
}
# Check IP
checkIP() {
echoContent skyBlue "\n ---> Check the domain name IP address"
localIP=$(curl -s -m 2 "${domain}/ip")
handleNginx stop
if [[ -z ${localIP} ]] || ! echo "${localIP}"|sed '1{s/[^(]*(//;s/).*//;q}'|grep -q '\.' && ! echo "${localIP}"|sed '1{s/[^(]*(//;s/).*//;q}'|grep -q ':';then
echoContent red "\n ---> The ip of the current domain name is not detected"
echoContent yellow " ---> Please check if the domain name is written correctly"
echoContent yellow " ---> Please check whether the domain name dns resolution is correct"
echoContent yellow " ---> If the resolution is correct, please wait for the dns to take effect, it is expected to take effect within three minutes"
echoContent yellow " ---> If the above settings are correct, please try again after reinstalling the pure system"
if [[ -n ${localIP} ]];then
echoContent yellow " ---> Detecting return value exceptions"
fi
echoContent red " ---> Please check if the firewall is closed\n"
read -r -p "Whether to turn off the firewall via script[y/n]:" disableFirewallStatus
if [[ ${disableFirewallStatus} == "y" ]];then
handleFirewall stop
fi
exit 0;
fi
if echo "${localIP}"|awk -F "[,]" '{print $2}'|grep -q "." || echo "${localIP}"|awk -F "[,]" '{print $2}'|grep -q ":";then
echoContent red "\n ---> Multiple ip detected, please confirm whether to turn off the cloudflare proxy"
echoContent yellow " ---> Close the cloudflare proxy and wait three minutes before retrying"
echoContent yellow " ---> The detected ip is as follows[${localIP}]"
exit 0;
fi
echoContent green " ---> Current domain ip is[${localIP}]"
}
# Install TLS
installTLS() {
echoContent skyBlue "\n progress $1/${totalProgress} : Apply for a TLS certificate\n"
local tlsDomain=${domain}
# Install TLS
if [[ -f "/etc/v2ray-agent/tls/${tlsDomain}.crt" && -f "/etc/v2ray-agent/tls/${tlsDomain}.key" && -n $(cat "/etc/v2ray-agent/tls/${tlsDomain}.crt") ]] || [[ -d "$HOME/.acme.sh/${tlsDomain}_ecc" && -f "$HOME/.acme.sh/${tlsDomain}_ecc/${tlsDomain}.key" && -f "$HOME/.acme.sh/${tlsDomain}_ecc/${tlsDomain}.cer" ]]; then
# Have a certificate
echoContent green " ---> Certificate"
checkTLStatus "${tlsDomain}"
if [[ "${tlsStatus}" == "expired" ]]; then
rm -rf $HOME/.acme.sh/${tlsDomain}_ecc/*
rm -rf /etc/v2ray-agent/tls/${tlsDomain}*
installTLS "$1"
else
echoContent green " ---> Certificate is valid"
if ! ls /etc/v2ray-agent/tls/ | grep -q "${tlsDomain}.crt" || ! ls /etc/v2ray-agent/tls/ | grep -q "${tlsDomain}.key" || [[ -z $(cat "/etc/v2ray-agent/tls/${tlsDomain}.crt") ]]; then
sudo "$HOME/.acme.sh/acme.sh" --installcert -d "${tlsDomain}" --fullchainpath "/etc/v2ray-agent/tls/${tlsDomain}.crt" --keypath "/etc/v2ray-agent/tls/${tlsDomain}.key" --ecc >/dev/null
else
echoContent yellow " ---> If you have not expired, please choose[n]\n"
read -r -p "Do you reinstall?[y/n]:" reInstallStatus
if [[ "${reInstallStatus}" == "y" ]]; then
rm -rf /etc/v2ray-agent/tls/*
installTLS "$1"
fi
fi
fi
elif [[ -d "$HOME/.acme.sh" ]] && [[ ! -f "$HOME/.acme.sh/${tlsDomain}_ecc/${tlsDomain}.cer" || ! -f "$HOME/.acme.sh/${tlsDomain}_ecc/${tlsDomain}.key" ]]; then
echoContent green " ---> Install TLS certificate"
if [[ -n "${pingIPv6}" ]]; then
sudo "$HOME/.acme.sh/acme.sh" --issue -d "${tlsDomain}" --standalone -k ec-256 --server letsencrypt --listen-v6 >> /etc/v2ray-agent/tls/acme.log
else
sudo "$HOME/.acme.sh/acme.sh" --issue -d "${tlsDomain}" --standalone -k ec-256 --server letsencrypt >> /etc/v2ray-agent/tls/acme.log
fi
if [[ -d "$HOME/.acme.sh/${tlsDomain}_ecc" && -f "$HOME/.acme.sh/${tlsDomain}_ecc/${tlsDomain}.key" && -f "$HOME/.acme.sh/${tlsDomain}_ecc/${tlsDomain}.cer" ]]; then
sudo "$HOME/.acme.sh/acme.sh" --installcert -d "${tlsDomain}" --fullchainpath "/etc/v2ray-agent/tls/${tlsDomain}.crt" --keypath "/etc/v2ray-agent/tls/${tlsDomain}.key" --ecc >/dev/null
fi
if [[ ! -f "/etc/v2ray-agent/tls/${tlsDomain}.crt" || ! -f "/etc/v2ray-agent/tls/${tlsDomain}.key" ]] || [[ -z $(cat "/etc/v2ray-agent/tls/${tlsDomain}.key") || -z $(cat "/etc/v2ray-agent/tls/${tlsDomain}.crt") ]]; then
tail -n 10 /etc/v2ray-agent/tls/acme.log
if [[ ${installTLSCount} == "1" ]];then
echoContent red " ---> TLS installation failed, please check acme logs"
exit 0
fi
echoContent red " ---> TLS installation failed, check the firewall in"
handleFirewall stop
echoContent yellow " ---> Retry to install the TLS certificate"
installTLSCount=1
installTLS "$1"
fi
echoContent green " ---> TLS generation success"
else
echoContent yellow " ---> No acme is installed"
exit 0
fi
}
# Configure a camouflage blog
initNginxConfig() {
echoContent skyBlue "\n progress $1/${totalProgress} : Configuring nginx"
cat <<EOF >/etc/nginx/conf.d/alone.conf
server {
listen 80;
listen [::]:80;
server_name ${domain};
root /usr/share/nginx/html;
location ~ /.well-known {allow all;}
location /test {return 200 'fjkvymb6len';}
}
EOF
}
# customize/Random path
randomPathFunction() {
echoContent skyBlue "\n progress $1/${totalProgress} : Generate a random path"
if [[ -n "${currentPath}" ]]; then
echo
read -r -p "Read to the last installation record, use the PATH path when the last installation is installed [y/n]:" historyPathStatus
echo
fi
if [[ "${historyPathStatus}" == "y" ]]; then
customPath=${currentPath}
echoContent green " ---> Successful use\n"
else
echoContent yellow "Please enter a custom path[example: alone] path should be without slash. empty means random"
read -r -p 'path:' customPath
if [[ -z "${customPath}" ]]; then
customPath=$(head -n 50 /dev/urandom | sed 's/[^a-z]//g' | strings -n 4 | tr 'A-Z' 'a-z' | head -1)
currentPath=${customPath:0:4}
customPath=${currentPath}
else
currentPath=${customPath}
fi
fi
echoContent yellow "\n path${currentPath}"
echoContent skyBlue "\n----------------------------"
}
# Nginx camouflage blog
nginxBlog() {
echoContent skyBlue "\n progress $1/${totalProgress} : Add a camouflage site"
if [[ -d "/usr/share/nginx/html" && -f "/usr/share/nginx/html/check" ]]; then
echo
read -r -p "Detecting the installation camouflage site, do you need to reinstall?[y/n]" nginxBlogInstallStatus
if [[ "${nginxBlogInstallStatus}" == "y" ]]; then
rm -rf /usr/share/nginx/html
randomNum=$((RANDOM%6+1))
wget -q -P /usr/share/nginx https://raw.githubusercontent.com/mack-a/v2ray-agent/master/fodder/blog/unable/html${randomNum}.zip >/dev/null
unzip -o /usr/share/nginx/html${randomNum}.zip -d /usr/share/nginx/html >/dev/null
rm -f /usr/share/nginx/html${randomNum}.zip*
echoContent green " ---> Add a camouflage site successfully"
fi
else
randomNum=$((RANDOM%6+1))
rm -rf /usr/share/nginx/html
wget -q -P /usr/share/nginx https://raw.githubusercontent.com/mack-a/v2ray-agent/master/fodder/blog/unable/html${randomNum}.zip >/dev/null
unzip -o /usr/share/nginx/html${randomNum}.zip -d /usr/share/nginx/html >/dev/null
rm -f /usr/share/nginx/html${randomNum}.zip*
echoContent green " ---> Add a camouflage site successfully"
fi
}
# Operation Nginx
handleNginx() {
if [[ -z $(pgrep -f "nginx") ]] && [[ "$1" == "start" ]]; then
nginx
sleep 0.5
if ! ps -ef | grep -v grep | grep -q nginx; then
echoContent red " ---> Nginx start failed"
echoContent red " ---> Please manually try NGINX, execute the script again"
exit 0
fi
elif [[ "$1" == "stop" ]] && [[ -n $(pgrep -f "nginx") ]]; then
nginx -s stop >/dev/null 2>&1
sleep 0.5
if [[ -n $(pgrep -f "nginx") ]]; then
pgrep -f "nginx" | xargs kill -9
fi
fi
}
# Timed task update TLS certificate
installCronTLS() {
echoContent skyBlue "\n progress $1/${totalProgress} : Add tls certificate"
crontab -l >/etc/v2ray-agent/backup_crontab.cron
local historyCrontab=$(sed '/v2ray-agent/d;/acme.sh/d' /etc/v2ray-agent/backup_crontab.cron)
echo "${historyCrontab}" >/etc/v2ray-agent/backup_crontab.cron
echo "30 1 * * * /bin/bash /etc/v2ray-agent/install.sh RenewTLS >> /etc/v2ray-agent/crontab_tls.log 2>&1" >>/etc/v2ray-agent/backup_crontab.cron
crontab /etc/v2ray-agent/backup_crontab.cron
echoContent green "\n ---> Adding tls success"
}
# Update certificate
renewalTLS() {
echoContent skyBlue "\n progress 1/1 : Update certificate"
if [[ -d "$HOME/.acme.sh/${currentHost}_ecc" ]] && [[ -f "$HOME/.acme.sh/${currentHost}_ecc/${currentHost}.key" ]] && [[ -f "$HOME/.acme.sh/${currentHost}_ecc/${currentHost}.cer" ]]; then
modifyTime=$(stat $HOME/.acme.sh/${currentHost}_ecc/${currentHost}.cer | sed -n '7,6p' | awk '{print $2" "$3" "$4" "$5}')
modifyTime=$(date +%s -d "${modifyTime}")
currentTime=$(date +%s)
stampDiff=$(expr ${currentTime} - ${modifyTime})
days=$(expr ${stampDiff} / 86400)
remainingDays=$(expr 90 - ${days})
tlsStatus=${remainingDays}
if [[ ${remainingDays} -le 0 ]]; then
tlsStatus="expired"
fi
echoContent skyBlue " ---> Certificate check dates:$(date "+%F %H:%M:%S")"
echoContent skyBlue " ---> Certificate generation date:$(date -d @"${modifyTime}" +"%F %H:%M:%S")"
echoContent skyBlue " ---> Certificate generation days:${days}"
echoContent skyBlue " ---> Certificate remaining days:"${tlsStatus}
echoContent skyBlue " ---> Automatic update before the certificate expires, such as update failure, please update manually"
if [[ ${remainingDays} -le 1 ]]; then
echoContent yellow " ---> Regeneration certificate"
handleNginx stop
sudo "$HOME/.acme.sh/acme.sh" --cron --home "$HOME/.acme.sh"
sudo "$HOME/.acme.sh/acme.sh" --installcert -d "${currentHost}" --fullchainpath /etc/v2ray-agent/tls/"${currentHost}.crt" --keypath /etc/v2ray-agent/tls/"${currentHost}.key" --ecc
reloadCore
else
echoContent green " ---> Certificate is valid"
fi
else
echoContent red " ---> Not Installed"
fi
}
# View the status of the TLS certificate
checkTLStatus() {
if [[ -n "$1" ]]; then
if [[ -d "$HOME/.acme.sh/$1_ecc" ]] && [[ -f "$HOME/.acme.sh/$1_ecc/$1.key" ]] && [[ -f "$HOME/.acme.sh/$1_ecc/$1.cer" ]]; then
modifyTime=$(stat $HOME/.acme.sh/$1_ecc/$1.key | sed -n '7,6p' | awk '{print $2" "$3" "$4" "$5}')
modifyTime=$(date +%s -d "${modifyTime}")
currentTime=$(date +%s)
stampDiff=$(expr ${currentTime} - ${modifyTime})
days=$(expr ${stampDiff} / 86400)
remainingDays=$(expr 90 - ${days})
tlsStatus=${remainingDays}
if [[ ${remainingDays} -le 0 ]]; then
tlsStatus="expired"
fi
echoContent skyBlue " ---> Certificate generation date:$(date -d "@${modifyTime}" +"%F %H:%M:%S")"
echoContent skyBlue " ---> Certificate generation days:${days}"
echoContent skyBlue " ---> Certificate remaining days:${tlsStatus}"
fi
fi
}
# Install v2ray, specify version
installV2Ray() {
readInstallType
echoContent skyBlue "\n progress $1/${totalProgress} : Install v2ray"
if [[ "${coreInstallType}" != "2" && "${coreInstallType}" != "3" ]]; then
if [[ "${selectCoreType}" == "2" ]]; then
version=$(curl -s https://api.github.com/repos/v2fly/v2ray-core/releases | jq -r .[].tag_name|head -1)
else
version=${v2rayCoreVersion}
fi
echoContent green " ---> v2ray-core version:${version}"
if wget --help | grep -q show-progress; then
wget -c -q --show-progress -P /etc/v2ray-agent/v2ray/ "https://github.com/v2fly/v2ray-core/releases/download/${version}/${v2rayCoreCPUVendor}.zip"
else
wget -c -P /etc/v2ray-agent/v2ray/ "https://github.com/v2fly/v2ray-core/releases/download/${version}/${v2rayCoreCPUVendor}.zip" >/dev/null 2>&1
fi
unzip -o /etc/v2ray-agent/v2ray/${v2rayCoreCPUVendor}.zip -d /etc/v2ray-agent/v2ray >/dev/null
rm -rf /etc/v2ray-agent/v2ray/${v2rayCoreCPUVendor}.zip
else
if [[ "${selectCoreType}" == "3" ]]; then
echoContent green " ---> lock v2ray-core version is v4.32.1"
rm -f /etc/v2ray-agent/v2ray/v2ray
rm -f /etc/v2ray-agent/v2ray/v2ctl
installV2Ray "$1"
else
echoContent green " ---> v2ray-core version:$(/etc/v2ray-agent/v2ray/v2ray --version | awk '{print $2}' | head -1)"
read -r -p "Is it updated, upgrade?[y/n]:" reInstallV2RayStatus
if [[ "${reInstallV2RayStatus}" == "y" ]]; then
rm -f /etc/v2ray-agent/v2ray/v2ray
rm -f /etc/v2ray-agent/v2ray/v2ctl
installV2Ray "$1"
fi
fi
fi
}
# Install XRay
installXray() {
readInstallType
echoContent skyBlue "\n progress $1/${totalProgress} : Install XRay"
if [[ "${coreInstallType}" != "1" ]]; then
version=$(curl -s https://api.github.com/repos/XTLS/Xray-core/releases | jq -r .[].tag_name|head -1)
echoContent green " ---> Xray-core version:${version}"
if wget --help | grep -q show-progress; then
wget -c -q --show-progress -P /etc/v2ray-agent/xray/ "https://github.com/XTLS/Xray-core/releases/download/${version}/${xrayCoreCPUVendor}.zip"
else
wget -c -P /etc/v2ray-agent/xray/ "https://github.com/XTLS/Xray-core/releases/download/${version}/${xrayCoreCPUVendor}.zip" >/dev/null 2>&1
fi
unzip -o /etc/v2ray-agent/xray/${xrayCoreCPUVendor}.zip -d /etc/v2ray-agent/xray >/dev/null
rm -rf /etc/v2ray-agent/xray/${xrayCoreCPUVendor}.zip
chmod 655 /etc/v2ray-agent/xray/xray
else
echoContent green " ---> Xray-core version:$(/etc/v2ray-agent/xray/xray --version | awk '{print $2}' | head -1)"
read -r -p "Is it updated, upgrade?[y/n]:" reInstallXrayStatus
if [[ "${reInstallXrayStatus}" == "y" ]]; then
rm -f /etc/v2ray-agent/xray/xray
installXray "$1"
fi
fi
}
# Install Trojan-go
installTrojanGo() {
echoContent skyBlue "\n progress $1/${totalProgress} : Install Trojan-Go"
if ! ls /etc/v2ray-agent/trojan/ | grep -q trojan-go; then
version=$(curl -s https://api.github.com/repos/p4gefau1t/trojan-go/releases | jq -r .[0].tag_name)
echoContent green " ---> Trojan-Go version:${version}"
if wget --help | grep -q show-progress; then
wget -c -q --show-progress -P /etc/v2ray-agent/trojan/ "https://github.com/p4gefau1t/trojan-go/releases/download/${version}/${trojanGoCPUVendor}.zip"
else
wget -c -P /etc/v2ray-agent/trojan/ "https://github.com/p4gefau1t/trojan-go/releases/download/${version}/${trojanGoCPUVendor}.zip" >/dev/null 2>&1
fi
unzip -o /etc/v2ray-agent/trojan/${trojanGoCPUVendor}.zip -d /etc/v2ray-agent/trojan >/dev/null
rm -rf /etc/v2ray-agent/trojan/${trojanGoCPUVendor}.zip
else
echoContent green " ---> Trojan-Go version:$(/etc/v2ray-agent/trojan/trojan-go --version | awk '{print $2}' | head -1)"
read -r -p "Do you reinstall?[y/n]:" reInstallTrojanStatus
if [[ "${reInstallTrojanStatus}" == "y" ]]; then
rm -rf /etc/v2ray-agent/trojan/trojan-go*
installTrojanGo "$1"
fi
fi
}
# V2Ray version management
v2rayVersionManageMenu() {
echoContent skyBlue "\n progress $1/${totalProgress} : V2Ray version management"
if [[ ! -d "/etc/v2ray-agent/v2ray/" ]]; then
echoContent red " ---> No installation directory is detected, please perform script installation content"
menu
exit 0
fi
echoContent red "\n=============================================================="
echoContent yellow "1.upgrade"
echoContent yellow "2.go back"
echoContent yellow "3.Close V2ray-core"
echoContent yellow "4.Open v2ray-core"
echoContent yellow "5.Restart V2Ray-core"
echoContent red "=============================================================="
read -r -p "please choose:" selectV2RayType
if [[ "${selectV2RayType}" == "1" ]]; then
updateV2Ray
elif [[ "${selectV2RayType}" == "2" ]]; then
echoContent yellow "\n1.Can only fall back to the most recent version"
echoContent yellow "2.Do not guarantee that you must use it normally after the fallback"
echoContent yellow "3.If the version of the rollback does not support the current config, it will not be able to connect, careful"
echoContent skyBlue "------------------------Version-------------------------------"
curl -s https://api.github.com/repos/v2fly/v2ray-core/releases | jq -r .[].tag_name| head -5| awk '{print ""NR""":"$0}'
echoContent skyBlue "--------------------------------------------------------------"
read -r -p "Please enter the version you want to fall back:" selectV2rayVersionType
version=$(curl -s https://api.github.com/repos/v2fly/v2ray-core/releases | jq -r .[].tag_name| head -5| awk '{print ""NR""":"$0}' | grep "${selectV2rayVersionType}:" | awk -F "[:]" '{print $2}')
if [[ -n "${version}" ]]; then
updateV2Ray ${version}
else
echoContent red "\n ---> Enter is incorrect, please re-enter"
v2rayVersionManageMenu 1
fi
elif [[ "${selectXrayType}" == "3" ]]; then
handleV2Ray stop
elif [[ "${selectXrayType}" == "4" ]]; then
handleV2Ray start
elif [[ "${selectXrayType}" == "5" ]]; then
reloadCore
fi
}
# XRay version management
xrayVersionManageMenu() {
echoContent skyBlue "\n progress $1/${totalProgress} : XRay version management"
if [[ ! -d "/etc/v2ray-agent/xray/" ]]; then
echoContent red " ---> No installation directory is detected, please perform script installation content"
menu
exit 0
fi
echoContent red "\n=============================================================="
echoContent yellow "1.upgrade"
echoContent yellow "2.go back"
echoContent yellow "3.Close xray-core"
echoContent yellow "4.Open xray-core"
echoContent yellow "5.Restart XRAY-core"
echoContent red "=============================================================="
read -r -p "please choose:" selectXrayType
if [[ "${selectXrayType}" == "1" ]]; then
updateXray
elif [[ "${selectXrayType}" == "2" ]]; then
echoContent yellow "\n1.Due to XRay-Core frequently updated, only two recent versions"
echoContent yellow "2.Do not guarantee that you must use it normally after the fallback"
echoContent yellow "3.If the version of the rollback does not support the current config, it will not be able to connect, careful"
echoContent skyBlue "------------------------Version-------------------------------"
curl -s https://api.github.com/repos/XTLS/Xray-core/releases | jq -r .[].tag_name| head -2 | awk '{print ""NR""":"$0}'
echoContent skyBlue "--------------------------------------------------------------"
read -r -p "Please enter the version you want to fall back:" selectXrayVersionType
version=$(curl -s https://api.github.com/repos/XTLS/Xray-core/releases | jq -r .[].tag_name| head -2 | awk '{print ""NR""":"$0}' | grep "${selectXrayVersionType}:" | awk -F "[:]" '{print $2}')
if [[ -n "${version}" ]]; then
updateXray "${version}"
else
echoContent red "\n ---> Enter is incorrect, please re-enter"
xrayVersionManageMenu 1
fi
elif [[ "${selectXrayType}" == "3" ]]; then
handleXray stop
elif [[ "${selectXrayType}" == "4" ]]; then
handleXray start
elif [[ "${selectXrayType}" == "5" ]]; then
reloadCore
fi
}
# Update V2ray
updateV2Ray() {
readInstallType
if [[ -z "${coreInstallType}" ]]; then
if [[ -n "$1" ]]; then
version=$1
else
version=$(curl -s https://api.github.com/repos/v2fly/v2ray-core/releases | jq -r .[0].tag_name)
fi
# Use the locked version
if [[ -n "${v2rayCoreVersion}" ]]; then
version=${v2rayCoreVersion}
fi
echoContent green " ---> v2ray-Core version:${version}"
if wget --help | grep -q show-progress; then
wget -c -q --show-progress -P /etc/v2ray-agent/v2ray/ "https://github.com/v2fly/v2ray-core/releases/download/${version}/${v2rayCoreCPUVendor}.zip"
else
wget -c -P "/etc/v2ray-agent/v2ray/ https://github.com/v2fly/v2ray-core/releases/download/${version}/${v2rayCoreCPUVendor}.zip" >/dev/null 2>&1
fi
unzip -o /etc/v2ray-agent/v2ray/${v2rayCoreCPUVendor}.zip -d /etc/v2ray-agent/v2ray >/dev/null
rm -rf /etc/v2ray-agent/v2ray/${v2rayCoreCPUVendor}.zip
handleV2Ray stop
handleV2Ray start
else
echoContent green " ---> Current v2ray-Core version:$(/etc/v2ray-agent/v2ray/v2ray --version | awk '{print $2}' | head -1)"
if [[ -n "$1" ]]; then
version=$1
else
version=$(curl -s https://api.github.com/repos/v2fly/v2ray-core/releases | jq -r .[0].tag_name)
fi
if [[ -n "${v2rayCoreVersion}" ]]; then
version=${v2rayCoreVersion}
fi
if [[ -n "$1" ]]; then
read -r -p "Retreat${version},Whether to continue?[y/n]:" rollbackV2RayStatus
if [[ "${rollbackV2RayStatus}" == "y" ]]; then
if [[ "${coreInstallType}" == "2" || "${coreInstallType}" == "3" ]]; then
echoContent green " ---> Current v2ray-Core version:$(/etc/v2ray-agent/v2ray/v2ray --version | awk '{print $2}' | head -1)"
elif [[ "${coreInstallType}" == "1" ]]; then
echoContent green " ---> Current Xray-Core version:$(/etc/v2ray-agent/xray/xray --version | awk '{print $2}' | head -1)"
fi
handleV2Ray stop
rm -f /etc/v2ray-agent/v2ray/v2ray
rm -f /etc/v2ray-agent/v2ray/v2ctl
updateV2Ray "${version}"
else
echoContent green " ---> Abandon the retreat version"
fi
elif [[ "${version}" == "v$(/etc/v2ray-agent/v2ray/v2ray --version | awk '{print $2}' | head -1)" ]]; then
read -r -p "The current version is the same as the latest version, is it reinstalled?[y/n]:" reInstallV2RayStatus
if [[ "${reInstallV2RayStatus}" == "y" ]]; then
handleV2Ray stop
rm -f /etc/v2ray-agent/v2ray/v2ray
rm -f /etc/v2ray-agent/v2ray/v2ctl
updateV2Ray
else
echoContent green " ---> Abandon reinstall"
fi
else
read -r -p "The latest version is:${version}Is it updated?[y/n]" installV2RayStatus
if [[ "${installV2RayStatus}" == "y" ]]; then
rm -f /etc/v2ray-agent/v2ray/v2ray
rm -f /etc/v2ray-agent/v2ray/v2ctl
updateV2Ray
else
echoContent green " ---> Give up update"
fi
fi
fi
}
# Update xray
updateXray() {
readInstallType
if [[ -z "${coreInstallType}" ]]; then
if [[ -n "$1" ]]; then
version=$1
else
version=$(curl -s https://api.github.com/repos/XTLS/Xray-core/releases | jq -r .[0].tag_name)
fi
echoContent green " ---> Xray-Core version:${version}"
if wget --help | grep -q show-progress; then
wget -c -q --show-progress -P /etc/v2ray-agent/xray/ "https://github.com/XTLS/Xray-core/releases/download/${version}/${xrayCoreCPUVendor}.zip"
else
wget -c -P /etc/v2ray-agent/xray/ "https://github.com/XTLS/Xray-core/releases/download/${version}/${xrayCoreCPUVendor}.zip" >/dev/null 2>&1
fi
unzip -o /etc/v2ray-agent/xray/${xrayCoreCPUVendor}.zip -d /etc/v2ray-agent/xray >/dev/null
rm -rf /etc/v2ray-agent/xray/${xrayCoreCPUVendor}.zip
chmod 655 /etc/v2ray-agent/xray/xray
handleXray stop
handleXray start
else
echoContent green " ---> Current Xray-Core version:$(/etc/v2ray-agent/xray/xray --version | awk '{print $2}' | head -1)"
if [[ -n "$1" ]]; then
version=$1
else
version=$(curl -s https://api.github.com/repos/XTLS/Xray-core/releases | jq -r .[0].tag_name)
fi
if [[ -n "$1" ]]; then
read -r -p "Retreat${version},Whether to continue?[y/n]:" rollbackXrayStatus
if [[ "${rollbackXrayStatus}" == "y" ]]; then
echoContent green " ---> Current Xray-Core version:$(/etc/v2ray-agent/xray/xray --version | awk '{print $2}' | head -1)"
handleXray stop
rm -f /etc/v2ray-agent/xray/xray
updateXray "${version}"
else
echoContent green " ---> Abandon the retreat version"
fi
elif [[ "${version}" == "v$(/etc/v2ray-agent/xray/xray --version | awk '{print $2}' | head -1)" ]]; then
read -r -p "The current version is the same as the latest version, is it reinstalled?[y/n]:" reInstallXrayStatus
if [[ "${reInstallXrayStatus}" == "y" ]]; then
handleXray stop
rm -f /etc/v2ray-agent/xray/xray
rm -f /etc/v2ray-agent/xray/xray
updateXray
else
echoContent green " ---> Abandon reinstall"
fi
else
read -r -p "The latest version is:${version}Is it updated?[y/n]" installXrayStatus
if [[ "${installXrayStatus}" == "y" ]]; then
rm -f /etc/v2ray-agent/xray/xray
updateXray
else
echoContent green " ---> Give up update"
fi
fi
fi
}
2021-08-30 17:57:24 +08:00
# Verify that the entire service is available
2021-08-26 17:42:59 +08:00
checkGFWStatue() {
readInstallType
echoContent skyBlue "\n progress $1/${totalProgress} : Verify service startup status"
if [[ "${coreInstallType}" == "1" ]] && [[ -n $(pgrep -f xray/xray) ]]; then
echoContent green " ---> Service starts success"
elif [[ "${coreInstallType}" == "2" || "${coreInstallType}" == "3" ]] && [[ -n $(pgrep -f v2ray/v2ray) ]]; then
echoContent green " ---> Service starts success"
else
echoContent red " ---> Service startup failed, please check if the terminal has a log printing"
exit 0
fi
}
# V2RAY boot
installV2RayService() {
echoContent skyBlue "\n progress $1/${totalProgress} : Configuring V2RAY boot"
if [[ -n $(find /bin /usr/bin -name "systemctl") ]]; then
rm -rf /etc/systemd/system/v2ray.service
touch /etc/systemd/system/v2ray.service
execStart='/etc/v2ray-agent/v2ray/v2ray -confdir /etc/v2ray-agent/v2ray/conf'
cat <<EOF >/etc/systemd/system/v2ray.service
[Unit]
Description=V2Ray - A unified platform for anti-censorship
Documentation=https://v2ray.com https://guide.v2fly.org
After=network.target nss-lookup.target
Wants=network-online.target
[Service]
Type=simple
User=root
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_NET_RAW
NoNewPrivileges=yes
ExecStart=${execStart}
Restart=on-failure
RestartPreventExitStatus=23
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable v2ray.service
echoContent green " ---> Configuring V2RAY boot self-start"
fi
}
# XRay boot
installXrayService() {
echoContent skyBlue "\n progress $1/${totalProgress} : Configuring XRAY boot self-start"
if [[ -n $(find /bin /usr/bin -name "systemctl") ]]; then
rm -rf /etc/systemd/system/xray.service
touch /etc/systemd/system/xray.service
execStart='/etc/v2ray-agent/xray/xray run -confdir /etc/v2ray-agent/xray/conf'
cat <<EOF >/etc/systemd/system/xray.service
[Unit]
Description=Xray - A unified platform for anti-censorship
# Documentation=https://v2ray.com https://guide.v2fly.org
After=network.target nss-lookup.target
Wants=network-online.target
[Service]
Type=simple
User=root
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_NET_RAW
NoNewPrivileges=yes
ExecStart=${execStart}
Restart=on-failure
RestartPreventExitStatus=23
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable xray.service
echoContent green " ---> Configuring XRAY boot self-start"
fi
}
# Trojan boot self-start
installTrojanService() {
echoContent skyBlue "\n progress $1/${totalProgress} : Configuring Trojan boot self-start"
if [[ -n $(find /bin /usr/bin -name "systemctl") ]]; then
rm -rf /etc/systemd/system/trojan-go.service
touch /etc/systemd/system/trojan-go.service
cat <<EOF >/etc/systemd/system/trojan-go.service
[Unit]
Description=Trojan-Go - A unified platform for anti-censorship
Documentation=Trojan-Go
After=network.target nss-lookup.target
Wants=network-online.target
[Service]
Type=simple
User=root
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_NET_RAW
NoNewPrivileges=yes
ExecStart=/etc/v2ray-agent/trojan/trojan-go -config /etc/v2ray-agent/trojan/config_full.json
Restart=on-failure
RestartPreventExitStatus=23
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable trojan-go.service
echoContent green " ---> Configuring Trojan boot self-starting"
fi
}
# Operation v2ray
handleV2Ray() {
# shellcheck disable=SC2010
if find /bin /usr/bin | grep -q systemctl && ls /etc/systemd/system/ | grep -q v2ray.service; then
if [[ -z $(pgrep -f "v2ray/v2ray") ]] && [[ "$1" == "start" ]]; then
systemctl start v2ray.service
elif [[ -n $(pgrep -f "v2ray/v2ray") ]] && [[ "$1" == "stop" ]]; then
systemctl stop v2ray.service
fi
fi
sleep 0.8
if [[ "$1" == "start" ]]; then
if [[ -n $(pgrep -f "v2ray/v2ray") ]]; then
echoContent green " ---> V2Ray starts success"
else
echoContent red "V2Ray starts failed"
echoContent red "Please manually【/etc/v2ray-agent/v2ray/v2ray -confdir /etc/v2ray-agent/v2ray/conf】View the error log"
exit 0
fi
elif [[ "$1" == "stop" ]]; then
if [[ -z $(pgrep -f "v2ray/v2ray") ]]; then
echoContent green " ---> V2RAY is successful"
else
echoContent red "V2Ray Close failed"
echoContent red "Please manually【ps -ef|grep -v grep|grep v2ray|awk '{print \$2}'|xargs kill -9】"
exit 0
fi
fi
}
# Operation XRAY
handleXray() {
if [[ -n $(find /bin /usr/bin -name "systemctl") ]] && ls /etc/systemd/system/ | grep -q xray.service; then
if [[ -z $(pgrep -f "xray/xray") ]] && [[ "$1" == "start" ]]; then
systemctl start xray.service
elif [[ -n $(pgrep -f "xray/xray") ]] && [[ "$1" == "stop" ]]; then
systemctl stop xray.service
fi
fi
sleep 0.8
if [[ "$1" == "start" ]]; then
if [[ -n $(pgrep -f "xray/xray") ]]; then
echoContent green " ---> Xray started successfully"
else
echoContent red "XRay start failed"
echoContent red "Please manually【/etc/v2ray-agent/xray/xray -confdir /etc/v2ray-agent/xray/conf】View the error log"
exit 0
fi
elif [[ "$1" == "stop" ]]; then
if [[ -z $(pgrep -f "xray/xray") ]]; then
echoContent green " ---> XRay close success"
else
echoContent red "XRay Close failed"
echoContent red "Please manually【ps -ef|grep -v grep|grep xray|awk '{print \$2}'|xargs kill -9】"
exit 0
fi
fi
}
# Operation Trojan-Go
handleTrojanGo() {
if [[ -n $(find /bin /usr/bin -name "systemctl") ]] && ls /etc/systemd/system/ | grep -q trojan-go.service; then
if [[ -z $(pgrep -f "trojan-go") ]] && [[ "$1" == "start" ]]; then
systemctl start trojan-go.service
elif [[ -n $(pgrep -f "trojan-go") ]] && [[ "$1" == "stop" ]]; then
systemctl stop trojan-go.service
fi
fi
sleep 0.5
if [[ "$1" == "start" ]]; then
if [[ -n $(pgrep -f "trojan-go") ]]; then
echoContent green " ---> Trojan-GO starts success"
else
echoContent red "Trojan-Go failed to start"
echoContent red "Please manually【/etc/v2ray-agent/trojan/trojan-go -config /etc/v2ray-agent/trojan/config_full.json】View the error log"
exit 0
fi
elif [[ "$1" == "stop" ]]; then
if [[ -z $(pgrep -f "trojan-go") ]]; then
echoContent green " ---> Trojan-GO close success"
else
echoContent red "Trojan-GO close failed"
echoContent red "Please manually【ps -ef|grep -v grep|grep trojan-go|awk '{print \$2}'|xargs kill -9】"
exit 0
fi
fi
}
# Initialize V2RAY configuration file
initV2RayConfig() {
echoContent skyBlue "\n schedule $2/${totalProgress} : Initialize V2RAY configuration"
echo
read -r -p "Whether it is customized UUID [y/n]:" customUUIDStatus
echo
if [[ "${customUUIDStatus}" == "y" ]]; then
read -r -p "Please enter legal UUID:" currentCustomUUID
if [[ -n "${currentCustomUUID}" ]]; then
uuid=${currentCustomUUID}
fi
fi
if [[ -n "${currentUUID}" && -z "${uuid}" ]]; then
read -r -p "Read to the last installation recordWhether to use the last installation UUID [y/n]:" historyUUIDStatus
if [[ "${historyUUIDStatus}" == "y" ]]; then
uuid=${currentUUID}
else
uuid=$(/etc/v2ray-agent/v2ray/v2ctl uuid)
fi
elif [[ -z "${uuid}" ]]; then
uuid=$(/etc/v2ray-agent/v2ray/v2ctl uuid)
fi
if [[ -z "${uuid}" ]]; then
echoContent red "\n ---> uuid Read errorregenerate"
uuid=$(/etc/v2ray-agent/v2ray/v2ctl uuid)
fi
rm -rf /etc/v2ray-agent/v2ray/conf/*
rm -rf /etc/v2ray-agent/v2ray/config_full.json
cat <<EOF >/etc/v2ray-agent/v2ray/conf/00_log.json
{
"log": {
"error": "/etc/v2ray-agent/v2ray/error.log",
"loglevel": "warning"
}
}
EOF
# outbounds
if [[ -n "${pingIPv6}" ]]; then
cat <<EOF >/etc/v2ray-agent/v2ray/conf/10_ipv6_outbounds.json
{
"outbounds": [
{
"protocol": "freedom",
"settings": {},
"tag": "direct"
}
]
}
EOF
else
cat <<EOF >/etc/v2ray-agent/v2ray/conf/10_ipv4_outbounds.json
{
"outbounds":[
{
"protocol":"freedom",
"settings":{
"domainStrategy":"UseIPv4"
},
"tag":"IPv4-out"
},
{
"protocol":"freedom",
"settings":{
"domainStrategy":"UseIPv6"
},
"tag":"IPv6-out"
},
{
"protocol":"blackhole",
"tag":"blackhole-out"
}
]
}
EOF
fi
# dns
cat <<EOF >/etc/v2ray-agent/v2ray/conf/11_dns.json
{
"dns": {
"servers": [
"localhost"
]
}
}
EOF
# VLESS_TCP_TLS/XTLS
# Fall back nginx
local fallbacksList='{"dest":31300,"xver":0},{"alpn":"h2","dest":31302,"xver":0}'
if [[ -n $(echo "${selectCustomInstallType}" | grep 4) || "$1" == "all" ]]; then
fallbacksList='{"dest":31296,"xver":1},{"alpn":"h2","dest":31302,"xver":0}'
cat <<EOF >/etc/v2ray-agent/v2ray/conf/04_trojan_TCP_inbounds.json
{
"inbounds":[
{
"port": 31296,
"listen": "127.0.0.1",
"protocol": "trojan",
"tag":"trojanTCP",
"settings": {
"clients": [
{
"password": "${uuid}",
"email": "${domain}_trojan_tcp"
}
],
"fallbacks":[
{"dest":"31300"}
]
},
"streamSettings": {
"network": "tcp",
"security": "none",
"tcpSettings": {
"acceptProxyProtocol": true
}
}
}
]
}
EOF
fi
# VLESS_WS_TLS
if echo "${selectCustomInstallType}" | grep -q 1 || [[ "$1" == "all" ]]; then
fallbacksList=${fallbacksList}',{"path":"/'${customPath}'ws","dest":31297,"xver":1}'
cat <<EOF >/etc/v2ray-agent/v2ray/conf/03_VLESS_WS_inbounds.json
{
"inbounds":[
{
"port": 31297,
"listen": "127.0.0.1",
"protocol": "vless",
"tag":"VLESSWS",
"settings": {
"clients": [
{
"id": "${uuid}",
"email": "${domain}_VLESS_WS"
}
],
"decryption": "none"
},
"streamSettings": {
"network": "ws",
"security": "none",
"wsSettings": {
"acceptProxyProtocol": true,
"path": "/${customPath}ws"
}
}
}
]
}
EOF
fi
# VMess_WS
if echo "${selectCustomInstallType}" | grep -q 3 || [[ "$1" == "all" ]]; then
fallbacksList=${fallbacksList}',{"path":"/'${customPath}'vws","dest":31299,"xver":1}'
cat <<EOF >/etc/v2ray-agent/v2ray/conf/05_VMess_WS_inbounds.json
{
"inbounds":[
{
"listen": "127.0.0.1",
"port": 31299,
"protocol": "vmess",
"tag":"VMessWS",
"settings": {
"clients": [
{
"id": "${uuid}",
"alterId": 0,
"add": "${add}",
"email": "${domain}_vmess_ws"
}
]
},
"streamSettings": {
"network": "ws",
"security": "none",
"wsSettings": {
"acceptProxyProtocol": true,
"path": "/${customPath}vws"
}
}
}
]
}
EOF
fi
# VLESS gRPC
if echo "${selectCustomInstallType}" | grep -q 5 || [[ "$1" == "all" ]]; then
cat <<EOF >/etc/v2ray-agent/v2ray/conf/06_VLESS_gRPC_inbounds.json
{
"inbounds":[
{
"port": 31301,
"listen": "127.0.0.1",
"protocol": "vless",
"tag":"VLESSGRPC",
"settings": {
"clients": [
{
"id": "${uuid}",
"add": "${add}",
"email": "${domain}_VLESS_gRPC"
}
],
"decryption": "none"
},
"streamSettings": {
"network": "grpc",
"grpcSettings": {
"serviceName": "${customPath}grpc"
}
}
}
]
}
EOF
fi
# VLESS_TCP
if [[ "${selectCoreType}" == "2" ]]; then
cat <<EOF >/etc/v2ray-agent/v2ray/conf/02_VLESS_TCP_inbounds.json
{
"inbounds":[
{
"port": 443,
"protocol": "vless",
"tag":"VLESSTCP",
"settings": {
"clients": [
{
"id": "${uuid}",
"add": "${add}",
"email": "${domain}_VLESS_TLS_TCP"
}
],
"decryption": "none",
"fallbacks": [
${fallbacksList}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"alpn": [
"http/1.1",
"h2"
],
"certificates": [
{
"certificateFile": "/etc/v2ray-agent/tls/${domain}.crt",
"keyFile": "/etc/v2ray-agent/tls/${domain}.key"
}
]
}
}
}
]
}
EOF
elif [[ "${selectCoreType}" == "3" ]]; then
cat <<EOF >/etc/v2ray-agent/v2ray/conf/02_VLESS_TCP_inbounds.json
{
"inbounds":[
{
"port": 443,
"protocol": "vless",
"tag":"VLESSTCP",
"settings": {
"clients": [
{
"id": "${uuid}",
"add":"${add}",
"flow":"xtls-rprx-direct",
"email": "${domain}_VLESS_XTLS/TLS-direct_TCP"
}
],
"decryption": "none",
"fallbacks": [
${fallbacksList}
]
},
"streamSettings": {
"network": "tcp",
"security": "xtls",
"xtlsSettings": {
"alpn": [
"http/1.1"
],
"certificates": [
{
"certificateFile": "/etc/v2ray-agent/tls/${domain}.crt",
"keyFile": "/etc/v2ray-agent/tls/${domain}.key"
}
]
}
}
}
]
}
EOF
fi
}
2021-08-30 17:57:24 +08:00
# initializationXray Trojan XTLS config
2021-08-26 17:42:59 +08:00
initXrayFrontingConfig(){
if [[ -z "${configPath}" ]]; then
echoContent red " ---> Not installed, please use the script installation"
menu
exit 0
fi
if [[ "${coreInstallType}" != "1" ]];then
echoContent red " ---> No available types"
fi
local xtlsType=
if echo ${currentInstallProtocolType} | grep -q trojan; then
xtlsType=VLESS
else
xtlsType=Trojan
fi
echoContent skyBlue "\n function 1/${totalProgress} : Pre-switching${xtlsType}"
echoContent red "\n=============================================================="
echoContent yellow "# Precautions \n"
echoContent yellow "Alternative to${xtlsType}"
echoContent yellow "If the front is Trojan, two Trojan protocols have nodes, there is an unavailable XTLS"
echoContent yellow "Execute it again to switch to the previous front \n"
echoContent yellow "1.Switch to${xtlsType}"
echoContent red "=============================================================="
read -r -p "please choose:" selectType
if [[ "${selectType}" == "1" ]]; then
if [[ "${xtlsType}" == "Trojan" ]];then
local VLESSConfig=$(cat ${configPath}${frontingType}.json)
VLESSConfig=${VLESSConfig//"id"/"password"}
VLESSConfig=${VLESSConfig//VLESSTCP/TrojanTCPXTLS}
VLESSConfig=${VLESSConfig//VLESS/Trojan}
VLESSConfig=${VLESSConfig//"vless"/"trojan"}
VLESSConfig=${VLESSConfig//"id"/"password"}
echo "${VLESSConfig}" | jq . >${configPath}02_trojan_TCP_inbounds.json
rm ${configPath}${frontingType}.json
elif [[ "${xtlsType}" == "VLESS" ]]; then
local VLESSConfig=$(cat ${configPath}02_trojan_TCP_inbounds.json)
VLESSConfig=${VLESSConfig//"password"/"id"}
VLESSConfig=${VLESSConfig//TrojanTCPXTLS/VLESSTCP}
VLESSConfig=${VLESSConfig//Trojan/VLESS}
VLESSConfig=${VLESSConfig//"trojan"/"vless"}
VLESSConfig=${VLESSConfig//"password"/"id"}
echo "${VLESSConfig}" | jq . >${configPath}02_VLESS_TCP_inbounds.json
rm ${configPath}02_trojan_TCP_inbounds.json
fi
reloadCore
fi
exit 0;
}
# Initialize XRAY profile
initXrayConfig() {
echoContent skyBlue "\n progress $2/${totalProgress} : Initialize XRAY configuration"
echo
local uuid=
if [[ -n "${currentUUID}" ]]; then
read -r -p "Read to the last installation record, is it used in the last installation? UUID [y/n]:" historyUUIDStatus
if [[ "${historyUUIDStatus}" == "y" ]]; then
uuid=${currentUUID}
echoContent green "\n ---> 使用成功"
else
uuid=$(/etc/v2ray-agent/xray/xray uuid)
fi
fi
if [[ -z "${uuid}" ]];then
echoContent yellow "Please enter custom UUID [need to legal], [Enter] Random UUID"
read -r -p 'UUID:' customUUID
if [[ -n ${customUUID} ]];then
uuid=${customUUID}
else
uuid=$(/etc/v2ray-agent/xray/xray uuid)
fi
fi
if [[ -z "${uuid}" ]]; then
echoContent red "\n ---> UUID read error, regenerate"
uuid=$(/etc/v2ray-agent/xray/xray uuid)
fi
echoContent yellow "\n ${uuid}"
rm -rf /etc/v2ray-agent/xray/conf/*
# log
cat <<EOF >/etc/v2ray-agent/xray/conf/00_log.json
{
"log": {
"error": "/etc/v2ray-agent/xray/error.log",
"loglevel": "warning"
}
}
EOF
# outbounds
if [[ -n "${pingIPv6}" ]]; then
cat <<EOF >/etc/v2ray-agent/xray/conf/10_ipv6_outbounds.json
{
"outbounds": [
{
"protocol": "freedom",
"settings": {},
"tag": "direct"
}
]
}
EOF
else
cat <<EOF >/etc/v2ray-agent/xray/conf/10_ipv4_outbounds.json
{
"outbounds":[
{
"protocol":"freedom",
"settings":{
"domainStrategy":"UseIPv4"
},
"tag":"IPv4-out"
},
{
"protocol":"freedom",
"settings":{
"domainStrategy":"UseIPv6"
},
"tag":"IPv6-out"
},
{
"protocol":"blackhole",
"tag":"blackhole-out"
}
]
}
EOF
fi
# dns
cat <<EOF >/etc/v2ray-agent/xray/conf/11_dns.json
{
"dns": {
"servers": [
"localhost"
]
}
}
EOF
# VLESS_TCP_TLS/XTLS
# 回落nginx
local fallbacksList='{"dest":31300,"xver":0},{"alpn":"h2","dest":31302,"xver":0}'
# trojan
if [[ -n $(echo "${selectCustomInstallType}" | grep 4) || "$1" == "all" ]]; then
fallbacksList='{"dest":31296,"xver":1},{"alpn":"h2","dest":31302,"xver":0}'
cat <<EOF >/etc/v2ray-agent/xray/conf/04_trojan_TCP_inbounds.json
{
"inbounds":[
{
"port": 31296,
"listen": "127.0.0.1",
"protocol": "trojan",
"tag":"trojanTCP",
"settings": {
"clients": [
{
"password": "${uuid}",
"email": "${domain}_trojan_tcp"
}
],
"fallbacks":[
{"dest":"31300"}
]
},
"streamSettings": {
"network": "tcp",
"security": "none",
"tcpSettings": {
"acceptProxyProtocol": true
}
}
}
]
}
EOF
fi
# VLESS_WS_TLS
if echo "${selectCustomInstallType}" | grep -q 1 || [[ "$1" == "all" ]]; then
fallbacksList=${fallbacksList}',{"path":"/'${customPath}'ws","dest":31297,"xver":1}'
cat <<EOF >/etc/v2ray-agent/xray/conf/03_VLESS_WS_inbounds.json
{
"inbounds":[
{
"port": 31297,
"listen": "127.0.0.1",
"protocol": "vless",
"tag":"VLESSWS",
"settings": {
"clients": [
{
"id": "${uuid}",
"email": "${domain}_VLESS_WS"
}
],
"decryption": "none"
},
"streamSettings": {
"network": "ws",
"security": "none",
"wsSettings": {
"acceptProxyProtocol": true,
"path": "/${customPath}ws"
}
}
}
]
}
EOF
fi
# trojan_grpc
if echo ${selectCustomInstallType} | grep -q 2 || [[ "$1" == "all" ]]; then
if ! echo ${selectCustomInstallType} | grep -q 5 && [[ -n ${selectCustomInstallType} ]];then
fallbacksList=${fallbacksList//31302/31304}
fi
cat <<EOF >/etc/v2ray-agent/xray/conf/04_trojan_gRPC_inbounds.json
{
"inbounds": [
{
"port": 31304,
"listen": "127.0.0.1",
"protocol": "trojan",
"tag": "trojangRPCTCP",
"settings": {
"clients": [
{
"password": "${uuid}",
"email": "${domain}_trojan_gRPC"
}
],
"fallbacks": [
{
"dest": "31300"
}
]
},
"streamSettings": {
"network": "grpc",
"grpcSettings": {
"serviceName": "${customPath}trojangrpc"
}
}
}
]
}
EOF
fi
# VMess_WS
if echo "${selectCustomInstallType}" | grep -q 3 || [[ "$1" == "all" ]]; then
fallbacksList=${fallbacksList}',{"path":"/'${customPath}'vws","dest":31299,"xver":1}'
cat <<EOF >/etc/v2ray-agent/xray/conf/05_VMess_WS_inbounds.json
{
"inbounds":[
{
"listen": "127.0.0.1",
"port": 31299,
"protocol": "vmess",
"tag":"VMessWS",
"settings": {
"clients": [
{
"id": "${uuid}",
"alterId": 0,
"add": "${add}",
"email": "${domain}_vmess_ws"
}
]
},
"streamSettings": {
"network": "ws",
"security": "none",
"wsSettings": {
"acceptProxyProtocol": true,
"path": "/${customPath}vws"
}
}
}
]
}
EOF
fi
if echo "${selectCustomInstallType}" | grep -q 5 || [[ "$1" == "all" ]]; then
cat <<EOF >/etc/v2ray-agent/xray/conf/06_VLESS_gRPC_inbounds.json
{
"inbounds":[
{
"port": 31301,
"listen": "127.0.0.1",
"protocol": "vless",
"tag":"VLESSGRPC",
"settings": {
"clients": [
{
"id": "${uuid}",
"add": "${add}",
"email": "${domain}_VLESS_gRPC"
}
],
"decryption": "none"
},
"streamSettings": {
"network": "grpc",
"grpcSettings": {
"serviceName": "${customPath}grpc"
}
}
}
]
}
EOF
fi
# VLESS_TCP
cat <<EOF >/etc/v2ray-agent/xray/conf/02_VLESS_TCP_inbounds.json
{
"inbounds":[
{
"port": 443,
"protocol": "vless",
"tag":"VLESSTCP",
"settings": {
"clients": [
{
"id": "${uuid}",
"add":"${add}",
"flow":"xtls-rprx-direct",
"email": "${domain}_VLESS_XTLS/TLS-direct_TCP"
}
],
"decryption": "none",
"fallbacks": [
${fallbacksList}
]
},
"streamSettings": {
"network": "tcp",
"security": "xtls",
"xtlsSettings": {
"minVersion": "1.2",
"alpn": [
"http/1.1",
"h2"
],
"certificates": [
{
"certificateFile": "/etc/v2ray-agent/tls/${domain}.crt",
"keyFile": "/etc/v2ray-agent/tls/${domain}.key",
"ocspStapling": 3600,
"usage":"encipherment"
}
]
}
}
}
]
}
EOF
}
# initialization Trojan-Go Configure
initTrojanGoConfig() {
echoContent skyBlue "\n schedule $1/${totalProgress} : Initialization Trojan configuration"
cat <<EOF >/etc/v2ray-agent/trojan/config_full.json
{
"run_type": "server",
"local_addr": "127.0.0.1",
"local_port": 31296,
"remote_addr": "127.0.0.1",
"remote_port": 31300,
"disable_http_check":true,
"log_level":3,
"log_file":"/etc/v2ray-agent/trojan/trojan.log",
"password": [
"${uuid}"
],
"dns":[
"localhost"
],
"transport_plugin":{
"enabled":true,
"type":"plaintext"
},
"websocket": {
"enabled": true,
"path": "/${customPath}tws",
"host": "${domain}",
"add":"${add}"
},
"router": {
"enabled": false
}
}
EOF
}
# customizeCDN IP
customCDNIP() {
echoContent skyBlue "\n progress $1/${totalProgress} : Add cloudflare self-selecting CNAME"
echoContent red "\n=============================================================="
echoContent yellow "# Cautions"
echoContent yellow "\n Tutorial Address:"
echoContent skyBlue "https://github.com/mack-a/v2ray-agent/blob/master/documents/optimize_V2Ray.md"
echoContent red "\n If you do not know about Cloudflare optimization, please do not use"
echoContent yellow "\n 1.china Mobile:104.16.123.96"
echoContent yellow " 2.china Unicom:www.cloudflare.com"
echoContent yellow " 3.china Telecom:www.digitalocean.com"
echoContent skyBlue "----------------------------"
read -r -p "Please choose[Carriage return not used]:" selectCloudflareType
case ${selectCloudflareType} in
1)
add="104.16.123.96"
;;
2)
add="www.cloudflare.com"
;;
3)
add="www.digitalocean.com"
;;
*)
add="${domain}"
echoContent yellow "\n ---> No use"
;;
esac
}
# 通用
defaultBase64Code() {
local type=$1
local email=$2
local id=$3
local hostPort=$4
local host=
local port=
if echo "${hostPort}" | grep -q ":"; then
host=$(echo "${hostPort}" | awk -F "[:]" '{print $1}')
port=$(echo "${hostPort}" | awk -F "[:]" '{print $2}')
else
host=${hostPort}
port=443
fi
local path=$5
local add=$6
local subAccount=${currentHost}_$(echo "${id}_currentHost" | md5sum | awk '{print $1}')
if [[ "${type}" == "vlesstcp" ]]; then
if [[ "${coreInstallType}" == "1" ]] && echo ${currentInstallProtocolType} | grep -q 0; then
echoContent yellow " ---> General format(VLESS+TCP+TLS/xtls-rprx-direct)"
echoContent green " vless://${id}@${host}:${port}?encryption=none&security=xtls&type=tcp&host=${host}&headerType=none&sni=${host}&flow=xtls-rprx-direct#${email}\n"
echoContent yellow " ---> Format clear text(VLESS+TCP+TLS/xtls-rprx-direct)"
echoContent green "agreement typeVLESSaddress${host}port${port}user ID${id}Safetyxtlstransfer methodtcpflowxtls-rprx-directaccount name:${email}\n"
cat <<EOF >>"/etc/v2ray-agent/subscribe_tmp/${subAccount}"
vless://${id}@${host}:${port}?encryption=none&security=xtls&type=tcp&host=${host}&headerType=none&sni=${host}&flow=xtls-rprx-direct#${email}
EOF
echoContent yellow " ---> QR code VLESS(VLESS+TCP+TLS/xtls-rprx-direct)"
echoContent green " https://api.qrserver.com/v1/create-qr-code/?size=400x400&data=vless%3A%2F%2F${id}%40${host}%3A${port}%3F${encryption}%3Dnone%26security%3Dxtls%26type%3Dtcp%26${host}%3D${host}%26headerType%3Dnone%26sni%3D${host}%26flow%3Dxtls-rprx-direct%23${email}\n"
echoContent skyBlue "----------------------------------------------------------------------------------"
echoContent yellow " ---> General format(VLESS+TCP+TLS/xtls-rprx-splice)"
echoContent green " vless://${id}@${host}:${port}?encryption=none&security=xtls&type=tcp&host=${host}&headerType=none&sni=${host}&flow=xtls-rprx-splice#${email}\n"
echoContent yellow " ---> Format clear text(VLESS+TCP+TLS/xtls-rprx-splice)"
echoContent green " agreement typeVLESSaddress${host}port${port}user ID${id}Safetyxtlstransfer methodtcpflowxtls-rprx-spliceaccount name:${email}\n"
cat <<EOF >>"/etc/v2ray-agent/subscribe_tmp/${subAccount}"
vless://${id}@${host}:${port}?encryption=none&security=xtls&type=tcp&host=${host}&headerType=none&sni=${host}&flow=xtls-rprx-splice#${email}
EOF
echoContent yellow " ---> QR code VLESS(VLESS+TCP+TLS/xtls-rprx-splice)"
echoContent green " https://api.qrserver.com/v1/create-qr-code/?size=400x400&data=vless%3A%2F%2F${id}%40${host}%3A${port}%3F${encryption}%3Dnone%26security%3Dxtls%26type%3Dtcp%26${host}%3D${host}%26headerType%3Dnone%26sni%3D${host}%26flow%3Dxtls-rprx-splice%23${email}\n"
elif [[ "${coreInstallType}" == "2" || "${coreInstallType}" == "3" ]]; then
echoContent yellow " ---> General format(VLESS+TCP+TLS)"
echoContent green " vless://${id}@${host}:${port}?security=tls&encryption=none&host=${host}&headerType=none&type=tcp#${email}\n"
echoContent yellow " ---> Format clear text(VLESS+TCP+TLS/xtls-rprx-splice)"
echoContent green " agreement typeVLESSaddress${host}port${port}user ID${id}, Safety: TLS, Transmission mode: TCP, account name:${email}\n"
cat <<EOF >>"/etc/v2ray-agent/subscribe_tmp/${subAccount}"
vless://${id}@${host}:${port}?security=tls&encryption=none&host=${host}&headerType=none&type=tcp#${email}
EOF
echoContent yellow " ---> QR code VLESS(VLESS+TCP+TLS)"
echoContent green " https://api.qrserver.com/v1/create-qr-code/?size=400x400&data=vless%3a%2f%2f${id}%40${host}%3a${port}%3fsecurity%3dtls%26encryption%3dnone%26host%3d${host}%26headerType%3dnone%26type%3dtcp%23${email}\n"
fi
elif [[ "${type}" == "trojanTCPXTLS" ]]; then
echoContent yellow " ---> General format(Trojan+TCP+TLS/xtls-rprx-direct)"
echoContent green " trojan://${id}@${host}:${port}?encryption=none&security=xtls&type=tcp&host=${host}&headerType=none&sni=${host}&flow=xtls-rprx-direct#${email}\n"
echoContent yellow " ---> Format clear text(Trojan+TCP+TLS/xtls-rprx-direct)"
echoContent green "Type: Trojan, address${host}port${port}user ID${id}Safetyxtlstransfer methodtcpflowxtls-rprx-directaccount name:${email}\n"
cat <<EOF >>"/etc/v2ray-agent/subscribe_tmp/${subAccount}"
trojan://${id}@${host}:${port}?encryption=none&security=xtls&type=tcp&host=${host}&headerType=none&sni=${host}&flow=xtls-rprx-direct#${email}
EOF
echoContent yellow " ---> QR code Trojan(Trojan+TCP+TLS/xtls-rprx-direct)"
echoContent green " https://api.qrserver.com/v1/create-qr-code/?size=400x400&data=trojan%3A%2F%2F${id}%40${host}%3A${port}%3Fencryption%3Dnone%26security%3Dxtls%26type%3Dtcp%26${host}%3D${host}%26headerType%3Dnone%26sni%3D${host}%26flow%3Dxtls-rprx-direct%23${email}\n"
echoContent skyBlue "----------------------------------------------------------------------------------"
echoContent yellow " ---> General format(Trojan+TCP+TLS/xtls-rprx-splice)"
echoContent green " trojan://${id}@${host}:${port}?encryption=none&security=xtls&type=tcp&host=${host}&headerType=none&sni=${host}&flow=xtls-rprx-splice#${email}\n"
echoContent yellow " ---> Format clear text(Trojan+TCP+TLS/xtls-rprx-splice)"
echoContent green " agreement typeVLESSaddress${host}port${port}user ID${id}Safetyxtlstransfer methodtcpflowxtls-rprx-spliceaccount name:${email}\n"
cat <<EOF >>"/etc/v2ray-agent/subscribe_tmp/${subAccount}"
trojan://${id}@${host}:${port}?encryption=none&security=xtls&type=tcp&host=${host}&headerType=none&sni=${host}&flow=xtls-rprx-splice#${email}
EOF
echoContent yellow " ---> QR code Trojan(Trojan+TCP+TLS/xtls-rprx-splice)"
echoContent green " https://api.qrserver.com/v1/create-qr-code/?size=400x400&data=trojan%3A%2F%2F${id}%40${host}%3A${port}%3Fencryption%3Dnone%26security%3Dxtls%26type%3Dtcp%26${host}%3D${host}%26headerType%3Dnone%26sni%3D${host}%26flow%3Dxtls-rprx-splice%23${email}\n"
elif [[ "${type}" == "vmessws" ]]; then
qrCodeBase64Default=$(echo -n '{"port":"'${port}'","ps":'\"${email}\"',"tls":"tls","id":'\"${id}\"',"aid":"0","v":"2","host":"'${host}'","type":"none","path":"/'${path}'","net":"ws","add":"'${add}'","allowInsecure":0,"method":"none","peer":"'${host}'","sni":"'${host}'"}' | sed 's#/#\\\/#g' | base64)
qrCodeBase64Default=$(echo ${qrCodeBase64Default} | sed 's/ //g')
echoContent yellow " ---> Universal json(VMess+WS+TLS)"
echoContent green ' {"port":"'${port}'","ps":'\"${ps}\"',"tls":"tls","id":'\"${id}\"',"aid":"0","v":"2","host":"'${host}'","type":"none","path":"/'${path}'","net":"ws","add":"'${add}'","allowInsecure":0,"method":"none","peer":"'${host}'","sni":"'${host}'"}\n'
echoContent yellow " ---> Universal vmess(VMess+WS+TLS)Link"
echoContent green " vmess://${qrCodeBase64Default}\n"
echoContent yellow " ---> QR code vmess(VMess+WS+TLS)"
cat <<EOF >>"/etc/v2ray-agent/subscribe_tmp/${subAccount}"
vmess://${qrCodeBase64Default}
EOF
echoContent green " https://api.qrserver.com/v1/create-qr-code/?size=400x400&data=vmess://${qrCodeBase64Default}\n"
elif [[ "${type}" == "vmesstcp" ]]; then
# echoContent yellow " ---> 通用格式[新版,推荐]"
#
# echoContent green " vmess://tcp+tls:2e6257c5-1402-41a6-a96d-1e0bdad78159-0@vu3.s83h.xyz:443/?type=http&tlsServerName=vu3.s83h.xyz#vu3.s83h.xyz_vmess_tcp"
# echoContent green " vmess://tcp+tls:${id//\"/}-0@${add}:${port}/?type=http&path=/${path}&tlsServerName=${host}&alpn=http1.1#${ps//\"/}\n"
#
# echoContent yellow " ---> 格式化明文(vmess+http+tls)"
# echoContent green "协议类型vmess地址${host},端口:${port}用户ID${id}安全tls传输方式http账户名:${ps}\n"
# cat <<EOF >>"/etc/v2ray-agent/subscribe_tmp/${subAccount}"
#vmess://http+tls:${id}-0@${add}:${port}/?path=/${path}&tlsServerName=${host}&alpn=http1.1#${ps}
#EOF
# echoContent yellow " ---> 二维码 vmess(http+tls)"
# echoContent green " https://api.qrserver.com/v1/create-qr-code/?size=400x400&data=vmess%3A%2F%2Fhttp%2Btls%3A${id}-0%40add%3A${port}%2F%3Fpath%3D%2F${path}%26tlsServerName%3D${host}%26alpn%3Dhttp1.1%23%24%7B${ps}%7D\n"
echoContent red path:${path}
qrCodeBase64Default=$(echo -n '{"add":"'${add}'","aid":"0","host":"'${host}'","id":'"${id}"',"net":"tcp","path":"/'${path}'","port":"'${port}'","ps":'${ps}',"scy":"none","sni":"'${host}'","tls":"tls","v":"2","type":"http","allowInsecure":0,"peer":"'${host}'","obfs":"http","obfsParam":"'${host}'"}' | base64)
qrCodeBase64Default=$(echo ${qrCodeBase64Default} | sed 's/ //g')
echoContent yellow " ---> Universal json(VMess+TCP+TLS)"
echoContent green ' {"port":"'${port}'","ps":'${ps}',"tls":"tls","id":'"${id}"',"aid":"0","v":"2","host":"'${host}'","type":"http","path":"/'${path}'","net":"http","add":"'${add}'","allowInsecure":0,"method":"post","peer":"'${host}'","obfs":"http","obfsParam":"'${host}'"}\n'
echoContent yellow " ---> Universalvmess(VMess+TCP+TLS)Link"
echoContent green " vmess://${qrCodeBase64Default}\n"
cat <<EOF >>"/etc/v2ray-agent/subscribe_tmp/${subAccount}"
vmess://${qrCodeBase64Default}
EOF
echoContent yellow " ---> QR code vmess(VMess+TCP+TLS)"
echoContent green " https://api.qrserver.com/v1/create-qr-code/?size=400x400&data=vmess://${qrCodeBase64Default}\n"
elif [[ "${type}" == "vlessws" ]]; then
echoContent yellow " ---> General format(VLESS+WS+TLS)"
echoContent green " vless://${id}@${add}:${port}?encryption=none&security=tls&type=ws&host=${host}&sni=${host}&path=%2f${path}#${email}\n"
echoContent yellow " ---> Format clear text(VLESS+WS+TLS)"
echoContent green " agreement typeVLESSaddress${add}Camouflage domain name/SNI${host}port${port}user ID${id}Safetytlstransfer methodwspath:/${path}account name:${email}\n"
cat <<EOF >>"/etc/v2ray-agent/subscribe_tmp/${subAccount}"
vless://${id}@${add}:${port}?encryption=none&security=tls&type=ws&host=${host}&sni=${host}&path=%2f${path}#${email}
EOF
echoContent yellow " ---> QR code VLESS(VLESS+TCP+TLS/XTLS)"
echoContent green " https://api.qrserver.com/v1/create-qr-code/?size=400x400&data=vless%3A%2F%2F${id}%40${add}%3A${port}%3Fencryption%3Dnone%26security%3Dtls%26type%3Dws%26host%3D${host}%26sni%3D${host}%26path%3D%252f${path}%23${email}"
elif [[ "${type}" == "vlessgrpc" ]]; then
echoContent yellow " ---> General format(VLESS+gRPC+TLS)"
echoContent green " vless://${id}@${add}:${port}?encryption=none&security=tls&type=grpc&host=${host}&path=${path}&serviceName=${path}&alpn=h2&sni=${host}#${email}\n"
echoContent yellow " ---> Format clear text(VLESS+gRPC+TLS)"
echoContent green " agreement typeVLESSaddress${add}Camouflage domain name/SNI${host}port${port}user ID${id}Safetytlstransfer methodgRPCalpnh2serviceName:${path}account name:${email}\n"
cat <<EOF >>"/etc/v2ray-agent/subscribe_tmp/${subAccount}"
vless://${id}@${add}:${port}?encryption=none&security=tls&type=grpc&host=${host}&path=${path}&serviceName=${path}&alpn=h2&sni=${host}#${email}
EOF
echoContent yellow " ---> QR code VLESS(VLESS+gRPC+TLS)"
echoContent green " https://api.qrserver.com/v1/create-qr-code/?size=400x400&data=vless%3A%2F%2F${id}%40${add}%3A${port}%3Fencryption%3Dnone%26security%3Dtls%26type%3Dgrpc%26host%3D${host}%26serviceName%3D${path}%26path%3D${path}%26sni%3D${host}%26alpn%3Dh2%23${email}"
elif [[ "${type}" == "trojan" ]]; then
# URLEncode
echoContent yellow " ---> Trojan(TLS)"
echoContent green " trojan://${id}@${host}:${port}?peer=${host}&sni=${host}&alpn=http1.1#${host}_Trojan\n"
cat <<EOF >>"/etc/v2ray-agent/subscribe_tmp/${subAccount}"
trojan://${id}@${host}:${port}?peer=${host}&sni=${host}&alpn=http1.1#${host}_Trojan
EOF
echoContent yellow " ---> QR code Trojan(TLS)"
echoContent green " https://api.qrserver.com/v1/create-qr-code/?size=400x400&data=trojan%3a%2f%2f${id}%40${host}%3a${port}%3fpeer%3d${host}%26sni%3d${host}%26alpn%3Dhttp1.1%23${host}_Trojan\n"
elif [[ "${type}" == "trojangrpc" ]]; then
# URLEncode
echoContent yellow " ---> Trojan gRPC(TLS)"
echoContent green " trojan://${id}@${host}:${port}?encryption=none&peer=${host}&security=tls&type=grpc&sni=${host}&alpn=h2&path=${path}&serviceName=${path}#${host}_Trojan_gRPC\n"
cat <<EOF >>"/etc/v2ray-agent/subscribe_tmp/${subAccount}"
trojan://${id}@${host}:${port}?encryption=none&peer=${host}&security=tls&type=grpc&sni=${host}&alpn=h2&path=${path}&serviceName=${path}#${host}_Trojan_gRPC
EOF
echoContent yellow " ---> QR code Trojan gRPC(TLS)"
echoContent green " https://api.qrserver.com/v1/create-qr-code/?size=400x400&data=trojan%3a%2f%2f${id}%40${host}%3a${port}%3Fencryption%3Dnone%26security%3Dtls%26peer%3d${host}%26type%3Dgrpc%26sni%3d${host}%26path%3D${path}%26alpn%3D=h2%26serviceName%3D${path}%23${host}_Trojan_gRPC\n"
elif [[ "${type}" == "trojangows" ]]; then
# URLEncode
echoContent yellow " ---> Trojan-Go(WS+TLS) Shadowrocket"
echoContent green " trojan://${id}@${add}:${port}?allowInsecure=0&&peer=${host}&sni=${host}&plugin=obfs-local;obfs=websocket;obfs-host=${host};obfs-uri=${path}#${host}_Trojan_ws\n"
cat <<EOF >>"/etc/v2ray-agent/subscribe_tmp/${subAccount}"
trojan://${id}@${add}:${port}?allowInsecure=0&&peer=${host}&sni=${host}&plugin=obfs-local;obfs=websocket;obfs-host=${host};obfs-uri=${path}#${host}_Trojan_ws
EOF
echoContent yellow " ---> QR code Trojan-Go(WS+TLS) Shadowrocket"
echoContent green " https://api.qrserver.com/v1/create-qr-code/?size=400x400&data=trojan%3a%2f%2f${id}%40${add}%3a${port}%3fallowInsecure%3d0%26peer%3d${host}%26plugin%3dobfs-local%3bobfs%3dwebsocket%3bobfs-host%3d${host}%3bobfs-uri%3d${path}%23${host}_Trojan_ws\n"
path=$(echo "${path}" | awk -F "[/]" '{print $2}')
echoContent yellow " ---> Trojan-Go(WS+TLS) QV2ray"
cat <<EOF >>"/etc/v2ray-agent/subscribe_tmp/${subAccount}"
trojan-go://${id}@${add}:${port}?sni=${host}&type=ws&host=${host}&path=%2F${path}#${host}_Trojan_ws
EOF
echoContent green " trojan-go://${id}@${add}:${port}?sni=${host}&type=ws&host=${host}&path=%2F${path}#${host}_Trojan_ws\n"
fi
}
# account
showAccounts() {
readInstallType
readInstallProtocolType
readConfigHostPathUUID
echoContent skyBlue "\n schedule $1/${totalProgress} : account"
local show
# VLESS TCP
if [[ -n "${configPath}" ]]; then
show=1
if echo "${currentInstallProtocolType}" | grep -q trojan ;then
echoContent skyBlue "===================== Trojan TCP TLS/XTLS-direct/XTLS-splice ======================\n"
# cat ${configPath}02_VLESS_TCP_inbounds.json | jq .inbounds[0].settings.clients | jq -c '.[]'
jq .inbounds[0].settings.clients ${configPath}02_trojan_TCP_inbounds.json | jq -c '.[]' | while read -r user; do
echoContent skyBlue "\n ---> account number$(echo "${user}" | jq -r .email )_$(echo "${user}" | jq -r .password)"
echo
defaultBase64Code trojanTCPXTLS $(echo "${user}" | jq -r .email) $(echo "${user}" | jq -r .password) "${currentHost}:${currentPort}" ${currentHost}
done
else
echoContent skyBlue "===================== VLESS TCP TLS/XTLS-direct/XTLS-splice ======================\n"
# cat ${configPath}02_VLESS_TCP_inbounds.json | jq .inbounds[0].settings.clients | jq -c '.[]'
jq .inbounds[0].settings.clients ${configPath}02_VLESS_TCP_inbounds.json | jq -c '.[]' | while read -r user; do
echoContent skyBlue "\n ---> account number$(echo "${user}" | jq -r .email )_$(echo "${user}" | jq -r .id)"
echo
defaultBase64Code vlesstcp $(echo "${user}" | jq -r .email) $(echo "${user}" | jq -r .id) "${currentHost}:${currentPort}" ${currentHost}
done
fi
# VLESS WS
if echo ${currentInstallProtocolType} | grep -q 1; then
echoContent skyBlue "\n================================ VLESS WS TLS CDN ================================\n"
# cat ${configPath}03_VLESS_WS_inbounds.json | jq .inbounds[0].settings.clients | jq -c '.[]'
jq .inbounds[0].settings.clients ${configPath}03_VLESS_WS_inbounds.json | jq -c '.[]' | while read -r user; do
echoContent skyBlue "\n ---> account number$(echo "${user}" | jq -r .email )_$(echo "${user}" | jq -r .id)"
echo
local path="${currentPath}ws"
if [[ ${coreInstallType} == "1" ]]; then
echoContent yellow "Xrayof0-RTT path Will there be? ED = 2048, is not compatible with clients with V2Ray as the core, please manually delete? ED = 2048 after use\n"
path="${currentPath}ws?ed=2048"
fi
defaultBase64Code vlessws $(echo "${user}" | jq -r .email) $(echo "${user}" | jq -r .id) "${currentHost}:${currentPort}" ${path} ${currentAdd}
done
fi
# VMess WS
if echo ${currentInstallProtocolType} | grep -q 3; then
echoContent skyBlue "\n================================ VMess WS TLS CDN ================================\n"
local path="${currentPath}vws"
if [[ ${coreInstallType} == "1" ]]; then
path="${currentPath}vws?ed=2048"
fi
jq .inbounds[0].settings.clients ${configPath}05_VMess_WS_inbounds.json | jq -c '.[]' | while read -r user; do
2022-10-13 17:36:38 +08:00
echoContent skyBlue "\n ---> 账号:$(echo "${user}" | jq -r .email )_$(echo "${user}" | jq -r .id)"
2021-08-26 17:42:59 +08:00
echo
defaultBase64Code vmessws $(echo "${user}" | jq -r .email) $(echo "${user}" | jq -r .id) "${currentHost}:${currentPort}" ${path} ${currentAdd}
done
fi
# VLESS grpc
if echo ${currentInstallProtocolType} | grep -q 5; then
echoContent skyBlue "\n=============================== VLESS gRPC TLS CDN ===============================\n"
echoContent red "\n --->gRPC Currently in the test phase, it may not be compatible with the client you use, if you can't use it, please ignore"
local serviceName=$(jq -r .inbounds[0].streamSettings.grpcSettings.serviceName ${configPath}06_VLESS_gRPC_inbounds.json)
jq .inbounds[0].settings.clients ${configPath}06_VLESS_gRPC_inbounds.json | jq -c '.[]' | while read -r user; do
echoContent skyBlue "\n ---> account number$(echo "${user}" | jq -r .email )_$(echo "${user}" | jq -r .id)"
echo
defaultBase64Code vlessgrpc $(echo "${user}" | jq -r .email) $(echo "${user}" | jq -r .id) "${currentHost}:${currentPort}" ${serviceName} ${currentAdd}
done
fi
fi
# trojan tcp
if echo ${currentInstallProtocolType} | grep -q 4; then
echoContent skyBlue "\n================================== Trojan TLS ==================================\n"
jq .inbounds[0].settings.clients ${configPath}04_trojan_TCP_inbounds.json | jq -c '.[]' | while read -r user; do
echoContent skyBlue "\n ---> account number$(echo "${user}" | jq -r .email )_$(echo "${user}" | jq -r .password)"
echo
defaultBase64Code trojan trojan $(echo "${user}" | jq -r .password) ${currentHost}
done
fi
if echo ${currentInstallProtocolType} | grep -q 2; then
echoContent skyBlue "\n================================ Trojan gRPC TLS ================================\n"
echoContent red "\n --->gRPC Currently in the test phase, it may not be compatible with the client you use, if you can't use it, please ignore"
local serviceName=$(jq -r .inbounds[0].streamSettings.grpcSettings.serviceName ${configPath}04_trojan_gRPC_inbounds.json)
jq .inbounds[0].settings.clients ${configPath}04_trojan_gRPC_inbounds.json | jq -c '.[]' | while read -r user; do
echoContent skyBlue "\n ---> account number$(echo "${user}" | jq -r .email )_$(echo "${user}" | jq -r .password)"
echo
defaultBase64Code trojangrpc $(echo "${user}" | jq -r .email) $(echo "${user}" | jq -r .password) "${currentHost}:${currentPort}" ${serviceName} ${currentAdd}
done
fi
if [[ -z ${show} ]]; then
echoContent red " ---> Not Installed"
fi
}
# Update camouflage station
updateNginxBlog() {
echoContent skyBlue "\n schedule$1/${totalProgress} : Replace the camouflage site"
echoContent red "=============================================================="
echoContent yellow "# To customize, manually copy the template file to /usr/share/nginx/html \n"
echoContent yellow "1.Beginner's guide"
echoContent yellow "2.Game website"
echoContent yellow "3.personal blog01"
echoContent yellow "4.Businesses"
echoContent yellow "5.Unlock the encrypted music file template[https://github.com/ix64/unlock-music]"
echoContent yellow "6.mikutap[https://github.com/HFIProgramming/mikutap]"
echoContent yellow "7.Enterprise station 02"
echoContent yellow "8.Personal blog 02"
echoContent yellow "9.404 Automatic jump Baidu"
echoContent red "=============================================================="
read -r -p "please choose" selectInstallNginxBlogType
if [[ "${selectInstallNginxBlogType}" =~ ^[1-9]$ ]]; then
# rm -rf /usr/share/nginx/html
rm -rf /usr/share/nginx/*
if wget --help | grep -q show-progress; then
wget -c -q --show-progress -P /usr/share/nginx "https://raw.githubusercontent.com/mack-a/v2ray-agent/master/fodder/blog/unable/html${selectInstallNginxBlogType}.zip" >/dev/null
else
wget -c -P /usr/share/nginx "https://raw.githubusercontent.com/mack-a/v2ray-agent/master/fodder/blog/unable/html${selectInstallNginxBlogType}.zip" >/dev/null
fi
unzip -o "/usr/share/nginx/html${selectInstallNginxBlogType}.zip" -d /usr/share/nginx/html >/dev/null
rm -f "/usr/share/nginx/html${selectInstallNginxBlogType}.zip*"
echoContent green " ---> Replace the pseudo-station success"
else
echoContent red " ---> Select an error, please re-select"
updateNginxBlog
fi
}
# Add a new port
addCorePort() {
echoContent skyBlue "\n Function 1/${totalProgress} : Add a new port"
echoContent red "\n=============================================================="
echoContent yellow "# Precautions\n"
echoContent yellow "Support quantity added"
echoContent yellow "Does not affect the use of 443 ports"
echoContent yellow "When you view your account, you will only show the account number of the default port 443."
echoContent yellow "Do not allow special characters, pay attention to the format of comma"
echoContent yellow "Entry example: 2053, 2083, 2087\n"
echoContent yellow "1.Adding ports"
echoContent yellow "2.Delete port"
echoContent red "=============================================================="
read -r -p "please choose:" selectNewPortType
if [[ "${selectNewPortType}" == "1" ]]; then
read -r -p "Please enter the port number:" newPort
if [[ -n "${newPort}" ]]; then
while read -r port; do
cat <<EOF >${configPath}02_dokodemodoor_inbounds_${port}.json
{
"inbounds": [
{
"listen": "0.0.0.0",
"port": ${port},
"protocol": "dokodemo-door",
"settings": {
"address": "127.0.0.1",
"port": 443,
"network": "tcp",
"followRedirect": false
},
"tag": "dokodemo-door-newPort-${port}"
}
]
}
EOF
done < <(echo "${newPort}" | tr ',' '\n')
echoContent green " ---> Added successfully"
reloadCore
fi
elif [[ "${selectNewPortType}" == "2" ]]; then
ls ${configPath} | grep dokodemodoor | awk -F "[_]" '{print $4}' | awk -F "[.]" '{print ""NR""":"$1}'
read -r -p "Please enter the port number you want to delete:" portIndex
local dokoConfig=$(ls ${configPath} | grep dokodemodoor | awk '{print ""NR""":"$1}' | grep ${portIndex}":")
if [[ -n "${dokoConfig}" ]]; then
rm ${configPath}/$(echo "${dokoConfig}" | awk -F "[:]" '{print $2}')
reloadCore
else
echoContent yellow "\n ---> Number Enter an error, please re-select"
addCorePort
fi
fi
}
# Uninstall
unInstall() {
read -r -p "Do you confirm that uninstall installation content?[y/n]:" unInstallStatus
if [[ "${unInstallStatus}" != "y" ]]; then
echoContent green " ---> Abandon unload"
menu
exit 0
fi
handleNginx stop
if [[ -z $(pgrep -f "nginx") ]]; then
echoContent green " ---> Stop Nginx success"
fi
handleV2Ray stop
# handleTrojanGo stop
rm -rf /root/.acme.sh
echoContent green " ---> Delete acme.sh complete"
rm -rf /etc/systemd/system/v2ray.service
echoContent green " ---> Delete V2RAY boot self-start"
rm -rf /etc/systemd/system/trojan-go.service
echoContent green " ---> Delete Trojan-GO boot self-start"
rm -rf /tmp/v2ray-agent-tls/*
if [[ -d "/etc/v2ray-agent/tls" ]] && [[ -n $(find /etc/v2ray-agent/tls/ -name "*.key") ]] && [[ -n $(find /etc/v2ray-agent/tls/ -name "*.crt") ]]; then
mv /etc/v2ray-agent/tls /tmp/v2ray-agent-tls
if [[ -n $(find /tmp/v2ray-agent-tls -name '*.key') ]]; then
echoContent yellow " ---> Keep paying attention to the backup certificate.[/tmp/v2ray-agent-tls]"
fi
fi
rm -rf /etc/v2ray-agent
rm -rf /etc/nginx/conf.d/alone.conf
rm -rf /usr/bin/vasma
rm -rf /usr/sbin/vasma
echoContent green " ---> Uninstall shortcut"
echoContent green " ---> Uninstall V2RAY-Agent script completion"
}
# Modify V2RAY CDN node
updateV2RayCDN() {
# todo Reconstruct this method
echoContent skyBlue "\n progress $1/${totalProgress} : Modify CDN node"
if [[ -n ${currentAdd} ]]; then
echoContent red "=============================================================="
echoContent yellow "1.CNAME www.digitalocean.com"
echoContent yellow "2.CNAME www.cloudflare.com"
echoContent yellow "3.CNAME hostmonit.com"
echoContent yellow "4.Manual input"
echoContent red "=============================================================="
read -r -p "please choose:" selectCDNType
case ${selectCDNType} in
1)
setDomain="www.digitalocean.com"
;;
2)
setDomain="www.cloudflare.com"
;;
3)
setDomain="hostmonit.com"
;;
4)
read -r -p "Please enter you want to customize CDN IP or domain name:" setDomain
;;
esac
if [[ -n ${setDomain} ]]; then
if [[ -n ${currentAdd} ]]; then
sed -i "s/\"${currentAdd}\"/\"${setDomain}\"/g" $(grep "${currentAdd}" -rl ${configPath}${frontingType}.json)
fi
if [[ $(jq -r .inbounds[0].settings.clients[0].add ${configPath}${frontingType}.json) == ${setDomain} ]]; then
echoContent green " ---> CDN is successful"
reloadCore
else
echoContent red " ---> Modify CDN failure"
fi
fi
else
echoContent red " ---> No available types"
fi
}
# manageUser User Management
manageUser() {
echoContent skyBlue "\n progress $1/${totalProgress} : Multi-user management"
echoContent skyBlue "-----------------------------------------------------"
echoContent yellow "1.Add user"
echoContent yellow "2.delete users"
echoContent skyBlue "-----------------------------------------------------"
read -r -p "please choose:" manageUserType
if [[ "${manageUserType}" == "1" ]]; then
addUser
elif [[ "${manageUserType}" == "2" ]]; then
removeUser
else
echoContent red " ---> wrong selection"
fi
}
# Customize UUID
customUUID() {
read -r -p "Whether to customize UUID [y/n]:" customUUIDStatus
echo
if [[ "${customUUIDStatus}" == "y" ]]; then
read -r -p "Please enter the legal UUID:" currentCustomUUID
echo
if [[ -z "${currentCustomUUID}" ]]; then
echoContent red " ---> UUID can not be empty"
else
local repeat=
jq -r -c '.inbounds[0].settings.clients[].id' ${configPath}${frontingType}.json | while read -r line; do
if [[ "${line}" == "${currentCustomUUID}" ]]; then
echo repeat >/tmp/v2ray-agent
fi
done
if [[ -f "/tmp/v2ray-agent" && -n $(cat /tmp/v2ray-agent) ]]; then
echoContent red " ---> UUID is not repeatable"
rm /tmp/v2ray-agent
exit 0
fi
fi
fi
}
# Custom Email
customUserEmail() {
read -r -p "Whether to customize Email [y/n]:" customEmailStatus
echo
if [[ "${customEmailStatus}" == "y" ]]; then
read -r -p "Please enter legitimate Email:" currentCustomEmail
echo
if [[ -z "${currentCustomEmail}" ]]; then
echoContent red " ---> Email is not empty"
else
local repeat=
jq -r -c '.inbounds[0].settings.clients[].email' ${configPath}${frontingType}.json | while read -r line; do
if [[ "${line}" == "${currentCustomEmail}" ]]; then
echo repeat >/tmp/v2ray-agent
fi
done
if [[ -f "/tmp/v2ray-agent" && -n $(cat /tmp/v2ray-agent) ]]; then
echoContent red " ---> Email is not repeatable"
rm /tmp/v2ray-agent
exit 0
fi
fi
fi
}
# Add user
addUser() {
echoContent yellow "After adding new users, you need to re-view subscriptions."
read -r -p "Please enter the number of users you want to add:" userNum
echo
if [[ -z ${userNum} || ${userNum} -le 0 ]]; then
echoContent red " ---> Enter is incorrect, please re-enter"
exit 0
fi
# Generate users
local users=
local trojanGoUsers=
if [[ "${userNum}" == "1" ]]; then
customUUID
customUserEmail
fi
while [[ ${userNum} -gt 0 ]]; do
((userNum--)) || true
if [[ -n "${currentCustomUUID}" ]]; then
uuid=${currentCustomUUID}
else
uuid=$(${ctlPath} uuid)
fi
if [[ -n "${currentCustomEmail}" ]]; then
email=${currentCustomEmail}
else
email=${currentHost}_${uuid}
fi
if [[ ${userNum} == 0 ]]; then
users=${users}{\"id\":\"${uuid}\",\"flow\":\"xtls-rprx-direct\",\"email\":\"${email}\",\"alterId\":0}
if echo ${currentInstallProtocolType} | grep -q 4; then
trojanGoUsers=${trojanGoUsers}\"${uuid}\"
fi
else
users=${users}{\"id\":\"${uuid}\",\"flow\":\"xtls-rprx-direct\",\"email\":\"${email}\",\"alterId\":0},
if echo ${currentInstallProtocolType} | grep -q 4; then
trojanGoUsers=${trojanGoUsers}\"${uuid}\",
fi
fi
done
# Compatible with V2Ray-core
if [[ "${coreInstallType}" == "2" ]]; then
# | sed 's/"flow":"xtls-rprx-direct",/"alterId":1,/g')
users="${users//\"flow\":\"xtls-rprx-direct\"\,/}"
fi
if echo ${currentInstallProtocolType} | grep -q 0; then
local vlessUsers="${users//\,\"alterId\":0/}"
local vlessTcpResult
vlessTcpResult=$(jq -r '.inbounds[0].settings.clients += ['${vlessUsers}']' ${configPath}${frontingType}.json)
echo "${vlessTcpResult}" | jq . >${configPath}${frontingType}.json
fi
if echo ${currentInstallProtocolType} | grep -q trojan; then
local trojanXTLSUsers="${users//\,\"alterId\":0/}"
trojanXTLSUsers=${trojanXTLSUsers//"id"/"password"}
echo trojanXTLSUsers:${trojanXTLSUsers}
local trojanXTLSResult
trojanXTLSResult=$(jq -r '.inbounds[0].settings.clients += ['${trojanXTLSUsers}']' ${configPath}${frontingType}.json)
echo "${trojanXTLSResult}" | jq . >${configPath}${frontingType}.json
fi
# users="${users//"flow":"xtls-rprx-direct",/"alterId":1,}"
if echo ${currentInstallProtocolType} | grep -q 1; then
local vlessUsers="${users//\,\"alterId\":0/}"
vlessUsers="${vlessUsers//\"flow\":\"xtls-rprx-direct\"\,/}"
local vlessWsResult
vlessWsResult=$(jq -r '.inbounds[0].settings.clients += ['${vlessUsers}']' ${configPath}03_VLESS_WS_inbounds.json)
echo "${vlessWsResult}" | jq . >${configPath}03_VLESS_WS_inbounds.json
fi
if echo ${currentInstallProtocolType} | grep -q 2; then
local trojangRPCUsers="${users//\"flow\":\"xtls-rprx-direct\"\,/}"
trojangRPCUsers="${trojangRPCUsers//\,\"alterId\":0/}"
trojangRPCUsers=${trojangRPCUsers//"id"/"password"}
local trojangRPCResult
trojangRPCResult=$(jq -r '.inbounds[0].settings.clients += ['${trojangRPCUsers}']' ${configPath}04_trojan_gRPC_inbounds.json)
echo "${trojangRPCResult}" | jq . >${configPath}04_trojan_gRPC_inbounds.json
fi
if echo ${currentInstallProtocolType} | grep -q 3; then
local vmessUsers="${users//\"flow\":\"xtls-rprx-direct\"\,/}"
local vmessWsResult
vmessWsResult=$(jq -r '.inbounds[0].settings.clients += ['${vmessUsers}']' ${configPath}05_VMess_WS_inbounds.json)
echo "${vmessWsResult}" | jq . >${configPath}05_VMess_WS_inbounds.json
fi
if echo ${currentInstallProtocolType} | grep -q 5; then
local vlessGRPCUsers="${users//\"flow\":\"xtls-rprx-direct\"\,/}"
vlessGRPCUsers="${vlessGRPCUsers//\,\"alterId\":0/}"
local vlessGRPCResult
vlessGRPCResult=$(jq -r '.inbounds[0].settings.clients += ['${vlessGRPCUsers}']' ${configPath}06_VLESS_gRPC_inbounds.json)
echo "${vlessGRPCResult}" | jq . >${configPath}06_VLESS_gRPC_inbounds.json
fi
if echo ${currentInstallProtocolType} | grep -q 4; then
local trojanUsers="${users//\"flow\":\"xtls-rprx-direct\"\,/}"
trojanUsers="${trojanUsers//id/password}"
trojanUsers="${trojanUsers//\,\"alterId\":0/}"
local trojanTCPResult
trojanTCPResult=$(jq -r '.inbounds[0].settings.clients += ['${trojanUsers}']' ${configPath}04_trojan_TCP_inbounds.json)
echo "${trojanTCPResult}" | jq . >${configPath}04_trojan_TCP_inbounds.json
fi
# if echo ${currentInstallProtocolType} | grep -q 4; then
# local trojanResult
# trojanResult=$(jq -r '.password += ['${trojanGoUsers}']' ${configPath}../../trojan/config_full.json)
# echo "${trojanResult}" | jq . >${configPath}../../trojan/config_full.json
# handleTrojanGo stop
# handleTrojanGo start
# fi
reloadCore
echoContent green " ---> Add completion"
showAccounts 1
}
# Remove user
removeUser() {
if echo ${currentInstallProtocolType} | grep -q 0 || echo ${currentInstallProtocolType} | grep -q trojan ; then
jq -r -c .inbounds[0].settings.clients[].email ${configPath}${frontingType}.json | awk '{print NR""":"$0}'
read -r -p "Please select the user number you want to delete[Also supports single deletion]:" delUserIndex
if [[ $(jq -r '.inbounds[0].settings.clients|length' ${configPath}${frontingType}.json) -lt ${delUserIndex} ]]; then
echoContent red " ---> wrong selection"
else
delUserIndex=$((${delUserIndex} - 1))
local vlessTcpResult
vlessTcpResult=$(jq -r 'del(.inbounds[0].settings.clients['${delUserIndex}'])' ${configPath}${frontingType}.json)
echo "${vlessTcpResult}" | jq . >${configPath}${frontingType}.json
fi
fi
if [[ -n "${delUserIndex}" ]]; then
if echo ${currentInstallProtocolType} | grep -q 1; then
local vlessWSResult
vlessWSResult=$(jq -r 'del(.inbounds[0].settings.clients['${delUserIndex}'])' ${configPath}03_VLESS_WS_inbounds.json)
echo "${vlessWSResult}" | jq . >${configPath}03_VLESS_WS_inbounds.json
fi
if echo ${currentInstallProtocolType} | grep -q 2; then
local trojangRPCUsers
trojangRPCUsers=$(jq -r 'del(.inbounds[0].settings.clients['${delUserIndex}'])' ${configPath}04_trojan_gRPC_inbounds.json)
echo "${trojangRPCUsers}" | jq . >${configPath}04_trojan_gRPC_inbounds.json
fi
if echo ${currentInstallProtocolType} | grep -q 3; then
local vmessWSResult
vmessWSResult=$(jq -r 'del(.inbounds[0].settings.clients['${delUserIndex}'])' ${configPath}05_VMess_WS_inbounds.json)
echo "${vmessWSResult}" | jq . >${configPath}05_VMess_WS_inbounds.json
fi
if echo ${currentInstallProtocolType} | grep -q 5; then
local vlessGRPCResult
vlessGRPCResult=$(jq -r 'del(.inbounds[0].settings.clients['${delUserIndex}'])' ${configPath}06_VLESS_gRPC_inbounds.json)
echo "${vlessGRPCResult}" | jq . >${configPath}06_VLESS_gRPC_inbounds.json
fi
if echo ${currentInstallProtocolType} | grep -q 4; then
local trojanTCPResult
trojanTCPResult=$(jq -r 'del(.inbounds[0].settings.clients['${delUserIndex}'])' ${configPath}04_trojan_TCP_inbounds.json)
echo "${trojanTCPResult}" | jq . >${configPath}04_trojan_TCP_inbounds.json
fi
reloadCore
fi
}
# Update script
updateV2RayAgent() {
echoContent skyBlue "\n progress $1/${totalProgress} : Update V2RAY-Agent script"
rm -rf /etc/v2ray-agent/install.sh
if wget --help | grep -q show-progress; then
wget -c -q --show-progress -P /etc/v2ray-agent/ -N --no-check-certificate "https://raw.githubusercontent.com/mack-a/v2ray-agent/master/install.sh"
else
wget -c -q -P /etc/v2ray-agent/ -N --no-check-certificate "https://raw.githubusercontent.com/mack-a/v2ray-agent/master/install.sh"
fi
sudo chmod 700 /etc/v2ray-agent/install.sh
local version=$(cat /etc/v2ray-agent/install.sh | grep 'Current version: v' | awk -F "[v]" '{print $2}' | tail -n +2 | head -n 1 | awk -F "[\"]" '{print $1}')
echoContent green "\n ---> update completed"
echoContent yellow " ---> Please manually[vasma]Open script"
echoContent green " ---> current version:${version}\n"
echoContent yellow "If the update is unsuccessful, please manually perform the following command.\n"
echoContent skyBlue "wget -P /root -N --no-check-certificate "https://raw.githubusercontent.com/mack-a/v2ray-agent/master/install.sh" && chmod 700 /root/install.sh && /root/install.sh"
echo
exit 0
}
# Firewall
handleFirewall(){
if systemctl status ufw 2>/dev/null|grep -q "active (exited)" && [[ "$1" == "stop" ]]; then
systemctl stop ufw >/dev/null 2>&1
systemctl disable ufw >/dev/null 2>&1
echoContent green " ---> ufw Close successfully"
fi
if systemctl status firewalld 2>/dev/null|grep -q "active (running)" && [[ "$1" == "stop" ]]; then
systemctl stop firewalld >/dev/null 2>&1
systemctl disable firewalld >/dev/null 2>&1
echoContent green " ---> firewalld Close successfully"
fi
}
2021-08-30 17:57:24 +08:00
# install BBR
2021-08-26 17:42:59 +08:00
bbrInstall() {
echoContent red "\n=============================================================="
echoContent green "BBR、DDMature works for [YLX2016] with scripts, address [https://github.com/ylx2016/linux-netspeed], please be familiar"
echoContent yellow "1.Installation script【Recommended original BBR+FQ】"
echoContent yellow "2.Return the rendering"
echoContent red "=============================================================="
read -r -p "please choose:" installBBRStatus
if [[ "${installBBRStatus}" == "1" ]]; then
wget -N --no-check-certificate "https://raw.githubusercontent.com/ylx2016/Linux-NetSpeed/master/tcp.sh" && chmod +x tcp.sh && ./tcp.sh
else
menu
fi
}
# View, check the log
checkLog() {
if [[ -z ${configPath} ]]; then
echoContent red " ---> No installation directory is detected, please perform script installation content"
fi
local logStatus=false
if [[ -n $(cat ${configPath}00_log.json | grep access) ]]; then
logStatus=true
fi
echoContent skyBlue "\n function $1/${totalProgress} : View log"
echoContent red "\n=============================================================="
echoContent yellow "# It is recommended to open the Access log when you debug it.\n"
if [[ "${logStatus}" == "false" ]]; then
echoContent yellow "1.Open Access log"
else
echoContent yellow "1.Close Access log"
fi
echoContent yellow "2.Monitor Access Log"
echoContent yellow "3.Monitor Error log"
echoContent yellow "4.View certificate timing task log"
echoContent yellow "5.View certificate installation log"
echoContent yellow "6.Empty log"
echoContent red "=============================================================="
read -r -p "please choose:" selectAccessLogType
local configPathLog=${configPath//conf\//}
case ${selectAccessLogType} in
1)
if [[ "${logStatus}" == "false" ]]; then
cat <<EOF >${configPath}00_log.json
{
"log": {
"access":"${configPathLog}access.log",
"error": "${configPathLog}error.log",
"loglevel": "debug"
}
}
EOF
elif [[ "${logStatus}" == "true" ]]; then
cat <<EOF >${configPath}00_log.json
{
"log": {
"error": "${configPathLog}error.log",
"loglevel": "warning"
}
}
EOF
fi
reloadCore
checkLog 1
;;
2)
tail -f ${configPathLog}access.log
;;
3)
tail -f ${configPathLog}error.log
;;
4)
tail -n 100 /etc/v2ray-agent/crontab_tls.log
;;
5)
tail -n 100 /etc/v2ray-agent/tls/acme.log
;;
6)
echo >${configPathLog}access.log
echo >${configPathLog}error.log
;;
esac
}
# Script shortcut
aliasInstall() {
if [[ -f "$HOME/install.sh" ]] && [[ -d "/etc/v2ray-agent" ]] && grep <$HOME/install.sh -q "authormack-a"; then
mv "$HOME/install.sh" /etc/v2ray-agent/install.sh
local vasmaType=
if [[ -d "/usr/bin/" ]] ; then
if [[ ! -f "/usr/bin/vasma" ]];then
ln -s /etc/v2ray-agent/install.sh /usr/bin/vasma
chmod 700 /usr/bin/vasma
vasmaType=true
fi
rm -rf "$HOME/install.sh"
elif [[ -d "/usr/sbin" ]] ; then
if [[ ! -f "/usr/sbin/vasma" ]];then
ln -s /etc/v2ray-agent/install.sh /usr/sbin/vasma
chmod 700 /usr/sbin/vasma
vasmaType=true
fi
rm -rf "$HOME/install.sh"
fi
if [[ "${vasmaType}" == "true" ]];then
echoContent green "Quick way to create success, executable[vasma]Re-opening the script"
fi
fi
}
# Check IPv6, IPv4
checkIPv6() {
pingIPv6=$(ping6 -c 1 www.google.com | sed '2{s/[^(]*(//;s/).*//;q;}' | tail -n +2)
if [[ -z "${pingIPv6}" ]]; then
echoContent red " ---> IPv6 does not support"
exit 0
fi
}
# ipv6 Divert
ipv6Routing() {
if [[ -z "${configPath}" ]]; then
echoContent red " ---> Not installed, please use the script installation"
menu
exit 0
fi
checkIPv6
echoContent skyBlue "\n function 1/${totalProgress} : IPv6 diversion"
echoContent red "\n=============================================================="
echoContent yellow "1.Add domain name"
echoContent yellow "2.Uninstall IPv6 diversion"
echoContent red "=============================================================="
read -r -p "please choose:" ipv6Status
if [[ "${ipv6Status}" == "1" ]]; then
echoContent red "=============================================================="
echoContent yellow "# Precautions\n"
echoContent yellow "1.Rules only support a predefined domain name list[https://github.com/v2fly/domain-list-community]"
echoContent yellow "2.Detailed documentation[https://www.v2fly.org/config/routing.html]"
echoContent yellow "3.If the kernel starts fail, check the domain name and re-add domain name."
echoContent yellow "4.Do not allow special characters, pay attention to the format of comma"
echoContent yellow "5.Every time you add it, it is re-added, and the last domain name will not be retained."
echoContent yellow "6.Enride example:google,youtube,facebook\n"
read -r -p "Please follow the example name of the above:" domainList
if [[ -f "${configPath}09_routing.json" ]];then
unInstallRouting IPv6-out
routing=$(jq -r '.routing.rules += [{"type":"field","domain":["geosite:'${domainList//,/\",\"geosite:}'"],"outboundTag":"IPv6-out"}]' ${configPath}09_routing.json)
echo "${routing}"|jq . >${configPath}09_routing.json
else
cat <<EOF >${configPath}09_routing.json
{
"routing":{
"domainStrategy": "IPOnDemand",
"rules": [
{
"type": "field",
"domain": [
"geosite:${domainList//,/\",\"geosite:}"
],
"outboundTag": "IPv6-out"
}
]
}
}
EOF
fi
unInstallOutbounds IPv6-out
outbounds=$(jq -r '.outbounds += [{"protocol":"freedom","settings":{"domainStrategy":"UseIPv6"},"tag":"IPv6-out"}]' ${configPath}10_ipv4_outbounds.json)
echo "${outbounds}"|jq . >${configPath}10_ipv4_outbounds.json
echoContent green " ---> Added successfully"
elif [[ "${ipv6Status}" == "2" ]]; then
unInstallRouting IPv6-out
unInstallOutbounds IPv6-out
echoContent green " ---> IPv6 shunt uninstallation is successful"
else
echoContent red " ---> wrong selection"
exit 0
fi
reloadCore
}
# BT download management
btTools() {
if [[ -z "${configPath}" ]]; then
echoContent red " ---> Not installed, please use the script installation"
menu
exit 0
fi
echoContent skyBlue "\n function 1/${totalProgress} : BT download management"
echoContent red "\n=============================================================="
if [[ -f ${configPath}09_routing.json ]] && grep -q bittorrent < ${configPath}09_routing.json;then
echoContent yellow "Current status: Disabled"
else
echoContent yellow "Current status: not disabled"
fi
echoContent yellow "1.Disable"
echoContent yellow "2.Open"
echoContent red "=============================================================="
read -r -p "please choose:" btStatus
if [[ "${btStatus}" == "1" ]]; then
if [[ -f "${configPath}09_routing.json" ]];then
unInstallRouting blackhole-out
routing=$(jq -r '.routing.rules += [{"type":"field","outboundTag":"blackhole-out","protocol":["bittorrent"]}]' ${configPath}09_routing.json)
echo "${routing}"|jq . >${configPath}09_routing.json
else
cat <<EOF >${configPath}09_routing.json
{
"routing":{
"domainStrategy": "IPOnDemand",
"rules": [
{
"type": "field",
"outboundTag": "blackhole-out",
"protocol": [ "bittorrent" ]
}
]
}
}
EOF
fi
installSniffing
unInstallOutbounds blackhole-out
outbounds=$(jq -r '.outbounds += [{"protocol":"blackhole","tag":"blackhole-out"}]' ${configPath}10_ipv4_outbounds.json)
echo "${outbounds}"|jq . >${configPath}10_ipv4_outbounds.json
echoContent green " ---> BT download disabled"
elif [[ "${btStatus}" == "2" ]]; then
unInstallSniffing
unInstallRouting blackhole-out
unInstallOutbounds blackhole-out
echoContent green " ---> BT download is successful"
else
echoContent red " ---> wrong selection"
exit 0
fi
reloadCore
}
# Uninstall Routing according to TAG
unInstallRouting(){
local tag=$1
if [[ -f "${configPath}09_routing.json" ]];then
local routing=
if grep -q "${tag}" ${configPath}09_routing.json;then
local index=$(jq .routing.rules[].outboundTag ${configPath}09_routing.json|awk '{print ""NR""":"$0}'|grep "${tag}"|awk -F "[:]" '{print $1}'|head -1)
if [[ ${index} -gt 0 ]];then
routing=$(jq -r 'del(.routing.rules['$(expr ${index} - 1)'])' ${configPath}09_routing.json)
echo "${routing}" |jq . >${configPath}09_routing.json
fi
fi
fi
}
# Uninstalling station according to TAG
unInstallOutbounds(){
local tag=$1
if grep -q "${tag}" ${configPath}10_ipv4_outbounds.json;then
local ipv6OutIndex=$(jq .outbounds[].tag ${configPath}10_ipv4_outbounds.json|awk '{print ""NR""":"$0}'|grep "${tag}"|awk -F "[:]" '{print $1}'|head -1)
if [[ ${ipv6OutIndex} -gt 0 ]];then
routing=$(jq -r 'del(.outbounds['$(expr ${ipv6OutIndex} - 1)'])' ${configPath}10_ipv4_outbounds.json)
echo "${routing}" |jq . >${configPath}10_ipv4_outbounds.json
fi
fi
}
# Uninstall
unInstallSniffing(){
ls ${configPath}|grep inbounds.json|while read -r inbound;do
sniffing=$(jq -r 'del(.inbounds[0].sniffing)' ${configPath}${inbound})
echo "${sniffing}" |jq . >${configPath}${inbound}
done
}
# Install a sniff
installSniffing(){
ls ${configPath}|grep inbounds.json|while read -r inbound;do
sniffing=$(jq -r '.inbounds[0].sniffing = {"enabled":true,"destOverride":["http","tls"]}' ${configPath}${inbound})
echo "${sniffing}" |jq . >${configPath}${inbound}
done
}
# WARP diversion
warpRouting(){
echoContent skyBlue "\n $1/${totalProgress} : WARP diversion"
echoContent red "=============================================================="
echoContent yellow "# Cautions\n"
echoContent yellow "1.The official warp has a bug after several rounds of testing, rebooting will cause warp to fail and not start, there is also a possibility of CPU usage spike"
echoContent yellow "2.It can be used normally without rebooting the machine, if you have to use the official warp, it is recommended not to reboot the machine"
echoContent yellow "3.Some machines still work normally after reboot"
echoContent yellow "4.Uninstall and reinstall if you can't use it after reboot"
2021-08-30 17:57:24 +08:00
# Install WARP
2021-08-26 17:42:59 +08:00
if [[ -z $(which warp-cli) ]];then
echo
read -r -p "WARP not installed, installed or not [y/n]:" installCloudflareWarpStatus
if [[ "${installCloudflareWarpStatus}" == "y" ]];then
installWarp
else
echoContent yellow " ---> Abandonment of installation"
exit 0
fi
fi
echoContent red "\n=============================================================="
echoContent yellow "1.Add Domain"
echoContent yellow "2.Uninstall the WARP diversion"
echoContent red "=============================================================="
2021-08-30 17:57:24 +08:00
read -r -p "please choose:" warpStatus
2021-08-26 17:42:59 +08:00
if [[ "${warpStatus}" == "1" ]]; then
echoContent red "=============================================================="
echoContent yellow "# Cautions\n"
echoContent yellow "1.Rules only support predefined domain lists[https://github.com/v2fly/domain-list-community]"
echoContent yellow "2.Detailed documentation[https://www.v2fly.org/config/routing.html]"
echoContent yellow "3.You can only divert traffic to warp, you cannot specify ipv4 or ipv6"
echoContent yellow "4.If the kernel fails to start, please check the domain name and add it again"
echoContent yellow "5.No special characters allowed, note the comma format"
echoContent yellow "6.Each time you add it, it is re-added and will not keep the last domain name"
echoContent yellow "7.Entry Example:google,youtube,facebook\n"
read -r -p "Please enter the domain name according to the example above" domainList
if [[ -f "${configPath}09_routing.json" ]];then
unInstallRouting warp-socks-out
routing=$(jq -r '.routing.rules += [{"type":"field","domain":["geosite:'${domainList//,/\",\"geosite:}'"],"outboundTag":"warp-socks-out"}]' ${configPath}09_routing.json)
echo "${routing}"|jq . >${configPath}09_routing.json
else
cat <<EOF >${configPath}09_routing.json
{
"routing":{
"domainStrategy": "IPOnDemand",
"rules": [
{
"type": "field",
"domain": [
"geosite:${domainList//,/\",\"geosite:}"
],
"outboundTag": "warp-socks-out"
}
]
}
}
EOF
fi
unInstallOutbounds warp-socks-out
local outbounds=$(jq -r '.outbounds += [{"protocol":"socks","settings":{"servers":[{"address":"127.0.0.1","port":31303}]},"tag":"warp-socks-out"}]' ${configPath}10_ipv4_outbounds.json)
echo "${outbounds}"|jq . >${configPath}10_ipv4_outbounds.json
echoContent green " ---> Added successfully"
elif [[ "${warpStatus}" == "2" ]]; then
${removeType} cloudflare-warp >/dev/null 2>&1
unInstallRouting warp-socks-out
unInstallOutbounds warp-socks-out
2021-08-30 17:57:24 +08:00
echoContent green " ---> WARP shunt uninstall success"
2021-08-26 17:42:59 +08:00
else
2021-08-30 17:57:24 +08:00
echoContent red " ---> wrong selection"
2021-08-26 17:42:59 +08:00
exit 0
fi
reloadCore
}
# Streaming media toolbox
streamingToolbox() {
echoContent skyBlue "\n function 1/${totalProgress} : Streaming media toolbox"
echoContent red "\n=============================================================="
# echoContent yellow "1.Netflix detection"
echoContent yellow "1.Any door floor machine unlock Netflix"
echoContent yellow "2.DNS unlock stream"
read -r -p "please choose:" selectType
case ${selectType} in
# 1)
# checkNetflix
# ;;
1)
checkNetflix
;;
1)
dokodemoDoorUnblockNetflix
;;
2)
dnsUnlockNetflix
;;
esac
}
# Any door unlock Netflix
dokodemoDoorUnblockNetflix() {
echoContent skyBlue "\n function 1/${totalProgress} : Any door floor machine unlock Netflix"
echoContent red "\n=============================================================="
echoContent yellow "# Precautions"
echoContent yellow "Any door unlock detailed, please check this article[https://github.com/mack-a/v2ray-agent/blob/master/documents/netflix/dokodemo-unblock_netflix.md]\n"
echoContent yellow "1.Add an outbound"
echoContent yellow "2.Adding a station"
echoContent yellow "3.Uninstall"
read -r -p "please choose:" selectType
case ${selectType} in
1)
setDokodemoDoorUnblockNetflixOutbounds
;;
2)
setDokodemoDoorUnblockNetflixInbounds
;;
3)
removeDokodemoDoorUnblockNetflix
;;
esac
}
# Set any door unlock Netflix@ outbound]
setDokodemoDoorUnblockNetflixOutbounds() {
read -r -p "Please enter unlock Netflix VPS IP:" setIP
if [[ -n "${setIP}" ]]; then
unInstallOutbounds netflix-80
unInstallOutbounds netflix-443
outbounds=$(jq -r '.outbounds += [{"tag":"netflix-80","protocol":"freedom","settings":{"domainStrategy":"AsIs","redirect":"'${setIP}':22387"}},{"tag":"netflix-443","protocol":"freedom","settings":{"domainStrategy":"AsIs","redirect":"'${setIP}':22388"}}]' ${configPath}10_ipv4_outbounds.json)
echo "${outbounds}"|jq . >${configPath}10_ipv4_outbounds.json
if [[ -f "${configPath}09_routing.json" ]] ;then
unInstallRouting netflix-80
unInstallRouting netflix-443
local routing=$(jq -r '.routing.rules += [{"type":"field","port":80,"domain":["ip.sb","geosite:netflix"],"outboundTag":"netflix-80"},{"type":"field","port":443,"domain":["ip.sb","geosite:netflix"],"outboundTag":"netflix-443"}]' ${configPath}09_routing.json)
echo "${routing}"|jq . >${configPath}09_routing.json
else
cat <<EOF >${configPath}09_routing.json
{
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"port": 80,
"domain": [
"ip.sb",
"geosite:netflix"
],
"outboundTag": "netflix-80"
},
{
"type": "field",
"port": 443,
"domain": [
"ip.sb",
"geosite:netflix"
],
"outboundTag": "netflix-443"
}
]
}
}
EOF
fi
reloadCore
echoContent green " ---> Add Netflix to unlock successfully"
# echoContent yellow " ---> Trojan related nodes do not support"
exit 0
fi
echoContent red " ---> IP cannot be empty"
}
# Set up any door unlock Netflix [inbound]
setDokodemoDoorUnblockNetflixInbounds() {
echoContent skyBlue "\n function 1/${totalProgress} : Any door to add station"
echoContent red "\n=============================================================="
echoContent yellow "# Precautions\n"
echoContent yellow "Support quantity added"
echoContent yellow "Do not allow special characters, pay attention to the format of comma"
echoContent yellow "Enride example:1.1.1.1,1.1.1.2\n"
read -r -p "Please enter the allowed access to the unlock Netflix VPS IP:" setIPs
if [[ -n "${setIPs}" ]]; then
cat <<EOF >${configPath}01_netflix_inbounds.json
{
"inbounds": [
{
"listen": "0.0.0.0",
"port": 22387,
"protocol": "dokodemo-door",
"settings": {
"address": "0.0.0.0",
"port": 80,
"network": "tcp",
"followRedirect": false
},
"sniffing": {
"enabled": true,
"destOverride": [
"http"
]
},
"tag": "unblock-80"
},
{
"listen": "0.0.0.0",
"port": 22388,
"protocol": "dokodemo-door",
"settings": {
"address": "0.0.0.0",
"port": 443,
"network": "tcp",
"followRedirect": false
},
"sniffing": {
"enabled": true,
"destOverride": [
"tls"
]
},
"tag": "unblock-443"
}
]
}
EOF
cat <<EOF >${configPath}10_ipv4_outbounds.json
{
"outbounds":[
{
"protocol":"freedom",
"settings":{
"domainStrategy":"UseIPv4"
},
"tag":"IPv4-out"
},
{
"protocol":"freedom",
"settings":{
"domainStrategy":"UseIPv6"
},
"tag":"IPv6-out"
},
{
"protocol":"blackhole",
"tag":"blackhole-out"
}
]
}
EOF
cat <<EOF >${configPath}09_routing.json
{
"routing": {
"rules": [
{
"source": [],
"type": "field",
"inboundTag": [
"unblock-80",
"unblock-443"
],
"outboundTag": "direct"
},
{
"domains": [
"geosite:netflix"
],
"type": "field",
"inboundTag": [
"unblock-80",
"unblock-443"
],
"outboundTag": "blackhole-out"
}
]
}
}
EOF
local ips=
while read -r ip; do
if [[ -z ${ips} ]];then
ips=\"${ip}\"
else
ips=${ips},\"${ip}\"
fi
done< <(echo ${setIPs}|tr ',' '\n')
local routing=$(jq -r '.routing.rules[0].source += ['${ips}']' ${configPath}09_routing.json)
echo "${routing}" | jq . >${configPath}09_routing.json
reloadCore
echoContent green " ---> Add a landing machine entry to unlock Netflix success"
exit 0
fi
echoContent red " ---> IP cannot be empty"
}
# Remove any door unlock Netflix
removeDokodemoDoorUnblockNetflix() {
unInstallOutbounds netflix-80
unInstallOutbounds netflix-443
unInstallRouting netflix-80
unInstallRouting netflix-443
rm -rf ${configPath}01_netflix_inbounds.json
reloadCore
echoContent green " ---> Uninstall success"
}
# Restart the core
reloadCore() {
if [[ "${coreInstallType}" == "1" ]]; then
handleXray stop
handleXray start
elif [[ "${coreInstallType}" == "2" || "${coreInstallType}" == "3" ]]; then
handleV2Ray stop
handleV2Ray start
fi
}
# an examination Does VPS support Netflix
checkNetflix() {
echoContent red "\n precautions"
echoContent yellow " 1.Only if the VPS can support Netflix"
echoContent yellow " 2.Netflix supports Netflix after the agent is not detecting the agent configuration DNS unlock"
echoContent yellow " 3.Can detect VPS configuration DNS unlocking Netflix\n"
echoContent skyBlue " ---> checking"
netflixResult=$(curl -s -m 2 https://www.netflix.com | grep "Not Available")
if [[ -n ${netflixResult} ]]; then
echoContent red " ---> Netflix is not available"
exit 0
fi
netflixResult=$(curl -s -m 2 https://www.netflix.com | grep "NSEZ-403")
if [[ -n ${netflixResult} ]]; then
echoContent red " ---> Netflix is not available"
exit 0
fi
echoContent skyBlue " ---> Detect whether the desperate poisoning teacher can play"
result=$(curl -s -m 2 https://www.netflix.com/title/70143836 | grep "page-404")
if [[ -n ${result} ]]; then
echoContent green " ---> Only"
exit 0
fi
echoContent green " ---> Netflix unlocked"
exit 0
}
# DNS unlock Netflix
dnsUnlockNetflix() {
echoContent skyBlue "\n function 1/${totalProgress} : DNS unlock Netflix"
echoContent red "\n=============================================================="
echoContent yellow "1.Add to"
echoContent yellow "2.Uninstall"
read -r -p "please choose:" selectType
case ${selectType} in
1)
setUnlockDNS
;;
2)
removeUnlockDNS
;;
esac
}
# Set DNS
setUnlockDNS() {
read -r -p "Please enter the DNS unlocked Netflix:" setDNS
if [[ -n ${setDNS} ]]; then
cat <<EOF >${configPath}11_dns.json
{
"dns": {
"servers": [
{
"address": "${setDNS}",
"port": 53,
"domains": [
"geosite:netflix",
"geosite:bahamut",
"geosite:hulu",
"geosite:hbo",
"geosite:disney",
"geosite:bbc",
"geosite:4chan",
"geosite:fox",
"geosite:abema",
"geosite:dmm",
"geosite:niconico",
"geosite:pixiv",
"geosite:bilibili",
"geosite:viu"
]
},
"localhost"
]
}
}
EOF
reloadCore
echoContent green "\n ---> DNS unlocks add success, this setting is invalid for Trojan-Go"
echoContent yellow "\n ---> If you can't watch it, you can try the following two programs."
echoContent yellow " 1.Restart VPS"
echoContent yellow " 2.After uninstalling the DNS unlock, modify the local [/etc/resolv.conf]DNs settings and restart VPS \ N)"
else
echoContent red " ---> DNS cannot be empty"
fi
exit 0
}
# Remove Netflix unlock
removeUnlockDNS() {
cat <<EOF >${configPath}11_dns.json
{
"dns": {
"servers": [
"localhost"
]
}
}
EOF
reloadCore
echoContent green " ---> Uninstall success"
exit 0
}
# v2ray-Core Personalization
customV2RayInstall() {
echoContent skyBlue "\n========================Personalization installation============================"
echoContent yellow "Vless front, you must install 0, if you only need to install 0, enter"
if [[ "${selectCoreType}" == "2" ]]; then
echoContent yellow "0.VLESS+TLS+TCP"
else
echoContent yellow "0.VLESS+TLS/XTLS+TCP"
fi
echoContent yellow "1.VLESS+TLS+WS[CDN]"
echoContent yellow "2.VMess+TLS+TCP"
echoContent yellow "3.VMess+TLS+WS[CDN]"
# echoContent yellow "4.Trojan、Trojan+WS[CDN]"
echoContent yellow "4.Trojan"
echoContent yellow "5.VLESS+TLS+gRPC[CDN]"
read -r -p "Please select [Multiple Select], [for example: 123]:" selectCustomInstallType
echoContent skyBlue "--------------------------------------------------------------"
if [[ -z ${selectCustomInstallType} ]]; then
selectCustomInstallType=0
fi
if [[ "${selectCustomInstallType}" =~ ^[0-5]+$ ]]; then
cleanUp xrayClean
totalProgress=17
installTools 1
# Apply for TLS
initTLSNginxConfig 2
installTLS 3
handleNginx stop
if echo ${selectCustomInstallType} | grep -q 1 || echo ${selectCustomInstallType} | grep -q 3 || echo ${selectCustomInstallType} | grep -q 4; then
randomPathFunction 5
customCDNIP 6
fi
nginxBlog 7
updateRedirectNginxConf
handleNginx start
# Install v2ray
installV2Ray 8
installV2RayService 9
initV2RayConfig custom 10
cleanUp xrayDel
installCronTLS 14
handleV2Ray stop
handleV2Ray start
# Account
checkGFWStatue 15
showAccounts 16
else
echoContent red " ---> Input is not legal"
customV2RayInstall
fi
}
# Xray-core Personalization installation
customXrayInstall() {
echoContent skyBlue "\n========================Personalization installation============================"
echoContent yellow "Vless front, default installation 0, if only 0 is required, only 0 can be selected"
echoContent yellow "0.VLESS+TLS/XTLS+TCP"
echoContent yellow "1.VLESS+TLS+WS[CDN]"
echoContent yellow "2.Trojan+TLS+gRPC[CDN]"
echoContent yellow "3.VMess+TLS+WS[CDN]"
# echoContent yellow "4.Trojan、Trojan+WS[CDN]"
echoContent yellow "4.Trojan"
echoContent yellow "5.VLESS+TLS+gRPC[CDN]"
read -r -p "Please select [Multiple Select], [for example: 123]:" selectCustomInstallType
echoContent skyBlue "--------------------------------------------------------------"
if [[ -z ${selectCustomInstallType} ]]; then
echoContent red " ---> Cannot be empty"
customXrayInstall
elif [[ "${selectCustomInstallType}" =~ ^[0-5]+$ ]]; then
cleanUp v2rayClean
totalProgress=17
installTools 1
# Apply for TLS
initTLSNginxConfig 2
installTLS 3
handleNginx stop
if echo "${selectCustomInstallType}" | grep -q 1 || echo "${selectCustomInstallType}" | grep -q 2 || echo "${selectCustomInstallType}" | grep -q 3 || echo "${selectCustomInstallType}" | grep -q 5; then
randomPathFunction 5
customCDNIP 6
fi
nginxBlog 7
updateRedirectNginxConf
handleNginx start
# Install v2ray
installXray 8
installXrayService 9
initXrayConfig custom 10
cleanUp v2rayDel
installCronTLS 14
handleXray stop
handleXray start
# Account
checkGFWStatue 15
showAccounts 16
else
echoContent red " ---> Input is not legal"
customXrayInstall
fi
}
# Select the core installation --- v2ray-core, xray-core, lock version of V2RAY-CORE [XTLS]
selectCoreInstall() {
echoContent skyBlue "\n function 1/${totalProgress} : Select core installation"
echoContent red "\n=============================================================="
echoContent yellow "1.Xray-core"
echoContent yellow "2.v2ray-core"
echoContent red "=============================================================="
read -r -p "please choose:" selectCoreType
case ${selectCoreType} in
1)
if [[ "${selectInstallType}" == "2" ]]; then
customXrayInstall
else
xrayCoreInstall
fi
;;
2)
v2rayCoreVersion=
if [[ "${selectInstallType}" == "2" ]]; then
customV2RayInstall
else
v2rayCoreInstall
fi
;;
3)
v2rayCoreVersion=v4.32.1
if [[ "${selectInstallType}" == "2" ]]; then
customV2RayInstall
else
v2rayCoreInstall
fi
;;
*)
echoContent red ' ---> Select an error, reselect'
selectCoreInstall
;;
esac
}
# v2ray-core Install
v2rayCoreInstall() {
cleanUp xrayClean
selectCustomInstallType=
totalProgress=13
installTools 2
# Apply for tls
initTLSNginxConfig 3
installTLS 4
handleNginx stop
# initNginxConfig 5
randomPathFunction 5
# Installing V2Ray
installV2Ray 6
installV2RayService 7
customCDNIP 8
initV2RayConfig all 9
cleanUp xrayDel
installCronTLS 10
nginxBlog 11
updateRedirectNginxConf
handleV2Ray stop
sleep 2
handleV2Ray start
handleNginx start
# Generate account
checkGFWStatue 12
showAccounts 13
}
# xray-core Install
xrayCoreInstall() {
cleanUp v2rayClean
selectCustomInstallType=
totalProgress=13
installTools 2
# Apply for tls
initTLSNginxConfig 3
installTLS 4
handleNginx stop
randomPathFunction 5
# Installing Xray
handleV2Ray stop
installXray 6
installXrayService 7
customCDNIP 8
initXrayConfig all 9
cleanUp v2rayDel
installCronTLS 10
nginxBlog 11
updateRedirectNginxConf
handleXray stop
sleep 2
handleXray start
handleNginx start
# Generate account
checkGFWStatue 12
showAccounts 13
}
# Core management
coreVersionManageMenu() {
if [[ -z "${coreInstallType}" ]]; then
echoContent red "\n ---> No installation directory is detected, please perform script installation content"
menu
exit 0
fi
if [[ "${coreInstallType}" == "1" ]]; then
xrayVersionManageMenu 1
elif [[ "${coreInstallType}" == "2" ]]; then
v2rayCoreVersion=
v2rayVersionManageMenu 1
elif [[ "${coreInstallType}" == "3" ]]; then
v2rayCoreVersion=v4.32.1
v2rayVersionManageMenu 1
fi
}
# Timing task check certificate
cronRenewTLS() {
if [[ "${renewTLS}" == "RenewTLS" ]]; then
renewalTLS
exit 0
fi
}
# Account management
manageAccount() {
echoContent skyBlue "\n function 1/${totalProgress} : Account management"
echoContent red "\n=============================================================="
echoContent yellow "# Every time you delete, after adding an account, you need to re-view subscription generation subscriptions.\n"
echoContent yellow "1.View account"
echoContent yellow "2.View subscriptions"
echoContent yellow "3.Add user"
echoContent yellow "4.delete users"
echoContent red "=============================================================="
read -r -p "please enter:" manageAccountStatus
if [[ "${manageAccountStatus}" == "1" ]]; then
showAccounts 1
elif [[ "${manageAccountStatus}" == "2" ]]; then
subscribe 1
elif [[ "${manageAccountStatus}" == "3" ]]; then
addUser
elif [[ "${manageAccountStatus}" == "4" ]]; then
removeUser
else
echoContent red " ---> wrong selection"
fi
}
# subscription
subscribe() {
if [[ -n "${configPath}" ]]; then
echoContent skyBlue "-------------------------Remark---------------------------------"
echoContent yellow "# When you check the subscription, you will regenerate your subscription."
echoContent yellow "# Each time you add, delete your account needs to reserve subscriptions"
rm -rf /etc/v2ray-agent/subscribe/*
rm -rf /etc/v2ray-agent/subscribe_tmp/*
showAccounts >/dev/null
mv /etc/v2ray-agent/subscribe_tmp/* /etc/v2ray-agent/subscribe/
if [[ -n $(ls /etc/v2ray-agent/subscribe) ]]; then
ls /etc/v2ray-agent/subscribe | while read -r email; do
local base64Result=$(base64 -w 0 /etc/v2ray-agent/subscribe/${email})
echo ${base64Result} >"/etc/v2ray-agent/subscribe/${email}"
echoContent skyBlue "--------------------------------------------------------------"
echoContent yellow "email$(echo "${email}" | awk -F "[_]" '{print $1}')\n"
echoContent yellow "urlhttps://${currentHost}/s/${email}\n"
echoContent yellow "Online QR codehttps://api.qrserver.com/v1/create-qr-code/?size=400x400&data=https://${currentHost}/s/${email}\n"
echo "https://${currentHost}/s/${email}" | qrencode -s 10 -m 1 -t UTF8
echoContent skyBlue "--------------------------------------------------------------"
done
fi
else
echoContent red " ---> Not Installed"
fi
}
# main menu
menu() {
cd "$HOME" || exit
echoContent red "\n=============================================================="
echoContent green "authormack-a"
echoContent green "current versionv2.5.28"
echoContent green "Githubhttps://github.com/mack-a/v2ray-agent"
echoContent green "describeEight-in-one copy script\c"
showInstallStatus
echoContent red "\n=============================================================="
if [[ -n "${coreInstallType}" ]]; then
echoContent yellow "1.re-install"
else
echoContent yellow "1.Install"
fi
echoContent yellow "2.Arbitrary combination installation"
if echo ${currentInstallProtocolType} | grep -q trojan; then
echoContent yellow "3.Switch VLESS[XTLS]"
elif echo ${currentInstallProtocolType} | grep -q 0;then
echoContent yellow "3.Switch Trojan[XTLS]"
fi
echoContent skyBlue "-------------------------Tool management-----------------------------"
echoContent yellow "4.Account management"
echoContent yellow "5.Replace the camouflage station"
echoContent yellow "6.Update certificate"
echoContent yellow "7.Replace CDN node"
echoContent yellow "8.IPv6 Divert"
echoContent yellow "9.WARP diversion"
echoContent yellow "10.Stream media tool"
echoContent yellow "11.Add a new port"
echoContent yellow "12.BT download management"
echoContent skyBlue "-------------------------Version management-----------------------------"
echoContent yellow "13.Core Management"
echoContent yellow "14.Update script"
echoContent yellow "15.Install BBR, DD script"
echoContent skyBlue "-------------------------Scripting management-----------------------------"
echoContent yellow "16.View log"
echoContent yellow "17.Uninstall"
echoContent red "=============================================================="
mkdirTools
aliasInstall
read -r -p "please choose:" selectInstallType
case ${selectInstallType} in
1)
selectCoreInstall
;;
2)
selectCoreInstall
;;
3)
initXrayFrontingConfig 1
;;
4)
manageAccount 1
;;
5)
updateNginxBlog 1
;;
6)
renewalTLS 1
;;
7)
updateV2RayCDN 1
;;
8)
ipv6Routing 1
;;
9)
warpRouting 1
;;
10)
streamingToolbox 1
;;
11)
addCorePort 1
;;
12)
btTools 1
;;
13)
coreVersionManageMenu 1
;;
14)
updateV2RayAgent 1
;;
15)
bbrInstall
;;
16)
checkLog 1
;;
17)
unInstall 1
;;
esac
}
cronRenewTLS
menu