kekkan 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/NEWS.markdown ADDED
@@ -0,0 +1,8 @@
1
+ # News
2
+
3
+ #0.0.1 (October 13, 2012)
4
+ - Added schema and SAX XML parser for NVD CVE v2 XML format
5
+ - SQLite is very slow on large XML files, I recommend using MySql
6
+
7
+ #0.0.0 (July 09, 2012)
8
+ - Initial gem push to save the gem name, unusable
data/README.markdown CHANGED
@@ -1,16 +1,56 @@
1
1
  #Kekkan
2
2
 
3
- Kekkan is a parser for NIST CVE and CPE files.
3
+ Kekkan is a parser and [ActiveRecord](http://api.rubyonrails.org/classes/ActiveRecord/Base.html) database for NVD CVE and CPE XML files.
4
4
 
5
- The name comes from the Japanese word for flaw/defect.
5
+ The name comes from the Japanese word for 'flaw/defect'.
6
+
7
+ Version **0.0.1** is the current release.
8
+
9
+ # Requirements
10
+
11
+ ##Ruby
12
+ Keigan has been tested with ruby-1.9.2-p320, ruby-1.9.3-p125. Please try to use one of these versions if possible. I recommend using RVM to setup your ruby environment you can get it [here](https://rvm.beginrescueend.com/).
13
+
14
+ ### RubyGems
15
+ Kekkan relies heavily on [RubyGems](http://rubygems.org/) to install other dependencies I highly recommend using it. RubyGems is included by default in the 1.9.x versions of [Ruby](http://ruby-lang.org/).
16
+
17
+ - rails
18
+ - yaml
19
+ - nokogiri
20
+
21
+ # Installation
22
+ Installation is really easy just gem install!
23
+
24
+ % gem install kekkan
25
+
26
+ ## Database Setup
27
+
28
+ % kekkan --create-config
29
+ % $EDITOR kekkan.cfg
30
+ % kekkan --create-tables
31
+
32
+ 1. Generate the kekkan.cfg file.
33
+ 2. Edit the kekkan.cfg file, filling in the variables as needed.
34
+ 3. Migrate the database schema.
35
+
36
+ ## Parsing NVD CVE XML
37
+
38
+ % kekkan nvdcve-2.0-2012.xml [nvdcve-2.0-2011.xml ...]
39
+
40
+ 1. Parse the files by passing their names on the command line.
41
+
42
+ # Viewing Data
43
+ The data can be queried with a built in console or with an external database viewer. The data is mostly for consumption from another program.
44
+
45
+ % kekkan --console
6
46
 
7
47
  # Contributing
8
- If you would like to contribute templates/bug fixes/etc to Kekkan. The easiest way is to fork the project on [github](http://github.com/arxopia/kekkan) and make the changes in your fork and the submit a pull request to the project.
48
+ If you would like to contribute bug fixes/etc to Kekkan. The easiest way is to fork the project on [github](http://github.com/arxopia/kekkan) and make the changes in your fork and the submit a pull request to the project.
9
49
 
10
50
  # Issues
11
51
  If you have any problems, bugs or feature requests please use the [github issue tracker](http://github.com/arxopia/kekkan/issues).
12
52
 
13
53
  # Contact
14
- You can reach me at kekkan[at]arxopia[dot]com.
54
+ You can reach the team at kekkan[at]arxopia[dot]com.
15
55
 
16
- You can also contact me on IRC as hammackj on irc.freenode.net, #risu
56
+ You can also contact the team on IRC on irc.freenode.net, #risu
data/Rakefile CHANGED
@@ -37,6 +37,7 @@ end
37
37
 
38
38
  task :release => :build do
39
39
  system "gem push #{Kekkan::APP_NAME}-#{Kekkan::VERSION}.gem"
40
+ puts "#{Kekkan::APP_NAME} a NVD CVE XML parser / database; Just released #{Kekkan::VERSION}. More info at #{Kekkan::SITE}"
40
41
  end
41
42
 
42
43
  task :clean do
data/TODO.markdown ADDED
@@ -0,0 +1,9 @@
1
+ #Todo
2
+
3
+ - CVE xml parser
4
+ - 2.0
5
+ - 1.2
6
+ - RSS xml parser
7
+ - CPE Product parser
8
+ - Vendor statement parser
9
+ -
data/bin/kekkan CHANGED
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env ruby
2
+ #
2
3
  # Copyright (c) 2012 Arxopia LLC.
3
4
  # All rights reserved.
4
-
5
+ #
5
6
  # Redistribution and use in source and binary forms, with or without
6
7
  # modification, are permitted provided that the following conditions are met:
7
-
8
+ #
8
9
  # * Redistributions of source code must retain the above copyright
9
10
  # notice, this list of conditions and the following disclaimer.
10
11
  # * Redistributions in binary form must reproduce the above copyright
@@ -13,7 +14,7 @@
13
14
  # * Neither the name of the Arxopia LLC nor the names of its contributors
14
15
  # may be used to endorse or promote products derived from this software
15
16
  # without specific prior written permission.
16
-
17
+ #
17
18
  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18
19
  # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19
20
  # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
@@ -22,8 +23,8 @@
22
23
  # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
23
24
  # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24
25
  # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25
- #OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
26
- #OF THE POSSIBILITY OF SUCH DAMAGE.
26
+ # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
27
+ # OF THE POSSIBILITY OF SUCH DAMAGE.
27
28
 
28
29
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '/../lib'))
29
30
 
@@ -33,4 +34,5 @@ $stderr.sync = true
33
34
  require 'rubygems'
34
35
  require 'kekkan'
35
36
 
36
- puts "Soon."
37
+ app = Kekkan::CLI::Application.new
38
+ app.run
data/kekkan.gemspec CHANGED
@@ -33,13 +33,13 @@ require 'kekkan'
33
33
  Gem::Specification.new do |s|
34
34
  s.name = "#{Kekkan::APP_NAME}"
35
35
  s.version = Kekkan::VERSION
36
- s.homepage = "http://www.hammackj.com/projects/kekkan"
36
+ s.homepage = "http://www.arxopia.com/projects/kekkan"
37
37
  s.summary = "#{Kekkan::APP_NAME}"
38
- s.description = "#{Kekkan::APP_NAME} is a set of parsers for NVD CVE / CPE xml files"
38
+ s.description = "#{Kekkan::APP_NAME} is an SAX XML parser and database for NVD CVE and CPE XML files."
39
39
  s.license = "BSD"
40
40
 
41
41
  s.author = "Jacob Hammack"
42
- s.email = "jacob.hammack@arxopia.com"
42
+ s.email = "kekkan@arxopia.com"
43
43
 
44
44
  s.files = Dir['[A-Z]*'] + Dir['lib/**/*'] + ['kekkan.gemspec']
45
45
  s.bindir = "bin"
@@ -51,9 +51,6 @@ Gem::Specification.new do |s|
51
51
  s.required_rubygems_version = ">= 1.8.24"
52
52
  s.rubyforge_project = "#{Kekkan::APP_NAME}"
53
53
 
54
- #s.add_development_dependency("simplecov", [">= 0.9.9"])
55
- #s.add_development_dependency("yard", [">= 0.6.4"])
56
-
57
- #s.add_dependency('rails', ['>= 3.0.7'])
58
- #s.add_dependency('libxml-ruby', ['>= 1.1.4'])
54
+ s.add_dependency('rails', ['>= 3.8.7'])
55
+ s.add_dependency('nokogiri', ['>= 1.5.5'])
59
56
  end
data/lib/kekkan.rb CHANGED
@@ -26,5 +26,24 @@
26
26
 
27
27
  module Kekkan
28
28
  APP_NAME = "kekkan"
29
- VERSION = "0.0.0"
29
+ VERSION = "0.0.1"
30
+ AUTHOR = "Arxopia LLC."
31
+ EMAIL = "kekkan@arxopia.com"
32
+ SITE = "http:://www.arxopia.com/projects/kekkan"
33
+ CONFIG_FILE = "./kekkan.cfg"
30
34
  end
35
+
36
+ require 'rails'
37
+ require 'active_record'
38
+ require "active_support"
39
+ require 'optparse'
40
+ require 'irb'
41
+ require 'yaml'
42
+ require 'nokogiri'
43
+
44
+ require 'kekkan/base'
45
+ require 'kekkan/cli'
46
+ require 'kekkan/models'
47
+ require 'kekkan/parsers'
48
+
49
+ include Kekkan::Models
@@ -0,0 +1,30 @@
1
+ # Copyright (c) 2010-2012 Arxopia LLC.
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+ #
7
+ # * Redistributions of source code must retain the above copyright
8
+ # notice, this list of conditions and the following disclaimer.
9
+ # * Redistributions in binary form must reproduce the above copyright
10
+ # notice, this list of conditions and the following disclaimer in the
11
+ # documentation and/or other materials provided with the distribution.
12
+ # * Neither the name of the Arxopia LLC nor the names of its contributors
13
+ # may be used to endorse or promote products derived from this software
14
+ # without specific prior written permission.
15
+ #
16
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ # DISCLAIMED. IN NO EVENT SHALL ARXOPIA LLC BE LIABLE FOR ANY DIRECT, INDIRECT,
20
+ # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
22
+ # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
24
+ # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
25
+ # OF THE POSSIBILITY OF SUCH DAMAGE.
26
+
27
+ module Kekkan
28
+ module Base
29
+ end
30
+ end
@@ -0,0 +1,109 @@
1
+ # Copyright (c) 2010-2012 Arxopia LLC.
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+ #
7
+ # * Redistributions of source code must retain the above copyright
8
+ # notice, this list of conditions and the following disclaimer.
9
+ # * Redistributions in binary form must reproduce the above copyright
10
+ # notice, this list of conditions and the following disclaimer in the
11
+ # documentation and/or other materials provided with the distribution.
12
+ # * Neither the name of the Arxopia LLC nor the names of its contributors
13
+ # may be used to endorse or promote products derived from this software
14
+ # without specific prior written permission.
15
+ #
16
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ # DISCLAIMED. IN NO EVENT SHALL ARXOPIA LLC BE LIABLE FOR ANY DIRECT, INDIRECT,
20
+ # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
22
+ # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
24
+ # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
25
+ # OF THE POSSIBILITY OF SUCH DAMAGE.
26
+
27
+ module Kekkan
28
+ module Base
29
+
30
+ # Kekkan database Schema
31
+ class Schema < ActiveRecord::Migration
32
+
33
+ # Creates all of the database tables required by the parser
34
+ #
35
+ def self.up
36
+ create_table :entries do |t|
37
+ t.string :cve
38
+ t.string :published_datetime
39
+ t.string :last_modified_datetime
40
+ t.string :summary
41
+ t.string :cwe
42
+ t.string :security_protection
43
+ end
44
+
45
+ #create_table :vulnerable_configurations do |t|
46
+ #ignoring for now
47
+ #end
48
+
49
+ create_table :vulnerable_software_lists do |t|
50
+ t.integer :entry_id
51
+ t.string :product
52
+ end
53
+
54
+ create_table :cvsses do |t|
55
+ t.integer :entry_id
56
+ t.string :score
57
+ t.string :access_vector
58
+ t.string :access_complexity
59
+ t.string :authenication
60
+ t.string :confidentiality_impact
61
+ t.string :integrity_impact
62
+ t.string :availability_impact
63
+ t.string :source
64
+ t.string :generated_on_datetime
65
+ end
66
+
67
+ create_table :references do |t|
68
+ t.integer :entry_id
69
+ t.string :source
70
+ t.string :ref_type
71
+ t.string :reference
72
+ t.string :href
73
+ t.string :language
74
+ end
75
+
76
+ create_table :assessment_checks do |t|
77
+ t.integer :entry_id
78
+ t.string :name
79
+ t.string :href
80
+ t.string :system
81
+ end
82
+
83
+ create_table :scanners do |t|
84
+ t.integer :entry_id
85
+ t.string :name
86
+ t.string :href
87
+ t.string :system
88
+ end
89
+
90
+ create_table :versions do |t|
91
+ t.string :version
92
+ end
93
+ end
94
+
95
+ # Deletes all of the database tables created
96
+ #
97
+ def self.down
98
+ drop_table :entries
99
+ #drop_table :vulnerable_configurations
100
+ drop_table :vulnerable_software_lists
101
+ drop_table :cvsses
102
+ drop_table :references
103
+ drop_table :assessment_checks
104
+ drop_table :scanners
105
+ drop_table :versions
106
+ end
107
+ end
108
+ end
109
+ end
data/lib/kekkan/cli.rb ADDED
@@ -0,0 +1,33 @@
1
+ # Copyright (c) 2010-2012 Arxopia LLC.
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+ #
7
+ # * Redistributions of source code must retain the above copyright
8
+ # notice, this list of conditions and the following disclaimer.
9
+ # * Redistributions in binary form must reproduce the above copyright
10
+ # notice, this list of conditions and the following disclaimer in the
11
+ # documentation and/or other materials provided with the distribution.
12
+ # * Neither the name of the Arxopia LLC nor the names of its contributors
13
+ # may be used to endorse or promote products derived from this software
14
+ # without specific prior written permission.
15
+ #
16
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ # DISCLAIMED. IN NO EVENT SHALL ARXOPIA LLC BE LIABLE FOR ANY DIRECT, INDIRECT,
20
+ # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
22
+ # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
24
+ #OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
25
+ #OF THE POSSIBILITY OF SUCH DAMAGE.
26
+
27
+ module Kekkan
28
+ module CLI
29
+ end
30
+ end
31
+
32
+ require 'kekkan/cli/application'
33
+ require 'kekkan/cli/banner'
@@ -0,0 +1,349 @@
1
+ # Copyright (c) 2012 Arxopia LLC.
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+ #
7
+ # * Redistributions of source code must retain the above copyright
8
+ # notice, this list of conditions and the following disclaimer.
9
+ # * Redistributions in binary form must reproduce the above copyright
10
+ # notice, this list of conditions and the following disclaimer in the
11
+ # documentation and/or other materials provided with the distribution.
12
+ # * Neither the name of the Arxopia LLC nor the names of its contributors
13
+ # may be used to endorse or promote products derived from this software
14
+ # without specific prior written permission.
15
+ #
16
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ # DISCLAIMED. IN NO EVENT SHALL ARXOPIA LLC BE LIABLE FOR ANY DIRECT, INDIRECT,
20
+ # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
22
+ # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
24
+ #OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
25
+ #OF THE POSSIBILITY OF SUCH DAMAGE.
26
+
27
+ module Kekkan
28
+ module CLI
29
+
30
+ #
31
+ class Application
32
+ include Kekkan::Base
33
+ attr_accessor :database
34
+
35
+ #
36
+ def initialize
37
+ @options = {}
38
+ @database = {}
39
+
40
+ @options[:debug] = false
41
+ end
42
+
43
+ #
44
+ def create_config(file=CONFIG_FILE)
45
+ File.open(file, 'w+') do |f|
46
+ f.write("database:\n")
47
+ f.write(" adapter: \n")
48
+ f.write(" host: \n")
49
+ f.write(" port: \n")
50
+ f.write(" database: \n")
51
+ f.write(" username: \n")
52
+ f.write(" password: \n")
53
+ f.write(" timeout: \n\n")
54
+ end
55
+ end
56
+
57
+ #
58
+ def load_config(file=CONFIG_FILE, memory_config=false)
59
+ if File.exists?(file) == true or memory_config == true
60
+ begin
61
+ if memory_config
62
+ yaml = YAML::load(file)
63
+ else
64
+ yaml = YAML::load(File.open(file))
65
+ end
66
+
67
+ @database = yaml["database"]
68
+
69
+ puts @database.inspect if @options[:debug]
70
+
71
+ rescue => e
72
+ puts "[!] Error loading configuration! - #{e.message}"
73
+ exit
74
+ end
75
+ else
76
+ puts "[!] Configuration file does not exist!"
77
+ exit
78
+ end
79
+ end
80
+
81
+ # Initiator for [ActiveRecord] migrations.
82
+ #
83
+ # @param direction [Symbol] :up or :down
84
+ def migrate(direction)
85
+ begin
86
+ if @database["adapter"] == nil
87
+ return false, "[!] Invalid database adapter, please check your configuration file"
88
+ end
89
+
90
+ ActiveRecord::Base.establish_connection(@database)
91
+ require 'kekkan/base/schema'
92
+ Schema.migrate(direction)
93
+
94
+ if direction == :up
95
+ puts "[*] Creating tables"
96
+ ver = Version.create
97
+ ver.version = Kekkan::VERSION
98
+ ver.save
99
+ end
100
+
101
+ puts "[*] Dropping tables" if direction == :down
102
+
103
+ #@todo temp hack, fix this by checking the schema on :up or :down for exiting data
104
+ rescue SQLite3::SQLException => sqlitex
105
+ puts "#{sqlitex.message}\n #{sqlitex.backtrace}" if @options[:debug]
106
+ continue
107
+ rescue ActiveRecord::AdapterNotSpecified => ans
108
+ puts "[!] Database adapter not found, please check your configuration file"
109
+ puts "#{ans.message}\n #{ans.backtrace}" if @options[:debug]
110
+ exit
111
+ rescue ActiveRecord::AdapterNotFound => anf
112
+ puts "[!] Database adapter not found, please check your configuration file"
113
+ puts "#{ans.message}\n #{ans.backtrace}" if @options[:debug]
114
+ exit
115
+ rescue => e
116
+ puts "[!] Exception! #{e.message}\n#{e.backtrace}"
117
+ exit
118
+ end
119
+ end
120
+
121
+ #
122
+ def db_connect
123
+ begin
124
+ if @database["adapter"] == nil
125
+ puts "[!] #{@database['adapter']}" if @options[:debug]
126
+
127
+ return false, "[!] Invalid database adapter, please check your configuration file"
128
+ end
129
+
130
+ ActiveRecord::Base.establish_connection(@database)
131
+ connection = ActiveRecord::Base.connection
132
+
133
+ if @database["adapter"] =~ /sqlite/
134
+ connection.execute("PRAGMA default_synchronous=OFF;")
135
+ connection.execute("PRAGMA synchronous=OFF;")
136
+ connection.execute("PRAGMA journal_mode=OFF;")
137
+ end
138
+
139
+ connection
140
+ rescue ActiveRecord::AdapterNotSpecified => ans
141
+ puts "[!] Database adapter not found, please check your configuration file"
142
+ puts "#{ans.message}\n #{ans.backtrace}" if @options[:debug]
143
+ exit
144
+ rescue ActiveRecord::AdapterNotFound => anf
145
+ puts "[!] Database adapter not found, please check your configuration file"
146
+ puts "#{anf.message}\n #{anf.backtrace}" if @options[:debug]
147
+ exit
148
+ rescue => e
149
+ puts "[!] Exception! #{e.message}\n #{e.backtrace}"
150
+ end
151
+ end
152
+
153
+ #
154
+ def test_connection?
155
+ begin
156
+
157
+ db_connect
158
+
159
+ if ActiveRecord::Base.connected? == true
160
+ return true, "[*] Connection Test Successful"
161
+ else
162
+ return false, "[!] Connection Test Failed"
163
+ end
164
+ rescue => e
165
+ puts "[!] Exception! #{e.message}\n #{e.backtrace}"
166
+ end
167
+ end
168
+
169
+ # Starts a console and executes anything in a block sent to it
170
+ #
171
+ # @param block Code block to transfer control
172
+ def consolize &block
173
+
174
+ yield
175
+
176
+ IRB.setup(nil)
177
+ IRB.conf[:USE_READLINE] = true
178
+ IRB.conf[:PROMPT_MODE] = :SIMPLE
179
+
180
+ irb = IRB::Irb.new
181
+ IRB.conf[:MAIN_CONTEXT] = irb.context
182
+
183
+ irb.context.evaluate("require 'irb/completion'", 0)
184
+
185
+ trap("SIGINT") do
186
+ irb.signal_handle
187
+ end
188
+ catch(:IRB_EXIT) do
189
+ irb.eval_input
190
+ end
191
+ end
192
+
193
+ #
194
+ def parse_options
195
+ begin
196
+ opts = OptionParser.new do |opt|
197
+ opt.banner = "#{APP_NAME} v#{VERSION}\nJacob Hammack\n#{SITE}\n\n"
198
+ opt.banner << "Usage: #{APP_NAME} [options] [files_to_parse]"
199
+
200
+ opt.separator('')
201
+ opt.separator('Configuration Options')
202
+
203
+ opt.on('--config-file FILE', "Loads configuration settings for the specified file. By default #{APP_NAME} loads #{CONFIG_FILE}") do |option|
204
+ if File.exists?(option) == true
205
+ @options[:config_file] = option
206
+ else
207
+ puts "[!] Specified config file does not exist. Please specify a file that exists."
208
+ exit
209
+ end
210
+ end
211
+
212
+ opt.on('--create-config-file [FILE]',"Creates a configuration file in the current directory with the specified name, Default is #{CONFIG_FILE}") do |option|
213
+ if option == nil
214
+ option = CONFIG_FILE
215
+ end
216
+
217
+ if File.exists?(option) == true
218
+ puts "[!] Configuration file already exists; If you wish to over-write this file please delete it."
219
+ else
220
+ if option == nil
221
+ create_config
222
+ else
223
+ create_config option
224
+ end
225
+
226
+ exit
227
+ end
228
+ end
229
+
230
+ opt.separator('')
231
+ opt.separator('Database Options')
232
+
233
+ opt.on('--test-connection','Tests the database connection settings') do |option|
234
+ @options[:test_connection] = option
235
+ end
236
+
237
+ opt.on('--create-tables',"Creates the tables required for #{APP_NAME}") do |option|
238
+ @options[:create_tables] = option
239
+ end
240
+
241
+ opt.on('--drop-tables', "Deletes the tables and data from #{APP_NAME}") do |option|
242
+ @options[:drop_tables] = option
243
+ end
244
+
245
+ opt.separator ''
246
+ opt.separator 'Other Options'
247
+
248
+ opt.on_tail('-v', '--version', "Shows application version information") do
249
+ puts "#{APP_NAME}: #{VERSION}\nRuby Version: #{RUBY_VERSION}\nRubygems Version: #{Gem::VERSION}"
250
+ exit
251
+ end
252
+
253
+ opt.on('-d','--debug','Enable Debug Mode (More verbose output)') do |option|
254
+ @options[:debug] = true
255
+ end
256
+
257
+ opt.on('--console', 'Starts an ActiveRecord console into the configured database') do |option|
258
+ @options[:console] = option
259
+ end
260
+
261
+ opt.on_tail("-?", "--help", "Show this message") do
262
+ puts opt.to_s + "\n"
263
+ exit
264
+ end
265
+ end
266
+
267
+ if ARGV.length != 0
268
+ opts.parse!
269
+ else
270
+ puts opts.to_s + "\n"
271
+ exit
272
+ end
273
+ rescue OptionParser::MissingArgument => m
274
+ puts opts.to_s + "\n"
275
+ exit
276
+ rescue OptionParser::InvalidOption => i
277
+ puts opts.to_s + "\n"
278
+ exit
279
+ end
280
+ end
281
+
282
+ #
283
+ def parse_file file
284
+ begin
285
+ parser = Nokogiri::XML::SAX::Parser.new(Kekkan::Parsers::Cve2Document.new)
286
+
287
+ parser.parse(File.open(file))
288
+
289
+ rescue => e
290
+ raise e
291
+ end
292
+ end
293
+
294
+ #
295
+ def run
296
+ parse_options
297
+
298
+ if @options[:debug]
299
+ puts "[*] Enabling Debug Mode"
300
+ end
301
+
302
+ if @options[:config_file] != nil
303
+ load_config @options[:config_file]
304
+ else
305
+ load_config
306
+ end
307
+
308
+ db_connect
309
+
310
+ if @options[:console] != nil
311
+ consolize do
312
+ puts Kekkan::CLI::Banner
313
+ puts "#{APP_NAME} Console v#{VERSION}"
314
+ end
315
+ exit
316
+ end
317
+
318
+ if @options[:test_connection] != nil
319
+ result = test_connection?
320
+
321
+ puts "#{result[1]}"
322
+ exit
323
+ end
324
+
325
+ if @options[:create_tables] != nil
326
+ migrate(:up)
327
+ exit
328
+ end
329
+
330
+ if @options[:drop_tables] != nil
331
+ migrate(:down)
332
+ exit
333
+ end
334
+
335
+ ARGV.each do |file|
336
+ begin
337
+ parse_file file
338
+
339
+ rescue => e
340
+ puts e.inspect
341
+ puts "[!] #{e.message}\n #{e.backtrace.join("\n")}\n"
342
+ puts "[!] Error: #{file}"
343
+ next
344
+ end
345
+ end
346
+ end
347
+ end
348
+ end
349
+ end