network-utility 1.1.4

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.
Files changed (179) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +2 -0
  3. data/document/acl-M6000-16E.md +27 -0
  4. data/document/acl-M6000-18S.md +27 -0
  5. data/document/acl-M6000-8.md +27 -0
  6. data/document/acl-M6000-8E.md +27 -0
  7. data/document/acl-MA5200G-8.md +204 -0
  8. data/document/acl-ME60-16.md +177 -0
  9. data/document/acl-ME60-X16.md +177 -0
  10. data/document/acl-NE40E-X16.md +204 -0
  11. data/document/acl-NE40E-X16A.md +204 -0
  12. data/document/acl-NE40E-X8.md +204 -0
  13. data/document/acl-NE40E.md +204 -0
  14. data/document/acl-NE5000E-20.md +25 -0
  15. data/document/acl-NE5000E-X16.md +25 -0
  16. data/document/acl-NE5000E-X16A.md +25 -0
  17. data/document/acl-NE80E.md +204 -0
  18. data/document/bgp-CR16010H-F.md +25 -0
  19. data/document/bgp-CR16018-F.md +25 -0
  20. data/document/bgp-CR19000-20.md +25 -0
  21. data/document/bgp-M6000-16E.md +25 -0
  22. data/document/bgp-M6000-18S.md +25 -0
  23. data/document/bgp-M6000-8.md +25 -0
  24. data/document/bgp-M6000-8E.md +25 -0
  25. data/document/bgp-MA5200G-8.md +25 -0
  26. data/document/bgp-ME60-16.md +25 -0
  27. data/document/bgp-ME60-X16.md +25 -0
  28. data/document/bgp-NE40E-X16.md +25 -0
  29. data/document/bgp-NE40E-X16A.md +25 -0
  30. data/document/bgp-NE40E-X8.md +25 -0
  31. data/document/bgp-NE40E.md +25 -0
  32. data/document/bgp-NE5000E-20.md +25 -0
  33. data/document/bgp-NE5000E-X16.md +25 -0
  34. data/document/bgp-NE5000E-X16A.md +25 -0
  35. data/document/bgp-NE80E.md +25 -0
  36. data/document/config.md +1153 -0
  37. data/document/document.rb +27 -0
  38. data/document/if-ALCATEL7750.md +48 -0
  39. data/document/if-C7609.md +47 -0
  40. data/document/if-CR16010H-F.md +300 -0
  41. data/document/if-CR16018-F.md +300 -0
  42. data/document/if-CR19000-20.md +300 -0
  43. data/document/if-CRS-16.md +47 -0
  44. data/document/if-CX600-X16A.md +349 -0
  45. data/document/if-CX600-X8A.md +349 -0
  46. data/document/if-M6000-16E.md +652 -0
  47. data/document/if-M6000-18S.md +846 -0
  48. data/document/if-M6000-8.md +653 -0
  49. data/document/if-M6000-8E.md +653 -0
  50. data/document/if-MA5200G-8.md +357 -0
  51. data/document/if-ME60-16.md +357 -0
  52. data/document/if-ME60-X16.md +357 -0
  53. data/document/if-NE40E-X16.md +357 -0
  54. data/document/if-NE40E-X16A.md +357 -0
  55. data/document/if-NE40E-X8.md +357 -0
  56. data/document/if-NE40E.md +357 -0
  57. data/document/if-NE5000E-20.md +357 -0
  58. data/document/if-NE5000E-X16.md +357 -0
  59. data/document/if-NE5000E-X16A.md +357 -0
  60. data/document/if-NE8000E-X8.md +357 -0
  61. data/document/if-NE80E.md +357 -0
  62. data/document/if-NE8100-X8.md +357 -0
  63. data/document/if-Nokia7750.md +48 -0
  64. data/document/if-T8000-18.md +653 -0
  65. data/document/if-V6000.md +663 -0
  66. data/document/if-VNE9000.md +357 -0
  67. data/document/if-ZXCTN9000-18EA.md +762 -0
  68. data/document/if-ZXCTN9000-8EA.md +762 -0
  69. data/document/lic-M6000-16E.md +28 -0
  70. data/document/lic-M6000-18S.md +28 -0
  71. data/document/lic-M6000-8.md +28 -0
  72. data/document/lic-M6000-8E.md +28 -0
  73. data/document/lic-MA5200G-8.md +27 -0
  74. data/document/lic-ME60-16.md +27 -0
  75. data/document/lic-ME60-X16.md +27 -0
  76. data/document/lic-NE40E-X16.md +27 -0
  77. data/document/lic-NE40E-X16A.md +27 -0
  78. data/document/lic-NE40E-X8.md +27 -0
  79. data/document/log-M6000-16E.md +36 -0
  80. data/document/log-M6000-18S.md +36 -0
  81. data/document/log-M6000-8.md +36 -0
  82. data/document/log-M6000-8E.md +36 -0
  83. data/document/log-MA5200G-8.md +61 -0
  84. data/document/log-ME60-16.md +61 -0
  85. data/document/log-ME60-X16.md +61 -0
  86. data/document/log-NE40E-X16.md +61 -0
  87. data/document/log-NE40E-X16A.md +61 -0
  88. data/document/log-NE40E-X8.md +61 -0
  89. data/document/log-NE40E.md +61 -0
  90. data/document/log-NE5000E-20.md +61 -0
  91. data/document/log-NE5000E-X16.md +61 -0
  92. data/document/log-NE5000E-X16A.md +61 -0
  93. data/document/log-NE80E.md +61 -0
  94. data/document/nat-CR16010H-F.md +27 -0
  95. data/document/nat-CR16018-F.md +27 -0
  96. data/document/nat-M6000-16E.md +27 -0
  97. data/document/nat-M6000-18S.md +27 -0
  98. data/document/nat-M6000-8.md +27 -0
  99. data/document/nat-M6000-8E.md +27 -0
  100. data/document/nat-ME60-16.md +44 -0
  101. data/document/nat-ME60-X16.md +44 -0
  102. data/document/nat-NE40E-X16.md +44 -0
  103. data/document/nat-NE40E-X16A.md +44 -0
  104. data/document/policy-M6000-16E.md +13 -0
  105. data/document/policy-M6000-18S.md +13 -0
  106. data/document/policy-M6000-8.md +13 -0
  107. data/document/policy-M6000-8E.md +13 -0
  108. data/document/policy-MA5200G-8.md +87 -0
  109. data/document/policy-ME60-16.md +87 -0
  110. data/document/policy-ME60-X16.md +87 -0
  111. data/document/policy-NE40E-X16.md +87 -0
  112. data/document/policy-NE40E-X16A.md +87 -0
  113. data/document/policy-NE40E-X8.md +87 -0
  114. data/document/policy-NE40E.md +87 -0
  115. data/document/policy-NE5000E-20.md +87 -0
  116. data/document/policy-NE5000E-X16.md +87 -0
  117. data/document/policy-NE5000E-X16A.md +87 -0
  118. data/document/policy-NE80E.md +87 -0
  119. data/document/pool-M6000-16E.md +126 -0
  120. data/document/pool-M6000-18S.md +126 -0
  121. data/document/pool-M6000-8.md +126 -0
  122. data/document/pool-M6000-8E.md +126 -0
  123. data/document/pool-MA5200G-8.md +138 -0
  124. data/document/pool-ME60-16.md +138 -0
  125. data/document/pool-ME60-X16.md +138 -0
  126. data/document/pool-NE40E-X16.md +138 -0
  127. data/document/pool-NE40E-X16A.md +138 -0
  128. data/document/pool-NE40E-X8.md +138 -0
  129. data/document/pool-NE40E.md +138 -0
  130. data/document/pool-NE80E.md +138 -0
  131. data/document/static-CR16010H-F.md +60 -0
  132. data/document/static-CR16018-F.md +60 -0
  133. data/document/static-CR19000-20.md +60 -0
  134. data/document/static-CX600-X16A.md +26 -0
  135. data/document/static-CX600-X8A.md +26 -0
  136. data/document/static-M6000-16E.md +104 -0
  137. data/document/static-M6000-18S.md +104 -0
  138. data/document/static-M6000-8.md +104 -0
  139. data/document/static-M6000-8E.md +104 -0
  140. data/document/static-MA5200G-8.md +82 -0
  141. data/document/static-ME60-16.md +82 -0
  142. data/document/static-ME60-X16.md +82 -0
  143. data/document/static-NE40E-X16.md +82 -0
  144. data/document/static-NE40E-X16A.md +81 -0
  145. data/document/static-NE40E-X8.md +82 -0
  146. data/document/static-NE40E.md +67 -0
  147. data/document/static-NE5000E-20.md +67 -0
  148. data/document/static-NE5000E-X16.md +67 -0
  149. data/document/static-NE5000E-X16A.md +67 -0
  150. data/document/static-NE8000E-X8.md +26 -0
  151. data/document/static-NE80E.md +67 -0
  152. data/document/static-NE8100-X8.md +26 -0
  153. data/document/static-T8000-18.md +34 -0
  154. data/document/static-ZXCTN9000-18EA.md +34 -0
  155. data/document/static-ZXCTN9000-8EA.md +34 -0
  156. data/document/system-M6000-16E.md +75 -0
  157. data/document/system-M6000-18S.md +76 -0
  158. data/document/system-M6000-8.md +75 -0
  159. data/document/system-M6000-8E.md +75 -0
  160. data/document/system-MA5200G-8.md +51 -0
  161. data/document/system-ME60-16.md +51 -0
  162. data/document/system-ME60-X16.md +51 -0
  163. data/document/system-NE40E-X16.md +51 -0
  164. data/document/system-NE40E-X16A.md +51 -0
  165. data/document/system-NE40E-X8.md +51 -0
  166. data/document/system-NE40E.md +51 -0
  167. data/document/system-NE5000E-20.md +51 -0
  168. data/document/system-NE5000E-X16.md +51 -0
  169. data/document/system-NE5000E-X16A.md +51 -0
  170. data/document/system-NE80E.md +51 -0
  171. data/document/telnet.md +332 -0
  172. data/network.rb +24 -0
  173. data/utility/ipv4_address.rb +266 -0
  174. data/utility/ipv6_address.rb +201 -0
  175. data/utility/mac_address.rb +77 -0
  176. data/utility/netmerge.rb +46 -0
  177. data/utility/route.rb +79 -0
  178. data/utility/whitelist.rb +21 -0
  179. metadata +258 -0
@@ -0,0 +1,663 @@
1
+
2
+ # V6000 接口
3
+
4
+ ```ruby
5
+ @sign << ["V6000", "接口配置"]
6
+ @sign << ["V6000", "接口物理信息"]
7
+ @sign << ["V6000", "接口基本信息"]
8
+ @sign << ["V6000", "接口vlan信息"]
9
+ @sign << ["V6000", "接口acl信息"]
10
+ @sign << ["V6000", "接口mpls信息"]
11
+ @sign << ["V6000", "接口lacp信息"]
12
+ @sign << ["V6000", "接口isis信息"]
13
+ @sign << ["V6000", "接口multicast信息"]
14
+ @sign << ["V6000", "接口firload信息"]
15
+ @sign << ["V6000", "接口port_request_info信息"]
16
+ @sign << ["V6000", "接口arp信息"]
17
+ @sign << ["V6000", "接口nd信息"]
18
+ @sign << ["V6000", "接口interface_performance信息"]
19
+ @sign << ["V6000", "接口ospf信息"]
20
+ @sign << ["V6000", "接口urpf信息"]
21
+ @sign << ["V6000", "接口am信息"]
22
+ @sign << ["V6000", "接口uim信息"]
23
+ @sign << ["V6000", "特殊接口配置"]
24
+ @sign << ["V6000", "物理接口配置"]
25
+ @sign << ["V6000", "子接口配置"]
26
+ @sign << ["V6000", "接口分捡"]
27
+ @sign << ["V6000", "端口识别"]
28
+ @sign << ["V6000", "端口MAC"]
29
+ @sign << ["V6000", "端口管理状态"]
30
+ @sign << ["V6000", "接口描述"]
31
+ @sign << ["V6000", "接口地址"]
32
+ @sign << ["V6000", "接口开关"]
33
+ @sign << ["V6000", "接口vpn实例"]
34
+ @sign << ["V6000", "聚合接口判定"]
35
+ @sign << ["V6000", "聚合接口分捡"]
36
+ @sign << ["V6000", "聚合逻辑接口"]
37
+ @sign << ["V6000", "vlan分捡"]
38
+ @sign << ["V6000", "vlan统计"]
39
+ @sign << ["V6000", "端口去0"]
40
+ @sign << ["V6000", "统计接口"]
41
+
42
+ module V6000
43
+ module_function
44
+ #####################################################################################################
45
+ # 接口/端口配置的基本查询
46
+ # 接口集合 => 接口分检 => 物理接口集合,子接口集合,特殊接口集合
47
+
48
+ # 主动模块:
49
+ # firload
50
+ # port-request-info
51
+ # if-intf
52
+ # port-physical-config
53
+ # lacp
54
+ # vlan
55
+ # port-acl
56
+ # lldp # 未实现
57
+ # arp
58
+ # nd
59
+ # mpls
60
+ # interface-performance
61
+ # isis
62
+ # multicast
63
+ # ospfv2
64
+ # ospfv3
65
+ # qos # 未实现
66
+
67
+ # 被动模块:(暂不关联)
68
+ # samgr
69
+ # monitor
70
+ # alarm
71
+ # ftp
72
+ # ethernet-segment
73
+ # icbg
74
+ #####################################################################################################
75
+ def 接口配置 正文
76
+ 接口表 = {}
77
+ # these will be instancized!
78
+ [self.接口物理信息(正文), self.接口基本信息(正文), self.接口vlan信息(正文), self.接口acl信息(正文),
79
+ self.接口mpls信息(正文), self.接口isis信息(正文), self.接口multicast信息(正文), self.接口lacp信息(正文),
80
+ self.接口firload信息(正文), self.接口port_request_info信息(正文), self.接口ospf信息(正文),
81
+ self.接口arp信息(正文), self.接口nd信息(正文), self.接口interface_performance信息(正文),
82
+ # self.接口urpf信息(正文), self.接口am信息(正文), self.接口uim信息(正文),
83
+ ].each do|infolist|
84
+ infolist.each do|intf,text|
85
+ 接口表[intf]||=[]
86
+ 接口表[intf] << text
87
+ end
88
+ end
89
+ 接口表
90
+ end
91
+
92
+ def 接口物理信息 正文
93
+ tag = 正文["PORT-PHYSICAL-INFO"] ? "PORT-PHYSICAL-INFO" : "port-physical-config"
94
+ 接口物理表 = {}
95
+ if tag == "PORT-PHYSICAL-INFO"
96
+ (正文[tag]||"").split("\n!")\
97
+ .collect{|l|"<#{tag}>\n"+l.strip+"\n!\n</#{tag}>" if l!=' '}\
98
+ .compact.each{|接口|接口物理表[/interface (.)*/.match(接口)[0].to_s.strip] = 接口}
99
+ elsif tag == "port-physical-config"
100
+ (正文[tag]||"").split("\n$")\
101
+ .collect{|l|"<#{tag}>\n"+l.strip+"\n!\n</#{tag}>" if l!="\n!"}\
102
+ .compact.each{|接口|接口物理表[/interface (.)*/.match(接口)[0].to_s.strip] = 接口}
103
+ end
104
+ 接口物理表
105
+ end
106
+
107
+ def 接口基本信息 正文
108
+ tag = 正文["INTERFACE"] ? "INTERFACE" : "if-intf"
109
+ 接口基本表 = {}
110
+ if tag== "INTERFACE"
111
+ (正文[tag]||"").split("\n!")\
112
+ .collect{|l|"<#{tag}>\n"+l.strip+"\n!\n</#{tag}>" \
113
+ if l!=' ' && l.include?('interface')}\
114
+ .compact.each{|接口|接口基本表[/interface (.)*/.match(接口)[0].to_s.strip] = 接口}
115
+ elsif tag=="if-intf"
116
+ (正文[tag]||"").split("\n$")\
117
+ .collect{|l|"<#{tag}>\n"+l.strip+"\n!\n</#{tag}>" \
118
+ if l!=' ' && l.include?('interface')}\
119
+ .compact.each{|接口|接口基本表[/interface (.)*/.match(接口)[0].to_s.strip] = 接口}
120
+ end
121
+ 接口基本表
122
+ end
123
+
124
+ def 接口vlan信息 正文
125
+ tag = 正文["VLAN"] ? "VLAN" : "vlan"
126
+ 接口vlan表 = {}
127
+ if tag == "VLAN"
128
+ context,fragments = TextAbstract.draw_fragments (正文[tag]||""), /^ interface (.)*/, /^ \$/
129
+ head,tail = "<#{tag}>\n#{context.split("\n")[0]}\n","!\n</#{tag}>"
130
+ fragments.each{|frag| 接口vlan表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
131
+ elsif tag == "vlan"
132
+ context,fragments = TextAbstract.draw_fragments (正文[tag]||""), /^ interface (.)*/, /^ \$/
133
+ head,tail = "<#{tag}>\n#{context.split("\n")[0]}\n","!\n</#{tag}>"
134
+ fragments.each{|frag| 接口vlan表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
135
+ end
136
+ 接口vlan表
137
+ end
138
+
139
+ def 接口acl信息 正文
140
+ tag = 正文["PORT_ACL"] ? "PORT_ACL" : "port-acl"
141
+ 接口acl表 = {}
142
+ if tag =="PORT_ACL"
143
+ (正文[tag]||"").split("\n!")\
144
+ .collect{|l|"<#{tag}>\n"+l.strip+"\n!\n</#{tag}>" if l!="\n!"}\
145
+ .compact.each{|接口|接口acl表[/interface (.)*/.match(接口)[0].to_s.strip]=接口}
146
+ elsif tag == "port-acl"
147
+ (正文[tag]||"").split("\n$")\
148
+ .collect{|l|"<#{tag}>\n"+l.strip+"\n!\n</#{tag}>" if l!="\n!"}\
149
+ .compact.each{|接口|接口acl表[/interface (.)*/.match(接口)[0].to_s.strip]=接口}
150
+ end
151
+ 接口acl表
152
+ end
153
+
154
+ def 接口mpls信息 正文
155
+ tag = 正文["MPLS"] ? "MPLS" : "ldp"
156
+ 接口mpls表 = {}
157
+ if tag=="MPLS"
158
+ context,fragments = TextAbstract.draw_fragments (正文[tag]||""), /^ interface (.)*/, /^ \$/
159
+ head,tail = "<#{tag}>\n#{context[0..-3]}\n","!\n</#{tag}>" # context tail(!\n)
160
+ fragments.each{|frag|接口mpls表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
161
+ elsif tag=="ldp"
162
+ context,fragments = TextAbstract.draw_fragments (正文[tag]||""), /^ interface (.)*/, /^ \$/
163
+ head,tail = "<#{tag}>\n#{context[0..-3]}\n","!\n</#{tag}>" # context tail(!\n)
164
+ fragments.each{|frag|接口mpls表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
165
+ end
166
+ 接口mpls表
167
+ end
168
+
169
+ def 接口lacp信息 正文 # trunk
170
+ tag = 正文["LACP"] ? "LACP" : "lacp"
171
+ 接口lacp表 = {}
172
+ if tag=="LACP"
173
+ context,fragments = TextAbstract.draw_fragments (正文[tag]||""), /^ interface (.)*/, /^ \$/
174
+ head,tail = "<#{tag}>\n#{context[0..3]}\n","$\n!</#{tag}>" # context tail(!\n)
175
+ fragments.each{|frag|接口lacp表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
176
+ elsif tag=="lacp"
177
+ context,fragments = TextAbstract.draw_fragments (正文[tag]||""), /^ interface (.)*/, /^ \$/
178
+ head,tail = "<#{tag}>\n#{context[0..3]}\n","$\n!</#{tag}>" # context tail(!\n)
179
+ fragments.each{|frag|接口lacp表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
180
+ end
181
+ 接口lacp表
182
+ end
183
+
184
+ def 接口isis信息 正文
185
+ tag = 正文["ISIS"] ? "ISIS" : "isis"
186
+ 接口isis表 = {}
187
+ if tag == "ISIS"
188
+ context,fragments = TextAbstract.draw_fragments (正文[tag]||""), /^ interface (.)*/, /^ \$/
189
+ head,tail = "<#{tag}>\n#{context[0..-3]}\n","!\n</#{tag}>" # context tail(\n!)
190
+ fragments.each{|frag|接口isis表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
191
+ elsif tag == "isis"
192
+ context,fragments = TextAbstract.draw_fragments (正文[tag]||""), /^ interface (.)*/, /^ \$/
193
+ head,tail = "<#{tag}>\n#{context[0..-3]}\n","!\n</#{tag}>" # context tail(\n!)
194
+ fragments.each{|frag|接口isis表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
195
+ end
196
+ 接口isis表
197
+ end
198
+
199
+ def 接口multicast信息 正文
200
+ tag = 正文["MULTICAST"] ? "MULTICAST" : "multicast"
201
+ 接口multicast表 = {}
202
+ if tag == "MULTICAST"
203
+ za,pimsm = TextAbstract.draw_fragments (正文[tag]||""), /^ router pimsm/, /^ \$/
204
+ za,pimsm = TextAbstract.draw_fragments (正文[tag]||""), /^ router pim/, /^ \$/ unless pimsm[0]
205
+ za,igmp= TextAbstract.draw_fragments (正文[tag]||""), /^ router igmp/, /^ \$/
206
+ chead,ctail = "<#{tag}>\n#{za.split("\n")[0]}\n","!\n</#{tag}>" # common head
207
+ # pimsm
208
+ #begin
209
+ context,fragments = TextAbstract.draw_fragments pimsm[0],/^ interface (.)*/, /^ \$/
210
+ head,tail = context[0..-5],context[-4..-1] # open(... $\n)
211
+ fragments.each{|frag|接口multicast表[/interface (.)*/.match(frag)[0].to_s.strip] = chead+head+frag+tail+ctail}
212
+ #rescue;end
213
+ # igmp
214
+ context,fragments = TextAbstract.draw_fragments igmp.join, /^ interface (.)*/, /^ \$/
215
+ head,tail = context[0..-5],context[-4..-1] # open(... $\n)
216
+ fragments.each{|frag|接口multicast表[/interface (.)*/.match(frag)[0].to_s.strip] = chead+head+frag+tail+ctail}
217
+ elsif tag == "multicast"
218
+ za,pimsm = TextAbstract.draw_fragments (正文[tag]||""), /^ router pimsm/, /^ \$/
219
+ za,pimsm = TextAbstract.draw_fragments (正文[tag]||""), /^ router pim/, /^ \$/ unless pimsm[0]
220
+ za,igmp= TextAbstract.draw_fragments (正文[tag]||""), /^ router igmp/, /^ \$/
221
+ chead,ctail = "<#{tag}>\n#{za.split("\n")[0]}\n","!\n</#{tag}>" # common head
222
+ # pimsm
223
+ #begin
224
+ context,fragments = TextAbstract.draw_fragments pimsm[0].to_s, /^ interface (.)*/, /^ \$/
225
+ head,tail = context[0..-5],context[-4..-1] # open(... $\n)
226
+ fragments.each{|frag|接口multicast表[/interface (.)*/.match(frag)[0].to_s.strip] = chead+head+frag+tail+ctail}
227
+ #rescue;end
228
+ # igmp
229
+ context,fragments = TextAbstract.draw_fragments igmp.join, /^ interface (.)*/, /^ \$/
230
+ head,tail = context[0..-5],context[-4..-1] # open(... $\n)
231
+ fragments.each{|frag|接口multicast表[/interface (.)*/.match(frag)[0].to_s.strip] = chead+head+frag+tail+ctail}
232
+ end
233
+ 接口multicast表
234
+ end
235
+
236
+ def 接口firload信息 正文
237
+ tag = 正文["firload"] ? "firload" : "firload"
238
+ 接口firload表 = {}
239
+ if tag == "firload"
240
+ context,fragments = TextAbstract.draw_fragments (正文[tag]||""), /^ interface (.)*/, /^ \$/
241
+ head,tail = "<#{tag}>\n#{context.split("\n")[0]}\n","!\n</#{tag}>"
242
+ fragments.each{|frag| 接口firload表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
243
+ end
244
+ 接口firload表
245
+ end
246
+
247
+ def 接口port_request_info信息 正文
248
+ tag = 正文["port-request-info"] ? "port-request-info" : "port-request-info"
249
+ 接口pri表 = {}
250
+ if tag == "port-request-info"
251
+ context,fragments = TextAbstract.draw_fragments (正文[tag]||""), /^interface (.)*/, /^\n/
252
+ head,tail = "<#{tag}>\n#{context.split("\n")[0]}\n","!\n</#{tag}>"
253
+ fragments.each{|frag| 接口pri表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
254
+ end
255
+ 接口pri表
256
+ end
257
+
258
+ def 接口arp信息 正文
259
+ tag = 正文["arp"] ? "arp" : "arp"
260
+ 接口arp表 = {}
261
+ if tag == "arp"
262
+ context,fragments = TextAbstract.draw_fragments (正文[tag]||""), /^ interface (.)*/, /^ \$/
263
+ head,tail = "<#{tag}>\narp\n#{context.split("\n")[0]}\n","!\n</#{tag}>"
264
+ fragments.each{|frag| 接口arp表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
265
+ end
266
+ 接口arp表
267
+ end
268
+
269
+ def 接口nd信息 正文
270
+ tag = 正文["nd"] ? "nd" : "nd"
271
+ 接口nd表 = {}
272
+ if tag == "nd"
273
+ context,fragments = TextAbstract.draw_fragments (正文[tag]||""), /^interface (.)*/, /^\$/
274
+ head,tail = "<#{tag}>\n#{context.split("\n")[0]}\n","!\n</#{tag}>"
275
+ fragments.each{|frag| 接口nd表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
276
+ end
277
+ 接口nd表
278
+ end
279
+
280
+ def 接口interface_performance信息 正文
281
+ tag = 正文["interface-performance"] ? "interface-performance" : "interface-performance"
282
+ 接口iperf表 = {}
283
+ if tag == "interface-performance"
284
+ context,fragments = TextAbstract.draw_fragments (正文[tag]||""), /^interface (.)*/, /^\$/
285
+ head,tail = "<#{tag}>\nintf-statistics\n#{context.split("\n")[0]}\n","!\n</#{tag}>"
286
+ fragments.each{|frag| 接口iperf表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
287
+ end
288
+ 接口iperf表
289
+ end
290
+
291
+ def 接口ospf信息 正文
292
+ tag = 正文["ospfv2"] ? "ospfv2" : "ospfv2"
293
+ 接口ospfv2表 = {}
294
+ if tag == "ospfv2"
295
+ context,fragments = TextAbstract.draw_fragments (正文[tag]||""), /^router ospf (.)*/, /^\!/
296
+ paragraphs = TextAbstract.match_paragraph(context, /^router ospf (.)*/,/^\$/)
297
+ paragraphs.each do|para|
298
+ ospf = /^router ospf (.)*/.match(para)[0].to_s.strip
299
+ areas = TextAbstract.match_paragraph(para, /^ area (.)*/, /^ \$/)
300
+ areas.each do|area|
301
+ area_id = /^ area (.)*/.match(area)[0].to_s.rstrip
302
+ intfs = TextAbstract.match_paragraph(area, /^ interface (.)*/, /^ \$/)
303
+ intfs.each{|intf| 接口ospfv2表['ospfv2+'+/interface (.)*/.match(intf)[0].to_s.strip] = "<#{tag}>\n#{ospf}\n#{area_id}\n#{intf}\n $\n$\n!\n</#{tag}>"}
304
+ end
305
+ end
306
+ end
307
+
308
+ tag = 正文["ospfv3"] ? "ospfv3" : "ospfv3"
309
+ 接口ospfv3表 = {}
310
+ if tag == "ospfv3"
311
+ context,fragments = TextAbstract.draw_fragments (正文[tag]||""), /^ipv6 router ospf (.)*/, /^\!/
312
+ paragraphs = TextAbstract.match_paragraph(context, /^ipv6 router ospf (.)*/,/^\$/)
313
+ paragraphs.each do|para|
314
+ ospf = /^router ospf (.)*/.match(para)[0].to_s.strip
315
+ areas = TextAbstract.match_paragraph(para, /^ area (.)*/, /^ \$/)
316
+ areas.each do|area|
317
+ area_id = /^ area (.)*/.match(area)[0].to_s.rstrip
318
+ intfs = TextAbstract.match_paragraph(area, /^ interface (.)*/, /^ \$/)
319
+ intfs.each{|intf| 接口ospfv3表['ospfv3+'+/interface (.)*/.match(intf)[0].to_s.strip] = "<#{tag}>\n#{ospf}\n#{area_id}\n#{intf}\n $\n$\n!\n</#{tag}>"}
320
+ end
321
+ end
322
+ end
323
+
324
+ 接口ospfv2表.merge(接口ospfv3表)
325
+ end
326
+
327
+ def 接口urpf信息 正文
328
+ tag = 正文["URPF"] ? "URPF" : "urpf"
329
+ 接口urpf表 = {}
330
+ if tag == "URPF"
331
+ (正文[tag]||"").split("\n!")\
332
+ .collect{|l|"<#{tag}>\n"+l.strip+"\n!\n</#{tag}>" if l!="\n!"}\
333
+ .compact.each{|接口|接口urpf表[/interface (.)*/.match(接口)[0].to_s.strip]=接口}
334
+ elsif tag == "urpf"
335
+ (正文[tag]||"").split("\n$")\
336
+ .collect{|l|"<#{tag}>\n"+l.strip+"\n!\n</#{tag}>" if l!="\n!"}\
337
+ .compact.each{|接口|接口urpf表[/interface (.)*/.match(接口)[0].to_s.strip]=接口}
338
+ end
339
+ 接口urpf表
340
+ end
341
+
342
+ def 接口am信息 正文
343
+ tag = 正文["AM"] ? "AM" : "am"
344
+ 接口am表 = {}
345
+ if tag == "AM"
346
+ context,fragments = TextAbstract.draw_fragments (正文[tag]||""), /^ interface (.)*/, /^ \$/
347
+ head,tail = "<#{tag}>\n#{context[0..-3]}\n","!\n</#{tag}>" # context tail(!\n)
348
+ fragments.each{|frag|接口am表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
349
+ elsif tag == "am"
350
+ context,fragments = TextAbstract.draw_fragments (正文[tag]||""), /^ interface (.)*/, /^ \$/
351
+ head,tail = "<#{tag}>\n#{context[0..-3]}\n","!\n</#{tag}>" # context tail(!\n)
352
+ fragments.each{|frag|接口am表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
353
+ end
354
+ 接口am表
355
+ end
356
+
357
+ def 接口uim信息 正文
358
+ tag = 正文["UIM"] ? "UIM" : "uim"
359
+ 接口uim表 = {}
360
+ if tag =="UIM"
361
+ za,vcc = TextAbstract.draw_fragments (正文[tag]||""), /^vcc\-configuration/, /^\!/
362
+ za,vbui= TextAbstract.draw_fragments (正文[tag]||""), /^vbui\-configuration/, /^\!/
363
+ # vcc
364
+ context,fragments = TextAbstract.draw_fragments vcc.join, /^ interface (.)*/, /^ \$/
365
+ head,tail = "<#{tag}>\n#{context[0..-3]}","!\n</#{tag}>" # context tail(\n!\n)
366
+ fragments.each{|frag|接口uim表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
367
+ # vbui
368
+ context,fragments = TextAbstract.draw_fragments vbui.join, /^ interface (.)*/, /^ \$/
369
+ head,tail = "<#{tag}>\n#{context[0..-3]}","!\n</#{tag}>" # context tail(\n!\n)
370
+ fragments.each{|frag|接口uim表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
371
+ elsif tag =="uim"
372
+ za,vcc = TextAbstract.draw_fragments (正文[tag]||""), /^vcc\-configuration/, /^\$/
373
+ za,vbui= TextAbstract.draw_fragments (正文[tag]||""), /^vbui\-configuration/, /^\$/
374
+ # vcc
375
+ context,fragments = TextAbstract.draw_fragments vcc.join, /^ interface (.)*/, /^ \$/
376
+ head,tail = "<#{tag}>\n#{context[0..-3]}","!\n</#{tag}>" # context tail(\n!\n)
377
+ fragments.each{|frag|接口uim表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
378
+ # vbui
379
+ context,fragments = TextAbstract.draw_fragments vbui.join, /^ interface (.)*/, /^ \$/
380
+ head,tail = "<#{tag}>\n#{context[0..-3]}","!\n</#{tag}>" # context tail(\n!\n)
381
+ fragments.each{|frag|接口uim表[/interface (.)*/.match(frag)[0].to_s.strip] = head+frag+tail}
382
+ end
383
+ 接口uim表
384
+ end
385
+
386
+ def 特殊接口配置 接口集合
387
+ 特殊接口集合 = []
388
+ 接口集合.each do|key,configs|
389
+ 特殊接口集合 << [key]+configs if key.include?('loopback') || key.include?('null') || \
390
+ key.include?('extimer') || key.include?('vbui') || key.include?('spi') || \
391
+ key.include?('gcvi') || key.include?('guvi') || key.include?('mgmt_eth') || \
392
+ key.include?('qx_eth') || key.include?('qx') || key.include?('gre_tunnel')
393
+ end
394
+ 特殊接口集合
395
+ end
396
+
397
+ def 物理接口配置 接口集合,特殊接口集合=nil
398
+ 物理接口集合 = []
399
+ 例外 = (特殊接口集合 ? 特殊接口集合 : (self.特殊接口配置 接口集合)).collect{|c|c[0]}
400
+ 接口集合.each do|key,configs|
401
+ 物理接口集合 << [key]+configs unless 例外.include?(key) || key.include?('.')
402
+ end
403
+ 物理接口集合
404
+ end
405
+
406
+ def 子接口配置 接口集合,特殊接口集合=nil
407
+ 子接口集合 = []
408
+ 例外 = (特殊接口集合 ? 特殊接口集合 : (self.特殊接口配置 接口集合)).collect{|c|c[0]}
409
+ 接口集合.each do|key,configs|
410
+ 子接口集合 << [key]+configs if !例外.include?(key) && key.include?('.')
411
+ end
412
+ 子接口集合
413
+ end
414
+
415
+ def 接口分捡 接口集合
416
+ 特殊接口集合 = self.特殊接口配置 接口集合
417
+ 物理接口集合 = self.物理接口配置 接口集合,特殊接口集合
418
+ 子接口集合 = self.子接口配置 接口集合,特殊接口集合
419
+ return 物理接口集合,子接口集合,特殊接口集合
420
+ end
421
+
422
+
423
+ #####################################################################################################
424
+ # 端口描述信息相关
425
+ #####################################################################################################
426
+
427
+ # func: 根据一个端口的描述信息,给出其格式化的类型、连接符、端口编号
428
+ def 端口识别 描述
429
+ 描述 = 描述[0] if 描述.instance_of?(Array) # M6000取接口配置中名称部分 [name,<tag>...</tag>,...]
430
+ type = /xgei|gei|smartgroup|loopback|extimer|vxlan_tunnel|vbui|vnfm|null|guvi|gcvi|mgmt_eth|mgmt|ulei|irb|vei|spi|flexe_client|flexe_group|ptp|gps|qx_eth|qx|bvi|pw|subvlan/.match(描述)
431
+ 类型 = type ? type.to_s : '未知类型'
432
+ port = /(\d+|\/|\.)*(\d+)/.match(描述.split(类型).join)
433
+ 端口 = port ? port.to_s : '未知端口'
434
+ 端口 = '' if 类型=='mgmt_eth'
435
+ 连接符 = if ['smartgroup','loopback','vxlan_tunnel','vbui','vnfm','null','mgmt_eth','irb','vei','flexe_client','flexe_group','qx','bvi','pw','subvlan','mgmt'].include?(类型)
436
+ ''
437
+ elsif ['xgei','gei','extimer','ulei','guvi','gcvi','spi','ptp','gps','qx_eth'].include?(类型)
438
+ '-'
439
+ end
440
+ return 类型,连接符,端口
441
+ end
442
+
443
+ # func: 根据一个端口的描述信息,给出其mac地址,若无mac则返回nil
444
+ def 端口MAC 描述
445
+ 描述.each_line do|line|
446
+ if pattern = /\, address is (.+)/.match(line)
447
+ matcher = /[\d|A-F|a-f]+\.[\d|A-F|a-f]+\.[\d|A-F|a-f]+/.match(pattern[1].strip)
448
+ return pattern[1].strip if matcher.to_s==pattern[1].strip
449
+ end
450
+ end
451
+ return nil
452
+ end
453
+
454
+ # func: 根据一个端口的描述信息,给出其管理状态是打开/关闭的判断
455
+ def 端口管理状态 描述
456
+ 描述 = 描述[1..-1].join("\n") if 描述.instance_of?(Array) # M6000取接口配置中名称部分 [name,<tag>...</tag>,...]
457
+ 管理状态 = true
458
+ 描述.split("\n").each do|line|
459
+ 管理状态 = false if line.include?("shutdown") && !line.include?("no shutdown")
460
+ end
461
+ 管理状态
462
+ end
463
+
464
+ # func: 根据一个端口的配置给出其描述
465
+ def 接口描述 接口配置
466
+ 描述 = ''
467
+ 接口配置.join("\n").each_line do|line| if line.strip[0..10]=='description'
468
+ 描述 = line.split('description')[1..-1].join().strip; break
469
+ end end
470
+ 描述.to_s
471
+ end
472
+
473
+ # func: 根据一个端口的配置给出其配置的接口地址
474
+ def 接口地址 接口配置
475
+ 地址集 = []
476
+ 接口配置.join("\n").each_line do|line|
477
+ if line.strip[0..9]=='ip address'
478
+ 地址集 << line.gsub('secondary','').split('ip address')[-1].strip.split(' ')
479
+ end
480
+ if line.strip[0..11]=='ipv6 address'
481
+ 地址集 << line.gsub('secondary','').split('ipv6 address')[-1].strip.split('/')
482
+ end
483
+ end
484
+ 地址集
485
+ end
486
+
487
+ # func: 根据一个端口的配置给出其开关状态(配置层面的"端口管理状态")
488
+ def 接口开关 接口配置
489
+ 描述 = '' # for phy_if is shutdown, for sub_if,smartgroup are open
490
+ 接口配置.join("\n").each_line do|line|
491
+ if line.include?("no shutdown") and !line.include?('description')
492
+ 描述 = 'no shutdown'; break
493
+ end
494
+ if line.include?("smartgroup")
495
+ 描述 = 'no shutdown'; break
496
+ end
497
+ if line.include?("shutdown") and !line.include?('no') and !line.include?('description')
498
+ 描述 = 'shutdown'; break
499
+ end
500
+ end
501
+ 描述
502
+ end
503
+
504
+ # func: 根据一个端口的配置给出其关联的vpn实例
505
+ def 接口vpn实例 接口配置
506
+ 实例 = ''
507
+ 接口配置.join("\n").each_line do|line|
508
+ 实例 = "vpn-inst:" + /vrf forwarding .+/.match(line).to_s.split(" ")[-1] if /vrf forwarding .+/.match(line)
509
+ end
510
+ 实例
511
+ end
512
+
513
+
514
+ #####################################################################################################
515
+ # 聚合接口判定相关
516
+ #####################################################################################################
517
+
518
+ # func: 根据一个接口的描述信息,给出其所属聚合接口的信息,若非聚合端口返回空
519
+ def 聚合接口判定 配置
520
+ 配置.join.split("\n").each do|描述|
521
+ if 描述.include?("smartgroup") && 描述.include?("mode") &&
522
+ !描述.include?("description") && !self.端口识别(配置).join.include?("smartgroup")
523
+ return {self.端口识别(配置).join=>"smartgroup"+描述.strip.split(" ")[1]}
524
+ end
525
+ end;{}
526
+ end
527
+
528
+ # func: 给出聚合接口和物理接口的集合,通过计算找出所有聚合接口的集合
529
+ def 聚合接口分捡 聚合接口,物理接口集合
530
+ 聚合接口 = self.端口识别(聚合接口)
531
+ 聚合接口集合 = [聚合接口.join]
532
+ 物理接口集合.each do|物理接口| 物理接口.join.each_line do|line|
533
+ if line.include?("smartgroup") && !line.include?("description")
534
+ aggrnum = line.strip.split(" ")[1]
535
+ 聚合接口集合 << self.端口识别(物理接口).join if ['smartgroup','',aggrnum].join==聚合接口.join
536
+ end
537
+ end end
538
+ 聚合接口集合
539
+ end
540
+
541
+ # func: 根据一个接口的描述信息,给出其所属聚合接口的逻辑接口,若无返回空
542
+ def 聚合逻辑接口 配置
543
+ 配置.join.split("\n").each do|描述|
544
+ if 描述.include?("nas logic-interface")
545
+ num = 描述.split(" ")
546
+ return [num[-5],num[-3],num[-1]].join('/')
547
+ end
548
+ end
549
+ return nil
550
+ end
551
+
552
+ #####################################################################################################
553
+ # 接口VLAN相关
554
+ # 对接口vlan配置的解析
555
+ # dot1q : [vlan, ...]
556
+ # qinq : [[pvlan, (cvlan..cvlan)], [pvlan, cvlan], ...]
557
+ # vlan : [(cvlan..cvlan), cvlan, ...]
558
+ #####################################################################################################
559
+ def vlan分捡 接口配置
560
+ vlan = {}
561
+ vlan_part = 接口配置.find{|配置|(配置.include?("<VLAN>")&&配置.include?("</VLAN>")) || (配置.include?("<vlan>")&&配置.include?("</vlan>"))} || ""
562
+ vlan_part.each_line do|line| next if line.include?('no')
563
+ if pattern = /encapsulation-dot1q range (.+)/.match(line)
564
+ dot1q = eval(pattern[1].to_s.gsub('-','..')) # Range or Integer
565
+ vlan['dot1q'] ||= [];vlan['dot1q'] << dot1q;next
566
+ end
567
+ if pattern = /encapsulation-dot1q (\d+)/.match(line)
568
+ dot1q = eval(pattern[1].to_s)
569
+ vlan['dot1q'] ||= [];vlan['dot1q'] << dot1q;next
570
+ end
571
+ if pattern = /qinq range internal-vlan-range (.+) external-vlan-range (.+)/.match(line)
572
+ vlan['qinq'] ||= []
573
+ exvlan = eval(pattern[2].to_s.gsub('-','..')) # Range or Integer
574
+ invlan = eval(pattern[1].to_s.gsub('-','..'))
575
+ if exvlan.instance_of?(Range)
576
+ exvlan.each{|exv|vlan['qinq'] << [exv,invlan]}
577
+ elsif exvlan.instance_of?(Fixnum)
578
+ vlan['qinq'] << [exvlan,invlan]
579
+ end;next
580
+ end
581
+ if pattern = /qinq internal-vlanid (\d+) external-vlanid (\d+)/.match(line)
582
+ qinq = [pattern[2].to_i,pattern[1].to_i]
583
+ vlan['qinq'] ||= [];vlan['qinq'] << qinq;next
584
+ end
585
+ end
586
+ return vlan # {vlan:[ int|range ] qinq:[ [int,int|range] ] dot1q:[ int ]}
587
+ end
588
+
589
+ def vlan统计 name,物理接口集合,子接口集合
590
+ bas子接口数据库,聚合接口表 = {},[]
591
+ 聚合接口集合 = 物理接口集合.select{|物理接口|self.端口识别(物理接口)[0]=='smartgroup'}
592
+ 聚合接口表 += 聚合接口集合.collect{|聚合接口|self.聚合接口分捡(聚合接口,物理接口集合)}
593
+
594
+ 子接口集合.each do|接口配置|
595
+ 物理接口名称 = self.端口识别(接口配置).join.split(".")[0]
596
+ 物理接口 = 物理接口集合.find{|物理接口|物理接口[0].split(" ")[1]==(物理接口名称)}
597
+ next unless self.端口管理状态(物理接口) # 物理接口关闭的不统计
598
+ next unless self.端口管理状态(接口配置) # 子接口关闭的不统计
599
+
600
+ vlan配置 = {}
601
+ self.vlan分捡(接口配置).each do|type,data|
602
+ if type=='vlan' || type=='dot1q'
603
+ vlan配置[4096] ||= []; vlan配置[4096] += data # 用4096表示单层vlan
604
+ elsif type=='qinq'
605
+ data.each{|pvlan,cvlan|vlan配置[pvlan] ||= []; vlan配置[pvlan] << cvlan}
606
+ end
607
+ end
608
+
609
+ 子接口名称 = self.端口识别(接口配置)
610
+ if 子接口名称[0].include?("gei")
611
+ # 子接口索引 = ["eth--"+子接口名称[-1].split(".")[0].split('/')[-3..-1].join(',')] # AIBOS风格
612
+ 子接口索引 = [子接口名称.join.split(".")[0]] # 原生风格
613
+ end
614
+ if 子接口名称[0].include?("smartgroup") &&
615
+ 聚合接口组 = 聚合接口表.find{|聚合接口组|聚合接口组.include?(子接口名称.join.split('.')[0])}
616
+ 聚合接口的等效名称 = 聚合接口组.clone;
617
+ # 聚合接口的等效名称.delete(子接口名称.join.split('.')[0]) # 除了smartgroup自身,为所有等效接口创建 # 是否保留smartgroup是个争议
618
+ 子接口索引 = 聚合接口的等效名称.map do|等效名称|
619
+ # "eth--"+self.端口识别(等效名称)[-1].split(".")[0].split('/')[-3..-1].join(',') # AIBOS风格
620
+ self.端口识别(等效名称).join.split(".")[0] # 原生风格
621
+ end
622
+ # 子接口索引 << "trunk--"+[255,0,子接口名称[2].split('.')[0]].join(',') # AIBOS风格
623
+ 子接口索引 << 子接口名称.join.split(".")[0] # 原生风格
624
+ end
625
+
626
+ bas子接口数据库[name] ||= {}
627
+ 子接口索引.each do|索引|
628
+ bas子接口数据库[name][索引] ||= {}
629
+ vlan配置.each do|pv,cv|
630
+ bas子接口数据库[name][索引][pv] ||= []
631
+ bas子接口数据库[name][索引][pv] += cv
632
+ bas子接口数据库[name][索引][pv].uniq!
633
+ end
634
+ end
635
+ end
636
+ return bas子接口数据库
637
+ end
638
+
639
+
640
+ #####################################################################################################
641
+ # 接口相关统计信息的处理
642
+ #####################################################################################################
643
+
644
+ # gei-x/x/x.00000xxx => gei-x/x/x.xxx
645
+ # 一些统计场合子接口会补前置0,这里可以将其去掉
646
+ def 端口去0 描述
647
+ if 描述.include?("00") && 描述.include?('.')
648
+ 接口,子接口 = 描述.split(".")
649
+ [接口,子接口.to_i.to_s].join(".")
650
+ else
651
+ 描述
652
+ end
653
+ end
654
+
655
+ # 针对show intf-statistics utilization phy-interface-only
656
+ def 统计接口 文本
657
+ 文本.split("\n").inject([]) do|表格, 行|
658
+ 表格 << 行.split(" ") if 行.include?("gei-") or 行.include?("smartgroup") or 行.include?("spi-")
659
+ 表格 # [interface, in-bps, in-uti, out-bps, out-uti, in-errors, in-dbm, out-dbm]
660
+ end
661
+ end
662
+ end
663
+ ```