Files
metasploit-gs/plugins/db_sqlite2.rb
T

172 lines
3.5 KiB
Ruby
Raw Normal View History

2006-04-03 04:33:30 +00:00
require 'fileutils'
2006-05-30 15:44:48 +00:00
require 'msf/ui/console/command_dispatcher/db'
2007-12-31 09:12:27 +00:00
require "rubygems"
require "sqlite"
2006-04-03 04:33:30 +00:00
module Msf
###
#
# This class intializes the database db with a shiny new
# SQLite2 database instance.
2006-04-03 04:33:30 +00:00
#
###
class Plugin::DBSQLite2 < Msf::Plugin
#
# Command dispatcher for configuring SQLite
2006-04-03 04:33:30 +00:00
#
class SQLiteCommandDispatcher
include Msf::Ui::Console::CommandDispatcher
#
# The dispatcher's name.
#
def name
"SQLite2 Database"
2006-04-03 04:33:30 +00:00
end
#
# The initial command set
#
def commands
{
"db_connect" => "Connect to an existing database ( /path/to/db )",
"db_disconnect" => "Disconnect from the current database instance",
"db_create" => "Create a brand new database ( /path/to/db )",
"db_destroy" => "Drop an existing database ( /path/to/db )"
}
end
#
# Disconnect from the current SQLite instance
#
def cmd_db_disconnect(*args)
if (framework.db)
framework.db.disconnect()
2006-09-18 00:29:14 +00:00
driver.remove_dispatcher('Database Backend')
end
end
#
# Connect to an existing SQLite database
#
def cmd_db_connect(*args)
info = parse_db_uri(args[0])
opts = { 'adapter' => 'sqlite' }
opts['dbfile'] = info[:path]
2006-09-18 00:29:14 +00:00
if (not File.exists?(opts['dbfile']))
print_status("The specified database does not exist")
return
end
if (not framework.db.connect(opts))
raise PluginLoadError.new("Failed to connect to the database")
end
driver.append_dispatcher(DatabaseCommandDispatcher)
end
#
# Create a new SQLite database instance
#
def cmd_db_create(*args)
cmd_db_disconnect()
info = parse_db_uri(args[0])
opts = { 'adapter' => 'sqlite' }
opts['dbfile'] = info[:path]
sql = File.join(Msf::Config.install_root, "data", "sql", "sqlite.sql")
2007-12-31 09:12:27 +00:00
if (File.exists?(opts['dbfile']))
print_status("The specified database already exists, connecting")
else
2007-12-31 09:12:27 +00:00
print_status("Creating a new database instance...")
db = SQLite::Database.new(opts['dbfile'])
File.read(sql).split(";").each do |line|
begin
db.execute(line.strip)
rescue ::SQLite::Exceptions::SQLException, ::NoMethodError
end
2007-12-31 09:12:27 +00:00
end
db.close
2007-12-31 09:12:27 +00:00
end
if (not framework.db.connect(opts))
raise PluginLoadError.new("Failed to connect to the database")
end
driver.append_dispatcher(DatabaseCommandDispatcher)
print_status("Successfully connected to the database")
print_status("File: #{opts['dbfile']}")
end
#
# Drop an existing database
#
def cmd_db_destroy(*args)
cmd_db_disconnect()
info = parse_db_uri(args[0])
File.unlink(info[:path])
2006-04-03 04:33:30 +00:00
end
def parse_db_uri(path)
res = {}
2006-09-18 00:29:14 +00:00
res[:path] = path || File.join(Msf::Config.config_directory, 'sqlite2.db')
res
2006-04-03 04:33:30 +00:00
end
end
#
# Wrapper class for the database command dispatcher
2006-04-03 04:33:30 +00:00
#
class DatabaseCommandDispatcher
2006-04-03 04:33:30 +00:00
include Msf::Ui::Console::CommandDispatcher
2006-05-30 15:44:48 +00:00
include Msf::Ui::Console::CommandDispatcher::Db
2006-04-03 04:33:30 +00:00
end
2006-05-30 15:44:48 +00:00
###
#
# Database specific initialization goes here
#
###
2006-04-03 04:33:30 +00:00
def initialize(framework, opts)
super
add_console_dispatcher(SQLiteCommandDispatcher)
2006-04-03 04:33:30 +00:00
end
2006-04-03 04:33:30 +00:00
def cleanup
remove_console_dispatcher('SQLite2 Database')
2006-04-03 04:33:30 +00:00
remove_console_dispatcher('Database Backend')
end
#
# This method returns a short, friendly name for the plugin.
#
def name
"db_sqlite2"
end
#
# This method returns a brief description of the plugin. It should be no
# more than 60 characters, but there are no hard limits.
#
def desc
"Loads a new sqlite2 database backend"
end
protected
end
2008-10-19 21:03:39 +00:00
end