-
-
Save cbeuw/dd34bf577db85d857ae2f8bb960733e3 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash | |
PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/go/bin:/usr/local/sbin:~/bin | |
export PATH | |
# | |
# Auto compile install Shadowsocks Server with Cloak | |
# | |
# Copyright (C) 2016-2018 Teddysun <[email protected]> | |
# | |
# Forked and modified by cbeuw from https://github.com/teddysun/shadowsocks_install/blob/master/shadowsocks-all.sh | |
# | |
# System Required: CentOS 6+, Debian7+, Ubuntu12+ | |
# | |
# Reference URL: | |
# https://github.com/shadowsocks/shadowsocks | |
# https://github.com/shadowsocks/shadowsocks-libev | |
# https://github.com/cbeuw/Cloak | |
red='\033[0;31m' | |
green='\033[0;32m' | |
yellow='\033[0;33m' | |
plain='\033[0m' | |
[[ $EUID -ne 0 ]] && echo -e "[${red}Error${plain}] This script must be run as root!" && exit 1 | |
cur_dir=$( pwd ) | |
libsodium_file="libsodium-1.0.16" | |
libsodium_url="https://github.com/jedisct1/libsodium/releases/download/1.0.16/libsodium-1.0.16.tar.gz" | |
mbedtls_file="mbedtls-2.12.0" | |
mbedtls_url="https://tls.mbed.org/download/mbedtls-2.12.0-gpl.tgz" | |
shadowsocks_libev_init="/etc/init.d/shadowsocks-libev" | |
shadowsocks_libev_config="/etc/shadowsocks-libev/config.json" | |
shadowsocks_libev_centos="https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev" | |
shadowsocks_libev_debian="https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev-debian" | |
# Stream Ciphers | |
common_ciphers=( | |
aes-256-gcm | |
aes-192-gcm | |
aes-128-gcm | |
aes-256-ctr | |
aes-192-ctr | |
aes-128-ctr | |
aes-256-cfb | |
aes-192-cfb | |
aes-128-cfb | |
camellia-128-cfb | |
camellia-192-cfb | |
camellia-256-cfb | |
xchacha20-ietf-poly1305 | |
chacha20-ietf-poly1305 | |
chacha20-ietf | |
chacha20 | |
salsa20 | |
rc4-md5 | |
) | |
disable_selinux(){ | |
if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; then | |
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config | |
setenforce 0 | |
fi | |
} | |
check_sys(){ | |
local checkType=$1 | |
local value=$2 | |
local release='' | |
local systemPackage='' | |
if [[ -f /etc/redhat-release ]]; then | |
release="centos" | |
systemPackage="yum" | |
elif grep -Eqi "debian" /etc/issue; then | |
release="debian" | |
systemPackage="apt" | |
elif grep -Eqi "ubuntu" /etc/issue; then | |
release="ubuntu" | |
systemPackage="apt" | |
elif grep -Eqi "centos|red hat|redhat" /etc/issue; then | |
release="centos" | |
systemPackage="yum" | |
elif grep -Eqi "debian|raspbian" /proc/version; then | |
release="debian" | |
systemPackage="apt" | |
elif grep -Eqi "ubuntu" /proc/version; then | |
release="ubuntu" | |
systemPackage="apt" | |
elif grep -Eqi "centos|red hat|redhat" /proc/version; then | |
release="centos" | |
systemPackage="yum" | |
fi | |
if [[ "${checkType}" == "sysRelease" ]]; then | |
if [ "${value}" == "${release}" ]; then | |
return 0 | |
else | |
return 1 | |
fi | |
elif [[ "${checkType}" == "packageManager" ]]; then | |
if [ "${value}" == "${systemPackage}" ]; then | |
return 0 | |
else | |
return 1 | |
fi | |
fi | |
} | |
version_ge(){ | |
test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" == "$1" | |
} | |
version_gt(){ | |
test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" != "$1" | |
} | |
check_kernel_version(){ | |
local kernel_version=$(uname -r | cut -d- -f1) | |
if version_gt ${kernel_version} 3.7.0; then | |
return 0 | |
else | |
return 1 | |
fi | |
} | |
check_kernel_headers(){ | |
if check_sys packageManager yum; then | |
if rpm -qa | grep -q headers-$(uname -r); then | |
return 0 | |
else | |
return 1 | |
fi | |
elif check_sys packageManager apt; then | |
if dpkg -s linux-headers-$(uname -r) > /dev/null 2>&1; then | |
return 0 | |
else | |
return 1 | |
fi | |
fi | |
return 1 | |
} | |
getversion(){ | |
if [[ -s /etc/redhat-release ]]; then | |
grep -oE "[0-9.]+" /etc/redhat-release | |
else | |
grep -oE "[0-9.]+" /etc/issue | |
fi | |
} | |
centosversion(){ | |
if check_sys sysRelease centos; then | |
local code=$1 | |
local version="$(getversion)" | |
local main_ver=${version%%.*} | |
if [ "$main_ver" == "$code" ]; then | |
return 0 | |
else | |
return 1 | |
fi | |
else | |
return 1 | |
fi | |
} | |
autoconf_version(){ | |
if [ ! "$(command -v autoconf)" ]; then | |
echo -e "[${green}Info${plain}] Starting install package autoconf" | |
if check_sys packageManager yum; then | |
yum install -y autoconf > /dev/null 2>&1 || echo -e "[${red}Error:${plain}] Failed to install autoconf" | |
elif check_sys packageManager apt; then | |
apt-get -y update > /dev/null 2>&1 | |
apt-get -y install autoconf > /dev/null 2>&1 || echo -e "[${red}Error:${plain}] Failed to install autoconf" | |
fi | |
fi | |
local autoconf_ver=$(autoconf --version | grep autoconf | grep -oE "[0-9.]+") | |
if version_ge ${autoconf_ver} 2.67; then | |
return 0 | |
else | |
return 1 | |
fi | |
} | |
get_ip(){ | |
[ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipv4.icanhazip.com ) | |
[ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipinfo.io/ip ) | |
[ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ip.42.pl/ip ) | |
echo ${IP} | |
} | |
get_ipv6(){ | |
local ipv6=$(wget -qO- -t1 -T2 ipv6.icanhazip.com) | |
[ -z ${ipv6} ] && return 1 || return 0 | |
} | |
get_libev_ver(){ | |
libev_ver=$(wget --no-check-certificate -qO- https://api.github.com/repos/shadowsocks/shadowsocks-libev/releases/latest | grep 'tag_name' | cut -d\" -f4) | |
[ -z ${libev_ver} ] && echo -e "[${red}Error${plain}] Get shadowsocks-libev latest version failed" && exit 1 | |
} | |
get_opsy(){ | |
[ -f /etc/redhat-release ] && awk '{print ($1,$3~/^[0-9]/?$3:$4)}' /etc/redhat-release && return | |
[ -f /etc/os-release ] && awk -F'[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release && return | |
[ -f /etc/lsb-release ] && awk -F'[="]+' '/DESCRIPTION/{print $2}' /etc/lsb-release && return | |
} | |
is_64bit(){ | |
if [ `getconf WORD_BIT` = '32' ] && [ `getconf LONG_BIT` = '64' ] ; then | |
return 0 | |
else | |
return 1 | |
fi | |
} | |
debianversion(){ | |
if check_sys sysRelease debian;then | |
local version=$( get_opsy ) | |
local code=${1} | |
local main_ver=$( echo ${version} | sed 's/[^0-9]//g') | |
if [ "${main_ver}" == "${code}" ];then | |
return 0 | |
else | |
return 1 | |
fi | |
else | |
return 1 | |
fi | |
} | |
download(){ | |
local filename=$(basename $1) | |
if [ -f ${1} ]; then | |
echo "${filename} [found]" | |
else | |
echo "${filename} not found, download now..." | |
wget --no-check-certificate -c -t3 -T60 -O ${1} ${2} | |
if [ $? -ne 0 ]; then | |
echo -e "[${red}Error${plain}] Download ${filename} failed." | |
exit 1 | |
fi | |
fi | |
} | |
download_files(){ | |
cd ${cur_dir} | |
get_libev_ver | |
shadowsocks_libev_file="shadowsocks-libev-$(echo ${libev_ver} | sed -e 's/^[a-zA-Z]//g')" | |
shadowsocks_libev_url="https://github.com/shadowsocks/shadowsocks-libev/releases/download/${libev_ver}/${shadowsocks_libev_file}.tar.gz" | |
download "${shadowsocks_libev_file}.tar.gz" "${shadowsocks_libev_url}" | |
if check_sys packageManager yum; then | |
download "${shadowsocks_libev_init}" "${shadowsocks_libev_centos}" | |
elif check_sys packageManager apt; then | |
download "${shadowsocks_libev_init}" "${shadowsocks_libev_debian}" | |
fi | |
} | |
get_char(){ | |
SAVEDSTTY=$(stty -g) | |
stty -echo | |
stty cbreak | |
dd if=/dev/tty bs=1 count=1 2> /dev/null | |
stty -raw | |
stty echo | |
stty $SAVEDSTTY | |
} | |
error_detect_depends(){ | |
local command=$1 | |
local depend=`echo "${command}" | awk '{print $4}'` | |
echo -e "[${green}Info${plain}] Starting to install package ${depend}" | |
${command} > /dev/null 2>&1 | |
if [ $? -ne 0 ]; then | |
echo -e "[${red}Error${plain}] Failed to install ${red}${depend}${plain}" | |
exit 1 | |
fi | |
} | |
config_firewall(){ | |
if centosversion 6; then | |
/etc/init.d/iptables status > /dev/null 2>&1 | |
if [ $? -eq 0 ]; then | |
iptables -L -n | grep -i ${shadowsocksport} > /dev/null 2>&1 | |
if [ $? -ne 0 ]; then | |
iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${shadowsocksport} -j ACCEPT | |
iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${shadowsocksport} -j ACCEPT | |
/etc/init.d/iptables save | |
/etc/init.d/iptables restart | |
else | |
echo -e "[${green}Info${plain}] port ${green}${shadowsocksport}${plain} already be enabled." | |
fi | |
else | |
echo -e "[${yellow}Warning${plain}] iptables looks like not running or not installed, please enable port ${shadowsocksport} manually if necessary." | |
fi | |
elif centosversion 7; then | |
systemctl status firewalld > /dev/null 2>&1 | |
if [ $? -eq 0 ]; then | |
firewall-cmd --permanent --zone=public --add-port=${shadowsocksport}/tcp | |
firewall-cmd --permanent --zone=public --add-port=${shadowsocksport}/udp | |
firewall-cmd --reload | |
else | |
echo -e "[${yellow}Warning${plain}] firewalld looks like not running or not installed, please enable port ${shadowsocksport} manually if necessary." | |
fi | |
fi | |
} | |
generate_credentials(){ | |
if [ "${cloak}" == "y" ] || [ "${cloak}" == "Y" ]; then | |
ck-server -u | read ckauid | |
ck-server -k | read -d, ckpub ckpv | |
fi | |
} | |
config_shadowsocks(){ | |
local server_value="\"0.0.0.0\"" | |
if get_ipv6; then | |
server_value="[\"[::0]\",\"0.0.0.0\"]" | |
fi | |
if [ ! -d "$(dirname ${shadowsocks_libev_config})" ]; then | |
mkdir -p $(dirname ${shadowsocks_libev_config}) | |
fi | |
if [ "${cloak}" == "y" ] || [ "${cloak}" == "Y" ]; then | |
cat > ${shadowsocks_libev_config}<<-EOF | |
{ | |
"server":${server_value}, | |
"server_port":${shadowsocksport}, | |
"password":"${shadowsockspwd}", | |
"timeout":300, | |
"user":"nobody", | |
"method":"${shadowsockscipher}", | |
"fast_open":false, | |
"nameserver":"8.8.8.8", | |
"mode":"tcp_and_udp", | |
"plugin":"ck-server", | |
"plugin_opts":"WebServerAddr=${ckwebaddr};PrivateKey=${ckpv};AdminUID=${ckauid}" | |
} | |
EOF | |
else | |
cat > ${shadowsocks_libev_config}<<-EOF | |
{ | |
"server":${server_value}, | |
"server_port":${shadowsocksport}, | |
"password":"${shadowsockspwd}", | |
"timeout":300, | |
"user":"nobody", | |
"method":"${shadowsockscipher}", | |
"fast_open":false, | |
"nameserver":"8.8.8.8", | |
"mode":"tcp_and_udp" | |
} | |
EOF | |
fi | |
} | |
install_dependencies(){ | |
if check_sys packageManager yum; then | |
echo -e "[${green}Info${plain}] Checking the EPEL repository..." | |
if [ ! -f /etc/yum.repos.d/epel.repo ]; then | |
yum install -y epel-release > /dev/null 2>&1 | |
fi | |
[ ! -f /etc/yum.repos.d/epel.repo ] && echo -e "[${red}Error${plain}] Install EPEL repository failed, please check it." && exit 1 | |
[ ! "$(command -v yum-config-manager)" ] && yum install -y yum-utils > /dev/null 2>&1 | |
[ x"$(yum-config-manager epel | grep -w enabled | awk '{print $3}')" != x"True" ] && yum-config-manager --enable epel > /dev/null 2>&1 | |
echo -e "[${green}Info${plain}] Checking the EPEL repository complete..." | |
yum_depends=( | |
unzip gzip openssl openssl-devel gcc pcre pcre-devel libtool libevent | |
autoconf automake make curl curl-devel zlib-devel cpio expat-devel gettext-devel | |
libev-devel c-ares-devel git qrencode | |
) | |
for depend in ${yum_depends[@]}; do | |
error_detect_depends "yum -y install ${depend}" | |
done | |
elif check_sys packageManager apt; then | |
apt_depends=( | |
gettext build-essential unzip gzip curl openssl libssl-dev | |
autoconf automake libtool gcc make cpio libpcre3 libpcre3-dev zlib1g-dev libev-dev libc-ares-dev git qrencode | |
) | |
apt-get -y update | |
for depend in ${apt_depends[@]}; do | |
error_detect_depends "apt-get -y install ${depend}" | |
done | |
fi | |
} | |
install_check(){ | |
if check_sys packageManager yum || check_sys packageManager apt; then | |
if centosversion 5; then | |
return 1 | |
fi | |
return 0 | |
else | |
return 1 | |
fi | |
} | |
install_select(){ | |
if ! install_check; then | |
echo -e "[${red}Error${plain}] Your OS is not supported to run it!" | |
echo "Please change to CentOS 6+/Debian 7+/Ubuntu 12+ and try again." | |
exit 1 | |
fi | |
clear | |
} | |
install_prepare_password(){ | |
echo "Please enter password for shadowsocks-libev:" | |
read -p "(Default password: teddysun.com):" shadowsockspwd | |
[ -z "${shadowsockspwd}" ] && shadowsockspwd="teddysun.com" | |
echo | |
echo "password = ${shadowsockspwd}" | |
echo | |
} | |
install_prepare_port() { | |
while true | |
do | |
dport=443 | |
echo -e "Please enter a port for shadowsocks-libev [1-65535]" | |
read -p "(Default port: ${dport}):" shadowsocksport | |
[ -z "${shadowsocksport}" ] && shadowsocksport=${dport} | |
expr ${shadowsocksport} + 1 &>/dev/null | |
if [ $? -eq 0 ]; then | |
if [ ${shadowsocksport} -ge 1 ] && [ ${shadowsocksport} -le 65535 ] && [ ${shadowsocksport:0:1} != 0 ]; then | |
echo | |
echo "port = ${shadowsocksport}" | |
echo | |
break | |
fi | |
fi | |
echo -e "[${red}Error${plain}] Please enter a correct number [1-65535]" | |
done | |
} | |
install_prepare_cipher(){ | |
while true | |
do | |
echo -e "Please select stream cipher for shadowsocks-libev:" | |
for ((i=1;i<=${#common_ciphers[@]};i++ )); do | |
hint="${common_ciphers[$i-1]}" | |
echo -e "${green}${i}${plain}) ${hint}" | |
done | |
read -p "Which cipher you'd select(Default: ${common_ciphers[0]}):" pick | |
[ -z "$pick" ] && pick=1 | |
expr ${pick} + 1 &>/dev/null | |
if [ $? -ne 0 ]; then | |
echo -e "[${red}Error${plain}] Please enter a number" | |
continue | |
fi | |
if [[ "$pick" -lt 1 || "$pick" -gt ${#common_ciphers[@]} ]]; then | |
echo -e "[${red}Error${plain}] Please enter a number between 1 and ${#common_ciphers[@]}" | |
continue | |
fi | |
shadowsockscipher=${common_ciphers[$pick-1]} | |
echo | |
echo "cipher = ${shadowsockscipher}" | |
echo | |
break | |
done | |
} | |
install_prepare_libev_cloak(){ | |
while true | |
do | |
echo -e "Do you want install Cloak for shadowsocks-libev? [y/n]" | |
read -p "(default: y):" cloak | |
[ -z "$cloak" ] && cloak=y | |
case "${cloak}" in | |
y|Y|n|N) | |
echo | |
echo "You choose = ${cloak}" | |
echo | |
break | |
;; | |
*) | |
echo -e "[${red}Error${plain}] Please only enter [y/n]" | |
;; | |
esac | |
done | |
if [ "${cloak}" == "y" ] || [ "${cloak}" == "Y" ]; then | |
echo -e "Please enter a redirection IP for Cloak (leave blank to set it to 204.79.197.200:443 of bing.com):" | |
read -p "" ckwebaddr | |
[ -z "$ckwebaddr" ] && ckwebaddr="204.79.197.200:443" | |
fi | |
} | |
install_prepare(){ | |
install_prepare_password | |
install_prepare_port | |
install_prepare_cipher | |
install_prepare_libev_cloak | |
echo | |
echo "Press any key to start...or Press Ctrl+C to cancel" | |
char=`get_char` | |
} | |
install_libsodium(){ | |
if [ ! -f /usr/lib/libsodium.a ]; then | |
cd ${cur_dir} | |
download "${libsodium_file}.tar.gz" "${libsodium_url}" | |
tar zxf ${libsodium_file}.tar.gz | |
cd ${libsodium_file} | |
./configure --prefix=/usr && make && make install | |
if [ $? -ne 0 ]; then | |
echo -e "[${red}Error${plain}] ${libsodium_file} install failed." | |
install_cleanup | |
exit 1 | |
fi | |
else | |
echo -e "[${green}Info${plain}] ${libsodium_file} already installed." | |
fi | |
} | |
install_mbedtls(){ | |
if [ ! -f /usr/lib/libmbedtls.a ]; then | |
cd ${cur_dir} | |
download "${mbedtls_file}-gpl.tgz" "${mbedtls_url}" | |
tar xf ${mbedtls_file}-gpl.tgz | |
cd ${mbedtls_file} | |
make SHARED=1 CFLAGS=-fPIC | |
make DESTDIR=/usr install | |
if [ $? -ne 0 ]; then | |
echo -e "[${red}Error${plain}] ${mbedtls_file} install failed." | |
install_cleanup | |
exit 1 | |
fi | |
else | |
echo -e "[${green}Info${plain}] ${mbedtls_file} already installed." | |
fi | |
} | |
install_shadowsocks_libev(){ | |
cd ${cur_dir} | |
tar zxf ${shadowsocks_libev_file}.tar.gz | |
cd ${shadowsocks_libev_file} | |
./configure --disable-documentation && make && make install | |
if [ $? -eq 0 ]; then | |
chmod +x ${shadowsocks_libev_init} | |
local service_name=$(basename ${shadowsocks_libev_init}) | |
if check_sys packageManager yum; then | |
chkconfig --add ${service_name} | |
chkconfig ${service_name} on | |
elif check_sys packageManager apt; then | |
update-rc.d -f ${service_name} defaults | |
fi | |
else | |
echo | |
echo -e "[${red}Error${plain}] shadowsocks-libev install failed." | |
install_cleanup | |
exit 1 | |
fi | |
} | |
install_shadowsocks_libev_cloak(){ | |
if [ "${cloak}" == "y" ] || [ "${cloak}" == "Y" ]; then | |
cd ${cur_dir} | |
mkdir tempgo | |
GOPATH=${cur_dir}/tempgo | |
go get github.com/cbeuw/Cloak | |
go get github.com/juju/ratelimit | |
go get github.com/boltdb/bolt | |
go get github.com/cbeuw/go-ecdh | |
[ -d ./tempgo/src/github.com/cbeuw/Cloak ] && cd tempgo/src/github.com/cbeuw/Cloak || echo -e "[${red}Error:${plain}] Failed to git clone Cloak." | |
make server | |
make install | |
if [ ! "$(command -v ck-server)" ]; then | |
echo -e "[${red}Error${plain}] Cloak for shadowsocks-libev install failed." | |
install_cleanup | |
exit 1 | |
fi | |
fi | |
} | |
install_completed_libev(){ | |
clear | |
ldconfig | |
${shadowsocks_libev_init} start | |
echo | |
echo -e "Congratulations, ${green}shadowsocks-libev${plain} server install completed!" | |
echo -e "Your Server IP : ${red} $(get_ip) ${plain}" | |
echo -e "Your Server Port : ${red} ${shadowsocksport} ${plain}" | |
echo -e "Your Password : ${red} ${shadowsockspwd} ${plain}" | |
echo -e "Your Encryption Method: ${red} ${shadowsockscipher} ${plain}" | |
echo -e "Your Cloak's Public Key: ${red} ${ckpub} ${plain}" | |
echo -e "Your Cloak's Private Key: ${red} ${ckpv} ${plain}" | |
echo -e "Your Cloak's AdminUID: ${red} ${ckauid} ${plain}" | |
} | |
qr_generate_libev(){ | |
if [ "$(command -v qrencode)" ]; then | |
local tmp=$(echo -n "${shadowsockscipher}:${shadowsockspwd}@$(get_ip):${shadowsocksport}" | base64 -w0) | |
local qr_code="ss://${tmp}" | |
echo | |
echo "Your QR Code: (For Shadowsocks Windows, OSX, Android and iOS clients)" | |
echo -e "${green} ${qr_code} ${plain}" | |
echo -n "${qr_code}" | qrencode -s8 -o ${cur_dir}/shadowsocks_libev_qr.png | |
echo "Your QR Code has been saved as a PNG file path:" | |
echo -e "${green} ${cur_dir}/shadowsocks_libev_qr.png ${plain}" | |
fi | |
} | |
install_main(){ | |
install_libsodium | |
if ! ldconfig -p | grep -wq "/usr/lib"; then | |
echo "/usr/lib" > /etc/ld.so.conf.d/lib.conf | |
fi | |
ldconfig | |
install_mbedtls | |
install_shadowsocks_libev | |
install_shadowsocks_libev_cloak | |
install_completed_libev | |
qr_generate_libev | |
echo | |
echo "Enjoy it!" | |
echo | |
} | |
install_cleanup(){ | |
cd ${cur_dir} | |
rm -rf tempgo | |
rm -rf ${libsodium_file} ${libsodium_file}.tar.gz | |
rm -rf ${mbedtls_file} ${mbedtls_file}-gpl.tgz | |
rm -rf ${shadowsocks_libev_file} ${shadowsocks_libev_file}.tar.gz | |
} | |
install_shadowsocks(){ | |
disable_selinux | |
install_select | |
install_prepare | |
install_dependencies | |
download_files | |
if check_sys packageManager yum; then | |
config_firewall | |
fi | |
install_main | |
generate_credentials | |
config_shadowsocks | |
install_cleanup | |
} | |
uninstall_shadowsocks_libev(){ | |
printf "Are you sure uninstall ${red}shadowsocks-libev and Cloak${plain}? [y/n]\n" | |
read -p "(default: n):" answer | |
[ -z ${answer} ] && answer="n" | |
if [ "${answer}" == "y" ] || [ "${answer}" == "Y" ]; then | |
${shadowsocks_libev_init} status > /dev/null 2>&1 | |
if [ $? -eq 0 ]; then | |
${shadowsocks_libev_init} stop | |
fi | |
local service_name=$(basename ${shadowsocks_libev_init}) | |
if check_sys packageManager yum; then | |
chkconfig --del ${service_name} | |
elif check_sys packageManager apt; then | |
update-rc.d -f ${service_name} remove | |
fi | |
rm -fr $(dirname ${shadowsocks_libev_config}) | |
rm -f /usr/local/bin/ss-local | |
rm -f /usr/local/bin/ss-tunnel | |
rm -f /usr/local/bin/ss-server | |
rm -f /usr/local/bin/ss-manager | |
rm -f /usr/local/bin/ss-redir | |
rm -f /usr/local/bin/ss-nat | |
rm -f /usr/local/bin/ck-client | |
rm -f /usr/local/bin/ck-server | |
rm -f /usr/local/lib/libshadowsocks-libev.a | |
rm -f /usr/local/lib/libshadowsocks-libev.la | |
rm -f /usr/local/include/shadowsocks.h | |
rm -f /usr/local/lib/pkgconfig/shadowsocks-libev.pc | |
rm -f /usr/local/share/man/man1/ss-local.1 | |
rm -f /usr/local/share/man/man1/ss-tunnel.1 | |
rm -f /usr/local/share/man/man1/ss-server.1 | |
rm -f /usr/local/share/man/man1/ss-manager.1 | |
rm -f /usr/local/share/man/man1/ss-redir.1 | |
rm -f /usr/local/share/man/man1/ss-nat.1 | |
rm -f /usr/local/share/man/man8/shadowsocks-libev.8 | |
rm -fr /usr/local/share/doc/shadowsocks-libev | |
rm -f ${shadowsocks_libev_init} | |
echo -e "[${green}Info${plain}] shadowsocks-libev uninstall success" | |
else | |
echo | |
echo -e "[${green}Info${plain}] shadowsocks-libev uninstall cancelled, nothing to do..." | |
echo | |
fi | |
} | |
uninstall_shadowsocks(){ | |
if [ -f ${shadowsocks_libev_init} ]; then | |
uninstall_shadowsocks_libev | |
else | |
echo -e "[${red}Error${plain}] shadowsocks-libev not installed, please check it and try again." | |
echo | |
exit 1 | |
fi | |
} | |
# Initialization step | |
action=$1 | |
[ -z $1 ] && action=install | |
case "${action}" in | |
install|uninstall) | |
${action}_shadowsocks | |
;; | |
*) | |
echo "Arguments error! [${action}]" | |
echo "Usage: $(basename $0) [install|uninstall]" | |
;; | |
esac |
sudo apt-get install software-properties-common -y
sudo add-apt-repository ppa:longsleep/golang-backports
sudo apt-get update
sudo apt-get install golang-go
If you're using Ubuntu 16.04 LTS, 18.04 LTS or 18.10, then you can use the longsleep/golang-backports PPA and install Go 1.11
maybe add this to the script, it auto installs go 1.11
// Backports always has the most up to date go language
/bin/bash ../libtool --mode=install /usr/bin/install -c ss-local ss-tunnel ss-server ss-manager ss-redir '/usr/local/bin'
libtool: install: /usr/bin/install -c ss-local /usr/local/bin/ss-local
libtool: install: /usr/bin/install -c ss-tunnel /usr/local/bin/ss-tunnel
libtool: install: /usr/bin/install -c ss-server /usr/local/bin/ss-server
libtool: install: /usr/bin/install -c ss-manager /usr/local/bin/ss-manager
libtool: install: /usr/bin/install -c ss-redir /usr/local/bin/ss-redir
/bin/mkdir -p '/usr/local/bin'
/usr/bin/install -c ss-nat '/usr/local/bin'
/bin/mkdir -p '/usr/local/include'
/usr/bin/install -c -m 644 shadowsocks.h '/usr/local/include'
make[2]: Leaving directory '/shadowsocks-libev-3.2.3/src'
make[1]: Leaving directory '/shadowsocks-libev-3.2.3/src'
make[1]: Entering directory '/shadowsocks-libev-3.2.3'
make[2]: Entering directory '/shadowsocks-libev-3.2.3'
make[2]: Nothing to be done for 'install-exec-am'.
/bin/mkdir -p '/usr/local/lib/pkgconfig'
/usr/bin/install -c -m 644 shadowsocks-libev.pc '/usr/local/lib/pkgconfig'
make[2]: Leaving directory '/shadowsocks-libev-3.2.3'
make[1]: Leaving directory '/shadowsocks-libev-3.2.3'
Cloning into 'Cloak'...
remote: Enumerating objects: 447, done.
remote: Counting objects: 100% (447/447), done.
remote: Compressing objects: 100% (233/233), done.
remote: Total 447 (delta 204), reused 426 (delta 190), pack-reused 0
Receiving objects: 100% (447/447), 85.97 KiB | 10.75 MiB/s, done.
Resolving deltas: 100% (204/204), done.
go build -ldflags "-X main.version=master(6fbd39e)" -o ./build/ck-server ./cmd/ck-server
cmd/ck-server/ck-server.go:17:2: cannot find package "github.com/cbeuw/Cloak/internal/multiplex" in any of:
/usr/lib/go-1.11/src/github.com/cbeuw/Cloak/internal/multiplex (from $GOROOT)
/root/go/src/github.com/cbeuw/Cloak/internal/multiplex (from $GOPATH)
cmd/ck-server/ck-server.go:18:2: cannot find package "github.com/cbeuw/Cloak/internal/server" in any of:
/usr/lib/go-1.11/src/github.com/cbeuw/Cloak/internal/server (from $GOROOT)
/root/go/src/github.com/cbeuw/Cloak/internal/server (from $GOPATH)
cmd/ck-server/ck-server.go:19:2: cannot find package "github.com/cbeuw/Cloak/internal/server/usermanager" in any of:
/usr/lib/go-1.11/src/github.com/cbeuw/Cloak/internal/server/usermanager (from $GOROOT)
/root/go/src/github.com/cbeuw/Cloak/internal/server/usermanager (from $GOPATH)
cmd/ck-server/ck-server.go:20:2: cannot find package "github.com/cbeuw/Cloak/internal/util" in any of:
/usr/lib/go-1.11/src/github.com/cbeuw/Cloak/internal/util (from $GOROOT)
/root/go/src/github.com/cbeuw/Cloak/internal/util (from $GOPATH)
cmd/ck-server/keygen.go:6:2: cannot find package "github.com/cbeuw/go-ecdh" in any of:
/usr/lib/go-1.11/src/github.com/cbeuw/go-ecdh (from $GOROOT)
/root/go/src/github.com/cbeuw/go-ecdh (from $GOPATH)
Makefile:13: recipe for target 'server' failed
make: *** [server] Error 1
mv build/ck-* /usr/local/bin
mv: cannot stat 'build/ck-*': No such file or directory
Makefile:16: recipe for target 'install' failed
make: *** [install] Error 1
[Error] Cloak for shadowsocks-libev install failed.
Change it to
github.com/cbeuw/Cloak/tree/master/internal/util
and so on...
you forgot tree/master
I'll look into the ppa part.
As for the cannot find package issue, I think it's because I used git clone instead of go get, so that the source has not been download to GOPATH. I'll edit it tomorrow
sounds good, looking forward to using this script on my own raspberry pi 3
// please update here once u fix it and ill try the script again, really excited for this
Sorry for the delay, my XPS 15 broke so I had to move to my old desktop :(
So because of how GOPATH works, it's all a bit awkward. What I did is that I made a temp GOPATH folder under the working directory of the script called tempgo and use go get to download all Cloak's dependency here, and in the end that temp folder gets deleted.
Regarding adding a ppa to apt in this script to install an up-to-date version of golang, I don't think that is a good idea because adding a ppa has global effect to the system which is not something everyone wants. Now realistically if the user wants to build both shadowsocks-libev and Cloak from source on their machine, they should be able to figure out how to install golang manually. Most users should just use the released binary instead (which I will produce once I finish most of the TODOs).
Thanks for pointing out the missing dependencies. I have added them.
As for the issue with go not found, I believe it's to do with how the script sets the entire PATH variable, instead of appending to it. I have changed it as well.
It may also be the case that you didn't have go installed. I deliberately missed golang-go off the list of dependencies because the golang version in the apt repos are often outdated (currently it's go1.10, while Cloak may require go1.11), so I'm basically forcing people to download and install golang manually.