#! /bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
#===============================================================================================
#   System Required:  CentOS5.x (32bit/64bit)
#   Description:  Install Shadowsocks(Python) for CentOS
#   Author: rocdk890
#===============================================================================================

clear
echo "#############################################################"
echo "# Install Shadowsocks(Python) for CentOS 5.x (32bit/64bit)"
echo "# Intro: http://blog.slogra.com"
echo "#"
echo "# Author: rocdk890"
echo "#############################################################"
echo ""

# Make sure only root can run our script
function rootness(){
if [[ $EUID -ne 0 ]]; then
   echo "Error:This script must be run as root!" 1>&2
   exit 1
fi
}

# Check OS
function checkos(){
if [ -f /etc/redhat-release ];then
   OS=CentOS
   else
       echo "Not support OS, Please reinstall OS and retry!"
       exit 1
fi
}

# Get version
function getversion(){
    if [[ -s /etc/redhat-release ]];then
        grep -oE  "[0-9.]+" /etc/redhat-release
    else    
        grep -oE  "[0-9.]+" /etc/issue
    fi    
}

# CentOS version
function centosversion(){
    local code=$1
    local version="`getversion`"
    local main_ver=${version%%.*}
    if [ $main_ver == $code ];then
        return 0
    else
        return 1
    fi        
}

# Disable selinux
function 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
}

#Current folder
cur_dir=`pwd`
cd $cur_dir

#download epel
function download_epel(){
if [ -s epel-release-5-4.noarch.rpm ]; then
    echo "epel-release-5-4.noarch.rpm [found]"
  else
    if [ `getconf WORD_BIT` = '32' ] && [ `getconf LONG_BIT` = '64' ] ; then
        wget -c --tries=3 http://mirrors.ustc.edu.cn/fedora/epel/5/x86_64/epel-release-5-4.noarch.rpm
     else
        wget -c --tries=3 http://mirrors.ustc.edu.cn/fedora/epel/5/i386/epel-release-5-4.noarch.rpm
 exit 1
 fi
fi
}

# Pre-installation settings
function pre_install(){
    # Not support CentOS 6
    if centosversion 6; then
        echo "Not support CentOS 6.x, please change to CentOS 5 and try again."
        exit 1
    # Not support CentOS 7    
    elif centosversion 7; then
    	echo "Not support CentOS 7.x, please change to CentOS 5 try again."
    	exit 1
    fi
    #Set shadowsocks config password
    echo "Please input password for shadowsocks:"
    read -p "(Default password: blog.slogra.com):" shadowsockspwd
    if [ "$shadowsockspwd" = "" ]; then
        shadowsockspwd="blog.slogra.com"
    fi
    echo "password:$shadowsockspwd"
    echo "####################################"
    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
    }
    echo ""
    echo "Press any key to start...or Press Ctrl+C to cancel"
    char=`get_char`
    #Install necessary dependencies
    cd $cur_dir
    rpm -ivh epel-release-5-4.noarch.rpm
    yum install -y wget unzip openssl-devel gcc gcc-c++ which python26 python26-devel autoconf libtool libevent automake make curl curl-devel zlib-devel perl pcre pcre-devel cpio expat-devel gettext-devel
    mv /usr/bin/python /usr/bin/python.old
    ln -s /usr/bin/python26 /usr/bin/python
    old_python=`cat /usr/bin/yum |awk 'NR==1'|awk -F "/" '{print $4}'|awk -F "python" '{print $NF}'`
    ls -l /usr/bin/python2.4 >/tmp/t.txt
        python=`cat /root/t.txt |awk '{print $NF}'|awk -F "python" '{print $NF}'`
    if [[ $old_python = $python ]];then
    	rm -f /tmp/t.txt
        echo "The two Pythons are identical !"
    else
        sed -i 's/python/python2.4/g' /usr/bin/yum
        rm -f /tmp/t.txt
        echo "Python has been fixed successfully !"
    fi
    # Get IP address
    echo "Getting Public IP address, Please wait a moment..."
    IP=`curl -s checkip.dyndns.com | cut -d' ' -f 6  | cut -d'<' -f 1`
    if [ $? -ne 0 -o -z $IP ]; then
        IP=`curl -s -4 ipinfo.io | grep "ip" | awk -F\" '{print $4}'`
    fi
    echo -e "Your main public IP is\t\033[32m$IP\033[0m"
    echo ""
    cd $cur_dir
}

# Download files
function download_files(){
    if [ -f setuptools-12.4.zip ]; then
        echo "setuptools-12.4.zip [found]"
    else
        echo "setuptools-12.4.zip not found!!!download now......"
        if ! wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-12.4.zip; then
            echo "Failed to download setuptools-12.4.zip!"
        fi
    fi

    if [ -f pip-6.0.8.tar.gz ]; then
        echo "pip-6.0.8.tar.gz [found]"
    else
        echo "pip-6.0.8.tar.gz not found!!!download now......"
        if ! wget -c --tries=3 http://download.slogra.com/python/pip-6.0.8.tar.gz; then
            echo "Failed to download pip-6.0.8.tar.gz!"
        fi
    fi

    if [ -f swig-3.0.0.tar.gz ]; then
        echo "swig-3.0.0.tar.gz [found]"
    else
        echo "swig-3.0.0.tar.gz not found!!!download now......"
        if ! wget http://jaist.dl.sourceforge.net/project/swig/swig/swig-3.0.0/swig-3.0.0.tar.gz; then
            echo "Failed to download swig-3.0.0.tar.gz!"
        fi
    fi
    # Download shadowsocks chkconfig file
    if ! wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks -O /etc/init.d/shadowsocks; then
        echo "Failed to download shadowsocks chkconfig file!"
    fi
}

#install setuptools
function install_setuptools(){
    if [ ! -f /usr/bin/easy_install ];then
        cd $cur_dir
        unzip setuptools-12.4.zip
        cd $cur_dir/setuptools-12.4
        python setup.py build
        python setup.py install
    else
        echo "setuptools had been installed!"
    fi

    if [ ! -f /usr/local/bin/swig ];then
        cd $cur_dir
        tar zxf swig-3.0.0.tar.gz
        cd $cur_dir/swig-3.0.0
        ./configure
        make
        make install
        ln -s /usr/local/bin/swig /usr/bin/swig
    else
        echo "swig had been installed!"
    fi
}

# Config shadowsocks
function config_shadowsocks(){
    cat > /etc/shadowsocks.json<<-EOF
{
    "server":"0.0.0.0",
    "server_port":8989,
    "local_address": "127.0.0.1",
    "local_port":1080,
    "password":"${shadowsockspwd}",
    "timeout":300,
    "method":"aes-256-cfb",
    "fast_open":false
}
EOF
}

# iptables set
function iptables_set(){
    echo "iptables start setting..."
    /sbin/service iptables status 1>/dev/null 2>&1
    if [ $? -eq 0 ]; then
        /etc/init.d/iptables status | grep '8989' | grep 'ACCEPT' >/dev/null 2>&1
        if [ $? -ne 0 ]; then
            /sbin/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 8989 -j ACCEPT
            /etc/init.d/iptables save
            /etc/init.d/iptables restart
        else
            echo "port 8989 has been set up."
        fi
    else
        echo "iptables looks like shutdown, please manually set it if necessary."
    fi
}

# Install 
function install(){
    which pip > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        #python ez_setup.py install
        /usr/bin/easy_install pip-6.0.8.tar.gz
    fi
    if [ -f /usr/bin/pip ]; then
        pip install M2Crypto
        pip install greenlet
        pip install gevent
        pip install shadowsocks
        if [ -f /usr/bin/ssserver ]; then
            chmod +x /etc/init.d/shadowsocks
            # Add run on system start up
            chkconfig --add shadowsocks
            chkconfig shadowsocks on
            # Run shadowsocks in the background
            /etc/init.d/shadowsocks start
        else
            echo ""
            echo "Shadowsocks install failed!"
            exit 1
        fi
        clear
        echo ""
        echo "Congratulations, shadowsocks install completed!"
        echo -e "Your Server IP: \033[41;37m ${IP} \033[0m"
        echo -e "Your Server Port: \033[41;37m 8989 \033[0m"
        echo -e "Your Password: \033[41;37m ${shadowsockspwd} \033[0m"
        echo -e "Your Local IP: \033[41;37m 127.0.0.1 \033[0m"
        echo -e "Your Local Port: \033[41;37m 1080 \033[0m"
        echo -e "Your Encryption Method: \033[41;37m aes-256-cfb \033[0m"
        echo ""
        echo "Welcome to visit:http://blog.slogra.com"
        echo "Enjoy it!"
        echo ""
        exit 0
    else
        echo ""
        echo "pip install failed!"
        exit 1
    fi
}

# Uninstall Shadowsocks
function uninstall_shadowsocks(){
    printf "Are you sure uninstall Shadowsocks? (y/n) "
    printf "\n"
    read -p "(Default: n):" answer
    if [ -z $answer ]; then
        answer="n"
    fi
    if [ "$answer" = "y" ]; then
        NODE_PID=`ps -ef | grep -v grep | grep -v ps | grep -i '/usr/bin/python /usr/bin/ssserver' | awk '{print $2}'`
        if [ ! -z $NODE_PID ]; then
            for pid in $NODE_PID
            do
                kill -9 $pid
                if [ $? -eq 0 ]; then
                    echo "Shadowsocks process[$pid] has been killed"
                fi
            done
        fi
        chkconfig --del shadowsocks
        # delete config file
        rm -f /etc/shadowsocks.json
        rm -f /var/run/shadowsocks.pid
        rm -f /etc/init.d/shadowsocks
        pip uninstall -y shadowsocks
        if [ $? -eq 0 ]; then
            echo "Shadowsocks uninstall success!"
        else
            echo "Shadowsocks uninstall failed!"
        fi
    else
        echo "uninstall cancelled, Nothing to do"
    fi
}

# Install Shadowsocks-python
function install_shadowsocks(){
    checkos
    rootness
    disable_selinux
    download_epel
    pre_install
    download_files
    install_setuptools
    config_shadowsocks
    iptables_set
    install
}

# Initialization step
action=$1
[  -z $1 ] && action=install
case "$action" in
install)
    install_shadowsocks
    ;;
uninstall)
    uninstall_shadowsocks
    ;;
*)
    echo "Arguments error! [${action} ]"
    echo "Usage: `basename $0` {install|uninstall}"
    ;;
esac
