nasl 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.
- data/.gitignore +9 -0
- data/Gemfile +4 -0
- data/Rakefile +8 -0
- data/bin/nasl-parse +33 -0
- data/lib/nasl/cli.rb +94 -0
- data/lib/nasl/command.rb +96 -0
- data/lib/nasl/commands/benchmark.rb +55 -0
- data/lib/nasl/commands/parse.rb +55 -0
- data/lib/nasl/commands/test.rb +37 -0
- data/lib/nasl/commands/tokenize.rb +46 -0
- data/lib/nasl/commands/xml.rb +41 -0
- data/lib/nasl/context.rb +102 -0
- data/lib/nasl/grammar.racc +513 -0
- data/lib/nasl/grammar.tab.rb +1650 -0
- data/lib/nasl/parser/argument.rb +50 -0
- data/lib/nasl/parser/assigment.rb +45 -0
- data/lib/nasl/parser/block.rb +41 -0
- data/lib/nasl/parser/break.rb +32 -0
- data/lib/nasl/parser/call.rb +48 -0
- data/lib/nasl/parser/continue.rb +32 -0
- data/lib/nasl/parser/decrement.rb +48 -0
- data/lib/nasl/parser/empty.rb +32 -0
- data/lib/nasl/parser/export.rb +41 -0
- data/lib/nasl/parser/expression.rb +56 -0
- data/lib/nasl/parser/for.rb +47 -0
- data/lib/nasl/parser/foreach.rb +45 -0
- data/lib/nasl/parser/function.rb +45 -0
- data/lib/nasl/parser/global.rb +41 -0
- data/lib/nasl/parser/identifier.rb +43 -0
- data/lib/nasl/parser/if.rb +45 -0
- data/lib/nasl/parser/import.rb +41 -0
- data/lib/nasl/parser/include.rb +41 -0
- data/lib/nasl/parser/increment.rb +48 -0
- data/lib/nasl/parser/integer.rb +70 -0
- data/lib/nasl/parser/ip.rb +43 -0
- data/lib/nasl/parser/local.rb +41 -0
- data/lib/nasl/parser/lvalue.rb +43 -0
- data/lib/nasl/parser/node.rb +73 -0
- data/lib/nasl/parser/repeat.rb +43 -0
- data/lib/nasl/parser/repetition.rb +43 -0
- data/lib/nasl/parser/return.rb +41 -0
- data/lib/nasl/parser/string.rb +48 -0
- data/lib/nasl/parser/tree.rb +59 -0
- data/lib/nasl/parser/undefined.rb +35 -0
- data/lib/nasl/parser/while.rb +43 -0
- data/lib/nasl/parser.rb +45 -0
- data/lib/nasl/test.rb +98 -0
- data/lib/nasl/token.rb +69 -0
- data/lib/nasl/tokenizer.rb +327 -0
- data/lib/nasl/version.rb +3 -0
- data/lib/nasl.rb +52 -0
- data/nasl.gemspec +26 -0
- data/test/test_helper.rb +6 -0
- data/test/unit/parser/test_assignment.rb +111 -0
- data/test/unit/parser/test_blank.rb +44 -0
- data/test/unit/parser/test_block.rb +35 -0
- data/test/unit/parser/test_constant.rb +65 -0
- data/test/unit/parser/test_empty.rb +36 -0
- data/test/unit/parser/test_expressions.rb +57 -0
- data/test/unit/parser/test_function.rb +82 -0
- data/test/unit/parser/test_if.rb +85 -0
- data/test/unit/parser/test_include.rb +37 -0
- data/test/unit/parser/test_incr_decr.rb +51 -0
- data/test/unit/parser/test_ip.rb +33 -0
- data/test/unit/parser/test_return.rb +51 -0
- data/test/unit/parser/test_string.rb +46 -0
- data/test/unit/parser/test_whitespace.rb +56 -0
- data/test/unit/test_context.rb +240 -0
- data/test/unit/tokenizer/test_empty.rb +53 -0
- data/test/unit/tokenizer/test_integer.rb +68 -0
- data/test/unit/tokenizer/test_string.rb +94 -0
- metadata +161 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
data/bin/nasl-parse
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
################################################################################
|
4
|
+
# Copyright (c) 2011, Mak Kolybabi
|
5
|
+
# All rights reserved.
|
6
|
+
#
|
7
|
+
# Redistribution and use in source and binary forms, with or without
|
8
|
+
# modification, are permitted provided that the following conditions are met:
|
9
|
+
#
|
10
|
+
# 1. Redistributions of source code must retain the above copyright notice, this
|
11
|
+
# list of conditions and the following disclaimer.
|
12
|
+
#
|
13
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
14
|
+
# this list of conditions and the following disclaimer in the documentation
|
15
|
+
# and/or other materials provided with the distribution.
|
16
|
+
#
|
17
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
18
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
19
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
20
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
21
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
22
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
23
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
24
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
25
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
26
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
27
|
+
################################################################################
|
28
|
+
|
29
|
+
$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
|
30
|
+
|
31
|
+
require 'nasl'
|
32
|
+
|
33
|
+
Nasl::Cli.run
|
data/lib/nasl/cli.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
################################################################################
|
2
|
+
# Copyright (c) 2011, Mak Kolybabi
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
#
|
8
|
+
# 1. Redistributions of source code must retain the above copyright notice, this
|
9
|
+
# list of conditions and the following disclaimer.
|
10
|
+
#
|
11
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
12
|
+
# this list of conditions and the following disclaimer in the documentation
|
13
|
+
# and/or other materials provided with the distribution.
|
14
|
+
#
|
15
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
16
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
17
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
18
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
19
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
20
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
21
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
22
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
23
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
24
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
25
|
+
################################################################################
|
26
|
+
|
27
|
+
require 'optparse'
|
28
|
+
|
29
|
+
module Nasl
|
30
|
+
class Cli
|
31
|
+
@@Iterations = 1000
|
32
|
+
|
33
|
+
def self.run
|
34
|
+
cfg = {
|
35
|
+
:iterations => @@Iterations,
|
36
|
+
:verbose => 0
|
37
|
+
}
|
38
|
+
|
39
|
+
Command.initialize!
|
40
|
+
|
41
|
+
optparse = OptionParser.new do |opts|
|
42
|
+
opts.banner = "Usage: nasl [options] [command [args]]"
|
43
|
+
|
44
|
+
opts.on('-i', '--iterations=ITERS', 'Benchmarking iterations') do |iters|
|
45
|
+
cfg[:iterations] = iters.to_i || @@Iterations
|
46
|
+
end
|
47
|
+
|
48
|
+
opts.on('-v', '--verbose', 'Output more information') do
|
49
|
+
cfg[:verbose] += 1
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
optparse.parse!
|
54
|
+
|
55
|
+
# Sanity check the command line arguments.
|
56
|
+
if ARGV.empty?
|
57
|
+
puts "No command was specified."
|
58
|
+
puts
|
59
|
+
usage
|
60
|
+
exit 1
|
61
|
+
end
|
62
|
+
|
63
|
+
cmd = ARGV.shift
|
64
|
+
cls = Command.find(cmd)
|
65
|
+
if cls.nil? then
|
66
|
+
puts "Command '#{cmd}' not supported."
|
67
|
+
puts
|
68
|
+
usage
|
69
|
+
exit 1
|
70
|
+
end
|
71
|
+
|
72
|
+
# Run the command.
|
73
|
+
cls.run(cfg, ARGV)
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.usage
|
77
|
+
puts "For the moment, you have to run nasl-parse from its top-level directory."
|
78
|
+
puts
|
79
|
+
puts "./bin/nasl-parse [flags] [command] [path ...]"
|
80
|
+
puts
|
81
|
+
puts "Flags:"
|
82
|
+
puts " -i iters Benchmark the parser running 'iters' iterations, default #@@Iterations."
|
83
|
+
puts " Only valid with the 'benchmark' command."
|
84
|
+
puts " -v Display more verbose (warning) messages."
|
85
|
+
puts " -vv Display more verbose (informational) messages."
|
86
|
+
puts
|
87
|
+
puts "Commands:"
|
88
|
+
puts " benchmark Benchmarks the parsing of the input path(s)."
|
89
|
+
puts " parse Parses the input path(s)."
|
90
|
+
puts " test Runs the specified unit tests, all are selected by default."
|
91
|
+
puts " xml Parses the input path(s) and displays them as XML."
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
data/lib/nasl/command.rb
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
################################################################################
|
2
|
+
# Copyright (c) 2011, Mak Kolybabi
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
#
|
8
|
+
# 1. Redistributions of source code must retain the above copyright notice, this
|
9
|
+
# list of conditions and the following disclaimer.
|
10
|
+
#
|
11
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
12
|
+
# this list of conditions and the following disclaimer in the documentation
|
13
|
+
# and/or other materials provided with the distribution.
|
14
|
+
#
|
15
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
16
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
17
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
18
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
19
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
20
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
21
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
22
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
23
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
24
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
25
|
+
################################################################################
|
26
|
+
|
27
|
+
module Nasl
|
28
|
+
class Command
|
29
|
+
def self.initialize!
|
30
|
+
Dir.glob(Nasl.lib + 'nasl/commands/*.rb').each { |f| load(f) }
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.all
|
34
|
+
(@_all ||= [])
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.inherited(cls)
|
38
|
+
all << cls
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.find(cmd)
|
42
|
+
all.each do |cls|
|
43
|
+
return cls if cls.binding == cmd
|
44
|
+
end
|
45
|
+
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.banner(title, width=80)
|
50
|
+
# Create center of banner.
|
51
|
+
middle = "[ #{title} ]"
|
52
|
+
|
53
|
+
# Make sure width is a float.
|
54
|
+
width = width.to_f
|
55
|
+
|
56
|
+
# Create bars on either side.
|
57
|
+
leftover = (width - middle.length) / 2
|
58
|
+
left = '-' * leftover.floor
|
59
|
+
right = '-' * leftover.ceil
|
60
|
+
|
61
|
+
left + middle + right
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.run(cfg, args)
|
65
|
+
# Separate plugins and libraries from the rest of the arguments.
|
66
|
+
paths = args.select { |arg| arg =~ /(\/|\.(inc|nasl))$/ }
|
67
|
+
args -= paths
|
68
|
+
|
69
|
+
# If we have no paths to process, there's a problem. Special purpose
|
70
|
+
# commands that don't require files to be declared should override this
|
71
|
+
# method.
|
72
|
+
if paths.empty?
|
73
|
+
puts "No directories (/), libraries (.inc), or plugins (.nasl) were specified."
|
74
|
+
exit 1
|
75
|
+
end
|
76
|
+
|
77
|
+
# Collect all the paths together, recursively.
|
78
|
+
dirents = []
|
79
|
+
paths.each do |path|
|
80
|
+
Pathname.new(path).find do |dirent|
|
81
|
+
if dirent.file? && dirent.extname =~ /inc|nasl/
|
82
|
+
dirents << dirent
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# If the command is capable of handling all the paths at once, send them
|
88
|
+
# in a group, otherwise send them individually.
|
89
|
+
if self.respond_to? :analyze_all then
|
90
|
+
analyze_all(cfg, dirents, args)
|
91
|
+
else
|
92
|
+
dirents.each { |d| analyze(cfg, d, args) }
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
###############################################################################
|
2
|
+
# Copyright (c) 2011, Mak Kolybabi
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
#
|
8
|
+
# 1. Redistributions of source code must retain the above copyright notice, this
|
9
|
+
# list of conditions and the following disclaimer.
|
10
|
+
#
|
11
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
12
|
+
# this list of conditions and the following disclaimer in the documentation
|
13
|
+
# and/or other materials provided with the distribution.
|
14
|
+
#
|
15
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
16
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
17
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
18
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
19
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
20
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
21
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
22
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
23
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
24
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
25
|
+
################################################################################
|
26
|
+
|
27
|
+
require 'benchmark'
|
28
|
+
|
29
|
+
module Nasl
|
30
|
+
class CommandBenchmark < Command
|
31
|
+
def self.binding
|
32
|
+
'benchmark'
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.analyze(cfg, path, args)
|
36
|
+
puts banner(path.basename)
|
37
|
+
|
38
|
+
Benchmark.bmbm do |b|
|
39
|
+
# Read in the file outside of the benchmark, to avoid contaminating it
|
40
|
+
# with filesystem operations.
|
41
|
+
contents = File.open(path, "rb").read
|
42
|
+
|
43
|
+
b.report("Tokenize") do
|
44
|
+
cfg[:iterations].times { Tokenizer.new(contents).get_all }
|
45
|
+
end
|
46
|
+
|
47
|
+
#b.report("Parse") do
|
48
|
+
# cfg[:iterations].times { Parser.new.parse(contents) }
|
49
|
+
#end
|
50
|
+
end
|
51
|
+
|
52
|
+
puts banner(path.basename)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
###############################################################################
|
2
|
+
# Copyright (c) 2011, Mak Kolybabi
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
#
|
8
|
+
# 1. Redistributions of source code must retain the above copyright notice, this
|
9
|
+
# list of conditions and the following disclaimer.
|
10
|
+
#
|
11
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
12
|
+
# this list of conditions and the following disclaimer in the documentation
|
13
|
+
# and/or other materials provided with the distribution.
|
14
|
+
#
|
15
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
16
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
17
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
18
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
19
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
20
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
21
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
22
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
23
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
24
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
25
|
+
################################################################################
|
26
|
+
|
27
|
+
require 'rainbow'
|
28
|
+
|
29
|
+
module Nasl
|
30
|
+
class CommandParse < Command
|
31
|
+
def self.binding
|
32
|
+
'parse'
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.analyze(cfg, path, args)
|
36
|
+
begin
|
37
|
+
contents = File.open(path, "rb").read
|
38
|
+
rescue
|
39
|
+
puts '[' + 'VOID'.color(:magenta) + "] #{path}"
|
40
|
+
return
|
41
|
+
end
|
42
|
+
|
43
|
+
begin
|
44
|
+
Parser.new.parse(contents, path)
|
45
|
+
rescue Exception => e
|
46
|
+
puts '[' + 'FAIL'.color(:red) + "] #{path}"
|
47
|
+
puts e.message
|
48
|
+
puts e.backtrace
|
49
|
+
return
|
50
|
+
end
|
51
|
+
|
52
|
+
puts '[' + 'PASS'.color(:green) + "] #{path}"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
################################################################################
|
2
|
+
# Copyright (c) 2011, Mak Kolybabi
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
#
|
8
|
+
# 1. Redistributions of source code must retain the above copyright notice, this
|
9
|
+
# list of conditions and the following disclaimer.
|
10
|
+
#
|
11
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
12
|
+
# this list of conditions and the following disclaimer in the documentation
|
13
|
+
# and/or other materials provided with the distribution.
|
14
|
+
#
|
15
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
16
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
17
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
18
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
19
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
20
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
21
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
22
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
23
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
24
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
25
|
+
################################################################################
|
26
|
+
|
27
|
+
module Nasl
|
28
|
+
class CommandTest < Command
|
29
|
+
def self.binding
|
30
|
+
'test'
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.run(cfg, args)
|
34
|
+
Test.initialize!(args)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
###############################################################################
|
2
|
+
# Copyright (c) 2011, Mak Kolybabi
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
#
|
8
|
+
# 1. Redistributions of source code must retain the above copyright notice, this
|
9
|
+
# list of conditions and the following disclaimer.
|
10
|
+
#
|
11
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
12
|
+
# this list of conditions and the following disclaimer in the documentation
|
13
|
+
# and/or other materials provided with the distribution.
|
14
|
+
#
|
15
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
16
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
17
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
18
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
19
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
20
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
21
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
22
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
23
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
24
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
25
|
+
################################################################################
|
26
|
+
|
27
|
+
module Nasl
|
28
|
+
class CommandTokenize < Command
|
29
|
+
def self.binding
|
30
|
+
'tokenize'
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.analyze(cfg, path, args)
|
34
|
+
contents = File.open(path, "rb").read
|
35
|
+
|
36
|
+
begin
|
37
|
+
Tokenizer.new(contents).get_tokens
|
38
|
+
rescue TokenException => e
|
39
|
+
puts "The tokenizer raised the following exceptions when processing #{path}:"
|
40
|
+
puts e.message
|
41
|
+
puts e.backtrace
|
42
|
+
puts
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
###############################################################################
|
2
|
+
# Copyright (c) 2011, Mak Kolybabi
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
#
|
8
|
+
# 1. Redistributions of source code must retain the above copyright notice, this
|
9
|
+
# list of conditions and the following disclaimer.
|
10
|
+
#
|
11
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
12
|
+
# this list of conditions and the following disclaimer in the documentation
|
13
|
+
# and/or other materials provided with the distribution.
|
14
|
+
#
|
15
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
16
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
17
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
18
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
19
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
20
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
21
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
22
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
23
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
24
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
25
|
+
################################################################################
|
26
|
+
|
27
|
+
module Nasl
|
28
|
+
class CommandXml < Command
|
29
|
+
def self.binding
|
30
|
+
'xml'
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.analyze(cfg, path, args)
|
34
|
+
contents = File.open(path, "rb").read
|
35
|
+
|
36
|
+
puts banner(path.basename)
|
37
|
+
puts Parser.new.parse(contents).to_s
|
38
|
+
puts banner(path.basename)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/nasl/context.rb
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
###############################################################################
|
2
|
+
# Copyright (c) 2011, Mak Kolybabi
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
#
|
8
|
+
# 1. Redistributions of source code must retain the above copyright notice, this
|
9
|
+
# list of conditions and the following disclaimer.
|
10
|
+
#
|
11
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
12
|
+
# this list of conditions and the following disclaimer in the documentation
|
13
|
+
# and/or other materials provided with the distribution.
|
14
|
+
#
|
15
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
16
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
17
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
18
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
19
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
20
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
21
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
22
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
23
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
24
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
25
|
+
################################################################################
|
26
|
+
|
27
|
+
require 'rainbow'
|
28
|
+
|
29
|
+
module Nasl
|
30
|
+
class Context
|
31
|
+
def initialize(code, path)
|
32
|
+
@code = code
|
33
|
+
@path = path
|
34
|
+
|
35
|
+
# Find all of the newlines in the source code.
|
36
|
+
i = 0
|
37
|
+
@newlines = @code.split(/\n/).map do |nl|
|
38
|
+
i += 1 + nl.length
|
39
|
+
end
|
40
|
+
|
41
|
+
# Treat the start and end of the file as a newlines to simplify the bol
|
42
|
+
# and eol functions.
|
43
|
+
@newlines.unshift(0)
|
44
|
+
@newlines.push(@code.length)
|
45
|
+
|
46
|
+
# Storing the list of newlines in descending order makes the row and
|
47
|
+
# column code nicer.
|
48
|
+
@newlines.reverse!
|
49
|
+
end
|
50
|
+
|
51
|
+
def bol(point)
|
52
|
+
@newlines.find { |nl| nl <= point }
|
53
|
+
end
|
54
|
+
|
55
|
+
def eol(point)
|
56
|
+
@code.index(/\n/, point) || @code.length
|
57
|
+
end
|
58
|
+
|
59
|
+
def col(point)
|
60
|
+
# Columns use base zero indexing.
|
61
|
+
point - bol(point)
|
62
|
+
end
|
63
|
+
|
64
|
+
def row(point)
|
65
|
+
# Rows use base one indexing.
|
66
|
+
@newlines.length - @newlines.index { |nl| nl <= point }
|
67
|
+
end
|
68
|
+
|
69
|
+
def context(inner, outer=nil, header=true, color=true)
|
70
|
+
# If no outer region was provided, we will assume that the desired outer
|
71
|
+
# is from the beginning of the line that the inner region starts on to the
|
72
|
+
# end of the line that the inner region finishes on.
|
73
|
+
outer = bol(inner.begin)..eol(inner.end) if outer.nil?
|
74
|
+
|
75
|
+
ctx = ""
|
76
|
+
point = inner.begin
|
77
|
+
|
78
|
+
# Create the location header.
|
79
|
+
ctx << "Context for row #{row(point)}, column #{col(point)} in file #@path:\n" if header
|
80
|
+
|
81
|
+
# Create the text to the left of the region. The only case where there is
|
82
|
+
# no text to the left is at the start of the program.
|
83
|
+
if outer.begin != inner.begin
|
84
|
+
line = @code[outer.begin..inner.begin - 1]
|
85
|
+
line = line.color(:green) if color
|
86
|
+
ctx << line
|
87
|
+
end
|
88
|
+
|
89
|
+
# Create the text in the region.
|
90
|
+
line = @code[inner.begin..inner.end - 1]
|
91
|
+
line = line.color(:red) if color
|
92
|
+
ctx << line
|
93
|
+
|
94
|
+
# Create the text to the right of the region.
|
95
|
+
line = @code[inner.end..outer.end].chomp
|
96
|
+
line = line.color(:green) if color
|
97
|
+
ctx << line
|
98
|
+
|
99
|
+
ctx << "\n"
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|