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,357 @@
1
+
2
+ # NE5000E-X16A 接口
3
+
4
+ ```ruby
5
+ @sign << ["NE5000E-X16A", "接口配置"]
6
+ @sign << ["NE5000E-X16A", "特殊接口配置"]
7
+ @sign << ["NE5000E-X16A", "物理接口配置"]
8
+ @sign << ["NE5000E-X16A", "子接口配置"]
9
+ @sign << ["NE5000E-X16A", "接口分捡"]
10
+ @sign << ["NE5000E-X16A", "端口识别"]
11
+ @sign << ["NE5000E-X16A", "端口MAC"]
12
+ @sign << ["NE5000E-X16A", "端口管理状态"]
13
+ @sign << ["NE5000E-X16A", "接口描述"]
14
+ @sign << ["NE5000E-X16A", "接口地址"]
15
+ @sign << ["NE5000E-X16A", "接口开关"]
16
+ @sign << ["NE5000E-X16A", "接口vpn实例"]
17
+ @sign << ["NE5000E-X16A", "接口QoS"]
18
+ @sign << ["NE5000E-X16A", "接口流策略"]
19
+ @sign << ["NE5000E-X16A", "接口统计"]
20
+ @sign << ["NE5000E-X16A", "接口URPF"]
21
+ @sign << ["NE5000E-X16A", "接口接入类型"]
22
+ @sign << ["NE5000E-X16A", "聚合接口判定"]
23
+ @sign << ["NE5000E-X16A", "聚合接口分捡"]
24
+ @sign << ["NE5000E-X16A", "聚合逻辑接口"]
25
+ @sign << ["NE5000E-X16A", "聚合接口查询"]
26
+ @sign << ["NE5000E-X16A", "vlan分捡"]
27
+ @sign << ["NE5000E-X16A", "vlan统计"]
28
+ @sign << ["NE5000E-X16A", "统计接口"]
29
+
30
+ module NE5000E_X16A
31
+ module_function
32
+ #####################################################################################################
33
+ # 接口/端口配置的基本查询
34
+ # 接口集合 => 接口分检 => 物理接口集合,子接口集合,特殊接口集合
35
+ #####################################################################################################
36
+ def 接口配置 正文
37
+ 正文['interface'] # Array
38
+ end
39
+
40
+ def 特殊接口配置 接口集合
41
+ 接口集合.collect{|接口|
42
+ 接口 if /Virtual|Aux|NULL|LoopBack|Logic\-Channel/.match(接口.split("\n")[0])
43
+ }.compact.sort_by{|接口|接口.split("\n")[0]}
44
+ end
45
+
46
+ def 物理接口配置 接口集合,特殊接口集合=nil
47
+ 其余接口 = 特殊接口集合 ? (接口集合-特殊接口集合) : (接口集合-self.特殊接口配置(接口集合))
48
+ 其余接口.collect{|接口|接口 unless 接口.split("\n")[0].include?('.')}.compact
49
+ end
50
+
51
+ def 子接口配置 接口集合,特殊接口集合=nil
52
+ 其余接口 = 特殊接口集合 ? (接口集合-特殊接口集合) : (接口集合-self.特殊接口配置(接口集合))
53
+ 其余接口.collect{|接口|接口 if 接口.split("\n")[0].include?('.')}.compact
54
+ end
55
+
56
+ def 接口分捡 接口集合
57
+ 特殊接口集合 = self.特殊接口配置(接口集合)
58
+ 物理接口集合 = self.物理接口配置(接口集合,特殊接口集合)
59
+ 子接口集合 = self.子接口配置(接口集合,特殊接口集合)
60
+ return 物理接口集合,子接口集合,特殊接口集合
61
+ end
62
+
63
+
64
+ #####################################################################################################
65
+ # 端口描述信息相关
66
+ #####################################################################################################
67
+
68
+ # func: 根据一个端口的描述信息,给出其格式化的类型、连接符、端口编号
69
+ def 端口识别 描述
70
+ 连接符 = ''
71
+ type = /100GE|GE|GigabitEthernet|Pos|Ethernet|Eth\-Trunk|Virtual\-Template|NULL|LoopBack|Aux/.match(描述)
72
+ 类型 = type ? type.to_s : '未知类型'
73
+ port = /(\d+|\/|\.)*(\d+)/.match(描述.split(类型).join)
74
+ 端口 = port ? port.to_s : '未知端口'
75
+ return 类型,连接符,端口
76
+ end
77
+
78
+ # func: 根据一个端口的描述信息,给出其mac地址,若无mac则返回nil
79
+ def 端口MAC 描述
80
+ 描述.each_line do|line|
81
+ if pattern = /Hardware address is (.+)/.match(line)
82
+ matcher = /[\d|A-F|a-f]+\-[\d|A-F|a-f]+\-[\d|A-F|a-f]+/.match(pattern[1].strip)
83
+ return pattern[1].strip if matcher.to_s==pattern[1].strip
84
+ end
85
+ end
86
+ return nil
87
+ end
88
+
89
+ # func: 根据一个端口的描述信息,给出其管理状态是打开/关闭的判断
90
+ def 端口管理状态 描述
91
+ 管理状态 = true
92
+ 描述.split("\n").each do|line|
93
+ 管理状态 = false if line.include?("shutdown") && !line.include?("undo shutdown")
94
+ end
95
+ 管理状态
96
+ end
97
+
98
+ # func: 根据一个端口的配置给出其描述
99
+ def 接口描述 接口配置
100
+ 描述 = ''
101
+ 接口配置.each_line do|line| if line.strip[0..10]=='description'
102
+ 描述 = line.split('description')[-1].strip; break
103
+ end end
104
+ 描述.to_s
105
+ end
106
+
107
+ # func: 根据一个端口的配置给出其配置的接口地址
108
+ def 接口地址 接口配置
109
+ 地址集 = []
110
+ 接口配置.each_line do|line|
111
+ if line.strip[0..9]=='ip address' and !line.include?('unnumbered')
112
+ 地址集 << line.gsub("sub","").split('ip address')[-1].strip.split(' ')
113
+ end
114
+ if line.strip[0..11]=='ipv6 address' and !line.include?("auto link-local") and !line.include?('unnumbered')
115
+ 地址集 << line.gsub("sub","").split('ipv6 address')[-1].strip.split('/')
116
+ end
117
+ end
118
+ 地址集
119
+ end
120
+
121
+ # func: 根据一个端口的配置给出其开关状态(配置层面的"端口管理状态")
122
+ def 接口开关 接口配置
123
+ 描述 = ''
124
+ 接口配置.each_line do|line|
125
+ if line.include?('shutdown') and !line.include?('no') and !line.include?('undo') and !line.include?('description')
126
+ 描述 = 'shutdown'; break
127
+ end
128
+ end
129
+ 描述
130
+ end
131
+
132
+ # func: 根据一个端口的配置给出其关联的vpn实例
133
+ def 接口vpn实例 接口配置
134
+ 实例 = ''
135
+ 接口配置.each_line do|line|
136
+ 实例 = "vpn-inst:" + /vpn\-instance .+/.match(line).to_s.split(" ")[-1] if /vpn\-instance .+/.match(line)
137
+ 实例 = "vsi:" + /vsi .+/.match(line).to_s.split(" ")[-1] if /vsi .+/.match(line)
138
+ end
139
+ 实例
140
+ end
141
+
142
+ # func: 端口应用QoS模板
143
+ def 接口QoS 接口配置
144
+ qos = {}
145
+ 接口配置.each_line do|line|
146
+ if line.include?('qos-profile')
147
+ words = line.split(' ')
148
+ direction = line.include?('inbound') ? 'inbound' : 'outbound'
149
+ profile = words[words.index('qos-profile')+1]
150
+ if vlan_index = words.index('vlan')
151
+ qos["vlan-id:#{words[vlan_index+1]}"] ||= {}
152
+ qos["vlan-id:#{words[vlan_index+1]}"][direction] = profile
153
+ elsif words.index('pe-vid') && words.index('ce-vid')
154
+ pe_index, ce_index = words.index('pe-vid'), words.index('ce-vid')
155
+ qos["pvc-id:#{words[pe_index+1]}/#{words[ce_index+1]}"] ||= {}
156
+ qos["pvc-id:#{words[pe_index+1]}/#{words[ce_index+1]}"][direction] = profile
157
+ else
158
+ qos["port"] ||= {}
159
+ qos["port"][direction] = profile
160
+ end
161
+ end
162
+ end
163
+ qos
164
+ end
165
+
166
+ # func: 端口应用流量模板
167
+ def 接口流策略 接口配置
168
+ traffic = {}
169
+ 接口配置.each_line do|line|
170
+ if line.include?('traffic-policy')
171
+ words = line.split(' ')
172
+ direction = line.include?('inbound') ? 'inbound' : 'outbound'
173
+ profile = words[words.index('traffic-policy')+1]
174
+ traffic[direction] = profile
175
+ end
176
+ end
177
+ traffic
178
+ end
179
+
180
+ # func: 端口统计功能
181
+ def 接口统计 接口配置
182
+ 接口配置.each_line do|line|
183
+ return :statistic if line.strip =='statistic enable'
184
+ end
185
+ return false
186
+ end
187
+
188
+ # func: 端口URPF功能
189
+ def 接口URPF 接口配置
190
+ 接口配置.each_line do|line|
191
+ return (line.include?('strict') ? 'strict' : 'loose') if line.include?('urpf')
192
+ end
193
+ return nil
194
+ end
195
+
196
+ # func: 端口接入类型
197
+ def 接口接入类型 接口配置
198
+ 接口配置.each_line do|line|
199
+ if line.include?('access-type')
200
+ words = line.split(' ')
201
+ atype = words[words.index('access-type')+1]
202
+ if words.index('default-domain')
203
+ a3dom = words[words.index('default-domain')+1]
204
+ dname = words[words.index('default-domain')+2]
205
+ return {'access-type'=>atype, a3dom => dname}
206
+ else
207
+ return {'access-type'=>atype}
208
+ end
209
+ end
210
+ end
211
+ return {}
212
+ end
213
+
214
+ #####################################################################################################
215
+ # 聚合接口判定相关
216
+ #####################################################################################################
217
+
218
+ # func: 根据一个接口的描述信息,给出其所属聚合接口的信息,若非聚合端口返回空
219
+ def 聚合接口判定 配置
220
+ 配置.split("\n").each do|描述|
221
+ if 描述.include?("eth-trunk") && !描述.include?("description")
222
+ return {self.端口识别(配置).join=>"Eth-Trunk"+描述.split("eth-trunk")[1].strip}
223
+ end
224
+ end;{}
225
+ end
226
+
227
+ # func: 给出聚合接口和物理接口的集合,通过计算找出所有聚合接口的集合
228
+ def 聚合接口分捡 聚合接口,物理接口集合
229
+ 聚合接口 = self.端口识别(聚合接口)
230
+ 聚合接口集合 = [聚合接口.join]
231
+ 物理接口集合.each do|物理接口| 物理接口.each_line do|line|
232
+ 聚合接口集合 << self.端口识别(物理接口).join if line.include?("eth-trunk #{聚合接口[-1]}")
233
+ end end
234
+ 聚合接口集合
235
+ end
236
+
237
+ # func: 根据一个接口的描述信息,给出其所属聚合接口的逻辑接口,若无返回空
238
+ def 聚合逻辑接口 配置
239
+ 配置.split("\n").each do|描述|
240
+ return 描述.split(" ")[-1] if 描述.include?("nas logic-port")
241
+ end
242
+ return nil
243
+ end
244
+
245
+ # func: 给出聚合接口查询命令的返回结果,提取接口对应的物理接口,若无返回空
246
+ def 聚合接口查询 查询报文
247
+ return [] if 查询报文.include?("not exist")
248
+ parts = 查询报文.split("--------------------------------------------------------------------------------")
249
+ return parts[1].split("\n").map{|s|s.split(" ")}.select{|s|s.size>1}.map{|s|s.first.split('(').first}.select{|s|!s.include?('Actor')}
250
+ end
251
+
252
+ #####################################################################################################
253
+ # 接口VLAN相关
254
+ # 对接口vlan配置的解析
255
+ # dot1q : [vlan, ...]
256
+ # qinq : [[pvlan, (cvlan..cvlan)], [pvlan, cvlan], ...]
257
+ # vlan : [(cvlan..cvlan), cvlan, ...]
258
+ #####################################################################################################
259
+ def vlan分捡 接口配置
260
+ vlan = {}
261
+ 接口配置.each_line do|line| next if line.include?('undo')
262
+ if pattern = /vlan\-type dot1q (\d+)/.match(line)
263
+ dot1q = pattern.to_s.split("dot1q")[-1].strip.to_i
264
+ vlan['dot1q'] ||= [];vlan['dot1q'] << dot1q;next
265
+ end
266
+ if pattern = /dot1q termination vid (\d+)/.match(line) # new version
267
+ dot1q = pattern.to_s.split("vid")[-1].strip.to_i
268
+ vlan['dot1q'] ||= [];vlan['dot1q'] << dot1q;next
269
+ end
270
+ if pattern = /qinq termination pe-vid (\d+) ce-vid (\d+)/.match(line) # new version
271
+ qinq = [pattern[1], pattern[2]]
272
+ vlan['qinq'] ||= [];vlan['qinq'] << qinq;next
273
+ end
274
+ if pattern = /user\-vlan (\d+) (\d+) qinq (\d+)/.match(line)
275
+ qinq = [pattern[3].to_i, (pattern[1].to_i)..(pattern[2].to_i)]
276
+ vlan['qinq'] ||= [];vlan['qinq'] << qinq;next
277
+ end
278
+ if pattern = /user\-vlan (\d+) qinq (\d+)/.match(line)
279
+ qinq = [pattern[2].to_i, pattern[1].to_i]
280
+ vlan['qinq'] ||= [];vlan['qinq'] << qinq;next
281
+ end
282
+ if pattern = /user\-vlan (\d+) (\d+)/.match(line)
283
+ user_vlan = ((pattern[1].to_i)..(pattern[2].to_i))
284
+ vlan['vlan'] ||= [];vlan['vlan'] << user_vlan;next
285
+ end
286
+ if pattern = /user\-vlan (\d+)/.match(line)
287
+ user_vlan = pattern[1].to_i
288
+ vlan['vlan'] ||= [];vlan['vlan'] << user_vlan;next
289
+ end
290
+ end
291
+ return vlan # {vlan:[ int|range ] qinq:[ [int,int|range] ] dot1q:[ int ]}
292
+ end
293
+
294
+ def vlan统计 name,物理接口集合,子接口集合
295
+ bas子接口数据库,聚合接口表 = {},[]
296
+ 聚合接口集合 = 物理接口集合.select{|物理接口|self.端口识别(物理接口)[0]=='Eth-Trunk'}
297
+ 聚合接口表 += 聚合接口集合.collect{|聚合接口|self.聚合接口分捡(聚合接口,物理接口集合)}
298
+
299
+ 子接口集合.each do|接口配置|
300
+ 物理接口名称 = self.端口识别(接口配置).join.split(".")[0]
301
+ 物理接口 = 物理接口集合.find{|物理接口|物理接口.split("\n")[0].split(" ")[1]==(物理接口名称)}
302
+ next unless self.端口管理状态(物理接口) # 物理接口关闭的不统计
303
+ next unless self.端口管理状态(接口配置) # 子接口关闭的不统计
304
+
305
+ vlan配置 = {}
306
+ self.vlan分捡(接口配置).each do|type,data|
307
+ if type=='vlan'
308
+ vlan配置[4096] ||= []; vlan配置[4096] += data # 用4096表示单层vlan
309
+ elsif type=='qinq'
310
+ data.each{|pvlan,cvlan|vlan配置[pvlan] ||= []; vlan配置[pvlan] << cvlan}
311
+ else
312
+ # discard dot1q
313
+ end
314
+ end
315
+
316
+ 子接口名称 = self.端口识别(接口配置)
317
+ bas子接口数据库[name] ||= {}
318
+ if 子接口名称[0].include?("GigabitEthernet")
319
+ # 子接口索引 = ["eth--"+子接口名称[-1].split(".")[0].split('/')[-3..-1].join(',')] # AIBOS风格
320
+ 子接口索引 = [子接口名称.join.split(".")[0]] # 原生风格
321
+ end
322
+ if 子接口名称[0].include?("Eth-Trunk") &&
323
+ 聚合接口组 = 聚合接口表.find{|聚合接口组|聚合接口组.include?(子接口名称.join.split('.')[0])}
324
+ 聚合接口的等效名称 = 聚合接口组.clone
325
+ #聚合接口的等效名称.delete(子接口名称.join.split('.')[0]) # 除了trunk自身,为所有等效接口创建 # 是否保留Trunk是个争议
326
+ 子接口索引 = 聚合接口的等效名称.collect do|等效名称|
327
+ # "trunk--"+self.端口识别(等效名称)[-1].split(".")[0].split('/')[-3..-1].join(',') # AIBOS风格
328
+ self.端口识别(等效名称).join.split(".")[0] # 原生风格
329
+ end
330
+ end
331
+
332
+ 子接口索引.each do|索引|
333
+ bas子接口数据库[name][索引] ||= {}
334
+ vlan配置.each do|pv,cv|
335
+ bas子接口数据库[name][索引][pv] ||= []
336
+ bas子接口数据库[name][索引][pv] += cv
337
+ bas子接口数据库[name][索引][pv].uniq!
338
+ end
339
+ end
340
+ end
341
+ return bas子接口数据库
342
+ end
343
+
344
+
345
+ #####################################################################################################
346
+ # 接口相关统计信息的处理
347
+ #####################################################################################################
348
+
349
+ # 针对display interface brief main
350
+ def 统计接口 文本
351
+ 文本.split("\n").inject([]) do|表格, 行|
352
+ 表格 << 行.split(" ") if 行.include?("100GE") or 行.include?("GigabitEthernet") or 行.include?("Eth-Trunk")
353
+ 表格 # [interface, physical, protocol, in-uti, out-uti, in-errors, out-errors]
354
+ end
355
+ end
356
+ end
357
+ ```