network-utility 1.1.41 → 1.1.42
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 +4 -4
- data/document/acl-T8000-18.md +26 -0
- data/document/flexe-CX600-X16A.md +74 -0
- data/document/flexe-CX600-X8A.md +73 -0
- data/document/flexe-NE8000E-X8.md +73 -0
- data/document/flexe-NE8100-X8.md +74 -0
- data/document/isis-CX600-X16A.md +140 -0
- data/document/isis-CX600-X8A.md +141 -0
- data/document/isis-NE40E-X16A.md +141 -0
- data/document/isis-NE8000E-X8.md +140 -0
- data/document/isis-NE8100-X8.md +140 -0
- data/document/policy-CX600-X16A.md +87 -0
- data/document/policy-CX600-X8A.md +87 -0
- data/document/policy-NE8000E-X8.md +87 -0
- data/document/policy-NE8100-X8.md +87 -0
- data/document/policy-VNE9000.md +87 -0
- data/document/statistics-M6000-16E.md +56 -0
- data/document/statistics-M6000-18S.md +147 -0
- data/document/statistics-M6000-8.md +56 -0
- data/document/statistics-M6000-8E.md +56 -0
- data/document/vpn-CX600-X16A.md +78 -0
- data/document/vpn-CX600-X8A.md +79 -0
- data/document/vpn-ZXCTN9000-18EA.md +74 -0
- data/document/vpn-ZXCTN9000-8EA.md +74 -0
- data/network.rb +1 -1
- metadata +24 -1
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
|
|
2
|
+
# NE40E-X16A isis
|
|
3
|
+
|
|
4
|
+
```ruby
|
|
5
|
+
@sign << ['NE40E-X16A', '接口isis']
|
|
6
|
+
@sign << ['NE40E-X16A', 'isis']
|
|
7
|
+
|
|
8
|
+
module NE40E_X16A
|
|
9
|
+
module_function
|
|
10
|
+
|
|
11
|
+
def 接口isis 接口配置
|
|
12
|
+
isis = {}
|
|
13
|
+
port_name = self.端口识别(接口配置.split("\n").first.to_s).join()
|
|
14
|
+
lines = 接口配置.split("\n").select{|line|line.strip[0..4]=='isis '}
|
|
15
|
+
lines.each do|line|
|
|
16
|
+
isis['pid'] = line.strip.split(' ').last.to_i if line.include?('isis enable')
|
|
17
|
+
isis['ipv6-pid'] = line.strip.split(' ').last.to_i if line.include?('isis ipv6 enable')
|
|
18
|
+
isis['circuit-type'] = line.split('circuit-type').last.strip if line.include?('isis circuit-type')
|
|
19
|
+
isis['cost'] = line.strip.split(' ').last.to_i if line.include?('isis cost')
|
|
20
|
+
isis['ipv6-cost'] = line.strip.split(' ').last.to_i if line.include?('isis ipv6 cost')
|
|
21
|
+
if line.include?('isis ldp-sync')
|
|
22
|
+
isis['ldp-sync'] ||= {}
|
|
23
|
+
isis['ldp-sync']['state'] = 'enable'
|
|
24
|
+
isis['ldp-sync']['hold-max-cost-timer'] = line.strip.split(' ').last+'s' if line.include?('isis timer ldp-sync')
|
|
25
|
+
end
|
|
26
|
+
isis['hold-max-cost-timer'] = line.strip.split(' ').last+'ms' if line.include?('isis peer hold-max-cost')
|
|
27
|
+
end
|
|
28
|
+
return { port_name => isis }
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def isis isis配置
|
|
32
|
+
isis = {};frr4_flag, frr6_flag = false, false
|
|
33
|
+
isis配置.split("\n").each do|line|
|
|
34
|
+
isis['pid'] = line.split(' ').last.strip if line[0..4]=='isis '
|
|
35
|
+
isis['level'] = line.split(' ').last.strip if line.include?('is-level')
|
|
36
|
+
isis['cost-style'] = line.split(' ').last.strip if line.include?('cost-style')
|
|
37
|
+
if line.include?('timer lsp-generation')
|
|
38
|
+
isis['lsp-generation-timer'] ||= {}
|
|
39
|
+
setter = line.split('lsp-generation').last.strip.split(' ')
|
|
40
|
+
setlevels = []
|
|
41
|
+
setlevels = ['level-1'] if setter[-1]=='level-1'
|
|
42
|
+
setlevels = ['level-2'] if setter[-1]=='level-2'
|
|
43
|
+
setlevels = ['level-1', 'level-2']
|
|
44
|
+
setlevels.each do|setlevel|
|
|
45
|
+
isis['lsp-generation-timer']['max-interval'] = setter[0]+'s'
|
|
46
|
+
isis['lsp-generation-timer']['init-interval'] = setter[1]+'ms' if setter[1] && !setter[1].include?('level')
|
|
47
|
+
isis['lsp-generation-timer']['incr-interval'] = setter[2]+'ms' if setter[2] && !setter[2].include?('level')
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
if line.include?('bfd all-interfaces') && line.strip[0..2]=='bfd'
|
|
51
|
+
isis['bfd'] ||= {}
|
|
52
|
+
isis['bfd']['interface'] = 'enable' if line.include?('enable')
|
|
53
|
+
words = line.split(' ')
|
|
54
|
+
isis['bfd']['min-tx-interval'] = words[words.index('min-tx-interval')+1] + 'ms' if words.index('min-tx-interval')
|
|
55
|
+
isis['bfd']['min-rx-interval'] = words[words.index('min-rx-interval')+1] + 'ms' if words.index('min-rx-interval')
|
|
56
|
+
isis['bfd']['detect-multiplier'] = words[words.index('detect-multiplier')+1].to_i if words.index('detect-multiplier')
|
|
57
|
+
isis['bfd']['tos-exp'] = words[words.index('tos-exp')+1].to_i if words.index('tos-exp')
|
|
58
|
+
isis['bfd']['frr-binding'] = 'enable' if line.include?('frr-binding')
|
|
59
|
+
end
|
|
60
|
+
if line.include?('ipv6 bfd all-interfaces')
|
|
61
|
+
isis['ipv6-bfd'] ||= {}
|
|
62
|
+
isis['ipv6-bfd']['interface'] = 'enable' if line.include?('enable')
|
|
63
|
+
words = line.split(' ')
|
|
64
|
+
isis['ipv6-bfd']['min-tx-interval'] = words[words.index('min-tx-interval')+1] + 'ms' if words.index('min-tx-interval')
|
|
65
|
+
isis['ipv6-bfd']['min-rx-interval'] = words[words.index('min-rx-interval')+1] + 'ms' if words.index('min-rx-interval')
|
|
66
|
+
isis['ipv6-bfd']['detect-multiplier'] = words[words.index('detect-multiplier')+1].to_i if words.index('detect-multiplier')
|
|
67
|
+
isis['ipv6-bfd']['frr-binding'] = 'enable' if line.include?('frr-binding')
|
|
68
|
+
end
|
|
69
|
+
isis['net'] = line.split(' ').last if line.include?('network-entity')
|
|
70
|
+
isis['is-name'] = line.split(' ').last if line.include?('is-name')
|
|
71
|
+
if line.include?('avoid-microloop') && line.strip[0..4]=='avoid'
|
|
72
|
+
isis['avoid-microloop'] ||= {}
|
|
73
|
+
isis['avoid-microloop']['frr-protected'] ||= {'rib-update-delay'=>'100ms'} if line.include?('frr-protected')
|
|
74
|
+
isis['avoid-microloop']['frr-protected']['rib-update-delay'] = line.split(' ').last+'ms' if line.include?('frr-protected') && line.include?('rib-update-delay')
|
|
75
|
+
isis['avoid-microloop']['te-tunnel'] ||= {'rib-update-delay'=>'1000ms'} if line.include?('te-tunnel')
|
|
76
|
+
isis['avoid-microloop']['te-tunnel']['rib-update-delay'] = line.split(' ').last+'ms' if line.include?('te-tunnel') && line.include?('rib-update-delay')
|
|
77
|
+
end
|
|
78
|
+
if line.include?('ipv6 avoid-microloop')
|
|
79
|
+
isis['ipv6-avoid-microloop'] ||= {}
|
|
80
|
+
isis['ipv6-avoid-microloop']['segment-routing'] ||= {'rib-update-delay'=>'5000ms'} if line.include?('segment-routing')
|
|
81
|
+
isis['ipv6-avoid-microloop']['segment-routing']['rib-update-delay'] = line.split(' ').last+'ms' if line.include?('segment-routing') && line.include?('rib-update-delay')
|
|
82
|
+
end
|
|
83
|
+
isis['preference'] = line.split(' ').last.to_i if line.strip[0..10]=='preference '
|
|
84
|
+
isis['ipv6-preference'] = line.split(' ').last.to_i if line.include?('ipv6 preference ')
|
|
85
|
+
if line.include?('timer spf')
|
|
86
|
+
setter = line.split('timer spf').last.strip.split(' ')
|
|
87
|
+
isis['spf-timer'] ||= {}
|
|
88
|
+
isis['spf-timer']['max-interval'] = setter[0]+'s'
|
|
89
|
+
isis['spf-timer']['init-interval'] = setter[1]+'ms' if setter[1]
|
|
90
|
+
isis['spf-timer']['incr-interval'] = setter[2]+'ms' if setter[2]
|
|
91
|
+
end
|
|
92
|
+
if line.include?('set-overload')
|
|
93
|
+
isis['set-overload'] ||= {}
|
|
94
|
+
isis['set-overload']['allow'] = 'interlevel' if line.include?('allow interlevel')
|
|
95
|
+
isis['set-overload']['allow'] = 'external' if line.include?('allow external')
|
|
96
|
+
isis['set-overload']['on-startup'] ||= {} if line.include?('on-startup')
|
|
97
|
+
words = line.strip.split(' ')
|
|
98
|
+
if line.include?('on-startup') && words[words.index('on-startup')+1].to_s.match(/^\d+$/)
|
|
99
|
+
isis['set-overload']['on-startup']['timeout'] = words[words.index('on-startup')+1]+'s'
|
|
100
|
+
else
|
|
101
|
+
# isis['set-overload']['on-startup']['timeout'] = '600s'
|
|
102
|
+
if line.include?('send-sa-bit') && words[words.index('send-sa-bit')+1].match(/^\d+$/)
|
|
103
|
+
isis['set-overload']['on-startup']['send-sa-bit'] = words[words.index('send-sa-bit')+1]+'s'
|
|
104
|
+
else
|
|
105
|
+
# isis['set-overload']['on-startup']['send-sa-bit'] = '30s'
|
|
106
|
+
end
|
|
107
|
+
# TODO: start-from-nbr | wait-for-bgp | route-delay-distribute
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
(isis['frr'] = {}; frr4_flag = true) if line.strip=='frr'
|
|
111
|
+
isis['frr']['loop-free-alternate'] = line.split(' ').last if line.include?('loop-free-alternate ') && frr4_flag
|
|
112
|
+
isis['frr']['ti-lfa'] = line.split(' ').last if line.include?('ti-lfa ') && frr4_flag
|
|
113
|
+
(frr4_flag = false) if frr4_flag && line==' #'
|
|
114
|
+
(isis['ipv6-frr'] = {}; frr6_flag = true) if line.include?('ipv6 frr')
|
|
115
|
+
isis['ipv6-frr']['loop-free-alternate'] = line.split(' ').last if line.include?('loop-free-alternate ') && frr6_flag
|
|
116
|
+
isis['ipv6-frr']['ti-lfa'] = line.split(' ').last if line.include?('ti-lfa ') && frr6_flag
|
|
117
|
+
(frr6_flag = false) if frr6_flag && line==' #'
|
|
118
|
+
isis['topology'] = line.split('topology ').last.strip if line.include?('ipv6 enable topology ')
|
|
119
|
+
isis['ipv6-advertise'] = 'link-attributes' if line.include?('ipv6 advertise link attributes')
|
|
120
|
+
isis['ipv6-traffic-eng'] = line.split(' ').last if line.include?('ipv6 traffic-eng')
|
|
121
|
+
if line.include?('ipv6 metric-delay')
|
|
122
|
+
isis['ipv6-metric-delay'] ||= {}
|
|
123
|
+
isis['ipv6-metric-delay']['advertisement'] = line.split(' ').last if line.include?('advertisement enable')
|
|
124
|
+
if line.include?('suppress')
|
|
125
|
+
words = line.split(' ')
|
|
126
|
+
isis['ipv6-metric-delay']['suppress'] ||= {}
|
|
127
|
+
isis['ipv6-metric-delay']['suppress']['timer'] = words[words.index('timer')+1]+'s' if words.index('timer')
|
|
128
|
+
isis['ipv6-metric-delay']['suppress']['percent-threshold'] = words[words.index('percent-threshold')+1]+'%' if words.index('percent-threshold')
|
|
129
|
+
isis['ipv6-metric-delay']['suppress']['absolute-threshold'] = words[words.index('absolute-threshold')+1]+'ms' if words.index('absolute-threshold')
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
if line.include?('segment-routing ipv6 locator')
|
|
133
|
+
isis['srv6-locator'] ||= {}
|
|
134
|
+
isis['srv6-locator']['name'] = line.split('locator').last.strip.split(' ').first
|
|
135
|
+
isis['srv6-locator']['auto-sid-disable'] = true if line.split('locator').last.strip.split(' ')[1]
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
return isis
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
```
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# NE8000E-X8 isis
|
|
2
|
+
|
|
3
|
+
```ruby
|
|
4
|
+
@sign << ['NE8000E-X8', '接口isis']
|
|
5
|
+
@sign << ['NE8000E-X8', 'isis']
|
|
6
|
+
|
|
7
|
+
module NE8000E_X8
|
|
8
|
+
module_function
|
|
9
|
+
|
|
10
|
+
def 接口isis 接口配置
|
|
11
|
+
isis = {}
|
|
12
|
+
port_name = self.端口识别(接口配置.split("\n").first.to_s).join()
|
|
13
|
+
lines = 接口配置.split("\n").select{|line|line.strip[0..4]=='isis '}
|
|
14
|
+
lines.each do|line|
|
|
15
|
+
isis['pid'] = line.strip.split(' ').last.to_i if line.include?('isis enable')
|
|
16
|
+
isis['ipv6-pid'] = line.strip.split(' ').last.to_i if line.include?('isis ipv6 enable')
|
|
17
|
+
isis['circuit-type'] = line.split('circuit-type').last.strip if line.include?('isis circuit-type')
|
|
18
|
+
isis['cost'] = line.strip.split(' ').last.to_i if line.include?('isis cost')
|
|
19
|
+
isis['ipv6-cost'] = line.strip.split(' ').last.to_i if line.include?('isis ipv6 cost')
|
|
20
|
+
if line.include?('isis ldp-sync')
|
|
21
|
+
isis['ldp-sync'] ||= {}
|
|
22
|
+
isis['ldp-sync']['state'] = 'enable'
|
|
23
|
+
isis['ldp-sync']['hold-max-cost-timer'] = line.strip.split(' ').last+'s' if line.include?('isis timer ldp-sync')
|
|
24
|
+
end
|
|
25
|
+
isis['hold-max-cost-timer'] = line.strip.split(' ').last+'ms' if line.include?('isis peer hold-max-cost')
|
|
26
|
+
end
|
|
27
|
+
return { port_name => isis }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def isis isis配置
|
|
31
|
+
isis = {};frr4_flag, frr6_flag = false, false
|
|
32
|
+
isis配置.split("\n").each do|line|
|
|
33
|
+
isis['pid'] = line.split(' ').last.strip if line[0..4]=='isis '
|
|
34
|
+
isis['level'] = line.split(' ').last.strip if line.include?('is-level')
|
|
35
|
+
isis['cost-style'] = line.split(' ').last.strip if line.include?('cost-style')
|
|
36
|
+
if line.include?('timer lsp-generation')
|
|
37
|
+
isis['lsp-generation-timer'] ||= {}
|
|
38
|
+
setter = line.split('lsp-generation').last.strip.split(' ')
|
|
39
|
+
setlevels = []
|
|
40
|
+
setlevels = ['level-1'] if setter[-1]=='level-1'
|
|
41
|
+
setlevels = ['level-2'] if setter[-1]=='level-2'
|
|
42
|
+
setlevels = ['level-1', 'level-2']
|
|
43
|
+
setlevels.each do|setlevel|
|
|
44
|
+
isis['lsp-generation-timer']['max-interval'] = setter[0]+'s'
|
|
45
|
+
isis['lsp-generation-timer']['init-interval'] = setter[1]+'ms' if setter[1] && !setter[1].include?('level')
|
|
46
|
+
isis['lsp-generation-timer']['incr-interval'] = setter[2]+'ms' if setter[2] && !setter[2].include?('level')
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
if line.include?('bfd all-interfaces') && line.strip[0..2]=='bfd'
|
|
50
|
+
isis['bfd'] ||= {}
|
|
51
|
+
isis['bfd']['interface'] = 'enable' if line.include?('enable')
|
|
52
|
+
words = line.split(' ')
|
|
53
|
+
isis['bfd']['min-tx-interval'] = words[words.index('min-tx-interval')+1] + 'ms' if words.index('min-tx-interval')
|
|
54
|
+
isis['bfd']['min-rx-interval'] = words[words.index('min-rx-interval')+1] + 'ms' if words.index('min-rx-interval')
|
|
55
|
+
isis['bfd']['detect-multiplier'] = words[words.index('detect-multiplier')+1].to_i if words.index('detect-multiplier')
|
|
56
|
+
isis['bfd']['tos-exp'] = words[words.index('tos-exp')+1].to_i if words.index('tos-exp')
|
|
57
|
+
isis['bfd']['frr-binding'] = 'enable' if line.include?('frr-binding')
|
|
58
|
+
end
|
|
59
|
+
if line.include?('ipv6 bfd all-interfaces')
|
|
60
|
+
isis['ipv6-bfd'] ||= {}
|
|
61
|
+
isis['ipv6-bfd']['interface'] = 'enable' if line.include?('enable')
|
|
62
|
+
words = line.split(' ')
|
|
63
|
+
isis['ipv6-bfd']['min-tx-interval'] = words[words.index('min-tx-interval')+1] + 'ms' if words.index('min-tx-interval')
|
|
64
|
+
isis['ipv6-bfd']['min-rx-interval'] = words[words.index('min-rx-interval')+1] + 'ms' if words.index('min-rx-interval')
|
|
65
|
+
isis['ipv6-bfd']['detect-multiplier'] = words[words.index('detect-multiplier')+1].to_i if words.index('detect-multiplier')
|
|
66
|
+
isis['ipv6-bfd']['frr-binding'] = 'enable' if line.include?('frr-binding')
|
|
67
|
+
end
|
|
68
|
+
isis['net'] = line.split(' ').last if line.include?('network-entity')
|
|
69
|
+
isis['is-name'] = line.split(' ').last if line.include?('is-name')
|
|
70
|
+
if line.include?('avoid-microloop') && line.strip[0..4]=='avoid'
|
|
71
|
+
isis['avoid-microloop'] ||= {}
|
|
72
|
+
isis['avoid-microloop']['frr-protected'] ||= {'rib-update-delay'=>'100ms'} if line.include?('frr-protected')
|
|
73
|
+
isis['avoid-microloop']['frr-protected']['rib-update-delay'] = line.split(' ').last+'ms' if line.include?('frr-protected') && line.include?('rib-update-delay')
|
|
74
|
+
isis['avoid-microloop']['te-tunnel'] ||= {'rib-update-delay'=>'1000ms'} if line.include?('te-tunnel')
|
|
75
|
+
isis['avoid-microloop']['te-tunnel']['rib-update-delay'] = line.split(' ').last+'ms' if line.include?('te-tunnel') && line.include?('rib-update-delay')
|
|
76
|
+
end
|
|
77
|
+
if line.include?('ipv6 avoid-microloop')
|
|
78
|
+
isis['ipv6-avoid-microloop'] ||= {}
|
|
79
|
+
isis['ipv6-avoid-microloop']['segment-routing'] ||= {'rib-update-delay'=>'5000ms'} if line.include?('segment-routing')
|
|
80
|
+
isis['ipv6-avoid-microloop']['segment-routing']['rib-update-delay'] = line.split(' ').last+'ms' if line.include?('segment-routing') && line.include?('rib-update-delay')
|
|
81
|
+
end
|
|
82
|
+
isis['preference'] = line.split(' ').last.to_i if line.strip[0..10]=='preference '
|
|
83
|
+
isis['ipv6-preference'] = line.split(' ').last.to_i if line.include?('ipv6 preference ')
|
|
84
|
+
if line.include?('timer spf')
|
|
85
|
+
setter = line.split('timer spf').last.strip.split(' ')
|
|
86
|
+
isis['spf-timer'] ||= {}
|
|
87
|
+
isis['spf-timer']['max-interval'] = setter[0]+'s'
|
|
88
|
+
isis['spf-timer']['init-interval'] = setter[1]+'ms' if setter[1]
|
|
89
|
+
isis['spf-timer']['incr-interval'] = setter[2]+'ms' if setter[2]
|
|
90
|
+
end
|
|
91
|
+
if line.include?('set-overload')
|
|
92
|
+
isis['set-overload'] ||= {}
|
|
93
|
+
isis['set-overload']['allow'] = 'interlevel' if line.include?('allow interlevel')
|
|
94
|
+
isis['set-overload']['allow'] = 'external' if line.include?('allow external')
|
|
95
|
+
isis['set-overload']['on-startup'] ||= {} if line.include?('on-startup')
|
|
96
|
+
words = line.strip.split(' ')
|
|
97
|
+
if line.include?('on-startup') && words[words.index('on-startup')+1].to_s.match(/^\d+$/)
|
|
98
|
+
isis['set-overload']['on-startup']['timeout'] = words[words.index('on-startup')+1]+'s'
|
|
99
|
+
else
|
|
100
|
+
# isis['set-overload']['on-startup']['timeout'] = '600s'
|
|
101
|
+
if line.include?('send-sa-bit') && words[words.index('send-sa-bit')+1].match(/^\d+$/)
|
|
102
|
+
isis['set-overload']['on-startup']['send-sa-bit'] = words[words.index('send-sa-bit')+1]+'s'
|
|
103
|
+
else
|
|
104
|
+
# isis['set-overload']['on-startup']['send-sa-bit'] = '30s'
|
|
105
|
+
end
|
|
106
|
+
# TODO: start-from-nbr | wait-for-bgp | route-delay-distribute
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
(isis['frr'] = {}; frr4_flag = true) if line.strip=='frr'
|
|
110
|
+
isis['frr']['loop-free-alternate'] = line.split(' ').last if line.include?('loop-free-alternate ') && frr4_flag
|
|
111
|
+
isis['frr']['ti-lfa'] = line.split(' ').last if line.include?('ti-lfa ') && frr4_flag
|
|
112
|
+
(frr4_flag = false) if frr4_flag && line==' #'
|
|
113
|
+
(isis['ipv6-frr'] = {}; frr6_flag = true) if line.include?('ipv6 frr')
|
|
114
|
+
isis['ipv6-frr']['loop-free-alternate'] = line.split(' ').last if line.include?('loop-free-alternate ') && frr6_flag
|
|
115
|
+
isis['ipv6-frr']['ti-lfa'] = line.split(' ').last if line.include?('ti-lfa ') && frr6_flag
|
|
116
|
+
(frr6_flag = false) if frr6_flag && line==' #'
|
|
117
|
+
isis['topology'] = line.split('topology ').last.strip if line.include?('ipv6 enable topology ')
|
|
118
|
+
isis['ipv6-advertise'] = 'link-attributes' if line.include?('ipv6 advertise link attributes')
|
|
119
|
+
isis['ipv6-traffic-eng'] = line.split(' ').last if line.include?('ipv6 traffic-eng')
|
|
120
|
+
if line.include?('ipv6 metric-delay')
|
|
121
|
+
isis['ipv6-metric-delay'] ||= {}
|
|
122
|
+
isis['ipv6-metric-delay']['advertisement'] = line.split(' ').last if line.include?('advertisement enable')
|
|
123
|
+
if line.include?('suppress')
|
|
124
|
+
words = line.split(' ')
|
|
125
|
+
isis['ipv6-metric-delay']['suppress'] ||= {}
|
|
126
|
+
isis['ipv6-metric-delay']['suppress']['timer'] = words[words.index('timer')+1]+'s' if words.index('timer')
|
|
127
|
+
isis['ipv6-metric-delay']['suppress']['percent-threshold'] = words[words.index('percent-threshold')+1]+'%' if words.index('percent-threshold')
|
|
128
|
+
isis['ipv6-metric-delay']['suppress']['absolute-threshold'] = words[words.index('absolute-threshold')+1]+'ms' if words.index('absolute-threshold')
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
if line.include?('segment-routing ipv6 locator')
|
|
132
|
+
isis['srv6-locator'] ||= {}
|
|
133
|
+
isis['srv6-locator']['name'] = line.split('locator').last.strip.split(' ').first
|
|
134
|
+
isis['srv6-locator']['auto-sid-disable'] = true if line.split('locator').last.strip.split(' ')[1]
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
return isis
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
```
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# NE8100-X8 isis
|
|
2
|
+
|
|
3
|
+
```ruby
|
|
4
|
+
@sign << ['NE8100-X8', '接口isis']
|
|
5
|
+
@sign << ['NE8100-X8', 'isis']
|
|
6
|
+
|
|
7
|
+
module NE8100_X8
|
|
8
|
+
module_function
|
|
9
|
+
|
|
10
|
+
def 接口isis 接口配置
|
|
11
|
+
isis = {}
|
|
12
|
+
port_name = self.端口识别(接口配置.split("\n").first.to_s).join()
|
|
13
|
+
lines = 接口配置.split("\n").select{|line|line.strip[0..4]=='isis '}
|
|
14
|
+
lines.each do|line|
|
|
15
|
+
isis['pid'] = line.strip.split(' ').last.to_i if line.include?('isis enable')
|
|
16
|
+
isis['ipv6-pid'] = line.strip.split(' ').last.to_i if line.include?('isis ipv6 enable')
|
|
17
|
+
isis['circuit-type'] = line.split('circuit-type').last.strip if line.include?('isis circuit-type')
|
|
18
|
+
isis['cost'] = line.strip.split(' ').last.to_i if line.include?('isis cost')
|
|
19
|
+
isis['ipv6-cost'] = line.strip.split(' ').last.to_i if line.include?('isis ipv6 cost')
|
|
20
|
+
if line.include?('isis ldp-sync')
|
|
21
|
+
isis['ldp-sync'] ||= {}
|
|
22
|
+
isis['ldp-sync']['state'] = 'enable'
|
|
23
|
+
isis['ldp-sync']['hold-max-cost-timer'] = line.strip.split(' ').last+'s' if line.include?('isis timer ldp-sync')
|
|
24
|
+
end
|
|
25
|
+
isis['hold-max-cost-timer'] = line.strip.split(' ').last+'ms' if line.include?('isis peer hold-max-cost')
|
|
26
|
+
end
|
|
27
|
+
return { port_name => isis }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def isis isis配置
|
|
31
|
+
isis = {};frr4_flag, frr6_flag = false, false
|
|
32
|
+
isis配置.split("\n").each do|line|
|
|
33
|
+
isis['pid'] = line.split(' ').last.strip if line[0..4]=='isis '
|
|
34
|
+
isis['level'] = line.split(' ').last.strip if line.include?('is-level')
|
|
35
|
+
isis['cost-style'] = line.split(' ').last.strip if line.include?('cost-style')
|
|
36
|
+
if line.include?('timer lsp-generation')
|
|
37
|
+
isis['lsp-generation-timer'] ||= {}
|
|
38
|
+
setter = line.split('lsp-generation').last.strip.split(' ')
|
|
39
|
+
setlevels = []
|
|
40
|
+
setlevels = ['level-1'] if setter[-1]=='level-1'
|
|
41
|
+
setlevels = ['level-2'] if setter[-1]=='level-2'
|
|
42
|
+
setlevels = ['level-1', 'level-2']
|
|
43
|
+
setlevels.each do|setlevel|
|
|
44
|
+
isis['lsp-generation-timer']['max-interval'] = setter[0]+'s'
|
|
45
|
+
isis['lsp-generation-timer']['init-interval'] = setter[1]+'ms' if setter[1] && !setter[1].include?('level')
|
|
46
|
+
isis['lsp-generation-timer']['incr-interval'] = setter[2]+'ms' if setter[2] && !setter[2].include?('level')
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
if line.include?('bfd all-interfaces') && line.strip[0..2]=='bfd'
|
|
50
|
+
isis['bfd'] ||= {}
|
|
51
|
+
isis['bfd']['interface'] = 'enable' if line.include?('enable')
|
|
52
|
+
words = line.split(' ')
|
|
53
|
+
isis['bfd']['min-tx-interval'] = words[words.index('min-tx-interval')+1] + 'ms' if words.index('min-tx-interval')
|
|
54
|
+
isis['bfd']['min-rx-interval'] = words[words.index('min-rx-interval')+1] + 'ms' if words.index('min-rx-interval')
|
|
55
|
+
isis['bfd']['detect-multiplier'] = words[words.index('detect-multiplier')+1].to_i if words.index('detect-multiplier')
|
|
56
|
+
isis['bfd']['tos-exp'] = words[words.index('tos-exp')+1].to_i if words.index('tos-exp')
|
|
57
|
+
isis['bfd']['frr-binding'] = 'enable' if line.include?('frr-binding')
|
|
58
|
+
end
|
|
59
|
+
if line.include?('ipv6 bfd all-interfaces')
|
|
60
|
+
isis['ipv6-bfd'] ||= {}
|
|
61
|
+
isis['ipv6-bfd']['interface'] = 'enable' if line.include?('enable')
|
|
62
|
+
words = line.split(' ')
|
|
63
|
+
isis['ipv6-bfd']['min-tx-interval'] = words[words.index('min-tx-interval')+1] + 'ms' if words.index('min-tx-interval')
|
|
64
|
+
isis['ipv6-bfd']['min-rx-interval'] = words[words.index('min-rx-interval')+1] + 'ms' if words.index('min-rx-interval')
|
|
65
|
+
isis['ipv6-bfd']['detect-multiplier'] = words[words.index('detect-multiplier')+1].to_i if words.index('detect-multiplier')
|
|
66
|
+
isis['ipv6-bfd']['frr-binding'] = 'enable' if line.include?('frr-binding')
|
|
67
|
+
end
|
|
68
|
+
isis['net'] = line.split(' ').last if line.include?('network-entity')
|
|
69
|
+
isis['is-name'] = line.split(' ').last if line.include?('is-name')
|
|
70
|
+
if line.include?('avoid-microloop') && line.strip[0..4]=='avoid'
|
|
71
|
+
isis['avoid-microloop'] ||= {}
|
|
72
|
+
isis['avoid-microloop']['frr-protected'] ||= {'rib-update-delay'=>'100ms'} if line.include?('frr-protected')
|
|
73
|
+
isis['avoid-microloop']['frr-protected']['rib-update-delay'] = line.split(' ').last+'ms' if line.include?('frr-protected') && line.include?('rib-update-delay')
|
|
74
|
+
isis['avoid-microloop']['te-tunnel'] ||= {'rib-update-delay'=>'1000ms'} if line.include?('te-tunnel')
|
|
75
|
+
isis['avoid-microloop']['te-tunnel']['rib-update-delay'] = line.split(' ').last+'ms' if line.include?('te-tunnel') && line.include?('rib-update-delay')
|
|
76
|
+
end
|
|
77
|
+
if line.include?('ipv6 avoid-microloop')
|
|
78
|
+
isis['ipv6-avoid-microloop'] ||= {}
|
|
79
|
+
isis['ipv6-avoid-microloop']['segment-routing'] ||= {'rib-update-delay'=>'5000ms'} if line.include?('segment-routing')
|
|
80
|
+
isis['ipv6-avoid-microloop']['segment-routing']['rib-update-delay'] = line.split(' ').last+'ms' if line.include?('segment-routing') && line.include?('rib-update-delay')
|
|
81
|
+
end
|
|
82
|
+
isis['preference'] = line.split(' ').last.to_i if line.strip[0..10]=='preference '
|
|
83
|
+
isis['ipv6-preference'] = line.split(' ').last.to_i if line.include?('ipv6 preference ')
|
|
84
|
+
if line.include?('timer spf')
|
|
85
|
+
setter = line.split('timer spf').last.strip.split(' ')
|
|
86
|
+
isis['spf-timer'] ||= {}
|
|
87
|
+
isis['spf-timer']['max-interval'] = setter[0]+'s'
|
|
88
|
+
isis['spf-timer']['init-interval'] = setter[1]+'ms' if setter[1]
|
|
89
|
+
isis['spf-timer']['incr-interval'] = setter[2]+'ms' if setter[2]
|
|
90
|
+
end
|
|
91
|
+
if line.include?('set-overload')
|
|
92
|
+
isis['set-overload'] ||= {}
|
|
93
|
+
isis['set-overload']['allow'] = 'interlevel' if line.include?('allow interlevel')
|
|
94
|
+
isis['set-overload']['allow'] = 'external' if line.include?('allow external')
|
|
95
|
+
isis['set-overload']['on-startup'] ||= {} if line.include?('on-startup')
|
|
96
|
+
words = line.strip.split(' ')
|
|
97
|
+
if line.include?('on-startup') && words[words.index('on-startup')+1].to_s.match(/^\d+$/)
|
|
98
|
+
isis['set-overload']['on-startup']['timeout'] = words[words.index('on-startup')+1]+'s'
|
|
99
|
+
else
|
|
100
|
+
# isis['set-overload']['on-startup']['timeout'] = '600s'
|
|
101
|
+
if line.include?('send-sa-bit') && words[words.index('send-sa-bit')+1].match(/^\d+$/)
|
|
102
|
+
isis['set-overload']['on-startup']['send-sa-bit'] = words[words.index('send-sa-bit')+1]+'s'
|
|
103
|
+
else
|
|
104
|
+
# isis['set-overload']['on-startup']['send-sa-bit'] = '30s'
|
|
105
|
+
end
|
|
106
|
+
# TODO: start-from-nbr | wait-for-bgp | route-delay-distribute
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
(isis['frr'] = {}; frr4_flag = true) if line.strip=='frr'
|
|
110
|
+
isis['frr']['loop-free-alternate'] = line.split(' ').last if line.include?('loop-free-alternate ') && frr4_flag
|
|
111
|
+
isis['frr']['ti-lfa'] = line.split(' ').last if line.include?('ti-lfa ') && frr4_flag
|
|
112
|
+
(frr4_flag = false) if frr4_flag && line==' #'
|
|
113
|
+
(isis['ipv6-frr'] = {}; frr6_flag = true) if line.include?('ipv6 frr')
|
|
114
|
+
isis['ipv6-frr']['loop-free-alternate'] = line.split(' ').last if line.include?('loop-free-alternate ') && frr6_flag
|
|
115
|
+
isis['ipv6-frr']['ti-lfa'] = line.split(' ').last if line.include?('ti-lfa ') && frr6_flag
|
|
116
|
+
(frr6_flag = false) if frr6_flag && line==' #'
|
|
117
|
+
isis['topology'] = line.split('topology ').last.strip if line.include?('ipv6 enable topology ')
|
|
118
|
+
isis['ipv6-advertise'] = 'link-attributes' if line.include?('ipv6 advertise link attributes')
|
|
119
|
+
isis['ipv6-traffic-eng'] = line.split(' ').last if line.include?('ipv6 traffic-eng')
|
|
120
|
+
if line.include?('ipv6 metric-delay')
|
|
121
|
+
isis['ipv6-metric-delay'] ||= {}
|
|
122
|
+
isis['ipv6-metric-delay']['advertisement'] = line.split(' ').last if line.include?('advertisement enable')
|
|
123
|
+
if line.include?('suppress')
|
|
124
|
+
words = line.split(' ')
|
|
125
|
+
isis['ipv6-metric-delay']['suppress'] ||= {}
|
|
126
|
+
isis['ipv6-metric-delay']['suppress']['timer'] = words[words.index('timer')+1]+'s' if words.index('timer')
|
|
127
|
+
isis['ipv6-metric-delay']['suppress']['percent-threshold'] = words[words.index('percent-threshold')+1]+'%' if words.index('percent-threshold')
|
|
128
|
+
isis['ipv6-metric-delay']['suppress']['absolute-threshold'] = words[words.index('absolute-threshold')+1]+'ms' if words.index('absolute-threshold')
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
if line.include?('segment-routing ipv6 locator')
|
|
132
|
+
isis['srv6-locator'] ||= {}
|
|
133
|
+
isis['srv6-locator']['name'] = line.split('locator').last.strip.split(' ').first
|
|
134
|
+
isis['srv6-locator']['auto-sid-disable'] = true if line.split('locator').last.strip.split(' ')[1]
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
return isis
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
```
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
|
|
2
|
+
# CX600-X16A 流策略、路由策略
|
|
3
|
+
|
|
4
|
+
```ruby
|
|
5
|
+
@sign << ['CX600-X16A', 'traffic']
|
|
6
|
+
@sign << ['CX600-X16A', 'traffic_classifier']
|
|
7
|
+
@sign << ['CX600-X16A', 'traffic_behavior']
|
|
8
|
+
@sign << ['CX600-X16A', 'traffic_policy']
|
|
9
|
+
|
|
10
|
+
module CX600_X16A
|
|
11
|
+
module_function
|
|
12
|
+
|
|
13
|
+
def traffic conflist
|
|
14
|
+
tc,tb,tp = ['traffic_classifier','traffic_behavior','traffic_policy'].map{|t|self.send(t,conflist)}
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# {name => {classifier => [matchers], operator => opt}, ...}
|
|
18
|
+
def traffic_classifier conflist
|
|
19
|
+
tc = {}
|
|
20
|
+
conflist['traffic'].each do|traffic|
|
|
21
|
+
next unless traffic.include?('classifier')
|
|
22
|
+
name,tab = nil,{'operator'=>''}
|
|
23
|
+
traffic.split("\n").each do|line|
|
|
24
|
+
if line.include?('traffic classifier ')
|
|
25
|
+
tc[name] = tab
|
|
26
|
+
name, opt, op = line.split(' ')[2..4]
|
|
27
|
+
tab = {'operator'=>op}
|
|
28
|
+
else
|
|
29
|
+
matcher = line.split(' ')
|
|
30
|
+
tab['classifier'] ||= []
|
|
31
|
+
tab['classifier'] << matcher # sequences
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
tc[name] = tab # last tc
|
|
35
|
+
tc.delete(nil)
|
|
36
|
+
end if conflist['traffic']
|
|
37
|
+
return tc
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# {name => [behaviors], ...}
|
|
41
|
+
def traffic_behavior conflist
|
|
42
|
+
tb = {}
|
|
43
|
+
conflist['traffic'].each do|traffic|
|
|
44
|
+
next unless traffic.include?('behavior')
|
|
45
|
+
name,tab = nil,{'behavior'=>[]}
|
|
46
|
+
traffic.split("\n").each do|line|
|
|
47
|
+
if line.include?('traffic behavior ')
|
|
48
|
+
tb[name] = tab
|
|
49
|
+
name,tab = line.split(' ')[2],{'behavior'=>[]}
|
|
50
|
+
else
|
|
51
|
+
behavior = line.split(' ')
|
|
52
|
+
tab['behavior'] << behavior # sequences
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
tb[name] = tab # last tb
|
|
56
|
+
tb.delete(nil)
|
|
57
|
+
end if conflist['traffic']
|
|
58
|
+
return tb
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# {name => {policy => {classifier => [behavior,precedence], ...}, mode => mode}, ...}
|
|
62
|
+
def traffic_policy conflist
|
|
63
|
+
tp = {}
|
|
64
|
+
conflist['traffic'].each do|traffic|
|
|
65
|
+
next unless traffic.include?('policy')
|
|
66
|
+
name,tab = nil,{'policy'=>{}}
|
|
67
|
+
traffic.split("\n").each do|line|
|
|
68
|
+
if line.include?('traffic policy ')
|
|
69
|
+
tp[name] = tab
|
|
70
|
+
name,tab = line.split(' ')[2],{'policy'=>{}}
|
|
71
|
+
elsif line.include?('-mode')
|
|
72
|
+
tab['mode'] = 'share-mode'
|
|
73
|
+
elsif line.include?('statistics ')
|
|
74
|
+
tab['statistics'] = line.split(' ')[1]
|
|
75
|
+
else
|
|
76
|
+
policy = line.split(' ')
|
|
77
|
+
classifier, behavior, precedence = policy[1],policy[3],policy[5]
|
|
78
|
+
tab['policy'].merge!({ classifier => (precedence ? [behavior,precedence] : [behavior]) }) # tree
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
tp[name] = tab # last tb
|
|
82
|
+
tp.delete(nil)
|
|
83
|
+
end if conflist['traffic']
|
|
84
|
+
return tp
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
```
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
|
|
2
|
+
# CX600-X8A 流策略、路由策略
|
|
3
|
+
|
|
4
|
+
```ruby
|
|
5
|
+
@sign << ['CX600-X8A', 'traffic']
|
|
6
|
+
@sign << ['CX600-X8A', 'traffic_classifier']
|
|
7
|
+
@sign << ['CX600-X8A', 'traffic_behavior']
|
|
8
|
+
@sign << ['CX600-X8A', 'traffic_policy']
|
|
9
|
+
|
|
10
|
+
module CX600_X8A
|
|
11
|
+
module_function
|
|
12
|
+
|
|
13
|
+
def traffic conflist
|
|
14
|
+
tc,tb,tp = ['traffic_classifier','traffic_behavior','traffic_policy'].map{|t|self.send(t,conflist)}
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# {name => {classifier => [matchers], operator => opt}, ...}
|
|
18
|
+
def traffic_classifier conflist
|
|
19
|
+
tc = {}
|
|
20
|
+
conflist['traffic'].each do|traffic|
|
|
21
|
+
next unless traffic.include?('classifier')
|
|
22
|
+
name,tab = nil,{'operator'=>''}
|
|
23
|
+
traffic.split("\n").each do|line|
|
|
24
|
+
if line.include?('traffic classifier ')
|
|
25
|
+
tc[name] = tab
|
|
26
|
+
name, opt, op = line.split(' ')[2..4]
|
|
27
|
+
tab = {'operator'=>op}
|
|
28
|
+
else
|
|
29
|
+
matcher = line.split(' ')
|
|
30
|
+
tab['classifier'] ||= []
|
|
31
|
+
tab['classifier'] << matcher # sequences
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
tc[name] = tab # last tc
|
|
35
|
+
tc.delete(nil)
|
|
36
|
+
end if conflist['traffic']
|
|
37
|
+
return tc
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# {name => [behaviors], ...}
|
|
41
|
+
def traffic_behavior conflist
|
|
42
|
+
tb = {}
|
|
43
|
+
conflist['traffic'].each do|traffic|
|
|
44
|
+
next unless traffic.include?('behavior')
|
|
45
|
+
name,tab = nil,{'behavior'=>[]}
|
|
46
|
+
traffic.split("\n").each do|line|
|
|
47
|
+
if line.include?('traffic behavior ')
|
|
48
|
+
tb[name] = tab
|
|
49
|
+
name,tab = line.split(' ')[2],{'behavior'=>[]}
|
|
50
|
+
else
|
|
51
|
+
behavior = line.split(' ')
|
|
52
|
+
tab['behavior'] << behavior # sequences
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
tb[name] = tab # last tb
|
|
56
|
+
tb.delete(nil)
|
|
57
|
+
end if conflist['traffic']
|
|
58
|
+
return tb
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# {name => {policy => {classifier => [behavior,precedence], ...}, mode => mode}, ...}
|
|
62
|
+
def traffic_policy conflist
|
|
63
|
+
tp = {}
|
|
64
|
+
conflist['traffic'].each do|traffic|
|
|
65
|
+
next unless traffic.include?('policy')
|
|
66
|
+
name,tab = nil,{'policy'=>{}}
|
|
67
|
+
traffic.split("\n").each do|line|
|
|
68
|
+
if line.include?('traffic policy ')
|
|
69
|
+
tp[name] = tab
|
|
70
|
+
name,tab = line.split(' ')[2],{'policy'=>{}}
|
|
71
|
+
elsif line.include?('-mode')
|
|
72
|
+
tab['mode'] = 'share-mode'
|
|
73
|
+
elsif line.include?('statistics ')
|
|
74
|
+
tab['statistics'] = line.split(' ')[1]
|
|
75
|
+
else
|
|
76
|
+
policy = line.split(' ')
|
|
77
|
+
classifier, behavior, precedence = policy[1],policy[3],policy[5]
|
|
78
|
+
tab['policy'].merge!({ classifier => (precedence ? [behavior,precedence] : [behavior]) }) # tree
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
tp[name] = tab # last tb
|
|
82
|
+
tp.delete(nil)
|
|
83
|
+
end if conflist['traffic']
|
|
84
|
+
return tp
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
```
|