#!/usr/bin/env ruby
#
# This user interface provides users with a command console interface to the
# framework.
#

$:.unshift('/usr/share/metasploit/lib')
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']

require 'rex'
require 'msf/ui'
require 'optparse'

if(RUBY_PLATFORM =~ /mswin32/)
	$stderr.puts "[*] The msfconsole interface is not supported on the native Windows Ruby\n"
	$stderr.puts "    interpreter. Things will break, exploits will fail, payloads will not\n"
	$stderr.puts "    be handled correctly. Please use the msfweb 'console' or install \n"
	$stderr.puts "    Cygwin or Linux in VMWare.\n\n"
end

class OptsConsole
	#
	# Return a hash describing the options.
	#
	def self.parse(args)
		options = {}

		opts = OptionParser.new do |opts|
			opts.banner = "Usage: msfconsole [options]"

			opts.separator ""
			opts.separator "Specific options:"

			opts.on("-d", "-d", "Execute the console as defanged") do
				options['Defanged'] = true
			end

			opts.on("-r", "-r <filename>", "Execute the specified resource file") do |r|
				options['Resource'] = r
			end

			opts.on("-c", "-c <filename>", "Load the specified configuration file") do |c|
				options['Config'] = c
			end

			opts.on("-m", "-m <directory>", "Specifies an additional module search path") do |m|
				options['ModulePath'] = m
			end

			# Boolean switch.
			opts.on("-v", "--version", "Show version") do |v|
				options['Version'] = true
			end
			
			# Boolean switch.
			opts.on("-L", "--real-readline", "Use the system Readline library instead of RbReadline") do |v|
				options['RealReadline'] = true
			end
			
			opts.separator ""
			opts.separator "Common options:"

			opts.on_tail("-h", "--help", "Show this message") do
				puts opts
				exit
			end
		end

		begin
			opts.parse!(args)
		rescue OptionParser::InvalidOption
			puts "Invalid option, try -h for usage"
			exit
		end

		options
	end
end

options = OptsConsole.parse(ARGV)
if (options['Version'])
	$stderr.puts 'Framework Version: ' + Msf::Framework::Version
	exit
end

begin
	Msf::Ui::Console::Driver.new(
		Msf::Ui::Console::Driver::DefaultPrompt,
		Msf::Ui::Console::Driver::DefaultPromptChar,
		options
	).run
rescue Interrupt
end
