#!/bin/sh HOSTS_FILES="$HOME/.hosts_scanner" #HOSTS_FILES="/tmp/hosts" verbose=0 res_file=$(mktemp -t hosts_scanner.XXXXXXXXXX) pids="" date_cmd="date --rfc-3339=s" lock="${res_file}.lock" clean_exit() { echo "Ctrl+C pressed, exiting..." for pid in $(echo $pids) do kill $pid echo $pid killed done rmdir ${res_file}.lock 2>/dev/null rm -v $res_file 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 lock="$3" 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 5 done } for h in $(cat "$HOSTS_FILES") do printf "%30s %8s %30s\n" $h "unknw" "unknwn" >> $res_file done for h in $(cat "$HOSTS_FILES" ) do upd_ping $h $res_file $lock & pid=$! pids="${pids}\n$pid" echo "$h updated by $pid" >&2 done sleep 1 while [ 1 ] do 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 1 done