123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- #!/bin/sh
- REFRESH=2
- HOSTS_FILES="$HOME/.hosts_scanner"
- verbose=0
- res_file=$(mktemp -t hosts_scanner.XXXXXXXXXX)
- date_cmd="date --rfc-3339=s"
-
- lock="${res_file}.lock"
-
- pids=""
- clean_exit() {
- clear
- reset
- echo "Ctrl+C pressed, exiting..."
- for pid in $(echo $pids)
- do
- echo killing $pid
- kill $pid
- done
- for pid in $(echo $pids)
- do
- wait $pid
- echo $pid killed
- done
- rmdir ${res_file}.lock 2>/dev/null
- rm -v $res_file
- exit 0
- }
-
- cidr_pids=""
- clean_cidr() {
- echo "CIDR killed, cleaning..."
- for pid in $(echo $cidr_pids)
- do
- echo CIDR killing $pid
- kill $pid
- wait $pid
- echo CIDR $pid killed
- done
- exit 0
- }
-
- semlock() {
- while [ 1 ]
- do
- mkdir $1 2>/dev/null && break
- done
- }
-
- semrelease() {
- rmdir $1
- }
-
- trap clean_exit 2
-
- upd_ping() {
- # update ping stat file
- # $1 host
- # $2 file
- # $3 lock
- # $4 delay
-
- lock="$3"
- test -z "$4" && delay=5 || delay=$4
- last_up="never"
-
- while [ 1 ]
- do
- rep=$(ping -qc 1 $1 2>/dev/null )
- ret=$?
- rep=$(echo $rep | sed -nE 's/.*rtt min\/avg\/max\/mdev = [0-9]+\.[0-9]+\/([0-9]+\.[0-9]+)\/.*$/\1/p')
- rehost=$(echo $h|sed 's/\./\\./g')
-
- semlock $lock
-
-
- if [ $ret -eq 0 ]
- then
- last_up=$($date_cmd)
- #echo "${res}$rep $hstr $last_up" >> $2
- else
- rep="down"
- #echo "${res}down $hstr $last_up" >> $2
- fi
-
- sed -i "s/^\\s*$rehost\\s.*$/$(printf "%30s %8s %30s\n" $1 $rep "$last_up")/" "$2"
-
- semrelease $lock
-
- sleep $delay
- done
- }
-
- cidr_scan() {
- # cidr ping scan
- # $1 cidr
- # $2 result file
- # $3 lock
- # $4 delay
-
- test -z "$4" && delay=5 || delay=$4
-
- trap clean_cidr 15
- while [ 1 ]
- do
- semlock $lock
- echo "CIDR scanning $1" >&2
- semrelease $lock
-
- for h in $(nmap -sP -oG - $1 | grep "Up$" | cut -d " " -f 2)
- do
- rehost=$(echo $h|sed 's/\./\\./g')
- if grep " $rehost " $2 > /dev/null
- then
- continue
- else
- printf "%30s %8s %30s\n" $h "unknw" "unknwn" >> $res_file
- upd_ping $h $2 $3 &
- pid=$!
- cidr_pids="${cidr_pids}\n$pid"
-
- semlock $lock
- echo "$pid scanning $h" >&2
- semrelease $lock
- fi
- done
-
- semlock $lock
- echo "CIDR scanned $1" >&2
- semrelease $lock
-
- sleep $delay
- done
- }
-
- # prepopulate file
- for h in $(cat "$HOSTS_FILES")
- do
- if echo $h |grep -v '/' > /dev/null
- then
- printf "%30s %8s %30s\n" $h "unknw" "unknwn" >> $res_file
- fi
- done
-
- # run scanners
- for h in $(cat "$HOSTS_FILES" )
- do
- if echo $h |grep -v '/' > /dev/null
- then
- upd_ping $h $res_file $lock 5 &
- else
- # cidr scan
- cidr_scan $h $res_file $lock 10 &
- fi
- pid=$!
- pids="${pids}\n$pid"
- echo "$h updated by $pid" >&2
- done
- sleep 1
-
- while [ 1 ]
- do
- #sleep 1
- #continue
-
- semlock $lock
- clear
- echo "Ping radar $($date_cmd)\n"
- printf "%30s %8s %30s\n" "host" "ping" "last up"
- for i in $(seq 70); do echo -n "="; done
- echo ""
-
- #cat $res_file
-
- #grep -v " down " $res_file
- #grep " down " $res_file
-
- sed -E -e "s/\snever$/$(tput sgr0)\0/" -e "s/^.* down .*$/$(tput setaf 1)\0$(tput sgr0)/" $res_file
-
- semrelease $lock
- sleep $REFRESH
- done
|