network-utility 1.1.27 → 1.1.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,8 +7,11 @@
7
7
  @sign << ["ZXCTN9000-18EA", "接口基本信息"]
8
8
  @sign << ["ZXCTN9000-18EA", "接口vlan信息"]
9
9
  @sign << ["ZXCTN9000-18EA", "接口acl信息"]
10
+ @sign << ["ZXCTN9000-18EA", "接口urpf信息"]
10
11
  @sign << ["ZXCTN9000-18EA", "接口mpls信息"]
11
12
  @sign << ["ZXCTN9000-18EA", "接口lacp信息"]
13
+ @sign << ["ZXCTN9000-18EA", "接口am信息"]
14
+ @sign << ["ZXCTN9000-18EA", "接口uim信息"]
12
15
  @sign << ["ZXCTN9000-18EA", "接口isis信息"]
13
16
  @sign << ["ZXCTN9000-18EA", "接口multicast信息"]
14
17
  @sign << ["ZXCTN9000-18EA", "接口firload信息"]
@@ -49,8 +52,20 @@ module ZXCTN9000_18EA
49
52
  #####################################################################################################
50
53
  # 接口/端口配置的基本查询
51
54
  # 接口集合 => 接口分检 => 物理接口集合,子接口集合,特殊接口集合
52
-
53
- # 主动模块:
55
+ # 1. 接口物理信息
56
+ # 2. 接口基本信息
57
+ # 3. 接口vlan信息
58
+ # 4. 接口acl信息
59
+ # 5. 接口urpf信息
60
+ # 6. 接口mpls信息
61
+ # 7. 接口lacp信息
62
+ # 8. 接口am信息
63
+ # 9. 接口uim信息
64
+ # 10.接口isis信息
65
+ # 11.接口multicast信息
66
+ #
67
+ # 新城更新模块:
68
+ # 1. 主动模块:
54
69
  # firload
55
70
  # port-request-info
56
71
  # if-intf
@@ -68,8 +83,8 @@ module ZXCTN9000_18EA
68
83
  # ospfv2
69
84
  # ospfv3
70
85
  # qos # 未实现
71
-
72
- # 被动模块:(暂不关联)
86
+ #
87
+ # 2. 被动模块:(暂不关联)
73
88
  # samgr
74
89
  # monitor
75
90
  # alarm
@@ -83,8 +98,8 @@ module ZXCTN9000_18EA
83
98
  [self.接口物理信息(正文), self.接口基本信息(正文), self.接口vlan信息(正文), self.接口acl信息(正文),
84
99
  self.接口mpls信息(正文), self.接口isis信息(正文), self.接口multicast信息(正文), self.接口lacp信息(正文),
85
100
  self.接口firload信息(正文), self.接口port_request_info信息(正文), self.接口ospf信息(正文),
86
- self.接口arp信息(正文), self.接口nd信息(正文), self.接口interface_performance信息(正文),
87
- # self.接口urpf信息(正文), self.接口am信息(正文), self.接口uim信息(正文),
101
+ self.接口arp信息(正文), self.接口nd信息(正文), self.接口interface_performance信息(正文),
102
+ self.接口urpf信息(正文), self.接口am信息(正文), self.接口uim信息(正文),
88
103
  ].each do|infolist|
89
104
  infolist.each do|intf,text|
90
105
  接口表[intf]||=[]
@@ -93,7 +108,7 @@ module ZXCTN9000_18EA
93
108
  end
94
109
  接口表
95
110
  end
96
-
111
+
97
112
  def 接口物理信息 正文
98
113
  tag = 正文["PORT-PHYSICAL-INFO"] ? "PORT-PHYSICAL-INFO" : "port-physical-config"
99
114
  接口物理表 = {}
@@ -104,11 +119,11 @@ module ZXCTN9000_18EA
104
119
  elsif tag == "port-physical-config"
105
120
  (正文[tag]||"").split("\n$")\
106
121
  .collect{|l|"<#{tag}>\n"+l.strip+"\n!\n</#{tag}>" if l!="\n!"}\
107
- .compact.each{|接口|接口物理表[/interface (.)*/.match(接口)[0].to_s.strip] = 接口}
122
+ .compact.each{|接口|接口物理表[/interface (.)*/.match(接口)[0].to_s.strip] = 接口}
108
123
  end
109
124
  接口物理表
110
125
  end
111
-
126
+
112
127
  def 接口基本信息 正文
113
128
  tag = 正文["INTERFACE"] ? "INTERFACE" : "if-intf"
114
129
  接口基本表 = {}
@@ -125,7 +140,7 @@ module ZXCTN9000_18EA
125
140
  end
126
141
  接口基本表
127
142
  end
128
-
143
+
129
144
  def 接口vlan信息 正文
130
145
  tag = 正文["VLAN"] ? "VLAN" : "vlan"
131
146
  接口vlan表 = {}
@@ -155,7 +170,22 @@ module ZXCTN9000_18EA
155
170
  end
156
171
  接口acl表
157
172
  end
158
-
173
+
174
+ def 接口urpf信息 正文
175
+ tag = 正文["URPF"] ? "URPF" : "urpf"
176
+ 接口urpf表 = {}
177
+ if tag == "URPF"
178
+ (正文[tag]||"").split("\n!")\
179
+ .collect{|l|"<#{tag}>\n"+l.strip+"\n!\n</#{tag}>" if l!="\n!"}\
180
+ .compact.each{|接口|接口urpf表[/interface (.)*/.match(接口)[0].to_s.strip]=接口}
181
+ elsif tag == "urpf"
182
+ (正文[tag]||"").split("\n$")\
183
+ .collect{|l|"<#{tag}>\n"+l.strip+"\n!\n</#{tag}>" if l!="\n!"}\
184
+ .compact.each{|接口|接口urpf表[/interface (.)*/.match(接口)[0].to_s.strip]=接口}
185
+ end
186
+ 接口urpf表
187
+ end
188
+
159
189
  def 接口mpls信息 正文
160
190
  tag = 正文["MPLS"] ? "MPLS" : "ldp"
161
191
  接口mpls表 = {}
@@ -170,7 +200,7 @@ module ZXCTN9000_18EA
170
200
  end
171
201
  接口mpls表
172
202
  end
173
-
203
+
174
204
  def 接口lacp信息 正文 # trunk
175
205
  tag = 正文["LACP"] ? "LACP" : "lacp"
176
206
  接口lacp表 = {}
@@ -186,6 +216,50 @@ module ZXCTN9000_18EA
186
216
  接口lacp表
187
217
  end
188
218
 
219
+ def 接口am信息 正文
220
+ tag = 正文["AM"] ? "AM" : "am"
221
+ 接口am表 = {}
222
+ if tag == "AM"
223
+ context,fragments = TextAbstract.draw_fragments (正文[tag]||""), /^ interface (.)*/, /^ \$/
224
+ head,tail = "<#{tag}>\n#{context[0..-3]}\n","!\n</#{tag}>" # context tail(!\n)
225
+ fragments.each{|frag|接口am表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
226
+ elsif tag == "am"
227
+ context,fragments = TextAbstract.draw_fragments (正文[tag]||""), /^ interface (.)*/, /^ \$/
228
+ head,tail = "<#{tag}>\n#{context[0..-3]}\n","!\n</#{tag}>" # context tail(!\n)
229
+ fragments.each{|frag|接口am表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
230
+ end
231
+ 接口am表
232
+ end
233
+
234
+ def 接口uim信息 正文
235
+ tag = 正文["UIM"] ? "UIM" : "uim"
236
+ 接口uim表 = {}
237
+ if tag =="UIM"
238
+ za,vcc = TextAbstract.draw_fragments (正文[tag]||""), /^vcc\-configuration/, /^\!/
239
+ za,vbui= TextAbstract.draw_fragments (正文[tag]||""), /^vbui\-configuration/, /^\!/
240
+ # vcc
241
+ context,fragments = TextAbstract.draw_fragments vcc.join, /^ interface (.)*/, /^ \$/
242
+ head,tail = "<#{tag}>\n#{context[0..-3]}","!\n</#{tag}>" # context tail(\n!\n)
243
+ fragments.each{|frag|接口uim表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
244
+ # vbui
245
+ context,fragments = TextAbstract.draw_fragments vbui.join, /^ interface (.)*/, /^ \$/
246
+ head,tail = "<#{tag}>\n#{context[0..-3]}","!\n</#{tag}>" # context tail(\n!\n)
247
+ fragments.each{|frag|接口uim表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
248
+ elsif tag =="uim"
249
+ za,vcc = TextAbstract.draw_fragments (正文[tag]||""), /^vcc\-configuration/, /^\$/
250
+ za,vbui= TextAbstract.draw_fragments (正文[tag]||""), /^vbui\-configuration/, /^\$/
251
+ # vcc
252
+ context,fragments = TextAbstract.draw_fragments vcc.join, /^ interface (.)*/, /^ \$/
253
+ head,tail = "<#{tag}>\n#{context[0..-3]}","!\n</#{tag}>" # context tail(\n!\n)
254
+ fragments.each{|frag|接口uim表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
255
+ # vbui
256
+ context,fragments = TextAbstract.draw_fragments vbui.join, /^ interface (.)*/, /^ \$/
257
+ head,tail = "<#{tag}>\n#{context[0..-3]}","!\n</#{tag}>" # context tail(\n!\n)
258
+ fragments.each{|frag|接口uim表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
259
+ end
260
+ 接口uim表
261
+ end
262
+
189
263
  def 接口isis信息 正文
190
264
  tag = 正文["ISIS"] ? "ISIS" : "isis"
191
265
  接口isis表 = {}
@@ -200,7 +274,7 @@ module ZXCTN9000_18EA
200
274
  end
201
275
  接口isis表
202
276
  end
203
-
277
+
204
278
  def 接口multicast信息 正文
205
279
  tag = 正文["MULTICAST"] ? "MULTICAST" : "multicast"
206
280
  接口multicast表 = {}
@@ -309,7 +383,7 @@ module ZXCTN9000_18EA
309
383
  end
310
384
  end
311
385
  end
312
-
386
+
313
387
  tag = 正文["ospfv3"] ? "ospfv3" : "ospfv3"
314
388
  接口ospfv3表 = {}
315
389
  if tag == "ospfv3"
@@ -341,9 +415,9 @@ module ZXCTN9000_18EA
341
415
  .collect{|l|"<#{tag}>\n"+l.strip+"\n!\n</#{tag}>" if l!="\n!"}\
342
416
  .compact.each{|接口|接口urpf表[/interface (.)*/.match(接口)[0].to_s.strip]=接口}
343
417
  end
344
- 接口urpf表
418
+ 接口urpf表
345
419
  end
346
-
420
+
347
421
  def 接口am信息 正文
348
422
  tag = 正文["AM"] ? "AM" : "am"
349
423
  接口am表 = {}
@@ -358,7 +432,7 @@ module ZXCTN9000_18EA
358
432
  end
359
433
  接口am表
360
434
  end
361
-
435
+
362
436
  def 接口uim信息 正文
363
437
  tag = 正文["UIM"] ? "UIM" : "uim"
364
438
  接口uim表 = {}
@@ -411,8 +485,8 @@ module ZXCTN9000_18EA
411
485
  cars[current]['cbs'] = words.index('cbs') ? words[words.index('cbs')+1]+'bytes' : ''
412
486
  cars[current]['pbs'] = words.index('pbs') ? words[words.index('pbs')+1]+'bytes' : ''
413
487
  cars[current]['action'] = [
414
- words.index('conform-action') ? words[words.index('conform-action')+1] : '',
415
- words.index('exceed-action') ? words[words.index('exceed-action')+1] : '',
488
+ words.index('conform-action') ? words[words.index('conform-action')+1] : '',
489
+ words.index('exceed-action') ? words[words.index('exceed-action')+1] : '',
416
490
  words.index('violate-action') ? words[words.index('violate-action')+1] : ''
417
491
  ]
418
492
  end
@@ -438,7 +512,7 @@ module ZXCTN9000_18EA
438
512
  end
439
513
  svc_policy
440
514
  end
441
-
515
+
442
516
  # func: 端口统计功能
443
517
  def 接口统计 正文
444
518
  tag = 正文["interface-performance"] ? 'interface-performance' : 'interface-performance'
@@ -455,7 +529,7 @@ module ZXCTN9000_18EA
455
529
  intf_perf.delete(nil)
456
530
  intf_perf
457
531
  end
458
-
532
+
459
533
  # func: 端口URPF功能
460
534
  def 接口URPF 正文
461
535
  接口urpf表 = self.接口urpf信息 正文
@@ -470,7 +544,7 @@ module ZXCTN9000_18EA
470
544
  end
471
545
  urpf
472
546
  end
473
-
547
+
474
548
  # func: 端口接入类型
475
549
  def 接口接入类型 正文
476
550
  接口uim表 = self.接口uim信息 正文
@@ -488,11 +562,11 @@ module ZXCTN9000_18EA
488
562
  特殊接口集合 << [key]+configs if key.include?('loopback') || key.include?('null') || \
489
563
  key.include?('extimer') || key.include?('vbui') || key.include?('spi') || \
490
564
  key.include?('gcvi') || key.include?('guvi') || key.include?('mgmt_eth') || \
491
- key.include?('qx_eth') || key.include?('qx') || key.include?('gre_tunnel')
565
+ key.include?('qx_eth') || key.include?('qx') || key.include?('gre_tunnel') || key.include?('vxlan_tunnel')
492
566
  end
493
567
  特殊接口集合
494
568
  end
495
-
569
+
496
570
  def 物理接口配置 接口集合,特殊接口集合=nil
497
571
  物理接口集合 = []
498
572
  例外 = (特殊接口集合 ? 特殊接口集合 : (self.特殊接口配置 接口集合)).collect{|c|c[0]}
@@ -501,7 +575,7 @@ module ZXCTN9000_18EA
501
575
  end
502
576
  物理接口集合
503
577
  end
504
-
578
+
505
579
  def 子接口配置 接口集合,特殊接口集合=nil
506
580
  子接口集合 = []
507
581
  例外 = (特殊接口集合 ? 特殊接口集合 : (self.特殊接口配置 接口集合)).collect{|c|c[0]}
@@ -510,7 +584,7 @@ module ZXCTN9000_18EA
510
584
  end
511
585
  子接口集合
512
586
  end
513
-
587
+
514
588
  def 接口分捡 接口集合
515
589
  特殊接口集合 = self.特殊接口配置 接口集合
516
590
  物理接口集合 = self.物理接口配置 接口集合,特殊接口集合
@@ -526,19 +600,19 @@ module ZXCTN9000_18EA
526
600
  # func: 根据一个端口的描述信息,给出其格式化的类型、连接符、端口编号
527
601
  def 端口识别 描述
528
602
  描述 = 描述[0] if 描述.instance_of?(Array) # M6000取接口配置中名称部分 [name,<tag>...</tag>,...]
529
- type = /xgei|gei|ulei|smartgroup|loopback|extimer|vbui|null|guvi|gcvi|mgmt_eth|vei|spi|flexe_client|flexe_group|ptp|gps|qx_eth|qx|bvi|pw|subvlan/.match(描述)
603
+ type = /xgei|gei|ulei|smartgroup|loopback|eth_dslgroup|extimer|vbui|vlan|virtual_template|vei|null|guvi|gcvi|gre_tunnel|mgmt_eth|ulei|irb|spi|vxlan_tunnel|flexe_client|flexe_group|ptp|gps|qx_eth|qx|bvi|pw|subvlan/.match(描述)
530
604
  类型 = type ? type.to_s : '未知类型'
531
605
  port = /(\d+|\/|\.)*(\d+)/.match(描述.split(类型).join)
532
606
  端口 = port ? port.to_s : '未知端口'
533
607
  端口 = '' if 类型=='mgmt_eth'
534
- 连接符 = if ['smartgroup','loopback','vbui','null','mgmt_eth','vei','flexe_client','flexe_group','qx','bvi','pw','subvlan'].include?(类型)
535
- ''
608
+ 连接符 = if ['smartgroup','loopback','vlan','vbui','null','mgmt_eth','irb','vei','eth_dslgroup','vxlan_tunnel','flexe_client','flexe_group','qx','bvi','pw','subvlan','gre_tunnel','virtual_template'].include?(类型)
609
+ ''
536
610
  elsif ['xgei','gei','ulei','extimer','guvi','gcvi','spi','ptp','gps','qx_eth'].include?(类型)
537
611
  '-'
538
612
  end
539
613
  return 类型,连接符,端口
540
614
  end
541
-
615
+
542
616
  # func: 根据一个端口的描述信息,给出其mac地址,若无mac则返回nil
543
617
  def 端口MAC 描述
544
618
  描述.each_line do|line|
@@ -549,7 +623,7 @@ module ZXCTN9000_18EA
549
623
  end
550
624
  return nil
551
625
  end
552
-
626
+
553
627
  # func: 根据一个端口的描述信息,给出其管理状态是打开/关闭的判断
554
628
  def 端口管理状态 描述
555
629
  描述 = 描述[1..-1].join("\n") if 描述.instance_of?(Array) # M6000取接口配置中名称部分 [name,<tag>...</tag>,...]
@@ -582,7 +656,7 @@ module ZXCTN9000_18EA
582
656
  end
583
657
  地址集
584
658
  end
585
-
659
+
586
660
  # func: 根据一个端口的配置给出其开关状态(配置层面的"端口管理状态")
587
661
  def 接口开关 接口配置
588
662
  描述 = '' # for phy_if is shutdown, for sub_if,smartgroup are open
@@ -599,7 +673,7 @@ module ZXCTN9000_18EA
599
673
  end
600
674
  描述
601
675
  end
602
-
676
+
603
677
  # func: 根据一个端口的配置给出其关联的vpn实例
604
678
  def 接口vpn实例 接口配置
605
679
  实例 = ''
@@ -609,15 +683,14 @@ module ZXCTN9000_18EA
609
683
  实例
610
684
  end
611
685
 
612
-
613
686
  #####################################################################################################
614
687
  # 聚合接口判定相关
615
688
  #####################################################################################################
616
-
689
+
617
690
  # func: 根据一个接口的描述信息,给出其所属聚合接口的信息,若非聚合端口返回空
618
691
  def 聚合接口判定 配置
619
692
  配置.join.split("\n").each do|描述|
620
- if 描述.include?("smartgroup") && 描述.include?("mode") &&
693
+ if 描述.include?("smartgroup") && 描述.include?("mode") &&
621
694
  !描述.include?("description") && !self.端口识别(配置).join.include?("smartgroup")
622
695
  return {self.端口识别(配置).join=>"smartgroup"+描述.strip.split(" ")[1]}
623
696
  end
@@ -673,7 +746,7 @@ module ZXCTN9000_18EA
673
746
  invlan = eval(pattern[1].to_s.gsub('-','..'))
674
747
  if exvlan.instance_of?(Range)
675
748
  exvlan.each{|exv|vlan['qinq'] << [exv,invlan]}
676
- elsif exvlan.instance_of?(Fixnum)
749
+ elsif exvlan.instance_of?(Integer) # Fixnum
677
750
  vlan['qinq'] << [exvlan,invlan]
678
751
  end;next
679
752
  end
@@ -684,7 +757,7 @@ module ZXCTN9000_18EA
684
757
  end
685
758
  return vlan # {vlan:[ int|range ] qinq:[ [int,int|range] ] dot1q:[ int ]}
686
759
  end
687
-
760
+
688
761
  def vlan统计 name,物理接口集合,子接口集合
689
762
  bas子接口数据库,聚合接口表 = {},[]
690
763
  聚合接口集合 = 物理接口集合.select{|物理接口|self.端口识别(物理接口)[0]=='smartgroup'}
@@ -695,7 +768,7 @@ module ZXCTN9000_18EA
695
768
  物理接口 = 物理接口集合.find{|物理接口|物理接口[0].split(" ")[1]==(物理接口名称)}
696
769
  next unless self.端口管理状态(物理接口) # 物理接口关闭的不统计
697
770
  next unless self.端口管理状态(接口配置) # 子接口关闭的不统计
698
-
771
+
699
772
  vlan配置 = {}
700
773
  self.vlan分捡(接口配置).each do|type,data|
701
774
  if type=='vlan' || type=='dot1q'
@@ -704,13 +777,13 @@ module ZXCTN9000_18EA
704
777
  data.each{|pvlan,cvlan|vlan配置[pvlan] ||= []; vlan配置[pvlan] << cvlan}
705
778
  end
706
779
  end
707
-
780
+
708
781
  子接口名称 = self.端口识别(接口配置)
709
782
  if 子接口名称[0].include?("gei")
710
783
  # 子接口索引 = ["eth--"+子接口名称[-1].split(".")[0].split('/')[-3..-1].join(',')] # AIBOS风格
711
784
  子接口索引 = [子接口名称.join.split(".")[0]] # 原生风格
712
785
  end
713
- if 子接口名称[0].include?("smartgroup") &&
786
+ if 子接口名称[0].include?("smartgroup") &&
714
787
  聚合接口组 = 聚合接口表.find{|聚合接口组|聚合接口组.include?(子接口名称.join.split('.')[0])}
715
788
  聚合接口的等效名称 = 聚合接口组.clone;
716
789
  # 聚合接口的等效名称.delete(子接口名称.join.split('.')[0]) # 除了smartgroup自身,为所有等效接口创建 # 是否保留smartgroup是个争议
@@ -739,7 +812,7 @@ module ZXCTN9000_18EA
739
812
  #####################################################################################################
740
813
  # 接口相关统计信息的处理
741
814
  #####################################################################################################
742
-
815
+
743
816
  # gei-x/x/x.00000xxx => gei-x/x/x.xxx
744
817
  # 一些统计场合子接口会补前置0,这里可以将其去掉
745
818
  def 端口去0 描述
@@ -7,8 +7,11 @@
7
7
  @sign << ["ZXCTN9000-8EA", "接口基本信息"]
8
8
  @sign << ["ZXCTN9000-8EA", "接口vlan信息"]
9
9
  @sign << ["ZXCTN9000-8EA", "接口acl信息"]
10
+ @sign << ["ZXCTN9000-8EA", "接口urpf信息"]
10
11
  @sign << ["ZXCTN9000-8EA", "接口mpls信息"]
11
12
  @sign << ["ZXCTN9000-8EA", "接口lacp信息"]
13
+ @sign << ["ZXCTN9000-8EA", "接口am信息"]
14
+ @sign << ["ZXCTN9000-8EA", "接口uim信息"]
12
15
  @sign << ["ZXCTN9000-8EA", "接口isis信息"]
13
16
  @sign << ["ZXCTN9000-8EA", "接口multicast信息"]
14
17
  @sign << ["ZXCTN9000-8EA", "接口firload信息"]
@@ -49,8 +52,20 @@ module ZXCTN9000_8EA
49
52
  #####################################################################################################
50
53
  # 接口/端口配置的基本查询
51
54
  # 接口集合 => 接口分检 => 物理接口集合,子接口集合,特殊接口集合
52
-
53
- # 主动模块:
55
+ # 1. 接口物理信息
56
+ # 2. 接口基本信息
57
+ # 3. 接口vlan信息
58
+ # 4. 接口acl信息
59
+ # 5. 接口urpf信息
60
+ # 6. 接口mpls信息
61
+ # 7. 接口lacp信息
62
+ # 8. 接口am信息
63
+ # 9. 接口uim信息
64
+ # 10.接口isis信息
65
+ # 11.接口multicast信息
66
+ #
67
+ # 新城更新模块:
68
+ # 1. 主动模块:
54
69
  # firload
55
70
  # port-request-info
56
71
  # if-intf
@@ -68,8 +83,8 @@ module ZXCTN9000_8EA
68
83
  # ospfv2
69
84
  # ospfv3
70
85
  # qos # 未实现
71
-
72
- # 被动模块:(暂不关联)
86
+ #
87
+ # 2. 被动模块:(暂不关联)
73
88
  # samgr
74
89
  # monitor
75
90
  # alarm
@@ -84,7 +99,7 @@ module ZXCTN9000_8EA
84
99
  self.接口mpls信息(正文), self.接口isis信息(正文), self.接口multicast信息(正文), self.接口lacp信息(正文),
85
100
  self.接口firload信息(正文), self.接口port_request_info信息(正文), self.接口ospf信息(正文),
86
101
  self.接口arp信息(正文), self.接口nd信息(正文), self.接口interface_performance信息(正文),
87
- # self.接口urpf信息(正文), self.接口am信息(正文), self.接口uim信息(正文),
102
+ self.接口urpf信息(正文), self.接口am信息(正文), self.接口uim信息(正文),
88
103
  ].each do|infolist|
89
104
  infolist.each do|intf,text|
90
105
  接口表[intf]||=[]
@@ -155,7 +170,22 @@ module ZXCTN9000_8EA
155
170
  end
156
171
  接口acl表
157
172
  end
158
-
173
+
174
+ def 接口urpf信息 正文
175
+ tag = 正文["URPF"] ? "URPF" : "urpf"
176
+ 接口urpf表 = {}
177
+ if tag == "URPF"
178
+ (正文[tag]||"").split("\n!")\
179
+ .collect{|l|"<#{tag}>\n"+l.strip+"\n!\n</#{tag}>" if l!="\n!"}\
180
+ .compact.each{|接口|接口urpf表[/interface (.)*/.match(接口)[0].to_s.strip]=接口}
181
+ elsif tag == "urpf"
182
+ (正文[tag]||"").split("\n$")\
183
+ .collect{|l|"<#{tag}>\n"+l.strip+"\n!\n</#{tag}>" if l!="\n!"}\
184
+ .compact.each{|接口|接口urpf表[/interface (.)*/.match(接口)[0].to_s.strip]=接口}
185
+ end
186
+ 接口urpf表
187
+ end
188
+
159
189
  def 接口mpls信息 正文
160
190
  tag = 正文["MPLS"] ? "MPLS" : "ldp"
161
191
  接口mpls表 = {}
@@ -186,6 +216,50 @@ module ZXCTN9000_8EA
186
216
  接口lacp表
187
217
  end
188
218
 
219
+ def 接口am信息 正文
220
+ tag = 正文["AM"] ? "AM" : "am"
221
+ 接口am表 = {}
222
+ if tag == "AM"
223
+ context,fragments = TextAbstract.draw_fragments (正文[tag]||""), /^ interface (.)*/, /^ \$/
224
+ head,tail = "<#{tag}>\n#{context[0..-3]}\n","!\n</#{tag}>" # context tail(!\n)
225
+ fragments.each{|frag|接口am表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
226
+ elsif tag == "am"
227
+ context,fragments = TextAbstract.draw_fragments (正文[tag]||""), /^ interface (.)*/, /^ \$/
228
+ head,tail = "<#{tag}>\n#{context[0..-3]}\n","!\n</#{tag}>" # context tail(!\n)
229
+ fragments.each{|frag|接口am表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
230
+ end
231
+ 接口am表
232
+ end
233
+
234
+ def 接口uim信息 正文
235
+ tag = 正文["UIM"] ? "UIM" : "uim"
236
+ 接口uim表 = {}
237
+ if tag =="UIM"
238
+ za,vcc = TextAbstract.draw_fragments (正文[tag]||""), /^vcc\-configuration/, /^\!/
239
+ za,vbui= TextAbstract.draw_fragments (正文[tag]||""), /^vbui\-configuration/, /^\!/
240
+ # vcc
241
+ context,fragments = TextAbstract.draw_fragments vcc.join, /^ interface (.)*/, /^ \$/
242
+ head,tail = "<#{tag}>\n#{context[0..-3]}","!\n</#{tag}>" # context tail(\n!\n)
243
+ fragments.each{|frag|接口uim表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
244
+ # vbui
245
+ context,fragments = TextAbstract.draw_fragments vbui.join, /^ interface (.)*/, /^ \$/
246
+ head,tail = "<#{tag}>\n#{context[0..-3]}","!\n</#{tag}>" # context tail(\n!\n)
247
+ fragments.each{|frag|接口uim表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
248
+ elsif tag =="uim"
249
+ za,vcc = TextAbstract.draw_fragments (正文[tag]||""), /^vcc\-configuration/, /^\$/
250
+ za,vbui= TextAbstract.draw_fragments (正文[tag]||""), /^vbui\-configuration/, /^\$/
251
+ # vcc
252
+ context,fragments = TextAbstract.draw_fragments vcc.join, /^ interface (.)*/, /^ \$/
253
+ head,tail = "<#{tag}>\n#{context[0..-3]}","!\n</#{tag}>" # context tail(\n!\n)
254
+ fragments.each{|frag|接口uim表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
255
+ # vbui
256
+ context,fragments = TextAbstract.draw_fragments vbui.join, /^ interface (.)*/, /^ \$/
257
+ head,tail = "<#{tag}>\n#{context[0..-3]}","!\n</#{tag}>" # context tail(\n!\n)
258
+ fragments.each{|frag|接口uim表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
259
+ end
260
+ 接口uim表
261
+ end
262
+
189
263
  def 接口isis信息 正文
190
264
  tag = 正文["ISIS"] ? "ISIS" : "isis"
191
265
  接口isis表 = {}
@@ -488,7 +562,7 @@ module ZXCTN9000_8EA
488
562
  特殊接口集合 << [key]+configs if key.include?('loopback') || key.include?('null') || \
489
563
  key.include?('extimer') || key.include?('vbui') || key.include?('spi') || \
490
564
  key.include?('gcvi') || key.include?('guvi') || key.include?('mgmt_eth') || \
491
- key.include?('qx_eth') || key.include?('qx') || key.include?('gre_tunnel')
565
+ key.include?('qx_eth') || key.include?('qx') || key.include?('gre_tunnel') || key.include?('vxlan_tunnel')
492
566
  end
493
567
  特殊接口集合
494
568
  end
@@ -526,12 +600,12 @@ module ZXCTN9000_8EA
526
600
  # func: 根据一个端口的描述信息,给出其格式化的类型、连接符、端口编号
527
601
  def 端口识别 描述
528
602
  描述 = 描述[0] if 描述.instance_of?(Array) # M6000取接口配置中名称部分 [name,<tag>...</tag>,...]
529
- type = /xgei|gei|ulei|smartgroup|loopback|extimer|vbui|null|guvi|gcvi|mgmt_eth|vei|spi|flexe_client|flexe_group|ptp|gps|qx_eth|qx|bvi|pw|subvlan/.match(描述)
603
+ type = /xgei|gei|ulei|smartgroup|loopback|eth_dslgroup|extimer|vbui|vlan|virtual_template|vei|null|guvi|gcvi|gre_tunnel|mgmt_eth|ulei|irb|spi|vxlan_tunnel|flexe_client|flexe_group|ptp|gps|qx_eth|qx|bvi|pw|subvlan/.match(描述)
530
604
  类型 = type ? type.to_s : '未知类型'
531
605
  port = /(\d+|\/|\.)*(\d+)/.match(描述.split(类型).join)
532
606
  端口 = port ? port.to_s : '未知端口'
533
607
  端口 = '' if 类型=='mgmt_eth'
534
- 连接符 = if ['smartgroup','loopback','vbui','null','mgmt_eth','vei','flexe_client','flexe_group','qx','bvi','pw','subvlan'].include?(类型)
608
+ 连接符 = if ['smartgroup','loopback','vlan','vbui','null','mgmt_eth','irb','vei','eth_dslgroup','vxlan_tunnel','flexe_client','flexe_group','qx','bvi','pw','subvlan','gre_tunnel','virtual_template'].include?(类型)
535
609
  ''
536
610
  elsif ['xgei','gei','ulei','extimer','guvi','gcvi','spi','ptp','gps','qx_eth'].include?(类型)
537
611
  '-'
@@ -609,7 +683,6 @@ module ZXCTN9000_8EA
609
683
  实例
610
684
  end
611
685
 
612
-
613
686
  #####################################################################################################
614
687
  # 聚合接口判定相关
615
688
  #####################################################################################################
@@ -673,7 +746,7 @@ module ZXCTN9000_8EA
673
746
  invlan = eval(pattern[1].to_s.gsub('-','..'))
674
747
  if exvlan.instance_of?(Range)
675
748
  exvlan.each{|exv|vlan['qinq'] << [exv,invlan]}
676
- elsif exvlan.instance_of?(Fixnum)
749
+ elsif exvlan.instance_of?(Integer) # Fixnum
677
750
  vlan['qinq'] << [exvlan,invlan]
678
751
  end;next
679
752
  end
data/network.rb CHANGED
@@ -22,5 +22,5 @@
22
22
  ].each{|mod|require mod}
23
23
 
24
24
  module Network
25
- VERSION = '1.1.27'
25
+ VERSION = '1.1.28'
26
26
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: network-utility
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.27
4
+ version: 1.1.28
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt