monitor_gsquery.sh 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #!/bin/bash
  2. # LGSM monitor_gsquery.sh function
  3. # Author: Daniel Gibbs
  4. # Website: http://gameservermanagers.com
  5. lgsm_version="271215"
  6. # Description: uses gsquery.py to query the server port.
  7. # Detects if the server has frozen with the proccess still running.
  8. local modulename="Monitor"
  9. # Downloads gsquery.py if missing
  10. if [ ! -f "${functionsdir}/gsquery.py" ]; then
  11. fn_fetch_file_github "functions" "gsquery.py" "${functionsdir}" "executecmd" "norun" "noforce"
  12. fi
  13. info_config.sh
  14. if [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then
  15. port=$((${port} + 1))
  16. elif [ "${engine}" == "spark" ]; then
  17. port=$((${port} + 1))
  18. fi
  19. if [ -z "${queryport}" ]; then
  20. port="${queryport}"
  21. fi
  22. fn_printinfo "Querying port: gsquery.py enabled"
  23. fn_scriptlog "gsquery.py enabled"
  24. sleep 1
  25. fn_printdots "Querying port: ${ip}:${port}: 0/1 : "
  26. fn_printqueryingeol
  27. fn_scriptlog "Querying port: ${ip}:${port}: 1 : QUERYING"
  28. sleep 1
  29. # Will query up to 4 times every 15 seconds.
  30. # Servers changing map can return a failure.
  31. # Will Wait up to 60 seconds to confirm server is down giving server time to change map.
  32. queryattempt=0
  33. totalseconds=0
  34. for i in {1..4}; do
  35. gsquerycmd=$("${functionsdir}"/gsquery.py -a ${ip} -p 1 -e ${engine} 2>&1)
  36. exitcode=$?
  37. if [ "${exitcode}" == "0" ]; then
  38. # Server OK
  39. fn_printok "Querying port: ${ip}:${port}: "
  40. fn_printokeol
  41. fn_scriptlog "Querying port: ${ip}:${port}: OK"
  42. sleep 1
  43. exit
  44. else
  45. # Server failed query
  46. queryattempt=$((queryattempt + 1))
  47. fn_scriptlog "Querying port: ${ip}:${port}: ${totalseconds}/${queryattempt} : ${gsquerycmd}"
  48. seconds=0
  49. # Seconds counter
  50. while [ true ]; do
  51. fn_printfail "Querying port: ${ip}:${port}: ${totalseconds}/${queryattempt} : \e[0;31m${gsquerycmd}\e[0m"
  52. seconds=$((seconds + 1))
  53. totalseconds=$((totalseconds + 1))
  54. sleep 1
  55. if [ "${seconds}" == "15" ]; then
  56. fn_printdots "Querying port: ${ip}:${port}: ${totalseconds}/${queryattempt} : "
  57. fn_printqueryingeol
  58. fn_scriptlog "Querying port: ${ip}:${port}: ${queryattempt} : QUERYING"
  59. sleep 1
  60. break
  61. fi
  62. done
  63. fi
  64. if [ "${queryattempt}" == "4" ]; then
  65. # Server failed query 4 times confirmed failure
  66. fn_printfail "Querying port: ${ip}:${port}: "
  67. fn_printfaileol
  68. fn_scriptlog "Querying port: ${ip}:${port}: ${gsquerycmd}"
  69. fn_scriptlog "Querying port: ${ip}:${port}: FAIL"
  70. sleep 1
  71. # Send email notification if enabled
  72. if [ "${emailnotification}" = "on" ]; then
  73. info_config.sh
  74. subject="${servicename} Monitor - Starting ${servername}"
  75. failurereason="Failed to query ${servicename}: ${gsquerycmd}"
  76. actiontaken="restarted ${servicename}"
  77. email.sh
  78. fi
  79. fn_restart
  80. fi
  81. done