status.sh 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107
  1. #!/usr/bin/env bash
  2. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  3. export PATH
  4. #=================================================
  5. # System Required: CentOS/Debian/Ubuntu
  6. # Description: ServerStatus client + server
  7. # Version: 1.0.15
  8. # Author: Toyo
  9. # Blog: https://doub.io/shell-jc3/
  10. #=================================================
  11. sh_ver="1.0.15"
  12. filepath=$(cd "$(dirname "$0")"; pwd)
  13. file_1=$(echo -e "${filepath}"|awk -F "$0" '{print $1}')
  14. file="/usr/local/ServerStatus"
  15. web_file="/usr/local/ServerStatus/web"
  16. server_file="/usr/local/ServerStatus/server"
  17. server_conf="/usr/local/ServerStatus/server/config.json"
  18. server_conf_1="/usr/local/ServerStatus/server/config.conf"
  19. client_file="/usr/local/ServerStatus/client"
  20. client_log_file="/tmp/serverstatus_client.log"
  21. server_log_file="/tmp/serverstatus_server.log"
  22. jq_file="${file}/jq"
  23. Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m"
  24. Info="${Green_font_prefix}[信息]${Font_color_suffix}"
  25. Error="${Red_font_prefix}[错误]${Font_color_suffix}"
  26. Tip="${Green_font_prefix}[注意]${Font_color_suffix}"
  27. #检查系统
  28. check_sys(){
  29. if [[ -f /etc/redhat-release ]]; then
  30. release="centos"
  31. elif cat /etc/issue | grep -q -E -i "debian"; then
  32. release="debian"
  33. elif cat /etc/issue | grep -q -E -i "ubuntu"; then
  34. release="ubuntu"
  35. elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then
  36. release="centos"
  37. elif cat /proc/version | grep -q -E -i "debian"; then
  38. release="debian"
  39. elif cat /proc/version | grep -q -E -i "ubuntu"; then
  40. release="ubuntu"
  41. elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then
  42. release="centos"
  43. fi
  44. bit=`uname -m`
  45. }
  46. check_installed_server_status(){
  47. [[ ! -e "${server_file}/sergate" ]] && echo -e "${Error} ServerStatus 服务端没有安装,请检查 !" && exit 1
  48. }
  49. check_installed_client_status(){
  50. if [[ ! -e "${client_file}/status-client.py" ]]; then
  51. if [[ ! -e "${file}/status-client.py" ]]; then
  52. echo -e "${Error} ServerStatus 客户端没有安装,请检查 !" && exit 1
  53. fi
  54. fi
  55. }
  56. check_pid_server(){
  57. PID=`ps -ef| grep "sergate"| grep -v grep| grep -v ".sh"| grep -v "init.d"| grep -v "service"| awk '{print $2}'`
  58. }
  59. check_pid_client(){
  60. PID=`ps -ef| grep "status-client.py"| grep -v grep| grep -v ".sh"| grep -v "init.d"| grep -v "service"| awk '{print $2}'`
  61. }
  62. Download_Server_Status_server(){
  63. cd "/tmp"
  64. wget -N --no-check-certificate "https://github.com/ToyoDAdoubi/ServerStatus-Toyo/archive/master.zip"
  65. [[ ! -e "master.zip" ]] && echo -e "${Error} ServerStatus 服务端下载失败 !" && exit 1
  66. unzip master.zip
  67. rm -rf master.zip
  68. [[ ! -e "/tmp/ServerStatus-Toyo-master" ]] && echo -e "${Error} ServerStatus 服务端解压失败 !" && exit 1
  69. cd "/tmp/ServerStatus-Toyo-master/server"
  70. make
  71. [[ ! -e "sergate" ]] && echo -e "${Error} ServerStatus 服务端编译失败 !" && cd "${file_1}" && rm -rf "/tmp/ServerStatus-Toyo-master" && exit 1
  72. cd "${file_1}"
  73. [[ ! -e "${file}" ]] && mkdir "${file}"
  74. if [[ ! -e "${server_file}" ]]; then
  75. mkdir "${server_file}"
  76. mv "/tmp/ServerStatus-Toyo-master/server/sergate" "${server_file}/sergate"
  77. mv "/tmp/ServerStatus-Toyo-master/web" "${web_file}"
  78. else
  79. if [[ -e "${server_file}/sergate" ]]; then
  80. mv "${server_file}/sergate" "${server_file}/sergate1"
  81. mv "/tmp/ServerStatus-Toyo-master/server/sergate" "${server_file}/sergate"
  82. else
  83. mv "/tmp/ServerStatus-Toyo-master/server/sergate" "${server_file}/sergate"
  84. mv "/tmp/ServerStatus-Toyo-master/web" "${web_file}"
  85. fi
  86. fi
  87. if [[ ! -e "${server_file}/sergate" ]]; then
  88. echo -e "${Error} ServerStatus 服务端移动重命名失败 !"
  89. [[ -e "${server_file}/sergate1" ]] && mv "${server_file}/sergate1" "${server_file}/sergate"
  90. rm -rf "/tmp/ServerStatus-Toyo-master"
  91. exit 1
  92. else
  93. [[ -e "${server_file}/sergate1" ]] && rm -rf "${server_file}/sergate1"
  94. rm -rf "/tmp/ServerStatus-Toyo-master"
  95. fi
  96. }
  97. Download_Server_Status_client(){
  98. cd "/tmp"
  99. wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubi/ServerStatus-Toyo/master/clients/status-client.py"
  100. [[ ! -e "status-client.py" ]] && echo -e "${Error} ServerStatus 客户端下载失败 !" && exit 1
  101. cd "${file_1}"
  102. [[ ! -e "${file}" ]] && mkdir "${file}"
  103. if [[ ! -e "${client_file}" ]]; then
  104. mkdir "${client_file}"
  105. mv "/tmp/status-client.py" "${client_file}/status-client.py"
  106. else
  107. if [[ -e "${client_file}/status-client.py" ]]; then
  108. mv "${client_file}/status-client.py" "${client_file}/status-client1.py"
  109. mv "/tmp/status-client.py" "${client_file}/status-client.py"
  110. else
  111. mv "/tmp/status-client.py" "${client_file}/status-client.py"
  112. fi
  113. fi
  114. if [[ ! -e "${client_file}/status-client.py" ]]; then
  115. echo -e "${Error} ServerStatus 客户端移动失败 !"
  116. [[ -e "${client_file}/status-client1.py" ]] && mv "${client_file}/status-client1.py" "${client_file}/status-client.py"
  117. rm -rf "/tmp/status-client.py"
  118. exit 1
  119. else
  120. [[ -e "${client_file}/status-client1.py" ]] && rm -rf "${client_file}/status-client1.py"
  121. rm -rf "/tmp/status-client.py"
  122. fi
  123. }
  124. Service_Server_Status_server(){
  125. if [[ ${release} = "centos" ]]; then
  126. if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/service/server_status_server_centos" -O /etc/init.d/status-server; then
  127. echo -e "${Error} ServerStatus 服务端服务管理脚本下载失败 !" && exit 1
  128. fi
  129. chmod +x /etc/init.d/status-server
  130. chkconfig --add status-server
  131. chkconfig status-server on
  132. else
  133. if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/service/server_status_server_debian" -O /etc/init.d/status-server; then
  134. echo -e "${Error} ServerStatus 服务端服务管理脚本下载失败 !" && exit 1
  135. fi
  136. chmod +x /etc/init.d/status-server
  137. update-rc.d -f status-server defaults
  138. fi
  139. echo -e "${Info} ServerStatus 服务端服务管理脚本下载完成 !"
  140. }
  141. Service_Server_Status_client(){
  142. if [[ ${release} = "centos" ]]; then
  143. if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/service/server_status_client_centos" -O /etc/init.d/status-client; then
  144. echo -e "${Error} ServerStatus 客户端服务管理脚本下载失败 !" && exit 1
  145. fi
  146. chmod +x /etc/init.d/status-client
  147. chkconfig --add status-client
  148. chkconfig status-client on
  149. else
  150. if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/service/server_status_client_debian" -O /etc/init.d/status-client; then
  151. echo -e "${Error} ServerStatus 客户端服务管理脚本下载失败 !" && exit 1
  152. fi
  153. chmod +x /etc/init.d/status-client
  154. update-rc.d -f status-client defaults
  155. fi
  156. echo -e "${Info} ServerStatus 客户端服务管理脚本下载完成 !"
  157. }
  158. Installation_dependency(){
  159. mode=$1
  160. [[ -z ${mode} ]] && mode="server"
  161. if [[ ${mode} == "server" ]]; then
  162. python_status=$(python --help)
  163. if [[ ${release} == "centos" ]]; then
  164. yum update
  165. if [[ -z ${python_status} ]]; then
  166. yum install -y python unzip vim make
  167. yum groupinstall "Development Tools" -y
  168. else
  169. yum install -y unzip vim make
  170. yum groupinstall "Development Tools" -y
  171. fi
  172. else
  173. apt-get update
  174. if [[ -z ${python_status} ]]; then
  175. apt-get install -y python unzip vim build-essential make
  176. else
  177. apt-get install -y unzip vim build-essential make
  178. fi
  179. fi
  180. else
  181. python_status=$(python --help)
  182. if [[ ${release} == "centos" ]]; then
  183. if [[ -z ${python_status} ]]; then
  184. yum update
  185. yum install -y python
  186. fi
  187. else
  188. if [[ -z ${python_status} ]]; then
  189. apt-get update
  190. apt-get install -y python
  191. fi
  192. fi
  193. fi
  194. }
  195. Write_server_config(){
  196. cat > ${server_conf}<<-EOF
  197. {"servers":
  198. [
  199. {
  200. "username": "username01",
  201. "password": "password",
  202. "name": "Server 01",
  203. "type": "KVM",
  204. "host": "",
  205. "location": "Hong Kong",
  206. "disabled": false
  207. }
  208. ]
  209. }
  210. EOF
  211. }
  212. Write_server_config_conf(){
  213. cat > ${server_conf_1}<<-EOF
  214. PORT = ${server_port_s}
  215. EOF
  216. }
  217. Read_config_client(){
  218. if [[ ! -e "${client_file}/status-client.py" ]]; then
  219. if [[ ! -e "${file}/status-client.py" ]]; then
  220. echo -e "${Error} ServerStatus 客户端文件不存在 !" && exit 1
  221. else
  222. client_text="$(cat "${file}/status-client.py"|sed 's/\"//g;s/,//g;s/ //g')"
  223. rm -rf "${file}/status-client.py"
  224. fi
  225. else
  226. client_text="$(cat "${client_file}/status-client.py"|sed 's/\"//g;s/,//g;s/ //g')"
  227. fi
  228. client_server="$(echo -e "${client_text}"|grep "SERVER="|awk -F "=" '{print $2}')"
  229. client_port="$(echo -e "${client_text}"|grep "PORT="|awk -F "=" '{print $2}')"
  230. client_user="$(echo -e "${client_text}"|grep "USER="|awk -F "=" '{print $2}')"
  231. client_password="$(echo -e "${client_text}"|grep "PASSWORD="|awk -F "=" '{print $2}')"
  232. }
  233. Read_config_server(){
  234. if [[ ! -e "${server_conf_1}" ]]; then
  235. server_port_s="35601"
  236. Write_server_config_conf
  237. server_port="35601"
  238. else
  239. server_port="$(cat "${server_conf_1}"|grep "PORT = "|awk '{print $3}')"
  240. fi
  241. }
  242. Set_server(){
  243. mode=$1
  244. [[ -z ${mode} ]] && mode="server"
  245. if [[ ${mode} == "server" ]]; then
  246. echo -e "请输入 ServerStatus 服务端中网站要设置的 域名[server]
  247. 默认为本机IP为域名,例如输入: toyoo.pw ,如果要使用本机IP,请留空直接回车"
  248. read -e -p "(默认: 本机IP):" server_s
  249. [[ -z "$server_s" ]] && server_s=""
  250. else
  251. echo -e "请输入 ServerStatus 服务端的 IP/域名[server]"
  252. read -e -p "(默认: 127.0.0.1):" server_s
  253. [[ -z "$server_s" ]] && server_s="127.0.0.1"
  254. fi
  255. echo && echo " ================================================"
  256. echo -e " IP/域名[server]: ${Red_background_prefix} ${server_s} ${Font_color_suffix}"
  257. echo " ================================================" && echo
  258. }
  259. Set_server_http_port(){
  260. while true
  261. do
  262. echo -e "请输入 ServerStatus 服务端中网站要设置的 域名/IP的端口[1-65535](如果是域名的话,一般用 80 端口)"
  263. read -e -p "(默认: 8888):" server_http_port_s
  264. [[ -z "$server_http_port_s" ]] && server_http_port_s="8888"
  265. echo $((${server_http_port_s}+0)) &>/dev/null
  266. if [[ $? -eq 0 ]]; then
  267. if [[ ${server_http_port_s} -ge 1 ]] && [[ ${server_http_port_s} -le 65535 ]]; then
  268. echo && echo " ================================================"
  269. echo -e " 端口: ${Red_background_prefix} ${server_http_port_s} ${Font_color_suffix}"
  270. echo " ================================================" && echo
  271. break
  272. else
  273. echo "输入错误, 请输入正确的端口。"
  274. fi
  275. else
  276. echo "输入错误, 请输入正确的端口。"
  277. fi
  278. done
  279. }
  280. Set_server_port(){
  281. while true
  282. do
  283. echo -e "请输入 ServerStatus 服务端监听的端口[1-65535](用于服务端接收客户端消息的端口,客户端要填写这个端口)"
  284. read -e -p "(默认: 35601):" server_port_s
  285. [[ -z "$server_port_s" ]] && server_port_s="35601"
  286. echo $((${server_port_s}+0)) &>/dev/null
  287. if [[ $? -eq 0 ]]; then
  288. if [[ ${server_port_s} -ge 1 ]] && [[ ${server_port_s} -le 65535 ]]; then
  289. echo && echo " ================================================"
  290. echo -e " 端口: ${Red_background_prefix} ${server_port_s} ${Font_color_suffix}"
  291. echo " ================================================" && echo
  292. break
  293. else
  294. echo "输入错误, 请输入正确的端口。"
  295. fi
  296. else
  297. echo "输入错误, 请输入正确的端口。"
  298. fi
  299. done
  300. }
  301. Set_username(){
  302. mode=$1
  303. [[ -z ${mode} ]] && mode="server"
  304. if [[ ${mode} == "server" ]]; then
  305. echo -e "请输入 ServerStatus 服务端要设置的用户名[username](字母/数字,不可与其他账号重复)"
  306. else
  307. echo -e "请输入 ServerStatus 服务端中对应配置的用户名[username](字母/数字,不可与其他账号重复)"
  308. fi
  309. read -e -p "(默认: 取消):" username_s
  310. [[ -z "$username_s" ]] && echo "已取消..." && exit 0
  311. echo && echo " ================================================"
  312. echo -e " 账号[username]: ${Red_background_prefix} ${username_s} ${Font_color_suffix}"
  313. echo " ================================================" && echo
  314. }
  315. Set_password(){
  316. mode=$1
  317. [[ -z ${mode} ]] && mode="server"
  318. if [[ ${mode} == "server" ]]; then
  319. echo -e "请输入 ServerStatus 服务端要设置的密码[password](字母/数字,可重复)"
  320. else
  321. echo -e "请输入 ServerStatus 服务端中对应配置的密码[password](字母/数字)"
  322. fi
  323. read -e -p "(默认: doub.io):" password_s
  324. [[ -z "$password_s" ]] && password_s="doub.io"
  325. echo && echo " ================================================"
  326. echo -e " 密码[password]: ${Red_background_prefix} ${password_s} ${Font_color_suffix}"
  327. echo " ================================================" && echo
  328. }
  329. Set_name(){
  330. echo -e "请输入 ServerStatus 服务端要设置的节点名称[name](支持中文,前提是你的系统和SSH工具支持中文输入,仅仅是个名字)"
  331. read -e -p "(默认: Server 01):" name_s
  332. [[ -z "$name_s" ]] && name_s="Server 01"
  333. echo && echo " ================================================"
  334. echo -e " 节点名称[name]: ${Red_background_prefix} ${name_s} ${Font_color_suffix}"
  335. echo " ================================================" && echo
  336. }
  337. Set_type(){
  338. echo -e "请输入 ServerStatus 服务端要设置的节点虚拟化类型[type](例如 OpenVZ / KVM)"
  339. read -e -p "(默认: KVM):" type_s
  340. [[ -z "$type_s" ]] && type_s="KVM"
  341. echo && echo " ================================================"
  342. echo -e " 虚拟化类型[type]: ${Red_background_prefix} ${type_s} ${Font_color_suffix}"
  343. echo " ================================================" && echo
  344. }
  345. Set_location(){
  346. echo -e "请输入 ServerStatus 服务端要设置的节点位置[location](支持中文,前提是你的系统和SSH工具支持中文输入)"
  347. read -e -p "(默认: Hong Kong):" location_s
  348. [[ -z "$location_s" ]] && location_s="Hong Kong"
  349. echo && echo " ================================================"
  350. echo -e " 节点位置[location]: ${Red_background_prefix} ${location_s} ${Font_color_suffix}"
  351. echo " ================================================" && echo
  352. }
  353. Set_config_server(){
  354. Set_username "server"
  355. Set_password "server"
  356. Set_name
  357. Set_type
  358. Set_location
  359. }
  360. Set_config_client(){
  361. Set_server "client"
  362. Set_server_port
  363. Set_username "client"
  364. Set_password "client"
  365. }
  366. Set_ServerStatus_server(){
  367. check_installed_server_status
  368. echo && echo -e " 你要做什么?
  369. ${Green_font_prefix} 1.${Font_color_suffix} 添加 节点配置
  370. ${Green_font_prefix} 2.${Font_color_suffix} 删除 节点配置
  371. ————————
  372. ${Green_font_prefix} 3.${Font_color_suffix} 修改 节点配置 - 节点用户名
  373. ${Green_font_prefix} 4.${Font_color_suffix} 修改 节点配置 - 节点密码
  374. ${Green_font_prefix} 5.${Font_color_suffix} 修改 节点配置 - 节点名称
  375. ${Green_font_prefix} 6.${Font_color_suffix} 修改 节点配置 - 节点虚拟化
  376. ${Green_font_prefix} 7.${Font_color_suffix} 修改 节点配置 - 节点位置
  377. ${Green_font_prefix} 8.${Font_color_suffix} 修改 节点配置 - 全部参数
  378. ————————
  379. ${Green_font_prefix} 9.${Font_color_suffix} 启用/禁用 节点配置
  380. ————————
  381. ${Green_font_prefix}10.${Font_color_suffix} 修改 服务端监听端口" && echo
  382. read -e -p "(默认: 取消):" server_num
  383. [[ -z "${server_num}" ]] && echo "已取消..." && exit 1
  384. if [[ ${server_num} == "1" ]]; then
  385. Add_ServerStatus_server
  386. elif [[ ${server_num} == "2" ]]; then
  387. Del_ServerStatus_server
  388. elif [[ ${server_num} == "3" ]]; then
  389. Modify_ServerStatus_server_username
  390. elif [[ ${server_num} == "4" ]]; then
  391. Modify_ServerStatus_server_password
  392. elif [[ ${server_num} == "5" ]]; then
  393. Modify_ServerStatus_server_name
  394. elif [[ ${server_num} == "6" ]]; then
  395. Modify_ServerStatus_server_type
  396. elif [[ ${server_num} == "7" ]]; then
  397. Modify_ServerStatus_server_location
  398. elif [[ ${server_num} == "8" ]]; then
  399. Modify_ServerStatus_server_all
  400. elif [[ ${server_num} == "9" ]]; then
  401. Modify_ServerStatus_server_disabled
  402. elif [[ ${server_num} == "10" ]]; then
  403. Read_config_server
  404. Del_iptables "${server_port}"
  405. Set_server_port
  406. Write_server_config_conf
  407. Add_iptables "${server_port_s}"
  408. else
  409. echo -e "${Error} 请输入正确的数字[1-10]" && exit 1
  410. fi
  411. Restart_ServerStatus_server
  412. }
  413. List_ServerStatus_server(){
  414. conf_text=$(${jq_file} '.servers' ${server_conf}|${jq_file} ".[]|.username"|sed 's/\"//g')
  415. conf_text_total=$(echo -e "${conf_text}"|wc -l)
  416. [[ ${conf_text_total} = "0" ]] && echo -e "${Error} 没有发现 一个节点配置,请检查 !" && exit 1
  417. conf_text_total_a=$(echo $((${conf_text_total}-1)))
  418. conf_list_all=""
  419. for((integer = 0; integer <= ${conf_text_total_a}; integer++))
  420. do
  421. now_text=$(${jq_file} '.servers' ${server_conf}|${jq_file} ".[${integer}]"|sed 's/\"//g;s/,$//g'|sed '$d;1d')
  422. now_text_username=$(echo -e "${now_text}"|grep "username"|awk -F ": " '{print $2}')
  423. now_text_password=$(echo -e "${now_text}"|grep "password"|awk -F ": " '{print $2}')
  424. now_text_name=$(echo -e "${now_text}"|grep "name"|grep -v "username"|awk -F ": " '{print $2}')
  425. now_text_type=$(echo -e "${now_text}"|grep "type"|awk -F ": " '{print $2}')
  426. now_text_location=$(echo -e "${now_text}"|grep "location"|awk -F ": " '{print $2}')
  427. now_text_disabled=$(echo -e "${now_text}"|grep "disabled"|awk -F ": " '{print $2}')
  428. if [[ ${now_text_disabled} == "false" ]]; then
  429. now_text_disabled_status="${Green_font_prefix}启用${Font_color_suffix}"
  430. else
  431. now_text_disabled_status="${Red_font_prefix}禁用${Font_color_suffix}"
  432. fi
  433. conf_list_all=${conf_list_all}"用户名: ${Green_font_prefix}"${now_text_username}"${Font_color_suffix} 密码: ${Green_font_prefix}"${now_text_password}"${Font_color_suffix} 节点名: ${Green_font_prefix}"${now_text_name}"${Font_color_suffix} 类型: ${Green_font_prefix}"${now_text_type}"${Font_color_suffix} 位置: ${Green_font_prefix}"${now_text_location}"${Font_color_suffix} 状态: ${Green_font_prefix}"${now_text_disabled_status}"${Font_color_suffix}\n"
  434. done
  435. echo && echo -e "节点总数 ${Green_font_prefix}"${conf_text_total}"${Font_color_suffix}"
  436. echo -e ${conf_list_all}
  437. }
  438. Add_ServerStatus_server(){
  439. Set_config_server
  440. Set_username_ch=$(cat ${server_conf}|grep '"username": "'"${username_s}"'"')
  441. [[ ! -z "${Set_username_ch}" ]] && echo -e "${Error} 用户名已被使用 !" && exit 1
  442. sed -i '3i\ },' ${server_conf}
  443. sed -i '3i\ "disabled": false' ${server_conf}
  444. sed -i '3i\ "location": "'"${location_s}"'",' ${server_conf}
  445. sed -i '3i\ "host": "'"None"'",' ${server_conf}
  446. sed -i '3i\ "type": "'"${type_s}"'",' ${server_conf}
  447. sed -i '3i\ "name": "'"${name_s}"'",' ${server_conf}
  448. sed -i '3i\ "password": "'"${password_s}"'",' ${server_conf}
  449. sed -i '3i\ "username": "'"${username_s}"'",' ${server_conf}
  450. sed -i '3i\ {' ${server_conf}
  451. echo -e "${Info} 添加节点成功 ${Green_font_prefix}[ 节点名称: ${name_s}, 节点用户名: ${username_s}, 节点密码: ${password_s} ]${Font_color_suffix} !"
  452. }
  453. Del_ServerStatus_server(){
  454. List_ServerStatus_server
  455. [[ "${conf_text_total}" = "1" ]] && echo -e "${Error} 节点配置仅剩 1个,不能删除 !" && exit 1
  456. echo -e "请输入要删除的节点用户名"
  457. read -e -p "(默认: 取消):" del_server_username
  458. [[ -z "${del_server_username}" ]] && echo -e "已取消..." && exit 1
  459. del_username=`cat -n ${server_conf}|grep '"username": "'"${del_server_username}"'"'|awk '{print $1}'`
  460. if [[ ! -z ${del_username} ]]; then
  461. del_username_min=$(echo $((${del_username}-1)))
  462. del_username_max=$(echo $((${del_username}+7)))
  463. del_username_max_text=$(sed -n "${del_username_max}p" ${server_conf})
  464. del_username_max_text_last=`echo ${del_username_max_text:((${#del_username_max_text} - 1))}`
  465. if [[ ${del_username_max_text_last} != "," ]]; then
  466. del_list_num=$(echo $((${del_username_min}-1)))
  467. sed -i "${del_list_num}s/,$//g" ${server_conf}
  468. fi
  469. sed -i "${del_username_min},${del_username_max}d" ${server_conf}
  470. echo -e "${Info} 节点删除成功 ${Green_font_prefix}[ 节点用户名: ${del_server_username} ]${Font_color_suffix} "
  471. else
  472. echo -e "${Error} 请输入正确的节点用户名 !" && exit 1
  473. fi
  474. }
  475. Modify_ServerStatus_server_username(){
  476. List_ServerStatus_server
  477. echo -e "请输入要修改的节点用户名"
  478. read -e -p "(默认: 取消):" manually_username
  479. [[ -z "${manually_username}" ]] && echo -e "已取消..." && exit 1
  480. Set_username_num=$(cat -n ${server_conf}|grep '"username": "'"${manually_username}"'"'|awk '{print $1}')
  481. if [[ ! -z ${Set_username_num} ]]; then
  482. Set_username
  483. Set_username_ch=$(cat ${server_conf}|grep '"username": "'"${username_s}"'"')
  484. [[ ! -z "${Set_username_ch}" ]] && echo -e "${Error} 用户名已被使用 !" && exit 1
  485. sed -i "${Set_username_num}"'s/"username": "'"${manually_username}"'"/"username": "'"${username_s}"'"/g' ${server_conf}
  486. echo -e "${Info} 修改成功 [ 原节点用户名: ${manually_username}, 新节点用户名: ${username_s} ]"
  487. else
  488. echo -e "${Error} 请输入正确的节点用户名 !" && exit 1
  489. fi
  490. }
  491. Modify_ServerStatus_server_password(){
  492. List_ServerStatus_server
  493. echo -e "请输入要修改的节点用户名"
  494. read -e -p "(默认: 取消):" manually_username
  495. [[ -z "${manually_username}" ]] && echo -e "已取消..." && exit 1
  496. Set_username_num=$(cat -n ${server_conf}|grep '"username": "'"${manually_username}"'"'|awk '{print $1}')
  497. if [[ ! -z ${Set_username_num} ]]; then
  498. Set_password
  499. Set_password_num_a=$(echo $((${Set_username_num}+1)))
  500. Set_password_num_text=$(sed -n "${Set_password_num_a}p" ${server_conf}|sed 's/\"//g;s/,$//g'|awk -F ": " '{print $2}')
  501. sed -i "${Set_password_num_a}"'s/"password": "'"${Set_password_num_text}"'"/"password": "'"${password_s}"'"/g' ${server_conf}
  502. echo -e "${Info} 修改成功 [ 原节点密码: ${Set_password_num_text}, 新节点密码: ${password_s} ]"
  503. else
  504. echo -e "${Error} 请输入正确的节点用户名 !" && exit 1
  505. fi
  506. }
  507. Modify_ServerStatus_server_name(){
  508. List_ServerStatus_server
  509. echo -e "请输入要修改的节点用户名"
  510. read -e -p "(默认: 取消):" manually_username
  511. [[ -z "${manually_username}" ]] && echo -e "已取消..." && exit 1
  512. Set_username_num=$(cat -n ${server_conf}|grep '"username": "'"${manually_username}"'"'|awk '{print $1}')
  513. if [[ ! -z ${Set_username_num} ]]; then
  514. Set_name
  515. Set_name_num_a=$(echo $((${Set_username_num}+2)))
  516. Set_name_num_a_text=$(sed -n "${Set_name_num_a}p" ${server_conf}|sed 's/\"//g;s/,$//g'|awk -F ": " '{print $2}')
  517. sed -i "${Set_name_num_a}"'s/"name": "'"${Set_name_num_a_text}"'"/"name": "'"${name_s}"'"/g' ${server_conf}
  518. echo -e "${Info} 修改成功 [ 原节点名称: ${Set_name_num_a_text}, 新节点名称: ${name_s} ]"
  519. else
  520. echo -e "${Error} 请输入正确的节点用户名 !" && exit 1
  521. fi
  522. }
  523. Modify_ServerStatus_server_type(){
  524. List_ServerStatus_server
  525. echo -e "请输入要修改的节点用户名"
  526. read -e -p "(默认: 取消):" manually_username
  527. [[ -z "${manually_username}" ]] && echo -e "已取消..." && exit 1
  528. Set_username_num=$(cat -n ${server_conf}|grep '"username": "'"${manually_username}"'"'|awk '{print $1}')
  529. if [[ ! -z ${Set_username_num} ]]; then
  530. Set_type
  531. Set_type_num_a=$(echo $((${Set_username_num}+3)))
  532. Set_type_num_a_text=$(sed -n "${Set_type_num_a}p" ${server_conf}|sed 's/\"//g;s/,$//g'|awk -F ": " '{print $2}')
  533. sed -i "${Set_type_num_a}"'s/"type": "'"${Set_type_num_a_text}"'"/"type": "'"${type_s}"'"/g' ${server_conf}
  534. echo -e "${Info} 修改成功 [ 原节点虚拟化: ${Set_type_num_a_text}, 新节点虚拟化: ${type_s} ]"
  535. else
  536. echo -e "${Error} 请输入正确的节点用户名 !" && exit 1
  537. fi
  538. }
  539. Modify_ServerStatus_server_location(){
  540. List_ServerStatus_server
  541. echo -e "请输入要修改的节点用户名"
  542. read -e -p "(默认: 取消):" manually_username
  543. [[ -z "${manually_username}" ]] && echo -e "已取消..." && exit 1
  544. Set_username_num=$(cat -n ${server_conf}|grep '"username": "'"${manually_username}"'"'|awk '{print $1}')
  545. if [[ ! -z ${Set_username_num} ]]; then
  546. Set_location
  547. Set_location_num_a=$(echo $((${Set_username_num}+5)))
  548. Set_location_num_a_text=$(sed -n "${Set_location_num_a}p" ${server_conf}|sed 's/\"//g;s/,$//g'|awk -F ": " '{print $2}')
  549. sed -i "${Set_location_num_a}"'s/"location": "'"${Set_location_num_a_text}"'"/"location": "'"${location_s}"'"/g' ${server_conf}
  550. echo -e "${Info} 修改成功 [ 原节点位置: ${Set_location_num_a_text}, 新节点位置: ${location_s} ]"
  551. else
  552. echo -e "${Error} 请输入正确的节点用户名 !" && exit 1
  553. fi
  554. }
  555. Modify_ServerStatus_server_all(){
  556. List_ServerStatus_server
  557. echo -e "请输入要修改的节点用户名"
  558. read -e -p "(默认: 取消):" manually_username
  559. [[ -z "${manually_username}" ]] && echo -e "已取消..." && exit 1
  560. Set_username_num=$(cat -n ${server_conf}|grep '"username": "'"${manually_username}"'"'|awk '{print $1}')
  561. if [[ ! -z ${Set_username_num} ]]; then
  562. Set_username
  563. Set_password
  564. Set_name
  565. Set_type
  566. Set_location
  567. sed -i "${Set_username_num}"'s/"username": "'"${manually_username}"'"/"username": "'"${username_s}"'"/g' ${server_conf}
  568. Set_password_num_a=$(echo $((${Set_username_num}+1)))
  569. Set_password_num_text=$(sed -n "${Set_password_num_a}p" ${server_conf}|sed 's/\"//g;s/,$//g'|awk -F ": " '{print $2}')
  570. sed -i "${Set_password_num_a}"'s/"password": "'"${Set_password_num_text}"'"/"password": "'"${password_s}"'"/g' ${server_conf}
  571. Set_name_num_a=$(echo $((${Set_username_num}+2)))
  572. Set_name_num_a_text=$(sed -n "${Set_name_num_a}p" ${server_conf}|sed 's/\"//g;s/,$//g'|awk -F ": " '{print $2}')
  573. sed -i "${Set_name_num_a}"'s/"name": "'"${Set_name_num_a_text}"'"/"name": "'"${name_s}"'"/g' ${server_conf}
  574. Set_type_num_a=$(echo $((${Set_username_num}+3)))
  575. Set_type_num_a_text=$(sed -n "${Set_type_num_a}p" ${server_conf}|sed 's/\"//g;s/,$//g'|awk -F ": " '{print $2}')
  576. sed -i "${Set_type_num_a}"'s/"type": "'"${Set_type_num_a_text}"'"/"type": "'"${type_s}"'"/g' ${server_conf}
  577. Set_location_num_a=$(echo $((${Set_username_num}+5)))
  578. Set_location_num_a_text=$(sed -n "${Set_location_num_a}p" ${server_conf}|sed 's/\"//g;s/,$//g'|awk -F ": " '{print $2}')
  579. sed -i "${Set_location_num_a}"'s/"location": "'"${Set_location_num_a_text}"'"/"location": "'"${location_s}"'"/g' ${server_conf}
  580. echo -e "${Info} 修改成功。"
  581. else
  582. echo -e "${Error} 请输入正确的节点用户名 !" && exit 1
  583. fi
  584. }
  585. Modify_ServerStatus_server_disabled(){
  586. List_ServerStatus_server
  587. echo -e "请输入要修改的节点用户名"
  588. read -e -p "(默认: 取消):" manually_username
  589. [[ -z "${manually_username}" ]] && echo -e "已取消..." && exit 1
  590. Set_username_num=$(cat -n ${server_conf}|grep '"username": "'"${manually_username}"'"'|awk '{print $1}')
  591. if [[ ! -z ${Set_username_num} ]]; then
  592. Set_disabled_num_a=$(echo $((${Set_username_num}+6)))
  593. Set_disabled_num_a_text=$(sed -n "${Set_disabled_num_a}p" ${server_conf}|sed 's/\"//g;s/,$//g'|awk -F ": " '{print $2}')
  594. if [[ ${Set_disabled_num_a_text} == "false" ]]; then
  595. disabled_s="true"
  596. else
  597. disabled_s="false"
  598. fi
  599. sed -i "${Set_disabled_num_a}"'s/"disabled": '"${Set_disabled_num_a_text}"'/"disabled": '"${disabled_s}"'/g' ${server_conf}
  600. echo -e "${Info} 修改成功 [ 原禁用状态: ${Set_disabled_num_a_text}, 新禁用状态: ${disabled_s} ]"
  601. else
  602. echo -e "${Error} 请输入正确的节点用户名 !" && exit 1
  603. fi
  604. }
  605. Set_ServerStatus_client(){
  606. check_installed_client_status
  607. Set_config_client
  608. Read_config_client
  609. Del_iptables_OUT "${client_port}"
  610. Modify_config_client
  611. Add_iptables_OUT "${server_port_s}"
  612. Restart_ServerStatus_client
  613. }
  614. Modify_config_client(){
  615. sed -i 's/SERVER = "'"${client_server}"'"/SERVER = "'"${server_s}"'"/g' "${client_file}/status-client.py"
  616. sed -i "s/PORT = ${client_port}/PORT = ${server_port_s}/g" "${client_file}/status-client.py"
  617. sed -i 's/USER = "'"${client_user}"'"/USER = "'"${username_s}"'"/g' "${client_file}/status-client.py"
  618. sed -i 's/PASSWORD = "'"${client_password}"'"/PASSWORD = "'"${password_s}"'"/g' "${client_file}/status-client.py"
  619. }
  620. Install_jq(){
  621. if [[ ! -e ${jq_file} ]]; then
  622. if [[ ${bit} = "x86_64" ]]; then
  623. wget --no-check-certificate "https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64" -O ${jq_file}
  624. else
  625. wget --no-check-certificate "https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux32" -O ${jq_file}
  626. fi
  627. [[ ! -e ${jq_file} ]] && echo -e "${Error} JQ解析器 下载失败,请检查 !" && exit 1
  628. chmod +x ${jq_file}
  629. echo -e "${Info} JQ解析器 安装完成,继续..."
  630. else
  631. echo -e "${Info} JQ解析器 已安装,继续..."
  632. fi
  633. }
  634. Install_caddy(){
  635. echo
  636. echo -e "${Info} 是否由脚本自动配置HTTP服务(服务端的在线监控网站),如果选择 N,则请在其他HTTP服务中配置网站根目录为:${Green_font_prefix}${web_file}${Font_color_suffix} [Y/n]"
  637. read -e -p "(默认: Y 自动部署):" caddy_yn
  638. [[ -z "$caddy_yn" ]] && caddy_yn="y"
  639. if [[ "${caddy_yn}" == [Yy] ]]; then
  640. Set_server "server"
  641. Set_server_http_port
  642. if [[ ! -e "/usr/local/caddy/caddy" ]]; then
  643. wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/caddy_install.sh
  644. chmod +x caddy_install.sh
  645. bash caddy_install.sh install
  646. rm -rf caddy_install.sh
  647. [[ ! -e "/usr/local/caddy/caddy" ]] && echo -e "${Error} Caddy安装失败,请手动部署,Web网页文件位置:${Web_file}" && exit 1
  648. else
  649. echo -e "${Info} 发现Caddy已安装,开始配置..."
  650. fi
  651. if [[ ! -s "/usr/local/caddy/Caddyfile" ]]; then
  652. cat > "/usr/local/caddy/Caddyfile"<<-EOF
  653. http://${server_s}:${server_http_port_s} {
  654. root ${web_file}
  655. timeouts none
  656. gzip
  657. }
  658. EOF
  659. /etc/init.d/caddy restart
  660. else
  661. echo -e "${Info} 发现 Caddy 配置文件非空,开始追加 ServerStatus 网站配置内容到文件最后..."
  662. cat >> "/usr/local/caddy/Caddyfile"<<-EOF
  663. http://${server_s}:${server_http_port_s} {
  664. root ${web_file}
  665. timeouts none
  666. gzip
  667. }
  668. EOF
  669. /etc/init.d/caddy restart
  670. fi
  671. else
  672. echo -e "${Info} 跳过 HTTP服务部署,请手动部署,Web网页文件位置:${web_file} ,如果位置改变,请注意修改服务脚本文件 /etc/init.d/status-server 中的 WEB_BIN 变量 !"
  673. fi
  674. }
  675. Install_ServerStatus_server(){
  676. [[ -e "${server_file}/sergate" ]] && echo -e "${Error} 检测到 ServerStatus 服务端已安装 !" && exit 1
  677. Set_server_port
  678. echo -e "${Info} 开始安装/配置 依赖..."
  679. Installation_dependency "server"
  680. Install_caddy
  681. echo -e "${Info} 开始下载/安装..."
  682. Download_Server_Status_server
  683. Install_jq
  684. echo -e "${Info} 开始下载/安装 服务脚本(init)..."
  685. Service_Server_Status_server
  686. echo -e "${Info} 开始写入 配置文件..."
  687. Write_server_config
  688. Write_server_config_conf
  689. echo -e "${Info} 开始设置 iptables防火墙..."
  690. Set_iptables
  691. echo -e "${Info} 开始添加 iptables防火墙规则..."
  692. Add_iptables "${server_port_s}"
  693. [[ ! -z "${server_http_port_s}" ]] && Add_iptables "${server_http_port_s}"
  694. echo -e "${Info} 开始保存 iptables防火墙规则..."
  695. Save_iptables
  696. echo -e "${Info} 所有步骤 安装完毕,开始启动..."
  697. Start_ServerStatus_server
  698. }
  699. Install_ServerStatus_client(){
  700. [[ -e "${client_file}/status-client.py" ]] && echo -e "${Error} 检测到 ServerStatus 客户端已安装 !" && exit 1
  701. check_sys
  702. if [[ ${release} == "centos" ]]; then
  703. cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null
  704. if [[ $? != 0 ]]; then
  705. echo -e "${Info} 检测到你的系统为 CentOS6,该系统自带的 Python2.6 版本过低,会导致无法运行客户端,如果你有能力升级为 Python2.7,那么请继续(否则建议更换系统):[y/N]"
  706. read -e -p "(默认: N 继续安装):" sys_centos6
  707. [[ -z "$sys_centos6" ]] && sys_centos6="n"
  708. if [[ "${sys_centos6}" == [Nn] ]]; then
  709. echo -e "\n${Info} 已取消...\n"
  710. exit 1
  711. fi
  712. fi
  713. fi
  714. echo -e "${Info} 开始设置 用户配置..."
  715. Set_config_client
  716. echo -e "${Info} 开始安装/配置 依赖..."
  717. Installation_dependency "client"
  718. echo -e "${Info} 开始下载/安装..."
  719. Download_Server_Status_client
  720. echo -e "${Info} 开始下载/安装 服务脚本(init)..."
  721. Service_Server_Status_client
  722. echo -e "${Info} 开始写入 配置..."
  723. Read_config_client
  724. Modify_config_client
  725. echo -e "${Info} 开始设置 iptables防火墙..."
  726. Set_iptables
  727. echo -e "${Info} 开始添加 iptables防火墙规则..."
  728. Add_iptables_OUT "${server_port_s}"
  729. echo -e "${Info} 开始保存 iptables防火墙规则..."
  730. Save_iptables
  731. echo -e "${Info} 所有步骤 安装完毕,开始启动..."
  732. Start_ServerStatus_client
  733. }
  734. Update_ServerStatus_server(){
  735. check_installed_server_status
  736. check_pid_server
  737. [[ ! -z ${PID} ]] && /etc/init.d/status-server stop
  738. Download_Server_Status_server
  739. rm -rf /etc/init.d/status-server
  740. Service_Server_Status_server
  741. Start_ServerStatus_server
  742. }
  743. Update_ServerStatus_client(){
  744. check_installed_client_status
  745. check_pid_client
  746. [[ ! -z ${PID} ]] && /etc/init.d/status-client stop
  747. if [[ ! -e "${client_file}/status-client.py" ]]; then
  748. if [[ ! -e "${file}/status-client.py" ]]; then
  749. echo -e "${Error} ServerStatus 客户端文件不存在 !" && exit 1
  750. else
  751. client_text="$(cat "${file}/status-client.py"|sed 's/\"//g;s/,//g;s/ //g')"
  752. rm -rf "${file}/status-client.py"
  753. fi
  754. else
  755. client_text="$(cat "${client_file}/status-client.py"|sed 's/\"//g;s/,//g;s/ //g')"
  756. fi
  757. server_s="$(echo -e "${client_text}"|grep "SERVER="|awk -F "=" '{print $2}')"
  758. server_port_s="$(echo -e "${client_text}"|grep "PORT="|awk -F "=" '{print $2}')"
  759. username_s="$(echo -e "${client_text}"|grep "USER="|awk -F "=" '{print $2}')"
  760. password_s="$(echo -e "${client_text}"|grep "PASSWORD="|awk -F "=" '{print $2}')"
  761. Download_Server_Status_client
  762. Read_config_client
  763. Modify_config_client
  764. rm -rf /etc/init.d/status-client
  765. Service_Server_Status_client
  766. Start_ServerStatus_client
  767. }
  768. Start_ServerStatus_server(){
  769. check_installed_server_status
  770. check_pid_server
  771. [[ ! -z ${PID} ]] && echo -e "${Error} ServerStatus 正在运行,请检查 !" && exit 1
  772. /etc/init.d/status-server start
  773. }
  774. Stop_ServerStatus_server(){
  775. check_installed_server_status
  776. check_pid_server
  777. [[ -z ${PID} ]] && echo -e "${Error} ServerStatus 没有运行,请检查 !" && exit 1
  778. /etc/init.d/status-server stop
  779. }
  780. Restart_ServerStatus_server(){
  781. check_installed_server_status
  782. check_pid_server
  783. [[ ! -z ${PID} ]] && /etc/init.d/status-server stop
  784. /etc/init.d/status-server start
  785. }
  786. Uninstall_ServerStatus_server(){
  787. check_installed_server_status
  788. echo "确定要卸载 ServerStatus 服务端(如果同时安装了客户端,则只会删除服务端) ? [y/N]"
  789. echo
  790. read -e -p "(默认: n):" unyn
  791. [[ -z ${unyn} ]] && unyn="n"
  792. if [[ ${unyn} == [Yy] ]]; then
  793. check_pid_server
  794. [[ ! -z $PID ]] && kill -9 ${PID}
  795. Read_config_server
  796. Del_iptables "${server_port}"
  797. Save_iptables
  798. if [[ -e "${client_file}/status-client.py" ]]; then
  799. rm -rf "${server_file}"
  800. rm -rf "${web_file}"
  801. else
  802. rm -rf "${file}"
  803. fi
  804. rm -rf "/etc/init.d/status-server"
  805. if [[ -e "/etc/init.d/caddy" ]]; then
  806. /etc/init.d/caddy stop
  807. wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/caddy_install.sh
  808. chmod +x caddy_install.sh
  809. bash caddy_install.sh uninstall
  810. rm -rf caddy_install.sh
  811. fi
  812. if [[ ${release} = "centos" ]]; then
  813. chkconfig --del status-server
  814. else
  815. update-rc.d -f status-server remove
  816. fi
  817. echo && echo "ServerStatus 卸载完成 !" && echo
  818. else
  819. echo && echo "卸载已取消..." && echo
  820. fi
  821. }
  822. Start_ServerStatus_client(){
  823. check_installed_client_status
  824. check_pid_client
  825. [[ ! -z ${PID} ]] && echo -e "${Error} ServerStatus 正在运行,请检查 !" && exit 1
  826. /etc/init.d/status-client start
  827. }
  828. Stop_ServerStatus_client(){
  829. check_installed_client_status
  830. check_pid_client
  831. [[ -z ${PID} ]] && echo -e "${Error} ServerStatus 没有运行,请检查 !" && exit 1
  832. /etc/init.d/status-client stop
  833. }
  834. Restart_ServerStatus_client(){
  835. check_installed_client_status
  836. check_pid_client
  837. [[ ! -z ${PID} ]] && /etc/init.d/status-client stop
  838. /etc/init.d/status-client start
  839. }
  840. Uninstall_ServerStatus_client(){
  841. check_installed_client_status
  842. echo "确定要卸载 ServerStatus 客户端(如果同时安装了服务端,则只会删除客户端) ? [y/N]"
  843. echo
  844. read -e -p "(默认: n):" unyn
  845. [[ -z ${unyn} ]] && unyn="n"
  846. if [[ ${unyn} == [Yy] ]]; then
  847. check_pid_client
  848. [[ ! -z $PID ]] && kill -9 ${PID}
  849. Read_config_client
  850. Del_iptables_OUT "${client_port}"
  851. Save_iptables
  852. if [[ -e "${server_file}/sergate" ]]; then
  853. rm -rf "${client_file}"
  854. else
  855. rm -rf "${file}"
  856. fi
  857. rm -rf /etc/init.d/status-client
  858. if [[ ${release} = "centos" ]]; then
  859. chkconfig --del status-client
  860. else
  861. update-rc.d -f status-client remove
  862. fi
  863. echo && echo "ServerStatus 卸载完成 !" && echo
  864. else
  865. echo && echo "卸载已取消..." && echo
  866. fi
  867. }
  868. View_ServerStatus_client(){
  869. check_installed_client_status
  870. Read_config_client
  871. clear && echo "————————————————————" && echo
  872. echo -e " ServerStatus 客户端配置信息:
  873. IP \t: ${Green_font_prefix}${client_server}${Font_color_suffix}
  874. 端口 \t: ${Green_font_prefix}${client_port}${Font_color_suffix}
  875. 账号 \t: ${Green_font_prefix}${client_user}${Font_color_suffix}
  876. 密码 \t: ${Green_font_prefix}${client_password}${Font_color_suffix}
  877. ————————————————————"
  878. }
  879. View_client_Log(){
  880. [[ ! -e ${client_log_file} ]] && echo -e "${Error} 没有找到日志文件 !" && exit 1
  881. echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志" && echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${client_log_file}${Font_color_suffix} 命令。" && echo
  882. tail -f ${client_log_file}
  883. }
  884. View_server_Log(){
  885. [[ ! -e ${erver_log_file} ]] && echo -e "${Error} 没有找到日志文件 !" && exit 1
  886. echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志" && echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${erver_log_file}${Font_color_suffix} 命令。" && echo
  887. tail -f ${erver_log_file}
  888. }
  889. Add_iptables_OUT(){
  890. iptables_ADD_OUT_port=$1
  891. iptables -I OUTPUT -m state --state NEW -m tcp -p tcp --dport ${iptables_ADD_OUT_port} -j ACCEPT
  892. iptables -I OUTPUT -m state --state NEW -m udp -p udp --dport ${iptables_ADD_OUT_port} -j ACCEPT
  893. }
  894. Del_iptables_OUT(){
  895. iptables_DEL_OUT_port=$1
  896. iptables -D OUTPUT -m state --state NEW -m tcp -p tcp --dport ${iptables_DEL_OUT_port} -j ACCEPT
  897. iptables -D OUTPUT -m state --state NEW -m udp -p udp --dport ${iptables_DEL_OUT_port} -j ACCEPT
  898. }
  899. Add_iptables(){
  900. iptables_ADD_IN_port=$1
  901. iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${iptables_ADD_IN_port} -j ACCEPT
  902. iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${iptables_ADD_IN_port} -j ACCEPT
  903. }
  904. Del_iptables(){
  905. iptables_DEL_IN_port=$1
  906. iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${iptables_DEL_IN_port} -j ACCEPT
  907. iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${iptables_DEL_IN_port} -j ACCEPT
  908. }
  909. Save_iptables(){
  910. if [[ ${release} == "centos" ]]; then
  911. service iptables save
  912. else
  913. iptables-save > /etc/iptables.up.rules
  914. fi
  915. }
  916. Set_iptables(){
  917. if [[ ${release} == "centos" ]]; then
  918. service iptables save
  919. chkconfig --level 2345 iptables on
  920. else
  921. iptables-save > /etc/iptables.up.rules
  922. echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables
  923. chmod +x /etc/network/if-pre-up.d/iptables
  924. fi
  925. }
  926. Update_Shell(){
  927. sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/status.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github"
  928. [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0
  929. if [[ -e "/etc/init.d/status-client" ]]; then
  930. rm -rf /etc/init.d/status-client
  931. Service_Server_Status_client
  932. fi
  933. if [[ -e "/etc/init.d/status-server" ]]; then
  934. rm -rf /etc/init.d/status-server
  935. Service_Server_Status_server
  936. fi
  937. wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/status.sh" && chmod +x status.sh
  938. echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0
  939. }
  940. menu_client(){
  941. echo && echo -e " ServerStatus 一键安装管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix}
  942. -- Toyo | doub.io/shell-jc3 --
  943. ${Green_font_prefix} 0.${Font_color_suffix} 升级脚本
  944. ————————————
  945. ${Green_font_prefix} 1.${Font_color_suffix} 安装 客户端
  946. ${Green_font_prefix} 2.${Font_color_suffix} 更新 客户端
  947. ${Green_font_prefix} 3.${Font_color_suffix} 卸载 客户端
  948. ————————————
  949. ${Green_font_prefix} 4.${Font_color_suffix} 启动 客户端
  950. ${Green_font_prefix} 5.${Font_color_suffix} 停止 客户端
  951. ${Green_font_prefix} 6.${Font_color_suffix} 重启 客户端
  952. ————————————
  953. ${Green_font_prefix} 7.${Font_color_suffix} 设置 客户端配置
  954. ${Green_font_prefix} 8.${Font_color_suffix} 查看 客户端信息
  955. ${Green_font_prefix} 9.${Font_color_suffix} 查看 客户端日志
  956. ————————————
  957. ${Green_font_prefix}10.${Font_color_suffix} 切换为 服务端菜单" && echo
  958. if [[ -e "${client_file}/status-client.py" ]]; then
  959. check_pid_client
  960. if [[ ! -z "${PID}" ]]; then
  961. echo -e " 当前状态: 客户端 ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}"
  962. else
  963. echo -e " 当前状态: 客户端 ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}"
  964. fi
  965. else
  966. if [[ -e "${file}/status-client.py" ]]; then
  967. check_pid_client
  968. if [[ ! -z "${PID}" ]]; then
  969. echo -e " 当前状态: 客户端 ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}"
  970. else
  971. echo -e " 当前状态: 客户端 ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}"
  972. fi
  973. else
  974. echo -e " 当前状态: 客户端 ${Red_font_prefix}未安装${Font_color_suffix}"
  975. fi
  976. fi
  977. echo
  978. read -e -p " 请输入数字 [0-10]:" num
  979. case "$num" in
  980. 0)
  981. Update_Shell
  982. ;;
  983. 1)
  984. Install_ServerStatus_client
  985. ;;
  986. 2)
  987. Update_ServerStatus_client
  988. ;;
  989. 3)
  990. Uninstall_ServerStatus_client
  991. ;;
  992. 4)
  993. Start_ServerStatus_client
  994. ;;
  995. 5)
  996. Stop_ServerStatus_client
  997. ;;
  998. 6)
  999. Restart_ServerStatus_client
  1000. ;;
  1001. 7)
  1002. Set_ServerStatus_client
  1003. ;;
  1004. 8)
  1005. View_ServerStatus_client
  1006. ;;
  1007. 9)
  1008. View_client_Log
  1009. ;;
  1010. 10)
  1011. menu_server
  1012. ;;
  1013. *)
  1014. echo "请输入正确数字 [0-10]"
  1015. ;;
  1016. esac
  1017. }
  1018. menu_server(){
  1019. echo && echo -e " ServerStatus 一键安装管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix}
  1020. -- Toyo | doub.io/shell-jc3 --
  1021. ${Green_font_prefix} 0.${Font_color_suffix} 升级脚本
  1022. ————————————
  1023. ${Green_font_prefix} 1.${Font_color_suffix} 安装 服务端
  1024. ${Green_font_prefix} 2.${Font_color_suffix} 更新 服务端
  1025. ${Green_font_prefix} 3.${Font_color_suffix} 卸载 服务端
  1026. ————————————
  1027. ${Green_font_prefix} 4.${Font_color_suffix} 启动 服务端
  1028. ${Green_font_prefix} 5.${Font_color_suffix} 停止 服务端
  1029. ${Green_font_prefix} 6.${Font_color_suffix} 重启 服务端
  1030. ————————————
  1031. ${Green_font_prefix} 7.${Font_color_suffix} 设置 服务端配置
  1032. ${Green_font_prefix} 8.${Font_color_suffix} 查看 服务端信息
  1033. ${Green_font_prefix} 9.${Font_color_suffix} 查看 服务端日志
  1034. ————————————
  1035. ${Green_font_prefix}10.${Font_color_suffix} 切换为 客户端菜单" && echo
  1036. if [[ -e "${server_file}/sergate" ]]; then
  1037. check_pid_server
  1038. if [[ ! -z "${PID}" ]]; then
  1039. echo -e " 当前状态: 服务端 ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}"
  1040. else
  1041. echo -e " 当前状态: 服务端 ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}"
  1042. fi
  1043. else
  1044. echo -e " 当前状态: 服务端 ${Red_font_prefix}未安装${Font_color_suffix}"
  1045. fi
  1046. echo
  1047. read -e -p " 请输入数字 [0-10]:" num
  1048. case "$num" in
  1049. 0)
  1050. Update_Shell
  1051. ;;
  1052. 1)
  1053. Install_ServerStatus_server
  1054. ;;
  1055. 2)
  1056. Update_ServerStatus_server
  1057. ;;
  1058. 3)
  1059. Uninstall_ServerStatus_server
  1060. ;;
  1061. 4)
  1062. Start_ServerStatus_server
  1063. ;;
  1064. 5)
  1065. Stop_ServerStatus_server
  1066. ;;
  1067. 6)
  1068. Restart_ServerStatus_server
  1069. ;;
  1070. 7)
  1071. Set_ServerStatus_server
  1072. ;;
  1073. 8)
  1074. List_ServerStatus_server
  1075. ;;
  1076. 9)
  1077. View_server_Log
  1078. ;;
  1079. 10)
  1080. menu_client
  1081. ;;
  1082. *)
  1083. echo "请输入正确数字 [0-10]"
  1084. ;;
  1085. esac
  1086. }
  1087. check_sys
  1088. action=$1
  1089. if [[ ! -z $action ]]; then
  1090. if [[ $action = "s" ]]; then
  1091. menu_server
  1092. elif [[ $action = "c" ]]; then
  1093. menu_client
  1094. fi
  1095. else
  1096. menu_server
  1097. fi