Created
April 7, 2020 10:06
-
-
Save stefango/5f3a5a6edbc37fde17356c754b0e5762 to your computer and use it in GitHub Desktop.
Scripts to install v2ray
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# This file is accessible as https://install.direct/go.sh | |
# Original source is located at github.com/v2ray/v2ray-core/release/install-release.sh | |
# If not specify, default meaning of return value: | |
# 0: Success | |
# 1: System error | |
# 2: Application error | |
# 3: Network error | |
# CLI arguments | |
PROXY='' | |
HELP='' | |
FORCE='' | |
CHECK='' | |
REMOVE='' | |
VERSION='' | |
VSRC_ROOT='/tmp/v2ray' | |
EXTRACT_ONLY='' | |
LOCAL='' | |
LOCAL_INSTALL='' | |
DIST_SRC='github' | |
ERROR_IF_UPTODATE='' | |
CUR_VER="" | |
NEW_VER="" | |
VDIS='' | |
ZIPFILE="/tmp/v2ray/v2ray.zip" | |
V2RAY_RUNNING=0 | |
CMD_INSTALL="" | |
CMD_UPDATE="" | |
SOFTWARE_UPDATED=0 | |
SYSTEMCTL_CMD=$(command -v systemctl 2>/dev/null) | |
SERVICE_CMD=$(command -v service 2>/dev/null) | |
#######color code######## | |
RED="31m" # Error message | |
GREEN="32m" # Success message | |
YELLOW="33m" # Warning message | |
BLUE="36m" # Info message | |
######################### | |
while [[ $# > 0 ]]; do | |
case "$1" in | |
-p|--proxy) | |
PROXY="-x ${2}" | |
shift # past argument | |
;; | |
-h|--help) | |
HELP="1" | |
;; | |
-f|--force) | |
FORCE="1" | |
;; | |
-c|--check) | |
CHECK="1" | |
;; | |
--remove) | |
REMOVE="1" | |
;; | |
--version) | |
VERSION="$2" | |
shift | |
;; | |
--extract) | |
VSRC_ROOT="$2" | |
shift | |
;; | |
--extractonly) | |
EXTRACT_ONLY="1" | |
;; | |
-l|--local) | |
LOCAL="$2" | |
LOCAL_INSTALL="1" | |
shift | |
;; | |
--source) | |
DIST_SRC="$2" | |
shift | |
;; | |
--errifuptodate) | |
ERROR_IF_UPTODATE="1" | |
;; | |
*) | |
# unknown option | |
;; | |
esac | |
shift # past argument or value | |
done | |
############################### | |
colorEcho(){ | |
echo -e "\033[${1}${@:2}\033[0m" 1>& 2 | |
} | |
archAffix(){ | |
case "${1:-"$(uname -m)"}" in | |
i686|i386) | |
echo '32' | |
;; | |
x86_64|amd64) | |
echo '64' | |
;; | |
*armv7*|armv6l) | |
echo 'arm' | |
;; | |
*armv8*|aarch64) | |
echo 'arm64' | |
;; | |
*mips64le*) | |
echo 'mips64le' | |
;; | |
*mips64*) | |
echo 'mips64' | |
;; | |
*mipsle*) | |
echo 'mipsle' | |
;; | |
*mips*) | |
echo 'mips' | |
;; | |
*s390x*) | |
echo 's390x' | |
;; | |
ppc64le) | |
echo 'ppc64le' | |
;; | |
ppc64) | |
echo 'ppc64' | |
;; | |
*) | |
return 1 | |
;; | |
esac | |
return 0 | |
} | |
zipRoot() { | |
unzip -lqq "$1" | awk -e ' | |
NR == 1 { | |
prefix = $4; | |
} | |
NR != 1 { | |
prefix_len = length(prefix); | |
cur_len = length($4); | |
for (len = prefix_len < cur_len ? prefix_len : cur_len; len >= 1; len -= 1) { | |
sub_prefix = substr(prefix, 1, len); | |
sub_cur = substr($4, 1, len); | |
if (sub_prefix == sub_cur) { | |
prefix = sub_prefix; | |
break; | |
} | |
} | |
if (len == 0) { | |
prefix = ""; | |
nextfile; | |
} | |
} | |
END { | |
print prefix; | |
} | |
' | |
} | |
downloadV2Ray(){ | |
rm -rf /tmp/v2ray | |
mkdir -p /tmp/v2ray | |
if [[ "${DIST_SRC}" == "jsdelivr" ]]; then | |
DOWNLOAD_LINK="https://cdn.jsdelivr.net/gh/v2ray/dist/v2ray-linux-${VDIS}.zip" | |
else | |
DOWNLOAD_LINK="https://github.com/v2ray/v2ray-core/releases/download/${NEW_VER}/v2ray-linux-${VDIS}.zip" | |
fi | |
colorEcho ${BLUE} "Downloading V2Ray: ${DOWNLOAD_LINK}" | |
curl ${PROXY} -L -H "Cache-Control: no-cache" -o ${ZIPFILE} ${DOWNLOAD_LINK} | |
if [ $? != 0 ];then | |
colorEcho ${RED} "Failed to download! Please check your network or try again." | |
return 3 | |
fi | |
return 0 | |
} | |
installSoftware(){ | |
COMPONENT=$1 | |
if [[ -n `command -v $COMPONENT` ]]; then | |
return 0 | |
fi | |
getPMT | |
if [[ $? -eq 1 ]]; then | |
colorEcho ${RED} "The system package manager tool isn't APT or YUM, please install ${COMPONENT} manually." | |
return 1 | |
fi | |
if [[ $SOFTWARE_UPDATED -eq 0 ]]; then | |
colorEcho ${BLUE} "Updating software repo" | |
$CMD_UPDATE | |
SOFTWARE_UPDATED=1 | |
fi | |
colorEcho ${BLUE} "Installing ${COMPONENT}" | |
$CMD_INSTALL $COMPONENT | |
if [[ $? -ne 0 ]]; then | |
colorEcho ${RED} "Failed to install ${COMPONENT}. Please install it manually." | |
return 1 | |
fi | |
return 0 | |
} | |
# return 1: not apt, yum, or zypper | |
getPMT(){ | |
if [[ -n `command -v apt-get` ]];then | |
CMD_INSTALL="apt-get -y -qq install" | |
CMD_UPDATE="apt-get -qq update" | |
elif [[ -n `command -v yum` ]]; then | |
CMD_INSTALL="yum -y -q install" | |
CMD_UPDATE="yum -q makecache" | |
elif [[ -n `command -v zypper` ]]; then | |
CMD_INSTALL="zypper -y install" | |
CMD_UPDATE="zypper ref" | |
else | |
return 1 | |
fi | |
return 0 | |
} | |
normalizeVersion() { | |
if [ -n "$1" ]; then | |
case "$1" in | |
v*) | |
echo "$1" | |
;; | |
*) | |
echo "v$1" | |
;; | |
esac | |
else | |
echo "" | |
fi | |
} | |
# 1: new V2Ray. 0: no. 2: not installed. 3: check failed. 4: don't check. | |
getVersion(){ | |
if [[ -n "$VERSION" ]]; then | |
NEW_VER="$(normalizeVersion "$VERSION")" | |
return 4 | |
else | |
VER="$(/usr/bin/v2ray/v2ray -version 2>/dev/null)" | |
RETVAL=$? | |
CUR_VER="$(normalizeVersion "$(echo "$VER" | head -n 1 | cut -d " " -f2)")" | |
TAG_URL="https://api.github.com/repos/v2ray/v2ray-core/releases/latest" | |
NEW_VER="$(normalizeVersion "$(curl ${PROXY} -H "Accept: application/json" -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:74.0) Gecko/20100101 Firefox/74.0" -s "${TAG_URL}" --connect-timeout 10| grep 'tag_name' | cut -d\" -f4)")" | |
if [[ $? -ne 0 ]] || [[ $NEW_VER == "" ]]; then | |
colorEcho ${RED} "Failed to fetch release information. Please check your network or try again." | |
return 3 | |
elif [[ $RETVAL -ne 0 ]];then | |
return 2 | |
elif [[ $NEW_VER != $CUR_VER ]];then | |
return 1 | |
fi | |
return 0 | |
fi | |
} | |
stopV2ray(){ | |
colorEcho ${BLUE} "Shutting down V2Ray service." | |
if [[ -n "${SYSTEMCTL_CMD}" ]] || [[ -f "/lib/systemd/system/v2ray.service" ]] || [[ -f "/etc/systemd/system/v2ray.service" ]]; then | |
${SYSTEMCTL_CMD} stop v2ray | |
elif [[ -n "${SERVICE_CMD}" ]] || [[ -f "/etc/init.d/v2ray" ]]; then | |
${SERVICE_CMD} v2ray stop | |
fi | |
if [[ $? -ne 0 ]]; then | |
colorEcho ${YELLOW} "Failed to shutdown V2Ray service." | |
return 2 | |
fi | |
return 0 | |
} | |
startV2ray(){ | |
if [ -n "${SYSTEMCTL_CMD}" ] && [[ -f "/lib/systemd/system/v2ray.service" || -f "/etc/systemd/system/v2ray.service" ]]; then | |
${SYSTEMCTL_CMD} start v2ray | |
elif [ -n "${SERVICE_CMD}" ] && [ -f "/etc/init.d/v2ray" ]; then | |
${SERVICE_CMD} v2ray start | |
fi | |
if [[ $? -ne 0 ]]; then | |
colorEcho ${YELLOW} "Failed to start V2Ray service." | |
return 2 | |
fi | |
return 0 | |
} | |
installV2Ray(){ | |
# Install V2Ray binary to /usr/bin/v2ray | |
mkdir -p '/etc/v2ray' '/var/log/v2ray' && \ | |
unzip -oj "$1" "$2v2ray" "$2v2ctl" "$2geoip.dat" "$2geosite.dat" -d '/usr/bin/v2ray' && \ | |
chmod +x '/usr/bin/v2ray/v2ray' '/usr/bin/v2ray/v2ctl' || { | |
colorEcho ${RED} "Failed to copy V2Ray binary and resources." | |
return 1 | |
} | |
# Install V2Ray server config to /etc/v2ray | |
if [ ! -f '/etc/v2ray/config.json' ]; then | |
local PORT="$(($RANDOM + 10000))" | |
local UUID="$(cat '/proc/sys/kernel/random/uuid')" | |
unzip -pq "$1" "$2vpoint_vmess_freedom.json" | \ | |
sed -e "s/10086/${PORT}/g; s/23ad6b10-8d1a-40f7-8ad0-e3e35cd38297/${UUID}/g;" - > \ | |
'/etc/v2ray/config.json' || { | |
colorEcho ${YELLOW} "Failed to create V2Ray configuration file. Please create it manually." | |
return 1 | |
} | |
colorEcho ${BLUE} "PORT:${PORT}" | |
colorEcho ${BLUE} "UUID:${UUID}" | |
fi | |
} | |
installInitScript(){ | |
if [[ -n "${SYSTEMCTL_CMD}" ]]; then | |
if [[ ! -f "/etc/systemd/system/v2ray.service" && ! -f "/lib/systemd/system/v2ray.service" ]]; then | |
unzip -oj "$1" "$2systemd/v2ray.service" -d '/etc/systemd/system' && \ | |
systemctl enable v2ray.service | |
fi | |
elif [[ -n "${SERVICE_CMD}" ]] && [[ ! -f "/etc/init.d/v2ray" ]]; then | |
installSoftware 'daemon' && \ | |
unzip -oj "$1" "$2systemv/v2ray" -d '/etc/init.d' && \ | |
chmod +x '/etc/init.d/v2ray' && \ | |
update-rc.d v2ray defaults | |
fi | |
} | |
Help(){ | |
cat - 1>& 2 << EOF | |
./install-release.sh [-h] [-c] [--remove] [-p proxy] [-f] [--version vx.y.z] [-l file] | |
-h, --help Show help | |
-p, --proxy To download through a proxy server, use -p socks5://127.0.0.1:1080 or -p http://127.0.0.1:3128 etc | |
-f, --force Force install | |
--version Install a particular version, use --version v3.15 | |
-l, --local Install from a local file | |
--remove Remove installed V2Ray | |
-c, --check Check for update | |
EOF | |
} | |
remove(){ | |
if [[ -n "${SYSTEMCTL_CMD}" ]] && [[ -f "/etc/systemd/system/v2ray.service" ]];then | |
if pgrep "v2ray" > /dev/null ; then | |
stopV2ray | |
fi | |
systemctl disable v2ray.service | |
rm -rf "/usr/bin/v2ray" "/etc/systemd/system/v2ray.service" | |
if [[ $? -ne 0 ]]; then | |
colorEcho ${RED} "Failed to remove V2Ray." | |
return 0 | |
else | |
colorEcho ${GREEN} "Removed V2Ray successfully." | |
colorEcho ${BLUE} "If necessary, please remove configuration file and log file manually." | |
return 0 | |
fi | |
elif [[ -n "${SYSTEMCTL_CMD}" ]] && [[ -f "/lib/systemd/system/v2ray.service" ]];then | |
if pgrep "v2ray" > /dev/null ; then | |
stopV2ray | |
fi | |
systemctl disable v2ray.service | |
rm -rf "/usr/bin/v2ray" "/lib/systemd/system/v2ray.service" | |
if [[ $? -ne 0 ]]; then | |
colorEcho ${RED} "Failed to remove V2Ray." | |
return 0 | |
else | |
colorEcho ${GREEN} "Removed V2Ray successfully." | |
colorEcho ${BLUE} "If necessary, please remove configuration file and log file manually." | |
return 0 | |
fi | |
elif [[ -n "${SERVICE_CMD}" ]] && [[ -f "/etc/init.d/v2ray" ]]; then | |
if pgrep "v2ray" > /dev/null ; then | |
stopV2ray | |
fi | |
rm -rf "/usr/bin/v2ray" "/etc/init.d/v2ray" | |
if [[ $? -ne 0 ]]; then | |
colorEcho ${RED} "Failed to remove V2Ray." | |
return 0 | |
else | |
colorEcho ${GREEN} "Removed V2Ray successfully." | |
colorEcho ${BLUE} "If necessary, please remove configuration file and log file manually." | |
return 0 | |
fi | |
else | |
colorEcho ${YELLOW} "V2Ray not found." | |
return 0 | |
fi | |
} | |
checkUpdate(){ | |
echo "Checking for update." | |
VERSION="" | |
getVersion | |
RETVAL="$?" | |
if [[ $RETVAL -eq 1 ]]; then | |
colorEcho ${BLUE} "Found new version ${NEW_VER} for V2Ray.(Current version:$CUR_VER)" | |
elif [[ $RETVAL -eq 0 ]]; then | |
colorEcho ${BLUE} "No new version. Current version is ${NEW_VER}." | |
elif [[ $RETVAL -eq 2 ]]; then | |
colorEcho ${YELLOW} "No V2Ray installed." | |
colorEcho ${BLUE} "The newest version for V2Ray is ${NEW_VER}." | |
fi | |
return 0 | |
} | |
main(){ | |
#helping information | |
[[ "$HELP" == "1" ]] && Help && return | |
[[ "$CHECK" == "1" ]] && checkUpdate && return | |
[[ "$REMOVE" == "1" ]] && remove && return | |
local ARCH=$(uname -m) | |
VDIS="$(archAffix)" | |
# extract local file | |
if [[ $LOCAL_INSTALL -eq 1 ]]; then | |
colorEcho ${YELLOW} "Installing V2Ray via local file. Please make sure the file is a valid V2Ray package, as we are not able to determine that." | |
NEW_VER=local | |
rm -rf /tmp/v2ray | |
ZIPFILE="$LOCAL" | |
#FILEVDIS=`ls /tmp/v2ray |grep v2ray-v |cut -d "-" -f4` | |
#SYSTEM=`ls /tmp/v2ray |grep v2ray-v |cut -d "-" -f3` | |
#if [[ ${SYSTEM} != "linux" ]]; then | |
# colorEcho ${RED} "The local V2Ray can not be installed in linux." | |
# return 1 | |
#elif [[ ${FILEVDIS} != ${VDIS} ]]; then | |
# colorEcho ${RED} "The local V2Ray can not be installed in ${ARCH} system." | |
# return 1 | |
#else | |
# NEW_VER=`ls /tmp/v2ray |grep v2ray-v |cut -d "-" -f2` | |
#fi | |
else | |
# download via network and extract | |
installSoftware "curl" || return $? | |
getVersion | |
RETVAL="$?" | |
if [[ $RETVAL == 0 ]] && [[ "$FORCE" != "1" ]]; then | |
colorEcho ${BLUE} "Latest version ${CUR_VER} is already installed." | |
if [ -n "${ERROR_IF_UPTODATE}" ]; then | |
return 10 | |
fi | |
return | |
elif [[ $RETVAL == 3 ]]; then | |
return 3 | |
else | |
colorEcho ${BLUE} "Installing V2Ray ${NEW_VER} on ${ARCH}" | |
downloadV2Ray || return $? | |
fi | |
fi | |
local ZIPROOT="$(zipRoot "${ZIPFILE}")" | |
installSoftware unzip || return $? | |
if [ -n "${EXTRACT_ONLY}" ]; then | |
colorEcho ${BLUE} "Extracting V2Ray package to ${VSRC_ROOT}." | |
if unzip -o "${ZIPFILE}" -d ${VSRC_ROOT}; then | |
colorEcho ${GREEN} "V2Ray extracted to ${VSRC_ROOT%/}${ZIPROOT:+/${ZIPROOT%/}}, and exiting..." | |
return 0 | |
else | |
colorEcho ${RED} "Failed to extract V2Ray." | |
return 2 | |
fi | |
fi | |
if pgrep "v2ray" > /dev/null ; then | |
V2RAY_RUNNING=1 | |
stopV2ray | |
fi | |
installV2Ray "${ZIPFILE}" "${ZIPROOT}" || return $? | |
installInitScript "${ZIPFILE}" "${ZIPROOT}" || return $? | |
if [[ ${V2RAY_RUNNING} -eq 1 ]];then | |
colorEcho ${BLUE} "Restarting V2Ray service." | |
startV2ray | |
fi | |
colorEcho ${GREEN} "V2Ray ${NEW_VER} is installed." | |
rm -rf /tmp/v2ray | |
return 0 | |
} | |
main |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Adapted from https://install.direct/go.sh