cisco_acl_intp 0.0.1

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.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +13 -0
  5. data/.travis.yml +3 -0
  6. data/.yardopts +4 -0
  7. data/Gemfile +19 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +132 -0
  10. data/Rakefile +78 -0
  11. data/acl_examples/err-acl.txt +49 -0
  12. data/acl_examples/named-ext-acl.txt +12 -0
  13. data/acl_examples/named-std-acl.txt +6 -0
  14. data/acl_examples/numd-acl.txt +21 -0
  15. data/cisco_acl_intp.gemspec +31 -0
  16. data/lib/cisco_acl_intp/ace.rb +432 -0
  17. data/lib/cisco_acl_intp/ace_ip.rb +136 -0
  18. data/lib/cisco_acl_intp/ace_other_qualifiers.rb +102 -0
  19. data/lib/cisco_acl_intp/ace_port.rb +146 -0
  20. data/lib/cisco_acl_intp/ace_proto.rb +319 -0
  21. data/lib/cisco_acl_intp/ace_srcdst.rb +114 -0
  22. data/lib/cisco_acl_intp/ace_tcp_flags.rb +65 -0
  23. data/lib/cisco_acl_intp/acl.rb +272 -0
  24. data/lib/cisco_acl_intp/acl_base.rb +111 -0
  25. data/lib/cisco_acl_intp/parser.rb +3509 -0
  26. data/lib/cisco_acl_intp/parser.ry +1397 -0
  27. data/lib/cisco_acl_intp/scanner.rb +176 -0
  28. data/lib/cisco_acl_intp/scanner_special_token_handler.rb +66 -0
  29. data/lib/cisco_acl_intp/version.rb +5 -0
  30. data/lib/cisco_acl_intp.rb +9 -0
  31. data/spec/cisco_acl_intp/ace_ip_spec.rb +111 -0
  32. data/spec/cisco_acl_intp/ace_other_qualifier_spec.rb +63 -0
  33. data/spec/cisco_acl_intp/ace_port_spec.rb +214 -0
  34. data/spec/cisco_acl_intp/ace_proto_spec.rb +200 -0
  35. data/spec/cisco_acl_intp/ace_spec.rb +605 -0
  36. data/spec/cisco_acl_intp/ace_srcdst_spec.rb +296 -0
  37. data/spec/cisco_acl_intp/ace_tcp_flags_spec.rb +38 -0
  38. data/spec/cisco_acl_intp/acl_spec.rb +523 -0
  39. data/spec/cisco_acl_intp/cisco_acl_intp_spec.rb +7 -0
  40. data/spec/cisco_acl_intp/parser_spec.rb +53 -0
  41. data/spec/cisco_acl_intp/scanner_spec.rb +122 -0
  42. data/spec/conf/extacl_objgrp_token_seq.yml +36 -0
  43. data/spec/conf/extacl_token_seq.yml +88 -0
  44. data/spec/conf/extended_acl.yml +226 -0
  45. data/spec/conf/scanner_spec_data.yml +120 -0
  46. data/spec/conf/single_tokens.yml +235 -0
  47. data/spec/conf/stdacl_token_seq.yml +8 -0
  48. data/spec/conf/tokens1.yml +158 -0
  49. data/spec/conf/tokens2.yml +206 -0
  50. data/spec/parser_fullfill_patterns.rb +145 -0
  51. data/spec/spec_helper.rb +54 -0
  52. data/tools/check_acl.rb +48 -0
  53. metadata +159 -0
@@ -0,0 +1,296 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe AceSrcDstSpec do
5
+ describe '#to_s' do
6
+ context 'Normal case' do
7
+ before do
8
+ @p1 = AceTcpProtoSpec.new(
9
+ number: 80
10
+ )
11
+ end
12
+
13
+ it 'should be "192.168.3.0 0.0.0.127" without L4 port' do
14
+ sds = AceSrcDstSpec.new(
15
+ ipaddr: '192.168.3.3',
16
+ wildcard: '0.0.0.127'
17
+ )
18
+ sds.to_s.should be_aclstr('192.168.3.0 0.0.0.127')
19
+ end
20
+
21
+ it 'should be "192.168.3.0 eq www" with L4 port' do
22
+ sds = AceSrcDstSpec.new(
23
+ ipaddr: '192.168.3.3',
24
+ wildcard: '0.0.0.127',
25
+ operator: 'eq',
26
+ port: @p1
27
+ )
28
+ sds.to_s.should be_aclstr('192.168.3.0 0.0.0.127 eq www')
29
+ end
30
+ end
31
+
32
+ context 'Argument error case' do
33
+
34
+ it 'should be raise exception when :ipaddr not specified' do
35
+ lambda do
36
+ AceSrcDstSpec.new(
37
+ wildcard: '0.0.0.127'
38
+ )
39
+ end.should raise_error(AclArgumentError)
40
+ end
41
+
42
+ ## TBD, error handling must be written in detail
43
+ end
44
+ end
45
+
46
+ describe '#matches?' do
47
+
48
+ context 'with port unary operator: eq/neq/gt/lt' do
49
+ before(:each) do
50
+ ipaddr = AceIpSpec.new(
51
+ ipaddr: '192.168.15.15',
52
+ wildcard: '0.0.7.6'
53
+ )
54
+ @p1 = AceTcpProtoSpec.new(
55
+ number: 80
56
+ )
57
+ @sds0 = AceSrcDstSpec.new(
58
+ ip_spec: ipaddr
59
+ )
60
+ @sds1 = AceSrcDstSpec.new(
61
+ ip_spec: ipaddr,
62
+ operator: 'eq',
63
+ port: @p1
64
+ )
65
+ @sds2 = AceSrcDstSpec.new(
66
+ ip_spec: ipaddr,
67
+ operator: 'neq',
68
+ port: @p1
69
+ )
70
+ @sds3 = AceSrcDstSpec.new(
71
+ ip_spec: ipaddr,
72
+ operator: 'lt',
73
+ port: @p1
74
+ )
75
+ @sds4 = AceSrcDstSpec.new(
76
+ ip_spec: ipaddr,
77
+ operator: 'gt',
78
+ port: @p1
79
+ )
80
+ @ip_match = '192.168.9.11'
81
+ @ip_unmatch = '192.168.9.12'
82
+ @p1_match = 80
83
+ @p1_unmatch = 88
84
+ @p1_lower = 22
85
+ @p1_higher = 6633
86
+ end
87
+
88
+ context 'with IP only entry' do
89
+ it 'should be true, when match ip and "any" port' do
90
+ @sds0.matches?(@ip_match, @p1_match).should be_true
91
+ @sds0.matches?(@ip_match, @p1_unmatch).should be_true
92
+ @sds0.matches?(@ip_match, @p1_lower).should be_true
93
+ @sds0.matches?(@ip_match, @p1_higher).should be_true
94
+ end
95
+
96
+ it 'should be false, when unmatch ip and "any" port' do
97
+ @sds0.matches?(@ip_unmatch, @p1_match).should be_false
98
+ @sds0.matches?(@ip_unmatch, @p1_unmatch).should be_false
99
+ @sds0.matches?(@ip_unmatch, @p1_lower).should be_false
100
+ @sds0.matches?(@ip_unmatch, @p1_higher).should be_false
101
+ end
102
+ end
103
+
104
+ context 'eq' do
105
+ it 'should be true, with match ip match eq port' do
106
+ @sds1.matches?(@ip_match, @p1_match).should be_true
107
+ end
108
+
109
+ it 'should be false, with match ip and unmatch eq port' do
110
+ @sds1.matches?(@ip_match, @p1_unmatch).should be_false
111
+ end
112
+
113
+ it 'should be false, with unmatch ip and match eq port' do
114
+ @sds1.matches?(@ip_unmatch, @p1_match).should be_false
115
+ end
116
+
117
+ it 'should be false, with unmatch ip and unmatch eq port' do
118
+ @sds1.matches?(@ip_unmatch, @p1_unmatch).should be_false
119
+ end
120
+ end
121
+
122
+ context 'neq' do
123
+ it 'should be false, with match ip match eq port' do
124
+ @sds2.matches?(@ip_match, @p1_match).should be_false
125
+ end
126
+
127
+ it 'should be true, with match ip and unmatch eq port' do
128
+ @sds2.matches?(@ip_match, @p1_unmatch).should be_true
129
+ end
130
+
131
+ it 'should be false, with unmatch ip and match eq port' do
132
+ @sds2.matches?(@ip_unmatch, @p1_match).should be_false
133
+ end
134
+
135
+ it 'should be false, with unmatch ip and unmatch eq port' do
136
+ @sds2.matches?(@ip_unmatch, @p1_unmatch).should be_false
137
+ end
138
+ end
139
+
140
+ context 'lt' do
141
+ it 'should be true, with match ip lower eq port' do
142
+ @sds3.matches?(@ip_match, @p1_lower).should be_true
143
+ end
144
+
145
+ it 'should be false, with match ip and higher eq port' do
146
+ @sds3.matches?(@ip_match, @p1_higher).should be_false
147
+ end
148
+
149
+ it 'should be false, with unmatch ip and loser eq port' do
150
+ @sds3.matches?(@ip_unmatch, @p1_lower).should be_false
151
+ end
152
+
153
+ it 'should be false, with unmatch ip and higher eq port' do
154
+ @sds3.matches?(@ip_unmatch, @p1_higher).should be_false
155
+ end
156
+ end
157
+
158
+ context 'gt' do
159
+ it 'should be false, with match ip lower eq port' do
160
+ @sds4.matches?(@ip_match, @p1_lower).should be_false
161
+ end
162
+
163
+ it 'should be true, with match ip and higher eq port' do
164
+ @sds4.matches?(@ip_match, @p1_higher).should be_true
165
+ end
166
+
167
+ it 'should be false, with unmatch ip and loser eq port' do
168
+ @sds4.matches?(@ip_unmatch, @p1_lower).should be_false
169
+ end
170
+
171
+ it 'should be false, with unmatch ip and higher eq port' do
172
+ @sds4.matches?(@ip_unmatch, @p1_higher).should be_false
173
+ end
174
+ end
175
+
176
+ end
177
+
178
+ context 'with operator: range' do
179
+ before(:each) do
180
+ p1 = AceTcpProtoSpec.new(
181
+ number: 80
182
+ )
183
+ p2 = AceTcpProtoSpec.new(
184
+ number: 1023
185
+ )
186
+ @sds = AceSrcDstSpec.new(
187
+ ipaddr: '192.168.15.15',
188
+ wildcard: '0.0.7.6',
189
+ operator: 'range',
190
+ begin_port: p1,
191
+ end_port: p2
192
+ )
193
+ @ip_match = '192.168.9.11'
194
+ @ip_unmatch = '192.168.9.12'
195
+ @p_in = 512
196
+ @p_out_lower = 23
197
+ @p_out_higher = 6633
198
+ end
199
+
200
+ it 'should be true, with match ip in range port' do
201
+ @sds.matches?(@ip_match, @p_in).should be_true
202
+ end
203
+
204
+ it 'should be false, with match ip and out of range port (lower)' do
205
+ @sds.matches?(@ip_match, @p_out_lower).should be_false
206
+ end
207
+
208
+ it 'should be false, with match ip and out of range port (higher)' do
209
+ @sds.matches?(@ip_match, @p_out_higher).should be_false
210
+ end
211
+
212
+ it 'should be false, with unmatch ip match in range port' do
213
+ @sds.matches?(@ip_unmatch, @p_in).should be_false
214
+ end
215
+
216
+ it 'should be false, with unmatch ip and out of range port (lower)' do
217
+ @sds.matches?(@ip_unmatch, @p_out_lower).should be_false
218
+ end
219
+
220
+ it 'should be false, with unmatch ip and out of range port (higher)' do
221
+ @sds.matches?(@ip_unmatch, @p_out_higher).should be_false
222
+ end
223
+ end
224
+
225
+ context 'with ip or port any' do
226
+ before do
227
+ ip_any = AceIpSpec.new(
228
+ ipaddr: '0.0.0.0',
229
+ wildcard: '255.255.255.255'
230
+ )
231
+ port_any = AcePortSpec.new(
232
+ operator: 'any'
233
+ )
234
+ ip1 = AceIpSpec.new(
235
+ ipaddr: '192.168.15.15',
236
+ wildcard: '0.0.7.6'
237
+ )
238
+ port_range = AcePortSpec.new(
239
+ operator: 'range',
240
+ begin_port: AceTcpProtoSpec.new(
241
+ number: 80
242
+ ),
243
+ end_port: AceTcpProtoSpec.new(
244
+ number: 1023
245
+ )
246
+ )
247
+ @sds1 = AceSrcDstSpec.new(
248
+ ip_spec: ip_any,
249
+ port_spec: port_range
250
+ )
251
+ @sds2 = AceSrcDstSpec.new(
252
+ ip_spec: ip1,
253
+ port_spec: port_any
254
+ )
255
+ @sds3 = AceSrcDstSpec.new(
256
+ ip_spec: ip_any,
257
+ port_spec: port_any
258
+ )
259
+ @ip_match = '192.168.9.11'
260
+ @ip_unmatch = '192.168.9.12'
261
+ @p_match = 512
262
+ @p_unmatch = 6633
263
+ end
264
+
265
+ it 'should be true, for any ip' do
266
+ @sds1.matches?(@ip_match, @p_match).should be_true
267
+ @sds1.matches?(@ip_unmatch, @p_match).should be_true
268
+ end
269
+
270
+ it 'should be false, for any ip with unmatch port' do
271
+ @sds1.matches?(@ip_match, @p_unmatch).should be_false
272
+ @sds1.matches?(@ip_unmatch, @p_unmatch).should be_false
273
+ end
274
+
275
+ it 'should be true, for any port' do
276
+ @sds2.matches?(@ip_match, @p_match).should be_true
277
+ @sds2.matches?(@ip_match, @p_unmatch).should be_true
278
+ end
279
+
280
+ it 'should be false, for any port with unmatch ip' do
281
+ @sds2.matches?(@ip_unmatch, @p_match).should be_false
282
+ @sds2.matches?(@ip_unmatch, @p_unmatch).should be_false
283
+ end
284
+
285
+ it 'should be true, for any ip and any port' do
286
+ @sds3.matches?(@ip_match, @p_match).should be_true
287
+ @sds3.matches?(@ip_match, @p_unmatch).should be_true
288
+ @sds3.matches?(@ip_unmatch, @p_match).should be_true
289
+ @sds3.matches?(@ip_unmatch, @p_unmatch).should be_true
290
+ end
291
+
292
+ end
293
+
294
+ end # describe matches?
295
+
296
+ end # describe AceSrcDstSpec
@@ -0,0 +1,38 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe AceTcpFlag do
5
+ describe '#to_s' do
6
+
7
+ it 'should be make tcp flags' do
8
+ flag = AceTcpFlag.new('established')
9
+ flag.to_s.should be_aclstr('established')
10
+ end
11
+ end
12
+ end
13
+
14
+ describe AceTcpFlagList do
15
+ describe '#to_s' do
16
+
17
+ before do
18
+ @f1 = AceTcpFlag.new('syn')
19
+ @f2 = AceTcpFlag.new('ack')
20
+ @f3 = AceTcpFlag.new('established')
21
+ @list = AceTcpFlagList.new
22
+ end
23
+
24
+ it 'should be size 0 when empty list' do
25
+ @list.size.should be_zero
26
+ end
27
+
28
+ it 'should count-up size when added AceTcpFlag objects' do
29
+ @list.push @f1
30
+ @list.size.should eq 1
31
+ @list.push @f2
32
+ @list.size.should eq 2
33
+ @list.push @f3
34
+ @list.size.should eq 3
35
+ @list.to_s.should be_aclstr('syn ack established')
36
+ end
37
+ end
38
+ end