Ping Radar : ping a list of hosts and display response time
sh
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

test.sh 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #!/bin/sh
  2. REFRESH=2
  3. HOSTS_FILES="$HOME/.hosts_scanner"
  4. verbose=0
  5. res_file=$(mktemp -t hosts_scanner.XXXXXXXXXX)
  6. date_cmd="date --rfc-3339=s"
  7. lock="${res_file}.lock"
  8. pids=""
  9. clean_exit() {
  10. clear
  11. reset
  12. echo "Ctrl+C pressed, exiting..."
  13. for pid in $(echo $pids)
  14. do
  15. echo killing $pid
  16. kill $pid
  17. done
  18. for pid in $(echo $pids)
  19. do
  20. wait $pid
  21. echo $pid killed
  22. done
  23. rmdir ${res_file}.lock 2>/dev/null
  24. rm -v $res_file
  25. exit 0
  26. }
  27. cidr_pids=""
  28. clean_cidr() {
  29. echo "CIDR killed, cleaning..."
  30. for pid in $(echo $cidr_pids)
  31. do
  32. echo CIDR killing $pid
  33. kill $pid
  34. wait $pid
  35. echo CIDR $pid killed
  36. done
  37. exit 0
  38. }
  39. semlock() {
  40. while [ 1 ]
  41. do
  42. mkdir $1 2>/dev/null && break
  43. done
  44. }
  45. semrelease() {
  46. rmdir $1
  47. }
  48. trap clean_exit 2
  49. upd_ping() {
  50. # update ping stat file
  51. # $1 host
  52. # $2 file
  53. # $3 lock
  54. # $4 delay
  55. lock="$3"
  56. test -z "$4" && delay=5 || delay=$4
  57. last_up="never"
  58. while [ 1 ]
  59. do
  60. rep=$(ping -qc 1 $1 2>/dev/null )
  61. ret=$?
  62. rep=$(echo $rep | sed -nE 's/.*rtt min\/avg\/max\/mdev = [0-9]+\.[0-9]+\/([0-9]+\.[0-9]+)\/.*$/\1/p')
  63. rehost=$(echo $h|sed 's/\./\\./g')
  64. semlock $lock
  65. if [ $ret -eq 0 ]
  66. then
  67. last_up=$($date_cmd)
  68. #echo "${res}$rep $hstr $last_up" >> $2
  69. else
  70. rep="down"
  71. #echo "${res}down $hstr $last_up" >> $2
  72. fi
  73. sed -i "s/^\\s*$rehost\\s.*$/$(printf "%30s %8s %30s\n" $1 $rep "$last_up")/" "$2"
  74. semrelease $lock
  75. sleep $delay
  76. done
  77. }
  78. cidr_scan() {
  79. # cidr ping scan
  80. # $1 cidr
  81. # $2 result file
  82. # $3 lock
  83. # $4 delay
  84. test -z "$4" && delay=5 || delay=$4
  85. trap clean_cidr 15
  86. while [ 1 ]
  87. do
  88. semlock $lock
  89. echo "CIDR scanning $1" >&2
  90. semrelease $lock
  91. for h in $(nmap -sP -oG - $1 | grep "Up$" | cut -d " " -f 2)
  92. do
  93. rehost=$(echo $h|sed 's/\./\\./g')
  94. if grep " $rehost " $2 > /dev/null
  95. then
  96. continue
  97. else
  98. printf "%30s %8s %30s\n" $h "unknw" "unknwn" >> $res_file
  99. upd_ping $h $2 $3 &
  100. pid=$!
  101. cidr_pids="${cidr_pids}\n$pid"
  102. semlock $lock
  103. echo "$pid scanning $h" >&2
  104. semrelease $lock
  105. fi
  106. done
  107. semlock $lock
  108. echo "CIDR scanned $1" >&2
  109. semrelease $lock
  110. sleep $delay
  111. done
  112. }
  113. # prepopulate file
  114. for h in $(cat "$HOSTS_FILES")
  115. do
  116. if echo $h |grep -v '/' > /dev/null
  117. then
  118. printf "%30s %8s %30s\n" $h "unknw" "unknwn" >> $res_file
  119. fi
  120. done
  121. # run scanners
  122. for h in $(cat "$HOSTS_FILES" )
  123. do
  124. if echo $h |grep -v '/' > /dev/null
  125. then
  126. upd_ping $h $res_file $lock 5 &
  127. else
  128. # cidr scan
  129. cidr_scan $h $res_file $lock 10 &
  130. fi
  131. pid=$!
  132. pids="${pids}\n$pid"
  133. echo "$h updated by $pid" >&2
  134. done
  135. sleep 1
  136. while [ 1 ]
  137. do
  138. #sleep 1
  139. #continue
  140. semlock $lock
  141. clear
  142. echo "Ping radar $($date_cmd)\n"
  143. printf "%30s %8s %30s\n" "host" "ping" "last up"
  144. for i in $(seq 70); do echo -n "="; done
  145. echo ""
  146. #cat $res_file
  147. #grep -v " down " $res_file
  148. #grep " down " $res_file
  149. sed -E -e "s/\snever$/$(tput sgr0)\0/" -e "s/^.* down .*$/$(tput setaf 1)\0$(tput sgr0)/" $res_file
  150. semrelease $lock
  151. sleep $REFRESH
  152. done