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.
- checksums.yaml +7 -0
- data/README.md +2 -0
- data/document/acl-M6000-16E.md +27 -0
- data/document/acl-M6000-18S.md +27 -0
- data/document/acl-M6000-8.md +27 -0
- data/document/acl-M6000-8E.md +27 -0
- data/document/acl-MA5200G-8.md +204 -0
- data/document/acl-ME60-16.md +177 -0
- data/document/acl-ME60-X16.md +177 -0
- data/document/acl-NE40E-X16.md +204 -0
- data/document/acl-NE40E-X16A.md +204 -0
- data/document/acl-NE40E-X8.md +204 -0
- data/document/acl-NE40E.md +204 -0
- data/document/acl-NE5000E-20.md +25 -0
- data/document/acl-NE5000E-X16.md +25 -0
- data/document/acl-NE5000E-X16A.md +25 -0
- data/document/acl-NE80E.md +204 -0
- data/document/bgp-CR16010H-F.md +25 -0
- data/document/bgp-CR16018-F.md +25 -0
- data/document/bgp-CR19000-20.md +25 -0
- data/document/bgp-M6000-16E.md +25 -0
- data/document/bgp-M6000-18S.md +25 -0
- data/document/bgp-M6000-8.md +25 -0
- data/document/bgp-M6000-8E.md +25 -0
- data/document/bgp-MA5200G-8.md +25 -0
- data/document/bgp-ME60-16.md +25 -0
- data/document/bgp-ME60-X16.md +25 -0
- data/document/bgp-NE40E-X16.md +25 -0
- data/document/bgp-NE40E-X16A.md +25 -0
- data/document/bgp-NE40E-X8.md +25 -0
- data/document/bgp-NE40E.md +25 -0
- data/document/bgp-NE5000E-20.md +25 -0
- data/document/bgp-NE5000E-X16.md +25 -0
- data/document/bgp-NE5000E-X16A.md +25 -0
- data/document/bgp-NE80E.md +25 -0
- data/document/config.md +1153 -0
- data/document/document.rb +27 -0
- data/document/if-ALCATEL7750.md +48 -0
- data/document/if-C7609.md +47 -0
- data/document/if-CR16010H-F.md +300 -0
- data/document/if-CR16018-F.md +300 -0
- data/document/if-CR19000-20.md +300 -0
- data/document/if-CRS-16.md +47 -0
- data/document/if-CX600-X16A.md +349 -0
- data/document/if-CX600-X8A.md +349 -0
- data/document/if-M6000-16E.md +652 -0
- data/document/if-M6000-18S.md +846 -0
- data/document/if-M6000-8.md +653 -0
- data/document/if-M6000-8E.md +653 -0
- data/document/if-MA5200G-8.md +357 -0
- data/document/if-ME60-16.md +357 -0
- data/document/if-ME60-X16.md +357 -0
- data/document/if-NE40E-X16.md +357 -0
- data/document/if-NE40E-X16A.md +357 -0
- data/document/if-NE40E-X8.md +357 -0
- data/document/if-NE40E.md +357 -0
- data/document/if-NE5000E-20.md +357 -0
- data/document/if-NE5000E-X16.md +357 -0
- data/document/if-NE5000E-X16A.md +357 -0
- data/document/if-NE8000E-X8.md +357 -0
- data/document/if-NE80E.md +357 -0
- data/document/if-NE8100-X8.md +357 -0
- data/document/if-Nokia7750.md +48 -0
- data/document/if-T8000-18.md +653 -0
- data/document/if-V6000.md +663 -0
- data/document/if-VNE9000.md +357 -0
- data/document/if-ZXCTN9000-18EA.md +762 -0
- data/document/if-ZXCTN9000-8EA.md +762 -0
- data/document/lic-M6000-16E.md +28 -0
- data/document/lic-M6000-18S.md +28 -0
- data/document/lic-M6000-8.md +28 -0
- data/document/lic-M6000-8E.md +28 -0
- data/document/lic-MA5200G-8.md +27 -0
- data/document/lic-ME60-16.md +27 -0
- data/document/lic-ME60-X16.md +27 -0
- data/document/lic-NE40E-X16.md +27 -0
- data/document/lic-NE40E-X16A.md +27 -0
- data/document/lic-NE40E-X8.md +27 -0
- data/document/log-M6000-16E.md +36 -0
- data/document/log-M6000-18S.md +36 -0
- data/document/log-M6000-8.md +36 -0
- data/document/log-M6000-8E.md +36 -0
- data/document/log-MA5200G-8.md +61 -0
- data/document/log-ME60-16.md +61 -0
- data/document/log-ME60-X16.md +61 -0
- data/document/log-NE40E-X16.md +61 -0
- data/document/log-NE40E-X16A.md +61 -0
- data/document/log-NE40E-X8.md +61 -0
- data/document/log-NE40E.md +61 -0
- data/document/log-NE5000E-20.md +61 -0
- data/document/log-NE5000E-X16.md +61 -0
- data/document/log-NE5000E-X16A.md +61 -0
- data/document/log-NE80E.md +61 -0
- data/document/nat-CR16010H-F.md +27 -0
- data/document/nat-CR16018-F.md +27 -0
- data/document/nat-M6000-16E.md +27 -0
- data/document/nat-M6000-18S.md +27 -0
- data/document/nat-M6000-8.md +27 -0
- data/document/nat-M6000-8E.md +27 -0
- data/document/nat-ME60-16.md +44 -0
- data/document/nat-ME60-X16.md +44 -0
- data/document/nat-NE40E-X16.md +44 -0
- data/document/nat-NE40E-X16A.md +44 -0
- data/document/policy-M6000-16E.md +13 -0
- data/document/policy-M6000-18S.md +13 -0
- data/document/policy-M6000-8.md +13 -0
- data/document/policy-M6000-8E.md +13 -0
- data/document/policy-MA5200G-8.md +87 -0
- data/document/policy-ME60-16.md +87 -0
- data/document/policy-ME60-X16.md +87 -0
- data/document/policy-NE40E-X16.md +87 -0
- data/document/policy-NE40E-X16A.md +87 -0
- data/document/policy-NE40E-X8.md +87 -0
- data/document/policy-NE40E.md +87 -0
- data/document/policy-NE5000E-20.md +87 -0
- data/document/policy-NE5000E-X16.md +87 -0
- data/document/policy-NE5000E-X16A.md +87 -0
- data/document/policy-NE80E.md +87 -0
- data/document/pool-M6000-16E.md +126 -0
- data/document/pool-M6000-18S.md +126 -0
- data/document/pool-M6000-8.md +126 -0
- data/document/pool-M6000-8E.md +126 -0
- data/document/pool-MA5200G-8.md +138 -0
- data/document/pool-ME60-16.md +138 -0
- data/document/pool-ME60-X16.md +138 -0
- data/document/pool-NE40E-X16.md +138 -0
- data/document/pool-NE40E-X16A.md +138 -0
- data/document/pool-NE40E-X8.md +138 -0
- data/document/pool-NE40E.md +138 -0
- data/document/pool-NE80E.md +138 -0
- data/document/static-CR16010H-F.md +60 -0
- data/document/static-CR16018-F.md +60 -0
- data/document/static-CR19000-20.md +60 -0
- data/document/static-CX600-X16A.md +26 -0
- data/document/static-CX600-X8A.md +26 -0
- data/document/static-M6000-16E.md +104 -0
- data/document/static-M6000-18S.md +104 -0
- data/document/static-M6000-8.md +104 -0
- data/document/static-M6000-8E.md +104 -0
- data/document/static-MA5200G-8.md +82 -0
- data/document/static-ME60-16.md +82 -0
- data/document/static-ME60-X16.md +82 -0
- data/document/static-NE40E-X16.md +82 -0
- data/document/static-NE40E-X16A.md +81 -0
- data/document/static-NE40E-X8.md +82 -0
- data/document/static-NE40E.md +67 -0
- data/document/static-NE5000E-20.md +67 -0
- data/document/static-NE5000E-X16.md +67 -0
- data/document/static-NE5000E-X16A.md +67 -0
- data/document/static-NE8000E-X8.md +26 -0
- data/document/static-NE80E.md +67 -0
- data/document/static-NE8100-X8.md +26 -0
- data/document/static-T8000-18.md +34 -0
- data/document/static-ZXCTN9000-18EA.md +34 -0
- data/document/static-ZXCTN9000-8EA.md +34 -0
- data/document/system-M6000-16E.md +75 -0
- data/document/system-M6000-18S.md +76 -0
- data/document/system-M6000-8.md +75 -0
- data/document/system-M6000-8E.md +75 -0
- data/document/system-MA5200G-8.md +51 -0
- data/document/system-ME60-16.md +51 -0
- data/document/system-ME60-X16.md +51 -0
- data/document/system-NE40E-X16.md +51 -0
- data/document/system-NE40E-X16A.md +51 -0
- data/document/system-NE40E-X8.md +51 -0
- data/document/system-NE40E.md +51 -0
- data/document/system-NE5000E-20.md +51 -0
- data/document/system-NE5000E-X16.md +51 -0
- data/document/system-NE5000E-X16A.md +51 -0
- data/document/system-NE80E.md +51 -0
- data/document/telnet.md +332 -0
- data/network.rb +24 -0
- data/utility/ipv4_address.rb +266 -0
- data/utility/ipv6_address.rb +201 -0
- data/utility/mac_address.rb +77 -0
- data/utility/netmerge.rb +46 -0
- data/utility/route.rb +79 -0
- data/utility/whitelist.rb +21 -0
- metadata +258 -0
@@ -0,0 +1,357 @@
|
|
1
|
+
|
2
|
+
# NE5000E-X16 接口
|
3
|
+
|
4
|
+
```ruby
|
5
|
+
@sign << ["NE5000E-X16", "接口配置"]
|
6
|
+
@sign << ["NE5000E-X16", "特殊接口配置"]
|
7
|
+
@sign << ["NE5000E-X16", "物理接口配置"]
|
8
|
+
@sign << ["NE5000E-X16", "子接口配置"]
|
9
|
+
@sign << ["NE5000E-X16", "接口分捡"]
|
10
|
+
@sign << ["NE5000E-X16", "端口识别"]
|
11
|
+
@sign << ["NE5000E-X16", "端口MAC"]
|
12
|
+
@sign << ["NE5000E-X16", "端口管理状态"]
|
13
|
+
@sign << ["NE5000E-X16", "接口描述"]
|
14
|
+
@sign << ["NE5000E-X16", "接口地址"]
|
15
|
+
@sign << ["NE5000E-X16", "接口开关"]
|
16
|
+
@sign << ["NE5000E-X16", "接口vpn实例"]
|
17
|
+
@sign << ["NE5000E-X16", "接口QoS"]
|
18
|
+
@sign << ["NE5000E-X16", "接口流策略"]
|
19
|
+
@sign << ["NE5000E-X16", "接口统计"]
|
20
|
+
@sign << ["NE5000E-X16", "接口URPF"]
|
21
|
+
@sign << ["NE5000E-X16", "接口接入类型"]
|
22
|
+
@sign << ["NE5000E-X16", "聚合接口判定"]
|
23
|
+
@sign << ["NE5000E-X16", "聚合接口分捡"]
|
24
|
+
@sign << ["NE5000E-X16", "聚合逻辑接口"]
|
25
|
+
@sign << ["NE5000E-X16", "聚合接口查询"]
|
26
|
+
@sign << ["NE5000E-X16", "vlan分捡"]
|
27
|
+
@sign << ["NE5000E-X16", "vlan统计"]
|
28
|
+
@sign << ["NE5000E-X16", "统计接口"]
|
29
|
+
|
30
|
+
module NE5000E_X16
|
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
|
+
```
|