|
| 1 | +#! /bin/bash |
| 2 | +# chkconfig: 2345 55 25 |
| 3 | +# Description: Startup script for kcp-server on Debian. Place in /etc/init.d and |
| 4 | +# run 'update-rc.d -f kcp-server defaults', or use the appropriate command on your |
| 5 | +# distro. For CentOS/Redhat run: 'chkconfig --add kcp-server' |
| 6 | +#======================================================= |
| 7 | +# System Required: CentOS/Debian/Ubuntu (32bit/64bit) |
| 8 | +# Description: Manager for kcp-server, Written by Clang |
| 9 | +# Author: Clang |
| 10 | +# Intro: http://koolshare.cn/forum-72-1.html |
| 11 | +#======================================================= |
| 12 | +### BEGIN INIT INFO |
| 13 | +# Provides: kcp-server |
| 14 | +# Required-Start: $all |
| 15 | +# Required-Stop: $all |
| 16 | +# Default-Start: 2 3 4 5 |
| 17 | +# Default-Stop: 0 1 6 |
| 18 | +# Short-Description: starts the kcp-server |
| 19 | +# Description: starts kcp-server using start-stop |
| 20 | +### END INIT INFO |
| 21 | + |
| 22 | +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin |
| 23 | +runEnv="socks5" # set "ss" or "socks5",default socks5 |
| 24 | +ProgramName="kcp-server" |
| 25 | +ProgramPath="/usr/local/kcp-server" |
| 26 | +Socks5Name="socks5" |
| 27 | +NAME=kcp-server |
| 28 | +BIN=${ProgramPath}/${NAME} |
| 29 | +SOCKS5BIN=${ProgramPath}/${Socks5Name} |
| 30 | +CONFIGFILE=${ProgramPath}/server-kcptun.json |
| 31 | +LOGFILE=${ProgramPath}/${ProgramName}.log |
| 32 | +SOCKS5LOGFILE=${ProgramPath}/${Socks5Name}.log |
| 33 | +SCRIPTNAME=/etc/init.d/${NAME} |
| 34 | +PID_DIR=/var/run |
| 35 | +PID_FILE=${PID_DIR}/${ProgramName}.pid |
| 36 | +PID_FILE_SOCKS5=${PID_DIR}/${Socks5Name}.pid |
| 37 | +version="2.0" |
| 38 | +RET_VAL=0 |
| 39 | + |
| 40 | +[ -x ${BIN} ] || exit 0 |
| 41 | +[ -x ${SOCKS5BIN} ] || exit 0 |
| 42 | + |
| 43 | +fun_clangcn() |
| 44 | +{ |
| 45 | + echo "" |
| 46 | + echo "+--------------------------------------------------+" |
| 47 | + echo "| Manager for ${NAME}, Written by Clang |" |
| 48 | + echo "+--------------------------------------------------+" |
| 49 | + echo "| Intro: http://koolshare.cn/forum-72-1.html |" |
| 50 | + echo "+--------------------------------------------------+" |
| 51 | + echo "" |
| 52 | +} |
| 53 | + |
| 54 | +fun_check_run(){ |
| 55 | + if netstat -ntupl | grep -q ${NAME};then |
| 56 | + return 0 |
| 57 | + else |
| 58 | + rm -f ${PID_FILE} |
| 59 | + return 1 |
| 60 | + fi |
| 61 | +} |
| 62 | +fun_check_socks5_run(){ |
| 63 | + if netstat -ntupl | grep -q ${Socks5Name};then |
| 64 | + return 0 |
| 65 | + else |
| 66 | + rm -f ${PID_FILE_SOCKS5} |
| 67 | + return 1 |
| 68 | + fi |
| 69 | +} |
| 70 | +fun_load_config(){ |
| 71 | + if [ ! -r ${CONFIGFILE} ]; then |
| 72 | + echo "config file ${CONFIGFILE} not found" |
| 73 | + return 1 |
| 74 | + fi |
| 75 | +} |
| 76 | +fun_start() |
| 77 | +{ |
| 78 | + log_flag="$1" |
| 79 | + if [ "${arg1}" = "start" ]; then |
| 80 | + fun_clangcn |
| 81 | + fi |
| 82 | + if [ ! -d ${PID_DIR} ]; then |
| 83 | + mkdir -p ${PID_DIR} || echo "failed creating PID directory ${PID_DIR}"; exit 1 |
| 84 | + fi |
| 85 | + if [ "${runEnv}" == 'socks5' ]; then |
| 86 | + if fun_check_socks5_run; then |
| 87 | + echo "${Socks5Name} (pid `pidof $Socks5Name`) already running." |
| 88 | + if fun_check_run; then |
| 89 | + echo "${ProgramName} (pid `pidof $NAME`) already running." |
| 90 | + return 0 |
| 91 | + fi |
| 92 | + return 0 |
| 93 | + fi |
| 94 | + fi |
| 95 | + if fun_check_run; then |
| 96 | + echo "${ProgramName} (pid `pidof $NAME`) already running." |
| 97 | + return 0 |
| 98 | + fi |
| 99 | + fun_load_config |
| 100 | + if [ "${runEnv}" == 'socks5' ]; then |
| 101 | + echo -n "Starting ${Socks5Name}..." |
| 102 | + socks5_port=`sed -n '/target/p' ${CONFIGFILE} | sed 's/[[:space:]]*//g;s/,//g;s/\"//g' | cut -d: -f3` |
| 103 | + if [ "${log_flag}" == 'log' ]; then |
| 104 | + ${SOCKS5BIN} 0.0.0.0:${socks5_port} > ${SOCKS5LOGFILE} 2>&1 & |
| 105 | + else |
| 106 | + ${SOCKS5BIN} 0.0.0.0:${socks5_port} >/dev/null 2>&1 & |
| 107 | + fi |
| 108 | + socks5PID=`pidof ${Socks5Name}` |
| 109 | + echo ${socks5PID} > ${PID_FILE_SOCKS5} |
| 110 | + sleep 0.3 |
| 111 | + if ! fun_check_socks5_run; then |
| 112 | + echo "start failed" |
| 113 | + return 1 |
| 114 | + fi |
| 115 | + echo " done" |
| 116 | + fi |
| 117 | + echo -n "Starting ${ProgramName}..." |
| 118 | + if [ "${log_flag}" == 'log' ]; then |
| 119 | + ${BIN} -c ${CONFIGFILE} > ${LOGFILE} 2>&1 & |
| 120 | + else |
| 121 | + ${BIN} -c ${CONFIGFILE} >/dev/null 2>&1 & |
| 122 | + fi |
| 123 | + PID=`pidof ${NAME}` |
| 124 | + echo $PID > $PID_FILE |
| 125 | + sleep 0.3 |
| 126 | + if ! fun_check_run; then |
| 127 | + echo "start failed" |
| 128 | + return 1 |
| 129 | + fi |
| 130 | + echo " done" |
| 131 | + ${BIN} -v |
| 132 | + if [ "${runEnv}" == 'socks5' ]; then |
| 133 | + echo "${Socks5Name} (pid `pidof $Socks5Name`)is running." |
| 134 | + if [ "${log_flag}" == 'log' ]; then |
| 135 | + echo "read ${SOCKS5LOGFILE} for log" |
| 136 | + fi |
| 137 | + fi |
| 138 | + echo "${ProgramName} (pid `pidof $NAME`)is running." |
| 139 | + if [ "${log_flag}" == 'log' ]; then |
| 140 | + echo "read ${LOGFILE} for log" |
| 141 | + fi |
| 142 | + return 0 |
| 143 | +} |
| 144 | + |
| 145 | +fun_stop(){ |
| 146 | + if [ "${arg1}" = "stop" ] || [ "${arg1}" = "restart" ]; then |
| 147 | + fun_clangcn |
| 148 | + fi |
| 149 | + if fun_check_run; then |
| 150 | + echo -n "Stoping ${ProgramName} (pid `pidof $NAME`)... " |
| 151 | + kill `pidof $NAME` |
| 152 | + if [ "$?" != 0 ] ; then |
| 153 | + echo " failed" |
| 154 | + exit 1 |
| 155 | + else |
| 156 | + echo " done" |
| 157 | + rm -f $PID_FILE |
| 158 | + fi |
| 159 | + else |
| 160 | + echo "${ProgramName} is not running." |
| 161 | + fi |
| 162 | + if [ "${runEnv}" == 'socks5' ]; then |
| 163 | + if fun_check_socks5_run; then |
| 164 | + echo -n "Stoping ${Socks5Name} (pid `pidof $Socks5Name`)... " |
| 165 | + kill `pidof $Socks5Name` |
| 166 | + if [ "$?" != 0 ] ; then |
| 167 | + echo " failed" |
| 168 | + exit 1 |
| 169 | + else |
| 170 | + echo " done" |
| 171 | + rm -f $PID_FILE_SOCKS5 |
| 172 | + fi |
| 173 | + else |
| 174 | + echo "${Socks5Name} is not running." |
| 175 | + fi |
| 176 | + fi |
| 177 | +} |
| 178 | +fun_restart(){ |
| 179 | + fun_stop |
| 180 | + fun_start |
| 181 | +} |
| 182 | +fun_status(){ |
| 183 | + if netstat -ntulp | grep -q ${NAME}; then |
| 184 | + PID=`pidof ${NAME}` |
| 185 | + echo "${ProgramName} (pid $PID) is running..." |
| 186 | + netstat -ntulp | grep "${NAME}" |
| 187 | + else |
| 188 | + echo "${ProgramName} is stopped" |
| 189 | + exit 0 |
| 190 | + fi |
| 191 | + echo "" |
| 192 | + if [ "${runEnv}" == 'socks5' ]; then |
| 193 | + if netstat -ntulp | grep -q ${Socks5Name}; then |
| 194 | + socks5PID=`pidof ${Socks5Name}` |
| 195 | + echo "${Socks5Name} (pid $socks5PID) is running..." |
| 196 | + netstat -ntulp | grep "${Socks5Name}" |
| 197 | + else |
| 198 | + echo "${Socks5Name} is stopped" |
| 199 | + exit 0 |
| 200 | + fi |
| 201 | + fi |
| 202 | +} |
| 203 | +checkos(){ |
| 204 | + if grep -Eqi "CentOS" /etc/issue || grep -Eq "CentOS" /etc/*-release; then |
| 205 | + OS=CentOS |
| 206 | + elif grep -Eqi "Debian" /etc/issue || grep -Eq "Debian" /etc/*-release; then |
| 207 | + OS=Debian |
| 208 | + elif grep -Eqi "Ubuntu" /etc/issue || grep -Eq "Ubuntu" /etc/*-release; then |
| 209 | + OS=Ubuntu |
| 210 | + else |
| 211 | + echo "Not support OS, Please reinstall OS and retry!" |
| 212 | + exit 1 |
| 213 | + fi |
| 214 | +} |
| 215 | +fun_config(){ |
| 216 | + if [ -s ${CONFIGFILE} ]; then |
| 217 | + vi ${CONFIGFILE} |
| 218 | + else |
| 219 | + echo "${ProgramName} configuration file not found!" |
| 220 | + fi |
| 221 | +} |
| 222 | +fun_version(){ |
| 223 | + ${BIN} -v |
| 224 | +} |
| 225 | + |
| 226 | +arg1=$1 |
| 227 | +arg2=$2 |
| 228 | +[ -z ${arg1} ] |
| 229 | +case "${arg1}" in |
| 230 | + start|stop|restart|status|config) |
| 231 | + fun_${arg1} ${arg2} |
| 232 | + ;; |
| 233 | + [vV][eE][rR][sS][iI][oO][nN]|-[vV][eE][rR][sS][iI][oO][nN]|--[vV][eE][rR][sS][iI][oO][nN]|-[vV]|--[vV]) |
| 234 | + fun_version |
| 235 | + ;; |
| 236 | + *) |
| 237 | + fun_clangcn |
| 238 | + echo "Usage: $SCRIPTNAME {start|stop|restart|status|config|version}" |
| 239 | + RET_VAL=1 |
| 240 | + ;; |
| 241 | +esac |
| 242 | +exit $RET_VAL |
0 commit comments