cisco_acl_intp 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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