nasl 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|