info_distro.sh 8.5 KB

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