conpar 0.2.0 → 0.2.2

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,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 27aa5140dcddcbc284b4aadfe79bfc86d1e35cb0
4
+ data.tar.gz: ae21cb8a073f95229f5531b4d5f71c8319f52744
5
+ SHA512:
6
+ metadata.gz: 66bbd330e3786841eeac7567ce164c5714e4e84cdec2bc1b7f5a3dc3d2820973feb219224953d7cd817b078f6266ebe12a7e7dca49bcc9ca54c3379afbf05b94
7
+ data.tar.gz: 67e7ff56a68b6ed5fc051e7cb68bac73bf91218b86e8e34433c22424010d23d7a54a81a42203ac2e5284ee98ecce0846ad4ba63ba32229422040b939232b784b
@@ -16,9 +16,9 @@ module Conpar
16
16
  [
17
17
  Remark,
18
18
  Standard,
19
- Extended,
20
19
  WebType,
21
- EtherType
20
+ EtherType,
21
+ Extended
22
22
  ].each do |klass|
23
23
  if line =~ klass::SIGNATURE
24
24
  return klass.new(line, options)
@@ -5,7 +5,14 @@ module Conpar
5
5
  # See http://www.cisco.com/c/en/us/td/docs/security/asa/asa91/configuration/general/asa_91_general_config/acl_extended.html
6
6
  class Extended < Base
7
7
  # (0.1.4): "extended" should be followed by "permit" or "deny"
8
- SIGNATURE = /^(access-list)\b.*\s(extended)\s+(permit|deny)\s/i
8
+ # (0.2.2): "extended" optional (legacy syntax support)
9
+ SIGNATURE = %r/^
10
+ (access-list)\s+
11
+ (#{NAME})\s+
12
+ (line\s+(\d+))?\s*
13
+ (extended)?\s*
14
+ (permit|deny)
15
+ /x
9
16
 
10
17
  def initialize(content="", options={})
11
18
  super
@@ -17,15 +24,15 @@ module Conpar
17
24
  (?<octet>1?[0-9]{1,2}|2([0-4][0-9]|5[0-5]))\.\k<octet>\.\k<octet>\.\k<octet>
18
25
  /x
19
26
 
20
- # access-list access_list_name [line line_number] extended
27
+ # access-list access_list_name [line line_number] [extended]
21
28
  # {deny | permit} protocol_argument source_address_argument dest_address_argument
22
29
  # [log [[level] [interval secs] | disable | default]]
23
30
  # [inactive | time-range time_range_name]
24
31
  parse_regex = %r/^
25
- (access-list)\s* # Directive Signature
26
- (?<name>#{NAME})\s* # ACL Name
32
+ (access-list)\s+ # Directive Signature
33
+ (?<name>#{NAME})\s+ # ACL Name
27
34
  (line\s+(?<line>\d+))?\s* # (optional) line number
28
- (?<type>extended)\s* # ACL type
35
+ (?<type>extended)?\s* # (optional) ACL type (legacy syntax support)
29
36
  (?<permission>(permit|deny))?\s* # permit or deny
30
37
  (?<protocol>\w+)\s* # Protocol Argument
31
38
  (?<rule>.+) # Everything else on line
@@ -1,3 +1,3 @@
1
1
  module Conpar
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.2"
3
3
  end
@@ -5,7 +5,8 @@ describe Conpar::Directive::AccessList::Extended do
5
5
 
6
6
  [
7
7
  "access-list 101 extended permit icmp any object-group standard-grp",
8
- "access-list 101 extended permit icmp any any object-group standard"
8
+ "access-list 101 extended permit icmp any any object-group standard",
9
+ "access-list 101 permit ip any any" # Legacy Syntax
9
10
  ].each do |acl|
10
11
  context "for '#{acl}'" do
11
12
  subject { acl }
@@ -15,6 +16,17 @@ describe Conpar::Directive::AccessList::Extended do
15
16
  end
16
17
  end
17
18
 
19
+ [
20
+ "access-list dne blahtype permit all"
21
+ ].each do |acl|
22
+ context "for '#{acl}'" do
23
+ subject { acl }
24
+ it "::SIGNATURE should NOT MATCH" do
25
+ expect(subject).to_not match(klass::SIGNATURE)
26
+ end
27
+ end
28
+ end
29
+
18
30
  {
19
31
  # example from cisco documenation
20
32
  # rule any any
@@ -8,7 +8,8 @@ describe Conpar::Directive::AccessList do
8
8
  "access-list foo webtype deny all" => Conpar::Directive::AccessList::WebType,
9
9
  "access-list foo ethertype deny all" => Conpar::Directive::AccessList::EtherType,
10
10
  "access-list foo unknowntype deny all" => Conpar::Directive::AccessList::Base,
11
- "access-list 101 extended permit ip any any object-group standard" => Conpar::Directive::AccessList::Extended
11
+ "access-list 101 extended permit ip any any object-group standard" => Conpar::Directive::AccessList::Extended,
12
+ "access-list 101 permit ip any any" => Conpar::Directive::AccessList::Extended # Legacy Syntax
12
13
  }.each do |line, klass_output|
13
14
  it "for '#{line}' should return a #{klass_output.name}" do
14
15
  expect(subject.new(line)).to be_a_kind_of(klass_output)
@@ -121,5 +121,25 @@ describe Conpar::Document do
121
121
  it { expect(result.select{|r| r.ilk == :directive }).to have(2).items }
122
122
  end
123
123
  end
124
+
125
+ context "~legacy syntax~" do
126
+ # 2 comments and 1 ACL
127
+ context 'legacy-sample1' do
128
+ let(:config) { File.read("spec/samples/legacy-sample1") }
129
+
130
+ context "result" do
131
+ let(:result) { subject.parse(config) }
132
+ it { expect(result.select{|r| r.ilk == :comment }).to have(2).items }
133
+ it { expect(result.select{|r| r.ilk == :access_list }).to have(1).items }
134
+ it { expect(result.select{|r| r.sub_ilk == "extended" }).to have(1).items }
135
+ end
136
+ end#legacy-sample1
137
+ end
138
+
139
+
140
+ context "with invalid UTF-8 characters" do
141
+ let(:config) { ": some comment\255" }
142
+ it "shouldn't error"
143
+ end
124
144
  end
125
145
  end
@@ -0,0 +1,3 @@
1
+ : First Comment
2
+ : Second Comment
3
+ access-list 101 permit ip any any
metadata CHANGED
@@ -1,158 +1,139 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: conpar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
5
- prerelease:
4
+ version: 0.2.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - Ryan A. Johnson
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-05-01 00:00:00.000000000 Z
11
+ date: 2014-12-02 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: bundler
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
19
  version: '1.3'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ~>
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
26
  version: '1.3'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rspec
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: 2.4.0
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
40
  version: 2.4.0
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rake
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: yard
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - ">="
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - ">="
76
67
  - !ruby/object:Gem::Version
77
68
  version: '0'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: redcarpet
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - ">="
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - ">="
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: guard
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ! '>='
87
+ - - ">="
100
88
  - !ruby/object:Gem::Version
101
89
  version: '0'
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ! '>='
94
+ - - ">="
108
95
  - !ruby/object:Gem::Version
109
96
  version: '0'
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: guard-rspec
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ! '>='
101
+ - - ">="
116
102
  - !ruby/object:Gem::Version
117
103
  version: '0'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ! '>='
108
+ - - ">="
124
109
  - !ruby/object:Gem::Version
125
110
  version: '0'
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: pry
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
- - - ! '>='
115
+ - - ">="
132
116
  - !ruby/object:Gem::Version
133
117
  version: '0'
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
- - - ! '>='
122
+ - - ">="
140
123
  - !ruby/object:Gem::Version
141
124
  version: '0'
142
125
  - !ruby/object:Gem::Dependency
143
126
  name: coveralls
144
127
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
128
  requirements:
147
- - - ! '>='
129
+ - - ">="
148
130
  - !ruby/object:Gem::Version
149
131
  version: '0'
150
132
  type: :development
151
133
  prerelease: false
152
134
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
135
  requirements:
155
- - - ! '>='
136
+ - - ">="
156
137
  - !ruby/object:Gem::Version
157
138
  version: '0'
158
139
  description: Full-featured firewall configuration parser library.
@@ -162,9 +143,9 @@ executables: []
162
143
  extensions: []
163
144
  extra_rdoc_files: []
164
145
  files:
165
- - .coveralls.yml
166
- - .gitignore
167
- - .travis.yml
146
+ - ".coveralls.yml"
147
+ - ".gitignore"
148
+ - ".travis.yml"
168
149
  - Gemfile
169
150
  - Guardfile
170
151
  - LICENSE.txt
@@ -206,6 +187,7 @@ files:
206
187
  - spec/lib/directive_spec.rb
207
188
  - spec/lib/document_spec.rb
208
189
  - spec/samples/basic
190
+ - spec/samples/legacy-sample1
209
191
  - spec/samples/sample2
210
192
  - spec/samples/sample3
211
193
  - spec/samples/sample4
@@ -215,33 +197,26 @@ files:
215
197
  homepage: ''
216
198
  licenses:
217
199
  - MIT
200
+ metadata: {}
218
201
  post_install_message:
219
202
  rdoc_options: []
220
203
  require_paths:
221
204
  - lib
222
205
  required_ruby_version: !ruby/object:Gem::Requirement
223
- none: false
224
206
  requirements:
225
- - - ! '>='
207
+ - - ">="
226
208
  - !ruby/object:Gem::Version
227
209
  version: '0'
228
- segments:
229
- - 0
230
- hash: -220778513351759836
231
210
  required_rubygems_version: !ruby/object:Gem::Requirement
232
- none: false
233
211
  requirements:
234
- - - ! '>='
212
+ - - ">="
235
213
  - !ruby/object:Gem::Version
236
214
  version: '0'
237
- segments:
238
- - 0
239
- hash: -220778513351759836
240
215
  requirements: []
241
216
  rubyforge_project:
242
- rubygems_version: 1.8.23
217
+ rubygems_version: 2.2.2
243
218
  signing_key:
244
- specification_version: 3
219
+ specification_version: 4
245
220
  summary: Firewall CONfig PARser
246
221
  test_files:
247
222
  - spec/conpar_spec.rb
@@ -260,6 +235,7 @@ test_files:
260
235
  - spec/lib/directive_spec.rb
261
236
  - spec/lib/document_spec.rb
262
237
  - spec/samples/basic
238
+ - spec/samples/legacy-sample1
263
239
  - spec/samples/sample2
264
240
  - spec/samples/sample3
265
241
  - spec/samples/sample4