info_distro.sh 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. #!/bin/bash
  2. # LinuxGSM info_distro.sh function
  3. # Author: Daniel Gibbs
  4. # Website: https://linuxgsm.com
  5. # Description: Variables providing useful info on the Operating System such as disk and performace info.
  6. # Used for command_details.sh, command_debug.sh and alert.sh.
  7. local function_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
  8. ### Game Server pid
  9. if [ "${status}" == "1" ]; then
  10. if [ "${shortname}" != "ts3" ]; then
  11. gameserverpid=$(tmux list-sessions -F "#{session_name} #{pane_pid}"| grep "^${servicename}"|awk '{print $2}')
  12. fi
  13. fi
  14. ### Distro information
  15. ## Distro
  16. # Returns architecture, kernel and distro/os.
  17. arch=$(uname -m)
  18. kernel=$(uname -r)
  19. # Distro Name - Ubuntu 16.04 LTS
  20. # Distro Version - 16.04
  21. # Distro ID - ubuntu
  22. # Distro Codename - xenial
  23. # Gathers distro info from various sources filling in missing gaps.
  24. distro_info_array=( os-release lsb_release hostnamectl debian_version redhat-release )
  25. for distro_info in "${distro_info_array[@]}"
  26. do
  27. if [ -f "/etc/os-release" ]&&[ "${distro_info}" == "os-release" ]; then
  28. distroname=$(grep PRETTY_NAME /etc/os-release | sed 's/PRETTY_NAME=//g' | tr -d '="' | sed 's/\"//g')
  29. distroversion=$(grep VERSION_ID /etc/os-release | sed 's/VERSION_ID=//g' | sed 's/\"//g')
  30. distroid=$(grep ID /etc/os-release | grep -v _ID | grep -v ID_ | sed 's/ID=//g' | sed 's/\"//g')
  31. distrocodename=$(grep VERSION_CODENAME /etc/os-release | sed 's/VERSION_CODENAME=//g' | sed 's/\"//g')
  32. elif [ -n "$(command -v lsb_release 2>/dev/null)" ]&&[ "${distro_info}" == "lsb_release" ]; then
  33. if [ -z "${distroname}" ];then
  34. distroname="$(lsb_release -sd)"
  35. elif [ -z "${distroversion}" ];then
  36. distroversion="$(lsb_release -sr)"
  37. elif [ -z "${distroid}" ];then
  38. distroid=$(lsb_release -si)
  39. elif [ -z "${distrocodename}" ];then
  40. distrocodename=$(lsb_release -sc)
  41. fi
  42. elif [ -n "$(command -v hostnamectl 2>/dev/null)" ]&&[ "${distro_info}" == "hostnamectl" ]; then
  43. if [ -z "${distroname}" ];then
  44. distroname="$(hostnamectl | grep "Operating System" | sed 's/Operating System: //g')"
  45. fi
  46. elif [ -f "/etc/debian_version" ]&&[ "${distro_info}" == "debian_version" ]; then
  47. if [ -z "${distroname}" ];then
  48. distroname="Debian $(cat /etc/debian_version)"
  49. elif [ -z "${distroversion}" ];then
  50. distroversion="$(cat /etc/debian_version)"
  51. elif [ -z "${distroid}" ];then
  52. distroid="debian"
  53. fi
  54. elif [ -f "/etc/redhat-release" ]&&[ "${distro_info}" == "redhat-release" ]; then
  55. if [ -z "${distroname}" ];then
  56. distroname=$(cat /etc/redhat-release)
  57. elif [ -z "${distroversion}" ];then
  58. distroversion=$(rpm -qa \*-release | grep -Ei "oracle|redhat|centos|fedora" | cut -d"-" -f3)
  59. elif [ -z "${distroid}" ];then
  60. distroid="$(awk '{print $1}' /etc/redhat-release)"
  61. fi
  62. fi
  63. done
  64. ## Glibc version
  65. # e.g: 1.17
  66. glibcversion="$(ldd --version | sed -n '1s/.* //p')"
  67. ## tmux version
  68. # e.g: tmux 1.6
  69. if [ -z "$(command -V tmux 2>/dev/null)" ]; then
  70. tmuxv="${red}NOT INSTALLED!${default}"
  71. else
  72. if [ "$(tmux -V|sed "s/tmux //" | sed -n '1 p' | tr -cd '[:digit:]')" -lt "16" ] 2>/dev/null; then
  73. tmuxv="$(tmux -V) (>= 1.6 required for console log)"
  74. else
  75. tmuxv=$(tmux -V)
  76. fi
  77. fi
  78. ## Uptime
  79. uptime=$(</proc/uptime)
  80. uptime=${uptime/[. ]*/}
  81. minutes=$(( uptime/60%60 ))
  82. hours=$(( uptime/60/60%24 ))
  83. days=$(( uptime/60/60/24 ))
  84. ### Performance information
  85. ## Average server load
  86. load=$(uptime|awk -F 'load average: ' '{ print $2 }')
  87. ## CPU information
  88. cpumodel=$(awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//')
  89. cpucores=$(awk -F: '/model name/ {core++} END {print core}' /proc/cpuinfo)
  90. cpufreqency=$(awk -F: ' /cpu MHz/ {freq=$2} END {print freq " MHz"}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//')
  91. # CPU usage of the game server pid
  92. if [ "${status}" == "1" ]; then
  93. cpuused=$(ps --forest -o pcpu -g "${gameserverpid}"|awk '{s+=$1} END {print s}')
  94. fi
  95. ## Memory information
  96. # Available RAM and swap.
  97. # Newer distros can use numfmt to give more accurate results.
  98. if [ -n "$(command -v numfmt 2>/dev/null)" ]; then
  99. # Issue #2005 - Kernel 3.14+ contains MemAvailable which should be used. All others will be calculated.
  100. # get the raw KB values of these fields.
  101. physmemtotalkb=$(grep MemTotal /proc/meminfo | awk '{print $2}')
  102. physmemfreekb=$(grep ^MemFree /proc/meminfo | awk '{print $2}')
  103. physmembufferskb=$(grep ^Buffers /proc/meminfo | awk '{print $2}')
  104. physmemcachedkb=$(grep ^Cached /proc/meminfo | awk '{print $2}')
  105. physmemreclaimablekb=$(grep ^SReclaimable /proc/meminfo | awk '{print $2}')
  106. # check if MemAvailable Exists.
  107. if grep -q ^MemAvailable /proc/meminfo; then
  108. physmemactualfreekb=$(grep ^MemAvailable /proc/meminfo | awk '{print $2}')
  109. else
  110. physmemactualfreekb=$((${physmemfreekb}+${physmembufferskb}+${physmemcachedkb}))
  111. fi
  112. # Available RAM and swap.
  113. physmemtotalmb=$((${physmemtotalkb}/1024))
  114. physmemtotal=$(numfmt --to=iec --from=iec --suffix=B "${physmemtotalkb}K")
  115. physmemfree=$(numfmt --to=iec --from=iec --suffix=B "${physmemactualfreekb}K")
  116. physmemused=$(numfmt --to=iec --from=iec --suffix=B "$((${physmemtotalkb}-${physmemfreekb}-${physmembufferskb}-${physmemcachedkb}-${physmemreclaimablekb}))K")
  117. physmemavailable=$(numfmt --to=iec --from=iec --suffix=B "${physmemactualfreekb}K")
  118. physmemcached=$(numfmt --to=iec --from=iec --suffix=B "$((${physmemcachedkb}+${physmemreclaimablekb}))K")
  119. swaptotal=$(numfmt --to=iec --from=iec --suffix=B "$(grep ^SwapTotal /proc/meminfo | awk '{print $2}')K")
  120. swapfree=$(numfmt --to=iec --from=iec --suffix=B "$(grep ^SwapFree /proc/meminfo | awk '{print $2}')K")
  121. swapused=$(numfmt --to=iec --from=iec --suffix=B "$(($(grep ^SwapTotal /proc/meminfo | awk '{print $2}')-$(grep ^SwapFree /proc/meminfo | awk '{print $2}')))K")
  122. # RAM usage of the game server pid
  123. # MB
  124. if [ "${status}" == "1" ]; then
  125. memused=$(ps --forest -o rss -g "${gameserverpid}" | awk '{s+=$1} END {print s}'| awk '{$1/=1024;printf "%.0fMB\t",$1}{print $2}')
  126. # %
  127. pmemused=$(ps --forest -o %mem -g "${gameserverpid}" | awk '{s+=$1} END {print s}')
  128. fi
  129. else
  130. # Older distros will need to use free.
  131. # Older versions of free do not support -h option.
  132. if [ "$(free -h > /dev/null 2>&1; echo $?)" -ne "0" ]; then
  133. humanreadable="-m"
  134. else
  135. humanreadable="-h"
  136. fi
  137. physmemtotalmb=$(free -m | awk '/Mem:/ {print $2}')
  138. physmemtotal=$(free ${humanreadable} | awk '/Mem:/ {print $2}')
  139. physmemfree=$(free ${humanreadable} | awk '/Mem:/ {print $4}')
  140. physmemused=$(free ${humanreadable} | awk '/Mem:/ {print $3}')
  141. oldfree=$(free ${humanreadable} | awk '/cache:/')
  142. if [ -n "${oldfree}" ]; then
  143. physmemavailable="n/a"
  144. physmemcached="n/a"
  145. else
  146. physmemavailable=$(free ${humanreadable} | awk '/Mem:/ {print $7}')
  147. physmemcached=$(free ${humanreadable} | awk '/Mem:/ {print $6}')
  148. fi
  149. swaptotal=$(free ${humanreadable} | awk '/Swap:/ {print $2}')
  150. swapused=$(free ${humanreadable} | awk '/Swap:/ {print $3}')
  151. swapfree=$(free ${humanreadable} | awk '/Swap:/ {print $4}')
  152. fi
  153. ### Disk information
  154. ## Available disk space on the partition.
  155. filesystem=$(df -hP "${rootdir}" | grep -v "Filesystem" | awk '{print $1}')
  156. totalspace=$(df -hP "${rootdir}" | grep -v "Filesystem" | awk '{print $2}')
  157. usedspace=$(df -hP "${rootdir}" | grep -v "Filesystem" | awk '{print $3}')
  158. availspace=$(df -hP "${rootdir}" | grep -v "Filesystem" | awk '{print $4}')
  159. ## LinuxGSM used space total.
  160. rootdirdu=$(du -sh "${rootdir}" 2> /dev/null | awk '{print $1}')
  161. if [ -z "${rootdirdu}" ]; then
  162. rootdirdu="0M"
  163. fi
  164. ## LinuxGSM used space in serverfiles dir.
  165. serverfilesdu=$(du -sh "${serverfiles}" 2> /dev/null | awk '{print $1}')
  166. if [ -z "${serverfilesdu}" ]; then
  167. serverfilesdu="0M"
  168. fi
  169. ## LinuxGSM used space total minus backup dir.
  170. rootdirduexbackup=$(du -sh --exclude="${backupdir}" "${serverfiles}" 2> /dev/null | awk '{print $1}')
  171. if [ -z "${rootdirduexbackup}" ]; then
  172. rootdirduexbackup="0M"
  173. fi
  174. ## Backup info
  175. if [ -d "${backupdir}" ]; then
  176. # Used space in backups dir.
  177. backupdirdu=$(du -sh "${backupdir}" | awk '{print $1}')
  178. # If no backup dir, size is 0M.
  179. if [ -z "${backupdirdu}" ]; then
  180. backupdirdu="0M"
  181. fi
  182. # number of backups set to 0 by default.
  183. backupcount=0
  184. # If there are backups in backup dir.
  185. if [ "$(find "${backupdir}" -name "*.tar.gz" | wc -l)" -ne "0" ]; then
  186. # number of backups.
  187. backupcount=$(find "${backupdir}"/*.tar.gz | wc -l)
  188. # most recent backup.
  189. lastbackup=$(find "${backupdir}"/*.tar.gz | head -1)
  190. # date of most recent backup.
  191. lastbackupdate=$(date -r "${lastbackup}")
  192. # no of days since last backup.
  193. lastbackupdaysago=$(( ( $(date +'%s') - $(date -r "${lastbackup}" +'%s') )/60/60/24 ))
  194. # size of most recent backup.
  195. lastbackupsize=$(du -h "${lastbackup}" | awk '{print $1}')
  196. fi
  197. fi
  198. # Network Interface name
  199. netint=$(ip -o addr | grep "${ip}" | awk '{print $2}')
  200. netlink=$(ethtool "${netint}" 2>/dev/null| grep Speed | awk '{print $2}')
  201. # External IP address
  202. if [ -z "${extip}" ]; then
  203. extip=$(${curlpath} -4 -m 3 ifconfig.co 2>/dev/null)
  204. exitcode=$?
  205. # Should ifconfig.co return an error will use last known IP.
  206. if [ ${exitcode} -eq 0 ]; then
  207. echo -e "${extip}" > "${tmpdir}/extip.txt"
  208. else
  209. if [ -f "${tmpdir}/extip.txt" ]; then
  210. extip=$(cat ${tmpdir}/extip.txt)
  211. else
  212. echo -e "x.x.x.x"
  213. fi
  214. fi
  215. fi
  216. # Alert IP address
  217. if [ "${displayip}" ]; then
  218. alertip="${displayip}"
  219. elif [ "${extip}" ]; then
  220. alertip="${extip}"
  221. else
  222. alertip="${ip}"
  223. fi
  224. # Steam Master Server - checks if detected by master server.
  225. if [ "$(command -v jq 2>/dev/null)" ]; then
  226. if [ "${ip}" ]&&[ "${port}" ]; then
  227. if [ "${steammaster}" == "true" ]; then
  228. masterserver="$(${curlpath} -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${ip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l)"
  229. if [ "${masterserver}" == "0" ]; then
  230. masterserver="$(${curlpath} -m 3 -s 'https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr='${extip}':'${port}'&format=json' | jq '.response.servers[]|.addr' | wc -l)"
  231. fi
  232. if [ "${masterserver}" == "0" ]; then
  233. displaymasterserver="false"
  234. else
  235. displaymasterserver="true"
  236. fi
  237. fi
  238. fi
  239. fi
  240. # Sets the SteamCMD glibc requirement if the game server requirement is less or not required.
  241. if [ -n "${appid}" ]; then
  242. if [ "${glibc}" = "null" ]||[ -z "${glibc}" ]||[ "$(printf '%s\n'${glibc}'\n' "2.14" | sort -V | head -n 1)" != "2.14" ]; then
  243. glibc="2.14"
  244. fi
  245. fi