network-utility 1.1.41 → 1.1.43

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.
@@ -0,0 +1,56 @@
1
+
2
+ # M6000-8 流量、光功率、用户数统计
3
+
4
+ ```ruby
5
+ @sign << ['M6000-8', 'flux_statistic']
6
+ @sign << ['M6000-8', 'optical_statistic']
7
+ @sign << ['M6000-8', 'subscriber_statistic']
8
+
9
+ module M6000_8
10
+ module_function
11
+
12
+ def flux_statistic content
13
+ context,flag = [], false
14
+ head = ['interface', 'in_flux(bps)', # Bps => bps
15
+ 'in_percent(bps)','out_flux', # Bps => bps
16
+ 'out_percent','in_error','in_optical','out_optical']
17
+ content.split("\n").each do|line|
18
+ (flag = true;next) if line.include?('#### begin flux ####')
19
+ break if line.include?('#### end flux ####')
20
+ if flag
21
+ words = line.strip.split(' ')
22
+ next if words.size < 8
23
+ context << [words[0], words[1].to_i*8, words[2]+'%', words[3].to_i*8, words[4]+'%', words[5].to_i, words[6].to_f, words[7].to_f]
24
+ end
25
+ end
26
+ context.sort_by!{|c|c[0]}
27
+ context.unshift head
28
+ return context
29
+ end
30
+
31
+ def optical_statistic content_or_table
32
+ content = content_or_table.is_a?(Array) ? content_or_table : (self.flux_statistic content_or_table)
33
+ # head: ['interface', 'in_optical', 'out_optical']
34
+ return content.map{|c|[c[0],c[-2],c[-1]]}
35
+ end
36
+
37
+ def subscriber_statistic content
38
+ context,flag = [], false
39
+ head = ['domain','state','limit','num','num(v4)','num(v6)','num(dual)']
40
+ content.split("\n").each do|line|
41
+ (flag = true;next) if line.include?('#### begin subscriber ####')
42
+ break if line.include?('#### end subscriber ####')
43
+ if flag
44
+ words = line.strip.split(' ')
45
+ next if words.size != 4 || words.include?('subscriber')
46
+ num, sub = words[-1].split('(')
47
+ num4, num6, numd = sub.split(')').first.split('/')
48
+ context << words[0..1]+ [words[2].to_i, num.to_i, num4.to_i, num6.to_i, numd.to_i]
49
+ end
50
+ end
51
+ context.sort_by!{|c|c[0]}
52
+ context.unshift head
53
+ return context
54
+ end
55
+ end
56
+ ```
@@ -0,0 +1,56 @@
1
+
2
+ # M6000-8E 流量、光功率、用户数统计
3
+
4
+ ```ruby
5
+ @sign << ['M6000-8E', 'flux_statistic']
6
+ @sign << ['M6000-8E', 'optical_statistic']
7
+ @sign << ['M6000-8E', 'subscriber_statistic']
8
+
9
+ module M6000_8E
10
+ module_function
11
+
12
+ def flux_statistic content
13
+ context,flag = [], false
14
+ head = ['interface', 'in_flux(bps)', # Bps => bps
15
+ 'in_percent(bps)','out_flux', # Bps => bps
16
+ 'out_percent','in_error','in_optical','out_optical']
17
+ content.split("\n").each do|line|
18
+ (flag = true;next) if line.include?('#### begin flux ####')
19
+ break if line.include?('#### end flux ####')
20
+ if flag
21
+ words = line.strip.split(' ')
22
+ next if words.size < 8
23
+ context << [words[0], words[1].to_i*8, words[2]+'%', words[3].to_i*8, words[4]+'%', words[5].to_i, words[6].to_f, words[7].to_f]
24
+ end
25
+ end
26
+ context.sort_by!{|c|c[0]}
27
+ context.unshift head
28
+ return context
29
+ end
30
+
31
+ def optical_statistic content_or_table
32
+ content = content_or_table.is_a?(Array) ? content_or_table : (self.flux_statistic content_or_table)
33
+ # head: ['interface', 'in_optical', 'out_optical']
34
+ return content.map{|c|[c[0],c[-2],c[-1]]}
35
+ end
36
+
37
+ def subscriber_statistic content
38
+ context,flag = [], false
39
+ head = ['domain','state','limit','num','num(v4)','num(v6)','num(dual)']
40
+ content.split("\n").each do|line|
41
+ (flag = true;next) if line.include?('#### begin subscriber ####')
42
+ break if line.include?('#### end subscriber ####')
43
+ if flag
44
+ words = line.strip.split(' ')
45
+ next if words.size != 4 || words.include?('subscriber')
46
+ num, sub = words[-1].split('(')
47
+ num4, num6, numd = sub.split(')').first.split('/')
48
+ context << words[0..1]+ [words[2].to_i, num.to_i, num4.to_i, num6.to_i, numd.to_i]
49
+ end
50
+ end
51
+ context.sort_by!{|c|c[0]}
52
+ context.unshift head
53
+ return context
54
+ end
55
+ end
56
+ ```
@@ -0,0 +1,78 @@
1
+ # CX600-X16A VPN
2
+
3
+ ```ruby
4
+ @sign << ['CX600-X16A', 'vpn_instance']
5
+ @sign << ['CX600-X16A', 'evpn_instance']
6
+ @sign << ['CX600-X16A', 'bridge_domain']
7
+ @sign << ['CX600-X16A', 'if_bridge_domain']
8
+
9
+ module CX600_X16A
10
+ module_function
11
+
12
+ def vpn_instance conf
13
+ doc = {}
14
+ vpn_family = 'ipv4-family'
15
+ conf.split("\n").each do|line|
16
+ doc['vpn-name'] = line.split('vpn-instance ').last.strip if line.include?('ip') && line.include?('vpn-instance')
17
+ vpn_family = 'ipv4-family' if line.include?('ipv4-family')
18
+ vpn_family = 'ipv6-family' if line.include?('ipv6-family')
19
+ doc[vpn_family] ||= {}
20
+ doc[vpn_family]['route-distinguisher'] = line.split('route-distinguisher ').last.strip if line.include?('route-distinguisher')
21
+ if line.include?('vpn-target')
22
+ family = line.include?('evpn') ? 'evpn' : vpn_family.split('-').first
23
+ direction = 'export' if line.include?('export')
24
+ direction = 'import' if line.include?('import')
25
+ words = line.split('vpn-target ').last.split(' ')
26
+ target = words.select{|w|!w.include?('community') && !w.include?('evpn') && !w.strip.empty?}.map{|w|w.strip}
27
+ doc[vpn_family][family] ||= {}
28
+ doc[vpn_family][family][direction] ||= []
29
+ doc[vpn_family][family][direction] += target
30
+ end
31
+ end
32
+ return doc
33
+ end
34
+
35
+ def evpn_instance conf
36
+ doc = {}
37
+ conf.split("\n").each do|line|
38
+ doc['vpn-name'] = line.split('vpn-instance ')[-1].split(' ').first.strip if line.include?('evpn') && line.include?('vpn-instance')
39
+ doc['mode'] = 'bd-mode' if line.include?('bd-mode') && line.include?('vpn-instance')
40
+ doc['route-distinguisher'] = line.split('route-distinguisher ').last.strip if line.include?('route-distinguisher')
41
+ if line.include?('segment-routing')
42
+ doc['segment-routing'] ||= {}
43
+ family = line.include?('ipv6') ? 'ipv6-family' : 'ipv4-family'
44
+ doc['segment-routing'][family] ||= {}
45
+ doc['segment-routing'][family]['mode'] = 'best-effort' if line.include?('best-effort')
46
+ doc['segment-routing'][family]['locator'] = line.split('locator ').last.strip if line.include?('locator')
47
+ end
48
+ if line.include?('vpn-target')
49
+ direction = 'export' if line.include?('export')
50
+ direction = 'import' if line.include?('import')
51
+ words = line.split('vpn-target ').last.split(' ')
52
+ target = words.select{|w|!w.include?('community') && !w.include?('evpn') && !w.strip.empty?}.map{|w|w.strip}
53
+ doc['vpn-target'] ||= {}
54
+ doc['vpn-target'][direction] ||= []
55
+ doc['vpn-target'][direction] += target
56
+ end
57
+ end
58
+ return doc
59
+ end
60
+
61
+ def bridge_domain bdconf
62
+ bd = {}
63
+ bdconf.split("\n").each do|line|
64
+ bd['bridge-domain'] = line.split(' ').last.strip if line.include?('bridge-domain')
65
+ bd['statistic'] = 'enable' if line.include?('statistic enable')
66
+ bd['evpn-instance'] = line.split("vpn-instance").last.strip if line.include?('vpn-instance')
67
+ end
68
+ return bd
69
+ end
70
+
71
+ def if_bridge_domain ifconf
72
+ ifconf.split("\n").each do|line|
73
+ return line.split(' ').last.strip if line.include?('bridge-domain')
74
+ end
75
+ return nil
76
+ end
77
+ end
78
+ ```
@@ -0,0 +1,79 @@
1
+ # CX600-X8A VPN
2
+
3
+ ```ruby
4
+ @sign << ['CX600-X8A', 'vpn_instance']
5
+ @sign << ['CX600-X8A', 'evpn_instance']
6
+ @sign << ['CX600-X8A', 'bridge_domain']
7
+ @sign << ['CX600-X8A', 'if_bridge_domain']
8
+
9
+ module CX600_X8A
10
+ module_function
11
+
12
+ def vpn_instance conf
13
+ doc = {}
14
+ vpn_family = 'ipv4-family'
15
+ conf.split("\n").each do|line|
16
+ doc['vpn-name'] = line.split('vpn-instance ').last.strip if line.include?('ip') && line.include?('vpn-instance')
17
+ vpn_family = 'ipv4-family' if line.include?('ipv4-family')
18
+ vpn_family = 'ipv6-family' if line.include?('ipv6-family')
19
+ doc[vpn_family] ||= {}
20
+ doc[vpn_family]['route-distinguisher'] = line.split('route-distinguisher ').last.strip if line.include?('route-distinguisher')
21
+ if line.include?('vpn-target')
22
+ family = line.include?('evpn') ? 'evpn' : vpn_family.split('-').first
23
+ direction = 'export' if line.include?('export')
24
+ direction = 'import' if line.include?('import')
25
+ words = line.split('vpn-target ').last.split(' ')
26
+ target = words.select{|w|!w.include?('community') && !w.include?('evpn') && !w.strip.empty?}.map{|w|w.strip}
27
+ doc[vpn_family][family] ||= {}
28
+ doc[vpn_family][family][direction] ||= []
29
+ doc[vpn_family][family][direction] += target
30
+ end
31
+ end
32
+ return doc
33
+ end
34
+
35
+ def evpn_instance conf
36
+ doc = {}
37
+ conf.split("\n").each do|line|
38
+ doc['vpn-name'] = line.split('vpn-instance ')[-1].split(' ').first.strip if line.include?('evpn') && line.include?('vpn-instance')
39
+ doc['mode'] = 'bd-mode' if line.include?('bd-mode') && line.include?('vpn-instance')
40
+ doc['route-distinguisher'] = line.split('route-distinguisher ').last.strip if line.include?('route-distinguisher')
41
+ if line.include?('segment-routing')
42
+ doc['segment-routing'] ||= {}
43
+ family = line.include?('ipv6') ? 'ipv6-family' : 'ipv4-family'
44
+ doc['segment-routing'][family] ||= {}
45
+ doc['segment-routing'][family]['mode'] = 'best-effort' if line.include?('best-effort')
46
+ doc['segment-routing'][family]['locator'] = line.split('locator ').last.strip if line.include?('locator')
47
+ end
48
+ if line.include?('vpn-target')
49
+ direction = 'export' if line.include?('export')
50
+ direction = 'import' if line.include?('import')
51
+ words = line.split('vpn-target ').last.split(' ')
52
+ target = words.select{|w|!w.include?('community') && !w.include?('evpn') && !w.strip.empty?}.map{|w|w.strip}
53
+ doc['vpn-target'] ||= {}
54
+ doc['vpn-target'][direction] ||= []
55
+ doc['vpn-target'][direction] += target
56
+ end
57
+ end
58
+ return doc
59
+ end
60
+
61
+ def bridge_domain bdconf
62
+ bd = {}
63
+ bdconf.split("\n").each do|line|
64
+ bd['bridge-domain'] = line.split(' ').last.strip if line.include?('bridge-domain')
65
+ bd['statistic'] = 'enable' if line.include?('statistic enable')
66
+ bd['evpn-instance'] = line.split("vpn-instance").last.strip if line.include?('vpn-instance')
67
+ end
68
+ return bd
69
+ end
70
+
71
+ def if_bridge_domain ifconf
72
+ ifconf.split("\n").each do|line|
73
+ return line.split(' ').last.strip if line.include?('bridge-domain')
74
+ end
75
+ return nil
76
+ end
77
+ end
78
+
79
+ ```
@@ -0,0 +1,74 @@
1
+ # ZXCTN9000-18EA VPN
2
+
3
+ ```ruby
4
+ @sign << ['ZXCTN9000-18EA', 'l2vpn']
5
+ @sign << ['ZXCTN9000-18EA', 'vpls']
6
+ @sign << ['ZXCTN9000-18EA', 'vpls_if']
7
+
8
+ module ZXCTN9000_18EA
9
+ module_function
10
+
11
+ def l2vpn conf
12
+ content = (conf['l2vpn'] || "")
13
+ instances = TextAbstract.match_paragraph(content, "\nvpls ", "\n$").map{|t|"vpls "+t+"\n$"}
14
+ return instances
15
+ end
16
+
17
+ def vpls conf
18
+ doc = {};mode = nil
19
+ conf.split("\n").each do|line|
20
+ doc['vpn-name'] = line.split('vpls ').last.split(' ').first.strip if line.include?('vpls ')
21
+ doc['mode'] = line.include?('vpls ') && line.include?('evpn') ? 'vpls-evpn' : 'vpls'
22
+ doc['rd'] = line.split('rd ').last.strip if line.include?(' rd ')
23
+ if line.include?('auto-discovery')
24
+ mode = line.split('auto-discovery ').last.strip
25
+ doc['auto-discovery'] = mode
26
+ end
27
+ if line.include?('route-target')
28
+ direction = 'export' if line.include?('export')
29
+ direction = 'import' if line.include?('import')
30
+ words = line.split('route-target ').last.split(' ')
31
+ target = words.select{|w|!w.include?('route-target') && !w.include?('port') && !w.strip.empty?}.map{|w|w.strip}
32
+ if mode
33
+ doc[mode] ||= {}
34
+ doc[mode]['route-target'] ||= {}
35
+ doc[mode]['route-target'][direction] ||= []
36
+ doc[mode]['route-target'][direction] += target
37
+ else
38
+ doc['route-target'] ||= {}
39
+ doc['route-target'][direction] ||= []
40
+ doc['route-target'][direction] += target
41
+ end
42
+ end
43
+ if line.include?('srv6 locator')
44
+ locator = line.split('srv6 locator').last.strip
45
+ if mode
46
+ doc[mode]['srv6-locator'] = locator
47
+ else
48
+ doc['srv6-locator'] = locator
49
+ end
50
+ end
51
+ end
52
+ return doc
53
+ end
54
+
55
+ def vpls_if conf
56
+ doc = {}
57
+ access_points = TextAbstract.match_paragraph(conf, "\n access-point ", "\n $").map{|t|" access-point "+t+"\n $"}
58
+ doc['vpn-name'] = conf.split("\n").first.split('vpls ').last.split(' ').first.strip
59
+ access_points.each do|access_point|
60
+ doc['access-point'] ||= {}
61
+ port = nil
62
+ access_point.split("\n").each do|line|
63
+ port = line.split('access-point').last.strip if line.include?('access-point ')
64
+ if port
65
+ doc['access-point'][port] ||= {}
66
+ doc['access-point'][port]['access-params'] ||= [line.split('access-params').last.strip] if line.include?('access-params')
67
+ (doc['access-point'][port]['access-params'] ||= [])<< 'leaf' if line.include?('leaf')
68
+ end
69
+ end
70
+ end
71
+ return doc
72
+ end
73
+ end
74
+ ```
@@ -0,0 +1,74 @@
1
+ # ZXCTN9000-8EA VPN
2
+
3
+ ```ruby
4
+ @sign << ['ZXCTN9000-8EA', 'l2vpn']
5
+ @sign << ['ZXCTN9000-8EA', 'vpls']
6
+ @sign << ['ZXCTN9000-8EA', 'vpls_if']
7
+
8
+ module ZXCTN9000_8EA
9
+ module_function
10
+
11
+ def l2vpn conf
12
+ content = (conf['l2vpn'] || "")
13
+ instances = TextAbstract.match_paragraph(content, "\nvpls ", "\n$").map{|t|"vpls "+t+"\n$"}
14
+ return instances
15
+ end
16
+
17
+ def vpls conf
18
+ doc = {};mode = nil
19
+ conf.split("\n").each do|line|
20
+ doc['vpn-name'] = line.split('vpls ').last.split(' ').first.strip if line.include?('vpls ')
21
+ doc['mode'] = line.include?('vpls ') && line.include?('evpn') ? 'vpls-evpn' : 'vpls'
22
+ doc['rd'] = line.split('rd ').last.strip if line.include?(' rd ')
23
+ if line.include?('auto-discovery')
24
+ mode = line.split('auto-discovery ').last.strip
25
+ doc['auto-discovery'] = mode
26
+ end
27
+ if line.include?('route-target')
28
+ direction = 'export' if line.include?('export')
29
+ direction = 'import' if line.include?('import')
30
+ words = line.split('route-target ').last.split(' ')
31
+ target = words.select{|w|!w.include?('route-target') && !w.include?('port') && !w.strip.empty?}.map{|w|w.strip}
32
+ if mode
33
+ doc[mode] ||= {}
34
+ doc[mode]['route-target'] ||= {}
35
+ doc[mode]['route-target'][direction] ||= []
36
+ doc[mode]['route-target'][direction] += target
37
+ else
38
+ doc['route-target'] ||= {}
39
+ doc['route-target'][direction] ||= []
40
+ doc['route-target'][direction] += target
41
+ end
42
+ end
43
+ if line.include?('srv6 locator')
44
+ locator = line.split('srv6 locator').last.strip
45
+ if mode
46
+ doc[mode]['srv6-locator'] = locator
47
+ else
48
+ doc['srv6-locator'] = locator
49
+ end
50
+ end
51
+ end
52
+ return doc
53
+ end
54
+
55
+ def vpls_if conf
56
+ doc = {}
57
+ access_points = TextAbstract.match_paragraph(conf, "\n access-point ", "\n $").map{|t|" access-point "+t+"\n $"}
58
+ doc['vpn-name'] = conf.split("\n").first.split('vpls ').last.split(' ').first.strip
59
+ access_points.each do|access_point|
60
+ doc['access-point'] ||= {}
61
+ port = nil
62
+ access_point.split("\n").each do|line|
63
+ port = line.split('access-point').last.strip if line.include?('access-point ')
64
+ if port
65
+ doc['access-point'][port] ||= {}
66
+ doc['access-point'][port]['access-params'] ||= [line.split('access-params').last.strip] if line.include?('access-params')
67
+ (doc['access-point'][port]['access-params'] ||= [])<< 'leaf' if line.include?('leaf')
68
+ end
69
+ end
70
+ end
71
+ return doc
72
+ end
73
+ end
74
+ ```
data/network.rb CHANGED
@@ -22,5 +22,5 @@
22
22
  ].each{|mod|require mod}
23
23
 
24
24
  module Network
25
- VERSION = '1.1.41'
25
+ VERSION = '1.1.43'
26
26
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: network-utility
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.41
4
+ version: 1.1.43
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt
@@ -63,6 +63,7 @@ files:
63
63
  - document/acl-NE5000E-X16.md
64
64
  - document/acl-NE5000E-X16A.md
65
65
  - document/acl-NE80E.md
66
+ - document/acl-T8000-18.md
66
67
  - document/bgp-CR16010H-F.md
67
68
  - document/bgp-CR16018-F.md
68
69
  - document/bgp-CR19000-20.md
@@ -83,6 +84,10 @@ files:
83
84
  - document/bgp-NE80E.md
84
85
  - document/config.md
85
86
  - document/document.rb
87
+ - document/flexe-CX600-X16A.md
88
+ - document/flexe-CX600-X8A.md
89
+ - document/flexe-NE8000E-X8.md
90
+ - document/flexe-NE8100-X8.md
86
91
  - document/if-ALCATEL7750.md
87
92
  - document/if-C7609.md
88
93
  - document/if-CR16010H-F.md
@@ -114,6 +119,11 @@ files:
114
119
  - document/if-VNE9000.md
115
120
  - document/if-ZXCTN9000-18EA.md
116
121
  - document/if-ZXCTN9000-8EA.md
122
+ - document/isis-CX600-X16A.md
123
+ - document/isis-CX600-X8A.md
124
+ - document/isis-NE40E-X16A.md
125
+ - document/isis-NE8000E-X8.md
126
+ - document/isis-NE8100-X8.md
117
127
  - document/lic-M6000-16E.md
118
128
  - document/lic-M6000-18S.md
119
129
  - document/lic-M6000-8.md
@@ -149,6 +159,8 @@ files:
149
159
  - document/nat-ME60-X16.md
150
160
  - document/nat-NE40E-X16.md
151
161
  - document/nat-NE40E-X16A.md
162
+ - document/policy-CX600-X16A.md
163
+ - document/policy-CX600-X8A.md
152
164
  - document/policy-M6000-16E.md
153
165
  - document/policy-M6000-18S.md
154
166
  - document/policy-M6000-8.md
@@ -163,7 +175,10 @@ files:
163
175
  - document/policy-NE5000E-20.md
164
176
  - document/policy-NE5000E-X16.md
165
177
  - document/policy-NE5000E-X16A.md
178
+ - document/policy-NE8000E-X8.md
166
179
  - document/policy-NE80E.md
180
+ - document/policy-NE8100-X8.md
181
+ - document/policy-VNE9000.md
167
182
  - document/pool-M6000-16E.md
168
183
  - document/pool-M6000-18S.md
169
184
  - document/pool-M6000-8.md
@@ -201,6 +216,10 @@ files:
201
216
  - document/static-T8000-18.md
202
217
  - document/static-ZXCTN9000-18EA.md
203
218
  - document/static-ZXCTN9000-8EA.md
219
+ - document/statistics-M6000-16E.md
220
+ - document/statistics-M6000-18S.md
221
+ - document/statistics-M6000-8.md
222
+ - document/statistics-M6000-8E.md
204
223
  - document/system-M6000-16E.md
205
224
  - document/system-M6000-18S.md
206
225
  - document/system-M6000-8.md
@@ -217,6 +236,10 @@ files:
217
236
  - document/system-NE5000E-X16A.md
218
237
  - document/system-NE80E.md
219
238
  - document/telnet.md
239
+ - document/vpn-CX600-X16A.md
240
+ - document/vpn-CX600-X8A.md
241
+ - document/vpn-ZXCTN9000-18EA.md
242
+ - document/vpn-ZXCTN9000-8EA.md
220
243
  - network.rb
221
244
  - support/snmp.rb
222
245
  - utility/ipv4_address.rb