冗余链路检查
在一个大的IP网上,冗余做得一般都很好,基本上避免了单点故障对网络的影响。例如当汇聚层至骨干层的一条中继出现故障、甚至一个骨干层设备出现故障时,通过动态路由的自动调整,网络实现自愈合,不会对用户造成影响。
但这又出现了另外一个问题:这就是我们怎么能够及时发现网络出现问题了呢?特别是那些由于冗余存在,无用户申告的故障;或者是冗余线路出现了问题等。
使用网管系统和日志服务器当然是一个好的解决办法,我这里利用shell脚本和expect程序,实现了检测全网IP设备的工作状态,对冗余链路进行检查。该程序的依据有如下几点:
1、 每个汇聚层设备都有多条中继和骨干层设备相连,一般是两条;
2、 如果一个汇聚层设备所有中继都断了,那就用不着我们这个程序来检测了――用户早就把热线电话打爆了^_^;
3、 如果汇聚层设备和骨干层设备的动态路由(我这里用的是OSPF)邻居关系建立完好,那么说明中继没有问题;
4、 如果动态路由的邻居关系没有建立起来,那就认为中继有问题;
5、 如果动态路由的邻居关系不是FULL状态,而是INIT等状态,那需要网管人员去检查了;
一、程序介绍和流程图
该程序的主程序是shell程序“network_detect.sh”,它将会调用expect程序“network_detect.exp”并使用参数文件“data/routerlist”。如图1所示,该程序的思路如下:
1、 通过对所有骨干层设备进行信息采集,得到动态路由(我这里是OSPF)邻居建立关系的信息;
2、 分析获得的信息,得到每个汇聚层设备的OSPF邻居关系信息;
3、 判断每个汇聚层设备的OSPF邻居数目,如果建立有不少有两个邻居,则认为该汇聚层设备的中继均是好的;如果一个汇聚层设备只有一个OSPF邻居,则认为该汇聚层设备的冗余线路中断了;
l am sorry and can't upload the 流程图 !!!
二、shell程序“network_detect.sh”
#!/bin/sh
#cpss在 2004 年 4 月 22 日 编写
#如有问题,可以发信到cpss@cpss.zz.ha.cn
#除了后期增加的中文注释,程序经过了严格测试
#由于所有汇聚层设备(6509)都是双上联,所以我编制本程序来得到所有骨干层设备的OSPF邻居信息
#并分析出哪些汇聚层设备由于故障或其他原因变成了单上联
#
#该程序需要调用expect程序network_detect.exp和使用参数文件data/routerlist
#
#
#程序开始
#删除旧的临时文件,以免影响运行结果
rm -f mylogfile 6509error mytmpfile* 6509output
#循环调用expect程序,来获得路由器上的信息
while read GSRNAME GSRADDR
do
./network_detect.exp $GSRNAME $GSRADDR router_user router_passwd
#我担心运行速度太快了,会影响expect程序写日志文件,让程序歇2秒再接着干
sleep 2
done <data/routerlist
#本程序只考察千兆中继,所以过滤一下
egrep "GigabitEthernet|#sh" mylogfile >mytmpfile1
#处理日志文件,获得OSPF邻居建立正常和不正常的列表
GSRNAME="NULL"
S6509IP="NULL"
while read LINE
do
para1=`echo $LINE|awk '{print $1}'`
para2=`echo $LINE|awk '{print $2}'`
if [ $para2 = "ip" ]
then
GSRNAME=`echo $para1|awk -F# '{print $1}'`
else
S6509IP=$para1
linkstate=`echo $LINE|awk '{print $3}'`
linkstate=`echo $linkstate|awk -F/ '{print $1}'`
if [ $linkstate = "FULL" ]
then
printf "%b/t%b/n" $S6509IP $GSRNAME >>mytmpfile_output
else
printf "%b/t%b/t%b/n" $S6509IP $GSRNAME $linkstate >>6509error
fi
fi
done<mytmpfile1
sort mytmpfile_output>mytmpfile3
#检查是否有6509处于单上联状态
number=1
last_6509="6509_IP"
last_node="node_name"
while read para1 para2
do
if [ $para1 = $last_6509 ]
then
number=`expr $number + 1`
else
if [ $number -eq 1 ]
then
printf "%b/t%b/n" $last_6509 $last_node >>6509_output
fi
last_6509=$para1
last_node=$para2
number=1
fi
done<mytmpfile3
#分析最后一条记录是否需要打印
if [ $number -eq 1 ]
then
printf "%b/t%b/n" $last_6509 $last_node >>6509_output
fi
rm -f mytmp*
cat 6509_output
三、expect程序“network_detect.exp”
#!/usr/bin/expect
#cpss在 2004 年 4 月 22 日 编写
#如有问题,可以发信到cpss@cpss.zz.ha.cn
#除了后期增加的中文注释,程序经过了严格测试
#由于所有汇聚层设备(6509)都是双上联,所以我编制本程序来得到所有骨干层设备的OSPF邻居信息
#并分析出哪些汇聚层设备由于故障或其他原因变成了单上联
#
set GSRNAME [lindex $argv 0]
set GSRADDR [lindex $argv 1]
set username [lindex $argv 2]
set passwd1 [lindex $argv 3]
set timeout 10
set postbuffer ""
send_user "/n$GSRNAME/n"
send_user "/n"
spawn telnet $GSRADDR
expect Username
send "$username/r"
expect "Password"
send "$passwd1/r"
expect {
"#" {
send "/r"
} Password {send_user "the password is wrong/n";exit
} timeout {send_user "can not connect to the router/n";exit
} eof {
send_user /
"connection to host failed: expect_out(buffer)"
exit
}
}
#设置日志文件,记录OSPF邻居关系信息
log_file mylogfile
set debug_flag 1
#the blow is attahed by program
expect #
send "sh ip osp nei /r"
expect #
send " /r"
expect #
send "exit /r"
四、参数文件“data/routerlist”
router1 192.168.1.1
router2 192.168.1.2
router3 192.168.1.3
router4 192.168.1.4