junoser 0.2.13 → 0.3.0

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.
data/lib/junoser/ruler.rb CHANGED
@@ -48,41 +48,26 @@ module Junoser
48
48
  str.gsub! '"minus-literal"', '"-"'
49
49
 
50
50
  str.gsub!(/\((.*) \| "name"\)/) { "(#$1 | arg)" }
51
- str.gsub!(/\("name" \| (.*)\)/) { "(arg | #$1)" }
52
- str.gsub! '"vlan" ("id-name" | "all")', '"vlan" ("all" | arg)'
53
51
  str.gsub! '"vlan" ("all" | "vlan-name")', '"vlan" ("all" | arg)'
52
+ str.gsub!(/\((.*) \| "vlan-id"\)/) { "(#$1 | arg)" }
54
53
  str.gsub!(/("ssh-\S+") arg/) { "#$1 (quote | arg)" }
55
54
  str.gsub! '"description" arg', '"description" (quote | arg)'
56
55
  str.gsub! '"as-path-prepend" arg', '"as-path-prepend" (quote | arg)'
57
- str.gsub! '"path-list" arg (', 'b(ipaddr,'
56
+ str.gsub!(/arg \| (".*")/) { "#$1 | arg" }
58
57
  str.gsub! '"dhcp-service" (', '("dhcp-service" | "dhcp") ('
59
58
 
60
- str.gsub!(/(s\(\s*)"address" arg/) { "#{$1}arg" }
61
- str.gsub!(/^(\s*"idle-timeout" \(\s*c\(\s*c\(\s*"forever",\s*)"timeout" arg/) { "#{$1}arg" }
62
-
63
- str = omit_label(str, 'contents', 'syslog_object')
64
- str = omit_label(str, 'interface', 'cos_interfaces_type')
65
- str = omit_label(str, 'interface', 'ir_interfaces_type')
66
- str = omit_label(str, 'interface', 'interfaces_type')
67
- str = omit_label(str, 'client-address-list', 'client_address_object')
68
- str = omit_label(str, 'prefix-list-item', 'prefix_list_items')
69
- str = omit_label(str, 'instance', 'juniper_routing_instance')
70
- str = omit_label(str, 'vlan', 'vlan_type')
71
- str = omit_label(str, 'dynamic-tunnel', 'dynamic_tunnel_type')
72
-
73
- str.gsub!(/"icmp"(.*)"icmp6"/) { %["icmpv6"#$1"icmp"] }
59
+ str.gsub!(/"inet"(.*)"inet6"/) { %["inet6"#$1"inet"] }
60
+ str.gsub!(/"icmp"(.*)"icmp6"/) { %["icmp6"#$1"icmp"] }
61
+ str.gsub!(/"icmp"(.*)"icmpv6"/) { %["icmpv6"#$1"icmp"] }
74
62
  str.gsub!(/"http"(.*)"https"/) { %["https"#$1"http"] }
75
63
  str.gsub!(/"snmp"(.*)"snmptrap"/) { %["snmptrap"#$1"snmp"] }
64
+ %w[ccc ethernet-over-atm tcc vpls bridge].each do |encap|
65
+ str.gsub!(/"ethernet"(.*)"ethernet-#{encap}"/) { %["ethernet-#{encap}"#$1"ethernet"] }
66
+ end
67
+ str.gsub! '"icmp6" |', '"icmp6" | "icmpv6" |'
76
68
  str.gsub!(/"cspf"(.*)"cspf-link"/) { %["cspf-link"#$1"cspf"] }
77
69
  str.gsub!(/"route-filter" (\(\s*control_route_filter_type\s*\))/) { %["route-filter" arg #{$1}.as(:oneline)] }
78
70
  str.gsub!(/"source-address-filter" (\(\s*control_source_address_filter_type\s*\))/) { %["source-adress-filter" arg #{$1}.as(:oneline)] }
79
- str.gsub!(/("next-hop" \(\s*c\(\s*c\(\s*[^)]*)"address" \(\s*ipaddr\s*\)/) { "#{$1}ipaddr" }
80
-
81
- %w[metric metric2 metric3 metric4 tag tag2 preference preference2 color color2 local-preference].each do |key|
82
- str.gsub!(/^(\s*"#{key}" \(\s*c\(\s*c\(\s*)"#{key}" arg/) { "#{$1}arg" }
83
- end
84
- str.gsub!(/^(\s*"vrf-target" \(\s*)c\(\s*"community" arg,/) { "#{$1}ca(" }
85
- str.gsub!(/^(\s*)"priority" \(\s*c\(\s*"setup-priority" arg,\s*"reservation-priority" arg\s*\)\s*\)/) { %[#{$1}a("priority", a(arg, arg)).as(:oneline)] }
86
71
 
87
72
  %w[teardown hold-time stub].each do |key|
88
73
  str.gsub!(/^(\s*"#{key}" \(\s*)c\(/) { "#{$1}sc(" }
@@ -94,11 +79,7 @@ module Junoser
94
79
  str.gsub!(/^(\s*"#{key}") arg/) { "#{$1}" }
95
80
  end
96
81
 
97
- str.gsub!(/^(\s*)"inline-services"/) do
98
- format(['"inline-services" (',
99
- ' "bandwidth" ("1g" | "10g")',
100
- ')'], $1)
101
- end
82
+
102
83
  str.gsub!(/^(\s*)"ieee-802.3ad" \(\s*c\(\s*"lacp" \(\s*c\(/) do
103
84
  format(['"802.3ad" (',
104
85
  ' ca(',
@@ -106,20 +87,34 @@ module Junoser
106
87
  ' c(',
107
88
  ' "force-up",'], $1)
108
89
  end
109
- str.gsub!(/^(\s*)"as-path" \(\s*c\(\s*"path" arg,/) do
110
- format(['"as-path" (',
111
- ' ca('], $1)
112
- end
113
- str.gsub!(/^(\s*)"as-path" arg \(\s*c\(\s*"path" arg\s*\)/) do
90
+ str.gsub!(/^(\s*)"as-path" arg \(\s*c\(\s*arg/) do
114
91
  format(['"as-path" arg (',
115
92
  ' c(',
116
- ' quote,',
117
- ' arg',
118
- ' )'], $1)
93
+ ' quote | arg'], $1)
119
94
  end
120
- str.gsub!(/^(\s*)"ribgroup-name" arg$/) do
121
- format(['arg (',
122
- ' arg',
95
+ str.gsub!(/^(\s*)"priority" \(\s*c\(\s*arg,\s*arg\s*\)/) do
96
+ format(['"priority" (',
97
+ ' a(arg, arg)', $1])
98
+ end
99
+ str.gsub!(/^(\s*)"path" arg \(\s*c\(\s*c\(\s*"abstract",\s*c\(\s*"loose",\s*"loose-link",\s*"strict"\s*\)\s*\)\.as\(:oneline\)/) do
100
+ format(['"path" arg (',
101
+ ' c(',
102
+ ' b(',
103
+ ' ipaddr,',
104
+ ' c(',
105
+ ' "abstract",',
106
+ ' c(',
107
+ ' "loose-link",',
108
+ ' "loose",',
109
+ ' "strict"',
110
+ ' )',
111
+ ' ).as(:oneline)',
112
+ ' )', $1])
113
+ end
114
+
115
+ str.gsub!(/^(\s*)c\(\s*\("default"\)\s*\)/) do
116
+ format(['c(',
117
+ ' ("default" | arg)',
123
118
  ')'], $1)
124
119
  end
125
120
 
@@ -135,21 +130,21 @@ module Junoser
135
130
  ' "full-name" (quote | arg),'])
136
131
  end
137
132
 
138
- str.gsub!(/(rule\(:juniper_policy_options\) do\s*)c\(/) { "#{$1}c(" }
139
133
  str.gsub!(/(rule\(:control_route_filter_type\) do\s*)s\(\s*arg,/) { "#{$1}b(" }
140
134
  str.gsub!(/(rule\(:control_source_address_filter_type\) do\s*)s\(\s*arg,/) { "#{$1}b(" }
141
135
  str.gsub!(/^(rule\(:trace_file_type\) do\s*)c\(\s*arg,/) { "#{$1}sca(" }
142
136
  str.gsub!(/^(rule\(:archive_object\) do\s*)c\(/) { "#{$1}sc(" }
137
+ str.gsub!(/^(rule\(:rib_group_inet_type\) do)\s*c\(\s*arg/) do
138
+ format([$1,
139
+ ' ca(',
140
+ ' a(arg, arg)'], '')
141
+ end
143
142
 
144
143
  str.gsub!(/^(\s*)c\(\s*arg,$/) { "#{$1}ca(" }
145
144
 
146
145
  str
147
146
  end
148
147
 
149
- def omit_label(str, label, content)
150
- str.gsub(/(\s*)"#{label}" \(\s*#{content}\s*\)/) { "#{$1}#{content}" }
151
- end
152
-
153
148
  def format(str, offset=OFFSET)
154
149
  case str
155
150
  when String
@@ -166,25 +161,34 @@ require 'parslet'
166
161
  module Junoser
167
162
  class Parser < Parslet::Parser
168
163
  def parse_lines(config)
169
- lines = config.split("\\n")
164
+ lines = config.split("\\n").map(&:strip)
170
165
  lines_without_deactivate = lines.reject {|l| l =~ /^deactivate/ }
171
166
 
172
167
  lines.inject(true) do |passed, line|
173
- if line =~ /^deactivate/
174
- if lines_without_deactivate.grep(/^\#{line.sub(/^deactivate/, 'set')}/).empty?
175
- next false
176
- else
177
- next passed
178
- end
168
+ passed & parse_line(line, lines_without_deactivate)
169
+ end
170
+ end
171
+
172
+ def parse_line(line, lines_without_deactivate)
173
+ if line =~ /^deactivate/
174
+ if lines_without_deactivate.grep(/^\#{line.sub(/^deactivate/, 'set')}/).empty?
175
+ $stderr.puts %(Corresponding "set" statement is not found: \#{line})
176
+ return false
177
+ else
178
+ return true
179
179
  end
180
+ end
180
181
 
181
- begin
182
- parse line
183
- passed
184
- rescue Parslet::ParseFailed
185
- $stderr.puts "Invalid syntax: \#{line}"
186
- false
182
+ begin
183
+ if line =~ /(.*)\\s+apply-groups\\s+\\S+\$/
184
+ return \$1 == 'set' ? true : parse(\$1)
187
185
  end
186
+
187
+ parse line
188
+ true
189
+ rescue Parslet::ParseFailed
190
+ $stderr.puts "Invalid syntax: \#{line}"
191
+ false
188
192
  end
189
193
  end
190
194
 
@@ -1,3 +1,3 @@
1
1
  module Junoser
2
- VERSION = "0.2.13"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -39,6 +39,10 @@ module Junoser
39
39
  @oneliner ||= !xml.xpath('./xsd:annotation/xsd:appinfo/flag[text()="oneliner"]').empty?
40
40
  end
41
41
 
42
+ def nokeyword?
43
+ @nokeyword ||= !xml.xpath('./xsd:annotation/xsd:appinfo/flag[text()="nokeyword"]').empty?
44
+ end
45
+
42
46
  def has_single_child_of?(klass)
43
47
  config.size == 1 && config.first.is_a?(klass)
44
48
  end
@@ -1,5 +1,6 @@
1
1
  require 'junoser/xsd/base'
2
2
  require 'junoser/xsd/complex_type'
3
+ require 'junoser/xsd/simple_type'
3
4
 
4
5
  module Junoser
5
6
  module Xsd
@@ -17,7 +18,7 @@ module Junoser
17
18
  when 'complexType'
18
19
  Junoser::Xsd::ComplexType.new(child, depth: @depth+1)
19
20
  when 'simpleType'
20
- 'arg'
21
+ Junoser::Xsd::SimpleType.new(child, depth: @depth+1)
21
22
  else
22
23
  raise "ERROR: unknown element: #{child.name}"
23
24
  end
@@ -26,9 +27,13 @@ module Junoser
26
27
 
27
28
  def to_s
28
29
  str = case
30
+ when nokeyword? && content.empty?
31
+ format('arg')
32
+ when nokeyword?
33
+ content
29
34
  when content.empty?
30
35
  format(label)
31
- when content =~ /^ *arg$/
36
+ when content =~ /\A *arg\z/
32
37
  format("#{label} arg")
33
38
  when label
34
39
  format("#{label} (", content, ')')
@@ -16,7 +16,11 @@ module Junoser
16
16
  end
17
17
 
18
18
  def to_s
19
- format(OFFSET + config.first)
19
+ if nokeyword?
20
+ format(OFFSET + 'arg')
21
+ else
22
+ format(OFFSET + config.first)
23
+ end
20
24
  end
21
25
 
22
26
 
@@ -22,7 +22,7 @@ module Junoser
22
22
 
23
23
  def remove_unused
24
24
  xpath('/xsd:schema/*[self::xsd:import]').remove
25
- xpath('//xsd:element[@ref="undocumented" or @ref="junos:comment"]').remove
25
+ xpath('//xsd:element[@ref="undocumented" or @ref="junos:comment" or @name="apply-advanced"]').remove
26
26
  self
27
27
  end
28
28
  end
@@ -1,5 +1,6 @@
1
1
  require 'junoser/xsd/base'
2
2
  require 'junoser/xsd/enumeration'
3
+ require 'junoser/xsd/simple_type'
3
4
 
4
5
  module Junoser
5
6
  module Xsd
@@ -17,10 +18,13 @@ module Junoser
17
18
  case child.name
18
19
  when 'enumeration'
19
20
  Junoser::Xsd::Enumeration.new(child, depth: @depth+1)
21
+ when 'simpleType'
22
+ Junoser::Xsd::SimpleType.new(child, depth: @depth+1)
23
+ when 'attribute'
20
24
  else
21
25
  raise "ERROR: unknown element: #{child.name}"
22
26
  end
23
- }
27
+ }.compact
24
28
  end
25
29
 
26
30
  def to_s
@@ -0,0 +1,28 @@
1
+ require 'junoser/xsd/base'
2
+ require 'junoser/xsd/restriction'
3
+ require 'junoser/xsd/union'
4
+
5
+ module Junoser
6
+ module Xsd
7
+ class SimpleType
8
+ include Base
9
+
10
+ def config
11
+ @config ||= children.map {|child|
12
+ case child.name
13
+ when 'restriction'
14
+ Junoser::Xsd::Restriction.new(child, depth: @depth+1)
15
+ when 'union'
16
+ Junoser::Xsd::Union.new(child, depth: @depth+1)
17
+ else
18
+ raise "ERROR: unknown element: #{child.name}"
19
+ end
20
+ }
21
+ end
22
+
23
+ def to_s
24
+ format(config.first.to_s.strip)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,24 @@
1
+ require 'junoser/xsd/base'
2
+
3
+ module Junoser
4
+ module Xsd
5
+ class Union
6
+ include Base
7
+
8
+ def config
9
+ @config ||= children.map {|child|
10
+ case child.name
11
+ when 'simpleType'
12
+ Junoser::Xsd::SimpleType.new(child, depth: @depth+1)
13
+ else
14
+ raise "ERROR: unknown element: #{child.name}"
15
+ end
16
+ }
17
+ end
18
+
19
+ def to_s
20
+ format(config.first.to_s.strip)
21
+ end
22
+ end
23
+ end
24
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: junoser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.13
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shintaro Kojima
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-10-17 00:00:00.000000000 Z
11
+ date: 2017-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parslet
@@ -97,6 +97,7 @@ files:
97
97
  - Rakefile
98
98
  - bin/console
99
99
  - bin/setup
100
+ - example/vmx-17.2R1.13.rb
100
101
  - example/vsrx-12.1.x47.rb
101
102
  - exe/junoser
102
103
  - junoser.gemspec
@@ -121,6 +122,8 @@ files:
121
122
  - lib/junoser/xsd/restriction.rb
122
123
  - lib/junoser/xsd/sequence.rb
123
124
  - lib/junoser/xsd/simple_content.rb
125
+ - lib/junoser/xsd/simple_type.rb
126
+ - lib/junoser/xsd/union.rb
124
127
  - lib/underscorable.rb
125
128
  homepage: https://github.com/codeout/junoser
126
129
  licenses: []