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,272 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'forwardable'
4
+ require 'cisco_acl_intp/ace'
5
+
6
+ module CiscoAclIntp
7
+ # Single access-list container base
8
+ class SingleAclBase < AclContainerBase
9
+ extend Forwardable
10
+ include Enumerable
11
+
12
+ # @return [String] name ACL name,
13
+ # when numbered acl, /\d+/ string
14
+ attr_reader :name
15
+ # Some Enumerable included methods returns Array of ACE objects
16
+ # (e.g. sort),the returned Array was used as ACE object by
17
+ # overwrite accessor 'list'.
18
+ # @return [Array] list ACE object Array
19
+ attr_accessor :list
20
+ # @return [String, Symbol] acl_type ACL type
21
+ attr_reader :acl_type
22
+ # @return [String, Symbol] name_type ACL name type
23
+ attr_reader :name_type
24
+
25
+ def_delegators :@list, :each # for Enumerable
26
+ def_delegators :@list, :push, :pop, :shift, :unshift
27
+ def_delegators :@list, :size, :length
28
+
29
+ # Increment number of ACL sequence number
30
+ SEQ_NUM_DIV = 10
31
+
32
+ # Constructor
33
+ # @param [String] name ACL name
34
+ # @return [SingleAclBase]
35
+ def initialize(name)
36
+ @name = name
37
+ @list = []
38
+ @seq_number = 0
39
+
40
+ @acl_type = nil # :standard or :extended
41
+ @name_type = nil # :named or :numbered
42
+ end
43
+
44
+ # duplicate with list
45
+ # @param [Array<SingleAclBase>]
46
+ # @return [SingleAclBase]
47
+ def dup_with_list(list)
48
+ acl = dup
49
+ acl.list = list.dup
50
+ acl
51
+ end
52
+
53
+ # Add ACE to ACL (push with sequence number)
54
+ # @param [AceBase] ace ACE object
55
+ def add_entry(ace)
56
+ # 'ace' is AceBase Object
57
+ # it will be ExtendedAce/StandardAce/RemarkAce/EvaluateAce
58
+ ace.seq_number? ||
59
+ ace.seq_number = (@list.length + 1) * SEQ_NUM_DIV
60
+ @list.push ace
61
+ end
62
+
63
+ # Renumber ACL by list sequence
64
+ def renumber
65
+ # re-numbering seq_number of each entry
66
+ @list.reduce(SEQ_NUM_DIV) do |number, each|
67
+ each.seq_number = number
68
+ number + SEQ_NUM_DIV
69
+ end
70
+ end
71
+
72
+ # @return [Boolean]
73
+ def ==(other)
74
+ if @acl_type &&
75
+ @name_type &&
76
+ @acl_type == other.acl_type &&
77
+ @name_type == other.name_type
78
+ @list == other.list
79
+ end
80
+ end
81
+
82
+ # Search matched ACE from list
83
+ # @param [Hash] opts Options (target packet info)
84
+ # @option [String, Symbol] protocol L3/L4 protocol name
85
+ # (allows :tcp, :udp and :icmp)
86
+ # @option [String] src_ip Source IP Address
87
+ # @option [String] src_port Source Port
88
+ # @option [String] dst_ip Destination IP Address
89
+ # @option [String] dst_port Destination Port
90
+ # @return [AceBase] Matched ACE object or nil(not found)
91
+ # @raise [AclArgumentError]
92
+ def search_ace(opts)
93
+ @list.find { |each| each.matches?(opts) }
94
+ end
95
+ end
96
+
97
+ ############################################################
98
+
99
+ # Features for Extended ACL
100
+ module ExtAcl
101
+ ## TBD
102
+ ## does it have to raise error
103
+ ## if add_entry called with StandardAce?
104
+
105
+ # Generate a Extended ACE by parameters
106
+ # and Add it to ACL
107
+ # @param [Hash] opts Options to create {ExtendedAce}
108
+ def add_entry_by_params(opts)
109
+ ace = ExtendedAce.new opts
110
+ add_entry ace
111
+ end
112
+ end
113
+
114
+ # Features for Standard ACL
115
+ module StdAcl
116
+ ## TBD
117
+ ## does it have to raise error
118
+ ## if add_entry called with ExtendedAce?
119
+
120
+ # Generate a Standard ACE by parameters
121
+ # and Add it to ACL
122
+ # @param [Hash] opts Options to create {StandardAce}
123
+ def add_entry_by_params(opts)
124
+ ace = StandardAce.new opts
125
+ add_entry ace
126
+ end
127
+ end
128
+
129
+ ############################################################
130
+
131
+ # Named ACL container base
132
+ class NamedAcl < SingleAclBase
133
+ # Generate string for Cisco IOS access list
134
+ # @return [String]
135
+ def to_s
136
+ strings = [
137
+ sprintf(
138
+ '%s %s %s',
139
+ c_hdr('ip access-list'),
140
+ c_type(@acl_type),
141
+ c_name(@name)
142
+ )
143
+ ]
144
+ @list.each { | entry | strings.push entry.to_s }
145
+ strings.join("\n")
146
+ end
147
+ end
148
+
149
+ # Numbered ACL container base
150
+ class NumberedAcl < SingleAclBase
151
+ # @return [Integer] Access list number
152
+ attr_reader :number
153
+
154
+ # Constructor
155
+ # @param [String, Integer] name ACL number
156
+ # @raise [AclArgumentError]
157
+ # @return [NumberedAcl]
158
+ def initialize(name)
159
+ super
160
+
161
+ ## TBD
162
+ ## it ought to do something about assignment operator...
163
+ ## (attr_reader)
164
+
165
+ case name
166
+ when Fixnum
167
+ set_name_and_number(name.to_s, name)
168
+ when String
169
+ validate_name_by_string(name)
170
+ else
171
+ fail AclArgumentError, 'acl number error'
172
+ end
173
+ end
174
+
175
+ # Generate string for Cisco IOS access list
176
+ # @return [String]
177
+ def to_s
178
+ strings = []
179
+ @list.each do | entry |
180
+ strings.push sprintf(
181
+ '%s %s %s',
182
+ c_hdr('access-list'),
183
+ c_name(@name),
184
+ entry
185
+ )
186
+ end
187
+ strings.join("\n")
188
+ end
189
+
190
+ private
191
+
192
+ # validate instance variables
193
+ # @param [String] name ACL Name
194
+ def validate_name_by_string(name)
195
+ if name =~ /\A\d+\Z/
196
+ set_name_and_number(name, name.to_i)
197
+ else
198
+ fail AclArgumentError, 'acl number string is not integer'
199
+ end
200
+ end
201
+
202
+ # Set instance variables
203
+ def set_name_and_number(name, number)
204
+ @name = name
205
+ @number = number
206
+ end
207
+ end
208
+
209
+ ############################################################
210
+
211
+ # Named extended ACL container
212
+ class NamedExtAcl < NamedAcl
213
+ include ExtAcl
214
+
215
+ # Constructor
216
+ # @param [String] name ACL name
217
+ # @return [NamedExtAcl]
218
+ def initialize(name)
219
+ super
220
+ @name_type = :named
221
+ @acl_type = :extended
222
+ end
223
+ end
224
+
225
+ # Numbered extended ACL container
226
+ class NumberedExtAcl < NumberedAcl
227
+ include ExtAcl
228
+
229
+ # Constructor
230
+ # @param [String, Integer] name ACL name
231
+ # @return [NumberedExtAcl]
232
+ def initialize(name)
233
+ super
234
+ @name_type = :numbered
235
+ @acl_type = :extended
236
+ end
237
+ end
238
+
239
+ # Named standard ACL container
240
+ class NamedStdAcl < NamedAcl
241
+ include StdAcl
242
+
243
+ # Constructor
244
+ # @param [String] name ACL name
245
+ # @return [NamedStdAcl]
246
+ def initialize(name)
247
+ super
248
+ @name_type = :named
249
+ @acl_type = :standard
250
+ end
251
+ end
252
+
253
+ # Numbered standard ACL container
254
+ class NumberedStdAcl < NumberedAcl
255
+ include StdAcl
256
+
257
+ # Constructor
258
+ # @param [String, Integer] name ACL name
259
+ # @return [NumberedStdAcl]
260
+ def initialize(name)
261
+ super
262
+ @name_type = :numbered
263
+ @acl_type = :standard
264
+ end
265
+ end
266
+ end # module
267
+
268
+ ### Local variables:
269
+ ### mode: Ruby
270
+ ### coding: utf-8-unix
271
+ ### indent-tabs-mode: nil
272
+ ### End:
@@ -0,0 +1,111 @@
1
+ require 'term/ansicolor'
2
+
3
+ module CiscoAclIntp
4
+ # Standard Error Handler of CiscoAclParser
5
+ class AclError < StandardError; end
6
+
7
+ # Argument Error Handler of CiscoAclParser
8
+ class AclArgumentError < AclError; end
9
+
10
+ # Acl container common utility and status management
11
+ class AclContainerBase
12
+ include Term::ANSIColor
13
+
14
+ # color mode
15
+ @color = false ## as class-instance variable
16
+
17
+ # Enables coloring
18
+ def self.enable_color
19
+ @color = true
20
+ end
21
+
22
+ # Disables coloring
23
+ def self.disable_color
24
+ @color = false
25
+ end
26
+
27
+ # Generate string for Cisco IOS access list
28
+ # @abstract
29
+ # @return [String]
30
+ def to_s
31
+ fail AclError, 'Not overridden AclContainerBase::to_s'
32
+ end
33
+
34
+ private
35
+
36
+ # Generate string using colors
37
+ # @param [String] str String
38
+ # @param [Array<String>] pre_c Color attribute(s) (put before 'str')
39
+ # @return [String] Colored string (if enabled [@@color])
40
+ def self.c_str(str, *pre_c)
41
+ if pre_c && @color
42
+ pre_c.concat [str, Term::ANSIColor.clear]
43
+ pre_c.join
44
+ else
45
+ str
46
+ end
47
+ end
48
+
49
+ # Access list header
50
+ # @param [String] str String
51
+ # @return [String] Colored string
52
+ def c_hdr(str)
53
+ AclContainerBase.c_str str, on_blue
54
+ end
55
+
56
+ # Named access list type
57
+ # @param [String] str String
58
+ # @return [String] Colored string
59
+ def c_type(str)
60
+ AclContainerBase.c_str str, underline
61
+ end
62
+
63
+ # Action
64
+ # @param [String] str String
65
+ # @return [String] Colored string
66
+ def c_act(str)
67
+ AclContainerBase.c_str str, intense_magenta
68
+ end
69
+
70
+ # User defined name/number
71
+ # @param [String] str String
72
+ # @return [String] Colored string
73
+ def c_name(str)
74
+ AclContainerBase.c_str str, bold
75
+ end
76
+
77
+ # Remark
78
+ # @param [String] str String
79
+ # @return [String] Colored string
80
+ def c_rmk(str)
81
+ AclContainerBase.c_str str, blink
82
+ end
83
+
84
+ # IP address
85
+ # @param [String] str String
86
+ # @return [String] Colored string
87
+ def c_ip(str)
88
+ AclContainerBase.c_str str, green, underline
89
+ end
90
+
91
+ # Wildcard mask
92
+ # @param [String] str String
93
+ # @return [String] Colored string
94
+ def c_mask(str)
95
+ AclContainerBase.c_str str, yellow
96
+ end
97
+
98
+ # Protocol and port
99
+ # @param [String] str String
100
+ # @return [String] Colored string
101
+ def c_pp(str)
102
+ AclContainerBase.c_str str, cyan
103
+ end
104
+ end
105
+ end
106
+
107
+ ### Local variables:
108
+ ### mode: Ruby
109
+ ### coding: utf-8-unix
110
+ ### indent-tabs-mode: nil
111
+ ### End: