################################################# # Функции по определению качества каналов связи # ################################################# #Считает кол-во удачных пингов. Хосты берутся с stdin. пустые строки #пропускаются. В качестве аргумента - IP от которого пинговать #return: count pingcount() { chk_arg $1 count=0 while read str; do if [ "$str" != "" ]; then ping -c 1 -S $1 $str > /dev/null if [ $? -eq 0 ]; then count=$(expr $count + 1) fi fi done return $count } #Посчитать качество канала связи. #$1 - интерфейс, $2 - SrcIP, $3 - множитель для данного канала #$4 - путь до файла со списком хостов которые надо ping-овать или просто # одиночный хост который надо ping-ануть #return: quality getquality() { echo -n "getquality (if=$1 srcip=$2): " #Если параметров меньше чем 4 то возвращается 0. if [ "$4" = "" ]; then echo must be 4 arguments return 0; fi #Если интерфейс отсутсвует то возвращается 0. checkif $1 if [ $? -ne 0 ]; then echo no interface return 0; fi #Если интерфейс не активен то возвращается 0. #Это работает не надежно - не на всех сетевых платах :-( #checkif_active $1 #if [ $? -ne 0 ]; then # echo interface not active # return 0; #fi #Если у интерфейса нету такого SrcIP то возвращается 0. getif_ip $1 > /tmp/checkchanels.tmp ip=`grep $2 < /tmp/checkchanels.tmp | sort -u` if [ "$ip" != "$2" ]; then echo no valid srcip return 0; fi #Далее считается кол-во прошедших пингов (от заданного SrcIP) #по заданному списку хостов или к отдельному хосту и умножается на #заданный множитель. if [ -f $4 ]; then echo start ping count pingcount $2 < $4 else echo start one ping to: $4 echo $4 | pingcount $2 fi q=$(expr $? \* $3) return $q }