用zmud telnet方式登录交换机、路由器,查询相关信息加入数据库的方法


路由器通常有通用软件通过http snmp等方式管理监控,但是通用软件往往不够灵活,最终管理员们还是使用telnet。
在大量新交换机初始配置的时候,telnet也是必不可少的,人们开发了各种程序来实现自动登录、简单配置。
如果使用zmud,这一切将更加容易。哪怕是复杂的查询、加入数据库,zmud实现起来也很简单。
比如,telnet进入交换机,输入sh arp,将显示该交换机中缓存的ip mac对照表:
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.0.5 1 0011.9c7b.5d4a ARPA Vlan1
….
–More– (空格键继续)
相关的信息保存到数据库,可以很方便的查询作图、分析。
这些实现起来很简单,诚三在北侠maper、ice等高人的帮助下,历时3天总结出来,实现的核心仅仅是2个zmud触发器。
1、用zmud创建一个叫做ip的数据库,字段全部为text,ipmac ip mac age vlan time
其中time取当前系统时间,便于以后查询。ipmac是ip mac的组合字符串,冗余数据便于查询
2、创建2个触发器


#CLASS {ip} #TRIGGER {–More–} {#sendp “ ”} “” {prompt} #TRIGGER {^??Internet%s(%x)%s(%x)%s(%x)%s%x%s(%x)} {

#addkey ip {ipmac=%1m%3|ip=%1|mac=%3|age=%2|vlan=%4|time=%time( c)}
#if (%find( @ip.ipmac)) {#dbput {%find( @ip.ipmac)} {@ip}} {#new all {@ip}}
}

#CLASS 0


说明: {#sendp “ ”} “” {prompt}是关键之一,用于发送一个空格到–More–末尾,–More–属于提示类,不是正常输出字符。
如果用#send “ “输入单独一个空行,包含空格,就会造成大量重复性记录被输入数据库。
另一个关键当然是如何匹配文本,取得ip mac数据,输入数据库了。
#addkey表示将取到的数据放在一个临时的变量ip(记录型变量),ip和mac联合的ipmac作为检索字段,中间用一个字母m连接,因为用减号连接也会造成数据检索不准确。
#if判断ip mac记录在数据库是否存在,存在就更新(因为以后还可以更新对应的端口之类数据),不存在就用#new输入。
@ip.ipmac表示记录型变量@ip中ipmac对应的值。


附zmud7.21数据库操作的基本命令和使用心得:

list变量操作命令
列表变量就像是一维数组,比如@ll可以保存{aa|bb|cc}
可以用@ll.1 @ll.2访问其中的数据,可以用@push添加一个数据,或者%pop弹出第一个数据
#for @ll {#say %i}也可以实现对@ll所有数据的检索。诚三曾经将很多rec变量(记录型变量)压入list变量,需要的时候再取出处理,也是成功的,要是有大量临时数据处理,又不想设计数据库,也许是解决方法。只是zmud设计的时候可能没有考虑这样的方法,不知道稳定性如何。
其他的命令还有:ADDITEM、DELITEM、DELNITEM用来对list变量添加删除数据。

数据库变量命令
诚三的习惯称呼是记录型变量、rec变量,比如上文中的@ip,因为其实质格式就类似于数据库的一条记录。诚三强烈推荐大家使用这种变量来保存一组类似的输入,比如北侠输入hp查看状态,共显示8项内容,如果你用普通变量保存,需要超过14-20个变量,维护修改查看都非常不直观,用rec变量@hp一个就足够了,我们可以用@hp.nowfood @hp.maxfood表示食物的当前值和最大值,用@hp.nowexp @hp.oldexp表示exp的当前值和上次查询的数值,@hp.nowexp-@hp.oldexp很容易计算出exp增加速度。
其他的命令还有:ADDKEY、DELKEY、SHOWDB,从rec变量添加、删除一项数据,显示rec变量全部内容。
LOOPDB循环遍历,比如#LOOPDB @hp {#say %key ”=” %val},将显示nowexp=100 oldexp=90等内容。

数据库命令
DBLOAD、DBCLOSE、DBSAVE 打开、关闭、保存数据库,其他应用不是几句话能说清楚,还是需要仔细查看zmud帮助文档的。
VIEW sets or defines a database view
FIND filters the database view to find items
QUERY filters the database view to find items
DBRESET resets the view filters
DBGET sets the current database record to a given record
DBPUT stores new values in a database record
DBFIRST sets the current record to the first in the view
DBNEXT sets the current record to the next in the view
DBPREV sets the current record to the previous in the view
DBDELETE deletes a record in the database
LOOPVIEW loop through records in a view
NEW create a new database record
DBOFFLINE work in editor without effecting user interface
DBONLINE work in editor and effect user interface


后记:
就这么2行简单的触发器,很短的时间就写出来了初步脚本,可是入库数据总是有重复,在北侠论坛得到ice maper duno didd的热情帮助,历时3天不断查阅资料、多次尝试,才得以通过,写出来给辛苦调试朋友共勉。
http://www.pkuxkx.com/forum/thread-6920-1-1.html中,最后maper提到他用#send的方法输入测试数据,于是诚三完全按照maper的步骤操作,通过!把sh arp得到的数据保存到c:\a.txt,多次#send,我的触发器也准确的采集到了期待数据。其间可以看到a.txt中的内容在zmud缓慢滚过,于是终于确定捕捉数据的tr没有问题,问题还是交换机回显数据上。多次尝试、详细遍历zmud help文档,有一次测试#sendp c,发现没有任何字符显示到zmud窗口,竟然试问题得以解决!