cisco_acl_intp 0.0.3 → 0.0.4
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.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.rubocop.yml +2 -2
- data/.travis.yml +4 -2
- data/Gemfile +7 -6
- data/README.md +23 -18
- data/Rakefile +11 -13
- data/cisco_acl_intp.gemspec +7 -7
- data/lib/cisco_acl_intp/acc.rb +111 -0
- data/lib/cisco_acl_intp/{ace.rb → ace_base.rb} +9 -8
- data/lib/cisco_acl_intp/{extended_ace.rb → ace_extended.rb} +8 -10
- data/lib/cisco_acl_intp/{standard_ace.rb → ace_standard.rb} +5 -5
- data/lib/cisco_acl_intp/acespec_base.rb +15 -0
- data/lib/cisco_acl_intp/{ace_ip.rb → acespec_ip.rb} +14 -22
- data/lib/cisco_acl_intp/{ace_other_qualifiers.rb → acespec_other_qualifiers.rb} +7 -7
- data/lib/cisco_acl_intp/{ace_port.rb → acespec_port.rb} +10 -13
- data/lib/cisco_acl_intp/{ace_port_opr.rb → acespec_port_opr.rb} +75 -73
- data/lib/cisco_acl_intp/{ace_port_opr_base.rb → acespec_port_opr_base.rb} +49 -34
- data/lib/cisco_acl_intp/{ace_proto.rb → acespec_proto.rb} +4 -4
- data/lib/cisco_acl_intp/{ace_proto_base.rb → acespec_proto_base.rb} +8 -8
- data/lib/cisco_acl_intp/{ace_srcdst.rb → acespec_srcdst.rb} +9 -8
- data/lib/cisco_acl_intp/{ace_tcp_flags.rb → acespec_tcp_flags.rb} +4 -4
- data/lib/cisco_acl_intp/acl.rb +1 -1
- data/lib/cisco_acl_intp/acl_base.rb +108 -80
- data/lib/cisco_acl_intp/{mono_function_acl.rb → acl_category_base.rb} +5 -5
- data/lib/cisco_acl_intp/acl_utils.rb +1 -1
- data/lib/cisco_acl_intp/parser.rb +388 -406
- data/lib/cisco_acl_intp/parser.ry +8 -3
- data/lib/cisco_acl_intp/parser_api.rb +4 -4
- data/lib/cisco_acl_intp/scanner.rb +8 -10
- data/lib/cisco_acl_intp/scanner_special_token_handler.rb +3 -3
- data/lib/cisco_acl_intp/version.rb +1 -1
- data/spec/cisco_acl_intp/{extended_ace_spec.rb → ace_extended_spec.rb} +157 -128
- data/spec/cisco_acl_intp/ace_spec.rb +21 -19
- data/spec/cisco_acl_intp/{standard_ace_spec.rb → ace_standard_spec.rb} +7 -11
- data/spec/cisco_acl_intp/{ace_ip_spec.rb → acespec_ip_spec.rb} +34 -34
- data/spec/cisco_acl_intp/{ace_other_qualifier_spec.rb → acespec_other_qualifier_spec.rb} +18 -18
- data/spec/cisco_acl_intp/acespec_port_operator_spec.rb +331 -0
- data/spec/cisco_acl_intp/{ace_port_spec.rb → acespec_port_spec.rb} +33 -33
- data/spec/cisco_acl_intp/{ace_proto_spec.rb → acespec_proto_spec.rb} +61 -61
- data/spec/cisco_acl_intp/{ace_srcdst_spec.rb → acespec_srcdst_spec.rb} +113 -54
- data/spec/cisco_acl_intp/{ace_tcp_flags_spec.rb → acespec_tcp_flags_spec.rb} +10 -10
- data/spec/cisco_acl_intp/acl_base_spec.rb +14 -12
- data/spec/cisco_acl_intp/{extended_acl_spec.rb → acl_extended_spec.rb} +28 -28
- data/spec/cisco_acl_intp/{standard_acl_spec.rb → acl_standard_spec.rb} +24 -23
- data/spec/cisco_acl_intp/cisco_acl_intp_spec.rb +1 -1
- data/spec/cisco_acl_intp/parser_spec.rb +12 -12
- data/spec/cisco_acl_intp/scanner_spec.rb +31 -36
- data/spec/parser_fullfill_patterns.rb +6 -7
- data/spec/spec_helper.rb +6 -6
- data/tools/check_acl.rb +1 -1
- metadata +60 -59
- data/lib/cisco_acl_intp/single_acl_base.rb +0 -137
- data/spec/cisco_acl_intp/ace_port_operator_spec.rb +0 -340
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e5041a1b8d078394186621c71ed182b1257b33c8
|
4
|
+
data.tar.gz: f2fc4398b666c6badaa73abce0169b9a624720c0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 789fc6c612a09c44ac2f81eaa13ba1d54196ac0ea5a44db071f9cc8c78db185d31405bb733effc58061541a94f80f9b6e2b336361c456e16200ab6d68b408aac
|
7
|
+
data.tar.gz: dc1964628b26a866671093a3a593a035f60e5852a2268b5a564da717a7afd8166d5ea50964dae122ec9c15c41737ed387e6e066defb703400100c421193c688f
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -7,12 +7,13 @@ gemspec
|
|
7
7
|
|
8
8
|
group :development, :test do
|
9
9
|
gem 'coveralls', require: false
|
10
|
-
gem 'racc', '~> 1.4.
|
11
|
-
gem 'rake', '~>
|
12
|
-
gem 'reek', '~>
|
13
|
-
gem 'rspec', '~>
|
14
|
-
gem '
|
15
|
-
gem '
|
10
|
+
gem 'racc', '~> 1.4.14'
|
11
|
+
gem 'rake', '~> 11.1.2'
|
12
|
+
gem 'reek', '~> 4.0.0'
|
13
|
+
gem 'rspec', '~> 3.4.0'
|
14
|
+
gem 'rspec-core', '~> 3.4.4'
|
15
|
+
gem 'rubocop', '~> 0.39.0' if RUBY_VERSION >= '1.9.0'
|
16
|
+
gem 'simplecov', '~> 0.11.2' if RUBY_VERSION >= '1.9.0'
|
16
17
|
gem 'yard', '~> 0.8.7'
|
17
18
|
end
|
18
19
|
|
data/README.md
CHANGED
@@ -13,7 +13,7 @@ CiscoAclIntp can...
|
|
13
13
|
* parse ACL types of below
|
14
14
|
* Numbered ACL (standard/extended)
|
15
15
|
* Named ACL (standard/extended)
|
16
|
-
* parse almost ACL
|
16
|
+
* parse almost ACL syntax.
|
17
17
|
* basic IPv4 acl (protocol `ip`/`tcp`/`udp`)
|
18
18
|
|
19
19
|
CiscoAclIntp *CANNOT*...
|
@@ -25,8 +25,8 @@ CiscoAclIntp *CANNOT*...
|
|
25
25
|
|
26
26
|
Supports
|
27
27
|
|
28
|
-
* Ruby/
|
29
|
-
Ruby/2.0.0 and *NOT*
|
28
|
+
* Ruby/2.0.0 or later. (Development and testing is being conducted in
|
29
|
+
Ruby/2.0.0 and 2.1.1. It does *NOT* support Ruby/1.8.x and 1.9.x)
|
30
30
|
* Racc/1.4.9 or later.
|
31
31
|
|
32
32
|
## Installation
|
@@ -211,21 +211,26 @@ See `NetAddr::CIDR#matches?` for CIDR subnet operation and
|
|
211
211
|
|
212
212
|
### Port Operation
|
213
213
|
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
|
221
|
-
|
222
|
-
|
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
214
|
+
In below table, "P" column is the argument of `#contains?`,
|
215
|
+
and operators at table header are receiver of `#contains?`.
|
216
|
+
The table shows case patterns with `port_X.contains?(port_P)`.
|
217
|
+
(`port_X` is a instance of `AceUnaryOpBase`
|
218
|
+
and it has port match operator and port number information.)
|
219
|
+
|
220
|
+
| P | strict_any | any | eq X | neq X | lt X | gt X | range X1 X2 |
|
221
|
+
|------------|------------|------|--------|--------|--------|--------|---------------|
|
222
|
+
| strict_any | true | true | false | false | false | false | false |
|
223
|
+
| any | true | true | false | false | false | false | X1=0 and X2=65535 |
|
224
|
+
| eq P | false | true | P = X | P != X | P < X | X < P | X1 <= P <= X2 |
|
225
|
+
| neq P | false | true | false | P = X | P = X = 65535 | P = X = 0 | (P=X1=0 and X2=65535) or (X1=0 and P=X2=65535) |
|
226
|
+
| lt P | false | true | false | P <= X | P <= X | false | X1 = 0 and P < X2 |
|
227
|
+
| gt P | false | true | false | X <= P | false | X <= P | X1 < P and X2 = 65535 |
|
228
|
+
| range P1 P2| false | true | false | P2 < X or X < P1 | P2 < X | X < P1 | X1 <= P1 and P2 <= X2 |
|
229
|
+
|
230
|
+
|
231
|
+
For example,`[gt X].contains?([eq P])` will be `true` if port `X < P`.
|
232
|
+
It means the ACL `[gt X]` permit (or deny) the flow `[eq P]`.
|
233
|
+
You can search ACEs which matches a flows specified by search conditions.
|
229
234
|
|
230
235
|
`:strict_any` is a special operator to search acl, the operator is
|
231
236
|
matches only `:any` operator.
|
data/Rakefile
CHANGED
@@ -7,16 +7,16 @@ require 'yard'
|
|
7
7
|
require 'yard/rake/yardoc_task'
|
8
8
|
require 'reek/rake/task'
|
9
9
|
|
10
|
-
LIB_DIR = './lib'
|
11
|
-
PACKAGE_NAME = 'cisco_acl_intp'
|
12
|
-
SPEC_ORIG_DIR = 'spec'
|
13
|
-
SPEC_DIR = "#{SPEC_ORIG_DIR}/#{PACKAGE_NAME}/"
|
14
|
-
SPEC_DATA_DIR = "#{SPEC_ORIG_DIR}/data"
|
15
|
-
CLASS_DIR = "#{LIB_DIR}/#{PACKAGE_NAME}"
|
16
|
-
CLASS_GRAPH_DOT = "doc/#{PACKAGE_NAME}.dot"
|
17
|
-
CLASS_GRAPH_PNG = "doc/#{PACKAGE_NAME}.png"
|
18
|
-
PARSER_RACC = "#{CLASS_DIR}/parser.ry"
|
19
|
-
PARSER_RUBY = "#{CLASS_DIR}/parser.rb"
|
10
|
+
LIB_DIR = './lib'.freeze
|
11
|
+
PACKAGE_NAME = 'cisco_acl_intp'.freeze
|
12
|
+
SPEC_ORIG_DIR = 'spec'.freeze
|
13
|
+
SPEC_DIR = "#{SPEC_ORIG_DIR}/#{PACKAGE_NAME}/".freeze
|
14
|
+
SPEC_DATA_DIR = "#{SPEC_ORIG_DIR}/data".freeze
|
15
|
+
CLASS_DIR = "#{LIB_DIR}/#{PACKAGE_NAME}".freeze
|
16
|
+
CLASS_GRAPH_DOT = "doc/#{PACKAGE_NAME}.dot".freeze
|
17
|
+
CLASS_GRAPH_PNG = "doc/#{PACKAGE_NAME}.png".freeze
|
18
|
+
PARSER_RACC = "#{CLASS_DIR}/parser.ry".freeze
|
19
|
+
PARSER_RUBY = "#{CLASS_DIR}/parser.rb".freeze
|
20
20
|
|
21
21
|
CLEAN.include(
|
22
22
|
"#{SPEC_DATA_DIR}/*.*",
|
@@ -67,8 +67,6 @@ end
|
|
67
67
|
Reek::Rake::Task.new do |t|
|
68
68
|
t.fail_on_error = false
|
69
69
|
t.verbose = false
|
70
|
-
t.ruby_opts = ['-rubygems']
|
71
|
-
t.reek_opts = '--quiet'
|
72
70
|
t.source_files = FileList["#{LIB_DIR}/**/*.rb"].delete_if do |f|
|
73
71
|
f =~ /parser.rb/
|
74
72
|
end
|
@@ -77,7 +75,7 @@ end
|
|
77
75
|
if RUBY_VERSION >= '1.9.0'
|
78
76
|
task quality: :rubocop
|
79
77
|
require 'rubocop/rake_task'
|
80
|
-
|
78
|
+
RuboCop::RakeTask.new do |task|
|
81
79
|
# file patterns in ".rubocop.yml"
|
82
80
|
task.fail_on_error = false
|
83
81
|
end
|
data/cisco_acl_intp.gemspec
CHANGED
@@ -9,19 +9,19 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.version = CiscoAclIntp::VERSION
|
10
10
|
spec.authors = ['stereocat']
|
11
11
|
spec.email = ['stereocat@gmail.com']
|
12
|
-
spec.description =
|
13
|
-
spec.summary =
|
12
|
+
spec.description = 'Cisco ACL Interpreter'
|
13
|
+
spec.summary = 'Cisco IOS Access Control List Interpreter'
|
14
14
|
spec.homepage = 'https://github.com/stereocat/cisco_acl_intp'
|
15
15
|
spec.license = 'MIT'
|
16
16
|
|
17
17
|
spec.files = `git ls-files`.split("\n")
|
18
|
-
spec.executables = spec.files.grep(
|
19
|
-
spec.test_files = spec.files.grep(
|
18
|
+
spec.executables = spec.files.grep(%r{^bin\/}) { |f| File.basename(f) }
|
19
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)\/})
|
20
20
|
spec.require_paths = ['lib']
|
21
21
|
|
22
|
-
spec.add_runtime_dependency 'netaddr', '~> 1.5.
|
23
|
-
spec.add_runtime_dependency 'term-ansicolor', '~> 1.3.
|
24
|
-
spec.add_development_dependency 'bundler', '~> 1.
|
22
|
+
spec.add_runtime_dependency 'netaddr', '~> 1.5.1'
|
23
|
+
spec.add_runtime_dependency 'term-ansicolor', '~> 1.3.2'
|
24
|
+
spec.add_development_dependency 'bundler', '~> 1.1l.2'
|
25
25
|
end
|
26
26
|
|
27
27
|
### Local variables:
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'term/ansicolor'
|
4
|
+
|
5
|
+
module CiscoAclIntp
|
6
|
+
# Standard Error Handler of CiscoAclParser
|
7
|
+
class AclError < StandardError; end
|
8
|
+
|
9
|
+
# Argument Error Handler of CiscoAclParser
|
10
|
+
class AclArgumentError < AclError; end
|
11
|
+
|
12
|
+
# AccessControlContainer: abstract class of whole elements of ACL.
|
13
|
+
# It contains utility functions to stringify element and management status.
|
14
|
+
class AccessControlContainer
|
15
|
+
class << self
|
16
|
+
# Color mode: defined as a class instance variable
|
17
|
+
attr_accessor :color_mode
|
18
|
+
end
|
19
|
+
|
20
|
+
# Disables coloring
|
21
|
+
def self.disable_color
|
22
|
+
@color_mode = :none
|
23
|
+
end
|
24
|
+
|
25
|
+
# Generate string for Cisco IOS access list
|
26
|
+
# @abstract
|
27
|
+
# @return [String]
|
28
|
+
def to_s
|
29
|
+
raise AclError, 'Not overridden AclContainerBase::to_s'
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
# Table of ACL Tag color codes for terminal
|
35
|
+
TERM_COLOR_TABLE = {
|
36
|
+
header: Term::ANSIColor.on_blue,
|
37
|
+
type: Term::ANSIColor.underline,
|
38
|
+
action: Term::ANSIColor.intense_magenta,
|
39
|
+
name: Term::ANSIColor.bold,
|
40
|
+
remark: Term::ANSIColor.blink,
|
41
|
+
ip: [Term::ANSIColor.green, Term::ANSIColor.underline].join,
|
42
|
+
mask: Term::ANSIColor.yellow,
|
43
|
+
protocol: Term::ANSIColor.cyan,
|
44
|
+
port: Term::ANSIColor.cyan,
|
45
|
+
other_qualifier: Term::ANSIColor.green,
|
46
|
+
error: [Term::ANSIColor.red, Term::ANSIColor.bold].join
|
47
|
+
}.freeze
|
48
|
+
|
49
|
+
# Generate header of ACL tag
|
50
|
+
# @param [Symbol] tag Tag symbol.
|
51
|
+
# @return [String] Tagged string.
|
52
|
+
def generate_tag_header(tag)
|
53
|
+
case AccessControlContainer.color_mode
|
54
|
+
when :term
|
55
|
+
TERM_COLOR_TABLE[tag]
|
56
|
+
when :html
|
57
|
+
%(<span class="acltag_#{tag}">)
|
58
|
+
else
|
59
|
+
''
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Generate footer of ACL tag
|
64
|
+
# @return [String] Tagged string.
|
65
|
+
def generate_tag_footer
|
66
|
+
case AccessControlContainer.color_mode
|
67
|
+
when :term
|
68
|
+
Term::ANSIColor.clear
|
69
|
+
when :html
|
70
|
+
'</span>'
|
71
|
+
else
|
72
|
+
''
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# Generate tagged ACL string.
|
77
|
+
# @param [Symbol] tag Tag symbol.
|
78
|
+
# @param [Array] args Array of argments.
|
79
|
+
# @return [String] Tagged string.
|
80
|
+
def generate_tagged_str(tag, *args)
|
81
|
+
tag_head = generate_tag_header(tag)
|
82
|
+
tag_body = args.join
|
83
|
+
tag_foot = generate_tag_footer
|
84
|
+
[tag_head, tag_body, tag_foot].join
|
85
|
+
end
|
86
|
+
|
87
|
+
# acl string clean-up
|
88
|
+
# @param [String] str ACL string.
|
89
|
+
# @return [String]
|
90
|
+
def clean_acl_string(str)
|
91
|
+
str.strip.gsub(/\s+/, ' ')
|
92
|
+
end
|
93
|
+
|
94
|
+
# Generate tagging method dynamically.
|
95
|
+
# @raise [NoMethodError]
|
96
|
+
def method_missing(name, *args)
|
97
|
+
name.to_s =~ /^tag_(.+)$/ && tag = Regexp.last_match(1).intern
|
98
|
+
if TERM_COLOR_TABLE.key?(tag)
|
99
|
+
generate_tagged_str(tag, *args)
|
100
|
+
else
|
101
|
+
super
|
102
|
+
end
|
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:
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
require 'cisco_acl_intp/
|
2
|
+
require 'cisco_acl_intp/acespec_srcdst'
|
3
3
|
|
4
4
|
module CiscoAclIntp
|
5
|
-
#
|
6
|
-
|
5
|
+
# AceBase: Base class of ACE(Access Control Entry).
|
6
|
+
# ACE is composed of each types of AceSpecs.
|
7
|
+
class AceBase < AccessControlContainer
|
7
8
|
include Comparable
|
8
9
|
|
9
10
|
# @param [Integer] value ACL sequence number
|
@@ -87,9 +88,9 @@ module CiscoAclIntp
|
|
87
88
|
end
|
88
89
|
|
89
90
|
# Search matched ACE
|
90
|
-
# @param [Hash]
|
91
|
+
# @param [Hash] _opts Options
|
91
92
|
# return [Boolean] false, Remark does not match anithyng.
|
92
|
-
def contains?(
|
93
|
+
def contains?(_opts = nil)
|
93
94
|
false
|
94
95
|
end
|
95
96
|
end
|
@@ -119,7 +120,7 @@ module CiscoAclIntp
|
|
119
120
|
if @options.key?(:recursive_name)
|
120
121
|
@options[:recursive_name]
|
121
122
|
else
|
122
|
-
|
123
|
+
raise AclArgumentError, 'name not specified'
|
123
124
|
end
|
124
125
|
end
|
125
126
|
|
@@ -136,10 +137,10 @@ module CiscoAclIntp
|
|
136
137
|
end
|
137
138
|
|
138
139
|
# Search matched ACE
|
139
|
-
# @param [Hash]
|
140
|
+
# @param [Hash] _opts Options
|
140
141
|
# return [Boolean]
|
141
142
|
# @todo for Recursive name matching is not implemented yet
|
142
|
-
def contains?(
|
143
|
+
def contains?(_opts = nil)
|
143
144
|
false
|
144
145
|
end
|
145
146
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
require 'cisco_acl_intp/
|
2
|
+
require 'cisco_acl_intp/ace_standard'
|
3
3
|
|
4
4
|
module CiscoAclIntp
|
5
5
|
# ACE for extended access list
|
@@ -79,7 +79,7 @@ module CiscoAclIntp
|
|
79
79
|
@dst_spec,
|
80
80
|
@tcp_flags,
|
81
81
|
@tcp_other_qualifiers
|
82
|
-
|
82
|
+
)
|
83
83
|
end
|
84
84
|
|
85
85
|
# Search matched ACE
|
@@ -107,7 +107,7 @@ module CiscoAclIntp
|
|
107
107
|
AceIpProtoSpec.new(protocol)
|
108
108
|
end
|
109
109
|
else
|
110
|
-
|
110
|
+
raise AclArgumentError, 'Not specified IP protocol'
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
@@ -123,21 +123,19 @@ module CiscoAclIntp
|
|
123
123
|
when AceSrcDstSpec
|
124
124
|
dst
|
125
125
|
else
|
126
|
-
|
126
|
+
raise AclArgumentError, 'Dst spec: unknown class'
|
127
127
|
end
|
128
128
|
else
|
129
|
-
|
129
|
+
raise AclArgumentError, 'Not specified dst spec'
|
130
130
|
end
|
131
131
|
end
|
132
132
|
|
133
133
|
# Set instance variables
|
134
134
|
# @return [AceOtherQualifierList]
|
135
135
|
def define_tcp_flags
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
nil
|
140
|
-
end
|
136
|
+
return unless @protocol.name == 'tcp' &&
|
137
|
+
@options.key?(:tcp_flags_qualifier)
|
138
|
+
@options[:tcp_flags_qualifier]
|
141
139
|
end
|
142
140
|
end
|
143
141
|
end # module
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
require 'cisco_acl_intp/
|
2
|
+
require 'cisco_acl_intp/ace_base'
|
3
3
|
|
4
4
|
module CiscoAclIntp
|
5
5
|
# ACE for standard access list
|
@@ -53,7 +53,7 @@ module CiscoAclIntp
|
|
53
53
|
# @param [StandardAce] other Target ACE
|
54
54
|
# @return [Boolean] Matched or not
|
55
55
|
def contains?(other)
|
56
|
-
other.
|
56
|
+
other.is_a?(StandardAce) &&
|
57
57
|
@src_spec.contains?(other.src_spec)
|
58
58
|
end
|
59
59
|
|
@@ -66,7 +66,7 @@ module CiscoAclIntp
|
|
66
66
|
if @options.key?(:action)
|
67
67
|
@options[:action]
|
68
68
|
else
|
69
|
-
|
69
|
+
raise AclArgumentError, 'Not specified action'
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
@@ -82,10 +82,10 @@ module CiscoAclIntp
|
|
82
82
|
when AceSrcDstSpec
|
83
83
|
src
|
84
84
|
else
|
85
|
-
|
85
|
+
raise AclArgumentError, 'src spec: unknown class'
|
86
86
|
end
|
87
87
|
else
|
88
|
-
|
88
|
+
raise AclArgumentError, 'Not specified src spec'
|
89
89
|
end
|
90
90
|
end
|
91
91
|
|