ios_parser 0.3.0 → 0.3.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -9
- data/Guardfile +5 -0
- data/ext/ios_parser/c_lexer/lexer.c +12 -4
- data/fixtures/complex_banner.txt +24 -0
- data/ios_parser.gemspec +1 -0
- data/lib/ios_parser/lexer.rb +21 -5
- data/lib/ios_parser/version.rb +1 -1
- data/spec/lib/ios_parser/ios_spec.rb +5 -1
- data/spec/lib/ios_parser/lexer_spec.rb +38 -0
- data/spec/spec_helper.rb +4 -0
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9c3428424b6fff808e5dcd94412c3d1e0d17ada
|
4
|
+
data.tar.gz: a5cda3521efcc1c2f7f2826fb9985b9be384a8f1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aaeda92fb563f4416c18fc26e2118e30c90f9dc45e7e9da9559c7f84a6adf46e9c57ac3e0b9ffe0adfca38cef089d20bcb20cd0e6e4bebdf5afa63d3f939d598
|
7
|
+
data.tar.gz: 881b58760c2426e08c49e5cad4db0db21e1fb95f14ddeb31ea465853cd81aa14fca33c5a1d04ec0ee2396b9fec99e27022156b693998eeb666bc664bc54b55af
|
data/CHANGELOG.md
CHANGED
@@ -1,14 +1,10 @@
|
|
1
|
-
## 0.
|
2
|
-
Bugfixes:
|
3
|
-
|
4
|
-
- Parser throws `ArgumentError` when input is not a string - [PR#1](https://github.rackspace.com/backbone/ios_parser/pull/1)
|
5
|
-
|
6
|
-
## 0.1.0 (2015-02-17)
|
1
|
+
## 0.3.1 (2016-03-07)
|
7
2
|
|
8
3
|
Bugfixes:
|
9
4
|
|
10
|
-
-
|
5
|
+
- allow banners to contain the terminating character under some circumstances
|
6
|
+
- process `#` as a comment-leader only if no non-whitespace character precedes it
|
11
7
|
|
12
|
-
|
8
|
+
## 0.3.0 (2016-03-04)
|
13
9
|
|
14
|
-
-
|
10
|
+
- Initial public release
|
data/Guardfile
CHANGED
@@ -1,7 +1,12 @@
|
|
1
|
+
guard :rake, task: 'compile' do
|
2
|
+
watch(%r{^ext/(.+)\.[ch]$})
|
3
|
+
end
|
4
|
+
|
1
5
|
guard :rspec, cmd: 'bundle exec rspec --color --fail-fast' do
|
2
6
|
watch(%r{^spec/.+_spec\.rb$}) { |m| m }
|
3
7
|
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
4
8
|
watch('spec/spec_helper.rb') { 'spec' }
|
9
|
+
watch(%r{^ext/(.+)\.[ch]$}) { 'spec' }
|
5
10
|
end
|
6
11
|
|
7
12
|
guard :rubocop, cli: '-D -a' do
|
@@ -32,15 +32,16 @@ typedef struct LexInfo LexInfo;
|
|
32
32
|
|
33
33
|
#define IS_SPACE(C) C == ' ' || C == '\t' || C == '\r'
|
34
34
|
#define IS_NEWLINE(C) C == '\n'
|
35
|
-
#define IS_COMMENT(C) C == '
|
35
|
+
#define IS_COMMENT(C) C == '!'
|
36
36
|
#define IS_DIGIT(C) '0' <= C && C <= '9'
|
37
37
|
#define IS_DOT(C) C == '.'
|
38
38
|
#define IS_DECIMAL(C) IS_DIGIT(C) || IS_DOT(C)
|
39
39
|
#define IS_LETTER(C) 'a' <= C && C <= 'z' || 'A' <= C && C <= 'Z'
|
40
|
-
#define IS_PUNCT(C) strchr("-+$:/,()|*#=<>!\"\\&@;%~{}'\"?[]_
|
40
|
+
#define IS_PUNCT(C) strchr("-+$:/,()|*#=<>!\"\\&@;%~{}'\"?[]_^`", C)
|
41
41
|
#define IS_WORD(C) IS_DECIMAL(C) || IS_LETTER(C) || IS_PUNCT(C)
|
42
42
|
#define IS_LEAD_ZERO(C) C == '0'
|
43
43
|
#define IS_QUOTE(C) C == '"' || C == '\''
|
44
|
+
#define IS_LEAD_COMMENT(C) C == '#' || C == '!'
|
44
45
|
|
45
46
|
#define CURRENT_CHAR(LEX) LEX->text[LEX->pos]
|
46
47
|
#define TOKEN_EMPTY(LEX) LEX->token_length <= 0
|
@@ -302,7 +303,9 @@ static void start_certificate(LexInfo *lex) {
|
|
302
303
|
static void process_banner(LexInfo *lex) {
|
303
304
|
char c = CURRENT_CHAR(lex);
|
304
305
|
|
305
|
-
if (c == lex->banner_delimiter
|
306
|
+
if (c == lex->banner_delimiter &&
|
307
|
+
(0 < lex->pos && '\n' == lex->text[lex->pos - 1] ||
|
308
|
+
'\n' == lex->text[lex->pos + 1])) {
|
306
309
|
lex->token_length++;
|
307
310
|
delimit(lex);
|
308
311
|
lex->token_start = lex->pos;
|
@@ -316,6 +319,7 @@ static void process_banner(LexInfo *lex) {
|
|
316
319
|
static void start_banner(LexInfo *lex) {
|
317
320
|
lex->banner_delimiter = CURRENT_CHAR(lex);
|
318
321
|
ADD_TOKEN(lex, ID2SYM(rb_intern("BANNER_BEGIN")));
|
322
|
+
if ('\n' == lex->text[lex->pos + 2]) lex->pos++;
|
319
323
|
}
|
320
324
|
|
321
325
|
static void process_start_of_line(LexInfo *lex) {
|
@@ -339,7 +343,11 @@ static void process_start_of_line(LexInfo *lex) {
|
|
339
343
|
}
|
340
344
|
}
|
341
345
|
|
342
|
-
|
346
|
+
if (IS_LEAD_COMMENT(c)) {
|
347
|
+
lex->token_state = LEX_STATE_COMMENT;
|
348
|
+
} else {
|
349
|
+
process_root(lex);
|
350
|
+
}
|
343
351
|
}
|
344
352
|
|
345
353
|
static void process_root(LexInfo *lex) {
|
@@ -0,0 +1,24 @@
|
|
1
|
+
banner exec ^C
|
2
|
+
|
3
|
+
/ /
|
4
|
+
(\/_//`)
|
5
|
+
/ '/
|
6
|
+
0 0 \
|
7
|
+
/ \
|
8
|
+
/ __/ \
|
9
|
+
/, _/ \ \_
|
10
|
+
`-./ ) | ~^~^~^~^~^~^~^~\~.
|
11
|
+
( / \_}
|
12
|
+
| / |
|
13
|
+
; | \ /
|
14
|
+
\/ ,/ \ |
|
15
|
+
/ /~~|~|~~~~~~|~|\ |
|
16
|
+
/ / | | | | `\ \
|
17
|
+
/ / | | | | \ \
|
18
|
+
/ ( | | | | \ \
|
19
|
+
jgs /,_) /__) /__) /,_/
|
20
|
+
'''''"""""'''""""""'''""""""''"""""'''''
|
21
|
+
|
22
|
+
Welcome to the Goat Rodeo!!
|
23
|
+
|
24
|
+
^C
|
data/ios_parser.gemspec
CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.add_development_dependency 'rspec', '~>3.2'
|
19
19
|
s.add_development_dependency 'rubocop', '~>0.37'
|
20
20
|
s.add_development_dependency 'guard', '~>2.0'
|
21
|
+
s.add_development_dependency 'guard-rake', '~>1.0'
|
21
22
|
s.add_development_dependency 'guard-rspec', '~>4.5'
|
22
23
|
s.add_development_dependency 'guard-rubocop', '~>1.2'
|
23
24
|
s.add_development_dependency 'rake-compiler', '~>0.9'
|
data/lib/ios_parser/lexer.rb
CHANGED
@@ -15,7 +15,7 @@ module IOSParser
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def call(input_text)
|
18
|
-
|
18
|
+
@text = input_text
|
19
19
|
|
20
20
|
input_text.each_char.with_index do |c, i|
|
21
21
|
@this_char = i
|
@@ -50,6 +50,14 @@ module IOSParser
|
|
50
50
|
raise LexError, "Unknown character #{char.inspect}"
|
51
51
|
end
|
52
52
|
|
53
|
+
def root_line_start
|
54
|
+
if lead_comment?
|
55
|
+
comment
|
56
|
+
else
|
57
|
+
root
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
53
61
|
def make_token(value, pos: nil)
|
54
62
|
pos ||= @token_start || @this_char
|
55
63
|
@token_start = nil
|
@@ -63,6 +71,10 @@ module IOSParser
|
|
63
71
|
end
|
64
72
|
|
65
73
|
def comment?
|
74
|
+
char == '!'
|
75
|
+
end
|
76
|
+
|
77
|
+
def lead_comment?
|
66
78
|
char == '#' || char == '!'
|
67
79
|
end
|
68
80
|
|
@@ -78,7 +90,12 @@ module IOSParser
|
|
78
90
|
end
|
79
91
|
|
80
92
|
def banner
|
81
|
-
char == @banner_delimiter
|
93
|
+
if char == @banner_delimiter && (@text[@this_char - 1] == "\n" ||
|
94
|
+
@text[@this_char + 1] == "\n")
|
95
|
+
banner_end
|
96
|
+
else
|
97
|
+
token << char
|
98
|
+
end
|
82
99
|
end
|
83
100
|
|
84
101
|
def banner_end
|
@@ -91,7 +108,6 @@ module IOSParser
|
|
91
108
|
def banner_end_clean_token
|
92
109
|
token.slice!(0) if token[0] == 'C'
|
93
110
|
token.slice!(0) if ["\n", ' '].include?(token[0])
|
94
|
-
token.chomp!("\n")
|
95
111
|
end
|
96
112
|
|
97
113
|
def scrub_banner_garbage
|
@@ -200,7 +216,7 @@ module IOSParser
|
|
200
216
|
('A'..'Z').cover?(char) ||
|
201
217
|
['-', '+', '$', ':', '/', ',', '(', ')', '|', '*', '#', '=', '<', '>',
|
202
218
|
'!', '"', '&', '@', ';', '%', '~', '{', '}', "'", '?', '[', ']', '_',
|
203
|
-
'^', '\\'].include?(char)
|
219
|
+
'^', '\\', '`'].include?(char)
|
204
220
|
end
|
205
221
|
|
206
222
|
def space
|
@@ -246,7 +262,7 @@ module IOSParser
|
|
246
262
|
self.indent += 1
|
247
263
|
else
|
248
264
|
update_indentation
|
249
|
-
|
265
|
+
root_line_start
|
250
266
|
end
|
251
267
|
end
|
252
268
|
|
data/lib/ios_parser/version.rb
CHANGED
@@ -190,10 +190,14 @@ sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
|
190
190
|
|
191
191
|
|
192
192
|
END
|
193
|
-
banner_command = "banner exec ^C#{banner_text}^C\n"
|
193
|
+
banner_command = "banner exec ^C\n#{banner_text}^C\n"
|
194
194
|
|
195
195
|
result = klass.new.call(banner_command)
|
196
196
|
expect(result[0].args[2]).to eq banner_text
|
197
|
+
|
198
|
+
pure_result = klass.new(lexer: IOSParser::PureLexer.new)
|
199
|
+
.call(banner_command)
|
200
|
+
expect(pure_result[0].args[2]).to eq banner_text
|
197
201
|
end
|
198
202
|
|
199
203
|
it('parses a crypto trustpoint section') do
|
@@ -111,6 +111,20 @@ END
|
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
114
|
+
context 'complex banner' do
|
115
|
+
let(:input) do
|
116
|
+
text_fixture('complex_banner')
|
117
|
+
end
|
118
|
+
|
119
|
+
let(:output) do
|
120
|
+
content = text_fixture('complex_banner').lines[1..-2].join
|
121
|
+
['banner', 'exec', :BANNER_BEGIN, content, :BANNER_END, :EOL]
|
122
|
+
end
|
123
|
+
|
124
|
+
it { expect(subject.map(&:last)).to eq output }
|
125
|
+
it { expect(subject_pure.map(&:last)).to eq output }
|
126
|
+
end
|
127
|
+
|
114
128
|
context 'decimal number' do
|
115
129
|
let(:input) { 'boson levels at 93.2' }
|
116
130
|
let(:output) { ['boson', 'levels', 'at', 93.2] }
|
@@ -226,6 +240,30 @@ END
|
|
226
240
|
|
227
241
|
it { expect(subject_pure.map(&:last)).to eq output }
|
228
242
|
end
|
243
|
+
|
244
|
+
context '# in the middle of a line is not a comment' do
|
245
|
+
let(:input) { "vlan 1\n name #31337" }
|
246
|
+
let(:output) { ['vlan', 1, :EOL, :INDENT, 'name', '#31337', :DEDENT] }
|
247
|
+
|
248
|
+
it { expect(subject_pure.map(&:last)).to eq output }
|
249
|
+
it { expect(subject.map(&:last)).to eq output }
|
250
|
+
end
|
251
|
+
|
252
|
+
context '# at the start of a line is a comment' do
|
253
|
+
let(:input) { "vlan 1\n# comment\nvlan 2" }
|
254
|
+
let(:output) { ['vlan', 1, :EOL, 'vlan', 2] }
|
255
|
+
|
256
|
+
it { expect(subject_pure.map(&:last)).to eq output }
|
257
|
+
it { expect(subject.map(&:last)).to eq output }
|
258
|
+
end
|
259
|
+
|
260
|
+
context '# after indentation is a comment' do
|
261
|
+
let(:input) { "vlan 1\n # comment\nvlan 2" }
|
262
|
+
let(:output) { ['vlan', 1, :EOL, :INDENT, :DEDENT, 'vlan', 2] }
|
263
|
+
|
264
|
+
it { expect(subject_pure.map(&:last)).to eq output }
|
265
|
+
it { expect(subject.map(&:last)).to eq output }
|
266
|
+
end
|
229
267
|
end
|
230
268
|
end
|
231
269
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ios_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Miller
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '2.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: guard-rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: guard-rspec
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -117,6 +131,7 @@ files:
|
|
117
131
|
- doc/state_machine.png
|
118
132
|
- ext/ios_parser/c_lexer/extconf.rb
|
119
133
|
- ext/ios_parser/c_lexer/lexer.c
|
134
|
+
- fixtures/complex_banner.txt
|
120
135
|
- ios_parser.gemspec
|
121
136
|
- lib/ios_parser.rb
|
122
137
|
- lib/ios_parser/ios.rb
|
@@ -161,4 +176,3 @@ test_files:
|
|
161
176
|
- spec/lib/ios_parser/lexer_spec.rb
|
162
177
|
- spec/lib/ios_parser_spec.rb
|
163
178
|
- spec/spec_helper.rb
|
164
|
-
has_rdoc:
|