1
0

ilo_fans.sh 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. #!/bin/bash
  2. #########################################################################
  3. # Script for show all FAN status #
  4. # Created by PM-DoIT #
  5. # ver 0.2 #
  6. #########################################################################
  7. #----------------------------- VARIABLES -------------------------------#
  8. YOURMAIL="info@doit.sk"
  9. CPUT="50"
  10. #---------------------------- CREDENTIALS ------------------------------#
  11. source /home/.credentials
  12. test -f /home/.credentials || echo -e "- \e[1;31mMissing\e[0m credentials source"
  13. test -f /home/.credentials || exit 1
  14. #----------------------------- CATEGORY --------------------------------#
  15. CAT="ILO"
  16. #------------------------------ TEMP -----------------------------------#
  17. STARTTIME=$(date +%s)
  18. TMP=/tmp/fanall.tmp
  19. LOG=/tmp/fanall.log
  20. TXT=/tmp/fanall.txt
  21. REP=/tmp/fanall.rep
  22. SOG=/tmp/fanall.srv
  23. EMA=/tmp/fanall.mail
  24. WEB=/opt/librenms/html/admin/ilo
  25. DOMAINPATH="/etc/hosts"
  26. test -d $WEB || mkdir $WEB
  27. rm -rf /tmp/fanall*
  28. #--------------------------- PING CHECK --------------------------------#
  29. checkping(){
  30. if [ "$READSITE" = "ALL" ]; then READSITE=$CAT; fi
  31. cat $DOMAINPATH | sort | uniq | egrep "$READSITE" | egrep -w $CAT | awk '{print $2}' | sort | uniq | while read output
  32. do
  33. ping -c 1 -n -i 0.2 -W1 "$output" > /dev/null
  34. if [ $? -eq 0 ]; then
  35. echo "$output" >> $TMP
  36. else
  37. echo -e "* $output is \e[1;31mDOWN\e[0m"
  38. fi
  39. done
  40. test -f $TMP || echo -e "! Devices \e[1;31mNOT\e[0m exist in LIST definition"
  41. test -f $TMP || exit 1
  42. }
  43. #---------------------------- FEATURE CHECK ----------------------------#
  44. checksens(){
  45. rm -rf $REP
  46. echo -e "\e[1;37mHOSTNAME MODEL FAN OPERATIONAL SPEED(%) HEALTH\e[0m" > $REP
  47. echo "----------------- ------------ ---- ----------- -------- ------" >> $REP
  48. echo -e "- \e[1;32mExtracting\e[0m ILO [\e[1;33mfan\e[0m] status:"
  49. for i in `cat $TMP | sed -r 's/\s+//g'`
  50. do
  51. echo -e "* \e[1;33m$i\e[0m"
  52. rm -rf $LOG
  53. rm -rf /tmp/fanall.srv
  54. sshpass -p $EPAS timeout 20 ssh -o "UserKnownHostsFile=/dev/null" -o StrictHostKeyChecking=no -o ConnectTimeout=10 Administrator@${i} 2> /dev/null "show system1" > $SOG
  55. dos2unix $SOG 2> /dev/null
  56. SRV=$(cat $SOG | grep -v oem | grep name | awk '{print $2"-"$3}')
  57. FAN=$(cat $SOG | grep fan | awk '{print $1}')
  58. for FN in $FAN;
  59. do
  60. FN="$FN" sshpass -p $EPAS timeout 20 ssh -o "UserKnownHostsFile=/dev/null" -o StrictHostKeyChecking=no -o ConnectTimeout=10 Administrator@${i} 2> /dev/null "show system1/$FN" > $LOG
  61. dos2unix $LOG 2> /dev/null
  62. MOD=$(cat $LOG | grep -i "system1" | grep -v show | sed 's/\// /g' | awk '{print $2}')
  63. VAL=$(cat $LOG | grep -i "DesiredSpeed" | sed 's/=/ /g' | awk '{print $2}')
  64. STA=$(cat $LOG | grep -i "OperationalStatus" | sed 's/=/ /g' | awk '{print $2}')
  65. HEA=$(cat $LOG | grep -i "HealthState" | sed 's/=/ /g' | awk '{print $2}')
  66. echo "$i $SRV $MOD $STA $VAL $HEA" > $TXT
  67. cat $TXT >> $REP
  68. done
  69. done
  70. }
  71. #---------------------------- WEB REPORT -------------------------------#
  72. webstart(){
  73. cat > $WEB/index.html <<\EOF
  74. <!DOCTYPE html>
  75. <html lang="en">
  76. <head>
  77. <meta charset="UTF-8">
  78. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  79. <title>[SITE] ILO-FAN</title>
  80. <style>
  81. :root {
  82. --bg-color: #0f172a;
  83. --card-bg: #1e293b;
  84. --text-main: #f8fafc;
  85. --text-muted: #94a3b8;
  86. --border-color: #334155;
  87. --danger-bg: rgba(239, 68, 68, 0.2);
  88. --danger-text: #f87171;
  89. --success-bg: rgba(34, 197, 94, 0.2);
  90. --success-text: #4ade80;
  91. }
  92. body {
  93. font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  94. background-color: var(--bg-color);
  95. color: var(--text-main);
  96. margin: 0;
  97. padding: 24px;
  98. }
  99. .container {
  100. max-width: 1200px;
  101. margin: 0 auto;
  102. }
  103. .header {
  104. background-color: var(--card-bg);
  105. border: 1px solid var(--border-color);
  106. border-radius: 8px;
  107. padding: 24px;
  108. margin-bottom: 24px;
  109. box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.3);
  110. text-align: center; /* Zarovnanie na stred */
  111. }
  112. .header h1 {
  113. margin: 0 0 10px 0;
  114. font-size: 1.5rem;
  115. color: var(--text-main);
  116. letter-spacing: -0.025em;
  117. }
  118. .header p {
  119. margin: 0;
  120. font-size: 0.95rem;
  121. color: var(--text-muted);
  122. }
  123. .header strong {
  124. color: #38bdf8;
  125. }
  126. .table-card {
  127. background-color: var(--card-bg);
  128. border: 1px solid var(--border-color);
  129. border-radius: 8px;
  130. overflow: hidden;
  131. box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.3);
  132. }
  133. table {
  134. width: 100%;
  135. border-collapse: collapse;
  136. text-align: left;
  137. font-size: 0.875rem;
  138. }
  139. th {
  140. background-color: #0f172a;
  141. color: var(--text-muted);
  142. font-weight: 600;
  143. padding: 14px 16px;
  144. text-transform: uppercase;
  145. font-size: 0.75rem;
  146. letter-spacing: 0.05em;
  147. border-bottom: 1px solid var(--border-color);
  148. }
  149. td {
  150. padding: 12px 16px;
  151. border-bottom: 1px solid var(--border-color);
  152. color: var(--text-main);
  153. }
  154. tr:hover {
  155. background-color: #334155;
  156. }
  157. tr.group-divider td {
  158. background-color: #0f172a;
  159. height: 8px;
  160. padding: 0;
  161. }
  162. .status-badge {
  163. display: inline-block;
  164. padding: 3px 10px;
  165. border-radius: 4px;
  166. font-weight: 600;
  167. font-size: 0.75rem;
  168. }
  169. .status-ok {
  170. background-color: var(--success-bg);
  171. color: var(--success-text);
  172. border: 1px solid rgba(74, 222, 128, 0.3);
  173. }
  174. .status-error {
  175. background-color: var(--danger-bg);
  176. color: var(--danger-text);
  177. border: 1px solid rgba(248, 113, 113, 0.3);
  178. }
  179. .text-error {
  180. color: var(--danger-text);
  181. font-weight: 600;
  182. }
  183. </style>
  184. </head>
  185. <body>
  186. <div class="container">
  187. <div class="header">
  188. <h1>ILO FAN Status</h1>
  189. <p>FANs <strong>[NUM]</strong> on <strong>[SNM]</strong> servers | Last update: DATE</p>
  190. </div>
  191. <div class="table-card">
  192. <table>
  193. <thead>
  194. <tr>
  195. <th>Hostname</th>
  196. <th>Model</th>
  197. <th>Fan</th>
  198. <th>Operational</th>
  199. <th>Speed (%)</th>
  200. <th>Health</th>
  201. </tr>
  202. </thead>
  203. <tbody>
  204. EOF
  205. }
  206. webend(){
  207. cat >> $WEB/index.html <<\EOF
  208. </tbody>
  209. </table>
  210. </div>
  211. </div>
  212. </body>
  213. </html>
  214. EOF
  215. NUM=$(cat $REP | egrep -v "HOSTNAME|---" | grep -i Fan | wc -l)
  216. SNM=$(cat $REP | egrep -v "HOSTNAME|---" | awk '{print $1}'| sort | uniq | wc -l)
  217. SITE=$(hostname -s | sed 's/-/ /g' | awk '{print $1}')
  218. sed -i "s/NUM/$NUM/g" $WEB/index.html
  219. sed -i "s/SNM/$SNM/g" $WEB/index.html
  220. sed -i "s/DATE/`date`/g" $WEB/index.html
  221. sed -i "s/SITE/$SITE/g" $WEB/index.html
  222. }
  223. webbody(){
  224. echo "------------------------------------------------------------------------------"
  225. echo -e "- \e[1;32mGenerating\e[0m webpage location"
  226. ZR=$(cat $REP | sort | egrep "ILO" | awk '{print $1}' | uniq)
  227. for z in $ZR; do
  228. IR=$(cat $REP | sort | grep $z | awk '{print $3}' | uniq)
  229. for i in $IR; do
  230. DHS=$(cat $REP | grep $z | grep $i | awk '{print $1}')
  231. MOD=$(cat $REP | grep $z | grep $i | awk '{print $2}')
  232. DID=$(cat $REP | grep $z | grep $i | awk '{print $4}')
  233. DCP=$(cat $REP | grep $z | grep $i | awk '{print $5}')
  234. DRA=$(cat $REP | grep $z | grep $i | awk '{print $6}')
  235. echo "<tr>" >> $WEB/index.html
  236. if [[ "$DID" != "Ok" ]] || [[ "$DRA" != "Ok" ]] || [[ "$DCP" -gt "$CPUT" ]]; then
  237. echo " <td class=\"text-error\">$DHS</td>" >> $WEB/index.html
  238. else
  239. echo " <td>$DHS</td>" >> $WEB/index.html
  240. fi
  241. echo " <td>$MOD</td>" >> $WEB/index.html
  242. echo " <td>$i</td>" >> $WEB/index.html
  243. if [[ "$DID" != "Ok" ]]; then
  244. echo " <td><span class=\"status-badge status-error\">$DID</span></td>" >> $WEB/index.html
  245. else
  246. echo " <td><span class=\"status-badge status-ok\">$DID</span></td>" >> $WEB/index.html
  247. fi
  248. if [[ "$DCP" -gt "$CPUT" ]]; then
  249. echo " <td class=\"text-error\">$DCP %</td>" >> $WEB/index.html
  250. else
  251. echo " <td>$DCP %</td>" >> $WEB/index.html
  252. fi
  253. if [[ "$DRA" != "Ok" ]]; then
  254. echo " <td><span class=\"status-badge status-error\">$DRA</span></td>" >> $WEB/index.html
  255. else
  256. echo " <td><span class=\"status-badge status-ok\">$DRA</span></td>" >> $WEB/index.html
  257. fi
  258. echo "</tr>" >> $WEB/index.html
  259. done
  260. echo "<tr class=\"group-divider\"><td colspan=\"6\"></td></tr>" >> $WEB/index.html
  261. done
  262. }
  263. #---------------------------- STATISTIC --------------------------------#
  264. notify(){
  265. NOTI=$(cat $REP | egrep -vw "Ok|HEALTH|------")
  266. if [ -z $NOTI ];
  267. then
  268. echo -e "- \e[1;32mNot\e[0m find [\e[1;33mfan\e[0m] issue"
  269. else
  270. echo -e "- \e[1;31mFind\e[0m [\e[1;33mfan\e[0m] issue"
  271. $NOTI > $EMA
  272. mutt -s "FAN issue - Notifikacia" "$YOURMAIL" <$EMA
  273. fi
  274. }
  275. #---------------------------- STATISTIC --------------------------------#
  276. stat(){
  277. ENDTIME=$(date +%s)
  278. RUNTIME=$(($ENDTIME - $STARTTIME))
  279. echo "------------------------------------------------------------------------------"
  280. echo -e "- Executing of the script was: (\e[1;33m$RUNTIME\e[0m sec)"
  281. echo "=============================================================================="
  282. cat $REP | column -t
  283. echo "=============================================================================="
  284. echo -e "- LOG file [\e[1;34m$REP\e[0m]"
  285. echo "=============================================================================="
  286. }
  287. #------------------------------- CORE ----------------------------------#
  288. clear
  289. checkping
  290. checksens
  291. webstart
  292. webbody
  293. webend
  294. notify
  295. stat