command_monitor.sh 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #!/bin/bash
  2. # LinuxGSM command_monitor.sh function
  3. # Author: Daniel Gibbs
  4. # Contributor: UltimateByte
  5. # Website: https://linuxgsm.com
  6. # Description: Monitors server by checking for running processes.
  7. # then passes to gamedig and gsquery.
  8. local commandname="MONITOR"
  9. local commandaction="Monitor"
  10. local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
  11. fn_monitor_loop(){
  12. # Will query up to 5 times every 15 seconds.
  13. # Query will wait up to 60 seconds to confirm server is down giving server time if changing map.
  14. totalseconds=0
  15. for queryattempt in {1..5}; do
  16. fn_print_dots "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: "
  17. fn_print_querying_eol
  18. fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : QUERYING"
  19. sleep 0.5
  20. if [ "${querymethod}" == "gamedig" ]; then
  21. query_gamedig.sh
  22. elif [ "${querymethod}" == "gsquery" ]; then
  23. if [ ! -f "${functionsdir}/query_gsquery.py" ]; then
  24. fn_fetch_file_github "lgsm/functions" "query_gsquery.py" "${functionsdir}" "chmodx" "norun" "noforce" "nomd5"
  25. fi
  26. "${functionsdir}"/query_gsquery.py -a "${ip}" -p "${queryport}" -e "${engine}" > /dev/null 2>&1
  27. querystatus="$?"
  28. elif [ "${querymethod}" == "tcp" ]; then
  29. bash -c 'exec 3<> /dev/tcp/'${ip}'/'${queryport}''
  30. querystatus="$?"
  31. fi
  32. if [ "${querystatus}" == "0" ]; then
  33. # Server query OK
  34. sleep 0.5
  35. fn_print_ok "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: "
  36. fn_print_ok_eol_nl
  37. fn_script_log_pass "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt}: OK"
  38. exitcode=0
  39. monitorpass=1
  40. core_exit.sh
  41. else
  42. # Server query FAIL
  43. fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt}: FAIL"
  44. fn_print_fail "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: "
  45. fn_print_fail_eol
  46. sleep 0.5
  47. # monitor try gamedig first then gsquery before restarting
  48. if [ "${querymethod}" == "gsquery" ]; then
  49. if [ "${totalseconds}" -ge "59" ]; then
  50. # Server query FAIL for over 59 seconds reboot server
  51. fn_print_fail "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: "
  52. fn_print_fail_eol_nl
  53. fn_script_log_error "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt}: FAIL"
  54. sleep 0.5
  55. # Send alert if enabled
  56. alert="restartquery"
  57. alert.sh
  58. command_restart.sh
  59. core_exit.sh
  60. fi
  61. elif [ "${querymethod}" == "gamedig" ]; then
  62. if [ "${totalseconds}" -ge "29" ]; then
  63. break
  64. fi
  65. fi
  66. # Seconds counter
  67. for seconds in {1..15}; do
  68. fn_print_fail "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: WAIT"
  69. totalseconds=$((totalseconds + 1))
  70. sleep 1
  71. if [ "${seconds}" == "15" ]; then
  72. break
  73. fi
  74. done
  75. fi
  76. done
  77. }
  78. fn_monitor_check_lockfile(){
  79. # Monitor does not run it lockfile is not found
  80. if [ ! -f "${rootdir}/${lockselfname}" ]; then
  81. fn_print_error_nl "Disabled: No lockfile found"
  82. fn_script_log_error "Disabled: No lockfile found"
  83. echo " * To enable monitor run ./${selfname} start"
  84. core_exit.sh
  85. fi
  86. }
  87. fn_monitor_check_update(){
  88. # Monitor will not check if update is running.
  89. if [ "$(ps -ef | grep "${selfname} update" | grep -v grep | wc -l)" != "0" ]; then
  90. fn_print_error_nl "SteamCMD is currently checking for updates"
  91. fn_script_log_error "SteamCMD is currently checking for updates"
  92. sleep 0.5
  93. core_exit.sh
  94. fi
  95. }
  96. fn_monitor_check_session(){
  97. fn_print_dots "Checking session: "
  98. fn_print_checking_eol
  99. fn_script_log_info "Checking session: CHECKING"
  100. sleep 0.5
  101. if [ "${status}" != "0" ]; then
  102. fn_print_ok "Checking session: "
  103. fn_print_ok_eol_nl
  104. fn_script_log_pass "Checking session: OK"
  105. else
  106. if [ "${shortname}" == "ts3" ]; then
  107. fn_print_error "Checking session: ${ts3error}: "
  108. elif [ "${shortname}" == "mumble" ]; then
  109. fn_print_error "Checking session: Not listening to port ${queryport}"
  110. else
  111. fn_print_error "Checking session: "
  112. fi
  113. fn_print_fail_eol_nl
  114. fn_script_log_error "Checking session: FAIL"
  115. alert="restart"
  116. alert.sh
  117. fn_script_log_info "Monitor is starting ${servername}"
  118. sleep 0.5
  119. command_restart.sh
  120. fi
  121. sleep 0.5
  122. }
  123. fn_monitor_query(){
  124. fn_script_log_info "Querying port: query enabled"
  125. # engines that work with query
  126. local allowed_engines_array=( avalanche2.0 avalanche3.0 goldsource idtech2 idtech3 idtech3_ql iw2.0 iw3.0 lwjgl2 madness quake refractor realvirtuality source spark starbound unity3d unreal unreal2 unreal4 wurm )
  127. for allowed_engine in "${allowed_engines_array[@]}"
  128. do
  129. if [ "${allowed_engine}" == "${engine}" ]; then
  130. if [ "${engine}" == "idtech3_ql" ]; then
  131. local engine="quakelive"
  132. elif [ "${shortname}" == "kf2" ]; then
  133. local engine="unreal4"
  134. fi
  135. # will first attempt to use gamedig then gsquery
  136. totalseconds=0
  137. if [ "${shortname}" == "wurm" ]; then
  138. local query_methods_array=( gsquery )
  139. else
  140. local query_methods_array=( gamedig gsquery )
  141. fi
  142. for query_method in "${query_methods_array[@]}"
  143. do
  144. if [ "${query_method}" == "gamedig" ]; then
  145. # will bypass gamedig if not installed
  146. if [ "$(command -v gamedig 2>/dev/null)" ]&&[ "$(command -v jq 2>/dev/null)" ]; then
  147. if [ -z "${monitorpass}" ]; then
  148. querymethod="${query_method}"
  149. fn_monitor_loop
  150. fi
  151. fi
  152. else
  153. if [ -z "${monitorpass}" ]; then
  154. querymethod="${query_method}"
  155. fn_monitor_loop
  156. fi
  157. fi
  158. done
  159. fi
  160. done
  161. }
  162. fn_monitor_query_tcp(){
  163. querymethod="tcp"
  164. fn_monitor_loop
  165. }
  166. monitorflag=1
  167. fn_print_dots "${servername}"
  168. sleep 0.5
  169. check.sh
  170. logs.sh
  171. info_config.sh
  172. info_parms.sh
  173. fn_monitor_check_lockfile
  174. fn_monitor_check_update
  175. fn_monitor_check_session
  176. # Query has to be enabled in Starbound config
  177. if [ "${shortname}" == "sb" ]; then
  178. if [ "${queryenabled}" == "true" ]; then
  179. fn_monitor_query
  180. fi
  181. elif [ "${shortname}" == "ts3" ]||[ "${shortname}" == "eco" ]||[ "${shortname}" == "mumble" ]; then
  182. fn_monitor_query_tcp
  183. else
  184. fn_monitor_query
  185. fi
  186. core_exit.sh