info_distro.sh 11 KB

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