Browse Source

refine SS

lj2007331 8 years ago
parent
commit
10a5a3a97b
8 changed files with 396 additions and 403 deletions
  1. 16 5
      addons.sh
  2. 1 1
      config/index_cn.html
  3. 4 4
      init.d/SS-libev-init
  4. 99 0
      init.d/SS-python-init
  5. 0 99
      init.d/Shadowsocks-python-init
  6. 0 293
      shadowsocks.sh
  7. 275 0
      ss.sh
  8. 1 1
      versions.txt

+ 16 - 5
addons.sh

@@ -124,11 +124,8 @@ Install_fail2ban() {
   tar xzf fail2ban-${fail2ban_version}.tar.gz
   pushd fail2ban-${fail2ban_version}
   ${python_install_dir}/bin/python setup.py install
-  /bin/cp /etc/fail2ban/jail.{conf,local}
-  sed -i 's@^# \[sshd\]@[sshd]@' /etc/fail2ban/jail.local
-  sed -i 's@^# enabled = true@enabled = true@' /etc/fail2ban/jail.local
   if [ "${OS}" == "CentOS" ]; then
-    sed -i 's@%(sshd_log)s@/var/log/secure@' /etc/fail2ban/jail.local
+    LOGPATH=/var/log/secure
     /bin/cp files/redhat-initd /etc/init.d/fail2ban 
     sed -i "s@^FAIL2BAN=.*@FAIL2BAN=${python_install_dir}/bin/fail2ban-client@" /etc/init.d/fail2ban
     chmod +x /etc/init.d/fail2ban
@@ -136,12 +133,26 @@ Install_fail2ban() {
     chkconfig fail2ban on
   fi
   if [[ "${OS}" =~ ^Ubuntu$|^Debian$ ]]; then
+    LOGPATH=/var/log/auth.log
     /bin/cp files/debian-initd /etc/init.d/fail2ban 
     sed -i 's@2 3 4 5@3 4 5@' /etc/init.d/fail2ban
     sed -i "s@^DAEMON=.*@DAEMON=${python_install_dir}/bin/\$NAME-client@" /etc/init.d/fail2ban
     chmod +x /etc/init.d/fail2ban
     update-rc.d fail2ban defaults
   fi
+  [ -z "`grep ^Port /etc/ssh/sshd_config`" ] && ssh_port=22 || ssh_port=`grep ^Port /etc/ssh/sshd_config | awk '{print $2}'`
+  cat > /etc/fail2ban/jail.local << EOF
+[DEFAULT]
+ignoreip = 127.0.0.1/8
+bantime  = 86400
+findtime = 600
+maxretry = 5
+[ssh-iptables]
+enabled = true
+filter  = sshd
+action  = iptables[name=SSH, port=$ssh_port, protocol=tcp]
+logpath = $LOGPATH 
+EOF
   cat > /etc/logrotate.d/fail2ban << EOF 
 /var/log/fail2ban.log {
     missingok
@@ -151,7 +162,7 @@ Install_fail2ban() {
     endscript
 }
 EOF
-  kill -9 `ps -ef | grep fail2ban | grep -v grep | awk '{print $2}'`
+  kill -9 `ps -ef | grep fail2ban | grep -v grep | awk '{print $2}'` > /dev/null 2>&1
   /etc/init.d/fail2ban start
   popd
   if [ -e "${python_install_dir}/bin/fail2ban-python" ]; then

+ 1 - 1
config/index_cn.html

@@ -28,7 +28,7 @@ font-family:微软雅黑,sans-serif;
 <p><b>创建 FTP 虚拟账号执行脚本:</b>&nbsp;&nbsp;<font color="#008000">./pureftpd_vhost.sh</font></p>
 <p><b>Github 项目地址:</b>&nbsp;&nbsp;<a target="_blank" class="links" href="https://github.com/lj2007331/oneinstack">https://github.com/lj2007331/oneinstack</a></p>
 <p><b>OneinStack 官网:</b>&nbsp;&nbsp;<a target="_blank" class="links" href="https://oneinstack.com">https://oneinstack.com</a></p>
-<p><b>QQ 群:</b>&nbsp;&nbsp;558540514(付费千人群) 535783209(新)</p>
+<p><b>QQ 群:</b>&nbsp;&nbsp;558540514(付费千人群) 262601796(新)</p>
 <p><b>赞助我们:</b>&nbsp;&nbsp;&nbsp;&nbsp;<a href="https://paypal.me/yeho" target="_blank"><img src="https://img.shields.io/badge/Paypal-donate-green.svg" alt="" /></a> <a href="https://static.oneinstack.com/images/alipay.png" target="_blank"><img src="https://img.shields.io/badge/%E6%94%AF%E4%BB%98%E5%AE%9D-%E5%90%91TA%E6%8D%90%E5%8A%A9-green.svg" alt="" /></a> <a href="https://static.oneinstack.com/images/weixin.png" target="_blank"><img src="https://img.shields.io/badge/%E5%BE%AE%E4%BF%A1-%E5%90%91TA%E6%8D%90%E5%8A%A9-green.svg" /></a></p>
 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Paypal:&nbsp;&nbsp;lj2007331@gmail.com &nbsp;&nbsp;支付宝:&nbsp;&nbsp;lj2007331@gmail.com</p>
 <div align="center"><iframe src="https://static.oneinstack.com/ad_buttom.html" width="475" frameborder="0" scrolling="no"></iframe></div>

+ 4 - 4
init.d/Shadowsocks-libev-init → init.d/SS-libev-init

@@ -1,6 +1,6 @@
 #!/bin/bash
 #
-# Script to run Shadowsocks in daemon mode at boot time.
+# Script to run SS in daemon mode at boot time.
 # ScriptAuthor: icyboy
 # Revision 1.0 - 14th Sep 2013
 #====================================================================
@@ -23,7 +23,7 @@
 [ ${NETWORKING} ="yes" ] || exit 0
 
 # Daemon
-NAME=shadowsocks-server
+NAME=ss-server
 DAEMON=/usr/local/bin/ss-server
 
 # Path to the configuration file.
@@ -60,7 +60,7 @@ PID=/var/run/$NAME/pid
 
 RETVAL=0
 
-# Start shadowsocks as daemon.
+# Start SS as daemon.
 #
 start() {
   if [ -f $LOCK_FILE ]; then
@@ -80,7 +80,7 @@ start() {
 }
 
 
-# Stop shadowsocks.
+# Stop SS. 
 #
 stop() {
   echo -n $"Shutting down ${NAME}: "

+ 99 - 0
init.d/SS-python-init

@@ -0,0 +1,99 @@
+#!/bin/bash
+# Author:  yeho <lj2007331 AT gmail.com>
+# BLOG:  https://blog.linuxeye.com
+### BEGIN INIT INFO
+# Provides:          SS 
+# Required-Start:    $local_fs $remote_fs $network $syslog
+# Required-Start:    $local_fs $remote_fs $network $syslog
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: SS - SS-python starts daemon
+# Description:       SS - lightweight secured scoks5 proxy
+### END INIT INFO
+#
+# chkconfig: - 90 10
+# description: SS start/stop/status/restart script
+
+SS_bin=/usr/local/python/bin/ssserver
+SS_conf=/etc/shadowsocks/config.json
+
+#SS_USAGE is the message if this script is called without any options
+SS_USAGE="Usage: $0 {\e[00;32mstart\e[00m|\e[00;31mstop\e[00m|\e[00;32mstatus\e[00m|\e[00;31mrestart\e[00m}"
+
+#SHUTDOWN_WAIT is wait time in seconds for SS proccess to stop
+SHUTDOWN_WAIT=20
+
+SS_pid(){
+  echo `ps -ef | grep $SS_bin | grep -v grep | tr -s " "|cut -d" " -f2`
+}
+
+start() {
+  pid=$(SS_pid)
+  if [ -n "$pid" ]; then
+    echo -e "\e[00;31mSS is already running (pid: $pid)\e[00m"
+  else
+    $SS_bin -c $SS_conf -d start
+    RETVAL=$?
+    if [ "$RETVAL" = "0" ]; then
+      echo -e "\e[00;32mStarting SS\e[00m"
+    else
+      echo -e "\e[00;32mSS start Failed\e[00m"
+    fi
+    status
+  fi
+  return 0
+}
+
+status(){
+  pid=$(SS_pid)
+  if [ -n "$pid" ]; then
+    echo -e "\e[00;32mSS is running with pid: $pid\e[00m"
+  else
+    echo -e "\e[00;31mSS is not running\e[00m"
+  fi
+}
+
+stop(){
+  pid=$(SS_pid)
+  if [ -n "$pid" ]; then
+    echo -e "\e[00;31mStoping SS\e[00m"
+    $SS_bin -c $SS_conf -d stop
+    let kwait=$SHUTDOWN_WAIT
+    count=0;
+    until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ]
+    do
+      echo -n -e "\e[00;31mwaiting for processes to exit\e[00m\n";
+      sleep 1
+      let count=$count+1;
+    done
+
+    if [ $count -gt $kwait ]; then
+      echo -n -e "\n\e[00;31mkilling processes which didn't stop after $SHUTDOWN_WAIT seconds\e[00m"
+      kill -9 $pid
+    fi
+  else
+    echo -e "\e[00;31mSS is not running\e[00m"
+  fi
+
+  return 0
+}
+
+case $1 in
+  start)
+    start
+    ;;
+  stop)
+    stop
+    ;;
+  restart)
+    stop
+    start
+    ;;
+  status)
+    status
+    ;;
+  *)
+    echo -e $SS_USAGE
+    ;;
+esac
+exit 0

+ 0 - 99
init.d/Shadowsocks-python-init

@@ -1,99 +0,0 @@
-#!/bin/bash
-# Author:  yeho <lj2007331 AT gmail.com>
-# BLOG:  https://blog.linuxeye.com
-### BEGIN INIT INFO
-# Provides:          shadowsocks
-# Required-Start:    $local_fs $remote_fs $network $syslog
-# Required-Start:    $local_fs $remote_fs $network $syslog
-# Default-Start:     2 3 4 5
-# Default-Stop:      0 1 6
-# Short-Description: shadowsocks - Shadowsocks-python starts daemon
-# Description:       shadowsocks - lightweight secured scoks5 proxy
-### END INIT INFO
-#
-# chkconfig: - 90 10
-# description: Shadowsocks start/stop/status/restart script
-
-Shadowsocks_bin=/usr/bin/ssserver
-Shadowsocks_conf=/etc/shadowsocks/config.json
-
-#Shadowsocks_USAGE is the message if this script is called without any options
-Shadowsocks_USAGE="Usage: $0 {\e[00;32mstart\e[00m|\e[00;31mstop\e[00m|\e[00;32mstatus\e[00m|\e[00;31mrestart\e[00m}"
-
-#SHUTDOWN_WAIT is wait time in seconds for shadowsocks proccess to stop
-SHUTDOWN_WAIT=20
-
-Shadowsocks_pid(){
-  echo `ps -ef | grep $Shadowsocks_bin | grep -v grep | tr -s " "|cut -d" " -f2`
-}
-
-start() {
-  pid=$(Shadowsocks_pid)
-  if [ -n "$pid" ]; then
-    echo -e "\e[00;31mShadowsocks is already running (pid: $pid)\e[00m"
-  else
-    $Shadowsocks_bin -c $Shadowsocks_conf -d start
-    RETVAL=$?
-    if [ "$RETVAL" = "0" ]; then
-      echo -e "\e[00;32mStarting Shadowsocks\e[00m"
-    else
-      echo -e "\e[00;32mShadowsocks start Failed\e[00m"
-    fi
-    status
-  fi
-  return 0
-}
-
-status(){
-  pid=$(Shadowsocks_pid)
-  if [ -n "$pid" ]; then
-    echo -e "\e[00;32mShadowsocks is running with pid: $pid\e[00m"
-  else
-    echo -e "\e[00;31mShadowsocks is not running\e[00m"
-  fi
-}
-
-stop(){
-  pid=$(Shadowsocks_pid)
-  if [ -n "$pid" ]; then
-    echo -e "\e[00;31mStoping Shadowsocks\e[00m"
-    $Shadowsocks_bin -c $Shadowsocks_conf -d stop
-    let kwait=$SHUTDOWN_WAIT
-    count=0;
-    until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ]
-    do
-      echo -n -e "\e[00;31mwaiting for processes to exit\e[00m\n";
-      sleep 1
-      let count=$count+1;
-    done
-
-    if [ $count -gt $kwait ]; then
-      echo -n -e "\n\e[00;31mkilling processes which didn't stop after $SHUTDOWN_WAIT seconds\e[00m"
-      kill -9 $pid
-    fi
-  else
-    echo -e "\e[00;31mShadowsocks is not running\e[00m"
-  fi
-
-  return 0
-}
-
-case $1 in
-  start)
-    start
-    ;;
-  stop)
-    stop
-    ;;
-  restart)
-    stop
-    start
-    ;;
-  status)
-    status
-    ;;
-  *)
-    echo -e $Shadowsocks_USAGE
-    ;;
-esac
-exit 0

+ 0 - 293
shadowsocks.sh

@@ -1,293 +0,0 @@
-#!/bin/bash
-# Author:  yeho <lj2007331 AT gmail.com>
-# BLOG:  https://blog.linuxeye.com
-#
-# Notes: OneinStack for CentOS/RadHat 5+ Debian 6+ and Ubuntu 12+
-#        Install Shadowsocks Server
-#
-# Project home page:
-#       https://oneinstack.com
-#       https://github.com/lj2007331/oneinstack
-
-export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
-clear
-printf "
-#######################################################################
-#       OneinStack for CentOS/RadHat 6+ Debian 6+ and Ubuntu 12+      #
-#                   Install Shadowsocks Server                        #
-#       For more information please visit https://oneinstack.com      #
-#######################################################################
-"
-
-pushd src > /dev/null
-. ../options.conf
-. ../include/color.sh
-. ../include/check_os.sh
-. ../include/download.sh
-
-# Check if user is root
-[ $(id -u) != '0' ] && { echo "${CFAILURE}Error: You must be root to run this script${CEND}"; exit 1; }
-
-PUBLIC_IPADDR=$(../include/get_public_ipaddr.py)
-
-[ "${CentOS_RHEL_version}" == '5' ] && { echo "${CWARNING}Shadowsocks only support CentOS6,7 or Debian or Ubuntu! ${CEND}"; exit 1; }
-
-Check_shadowsocks() {
-  [ -f /usr/local/bin/ss-server ] && SS_version=1
-  [ -f /usr/bin/ssserver -o -f /usr/local/bin/ssserver ] && SS_version=2
-}
-
-AddUser_shadowsocks() {
-  while :; do echo
-    read -p "Please input password for shadowsocks: " Shadowsocks_password
-    [ -n "$(echo ${Shadowsocks_password} | grep '[+|&]')" ] && { echo "${CWARNING}input error,not contain a plus sign (+) and & ${CEND}"; continue; }
-    (( ${#Shadowsocks_password} >= 5 )) && break || echo "${CWARNING}Shadowsocks password least 5 characters! ${CEND}"
-  done
-}
-
-Iptables_set() {
-  if [ -e '/etc/sysconfig/iptables' ]; then
-    Shadowsocks_Already_port=$(grep -oE '9[0-9][0-9][0-9]' /etc/sysconfig/iptables | head -n 1)
-  elif [ -e '/etc/iptables.up.rules' ]; then
-    Shadowsocks_Already_port=$(grep -oE '9[0-9][0-9][0-9]' /etc/iptables.up.rules | head -n 1)
-  fi
-
-  if [ -n "${Shadowsocks_Already_port}" ]; then
-    let Shadowsocks_Default_port="${Shadowsocks_Already_port}+1"
-  else
-    Shadowsocks_Default_port=9001
-  fi
-
-  while :; do echo
-    read -p "Please input Shadowsocks port(Default: ${Shadowsocks_Default_port}): " Shadowsocks_port
-    [ -z "${Shadowsocks_port}" ] && Shadowsocks_port=${Shadowsocks_Default_port}
-    if [ ${Shadowsocks_port} -ge 1 >/dev/null 2>&1 -a ${Shadowsocks_port} -le 65535 >/dev/null 2>&1 ]; then
-      [ -z "$(netstat -tpln | grep :${Shadowsocks_port}$)" ] && break || echo "${CWARNING}This port is already used! ${CEND}"
-    else
-      echo "${CWARNING}input error! Input range: 1~65535${CEND}"
-    fi
-  done
-
-  if [ "${OS}" == 'CentOS' ]; then
-    if [ -z "$(grep -E ${Shadowsocks_port} /etc/sysconfig/iptables)" ]; then
-      iptables -I INPUT 4 -p udp -m state --state NEW -m udp --dport ${Shadowsocks_port} -j ACCEPT
-      iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport ${Shadowsocks_port} -j ACCEPT
-      service iptables save
-    fi
-  elif [[ ${OS} =~ ^Ubuntu$|^Debian$ ]]; then
-    if [ -z "$(grep -E ${Shadowsocks_port} /etc/iptables.up.rules)" ]; then
-      iptables -I INPUT 4 -p udp -m state --state NEW -m udp --dport ${Shadowsocks_port} -j ACCEPT
-      iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport ${Shadowsocks_port} -j ACCEPT
-      iptables-save > /etc/iptables.up.rules
-    fi
-  else
-      echo "${CWARNING}This port is already in iptables! ${CEND}"
-  fi
-
-}
-
-Def_parameter() {
-  if [ "${OS}" == "CentOS" ]; then
-    while :; do echo
-      echo "Please select Shadowsocks server version:"
-      echo -e "\t${CMSG}1${CEND}. Install Shadowsocks-libev"
-      echo -e "\t${CMSG}2${CEND}. Install Shadowsocks-python"
-      read -p "Please input a number:(Default 1 press Enter) " SS_version
-      [ -z "${SS_version}" ] && SS_version=1
-      if [[ ! "${SS_version}" =~ ^[1-2]$ ]]; then
-        echo "${CWARNING}input error! Please only input number 1,2${CEND}"
-      else
-        break
-      fi
-    done
-    AddUser_shadowsocks
-    Iptables_set
-    pkgList="wget unzip openssl-devel gcc swig python python-devel python-setuptools autoconf libtool libevent automake make curl curl-devel zlib-devel perl perl-devel cpio expat-devel gettext-devel git asciidoc xmlto pcre-devel"
-    for Package in ${pkgList}; do
-      yum -y install ${Package}
-    done
-  elif [[ "${OS}" =~ ^Ubuntu$|^Debian$ ]]; then
-    SS_version=2
-    AddUser_shadowsocks
-    Iptables_set
-    apt-get -y update
-    pkgList="python-dev python-pip curl wget unzip gcc swig automake make perl cpio git"
-    for Package in ${pkgList}; do
-      apt-get -y install $Package
-    done
-  fi
-}
-
-Install_shadowsocks-python() {
-  src_url=http://mirrors.linuxeye.com/oneinstack/src/ez_setup.py && Download_src
-
-  which pip > /dev/null 2>&1
-  [ $? -ne 0 ] && [ "${OS}" == "CentOS" ] && { python ez_setup.py install; sleep 1; easy_install pip; }
-
-  if [ -f /usr/bin/pip ]; then
-    pip install M2Crypto
-    pip install greenlet
-    pip install gevent
-    pip install shadowsocks
-    if [ -f /usr/bin/ssserver -o -f /usr/local/bin/ssserver ]; then
-      /bin/cp ../init.d/Shadowsocks-python-init /etc/init.d/shadowsocks
-      chmod +x /etc/init.d/shadowsocks
-      [ "${OS}" == "CentOS" ] && { chkconfig --add shadowsocks; chkconfig shadowsocks on; }
-      [[ "${OS}" =~ ^Ubuntu$|^Debian$ ]] && update-rc.d shadowsocks defaults
-      [ ! -e /usr/bin/ssserver -a -e /usr/local/bin/ssserver ] && sed -i 's@Shadowsocks_bin=.*@Shadowsocks_bin=/usr/local/bin/ssserver@' /etc/init.d/shadowsocks
-    else
-      echo
-      echo "${CQUESTION}Shadowsocks-python install failed! Please visit https://oneinstack.com${CEND}"
-      exit 1
-    fi
-  fi
-}
-
-Install_shadowsocks-libev() {
-  git clone https://github.com/shadowsocks/shadowsocks-libev.git
-  pushd shadowsocks-libev
-  ./configure
-  make -j ${THREAD} && make install
-  popd
-  if [ -f  /usr/local/bin/ss-server ]; then
-    /bin/cp ../init.d/Shadowsocks-libev-init /etc/init.d/shadowsocks
-    chmod +x /etc/init.d/shadowsocks
-    [ "${OS}" == "CentOS" ] && { chkconfig --add shadowsocks; chkconfig shadowsocks on; }
-  else
-    echo
-    echo "${CQUESTION}Shadowsocks-libev install failed! Please visit https://oneinstack.com${CEND}"
-    exit 1
-  fi
-
-}
-
-Uninstall_shadowsocks(){
-  while :; do echo
-    read -p "Do you want to uninstall Shadowsocks? [y/n]: " Shadowsocks_yn
-    if [[ ! "${Shadowsocks_yn}" =~ ^[y,n]$ ]]; then
-      echo "${CWARNING}input error! Please only input 'y' or 'n'${CEND}"
-    else
-      break
-    fi
-  done
-
-  if [ "${Shadowsocks_yn}" == 'y' ]; then
-    [ -n "$(ps -ef | grep -v grep | grep -iE "ssserver|ss-server")" ] && /etc/init.d/shadowsocks stop
-    [ "${OS}" == "CentOS" ] && chkconfig --del shadowsocks
-    [[ "${OS}" =~ ^Ubuntu$|^Debian$ ]] && update-rc.d -f shadowsocks remove
-    rm -rf /etc/shadowsocks /var/run/shadowsocks.pid /etc/init.d/shadowsocks
-    if [ "${SS_version}" == '1' ]; then
-      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/lib/libshadowsocks.a
-      rm -f /usr/local/lib/libshadowsocks.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/man8/shadowsocks.8
-      if [ $? -eq 0 ]; then
-        echo "${CSUCCESS}Shadowsocks-libev uninstall successful! ${CEND}"
-      else
-        echo "${CFAILURE}Shadowsocks-libev uninstall failed! ${CEND}"
-      fi
-    elif [ "${SS_version}" == '2' ]; then
-      pip uninstall -y shadowsocks
-      if [ $? -eq 0 ]; then
-        echo "${CSUCCESS}Shadowsocks-python uninstall successful! ${CEND}"
-      else
-        echo "${CFAILURE}Shadowsocks-python uninstall failed! ${CEND}"
-      fi
-    fi
-  else
-    echo "${CMSG}Unknown Shadowsocks version, uninstall failed! ${CEND}"
-  fi
-}
-
-Config_shadowsocks(){
-  [ ! -d "/etc/shadowsocks" ] && mkdir /etc/shadowsocks
-  [ "${SS_version}" == '1' ] && cat > /etc/shadowsocks/config.json << EOF
-{
-    "server":"0.0.0.0",
-    "server_port":${Shadowsocks_port},
-    "local_address":"127.0.0.1",
-    "local_port":1080,
-    "password":"${Shadowsocks_password}",
-    "timeout":300,
-    "method":"aes-256-cfb",
-}
-EOF
-
-  [ "${SS_version}" == '2' ] && cat > /etc/shadowsocks/config.json << EOF
-{
-    "server":"0.0.0.0",
-    "local_address":"127.0.0.1",
-    "local_port":1080,
-    "port_password":{
-    "${Shadowsocks_port}":"${Shadowsocks_password}"
-    },
-    "timeout":300,
-    "method":"aes-256-cfb",
-    "fast_open":false
-}
-EOF
-}
-
-AddUser_Config_shadowsocks(){
-  [ ! -e /etc/shadowsocks/config.json ] && { echo "${CFAILURE}Shadowsocks is not installed! ${CEND}"; exit 1; }
-  [ -z "$(grep \"${Shadowsocks_port}\" /etc/shadowsocks/config.json)" ] && sed -i "s@\"port_password\":{@\"port_password\":{\n\t\"${Shadowsocks_port}\":\"${Shadowsocks_password}\",@" /etc/shadowsocks/config.json || { echo "${CWARNING}This port is already in /etc/shadowsocks/config.json${CEND}"; exit 1; }
-}
-
-Print_User_shadowsocks(){
-  printf "
-Your Server IP: ${CMSG}${PUBLIC_IPADDR}${CEND}
-Your Server Port: ${CMSG}${Shadowsocks_port}${CEND}
-Your Password: ${CMSG}${Shadowsocks_password}${CEND}
-Your Local IP: ${CMSG}127.0.0.1${CEND}
-Your Local Port: ${CMSG}1080${CEND}
-Your Encryption Method: ${CMSG}aes-256-cfb${CEND}
-"
-}
-
-case "$1" in
-install)
-  Def_parameter
-  [ "${SS_version}" == '1' ] && Install_shadowsocks-libev
-  [ "${SS_version}" == '2' ] && Install_shadowsocks-python
-  Config_shadowsocks
-  service shadowsocks start
-  Print_User_shadowsocks
-  ;;
-adduser)
-  Check_shadowsocks
-  if [ "${SS_version}" == '2' ]; then
-    AddUser_shadowsocks
-    Iptables_set
-    AddUser_Config_shadowsocks
-    service shadowsocks restart
-    Print_User_shadowsocks
-  else
-    printf "
-    Sorry, we have no plan to support multi port configuration. Actually you can use multiple instances instead. For example:
-    ss-server -c /etc/shadowsocks/config1.json -f /var/run/shadowsocks-server/pid1
-    ss-server -c /etc/shadowsocks/config2.json -f /var/run/shadowsocks-server/pid2
-    ss-server -c /etc/shadowsocks/config3.json -f /var/run/shadowsocks-server/pid3
-    "
-  fi
-  ;;
-uninstall)
-  Check_shadowsocks
-  Uninstall_shadowsocks
-  ;;
-*)
-  echo
-  echo "Usage: ${CMSG}$0${CEND} { ${CMSG}install${CEND} | ${CMSG}adduser${CEND} | ${CMSG}uninstall${CEND} }"
-  echo
-  exit 1
-esac

+ 275 - 0
ss.sh

@@ -0,0 +1,275 @@
+#!/bin/bash
+# Author:  yeho <lj2007331 AT gmail.com>
+# BLOG:  https://blog.linuxeye.com
+#
+# Notes: OneinStack for CentOS/RadHat 5+ Debian 6+ and Ubuntu 12+
+#        Install SS Server
+#
+# Project home page:
+#       https://oneinstack.com
+#       https://github.com/lj2007331/oneinstack
+
+export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
+clear
+printf "
+#######################################################################
+#       OneinStack for CentOS/RadHat 6+ Debian 6+ and Ubuntu 12+      #
+#                         Install SS Server                           #
+#       For more information please visit https://oneinstack.com      #
+#######################################################################
+"
+
+pushd src > /dev/null
+. ../options.conf
+. ../include/color.sh
+. ../include/check_os.sh
+. ../include/download.sh
+. ../include/python.sh
+
+# Check if user is root
+[ $(id -u) != '0' ] && { echo "${CFAILURE}Error: You must be root to run this script${CEND}"; exit 1; }
+
+PUBLIC_IPADDR=$(../include/get_public_ipaddr.py)
+
+[ "${CentOS_RHEL_version}" == '5' ] && { echo "${CWARNING}SS only support CentOS6,7 or Debian or Ubuntu! ${CEND}"; exit 1; }
+
+Check_SS() {
+  [ -f /usr/local/bin/ss-server ] && SS_version=1
+  [ -f ${python_install_dir}/bin/ssserver ] && SS_version=2
+}
+
+AddUser_SS() {
+  while :; do echo
+    read -p "Please input password for SS: " SS_password
+    [ -n "$(echo ${SS_password} | grep '[+|&]')" ] && { echo "${CWARNING}input error,not contain a plus sign (+) and & ${CEND}"; continue; }
+    (( ${#SS_password} >= 5 )) && break || echo "${CWARNING}SS password least 5 characters! ${CEND}"
+  done
+}
+
+Iptables_set() {
+  if [ -e '/etc/sysconfig/iptables' ]; then
+    SS_Already_port=$(grep -oE '9[0-9][0-9][0-9]' /etc/sysconfig/iptables | head -n 1)
+  elif [ -e '/etc/iptables.up.rules' ]; then
+    SS_Already_port=$(grep -oE '9[0-9][0-9][0-9]' /etc/iptables.up.rules | head -n 1)
+  fi
+
+  if [ -n "${SS_Already_port}" ]; then
+    let SS_Default_port="${SS_Already_port}+1"
+  else
+    SS_Default_port=9001
+  fi
+
+  while :; do echo
+    read -p "Please input SS port(Default: ${SS_Default_port}): " SS_port
+    [ -z "${SS_port}" ] && SS_port=${SS_Default_port}
+    if [ ${SS_port} -ge 1 >/dev/null 2>&1 -a ${SS_port} -le 65535 >/dev/null 2>&1 ]; then
+      [ -z "$(netstat -tpln | grep :${SS_port}$)" ] && break || echo "${CWARNING}This port is already used! ${CEND}"
+    else
+      echo "${CWARNING}input error! Input range: 1~65535${CEND}"
+    fi
+  done
+
+  if [ "${OS}" == 'CentOS' ]; then
+    if [ -z "$(grep -E ${SS_port} /etc/sysconfig/iptables)" ]; then
+      iptables -I INPUT 4 -p udp -m state --state NEW -m udp --dport ${SS_port} -j ACCEPT
+      iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport ${SS_port} -j ACCEPT
+      service iptables save
+    fi
+  elif [[ ${OS} =~ ^Ubuntu$|^Debian$ ]]; then
+    if [ -z "$(grep -E ${SS_port} /etc/iptables.up.rules)" ]; then
+      iptables -I INPUT 4 -p udp -m state --state NEW -m udp --dport ${SS_port} -j ACCEPT
+      iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport ${SS_port} -j ACCEPT
+      iptables-save > /etc/iptables.up.rules
+    fi
+  else
+      echo "${CWARNING}This port is already in iptables! ${CEND}"
+  fi
+
+}
+
+Def_parameter() {
+  if [ "${OS}" == "CentOS" ]; then
+    while :; do echo
+      echo "Please select SS server version:"
+      echo -e "\t${CMSG}1${CEND}. Install SS-libev"
+      echo -e "\t${CMSG}2${CEND}. Install SS-python"
+      read -p "Please input a number:(Default 1 press Enter) " SS_version
+      [ -z "${SS_version}" ] && SS_version=1
+      if [[ ! "${SS_version}" =~ ^[1-2]$ ]]; then
+        echo "${CWARNING}input error! Please only input number 1,2${CEND}"
+      else
+        break
+      fi
+    done
+    AddUser_SS
+    Iptables_set
+    pkgList="wget unzip openssl-devel gcc swig autoconf libtool libevent automake make curl curl-devel zlib-devel perl perl-devel cpio expat-devel gettext-devel git asciidoc xmlto pcre-devel"
+    for Package in ${pkgList}; do
+      yum -y install ${Package}
+    done
+  elif [[ "${OS}" =~ ^Ubuntu$|^Debian$ ]]; then
+    SS_version=2
+    AddUser_SS
+    Iptables_set
+    apt-get -y update
+    pkgList="curl wget unzip gcc swig automake make perl cpio git"
+    for Package in ${pkgList}; do
+      apt-get -y install $Package
+    done
+  fi
+}
+
+Install_SS-python() {
+  [ ! -e "${python_install_dir}/bin/python" ] && Install_Python
+  ${python_install_dir}/bin/pip install M2Crypto
+  ${python_install_dir}/bin/pip install greenlet
+  ${python_install_dir}/bin/pip install gevent
+  ${python_install_dir}/bin/pip install shadowsocks
+  if [ -f ${python_install_dir}/bin/ssserver ]; then 
+    /bin/cp ../init.d/SS-python-init /etc/init.d/shadowsocks
+    chmod +x /etc/init.d/shadowsocks
+    sed -i "s@SS_bin=.*@SS_bin=${python_install_dir}/bin/ssserver@" /etc/init.d/shadowsocks
+    [ "${OS}" == "CentOS" ] && { chkconfig --add shadowsocks; chkconfig shadowsocks on; }
+    [[ "${OS}" =~ ^Ubuntu$|^Debian$ ]] && update-rc.d shadowsocks defaults
+  else
+    echo
+    echo "${CQUESTION}SS-python install failed! Please visit https://oneinstack.com${CEND}"
+    exit 1
+  fi
+}
+
+Install_SS-libev() {
+  git clone https://github.com/shadowsocks/shadowsocks-libev.git
+  pushd shadowsocks-libev
+  ./configure
+  make -j ${THREAD} && make install
+  popd
+  if [ -f /usr/local/bin/ss-server ]; then
+    /bin/cp ../init.d/SS-libev-init /etc/init.d/shadowsocks
+    chmod +x /etc/init.d/shadowsocks
+    [ "${OS}" == "CentOS" ] && { chkconfig --add shadowsocks; chkconfig shadowsocks on; }
+  else
+    echo
+    echo "${CQUESTION}SS-libev install failed! Please visit https://oneinstack.com${CEND}"
+    exit 1
+  fi
+
+}
+
+Uninstall_SS() {
+  while :; do echo
+    read -p "Do you want to uninstall SS? [y/n]: " SS_yn
+    if [[ ! "${SS_yn}" =~ ^[y,n]$ ]]; then
+      echo "${CWARNING}input error! Please only input 'y' or 'n'${CEND}"
+    else
+      break
+    fi
+  done
+
+  if [ "${SS_yn}" == 'y' ]; then
+    [ -n "$(ps -ef | grep -v grep | grep -iE "ssserver|ss-server")" ] && /etc/init.d/shadowsocks stop
+    [ "${OS}" == "CentOS" ] && chkconfig --del shadowsocks
+    [[ "${OS}" =~ ^Ubuntu$|^Debian$ ]] && update-rc.d -f shadowsocks remove
+    rm -rf /etc/shadowsocks /var/run/shadowsocks.pid /etc/init.d/shadowsocks
+    if [ "${SS_version}" == '1' ]; then
+      rm -f /usr/local/bin/{ss-local,ss-tunnel,ss-server,ss-manager,ss-redir}
+      rm -f /usr/local/lib/libshadowsocks.*
+      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,ss-tunnel.1,ss-server.1,ss-manager.1,ss-redir.1,shadowsocks.8}
+      if [ $? -eq 0 ]; then
+        echo "${CSUCCESS}SS-libev uninstall successful! ${CEND}"
+      else
+        echo "${CFAILURE}SS-libev uninstall failed! ${CEND}"
+      fi
+    elif [ "${SS_version}" == '2' ]; then
+      pip uninstall -y shadowsocks
+      if [ $? -eq 0 ]; then
+        echo "${CSUCCESS}SS-python uninstall successful! ${CEND}"
+      else
+        echo "${CFAILURE}SS-python uninstall failed! ${CEND}"
+      fi
+    fi
+  fi
+}
+
+Config_SS() {
+  [ ! -d "/etc/shadowsocks" ] && mkdir /etc/shadowsocks
+  [ "${SS_version}" == '1' ] && cat > /etc/shadowsocks/config.json << EOF
+{
+    "server":"0.0.0.0",
+    "server_port":${SS_port},
+    "local_address":"127.0.0.1",
+    "local_port":1080,
+    "password":"${SS_password}",
+    "timeout":300,
+    "method":"aes-256-cfb",
+}
+EOF
+
+  [ "${SS_version}" == '2' ] && cat > /etc/shadowsocks/config.json << EOF
+{
+    "server":"0.0.0.0",
+    "local_address":"127.0.0.1",
+    "local_port":1080,
+    "port_password":{
+    "${SS_port}":"${SS_password}"
+    },
+    "timeout":300,
+    "method":"aes-256-cfb",
+    "fast_open":false
+}
+EOF
+}
+
+AddUser_Config_SS() {
+  [ ! -e /etc/shadowsocks/config.json ] && { echo "${CFAILURE}SS is not installed! ${CEND}"; exit 1; }
+  [ -z "$(grep \"${SS_port}\" /etc/shadowsocks/config.json)" ] && sed -i "s@\"port_password\":{@\"port_password\":{\n\t\"${SS_port}\":\"${SS_password}\",@" /etc/shadowsocks/config.json || { echo "${CWARNING}This port is already in /etc/shadowsocks/config.json${CEND}"; exit 1; }
+}
+
+Print_User_SS() {
+  printf "
+Your Server IP: ${CMSG}${PUBLIC_IPADDR}${CEND}
+Your Server Port: ${CMSG}${SS_port}${CEND}
+Your Password: ${CMSG}${SS_password}${CEND}
+Your Local IP: ${CMSG}127.0.0.1${CEND}
+Your Local Port: ${CMSG}1080${CEND}
+Your Encryption Method: ${CMSG}aes-256-cfb${CEND}
+"
+}
+
+case "$1" in
+install)
+  Def_parameter
+  [ "${SS_version}" == '1' ] && Install_SS-libev
+  [ "${SS_version}" == '2' ] && Install_SS-python
+  Config_SS
+  service shadowsocks start
+  Print_User_SS
+  ;;
+adduser)
+  Check_SS
+  if [ "${SS_version}" == '2' ]; then
+    AddUser_SS
+    Iptables_set
+    AddUser_Config_SS
+    service shadowsocks restart
+    Print_User_SS
+  else
+    printf "
+    Sorry, we have no plan to support multi port configuration. Actually you can use multiple instances instead. For example:
+    ss-server -c /etc/shadowsocks/config1.json -f /var/run/shadowsocks-server/pid1
+    ss-server -c /etc/shadowsocks/config2.json -f /var/run/shadowsocks-server/pid2
+    "
+  fi
+  ;;
+uninstall)
+  Check_SS
+  Uninstall_SS
+  ;;
+*)
+  echo
+  echo "Usage: ${CMSG}$0${CEND} { ${CMSG}install${CEND} | ${CMSG}adduser${CEND} | ${CMSG}uninstall${CEND} }"
+  echo
+  exit 1
+esac

+ 1 - 1
versions.txt

@@ -70,7 +70,7 @@ redis_pecl_for_php7_version=3.1.1
 redis_pecl_version=2.2.8
 
 # Memcached
-memcached_version=1.4.34
+memcached_version=1.4.35
 libmemcached_version=1.0.18
 memcached_pecl_version=2.2.0
 memcache_pecl_version=3.0.8