北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
楼主: chengsan

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

[复制链接]
 楼主| 发表于 2009-6-25 10:51:21 | 显示全部楼层
问题解决了,感谢ice感谢maper感谢duno感谢ddid感谢所有参与本贴讨论的朋友,感谢pkuxkx.com
先小结一下:
用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窗口,竟然试问题得以解决!

[ 本帖最后由 chengsan 于 2009-6-25 03:13 PM 编辑 ]

评分

参与人数 1精华 +30 收起 理由
icer + 30

查看全部评分

北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2009-6-25 14:53:12 | 显示全部楼层
最后单独感谢maper
下一步修改标题、如果符合放入wiki的条件,是否收录。

议论一下触发条件的高级用法:
{^??Internet%s(%x)%s(%x)%s(%x)%s%x%s(%x)}
按照zmud help的介绍,如果写为#TRIGGER {^??Internet%s&{ip}%s&{age}%s&{mac}%s%x%s&{vlan}}
看起来应该更直观,在实际应用的mud中,这样的方法非常可取,可以让tr更容易阅读和修改维护。
只是本例不行&{ip}由于可以使任何类型数据,实际运行后@ip的值包含了后面的空格以及age的值。

[ 本帖最后由 chengsan 于 2009-6-25 03:35 PM 编辑 ]
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-6-25 15:41:48 | 显示全部楼层
chat* niub
chat* bigniub!
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-6-25 15:43:49 | 显示全部楼层
你看看适合收录在wiki zmud专题哪个题目下面,修改一下题目啥的,放进去就行
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-6-25 17:54:27 | 显示全部楼层
好象是用zmud维护网络设备?
这个实在是太nb了.
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-6-25 19:31:28 | 显示全部楼层
%find( @ip.ipmac)还可以写得更严格一些,如果数据库中ipmac不是处于第一栏,这样就会出错。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-6-25 19:53:26 | 显示全部楼层
#dbput (%find())  {} 这种复合函数表达式解释为原子型操作?
很好很强大 囧
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-6-25 20:42:59 | 显示全部楼层
例外测试
#if (%find( %1)) {#dbput %find( %1) {name=%1|value=%2}} {#new all {name=%1|value=%2}}
然后两个alias测试
test1 {#loop 1,1000 {#show Test %i %{i}}}
test2 {#loop 1,1000 {#show Test %i %{i}ex2}}
1000条记录
true    33s  已有记录
false   8s   新纪录
对已存在记录的修改用时更长几倍,可见(#dbput %find)应该是有特殊处理
--------------------------
正常情况下,先test1生成新纪录 8s,test1结束后 test2修改记录 30+s
总共1000条记录
--------------------------
下面开始折腾下它  囧tz
test1,在其8秒执行时间结束前test2
zmud中断test1,开始执行test2
在test2结束后,继续执行test1
结果数据库中出现了2000条记录,即test2和test1
--------------------------
把test1,test2中的loop次数改为100
然后以 "test1;test2"的方式连续输入5次
最终数据库中存有267条记录
267条记录分为三段,前面67条一段,后面每100条一段
每一段都是连续的,且name均字段从1开始
--------------------------

[ 本帖最后由 duno 于 2009-6-25 09:02 PM 编辑 ]
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2009-6-25 21:48:25 | 显示全部楼层
原帖由 maper 于 2009-6-25 07:31 PM 发表
%find( @ip.ipmac)还可以写得更严格一些,如果数据库中ipmac不是处于第一栏,这样就会出错。

开始做的时候,受cmud影响,那个find只能检索第一列
zmud find默认也是检索第一列,更复杂的查询,用query也比较好
因为默认的原因,并且2个查询的结果都差不多,所以我猜测find也许检索第一列速度能快一点
毕竟字符串对比,速度本来就不会很快

[ 本帖最后由 chengsan 于 2009-6-25 09:50 PM 编辑 ]
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2009-6-25 22:05:11 | 显示全部楼层
原帖由 duno 于 2009-6-25 07:53 PM 发表
#dbput (%find())  {} 这种复合函数表达式解释为原子型操作?
很好很强大 囧

我觉得dbput对应的sql语句就是update
zmud取巧,自己内置了一个关键字
find 对应的应该是select key from ** where **
其返回的是一个list变量,我们实际工作在其容错状态,取第一条数据
联合select语句,本身就很强大,阅读难度不亚于正则表达式

脚本语言本身就不会太严格,所以高压测试只是无奈之举,打算遇到高压运行出错再去研究
现在先把东西作出来。
只是不知道把多个rec变量 push 一个list变量,list变量实际的作用是一个内存数据表
这是不是zmud的容错状态,此状态就意味着不稳定。
zmud的rec list变量也很强大,从导出的文本,或者直接看class中的代码,很难分辨
比如我把几个个{“a=1|b=2”}格式数据 push list变量,再把list.1输出到一个变量a,得到的a是list变量
但是把{a=1|b=2}保存成rec变量,然后push、输入到a,a就是rec变量
从class文本中,根本看不出区别
有时间和duno探讨
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-24 06:59 PM , Processed in 0.009978 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表