nasl 0.0.6 → 0.0.7

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 (44) hide show
  1. data/README.md +107 -0
  2. data/Rakefile +21 -2
  3. data/lib/nasl/cli.rb +1 -0
  4. data/lib/nasl/command.rb +5 -1
  5. data/lib/nasl/commands/benchmark.rb +4 -8
  6. data/lib/nasl/commands/parse.rb +3 -5
  7. data/lib/nasl/commands/tokenize.rb +3 -1
  8. data/lib/nasl/commands/xml.rb +0 -3
  9. data/lib/nasl/grammar.racc +24 -24
  10. data/lib/nasl/parser/argument.rb +3 -2
  11. data/lib/nasl/parser/assigment.rb +3 -3
  12. data/lib/nasl/parser/block.rb +1 -1
  13. data/lib/nasl/parser/break.rb +1 -1
  14. data/lib/nasl/parser/call.rb +2 -2
  15. data/lib/nasl/parser/comment.rb +1 -1
  16. data/lib/nasl/parser/continue.rb +1 -1
  17. data/lib/nasl/parser/decrement.rb +2 -2
  18. data/lib/nasl/parser/empty.rb +1 -1
  19. data/lib/nasl/parser/export.rb +1 -1
  20. data/lib/nasl/parser/expression.rb +3 -3
  21. data/lib/nasl/parser/for.rb +5 -5
  22. data/lib/nasl/parser/foreach.rb +3 -3
  23. data/lib/nasl/parser/function.rb +3 -3
  24. data/lib/nasl/parser/global.rb +1 -1
  25. data/lib/nasl/parser/identifier.rb +1 -1
  26. data/lib/nasl/parser/if.rb +4 -4
  27. data/lib/nasl/parser/import.rb +1 -1
  28. data/lib/nasl/parser/include.rb +2 -2
  29. data/lib/nasl/parser/increment.rb +2 -2
  30. data/lib/nasl/parser/integer.rb +1 -1
  31. data/lib/nasl/parser/ip.rb +1 -1
  32. data/lib/nasl/parser/local.rb +1 -1
  33. data/lib/nasl/parser/lvalue.rb +2 -2
  34. data/lib/nasl/parser/node.rb +10 -7
  35. data/lib/nasl/parser/repeat.rb +2 -2
  36. data/lib/nasl/parser/repetition.rb +2 -2
  37. data/lib/nasl/parser/return.rb +1 -1
  38. data/lib/nasl/parser/string.rb +2 -6
  39. data/lib/nasl/parser/undefined.rb +1 -1
  40. data/lib/nasl/parser/while.rb +2 -2
  41. data/lib/nasl/version.rb +1 -1
  42. data/nasl.gemspec +9 -5
  43. data/test/unit/parser/test_assignment.rb +2 -2
  44. metadata +81 -10
@@ -0,0 +1,107 @@
1
+ Installation
2
+ ============
3
+
4
+ Git
5
+ ---
6
+
7
+ Installing the source from Git is done as follows:
8
+
9
+ git clone git://github.com/tenable/nasl.git
10
+
11
+ Gem
12
+ ---
13
+
14
+ Installing the package from RubyGems is done as follows:
15
+
16
+ gem install nasl
17
+
18
+ Usage
19
+ =====
20
+
21
+ Standalone
22
+ ----------
23
+
24
+ To avoid conflicting with the NASL interpreter, the NASL gem's binary is
25
+ installed as <nasl-parse>. As an application, it has very few actions that it
26
+ can perform.
27
+
28
+ # Benchmark: This benchmarks the time taken to parse the input path(s) over a
29
+ number of iterations. The number of iterations can be adjusted by the <-i>
30
+ switch.
31
+
32
+ % nasl-parse -i 10 benchmark /opt/nessus/lib/nessus/plugins/ssl_certificate_chain.nasl
33
+ -------------------------[ ssl_certificate_chain.nasl ]-------------------------
34
+ Rehearsal --------------------------------------------
35
+ Tokenize 1.687500 0.000000 1.687500 ( 1.688397)
36
+ Parse 1.835938 0.015625 1.851562 ( 1.857094)
37
+ ----------------------------------- total: 3.539062sec
38
+
39
+ user system total real
40
+ Tokenize 1.304688 0.015625 1.320312 ( 1.319951)
41
+ Parse 1.046875 0.000000 1.046875 ( 1.046957)
42
+ -------------------------[ ssl_certificate_chain.nasl ]-------------------------
43
+
44
+ # Parse: This parses the input path(s) and indicates whether the parse was
45
+ successful.
46
+
47
+ % nasl-parse parse /opt/nessus/lib/nessus/plugins/ssl_certificate_chain.nasl
48
+ -------------------------[ ssl_certificate_chain.nasl ]-------------------------
49
+ Successfully parsed the contents of the file.
50
+ -------------------------[ ssl_certificate_chain.nasl ]-------------------------
51
+
52
+ # Test: This runs unit tests distributed with the application. Specific unit
53
+ tests can be specified on the command line, otherwise all tests will be run.
54
+
55
+ % nasl-parse test
56
+ Run options:
57
+
58
+ # Running tests:
59
+
60
+ .............................................................................
61
+
62
+ Finished tests in 11.773983s, 6.5398 tests/s, 33493.8487 assertions/s.
63
+
64
+ 77 tests, 394356 assertions, 0 failures, 0 errors, 0 skips
65
+
66
+ # Tokenize: This tokenizes the input path(s) and prints the token/byte-range
67
+ pairs to stdout.
68
+
69
+ % nasl-parse tokenize /opt/nessus/lib/nessus/plugins/ssl_certificate_chain.nasl
70
+ -------------------------[ ssl_certificate_chain.nasl ]-------------------------
71
+ [COMMENT, 0...1076]
72
+ [IF, 1076...1079]
73
+ [LPAREN, 1079...1080]
74
+ [IDENT, 1080...1091]
75
+ [CMP_LT, 1091...1093]
76
+ ...
77
+ -------------------------[ ssl_certificate_chain.nasl ]-------------------------
78
+
79
+ # XML: This parses the input path(s), and then prints an XML representation of
80
+ the parse tree to stdout.
81
+
82
+ % nasl-parse xml /opt/nessus/lib/nessus/plugins/ssl_certificate_chain.nasl
83
+ -------------------------[ ssl_certificate_chain.nasl ]-------------------------
84
+ <tree>
85
+ <if>
86
+ <expression>
87
+ <op>&lt;</op>
88
+ <lvalue>
89
+ ...
90
+ -------------------------[ ssl_certificate_chain.nasl ]-------------------------
91
+
92
+ Library
93
+ -------
94
+
95
+ The primary users of this gem are [Pedant][pedant] and [Nasldoc][nasldoc]. Other
96
+ uses are encouraged, of course! The <Parser> class is the most useful part,
97
+ obviously, and can be used as follows:
98
+
99
+ require 'nasl'
100
+
101
+ tree = Nasl::Parser.new.parse(file_contents, path_to_file)
102
+
103
+ That's all there is to it. If there are any errors, it'll throw an instance of
104
+ <ParseException> that will include as much context about the error as possible.
105
+
106
+ [nasldoc]: https://github.com/tenable/nasldoc
107
+ [pedant]: https://github.com/tenable/pedant
data/Rakefile CHANGED
@@ -1,8 +1,27 @@
1
+ $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
2
+
1
3
  require 'bundler/gem_tasks'
4
+ require 'rake'
5
+ require 'rake/clean'
2
6
  require 'rake/testtask'
3
7
 
4
8
  Rake::TestTask.new do |t|
5
9
  t.libs << 'test'
6
- t.test_files = FileList['test/**/test*.rb']
7
- t.verbose = true
10
+ t.test_files = FileList['test/**/test_*.rb']
11
+ end
12
+
13
+ rule(%r{\.tab\.rb$} => lambda { |f| f.sub(/\.tab.rb/, '.racc') }) do |t|
14
+ sh "racc #{t.source}"
15
+ end
16
+
17
+ desc "Generate grammar modules from Racc source."
18
+ task :grammars => FileList['**/*.racc'].ext('.tab.rb')
19
+
20
+ desc "Produce a fully-functional application."
21
+ task :compile => [:grammars, :test]
22
+
23
+ task :build => :compile do
24
+ system "gem build nasl.gemspec"
8
25
  end
26
+
27
+ task :default => :compile
@@ -86,6 +86,7 @@ module Nasl
86
86
  puts " benchmark Benchmarks the parsing of the input path(s)."
87
87
  puts " parse Parses the input path(s)."
88
88
  puts " test Runs the specified unit tests, all are selected by default."
89
+ puts " tokenize Tokenizes the input path(s)."
89
90
  puts " xml Parses the input path(s) and displays them as XML."
90
91
  end
91
92
  end
@@ -89,7 +89,11 @@ module Nasl
89
89
  if self.respond_to? :analyze_all then
90
90
  analyze_all(cfg, dirents, args)
91
91
  else
92
- dirents.each { |d| analyze(cfg, d, args) }
92
+ dirents.each do |d|
93
+ puts banner(d.basename)
94
+ analyze(cfg, d, args)
95
+ puts banner(d.basename)
96
+ end
93
97
  end
94
98
  end
95
99
  end
@@ -33,23 +33,19 @@ module Nasl
33
33
  end
34
34
 
35
35
  def self.analyze(cfg, path, args)
36
- puts banner(path.basename)
37
-
38
36
  Benchmark.bmbm do |b|
39
37
  # Read in the file outside of the benchmark, to avoid contaminating it
40
38
  # with filesystem operations.
41
39
  contents = File.open(path, "rb").read
42
40
 
43
41
  b.report("Tokenize") do
44
- cfg[:iterations].times { Tokenizer.new(contents).get_all }
42
+ cfg[:iterations].times { Tokenizer.new(contents, path).get_tokens }
45
43
  end
46
44
 
47
- #b.report("Parse") do
48
- # cfg[:iterations].times { Parser.new.parse(contents) }
49
- #end
45
+ b.report("Parse") do
46
+ cfg[:iterations].times { Parser.new.parse(contents) }
47
+ end
50
48
  end
51
-
52
- puts banner(path.basename)
53
49
  end
54
50
  end
55
51
  end
@@ -24,8 +24,6 @@
24
24
  # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
25
  ################################################################################
26
26
 
27
- require 'rainbow'
28
-
29
27
  module Nasl
30
28
  class CommandParse < Command
31
29
  def self.binding
@@ -36,20 +34,20 @@ module Nasl
36
34
  begin
37
35
  contents = File.open(path, "rb").read
38
36
  rescue
39
- puts '[' + 'VOID'.color(:magenta) + "] #{path}"
37
+ puts "Failed to read in the contents of the file."
40
38
  return
41
39
  end
42
40
 
43
41
  begin
44
42
  Parser.new.parse(contents, path)
45
43
  rescue Exception => e
46
- puts '[' + 'FAIL'.color(:red) + "] #{path}"
44
+ puts "Failed to parse the contents of the file."
47
45
  puts e.message
48
46
  puts e.backtrace
49
47
  return
50
48
  end
51
49
 
52
- puts '[' + 'PASS'.color(:green) + "] #{path}"
50
+ puts "Successfully parsed the contents of the file."
53
51
  end
54
52
  end
55
53
  end
@@ -34,7 +34,9 @@ module Nasl
34
34
  contents = File.open(path, "rb").read
35
35
 
36
36
  begin
37
- Tokenizer.new(contents, path).get_tokens
37
+ Tokenizer.new(contents, path).get_tokens.each do |t|
38
+ puts "[#{(t.first.to_s + ',').ljust(10)}#{t.last.region.to_s.rjust(20)}]"
39
+ end
38
40
  rescue TokenException => e
39
41
  puts "The tokenizer raised the following exceptions when processing #{path}:"
40
42
  puts e.message
@@ -32,10 +32,7 @@ module Nasl
32
32
 
33
33
  def self.analyze(cfg, path, args)
34
34
  contents = File.open(path, "rb").read
35
-
36
- puts banner(path.basename)
37
35
  puts Parser.new.parse(contents).to_s
38
- puts banner(path.basename)
39
36
  end
40
37
  end
41
38
  end
@@ -151,7 +151,7 @@ rule
151
151
  ##############################################################################
152
152
 
153
153
  assign : assign_exp SEMICOLON
154
- { n(:Assignment, *val[0], val[1]) }
154
+ { val[0] }
155
155
  ;
156
156
 
157
157
  break : BREAK SEMICOLON
@@ -159,7 +159,7 @@ rule
159
159
  ;
160
160
 
161
161
  call : call_exp SEMICOLON
162
- { n(:Call, *val[0], val[1]) }
162
+ { val[0] }
163
163
  ;
164
164
 
165
165
  continue : CONTINUE SEMICOLON
@@ -167,7 +167,7 @@ rule
167
167
  ;
168
168
 
169
169
  decr : decr_exp SEMICOLON
170
- { n(:Decrement, *val[0], val[1]) }
170
+ { val[0] }
171
171
  ;
172
172
 
173
173
  empty : SEMICOLON
@@ -179,7 +179,7 @@ rule
179
179
  ;
180
180
 
181
181
  incr : incr_exp SEMICOLON
182
- { n(:Increment, *val[0], val[1]) }
182
+ { val[0] }
183
183
  ;
184
184
 
185
185
  import : IMPORT LPAREN string RPAREN SEMICOLON
@@ -195,7 +195,7 @@ rule
195
195
  ;
196
196
 
197
197
  rep : call_exp REP expr SEMICOLON
198
- { n(:Repetition, n(:Call, *val[0]), *val[1..-1]) }
198
+ { n(:Repetition, n(:Call, val[0]), *val[1..-1]) }
199
199
  ;
200
200
 
201
201
  return : RETURN expr SEMICOLON
@@ -241,40 +241,40 @@ rule
241
241
  ##############################################################################
242
242
 
243
243
  assign_exp : lval ASS_EQ expr
244
- { val }
244
+ { n(:Assignment, *val) }
245
245
  | lval ADD_EQ expr
246
- { val }
246
+ { n(:Assignment, *val) }
247
247
  | lval SUB_EQ expr
248
- { val }
248
+ { n(:Assignment, *val) }
249
249
  | lval MUL_EQ expr
250
- { val }
250
+ { n(:Assignment, *val) }
251
251
  | lval DIV_EQ expr
252
- { val }
252
+ { n(:Assignment, *val) }
253
253
  | lval MOD_EQ expr
254
- { val }
254
+ { n(:Assignment, *val) }
255
255
  | lval SRL_EQ expr
256
- { val }
256
+ { n(:Assignment, *val) }
257
257
  | lval SRA_EQ expr
258
- { val }
258
+ { n(:Assignment, *val) }
259
259
  | lval SLL_EQ expr
260
- { val }
260
+ { n(:Assignment, *val) }
261
261
  ;
262
262
 
263
263
  call_exp : ident LPAREN args RPAREN
264
- { val }
264
+ { n(:Call, *val) }
265
265
  | ident LPAREN RPAREN
266
- { val }
266
+ { n(:Call, *val) }
267
267
 
268
268
  decr_exp : DECR lval
269
- { val }
269
+ { n(:Decrement, val[0]) }
270
270
  | lval DECR
271
- { val }
271
+ { n(:Decrement, val[0]) }
272
272
  ;
273
273
 
274
274
  incr_exp : INCR lval
275
- { val }
275
+ { n(:Increment, val[0]) }
276
276
  | lval INCR
277
- { val }
277
+ { n(:Increment, val[0]) }
278
278
  ;
279
279
 
280
280
  expr : LPAREN expr RPAREN
@@ -314,9 +314,9 @@ rule
314
314
  | expr BIT_SLL expr
315
315
  { n(:Expression, *val) }
316
316
  | incr_exp
317
- { n(:Increment, *val[0]) }
317
+ { val[0] }
318
318
  | decr_exp
319
- { n(:Decrement, *val[0]) }
319
+ { val[0] }
320
320
  | expr SUBSTR_EQ expr
321
321
  { n(:Expression, *val) }
322
322
  | expr SUBSTR_NE expr
@@ -338,11 +338,11 @@ rule
338
338
  | expr CMP_LE expr
339
339
  { n(:Expression, *val) }
340
340
  | assign_exp
341
- { n(:Assignment, *val[0]) }
341
+ { val[0] }
342
342
  | string
343
343
  { val[0] }
344
344
  | call_exp
345
- { n(:Call, *val[0]) }
345
+ { val[0] }
346
346
  | lval
347
347
  { val[0] }
348
348
  | ip
@@ -43,8 +43,9 @@ module Nasl
43
43
  @type = :anonymous
44
44
  end
45
45
 
46
- @attributes << :name
47
- @attributes << :expr
46
+ @attributes << :type
47
+ @children << :name
48
+ @children << :expr
48
49
  end
49
50
  end
50
51
  end
@@ -37,9 +37,9 @@ module Nasl
37
37
  @op = @tokens[1]
38
38
  @expr = @tokens[2]
39
39
 
40
- @attributes << :op
41
- @attributes << :lval
42
- @attributes << :expr
40
+ @children << :op
41
+ @children << :lval
42
+ @children << :expr
43
43
  end
44
44
  end
45
45
  end
@@ -35,7 +35,7 @@ module Nasl
35
35
 
36
36
  @body = if @tokens.length == 3 then @tokens[1] else [] end
37
37
 
38
- @attributes << :body
38
+ @children << :body
39
39
  end
40
40
  end
41
41
  end
@@ -1,4 +1,4 @@
1
- ################################################################################
1
+ !################################################################################
2
2
  # Copyright (c) 2011-2012, Mak Kolybabi
3
3
  # All rights reserved.
4
4
  #
@@ -41,8 +41,8 @@ module Nasl
41
41
  @arg[a.name.name] = a.expr
42
42
  end
43
43
 
44
- @attributes << :name
45
- @attributes << :args
44
+ @children << :name
45
+ @children << :args
46
46
  end
47
47
  end
48
48
  end
@@ -1,4 +1,4 @@
1
- ################################################################################
1
+ !################################################################################
2
2
  # Copyright (c) 2011-2012, Mak Kolybabi
3
3
  # All rights reserved.
4
4
  #
@@ -1,4 +1,4 @@
1
- ################################################################################
1
+ !################################################################################
2
2
  # Copyright (c) 2011-2012, Mak Kolybabi
3
3
  # All rights reserved.
4
4
  #
@@ -41,8 +41,8 @@ module Nasl
41
41
  @ident = @tokens[1]
42
42
  end
43
43
 
44
- @attributes << :ident
45
- @attributes << :type
44
+ @children << :ident
45
+ @children << :type
46
46
  end
47
47
  end
48
48
  end
@@ -1,4 +1,4 @@
1
- ################################################################################
1
+ !################################################################################
2
2
  # Copyright (c) 2011-2012, Mak Kolybabi
3
3
  # All rights reserved.
4
4
  #
@@ -35,7 +35,7 @@ module Nasl
35
35
 
36
36
  @function = @tokens[1]
37
37
 
38
- @attributes << :function
38
+ @children << :function
39
39
  end
40
40
  end
41
41
  end
@@ -33,7 +33,7 @@ module Nasl
33
33
  def initialize(tree, *tokens)
34
34
  super
35
35
 
36
- @attributes << :op
36
+ @children << :op
37
37
 
38
38
  if @tokens.first.is_a?(Token) && @tokens.first.type == :LPAREN
39
39
  @op = '()'
@@ -44,13 +44,13 @@ module Nasl
44
44
  @lhs = nil
45
45
  @rhs = @tokens.last
46
46
  else
47
- @attributes << :lhs
47
+ @children << :lhs
48
48
  @lhs = @tokens[0]
49
49
  @op = @tokens[1]
50
50
  @rhs = @tokens[2]
51
51
  end
52
52
 
53
- @attributes << :rhs
53
+ @children << :rhs
54
54
  end
55
55
  end
56
56
  end
@@ -1,4 +1,4 @@
1
- ################################################################################
1
+ !################################################################################
2
2
  # Copyright (c) 2011-2012, Mak Kolybabi
3
3
  # All rights reserved.
4
4
  #
@@ -38,10 +38,10 @@ module Nasl
38
38
  @each = @tokens[6]
39
39
  @body = @tokens[8]
40
40
 
41
- @attributes << :init
42
- @attributes << :cond
43
- @attributes << :each
44
- @attributes << :body
41
+ @children << :init
42
+ @children << :cond
43
+ @children << :each
44
+ @children << :body
45
45
  end
46
46
  end
47
47
  end
@@ -37,9 +37,9 @@ module Nasl
37
37
  @expr = @tokens[3]
38
38
  @body = @tokens[5]
39
39
 
40
- @attributes << :iter
41
- @attributes << :expr
42
- @attributes << :body
40
+ @children << :iter
41
+ @children << :expr
42
+ @children << :body
43
43
  end
44
44
  end
45
45
  end
@@ -37,9 +37,9 @@ module Nasl
37
37
  @params = if @tokens.length == 6 then @tokens[3] else [] end
38
38
  @body = @tokens.last
39
39
 
40
- @attributes << :name
41
- @attributes << :params
42
- @attributes << :body
40
+ @children << :name
41
+ @children << :params
42
+ @children << :body
43
43
  end
44
44
  end
45
45
  end
@@ -35,7 +35,7 @@ module Nasl
35
35
 
36
36
  @idents = @tokens[1]
37
37
 
38
- @attributes << :idents
38
+ @children << :idents
39
39
  end
40
40
  end
41
41
  end
@@ -1,4 +1,4 @@
1
- ################################################################################
1
+ !################################################################################
2
2
  # Copyright (c) 2011-2012, Mak Kolybabi
3
3
  # All rights reserved.
4
4
  #
@@ -1,4 +1,4 @@
1
- ################################################################################
1
+ !################################################################################
2
2
  # Copyright (c) 2011-2012, Mak Kolybabi
3
3
  # All rights reserved.
4
4
  #
@@ -37,9 +37,9 @@ module Nasl
37
37
  @true = @tokens[4]
38
38
  @false = if @tokens.length == 7 then @tokens.last else nil end
39
39
 
40
- @attributes << :cond
41
- @attributes << :true
42
- @attributes << :false
40
+ @children << :cond
41
+ @children << :true
42
+ @children << :false
43
43
  end
44
44
  end
45
45
  end
@@ -35,7 +35,7 @@ module Nasl
35
35
 
36
36
  @filename = @tokens[2]
37
37
 
38
- @attributes << :filename
38
+ @children << :filename
39
39
  end
40
40
  end
41
41
  end
@@ -1,4 +1,4 @@
1
- ################################################################################
1
+ !################################################################################
2
2
  # Copyright (c) 2011-2012, Mak Kolybabi
3
3
  # All rights reserved.
4
4
  #
@@ -35,7 +35,7 @@ module Nasl
35
35
 
36
36
  @filename = @tokens[2]
37
37
 
38
- @attributes << :filename
38
+ @children << :filename
39
39
  end
40
40
  end
41
41
  end
@@ -41,8 +41,8 @@ module Nasl
41
41
  @ident = @tokens[1]
42
42
  end
43
43
 
44
- @attributes << :ident
45
- @attributes << :type
44
+ @children << :ident
45
+ @children << :type
46
46
  end
47
47
  end
48
48
  end
@@ -1,4 +1,4 @@
1
- ################################################################################
1
+ !################################################################################
2
2
  # Copyright (c) 2011-2012, Mak Kolybabi
3
3
  # All rights reserved.
4
4
  #
@@ -1,4 +1,4 @@
1
- ################################################################################
1
+ !################################################################################
2
2
  # Copyright (c) 2011-2012, Mak Kolybabi
3
3
  # All rights reserved.
4
4
  #
@@ -35,7 +35,7 @@ module Nasl
35
35
 
36
36
  @idents = @tokens[1]
37
37
 
38
- @attributes << :idents
38
+ @children << :idents
39
39
  end
40
40
  end
41
41
  end
@@ -36,8 +36,8 @@ module Nasl
36
36
  @ident = @tokens.first
37
37
  @indexes = if @tokens.length == 2 then tokens.last else [] end
38
38
 
39
- @attributes << :ident
40
- @attributes << :indexes
39
+ @children << :ident
40
+ @children << :indexes
41
41
  end
42
42
  end
43
43
  end
@@ -32,9 +32,9 @@ module Nasl
32
32
  # Register new node in the tree.
33
33
  tree.register(self)
34
34
 
35
- # Create the attributes array which is used for converting the parse tree
36
- # to XML.
35
+ # Create the arrays which are used for converting the parse tree to XML.
37
36
  @attributes = []
37
+ @children = []
38
38
 
39
39
  # Store all of the tokens that made up this node.
40
40
  @tokens = tokens
@@ -56,22 +56,25 @@ module Nasl
56
56
  name = self.class.name.split('::').last
57
57
  name = name.gsub(/(.)([A-Z])/, '\1_\2').downcase
58
58
 
59
+ # Create a hash from the attribute array.
60
+ attr = Hash[@attributes.map{ |el| [el, self.send(el)] }]
61
+
59
62
  # If there are no attributes, make a modified opening tag.
60
- return xml.tag!(name) if @attributes.empty?
63
+ return xml.tag!(name, attr) if @children.empty?
61
64
 
62
65
  # Create the tag representing this node.
63
- xml.tag!(name) do
64
- @attributes.each do |name|
66
+ xml.tag!(name, attr) do
67
+ @children.each do |name|
65
68
  # Retrieve the object that the symbol indicates.
66
69
  obj = self.send(name)
67
70
 
68
- # Skip over unused attributes.
71
+ # Skip over empty children.
69
72
  next if obj.nil?
70
73
 
71
74
  # Handle objects that are arrays holding nodes, or basic types that
72
75
  # aren't nodes.
73
76
  if obj.is_a? Array
74
- obj.each { |node| node.to_xml(xml) }
77
+ obj.each { |el| el.to_xml(xml) }
75
78
  elsif obj.is_a? Node
76
79
  obj.to_xml(xml)
77
80
  else
@@ -36,8 +36,8 @@ module Nasl
36
36
  @body = @tokens[1]
37
37
  @cond = @tokens[3]
38
38
 
39
- @attributes << :body
40
- @attributes << :cond
39
+ @children << :body
40
+ @children << :cond
41
41
  end
42
42
  end
43
43
  end
@@ -36,8 +36,8 @@ module Nasl
36
36
  @call = tokens[0]
37
37
  @expr = tokens[2]
38
38
 
39
- @attributes << :call
40
- @attributes << :expr
39
+ @children << :call
40
+ @children << :expr
41
41
  end
42
42
  end
43
43
  end
@@ -35,7 +35,7 @@ module Nasl
35
35
 
36
36
  @expr = if @tokens.length == 3 then @tokens[1] else nil end
37
37
 
38
- @attributes << :expr
38
+ @children << :expr
39
39
  end
40
40
  end
41
41
  end
@@ -1,4 +1,4 @@
1
- ################################################################################
1
+ !################################################################################
2
2
  # Copyright (c) 2011-2012, Mak Kolybabi
3
3
  # All rights reserved.
4
4
  #
@@ -38,11 +38,7 @@ module Nasl
38
38
  end
39
39
 
40
40
  def to_xml(xml)
41
- if @type == :DATA
42
- xml.data(@text)
43
- else
44
- xml.string(@text)
45
- end
41
+ xml.method_missing(@type.downcase, @text)
46
42
  end
47
43
  end
48
44
  end
@@ -1,4 +1,4 @@
1
- ################################################################################
1
+ !################################################################################
2
2
  # Copyright (c) 2011-2012, Mak Kolybabi
3
3
  # All rights reserved.
4
4
  #
@@ -36,8 +36,8 @@ module Nasl
36
36
  @cond = @tokens[2]
37
37
  @body = @tokens[4]
38
38
 
39
- @attributes << :cond
40
- @attributes << :body
39
+ @children << :cond
40
+ @children << :body
41
41
  end
42
42
  end
43
43
  end
@@ -1,3 +1,3 @@
1
1
  module Nasl
2
- VERSION = '0.0.6'
2
+ VERSION = '0.0.7'
3
3
  end
@@ -1,25 +1,29 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  $:.push File.expand_path('../lib', __FILE__)
3
+
3
4
  require 'nasl/version'
4
5
 
5
6
  Gem::Specification.new do |s|
6
7
  s.name = 'nasl'
7
8
  s.version = Nasl::VERSION
9
+ s.license = "BSD"
10
+ s.homepage = 'http://github.com/tenable/nasl'
11
+ s.summary = 'A parser for the Nessus Attack Scripting Language.'
12
+ s.description = File.open('README.md').read
13
+
8
14
  s.authors = ['Mak Kolybabi']
9
15
  s.email = ['mak@kolybabi.com']
10
- s.homepage = 'http://github.com/mogigoma/nasl'
11
- s.summary = %q{A parser for the Nessus Attack Scripting Language.}
12
16
 
13
17
  s.rubyforge_project = 'nasl'
14
18
 
15
- s.files = `git ls-files`.split("\n") + ['lib/nasl/grammar.tab.rb']
16
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.files = `git ls-files`.split("\n") + Dir.glob('**/*.tab.rb')
20
+ s.test_files = `git ls-files -- test/*`.split("\n")
17
21
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
22
  s.require_paths = ['lib']
19
23
 
24
+ s.add_development_dependency 'racc'
20
25
  s.add_development_dependency 'rake'
21
26
 
22
27
  s.add_runtime_dependency 'builder'
23
- s.add_runtime_dependency 'racc'
24
28
  s.add_runtime_dependency 'rainbow'
25
29
  end
@@ -37,7 +37,7 @@ class TestAssignment < Test::Unit::TestCase
37
37
  def test_string
38
38
  same(
39
39
  "q = '';",
40
- '<tree><assignment><op>=</op><lvalue><identifier name="q"/></lvalue><data></data></assignment></tree>'
40
+ '<tree><assignment><op>=</op><lvalue><identifier name="q"/></lvalue><data/></assignment></tree>'
41
41
  )
42
42
  same(
43
43
  "q = 'foo';",
@@ -45,7 +45,7 @@ class TestAssignment < Test::Unit::TestCase
45
45
  )
46
46
  same(
47
47
  'q = "";',
48
- '<tree><assignment><op>=</op><lvalue><identifier name="q"/></lvalue><string></string></assignment></tree>'
48
+ '<tree><assignment><op>=</op><lvalue><identifier name="q"/></lvalue><string/></assignment></tree>'
49
49
  )
50
50
  same(
51
51
  'q = "foo";',
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nasl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,10 +9,10 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-17 00:00:00.000000000 Z
12
+ date: 2012-10-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: rake
15
+ name: racc
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
@@ -28,14 +28,14 @@ dependencies:
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
30
  - !ruby/object:Gem::Dependency
31
- name: builder
31
+ name: rake
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  none: false
34
34
  requirements:
35
35
  - - ! '>='
36
36
  - !ruby/object:Gem::Version
37
37
  version: '0'
38
- type: :runtime
38
+ type: :development
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
41
41
  none: false
@@ -44,7 +44,7 @@ dependencies:
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
46
  - !ruby/object:Gem::Dependency
47
- name: racc
47
+ name: builder
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  none: false
50
50
  requirements:
@@ -75,7 +75,48 @@ dependencies:
75
75
  - - ! '>='
76
76
  - !ruby/object:Gem::Version
77
77
  version: '0'
78
- description:
78
+ description: ! "Installation\n============\n\nGit\n---\n\nInstalling the source from
79
+ Git is done as follows:\n\n git clone git://github.com/tenable/nasl.git\n\nGem\n---\n\nInstalling
80
+ the package from RubyGems is done as follows:\n\n gem install nasl\n\nUsage\n=====\n\nStandalone\n----------\n\nTo
81
+ avoid conflicting with the NASL interpreter, the NASL gem's binary is\ninstalled
82
+ as <nasl-parse>. As an application, it has very few actions that it\ncan perform.\n\n#
83
+ Benchmark: This benchmarks the time taken to parse the input path(s) over a\n number
84
+ of iterations. The number of iterations can be adjusted by the <-i>\n switch.\n\n
85
+ \ % nasl-parse -i 10 benchmark /opt/nessus/lib/nessus/plugins/ssl_certificate_chain.nasl\n
86
+ \ -------------------------[ ssl_certificate_chain.nasl ]-------------------------\n
87
+ \ Rehearsal --------------------------------------------\n Tokenize 1.687500
88
+ \ 0.000000 1.687500 ( 1.688397)\n Parse 1.835938 0.015625 1.851562
89
+ ( 1.857094)\n ----------------------------------- total: 3.539062sec\n\n user
90
+ \ system total real\n Tokenize 1.304688 0.015625 1.320312
91
+ ( 1.319951)\n Parse 1.046875 0.000000 1.046875 ( 1.046957)\n -------------------------[
92
+ ssl_certificate_chain.nasl ]-------------------------\n\n# Parse: This parses the
93
+ input path(s) and indicates whether the parse was\n successful.\n\n % nasl-parse
94
+ parse /opt/nessus/lib/nessus/plugins/ssl_certificate_chain.nasl\n -------------------------[
95
+ ssl_certificate_chain.nasl ]-------------------------\n Successfully parsed the
96
+ contents of the file.\n -------------------------[ ssl_certificate_chain.nasl
97
+ ]-------------------------\n\n# Test: This runs unit tests distributed with the
98
+ application. Specific unit\n tests can be specified on the command line, otherwise
99
+ all tests will be run.\n\n % nasl-parse test\n Run options:\n \n # Running
100
+ tests:\n \n .............................................................................\n
101
+ \ \n Finished tests in 11.773983s, 6.5398 tests/s, 33493.8487 assertions/s.\n
102
+ \ \n 77 tests, 394356 assertions, 0 failures, 0 errors, 0 skips\n\n# Tokenize:
103
+ This tokenizes the input path(s) and prints the token/byte-range\n pairs to stdout.\n\n
104
+ \ % nasl-parse tokenize /opt/nessus/lib/nessus/plugins/ssl_certificate_chain.nasl\n
105
+ \ -------------------------[ ssl_certificate_chain.nasl ]-------------------------\n
106
+ \ [COMMENT, 0...1076]\n [IF, 1076...1079]\n [LPAREN,
107
+ \ 1079...1080]\n [IDENT, 1080...1091]\n [CMP_LT, 1091...1093]\n
108
+ \ ...\n -------------------------[ ssl_certificate_chain.nasl ]-------------------------\n\n#
109
+ XML: This parses the input path(s), and then prints an XML representation of\n the
110
+ parse tree to stdout.\n\n % nasl-parse xml /opt/nessus/lib/nessus/plugins/ssl_certificate_chain.nasl\n
111
+ \ -------------------------[ ssl_certificate_chain.nasl ]-------------------------\n
112
+ \ <tree>\n <if>\n <expression>\n <op>&lt;</op>\n <lvalue>\n
113
+ \ ...\n -------------------------[ ssl_certificate_chain.nasl ]-------------------------\n\nLibrary\n-------\n\nThe
114
+ primary users of this gem are [Pedant][pedant] and [Nasldoc][nasldoc]. Other\nuses
115
+ are encouraged, of course! The <Parser> class is the most useful part,\nobviously,
116
+ and can be used as follows:\n\n require 'nasl'\n\n tree = Nasl::Parser.new.parse(file_contents,
117
+ path_to_file)\n\nThat's all there is to it. If there are any errors, it'll throw
118
+ an instance of\n<ParseException> that will include as much context about the error
119
+ as possible.\n\n[nasldoc]: https://github.com/tenable/nasldoc\n[pedant]: https://github.com/tenable/pedant\n"
79
120
  email:
80
121
  - mak@kolybabi.com
81
122
  executables:
@@ -85,6 +126,7 @@ extra_rdoc_files: []
85
126
  files:
86
127
  - .gitignore
87
128
  - Gemfile
129
+ - README.md
88
130
  - Rakefile
89
131
  - bin/nasl-parse
90
132
  - lib/nasl.rb
@@ -158,8 +200,9 @@ files:
158
200
  - test/unit/tokenizer/test_integer.rb
159
201
  - test/unit/tokenizer/test_string.rb
160
202
  - lib/nasl/grammar.tab.rb
161
- homepage: http://github.com/mogigoma/nasl
162
- licenses: []
203
+ homepage: http://github.com/tenable/nasl
204
+ licenses:
205
+ - BSD
163
206
  post_install_message:
164
207
  rdoc_options: []
165
208
  require_paths:
@@ -170,16 +213,44 @@ required_ruby_version: !ruby/object:Gem::Requirement
170
213
  - - ! '>='
171
214
  - !ruby/object:Gem::Version
172
215
  version: '0'
216
+ segments:
217
+ - 0
218
+ hash: -1091891794194809699
173
219
  required_rubygems_version: !ruby/object:Gem::Requirement
174
220
  none: false
175
221
  requirements:
176
222
  - - ! '>='
177
223
  - !ruby/object:Gem::Version
178
224
  version: '0'
225
+ segments:
226
+ - 0
227
+ hash: -1091891794194809699
179
228
  requirements: []
180
229
  rubyforge_project: nasl
181
230
  rubygems_version: 1.8.24
182
231
  signing_key:
183
232
  specification_version: 3
184
233
  summary: A parser for the Nessus Attack Scripting Language.
185
- test_files: []
234
+ test_files:
235
+ - test/test_helper.rb
236
+ - test/unit/parser/test_assignment.rb
237
+ - test/unit/parser/test_blank.rb
238
+ - test/unit/parser/test_block.rb
239
+ - test/unit/parser/test_call.rb
240
+ - test/unit/parser/test_comment.rb
241
+ - test/unit/parser/test_constant.rb
242
+ - test/unit/parser/test_empty.rb
243
+ - test/unit/parser/test_expressions.rb
244
+ - test/unit/parser/test_function.rb
245
+ - test/unit/parser/test_if.rb
246
+ - test/unit/parser/test_include.rb
247
+ - test/unit/parser/test_incr_decr.rb
248
+ - test/unit/parser/test_ip.rb
249
+ - test/unit/parser/test_return.rb
250
+ - test/unit/parser/test_string.rb
251
+ - test/unit/parser/test_whitespace.rb
252
+ - test/unit/test_context.rb
253
+ - test/unit/tokenizer/test_comment.rb
254
+ - test/unit/tokenizer/test_empty.rb
255
+ - test/unit/tokenizer/test_integer.rb
256
+ - test/unit/tokenizer/test_string.rb