测多播很长时间了,从最开始igmp snooping,igmp,到pim-dm,再到pim-sm, rfc一天比一天熟悉了,但是好像自己的测试效率也没有提高多少,回想了一下,多播测试的时候,在上层协议测过多遍的情况下,多播的问题多数不再是协议了,而是不同产品的底层芯片和上层同步上可能出现问题。这里就出现了问题,不同产品,芯片和上层的映射关系多数都是不一样的,很多时间,我们都花在去查找,去记忆这些映射关系上了。既然,这里是效率的瓶颈,咱不妨自动化一把。
考虑到如果自动化分析底层、上层是否一致的话,至少需要知道3个关系:上层show ip mroute、show vlan,底层ipmc table show,这些命令的结果必须提供,为了可视化,脚本就嵌入到html中。
(Ps:不做不知道,一做吓一跳!vbs对文本,搜索遍历,获取关键字,排序,删除数组某元素等问题,这些东西,花了我好几个通宵,才逐一搞定!累啊,不过很有成就感!^_^!)
下面是代码,目前只分析了上层上游口、下游口是svi的情况,没有考虑ap、routed port的情况,以后会考虑优化,有时间再放上来!
代码最近一次的更新(2007-06-03 星期日 4:23:58.53):点击这里
< head >
< title > 底层位图和物理端口映射关系 </ title >
</ head >
< body >
请选择线卡类型:
< select size ="1" name ="linecard" >
< option value ="1" > 86_24sfp </ option >
< option value ="2" > 86_24gt </ option >
< option value ="3" > 86_48gt_unit0 </ option >
< option value ="4" > 86_48gt_unit1 </ option >
</ select >
< br >
请输入你要转换的ipmc table show中的位图:
< input name ="l3_bitmap" type ="text" value ="" >
< input type ="Button" NAME ="Button1" value ="转换" >
底层:
< textarea name ="port_phy" type ="textfield" value ="" cols ="5" rows ="15" ></ textarea >
上层:
< textarea name ="intf_set" type ="textfield" value ="" cols ="5" rows ="15" ></ textarea >
< br >
< br >
sh ip mroute得到上游口、下游口:
< input type ="Button" NAME ="Button2" value ="get" >
< br >
< textarea name ="sh_mroute" type ="textfield" value ="" cols ="80" rows ="10" ></ textarea >
上游口:
< textarea name ="incoming" type ="textfield" value ="" cols ="10" rows ="10" ></ textarea >
下游口:
< textarea name ="outgoing" type ="textfield" value ="" cols ="10" rows ="10" ></ textarea >
< br >
< br >
sh vlan得到接口的vlan分布:
< input type ="Button" NAME ="Button3" value ="computer" >
请输线卡卡槽:
< input name ="lc_slot" type ="text" value ="2" maxlength =1 size =2 >
< br >
< textarea name ="sh_vlan" type ="textfield" value ="" cols ="100" rows ="60" ></ textarea >
< textarea name ="intf_dis" type ="textfield" value ="" cols ="20" rows ="60" ></ textarea >
< SCRIPT FOR ="Button1" EVENT ="onClick" LANGUAGE ="VBScript" > ... '添加新的线卡类型时,需要再此添加ssp->物理接口的关系,
'还有上面的select选择框也需要添加对应的选项
if (l3_bitmap.value <> "") then
dim ssp_phy_24sfp,ssp_phy_24gt,ssp_phy_48gt0,ssp_phy_48gt1,ssp_phy
ssp_phy_24sfp = Array(2,1,4,3,6,5,8,7,10,9,12,11,14,13,16,15,18,17,20,19,22,21,24,23)
ssp_phy_24gt = Array(3,4,1,2,7,8,5,6,11,12,9,10,15,16,13,14,19,20,17,18,23,24,21,22)
ssp_phy_48gt0 = Array(2,1,4,3,6,5,8,7,10,9,12,11,14,13,16,15,18,17,20,19,22,21,24,23)
ssp_phy_48gt1 = Array(26,25,28,27,30,29,32,31,34,33,36,35,38,37,40,39,43,44,41,42,47,48,45,46)
lc_type = linecard.value
Select Case lc_type
Case "1" ssp_phy = ssp_phy_24sfp
Case "2" ssp_phy = ssp_phy_24gt
Case "3" ssp_phy = ssp_phy_48gt0
Case "4" ssp_phy = ssp_phy_48gt1
Case Else MsgBox "错误"
End Select
l3_map = l3_bitmap.value
port_phy.value = ssp_to_phy(l3_map,ssp_phy)
port_phy.value = Order(port_phy.value)
end if
</ SCRIPT >
< SCRIPT FOR ="Button2" EVENT ="onClick" LANGUAGE ="VBScript" > ...
if (sh_mroute.value <> "") then
chang_line = chr(13) & chr(10)
vlan_line = split(sh_mroute.value,chang_line,-1,1)
vlan_line_length = UBound(vlan_line)
incoming.value = ""
outgoing.value = ""
m = 0
do
If IsExist(vlan_line(m),"Incoming") Then
incoming.value = GetKey(vlan_line(m),"d+",0)
End If
If IsExist(vlan_line(m),"Outgoing") Then
do '找到出口列表时,继续向下遍历,到最后一行
outgoing.value = GetKey(vlan_line(m),"d+",0) + outgoing.value
m = m + 1
loop while(m <= vlan_line_length)
End If
m = m + 1 '这时实际m值已经为最大值+1了,这里再次加1,m值变为最大+2
loop while(m <= vlan_line_length)
outgoing.value = Order(outgoing.value)
end if
</ SCRIPT >
< SCRIPT FOR ="Button3" EVENT ="onClick" LANGUAGE ="VBScript" > ...
if ((sh_vlan.value <> "") And(lc_slot.value <> "")) then
chang_line = chr(13) & chr(10)
v_line = split(sh_vlan.value,chang_line,-1,1)
v_line_length = UBound(v_line)
vlan_set = split(outgoing.value,chang_line,-1,1)
vlan_set_length = UBound(vlan_set)
do
i = 0
if(vlan_set(vlan_set_length-i) = "") then
vlan_set_length = vlan_set_length - 1
i = i + 1
end if
loop while(vlan_set(vlan_set_length) = "") '去除后面的空字符
intf_dis.value = ""
key_fuzhu = lc_slot.value & "/" '后面将把搜索到诸如"2/1",前面的"2/"删除
lc_port = lc_slot.value & "/d+"
n = 0
i = 0
do
a = "VLANd*" & vlan_set(i)
If IsExist(v_line(n),a) Then '如果找到vlan(i),那么显示vlan(i),并继续向下找端口
intf_dis.value = intf_dis.value & GetKey(v_line(n),"VLANd+",-1) &_
Replace(GetKey(v_line(n),lc_port,-1),key_fuzhu,"")
intfs = intfs & Replace(GetKey(v_line(n),lc_port,-1),key_fuzhu,"")
n = n + 1 '跳到下一行
while((n <= v_line_length) And (Not IsExist(v_line(n),"VLANd+"))) '如果找不到vlanxx,不显示valnxx,但继续向下找端口,直到找到下一个vlanxx时,跳出
intf_dis.value = intf_dis.value & Replace(GetKey(v_line(n),lc_port,-1),key_fuzhu,"")
intfs = intfs & Replace(GetKey(v_line(n),lc_port,-1),key_fuzhu,"")
n = n + 1
wend
i = i + 1 'vlan(i)一论搜索结束,调到下一个vlan(i+1)
else
n = n + 1 '这里需要注意,在if为真时,有一个n=n+1,那么这里就不应该在end if后添加n+1,而应该在else下添加n+1
End If
loop while((n <= v_line_length) And (i <= vlan_set_length))
intfs = Order_onlyone(intfs)
intf_set.value = intfs
Pass = "表项一致"
Fail = " 表项不一致!" & chr(13) & chr(10) & "致电黄米青!电话:8595"
if(StrComp(intf_set.value,port_phy.value) = 0) then
MsgBox Pass,64, "Pass"
else
msgbox Fail,48,"Fail"
end if
end if
</SCRIPT>
<!--以下是各个自定义函数-->
<SCRIPT LANGUAGE="VBScript">
Function ssp_to_phy(l3_bitmap,ssp_phy) '功能:转换ssp的位图为物理接口
'参数:1、类型:字符串,位图;2、类型:数组,ssp->物理接口的关系
'返回值:类型string,位图为1对应的所有物理接口,且接口间以回车为间隔的组成的一个字符串
length_l3_bitmap = len(l3_bitmap)
i = 1 '在i小于位图的16进制数的个数时,一直循环,总共要循环(i*4)次
while(i <= length_l3_bitmap)
temp = Mid(StrReverse(l3_bitmap),i,1) 'Mid函数从右向左提取字符,故先反转位图。这里表示依次从l3位图中提取一个16进制数
bin_temp = HexToBin(temp) '调用16进制转2进制函数
l3_bin = StrReverse(bin_temp) '同样道理,因为下面还用使用Mid函数,反转2进制位图
j = 1
while(j <= 4) '16进制数变为2进制,4:1,故循环4次
if(Mid(l3_bin,j,1) = 1) then
ssp_index = (i-1) * 4 + j - 1 '计算当前操作的bit位,在位图中的位置
phy_index = ssp_phy(ssp_index)
ssp_to_phy = phy_index & chr(13) & chr(10)& ssp_to_phy
end if
j = j + 1
wend
i = i + 1
wend
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function HexToBin(str_hex) '功能:16进制数转换为2进制数
'参数:类型:字符,16进制数
'返回值:类型:字符串,4位2进制数
Select Case str_hex
Case "0" HexToBin = "0000"
Case "1" HexToBin = "0001"
Case "2" HexToBin = "0010"
Case "3" HexToBin = "0011"
Case "4" HexToBin = "0100"
Case "5" HexToBin = "0101"
Case "6" HexToBin = "0110"
Case "7" HexToBin = "0111"
Case "8" HexToBin = "1000"
Case "9" HexToBin = "1001"
Case "a" HexToBin = "1010"
Case "b" HexToBin = "1011"
Case "c" HexToBin = "1100"
Case "d" HexToBin = "1101"
Case "e" HexToBin = "1110"
Case "f" HexToBin = "1111"
Case Else MsgBox "输入错误"
End Select
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function IsExist(str,key) '功能:判断是否存在某字符串
'参数:1、类型:字符串,要判断的字符串;2、类型:字符串,关键字(正则表达式)
'返回值:类型:字符串,4位2进制数
Dim regEx, retVal,Maches
Set regEx = New RegExp
regEx.IgnoreCase = False '不区分大小写
regEx.Pattern = key
retVal = regEx.Test(str)
If retVal Then
IsExist = True
else
IsExist = False
End If
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function GetKey(str,key,mode) '功能:搜索所有符合条件的字符串
'参数:1、类型:字符串,要搜索的字符串;2、类型:字符串,关键字(正则表达式);3、类型:boolean,是否全局模式搜索
'返回值:类型:字符串,匹配搜索条件的所有关键字,关键字之间为回车,组成的一个字符串
Dim regEx, retVal,Maches
Set regEx = New RegExp
regEx.IgnoreCase = False '不区分大小写
regEx.Global = mode '全局匹配,找到所有符合条件的关键字,false表示只找到第一个符合条件的关键字
regEx.Pattern = key
Set Matches = regEx.Execute(str)
For Each Match in Matches
GetKey = Match.value & chr(13) & chr(10) & GetKey
Next
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function Order(str) '功能:从大到小排列,不删除重复项
'参数:1、类型:字符串,要排列的字符串
'返回值:类型:字符串,按照从小到大的顺序排列好的字符串
chang_line = chr(13) & chr(10)
dim a
a = split(str,chang_line,-1,1)
a_len = UBound(a)
do
i = 0
if(a(a_len-i) = "") then
a_len = a_len - 1
i = i + 1
end if
loop while(a(a_len) = "") '去除后面的空字符
i = 0
j = a_len
do
do
a(i) = Int(a(i))
a(i+1) = Int(a(i+1))
if(a(i)>a(i+1)) then
temp = a(i)
a(i) = a(i+1)
a(i+1) = temp
end if
i = i + 1
loop while(i < j)
Order = a(j) & chr(13) & chr(10) & Order
j = j -1
i = 0
loop while(j > 0)
Order = a(0) & chr(13) & chr(10) & Order
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function Order_onlyone(str) '功能:从大到小排列,但删除重复项
'参数:1、类型:字符串,要排列的字符串
'返回值:类型:字符串,按照从小到大的顺序排列好的字符串
chang_line = chr(13) & chr(10)
a = Order(str)
a = split(a,chang_line,-1,1)
a_len = UBound(a) - 1
i = 0
do
a(i) = Int(a(i))
a(i+1) = Int(a(i+1))
if(a(i)<>a(i+1)) then
temp = a(i) & chr(13) & chr(10) & temp
end if
i = i + 1
loop while(i < a_len)
temp = a(a_len) & chr(13) & chr(10) & temp
Order_onlyone = Order(temp)
End Function
</ SCRIPT >
</ body >
</ html >
Update at 2007-06-03 星期日 4:23:58.53
修正了几个bug,增加了对show vlan中,有L2ap的情况的支持!
< head >
< title > 测试辅助工具 </ title >
</ head >
< body >
请选择线卡类型:
< select size ="1" name ="linecard" >
< option value ="" selected ></ option >
< option value ="1" > 86_24sfp </ option >
< option value ="2" > 86_24gt </ option >
< option value ="3" > 86_48gt_unit0 </ option >
< option value ="4" > 86_48gt_unit1 </ option >
</ select >
< input type ="Button" NAME ="help" value ="帮助" align =right >
< SCRIPT FOR ="help" EVENT ="OnClick" LANGUAGE ="VBScript" > ...
str = "工具提供:" & chr(13) & chr(10) & chr(13) & chr(10) &_
" 底层和上层端口转换的功能!" & chr(13) & chr(10) & chr(13) & chr(10) &_
" 同时也提供底层L3位图" &_
"和上层是否一致的对比验证!" & chr(13) & chr(10) & chr(13) & chr(10) &_
"使用方法:点击下面各个按钮,会有提示操作!" &_
chr(13) & chr(10) & chr(13) & chr(10) & "限 制:目前不支持show ip mroute中有routed port!" &_
chr(13) & chr(10) & chr(13) &_
chr(10) & "bug 联系:peil@ruijie.com.cn"
msgbox str,64,"帮助"
</ SCRIPT >
< input type ="Button" NAME ="about" value ="关于" align =right >
< SCRIPT FOR ="about" EVENT ="OnClick" LANGUAGE ="VBScript" > ...
str = "名称:测试辅助工具" & chr(13) & chr(10) & "版本:1.0" &_
chr(13) & chr(10) & "作者:裴亮 @ 网研四部"
msgbox str,64,"关于"
</ SCRIPT >
< SCRIPT FOR ="linecard" EVENT ="Onchange" LANGUAGE ="VBScript" > ...
if(linecard.value<>"") then
if(linecard.value="1" Or linecard.value="2" Or linecard.value="3") then
phy_port48.style.display="none"
phy_port24.style.display=""
phy_port24.value = ""
else
phy_port24.style.display="none"
phy_port48.style.display=""
phy_port48.value = ""
end if
ssp_port24.value = ""
phy_port.value = ""
ssp_port.value = ""
ssp_port.style.display=""
ssp_port24.style.display=""
phy_port.style.display=""
else
phy_port24.style.display="none"
phy_port48.style.display="none"
ssp_port.style.display="none"
ssp_port24.style.display="none"
phy_port.style.display="none"
end if
</ SCRIPT >
< br >
请选择物理端口号:
< select STYLE ="display:none" size ="1" name ="phy_port24" type ="hiden" >
< option value ="" selected ></ option >
< option value ="1" > 01 </ option >
< option value ="2" > 02 </ option >
< option value ="3" > 03 </ option >
< option value ="4" > 04 </ option >
< option value ="5" > 05 </ option >
< option value ="6" > 06 </ option >
< option value ="7" > 07 </ option >
< option value ="8" > 08 </ option >
< option value ="9" > 09 </ option >
< option value ="10" > 10 </ option >
< option value ="11" > 11 </ option >
< option value ="12" > 12 </ option >
< option value ="13" > 13 </ option >
< option value ="14" > 14 </ option >
< option value ="15" > 15 </ option >
< option value ="16" > 16 </ option >
< option value ="17" > 17 </ option >
< option value ="18" > 18 </ option >
< option value ="19" > 19 </ option >
< option value ="20" > 20 </ option >
< option value ="21" > 21 </ option >
< option value ="22" > 22 </ option >
< option value ="23" > 23 </ option >
< option value ="24" > 24 </ option >
</ select >
< select STYLE ="display:none" size ="1" name ="phy_port48" >
< option value ="" selected ></ option >
< option value ="25" > 25 </ option >
< option value ="26" > 26 </ option >
< option value ="27" > 27 </ option >
< option value ="28" > 28 </ option >
< option value ="29" > 29 </ option >
< option value ="30" > 30 </ option >
< option value ="31" > 31 </ option >
< option value ="32" > 32 </ option >
< option value ="33" > 33 </ option >
< option value ="34" > 34 </ option >
< option value ="35" > 35 </ option >
< option value ="36" > 36 </ option >
< option value ="37" > 37 </ option >
< option value ="38" > 38 </ option >
< option value ="39" > 39 </ option >
< option value ="40" > 40 </ option >
< option value ="41" > 41 </ option >
< option value ="42" > 42 </ option >
< option value ="43" > 43 </ option >
< option value ="44" > 44 </ option >
< option value ="45" > 45 </ option >
< option value ="46" > 46 </ option >
< option value ="47" > 47 </ option >
< option value ="48" > 48 </ option >
</ select >
对应的底层端口为:
< input style ="display:none" name ="ssp_port" type ="text" value ="" maxlength ="2" size ="2" >
< br >
请选择底层端口号:
< select STYLE ="display:none" size ="1" name ="ssp_port24" >
< option value ="" selected ></ option >
< option value ="0" > 0 </ option >
< option value ="1" > 1 </ option >
< option value ="2" > 2 </ option >
< option value ="3" > 3 </ option >
< option value ="4" > 4 </ option >
< option value ="5" > 5 </ option >
< option value ="6" > 6 </ option >
< option value ="7" > 7 </ option >
< option value ="8" > 8 </ option >
< option value ="09" > 09 </ option >
< option value ="10" > 10 </ option >
< option value ="11" > 11 </ option >
< option value ="12" > 12 </ option >
< option value ="13" > 13 </ option >
< option value ="14" > 14 </ option >
< option value ="15" > 15 </ option >
< option value ="16" > 16 </ option >
< option value ="17" > 17 </ option >
< option value ="18" > 18 </ option >
< option value ="19" > 19 </ option >
< option value ="20" > 20 </ option >
< option value ="21" > 21 </ option >
< option value ="22" > 22 </ option >
< option value ="23" > 23 </ option >
</ select >
对应的物理端口为:
< input style ="display:none" name ="phy_port" type ="text" value ="" maxlength ="2" size ="2" >
< SCRIPT FOR ="ssp_port24" EVENT ="Onchange" LANGUAGE ="VBScript" > ...
if(ssp_port24.value<>"") then
lc_type = linecard.value
ssp_phy = LcArray(lc_type)
port_id = Int(ssp_port24.value)
phy_port.value = ssp_phy(port_id)
else
phy_port.value = ""
end if
</ SCRIPT >
< SCRIPT FOR ="phy_port24" EVENT ="Onchange" LANGUAGE ="VBScript" > ...
if(phy_port24.value<>"") then
lc_type = linecard.value
ssp_phy = LcArray(lc_type)
port_id = Int(phy_port24.value)
i = 0
do
if(ssp_phy(i) = port_id) then
ssp_port.value = i
end if
i = i + 1
loop while(i<24)
else
ssp_port.value = ""
end if
</ SCRIPT >
< SCRIPT FOR ="phy_port48" EVENT ="Onchange" LANGUAGE ="VBScript" > ...
if(phy_port48.value<>"") then
lc_type = linecard.value
ssp_phy = LcArray(lc_type)
port_id = Int(phy_port48.value)
i = 0
do
if(ssp_phy(i) = port_id) then
ssp_port.value = i
end if
i = i + 1
loop while(i<24)
else
ssp_port.value = ""
end if
</ SCRIPT >
< br >
请输入你要转换的ipmc table show中的位图:
< input name ="l3_bitmap" type ="text" value ="" >
< input type ="Button" NAME ="Button1" value ="转换" >
底层:
< textarea name ="port_phy" type ="textfield" value ="" cols ="5" rows ="10" readonly ></ textarea >
上层:
< textarea name ="intf_set" type ="textfield" value ="" cols ="5" rows ="10" readonly ></ textarea >
< br >
< br >
sh ip mroute得到上游口、下游口:
< input type ="Button" NAME ="Button2" value ="get" >
< br >
< textarea name ="sh_mroute" type ="textfield" value ="" cols ="80" rows ="5" ></ textarea >
上游口:
< textarea name ="incoming" type ="textfield" value ="" cols ="10" rows ="5" readonly ></ textarea >
下游口:
< textarea name ="outgoing" type ="textfield" value ="" cols ="10" rows ="5" readonly ></ textarea >
< br >
< br >
sh ap sum得到ap的成员属性:
< input type ="Button" NAME ="Button4" value ="get" >
请输线卡卡槽:
< input name ="lc_slot" type ="text" value ="" maxlength =1 size =2 >
< br >
< textarea name ="sh_ap" type ="textfield" value ="" cols ="80" rows ="5" ></ textarea >
成员口:
< textarea name ="members" type ="textfield" value ="" cols ="10" rows ="5" readonly ></ textarea >
< SCRIPT FOR ="Button4" EVENT ="onClick" LANGUAGE ="VBScript" > ...
if ((sh_ap.value <> "") And (lc_slot.value<>"")) then
chang_line = chr(13) & chr(10)
ap_line = split(sh_ap.value,chang_line,-1,1)
ap_line_length = UBound(ap_line)
members.value = ""
key_fuzhu = lc_slot.value & "/" '后面将把搜索到诸如"2/1",前面的"2/"删除
lc_port = lc_slot.value & "/d+"
n = 0
do
a = "Agd+"
If IsExist(ap_line(n),a) Then '如果找到vlan(i),那么显示vlan(i),并继续向下找端口
members.value = members.value & GetKey(ap_line(n),a,-1) &_
Replace(GetKey(ap_line(n),lc_port,-1),key_fuzhu,"")
member = member & Replace(GetKey(ap_line(n),lc_port,-1),key_fuzhu,"")
n = n + 1 '跳到下一行
if(n>=ap_line_length) then exit do
do while ((n <= ap_line_length) And (Not IsExist(ap_line(n),a))) '如果找不到agxx,不显示agxx,但继续向下找端口,直到找到下一个agxx时,跳出
members.value = members.value & Replace(GetKey(ap_line(n),lc_port,-1),key_fuzhu,"")
n = n + 1
if(n>=ap_line_length) then exit do
loop
else
n = n + 1 '这里需要注意,在if为真时,有一个n=n+1,那么这里就不应该在end if后添加n+1,而应该在else下添加n+1
End If
loop while(n <= ap_line_length)
else
msgbox "请输线卡卡槽 和 show ap sum结果!"
end if
</SCRIPT>
<br>
<br>
sh vlan得到接口的vlan分布:
<input type="Button" NAME="Button3" value="compute">
<br>
<textarea name="sh_vlan" type="textfield" value="" cols="100" rows="10"></textarea>
<textarea name="intf_dis" type="textfield" value="" cols="40" rows="10" readonly></textarea>
<SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript"> '添加新的线卡类型时,需要再此添加ssp->物理接口的关系,
'还有上面的select选择框也需要添加对应的选项
if ((l3_bitmap.value <> "") And (linecard.value<>"")) then
lc_type = linecard.value
ssp_phy = LcArray(lc_type)
l3_map = l3_bitmap.value
port_phy.value = ssp_to_phy(l3_map,ssp_phy)
port_phy.value = Order(port_phy.value)
else
msgbox "请选择线卡类型,并输入L3位图!"
end if
</SCRIPT>
<SCRIPT FOR="Button2" EVENT="onClick" LANGUAGE="VBScript">
if (sh_mroute.value <> "") then
chang_line = chr(13) & chr(10)
vlan_line = split(sh_mroute.value,chang_line,-1,1)
vlan_line_length = UBound(vlan_line)
incoming.value = ""
outgoing.value = ""
m = 0
do
If IsExist(vlan_line(m),"Incoming") Then
incoming.value = GetKey(vlan_line(m),"d+",0)
End If
If IsExist(vlan_line(m),"Outgoing") Then
do '找到出口列表时,继续向下遍历,到最后一行
outgoing.value = GetKey(vlan_line(m),"d+",0) + outgoing.value
m = m + 1
loop while(m <= vlan_line_length)
End If
m = m + 1 '这时实际m值已经为最大值+1了,这里再次加1,m值变为最大+2
loop while(m <= vlan_line_length)
outgoing.value = Order(outgoing.value)
else
msgbox "请输入show ip mroute结果!"
end if
</SCRIPT>
<SCRIPT FOR="Button3" EVENT="onClick" LANGUAGE="VBScript">
On Error Resume Next
if ((sh_vlan.value <> "") And(lc_slot.value <> "") And (outgoing.value<>"")) then
aps_s = members.value
chang_line = chr(13) & chr(10)
v_line = split(sh_vlan.value,chang_line,-1,1)
v_line_length = UBound(v_line)
vlan_set = split(outgoing.value,chang_line,-1,1)
vlan_set_length = UBound(vlan_set)
do
i = 0
if(vlan_set(vlan_set_length-i) = "") then
vlan_set_length = vlan_set_length - 1
i = i + 1
end if
loop while(vlan_set(vlan_set_length) = "") '去除后面的空字符
intf_dis.value = ""
key_fuzhu = lc_slot.value & "/" '后面将把搜索到诸如"2/1",前面的"2/"删除
lc_port = lc_slot.value & "/d+"
n = 0
i = 0
do
a = "VLANd*" & vlan_set(i)
If IsExist(v_line(n),a) Then '如果找到vlan(i),那么显示vlan(i),并继续向下找端口
intf_dis.value = intf_dis.value & GetKey(v_line(n),"VLANd+",-1) &_
Replace(GetKey(v_line(n),lc_port,-1),key_fuzhu,"") & GetKey(v_line(n),"Agd+",-1)
aps = GetKey(v_line(n),"Agd+",-1)
ap_member = ApToMember(aps,aps_s)
msgbox UBound(ap_member)
intfs = intfs & Replace(GetKey(v_line(n),lc_port,-1),key_fuzhu,"") & ap_member
n = n + 1 '跳到下一行
while((n <= v_line_length) And (Not IsExist(v_line(n),"VLANd+"))) '如果找不到vlanxx,不显示valnxx,但继续向下找端口,直到找到下一个vlanxx时,跳出
intf_dis.value = intf_dis.value & Replace(GetKey(v_line(n),lc_port,-1),key_fuzhu,"") & GetKey(v_line(n),"Agd+",-1)
intfs = intfs & Replace(GetKey(v_line(n),lc_port,-1),key_fuzhu,"") & ap_member
n = n + 1
wend
i = i + 1 'vlan(i)一论搜索结束,调到下一个vlan(i+1)
else
n = n + 1 '这里需要注意,在if为真时,有一个n=n+1,那么这里就不应该在end if后添加n+1,而应该在else下添加n+1
End If
loop while((n <= v_line_length) And (i <= vlan_set_length))
intfs = Order_onlyone(intfs)
intf_set.value = intfs
Pass = "表项一致"
Fail = " 表项不一致!" & chr(13) & chr(10) & "致电黄米青!电话:8595"
if(StrComp(intf_set.value,port_phy.value) = 0) then
MsgBox Pass,64, "Pass"
else
msgbox Fail,48,"Fail"
end if
else
msgbox "请点击'get'计算出show ip mroute的下游口,并输入show vlan结果,以及线卡卡槽!"
end if
</ SCRIPT >
<!-- 以下是各个自定义函数 -->
< SCRIPT LANGUAGE ="VBScript" > ...
Function ssp_to_phy(l3_bitmap,ssp_phy) '功能:转换ssp的位图为物理接口
'参数:1、类型:字符串,位图;2、类型:数组,ssp->物理接口的关系
'返回值:类型string,位图为1对应的所有物理接口,且接口间以回车为间隔的组成的一个字符串
length_l3_bitmap = len(l3_bitmap)
i = 1 '在i小于位图的16进制数的个数时,一直循环,总共要循环(i*4)次
while(i <= length_l3_bitmap)
temp = Mid(StrReverse(l3_bitmap),i,1) 'Mid函数从右向左提取字符,故先反转位图。这里表示依次从l3位图中提取一个16进制数
bin_temp = HexToBin(temp) '调用16进制转2进制函数
l3_bin = StrReverse(bin_temp) '同样道理,因为下面还用使用Mid函数,反转2进制位图
j = 1
while(j <= 4) '16进制数变为2进制,4:1,故循环4次
if(Mid(l3_bin,j,1) = 1) then
ssp_index = (i-1) * 4 + j - 1 '计算当前操作的bit位,在位图中的位置
phy_index = ssp_phy(ssp_index)
ssp_to_phy = phy_index & chr(10)& ssp_to_phy
end if
j = j + 1
wend
i = i + 1
wend
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function HexToBin(str_hex) '功能:16进制数转换为2进制数
'参数:类型:字符,16进制数
'返回值:类型:字符串,4位2进制数
Select Case str_hex
Case "0" HexToBin = "0000"
Case "1" HexToBin = "0001"
Case "2" HexToBin = "0010"
Case "3" HexToBin = "0011"
Case "4" HexToBin = "0100"
Case "5" HexToBin = "0101"
Case "6" HexToBin = "0110"
Case "7" HexToBin = "0111"
Case "8" HexToBin = "1000"
Case "9" HexToBin = "1001"
Case "a" HexToBin = "1010"
Case "b" HexToBin = "1011"
Case "c" HexToBin = "1100"
Case "d" HexToBin = "1101"
Case "e" HexToBin = "1110"
Case "f" HexToBin = "1111"
Case Else MsgBox "输入错误"
End Select
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function IsExist(str,key) '功能:判断是否存在某字符串
'参数:1、类型:字符串,要判断的字符串;2、类型:字符串,关键字(正则表达式)
'返回值:类型:字符串,4位2进制数
Dim regEx, retVal,Maches
Set regEx = New RegExp
regEx.IgnoreCase = False '不区分大小写
regEx.Pattern = key
retVal = regEx.Test(str)
If retVal Then
IsExist = True
else
IsExist = False
End If
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function GetKey(str,key,mode) '功能:搜索所有符合条件的字符串
'参数:1、类型:字符串,要搜索的字符串;2、类型:字符串,关键字(正则表达式);3、类型:boolean,是否全局模式搜索
'返回值:类型:字符串,匹配搜索条件的所有关键字,关键字之间为回车,组成的一个字符串
Dim regEx, retVal,Maches
Set regEx = New RegExp
regEx.IgnoreCase = False '不区分大小写
regEx.Global = mode '全局匹配,找到所有符合条件的关键字,false表示只找到第一个符合条件的关键字
regEx.Pattern = key
Set Matches = regEx.Execute(str)
For Each Match in Matches
GetKey = Match.value & chr(13) & chr(10) & GetKey
Next
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function Order(str) '功能:从大到小排列,不删除重复项
'参数:1、类型:字符串,要排列的字符串
'返回值:类型:字符串,按照从小到大的顺序排列好的字符串
chang_line = chr(13) & chr(10)
dim a
a = split(str,chang_line,-1,1)
a_len = delNull(a)
i = 0
j = a_len
do
do
a(i) = Int(a(i))
a(i+1) = Int(a(i+1))
if(a(i)>a(i+1)) then
temp = a(i)
a(i) = a(i+1)
a(i+1) = temp
end if
i = i + 1
loop while(i < j)
Order = a(j) & chr(13) & chr(10) & Order
j = j -1
i = 0
loop while(j > 0)
Order = a(0) & chr(13) & chr(10) & Order
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function Order_onlyone(str) '功能:从大到小排列,但删除重复项
'参数:1、类型:字符串,要排列的字符串
'返回值:类型:字符串,按照从小到大的顺序排列好的字符串
chang_line = chr(13) & chr(10)
a = Order(str)
a = split(a,chang_line,-1,1)
a_len = UBound(a) - 1
i = 0
do
a(i) = Int(a(i))
a(i+1) = Int(a(i+1))
if(a(i)<>a(i+1)) then
temp = a(i) & chr(13) & chr(10) & temp
end if
i = i + 1
loop while(i < a_len)
temp = a(a_len) & chr(13) & chr(10) & temp
Order_onlyone = Order(temp)
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function LcArray(lc_type) '功能:根据线卡类型,得到ssp和物理接口的关系
'参数:1、类型:字符串,线卡类型
'返回值:类型:数组,返回线卡关系数组
dim ssp_phy_24sfp,ssp_phy_24gt,ssp_phy_48gt0,ssp_phy_48gt1
ssp_phy_24sfp = Array(2,1,4,3,6,5,8,7,10,9,12,11,14,13,16,15,18,17,20,19,22,21,24,23)
ssp_phy_24gt = Array(3,4,1,2,7,8,5,6,11,12,9,10,15,16,13,14,19,20,17,18,23,24,21,22)
ssp_phy_48gt0 = Array(2,1,4,3,6,5,8,7,10,9,12,11,14,13,16,15,18,17,20,19,22,21,24,23)
ssp_phy_48gt1 = Array(26,25,28,27,30,29,32,31,34,33,36,35,38,37,40,39,43,44,41,42,47,48,45,46)
Select Case lc_type
Case "1" LcArray = ssp_phy_24sfp
Case "2" LcArray = ssp_phy_24gt
Case "3" LcArray = ssp_phy_48gt0
Case "4" LcArray = ssp_phy_48gt1
Case Else MsgBox "请选择线卡类型!"
End Select
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function ApToMember(str,str_member) '功能:判断当前行是否存在ap口,存在转化为成员口
'参数:1、类型:字符串
'返回值:类型:字符串,所有成员口组成的字符串
'返回值:类型:字符串,成员口组成的字符串
if(IsExist(str,"Agd+")) then
chang_line = chr(13) & chr(10)
aps = GetKey(str,"Agd+",-1)
aps = split(aps,chang_line,-1,1)
aps_s = GetKey(str_member,"Agd+",-1)
aps_s = split(aps_s,chang_line,-1,1)
single_str = split(str_member,chang_line,-1,1)
single_str_length = delNull(single_str)
aps_s_length = delNull(aps_s)
aps_length = delNull(aps)
i = 0
j = 0
Do
x=0
do
If(aps(i)= aps_s(x)) Then
y = 0
Do
If(single_str(y) = aps_s(x)) Then
j = y
End If
If(single_str(y) = aps_s(x)) Then Exit do
y = y + 1
Loop While(y<=single_str_length) '这个循环为了找到匹配的ap口,在ap+成员字符串中的坐标
x = x + 1
do
If(Left(single_str(j),2)<>"Ag") Then
temp = single_str(j) & chang_line & temp
End If
j = j + 1
If(j>single_str_length) Then Exit do
Loop While((j<=single_str_length) And (Left(single_str(j),2)<>"Ag")) '从匹配的ap口开始,向下累加成员口到下一个ap口
Else
x = x + 1
End If
Loop While(x<=aps_s_length) '将一个要比较的ap口匹配完所有的ap口
i = i + 1
Loop While(i<=aps_length) '要比较的所有ap口依次匹配,至完全
ApToMember = temp
end if
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function delNull(str)
str_length = UBound(str)
do
i = 0
if(str(str_length-i) = "") then
str_length = str_length - 1
i = i + 1
end If
loop while(str(str_length) = "") '去除后面的空字符
delNull = str_length
End Function
</ SCRIPT >
</ body >
</ html >
Update at 2007-06-24 星期日 12:49:53.62
修正了几个bug,更改了几个函数实现,增加了对3750、5750、6610(这个最变态,不过为了增加对其的支持,还是学到了一点东西)的支持!请将代码保存为".hta"后缀名即可运行。
< head >
< title > 测试辅助工具 </ title >
< HTA:APPLICATION
APPLICATIONNAME ="Test Tool"
SCROLL ="yes"
SINGLEINSTANCE ="yes"
WINDOWSTATE ="maximize" >
</ head >
< body >
请选择线卡类型:
< select size ="1" name ="linecard" >
< option value ="" selected ></ option >
< option value ="1" > 86_24sfp </ option >
< option value ="2" > 86_24gt </ option >
< option value ="3" > 86_48gt_unit0 </ option >
< option value ="4" > 86_48gt_unit1 </ option >
< option value ="5" > 3750_24 </ option >
< option value ="6" > 5750_24 </ option >
< option value ="7" > 6610 </ option >
</ select >
< input type ="Button" NAME ="help" value ="帮助" align =right >
< SCRIPT FOR ="help" EVENT ="OnClick" LANGUAGE ="VBScript" > ...
str = "工具提供:" & chr(13) & chr(10) & chr(13) & chr(10) &_
" 底层和上层端口转换的功能!" & chr(13) & chr(10) & chr(13) & chr(10) &_
" 同时也提供底层L3位图" &_
"和上层是否一致的对比验证!" & chr(13) & chr(10) & chr(13) & chr(10) &_
"使用方法:点击下面各个按钮,会有提示操作!" &_
chr(13) & chr(10) & chr(13) & chr(10) & "限 制:目前不支持show ip mroute中有routed port!" &_
chr(13) & chr(10) & chr(13) &_
chr(10) & "bug 联系:peil@ruijie.com.cn"
msgbox str,64,"帮助"
</ SCRIPT >
< input type ="Button" NAME ="about" value ="关于" align =right >
< SCRIPT FOR ="about" EVENT ="OnClick" LANGUAGE ="VBScript" > ...
str = "名称:测试辅助工具" & chr(13) & chr(10) & "版本:1.01" &_
chr(13) & chr(10) & "作者:裴亮 @ 网研四部"
msgbox str,64,"关于"
</ SCRIPT >
< SCRIPT FOR ="linecard" EVENT ="Onchange" LANGUAGE ="VBScript" > ...
if(linecard.value<>"") then
if(linecard.value="1" Or linecard.value="2" Or linecard.value="3" Or linecard.value="5" Or linecard.value="6") then
phy_port48.style.display="none"
phy_port24.style.display=""
ssp_port24.value = ""
phy_port.value = ""
ssp_port.value = ""
ssp_port.style.display=""
ssp_port24.style.display=""
phy_port.style.display=""
phy_port24.value = ""
for66.style.display="none"
for66_unit.style.display="none"
phy_port6.style.display="none"
slots_num.style.display="none"
ssp_port6_part4.style.display="none"
ssp_port6_part1.style.display="none"
ssp_port6_part2.style.display="none"
ssp_port6_part3.style.display="none"
ssp_unit.style.display="none"
select66_unit.style.display="none"
elseif(linecard.value="7") then
phy_port24.style.display="none"
phy_port48.style.display="none"
ssp_port.style.display="none"
ssp_port24.style.display="none"
phy_port.style.display="none"
for66.style.display=""
slots_num.style.display=""
slots_num.value = ""
ssp_port.style.display="none"
phy_port.style.display="none"
ssp_unit.style.display="none"
select66_unit.style.display=""
else
phy_port24.style.display="none"
phy_port48.style.display=""
phy_port48.value = ""
ssp_port24.value = ""
phy_port.value = ""
ssp_port.value = ""
ssp_port.style.display=""
ssp_port24.style.display=""
phy_port.style.display=""
for66.style.display="none"
for66_unit.style.display="none"
phy_port6.style.display="none"
slots_num.style.display="none"
ssp_port6_part4.style.display="none"
ssp_port6_part1.style.display="none"
ssp_port6_part2.style.display="none"
ssp_port6_part3.style.display="none"
ssp_unit.style.display="none"
select66_unit.style.display="none"
end if
else
phy_port24.style.display="none"
phy_port48.style.display="none"
ssp_port.style.display="none"
ssp_port24.style.display="none"
phy_port.style.display="none"
end if
</ SCRIPT >
< span id ="for66" style ="display:none" >< br > 请选择线卡卡槽: </ span >
< select STYLE ="display:none" size ="1" name ="slots_num" >
< option value ="" selected ></ option >
< option value ="1" > 01 </ option >
< option value ="2" > 02 </ option >
< option value ="3" > 03 </ option >
< option value ="4" > 04 </ option >
< option value ="5" > 05 </ option >
< option value ="6" > 06 </ option >
< option value ="7" > 07 </ option >
< option value ="8" > 08 </ option >
</ select >
< span id ="for66_unit" style ="display:none" ></ span >
< SCRIPT FOR ="slots_num" EVENT ="Onchange" LANGUAGE ="VBScript" > ...
if(slots_num.value<>"") then
for66_unit.style.display=""
phy_port6.style.display=""
ssp_port.style.display=""
phy_port.style.display=""
ssp_unit.style.display=""
ssp_port24.style.display=""
if(slots_num.value="1" Or slots_num.value="2" Or slots_num.value="6" Or slots_num.value="7") then
for66_unit.innerHTML="<br><B><U>线卡位于unit0</B></U>"
ssp_unit.VALUE="0"
else
for66_unit.innerHTML="<br><B><U>线卡位于unit1</B></U>"
ssp_unit.VALUE="1"
end if
else
for66_unit.style.display="none"
phy_port6.style.display="none"
ssp_port6_part1.style.display="none"
ssp_port6_part2.style.display="none"
ssp_port6_part3.style.display="none"
ssp_port6_part4.style.display="none"
ssp_port.style.display="none"
phy_port.style.display="none"
end if
</ SCRIPT >
< br >
请选择物理端口号:
< select STYLE ="display:none" size ="1" name ="phy_port24" >
< option value ="" selected ></ option >
< option value ="1" > 01 </ option >
< option value ="2" > 02 </ option >
< option value ="3" > 03 </ option >
< option value ="4" > 04 </ option >
< option value ="5" > 05 </ option >
< option value ="6" > 06 </ option >
< option value ="7" > 07 </ option >
< option value ="8" > 08 </ option >
< option value ="9" > 09 </ option >
< option value ="10" > 10 </ option >
< option value ="11" > 11 </ option >
< option value ="12" > 12 </ option >
< option value ="13" > 13 </ option >
< option value ="14" > 14 </ option >
< option value ="15" > 15 </ option >
< option value ="16" > 16 </ option >
< option value ="17" > 17 </ option >
< option value ="18" > 18 </ option >
< option value ="19" > 19 </ option >
< option value ="20" > 20 </ option >
< option value ="21" > 21 </ option >
< option value ="22" > 22 </ option >
< option value ="23" > 23 </ option >
< option value ="24" > 24 </ option >
</ select >
< select STYLE ="display:none" size ="1" name ="phy_port6" >
< option value ="" selected ></ option >
< option value ="1" > 01 </ option >
< option value ="2" > 02 </ option >
< option value ="3" > 03 </ option >
< option value ="4" > 04 </ option >
< option value ="5" > 05 </ option >
< option value ="6" > 06 </ option >
</ select >
< select STYLE ="display:none" size ="1" name ="phy_port48" >
< option value ="" selected ></ option >
< option value ="25" > 25 </ option >
< option value ="26" > 26 </ option >
< option value ="27" > 27 </ option >
< option value ="28" > 28 </ option >
< option value ="29" > 29 </ option >
< option value ="30" > 30 </ option >
< option value ="31" > 31 </ option >
< option value ="32" > 32 </ option >
< option value ="33" > 33 </ option >
< option value ="34" > 34 </ option >
< option value ="35" > 35 </ option >
< option value ="36" > 36 </ option >
< option value ="37" > 37 </ option >
< option value ="38" > 38 </ option >
< option value ="39" > 39 </ option >
< option value ="40" > 40 </ option >
< option value ="41" > 41 </ option >
< option value ="42" > 42 </ option >
< option value ="43" > 43 </ option >
< option value ="44" > 44 </ option >
< option value ="45" > 45 </ option >
< option value ="46" > 46 </ option >
< option value ="47" > 47 </ option >
< option value ="48" > 48 </ option >
</ select >
对应的底层端口为:
< input style ="display:none" name ="ssp_port" type ="text" value ="" maxlength ="2" size ="2" >
< br >
< span id ="select66_unit" style ="display:none" > 请选择unit: </ span >
< select STYLE ="display:none" size ="1" name ="ssp_unit" >
< option value ="0" selected > unit0 </ option >
< option value ="1" > unit1 </ option >
</ select >
请选择底层端口号:
< select STYLE ="display:none" size ="1" name ="ssp_port24" >
< option value ="" selected ></ option >
< option value ="0" > 0 </ option >
< option value ="1" > 1 </ option >
< option value ="2" > 2 </ option >
< option value ="3" > 3 </ option >
< option value ="4" > 4 </ option >
< option value ="5" > 5 </ option >
< option value ="6" > 6 </ option >
< option value ="7" > 7 </ option >
< option value ="8" > 8 </ option >
< option value ="09" > 09 </ option >
< option value ="10" > 10 </ option >
< option value ="11" > 11 </ option >
< option value ="12" > 12 </ option >
< option value ="13" > 13 </ option >
< option value ="14" > 14 </ option >
< option value ="15" > 15 </ option >
< option value ="16" > 16 </ option >
< option value ="17" > 17 </ option >
< option value ="18" > 18 </ option >
< option value ="19" > 19 </ option >
< option value ="20" > 20 </ option >
< option value ="21" > 21 </ option >
< option value ="22" > 22 </ option >
< option value ="23" > 23 </ option >
</ select >
< select STYLE ="display:none" size ="1" name ="ssp_port6_part1" >
< option value ="" selected ></ option >
< option value ="0" > 0 </ option >
< option value ="1" > 1 </ option >
< option value ="2" > 2 </ option >
< option value ="3" > 3 </ option >
< option value ="4" > 4 </ option >
< option value ="5" > 5 </ option >
</ select >
< select STYLE ="display:none" size ="1" name ="ssp_port6_part2" >
< option value ="" selected ></ option >
< option value ="6" > 6 </ option >
< option value ="7" > 7 </ option >
< option value ="8" > 8 </ option >
< option value ="09" > 09 </ option >
< option value ="10" > 10 </ option >
< option value ="11" > 11 </ option >
</ select >
< select STYLE ="display:none" size ="1" name ="ssp_port6_part3" >
< option value ="" selected ></ option >
< option value ="12" > 12 </ option >
< option value ="13" > 13 </ option >
< option value ="14" > 14 </ option >
< option value ="15" > 15 </ option >
< option value ="16" > 16 </ option >
< option value ="17" > 17 </ option >
</ select >
< select STYLE ="display:none" size ="1" name ="ssp_port6_part4" >
< option value ="" selected ></ option >
< option value ="18" > 18 </ option >
< option value ="19" > 19 </ option >
< option value ="20" > 20 </ option >
< option value ="21" > 21 </ option >
< option value ="22" > 22 </ option >
< option value ="23" > 23 </ option >
</ select >
对应的物理端口为:
< input style ="display:none" name ="phy_port" type ="text" value ="" maxlength ="2" size ="2" >
< SCRIPT FOR ="ssp_port24" EVENT ="Onchange" LANGUAGE ="VBScript" > ...
if(ssp_port24.value<>"") then
port_id = Int(ssp_port24.value)
lc_type = linecard.value
ssp_phy = LcArray(lc_type)
if(lc_type="7") then
if(port_id<6) then
phy_port.value = ssp_phy(port_id)
if(ssp_unit.VALUE="0") then
slots_num.value="6"
for66_unit.innerHTML="<br><B><U>线卡位于unit0</B></U>"
else
slots_num.value="8"
for66_unit.innerHTML="<br><B><U>线卡位于unit1</B></U>"
end if
elseif(port_id<12) then
port_id = port_id Mod 6
phy_port.value = ssp_phy(port_id)
if(ssp_unit.VALUE="0") then
slots_num.value="2"
for66_unit.innerHTML="<br><B><U>线卡位于unit0</B></U>"
else
slots_num.value="5"
for66_unit.innerHTML="<br><B><U>线卡位于unit1</B></U>"
end if
elseif(port_id<18) then
port_id = port_id Mod 6
phy_port.value = ssp_phy(port_id)
if(ssp_unit.VALUE="0") then
slots_num.value="1"
for66_unit.innerHTML="<br><B><U>线卡位于unit0</B></U>"
else
slots_num.value="4"
for66_unit.innerHTML="<br><B><U>线卡位于unit1</B></U>"
end if
elseif(port_id<24) then
port_id = port_id Mod 6
phy_port.value = ssp_phy(port_id)
if(ssp_unit.VALUE="0") then
slots_num.value="7"
for66_unit.innerHTML="<br><B><U>线卡位于unit0</B></U>"
else
slots_num.value="3"
for66_unit.innerHTML="<br><B><U>线卡位于unit1</B></U>"
end if
end if
else
phy_port.value = ssp_phy(port_id)
end if
else
phy_port.value = ""
end if
</ SCRIPT >
< SCRIPT FOR ="ssp_port6_part1" EVENT ="Onchange" LANGUAGE ="VBScript" > ...
if(ssp_port6_part1.value<>"") then
lc_type = linecard.value
ssp_phy = LcArray(lc_type)
port_id = Int(ssp_port6_part1.value)
phy_port.value = ssp_phy(port_id)
else
phy_port.value = ""
end if
</ SCRIPT >
< SCRIPT FOR ="ssp_port6_part2" EVENT ="Onchange" LANGUAGE ="VBScript" > ...
if(ssp_port6_part2.value<>"") then
lc_type = linecard.value
ssp_phy = LcArray(lc_type)
port_id = Int(ssp_port6_part2.value)
port_id = port_id Mod 6
phy_port.value = ssp_phy(port_id)
else
phy_port.value = ""
end if
</ SCRIPT >
< SCRIPT FOR ="ssp_port6_part3" EVENT ="Onchange" LANGUAGE ="VBScript" > ...
if(ssp_port6_part3.value<>"") then
lc_type = linecard.value
ssp_phy = LcArray(lc_type)
port_id = Int(ssp_port6_part3.value)
port_id = port_id Mod 6
phy_port.value = ssp_phy(port_id)
else
phy_port.value = ""
end if
</ SCRIPT >
< SCRIPT FOR ="ssp_port6_part4" EVENT ="Onchange" LANGUAGE ="VBScript" > ...
if(ssp_port6_part4.value<>"") then
lc_type = linecard.value
ssp_phy = LcArray(lc_type)
port_id = Int(ssp_port6_part4.value)
port_id = port_id Mod 6
phy_port.value = ssp_phy(port_id)
else
phy_port.value = ""
end if
</ SCRIPT >
< SCRIPT FOR ="phy_port6" EVENT ="Onchange" LANGUAGE ="VBScript" > ...
if(phy_port6.value<>"") then
lc_type = linecard.value
ssp_phy = ArrayLc(lc_type)
port_id = Int(phy_port6.value) - 1
ssp_port.value = ssp_phy(port_id)
else
ssp_port.value = ""
end if
</ SCRIPT >
< SCRIPT FOR ="phy_port24" EVENT ="Onchange" LANGUAGE ="VBScript" > ...
if(phy_port24.value<>"") then
lc_type = linecard.value
ssp_phy = LcArray(lc_type)
port_id = Int(phy_port24.value)
i = 0
do
if(ssp_phy(i) = port_id) then
ssp_port.value = i
end if
i = i + 1
loop while(i<24)
else
ssp_port.value = ""
end if
</ SCRIPT >
< SCRIPT FOR ="phy_port48" EVENT ="Onchange" LANGUAGE ="VBScript" > ...
if(phy_port48.value<>"") then
lc_type = linecard.value
ssp_phy = LcArray(lc_type)
port_id = Int(phy_port48.value)
i = 0
do
if(ssp_phy(i) = port_id) then
ssp_port.value = i
end if
i = i + 1
loop while(i<24)
else
ssp_port.value = ""
end if
</ SCRIPT >
< br >
请输入16进制数:
< input name ="hex_num" type ="text" value ="" >
< input type ="Button" NAME ="change_button" value ="转换" >
< input name ="bin_num" type ="text" value ="" size ="36" >
< SCRIPT FOR ="change_button" EVENT ="onClick" LANGUAGE ="VBScript" > ...
if (hex_num.value <> "") then
hex_len = len(hex_num.value)
hex_number = hex_num.value
i = 1 '在i小于位图的16进制数的个数时,一直循环,总共要循环(i*4)次
while(i <= hex_len)
temp = Mid(hex_number,i,1) 'Mid函数从右向左提取字符,故先反转位图。这里表示依次从l3位图中提取一个16进制数
bin_temp = HexToBin(temp) '调用16进制转2进制函数
if(i=1) then
l3_bin = bin_temp
else
l3_bin = l3_bin & "," & bin_temp '同样道理,因为下面还用使用Mid函数,反转2进制位图
end if
i = i + 1
wend
bin_num.value = l3_bin
else
msgbox "请输入16进制数!"
end if
</ SCRIPT >
< br >
请输入你要转换的ipmc table show中的位图:
< input name ="l3_bitmap" type ="text" value ="" >
< input type ="Button" NAME ="Button1" value ="转换" >
底层:
< textarea name ="port_phy" type ="textfield" value ="" cols ="5" rows ="10" readonly ></ textarea >
上层:
< textarea name ="intf_set" type ="textfield" value ="" cols ="5" rows ="10" readonly ></ textarea >
< br >
< br >
sh ip mroute得到上游口、下游口:
< input type ="Button" NAME ="Button2" value ="get" >
< br >
< textarea name ="sh_mroute" type ="textfield" value ="" cols ="80" rows ="5" ></ textarea >
上游口:
< textarea name ="incoming" type ="textfield" value ="" cols ="10" rows ="5" readonly ></ textarea >
下游口:
< textarea name ="outgoing" type ="textfield" value ="" cols ="10" rows ="5" readonly ></ textarea >
< br >
< br >
sh ap sum得到ap的成员属性:
< input type ="Button" NAME ="Button4" value ="get" >
请输线卡卡槽:
< input name ="lc_slot" type ="text" value ="" maxlength =1 size =2 >
< br >
< textarea name ="sh_ap" type ="textfield" value ="" cols ="80" rows ="5" ></ textarea >
成员口:
< textarea name ="members" type ="textfield" value ="" cols ="10" rows ="5" readonly ></ textarea >
< SCRIPT FOR ="Button4" EVENT ="onClick" LANGUAGE ="VBScript" > ...
if ((sh_ap.value <> "") And (lc_slot.value<>"")) then
chang_line = chr(13) & chr(10)
ap_line = split(sh_ap.value,chang_line,-1,1)
ap_line_length = UBound(ap_line)
members.value = ""
key_fuzhu = lc_slot.value & "/" '后面将把搜索到诸如"2/1",前面的"2/"删除
lc_port = lc_slot.value & "/d+"
n = 0
do
a = "Agd+"
If IsExist(ap_line(n),a) Then '如果找到vlan(i),那么显示vlan(i),并继续向下找端口
members.value = members.value & GetKey(ap_line(n),a,-1) &_
Replace(GetKey(ap_line(n),lc_port,-1),key_fuzhu,"")
member = member & Replace(GetKey(ap_line(n),lc_port,-1),key_fuzhu,"")
n = n + 1 '跳到下一行
if(n>ap_line_length) then exit do
do while ((n <= ap_line_length) And (Not IsExist(ap_line(n),a))) '如果找不到agxx,不显示agxx,但继续向下找端口,直到找到下一个agxx时,跳出
members.value = members.value & Replace(GetKey(ap_line(n),lc_port,-1),key_fuzhu,"")
n = n + 1
if(n>=ap_line_length) then exit do
loop
else
n = n + 1 '这里需要注意,在if为真时,有一个n=n+1,那么这里就不应该在end if后添加n+1,而应该在else下添加n+1
End If
loop while(n <= ap_line_length)
else
msgbox "请输线卡卡槽 和 show ap sum结果!"
end if
</SCRIPT>
<br>
<br>
sh vlan得到接口的vlan分布:
<input type="Button" NAME="Button3" value="compute">
<br>
<textarea name="sh_vlan" type="textfield" value="" cols="100" rows="10"></textarea>
<textarea name="intf_dis" type="textfield" value="" cols="40" rows="10" readonly></textarea>
<SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript"> '添加新的线卡类型时,需要再此添加ssp->物理接口的关系,
'还有上面的select选择框也需要添加对应的选项
if ((l3_bitmap.value <> "") And (linecard.value<>"")) then
lc_type = linecard.value
ssp_phy = LcArray(lc_type)
l3_map = l3_bitmap.value
port_phy.value = ssp_to_phy(l3_map,ssp_phy)
port_phy.value = Order(port_phy.value)
else
msgbox "请选择线卡类型,并输入L3位图!"
end if
</SCRIPT>
<SCRIPT FOR="Button2" EVENT="onClick" LANGUAGE="VBScript">
if (sh_mroute.value <> "") then
chang_line = chr(13) & chr(10)
vlan_line = split(sh_mroute.value,chang_line,-1,1)
vlan_line_length = UBound(vlan_line)
incoming.value = ""
outgoing.value = ""
m = 0
do
If IsExist(vlan_line(m),"Incoming") Then
incoming.value = GetKey(vlan_line(m),"d+",0)
End If
If IsExist(vlan_line(m),"Outgoing") Then
do '找到出口列表时,继续向下遍历,到最后一行
outgoing.value = GetKey(vlan_line(m),"d+",0) + outgoing.value
m = m + 1
loop while(m <= vlan_line_length)
End If
m = m + 1 '这时实际m值已经为最大值+1了,这里再次加1,m值变为最大+2
loop while(m <= vlan_line_length)
outgoing.value = Order(outgoing.value)
else
msgbox "请输入show ip mroute结果!"
end if
</SCRIPT>
<SCRIPT FOR="Button3" EVENT="onClick" LANGUAGE="VBScript">
On Error Resume Next
if ((sh_vlan.value <> "") And(lc_slot.value <> "") And (outgoing.value<>"")) then
aps_s = members.value
chang_line = chr(13) & chr(10)
v_line = split(sh_vlan.value,chang_line,-1,1)
v_line_length = UBound(v_line)
vlan_set = split(outgoing.value,chang_line,-1,1)
vlan_set_length = UBound(vlan_set)
do
i = 0
if(vlan_set(vlan_set_length-i) = "") then
vlan_set_length = vlan_set_length - 1
i = i + 1
end if
loop while(vlan_set(vlan_set_length) = "") '去除后面的空字符
intf_dis.value = ""
key_fuzhu = lc_slot.value & "/" '后面将把搜索到诸如"2/1",前面的"2/"删除
lc_port = lc_slot.value & "/d+"
n = 0
i = 0
do
a = "VLANd*" & vlan_set(i)
If IsExist(v_line(n),a) Then '如果找到vlan(i),那么显示vlan(i),并继续向下找端口
intf_dis.value = intf_dis.value & GetKey(v_line(n),"VLANd+",-1) &_
Replace(GetKey(v_line(n),lc_port,-1),key_fuzhu,"") & GetKey(v_line(n),"Agd+",-1)
aps = GetKey(v_line(n),"Agd+",-1)
ap_member = ApToMember(aps,aps_s)
msgbox UBound(ap_member)
intfs = intfs & Replace(GetKey(v_line(n),lc_port,-1),key_fuzhu,"") & ap_member
n = n + 1 '跳到下一行
while((n <= v_line_length) And (Not IsExist(v_line(n),"VLANd+"))) '如果找不到vlanxx,不显示valnxx,但继续向下找端口,直到找到下一个vlanxx时,跳出
intf_dis.value = intf_dis.value & Replace(GetKey(v_line(n),lc_port,-1),key_fuzhu,"") & GetKey(v_line(n),"Agd+",-1)
intfs = intfs & Replace(GetKey(v_line(n),lc_port,-1),key_fuzhu,"") & ap_member
n = n + 1
wend
i = i + 1 'vlan(i)一论搜索结束,调到下一个vlan(i+1)
else
n = n + 1 '这里需要注意,在if为真时,有一个n=n+1,那么这里就不应该在end if后添加n+1,而应该在else下添加n+1
End If
loop while((n <= v_line_length) And (i <= vlan_set_length))
intfs = Order_onlyone(intfs)
intf_set.value = intfs
Pass = "表项一致"
Fail = " 表项不一致!" & chr(13) & chr(10) & "致电黄米青!电话:8595"
if(StrComp(intf_set.value,port_phy.value) = 0) then
MsgBox Pass,64, "Pass"
else
msgbox Fail,48,"Fail"
end if
else
msgbox "请点击'get'计算出show ip mroute的下游口,并输入show vlan结果,以及线卡卡槽!"
end if
</ SCRIPT >
<!-- 以下是各个自定义函数 -->
< SCRIPT LANGUAGE ="VBScript" > ...
Function ssp_to_phy(l3_bitmap,ssp_phy) '功能:转换ssp的位图为物理接口
'参数:1、类型:字符串,位图;2、类型:数组,ssp->物理接口的关系
'返回值:类型string,位图为1对应的所有物理接口,且接口间以回车为间隔的组成的一个字符串
length_l3_bitmap = len(l3_bitmap)
i = 1 '在i小于位图的16进制数的个数时,一直循环,总共要循环(i*4)次
while(i <= length_l3_bitmap)
temp = Mid(StrReverse(l3_bitmap),i,1) 'Mid函数从右向左提取字符,故先反转位图。这里表示依次从l3位图中提取一个16进制数
bin_temp = HexToBin(temp) '调用16进制转2进制函数
l3_bin = StrReverse(bin_temp) '同样道理,因为下面还用使用Mid函数,反转2进制位图
j = 1
while(j <= 4) '16进制数变为2进制,4:1,故循环4次
if(Mid(l3_bin,j,1) = 1) then
ssp_index = (i-1) * 4 + j - 1 '计算当前操作的bit位,在位图中的位置
phy_index = ssp_phy(ssp_index)
ssp_to_phy = phy_index & chr(10)& ssp_to_phy
end if
j = j + 1
wend
i = i + 1
wend
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function HexToBin(str_hex) '功能:16进制数转换为2进制数
'参数:类型:字符,16进制数
'返回值:类型:字符串,4位2进制数
Select Case str_hex
Case "0" HexToBin = "0000"
Case "1" HexToBin = "0001"
Case "2" HexToBin = "0010"
Case "3" HexToBin = "0011"
Case "4" HexToBin = "0100"
Case "5" HexToBin = "0101"
Case "6" HexToBin = "0110"
Case "7" HexToBin = "0111"
Case "8" HexToBin = "1000"
Case "9" HexToBin = "1001"
Case "a" HexToBin = "1010"
Case "b" HexToBin = "1011"
Case "c" HexToBin = "1100"
Case "d" HexToBin = "1101"
Case "e" HexToBin = "1110"
Case "f" HexToBin = "1111"
Case Else MsgBox "输入错误"
End Select
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function IsExist(str,key) '功能:判断是否存在某字符串
'参数:1、类型:字符串,要判断的字符串;2、类型:字符串,关键字(正则表达式)
'返回值:类型:字符串,4位2进制数
Dim regEx, retVal,Maches
Set regEx = New RegExp
regEx.IgnoreCase = False '不区分大小写
regEx.Pattern = key
retVal = regEx.Test(str)
If retVal Then
IsExist = True
else
IsExist = False
End If
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function GetKey(str,key,mode) '功能:搜索所有符合条件的字符串
'参数:1、类型:字符串,要搜索的字符串;2、类型:字符串,关键字(正则表达式);3、类型:boolean,是否全局模式搜索
'返回值:类型:字符串,匹配搜索条件的所有关键字,关键字之间为回车,组成的一个字符串
Dim regEx, retVal,Maches
Set regEx = New RegExp
regEx.IgnoreCase = False '不区分大小写
regEx.Global = mode '全局匹配,找到所有符合条件的关键字,false表示只找到第一个符合条件的关键字
regEx.Pattern = key
Set Matches = regEx.Execute(str)
For Each Match in Matches
GetKey = Match.value & chr(13) & chr(10) & GetKey
Next
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function Order(str) '功能:从大到小排列,不删除重复项
'参数:1、类型:字符串,要排列的字符串
'返回值:类型:字符串,按照从小到大的顺序排列好的字符串
chang_line = chr(13) & chr(10)
dim a
a = split(str,chang_line,-1,1)
a_len = delNull(a)
i = 0
j = a_len
do
do
a(i) = Int(a(i))
a(i+1) = Int(a(i+1))
if(a(i)>a(i+1)) then
temp = a(i)
a(i) = a(i+1)
a(i+1) = temp
end if
i = i + 1
loop while(i < j)
Order = a(j) & chr(13) & chr(10) & Order
j = j -1
i = 0
loop while(j > 0)
Order = a(0) & chr(13) & chr(10) & Order
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function Order_onlyone(str) '功能:从大到小排列,但删除重复项
'参数:1、类型:字符串,要排列的字符串
'返回值:类型:字符串,按照从小到大的顺序排列好的字符串
chang_line = chr(13) & chr(10)
a = Order(str)
a = split(a,chang_line,-1,1)
a_len = UBound(a) - 1
i = 0
do
a(i) = Int(a(i))
a(i+1) = Int(a(i+1))
if(a(i)<>a(i+1)) then
temp = a(i) & chr(13) & chr(10) & temp
end if
i = i + 1
loop while(i < a_len)
temp = a(a_len) & chr(13) & chr(10) & temp
Order_onlyone = Order(temp)
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function LcArray(lc_type) '功能:根据线卡类型,得到ssp和物理接口的关系
'参数:1、类型:字符串,线卡类型
'返回值:类型:数组,返回线卡关系数组
dim ssp_phy_24sfp,ssp_phy_24gt,ssp_phy_48gt0,ssp_phy_48gt1,ssp_phy_3750_24,ssp_phy_5750_24
dim ssp_phy_6610_part1,ssp_phy_6610_part2,ssp_phy_6610_part3,ssp_phy_6610_part4
ssp_phy_24sfp = Array(2,1,4,3,6,5,8,7,10,9,12,11,14,13,16,15,18,17,20,19,22,21,24,23)
ssp_phy_24gt = Array(3,4,1,2,7,8,5,6,11,12,9,10,15,16,13,14,19,20,17,18,23,24,21,22)
ssp_phy_48gt0 = Array(2,1,4,3,6,5,8,7,10,9,12,11,14,13,16,15,18,17,20,19,22,21,24,23)
ssp_phy_48gt1 = Array(26,25,28,27,30,29,32,31,34,33,36,35,38,37,40,39,43,44,41,42,47,48,45,46)
ssp_phy_3750_24 = Array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24)
ssp_phy_5750_24 = Array(4,3,2,1,8,7,6,5,12,11,10,9,16,15,14,13,20,19,18,17,24,23,22,21)
ssp_phy_6610 = Array(6,5,4,3,2,1,12,11,10,9,8,7,18,17,16,15,14,13,24,23,22,21,20,19 )
Select Case lc_type
Case "1" LcArray = ssp_phy_24sfp
Case "2" LcArray = ssp_phy_24gt
Case "3" LcArray = ssp_phy_48gt0
Case "4" LcArray = ssp_phy_48gt1
Case "5" LcArray = ssp_phy_3750_24
Case "6" LcArray = ssp_phy_5750_24
Case "7" LcArray = ssp_phy_6610
Case Else MsgBox "请选择线卡类型!"
End Select
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function ApToMember(str,str_member) '功能:判断当前行是否存在ap口,存在转化为成员口
'参数:1、类型:字符串
'返回值:类型:字符串,所有成员口组成的字符串
'返回值:类型:字符串,成员口组成的字符串
if(IsExist(str,"Agd+")) then
chang_line = chr(13) & chr(10)
aps = GetKey(str,"Agd+",-1)
aps = split(aps,chang_line,-1,1)
aps_s = GetKey(str_member,"Agd+",-1)
aps_s = split(aps_s,chang_line,-1,1)
single_str = split(str_member,chang_line,-1,1)
single_str_length = delNull(single_str)
aps_s_length = delNull(aps_s)
aps_length = delNull(aps)
i = 0
j = 0
Do
x=0
do
If(aps(i)= aps_s(x)) Then
y = 0
Do
If(single_str(y) = aps_s(x)) Then
j = y
End If
If(single_str(y) = aps_s(x)) Then Exit do
y = y + 1
Loop While(y<=single_str_length) '这个循环为了找到匹配的ap口,在ap+成员字符串中的坐标
x = x + 1
do
If(Left(single_str(j),2)<>"Ag") Then
temp = single_str(j) & chang_line & temp
End If
j = j + 1
If(j>single_str_length) Then Exit do
Loop While((j<=single_str_length) And (Left(single_str(j),2)<>"Ag")) '从匹配的ap口开始,向下累加成员口到下一个ap口
Else
x = x + 1
End If
Loop While(x<=aps_s_length) '将一个要比较的ap口匹配完所有的ap口
i = i + 1
Loop While(i<=aps_length) '要比较的所有ap口依次匹配,至完全
ApToMember = temp
end if
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function delNull(str)
str_length = UBound(str)
do
i = 0
if(str(str_length-i) = "") then
str_length = str_length - 1
i = i + 1
end If
loop while(str(str_length) = "") '去除后面的空字符
delNull = str_length
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function phy_to_ssp(old_array) '功能:将ssp-〉物理口的映射,转化为物理口->ssp的映射
'参数:1、类型:数组
'返回值:类型:数组
Length = UBound(old_array)
new_array = old_array
i = 0
j = Length
do
do
if(new_array(i)>new_array(i+1)) then
temp = new_array(i)
new_array(i) = new_array(i+1)
new_array(i+1) = temp
end if
i = i + 1
loop while(i < j)
j = j -1
i = 0
loop while(j > 0)
i = 0
j = 0
do
Do
temp = new_array(j)
If(temp = old_array(i)) Then
new_array(j) = i + 1
If(temp = old_array(i)) then Exit do
End if
i = i + 1
Loop While(i<=Length)
j = j + 1
i = 0
Loop While(j<=Length)
phy_to_ssp = new_array
End Function
</ SCRIPT >
< SCRIPT LANGUAGE ="VBScript" > ...
Function ArrayLc(lc_type) '功能:根据线卡类型,得到物理接口->ssp的关系
'参数:1、类型:字符串,线卡类型
'返回值:类型:数组,返回线卡关系数组
dim ssp_phy_6610_part1,ssp_phy_6610_part2,ssp_phy_6610_part3,ssp_phy_6610_part4
ssp_phy_6610_part1 = Array(5,4,3,2,1,0)
ssp_phy_6610_part2 = Array(11,10,9,8,7,6)
ssp_phy_6610_part3 = Array(17,16,15,14,13,12)
ssp_phy_6610_part4 = Array(23,22,21,20,19,18)
if(slots_num.value<>"") then
lc_num = slots_num.value
if(lc_type="7") then
if(lc_num="1" or lc_num="4") then
ArrayLc = ssp_phy_6610_part3
elseif(lc_num="2" or lc_num="5") then
ArrayLc = ssp_phy_6610_part2
elseif(lc_num="6" or lc_num="8") then
ArrayLc = ssp_phy_6610_part1
elseif(lc_num="3" or lc_num="7") then
ArrayLc = ssp_phy_6610_part4
end if
end if
end if
End Function
</ SCRIPT >
</ body >
</ html >