forked from FunctionClub/SSR-Bash-Python
-
Notifications
You must be signed in to change notification settings - Fork 0
/
servercheck.sh
297 lines (287 loc) · 10.3 KB
/
servercheck.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#Check Root
[ $(id -u) != "0" ] && { echo "Error: You must be root to run this script"; exit 1; }
#Check OS
if [ -n "$(grep 'Aliyun Linux release' /etc/issue)" -o -e /etc/redhat-release ];then
OS=CentOS
[ -n "$(grep ' 7\.' /etc/redhat-release)" ] && CentOS_RHEL_version=7
[ -n "$(grep ' 6\.' /etc/redhat-release)" -o -n "$(grep 'Aliyun Linux release6 15' /etc/issue)" ] && CentOS_RHEL_version=6
[ -n "$(grep ' 5\.' /etc/redhat-release)" -o -n "$(grep 'Aliyun Linux release5' /etc/issue)" ] && CentOS_RHEL_version=5
elif [ -n "$(grep 'Amazon Linux AMI release' /etc/issue)" -o -e /etc/system-release ];then
OS=CentOS
CentOS_RHEL_version=6
elif [ -n "$(grep bian /etc/issue)" -o "$(lsb_release -is 2>/dev/null)" == 'Debian' ];then
OS=Debian
[ ! -e "$(which lsb_release)" ] && { apt-get -y update; apt-get -y install lsb-release; clear; }
Debian_version=$(lsb_release -sr | awk -F. '{print $1}')
elif [ -n "$(grep Deepin /etc/issue)" -o "$(lsb_release -is 2>/dev/null)" == 'Deepin' ];then
OS=Debian
[ ! -e "$(which lsb_release)" ] && { apt-get -y update; apt-get -y install lsb-release; clear; }
Debian_version=$(lsb_release -sr | awk -F. '{print $1}')
elif [ -n "$(grep Ubuntu /etc/issue)" -o "$(lsb_release -is 2>/dev/null)" == 'Ubuntu' -o -n "$(grep 'Linux Mint' /etc/issue)" ];then
OS=Ubuntu
[ ! -e "$(which lsb_release)" ] && { apt-get -y update; apt-get -y install lsb-release; clear; }
Ubuntu_version=$(lsb_release -sr | awk -F. '{print $1}')
[ -n "$(grep 'Linux Mint 18' /etc/issue)" ] && Ubuntu_version=16
else
echo "Does not support this OS, Please contact the author! "
kill -9 $$
fi
#Define
test_URL="https://google.com"
Timeout="10"
ssr_dir="/usr/local/shadowsocksr"
ssr_local="${ssr_dir}/shadowsocks"
log_file="/usr/local/SSR-Bash-Python/check.log"
uname="test"
uport="1314"
upass=`date +%s | sha256sum | base64 | head -c 32`
um1="chacha20"
ux1="auth_chain_a"
uo1="tls1.2_ticket_auth"
uparam="1"
maxsize="$((1024*1024))"
#Function
mades(){
echo "你是否希望本程序创建一个帐号以供测试使用[Y/N]"
read -n 1 yn
if [[ $yn == [Yy] ]];then
if [[ ${OS} =~ ^Ubuntu$|^Debian$ ]];then
iptables-restore < /etc/iptables.up.rules
clear
iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport $uport -j ACCEPT
iptables -I INPUT -m state --state NEW -m udp -p udp --dport $uport -j ACCEPT
iptables-save > /etc/iptables.up.rules
fi
if [[ ${OS} == CentOS ]];then
if [[ $CentOS_RHEL_version == 7 ]];then
iptables-restore < /etc/iptables.up.rules
iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport $uport -j ACCEPT
iptables -I INPUT -m state --state NEW -m udp -p udp --dport $uport -j ACCEPT
iptables-save > /etc/iptables.up.rules
else
iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport $uport -j ACCEPT
iptables -I INPUT -m state --state NEW -m udp -p udp --dport $uport -j ACCEPT
/etc/init.d/iptables save
/etc/init.d/iptables restart
fi
fi
echo "用户添加成功!用户信息如下:"
cd /usr/local/shadowsocksr
python mujson_mgr.py -a -u $uname -p $uport -k $upass -m $um1 -O $ux1 -o $uo1 -G $uparam
ssrmsg=`python mujson_mgr.py -l -u $uname | tail -n 1 | sed 's/^[ \t]*//g'`
echo "#User add OK!" >> ${log_file}
echo "#The passwd = $upass" >> ${log_file}
echo "#The URL = $ssrmsg" >> ${log_file}
else
echo "如果不创建帐号,本程序将无法使用"
uadd="no"
fi
}
rand(){
min=1000
max=$((2000-$min+1))
num=$(date +%s%N)
echo $(($num%$max+$min))
}
dothetest(){
if [[ ! -e ${log_file} ]];then
echo "配置文件不存在,失败!"
exit 1
fi
nowdate=`date '+%Y-%m-%d %H:%M:%S'`
filesize=`ls -l $log_file | awk '{ print $5 }'`
#email=`cat ${log_file} | head -n 6 | tail -n 1 | awk -F" = " '{ print $2 }'`
echo -e "========== 开始记录测试信息[$(date '+%Y-%m-%d %H:%M:%S')] ==========\n" >> ${log_file}
if [ $filesize -gt $maxsize ];then
echo "日志文件大小已达到上限,开始自动转储!" | tee -a ${log_file}
tar -cjf servercheck"`date +%Y-%m-%d_%H:%M:%S`".tar.bz2 $log_file
logset=`cat ${log_file} | head -n 6`
rm -f ${log_file}
echo "$logset" >> ${log_file}
echo -e "========== 开始记录测试信息[$(date '+%Y-%m-%d %H:%M:%S')] ==========\n" >> ${log_file}
echo "转储完成!"
fi
local_port=$(rand)
passwd=`cat ${log_file} | head -n 2 | tail -n 1 | awk -F" = " '{ print $2 }'`
ip=`cat ${log_file} | head -n 4 | tail -n 1 | awk -F" = " '{ print $2 }'`
nohup python "${ssr_local}/local.py" -b "127.0.0.1" -l "${local_port}" -s "${ip}" -p "${uport}" -k "${passwd}" -m "${um1}" -O "${ux1}" -o "${uo1}" > /dev/null 2>&1 &
sleep 2s
PID=$(ps -ef |grep -v grep | grep "local.py" | grep "${local_port}" | awk '{print $2}')
if [[ -z ${PID} ]]; then
echo "ShadowsocksR客户端 启动失败,无法连接到服务器!" | tee -a ${log_file}
echo "开始重启服务" | tee -a ${log_file}
export SSRcheck=Error
#echo "检测到服务器在${nowdate}有一次异常记录,具体请查看日志:${log_file}" | mutt -s "[Warning]SSR-Bash-Python" ${email}
bash /usr/local/shadowsocksr/stop.sh
bash /usr/local/shadowsocksr/logrun.sh
iptables-restore < /etc/iptables.up.rules
echo "服务已重启!" | tee -a ${log_file}
echo -e "========== 记录测试信息结束[$(date '+%Y-%m-%d %H:%M:%S')] ==========\n\n" >> ${log_file}
sleep 1m
dothetest
else
Test_results=$(curl --socks5 127.0.0.1:${local_port} -k -m ${Timeout} -s "${test_URL}")
if [[ -z ${Test_results} ]];then
echo "第1次连接失败,重试!" | tee -a ${log_file}
sleep 2s
Test_results=$(curl --socks5 127.0.0.1:${local_port} -k -m ${Timeout} -s "${test_URL}")
if [[ -z ${Test_results} ]];then
echo "第2次连接失败,重试!" | tee -a ${log_file}
sleep 2s
Test_results=$(curl --socks5 127.0.0.1:${local_port} -k -m ${Timeout} -s "${test_URL}")
if [[ -z ${Test_results} ]];then
echo "第3次连接失败,开始重启服务" | tee -a ${log_file}
bash /usr/local/shadowsocksr/stop.sh
bash /usr/local/shadowsocksr/logrun.sh
iptables-restore < /etc/iptables.up.rules
echo "服务已重启!" | tee -a ${log_file}
Test_results=$(curl --socks5 127.0.0.1:${local_port} -k -m ${Timeout} -s "${test_URL}")
if [[ -z ${Test_results} ]];then
export SSRcheck=Error
echo "连接失败!" | tee -a ${log_file}
else
echo "连接成功!" | tee -a ${log_file}
fi
#echo "检测到服务器在${nowdate}有一次异常记录,具体请查看日志:${log_file}" | mutt -s "[Warning]SSR-Bash-Python" ${email}
else
echo "连接成功!" | tee -a ${log_file}
fi
else
echo "连接成功!" | tee -a ${log_file}
fi
else
echo "连接成功!" | tee -a ${log_file}
fi
kill -9 ${PID}
PID=$(ps -ef |grep -v grep | grep "local.py" | grep "${local_port}" | awk '{print $2}')
if [[ ! -z ${PID} ]]; then
echo "ShadowsocksR客户端 停止失败,请检查 !" | tee -a ${log_file}
export SSRcheck=Error
#echo "检测到服务器在${nowdate}有一次异常记录,具体请查看日志:${log_file}" | mutt -s "[Warning]SSR-Bash-Python" ${email}
fi
echo -e "========== 记录测试信息结束[$(date '+%Y-%m-%d %H:%M:%S')] ==========\n\n" >> ${log_file}
fi
}
main(){
if [[ ! -e ${log_file} ]];then
mades
if [[ $uadd == no ]];then
exit 1
fi
while :;do echo
echo "请输入每次检测的间隔时间(单位:分){不建议低于10分钟}[默认30]:"
read everytime
if [[ -z ${everytime} ]];then
everytime="30"
break
elif [[ ! ${everytime} =~ ^(-?|\+?)[0-9]+(\.?[0-9]+)?$ ]];then
echo "请输入正确的数字"
else
break
fi
done
while :;do echo
echo "请输入服务器的IP(不知道的话查一下,不支持域名输入):"
read ip
regex="\b(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])\b"
ckStep2=`echo $ip | egrep $regex | wc -l`
if [[ $ckStep2 -eq 0 ]];then
echo "无效的ip地址"
else
break
fi
done
#while :;do echo
#echo "请输入你的邮箱,用于故障通知:"
#read yourmail
#str=`echo $yourmail | gawk '/^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/{print $0}'`
#if [[ -z $str ]];then
# echo "无效的邮箱地址"
#else
# break
#fi
#done
echo "#The IP = $ip" >> ${log_file}
echo "#The Time = ${everytime}m" >> ${log_file}
#echo "#Your email = ${str}" >> ${log_file}
echo "#############################################" >> ${log_file}
if [[ ${values} == 1 ]];then
dothetest
fi
else
thetime=`cat ${log_file} | head -n 5 | tail -n 1 | awk -F" = " '{ print $2 }'`
if [[ -z ${thetime} ]];then
rm -f ${log_file}
main
exit 1
fi
dothetest
sleep ${thetime}
fi
}
runloop(){
while :
do
if [[ -e ${log_file} ]];then
main
else
echo "尚未配置,退出"
break
fi
done
}
#Main
if [[ $1 == "" ]];then
echo "Power BY Stack GitHub:https://github.com/readour"
echo "========================================="
echo -e "You can running\e[32;49m servercheck.sh conf \e[0mto configure the program.\nAfter they run you should run\e[32;49m nohup servercheck.sh run & \e[0mto hang up it."
echo -e "If you want to stop running this program.You should running \e[32;49m servercheck.sh stop \e[0m to stop it."
fi
if [[ $1 == stop ]];then
thetime=`cat ${log_file} | head -n 5 | tail -n 1 | awk -F" = " '{ print $2 }'`
PID=$(ps -ef |grep -v grep | grep "bash" | grep "servercheck.sh" | grep "run" | awk '{print $2}')
if [[ -z ${PID} ]];then
echo "进程不存在,程序未运行或者已经结束"
else
kill -9 ${PID}
PID=$(ps -ef |grep -v grep | grep "bash" | grep "servercheck.sh" | grep "run" | awk '{print $2}')
if [[ -z ${PID} ]];then
echo "程序已经停止工作"
else
echo "结束失败"
fi
fi
fi
if [[ $1 == hide ]];then
values="1"
nohup bash ${pwd}/servercheck.sh run &
fi
if [[ $1 == run ]];then
values="1"
runloop
fi
if [[ $1 == conf ]];then
main
fi
if [[ $1 == reconf ]];then
rm -f ${log_file}
cd /usr/local/shadowsocksr
python mujson_mgr.py -d -u $uname
cd ${pwd}
main
fi
if [[ $1 == log ]];then
cat ${log_file}
exit 0
fi
if [[ $1 == test ]];then
PID=$(ps -ef |grep -v grep | grep "local.py" | grep "${local_port}" | awk '{print $2}')
if [[ -z ${PID} ]];then
dothetest
else
sleep 5s
dothetest
fi
fi