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