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.4KB

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