#!/usr/bin/env ruby
#
# This user interface provides users with a web-based interface to the framework
#

msfbase = __FILE__
while File.symlink?(msfbase)
	msfbase = File.expand_path(File.readlink(msfbase), File.dirname(msfbase))
end

$:.unshift(File.join(File.dirname(msfbase), 'lib'))
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']


require 'msf/base'
require 'rex'
require 'stringio'



msfroot = File.join(File.dirname(msfbase), 'data', 'msfweb')
Dir.chdir(msfroot)

msfserv = File.join('script', 'server')

# Declare the argument parser for msfweb
arguments = Rex::Parser::Arguments.new(
	"-a" => [ true,  "Bind to this IP address instead of loopback"          ],
	"-p" => [ true,  "Bind to this port instead of 55555"                   ],
	"-d" => [ false, "Daemonize the web server"                             ],
	"-s" => [ false, "Automatically open the browser"                       ],
	"-h" => [ false, "Help banner"                                          ])

opts = {
	'ServerHost' => '127.0.0.1',
	'ServerPort' => '55555'
}
background = false
browser_start = false

# Parse command line arguments.
arguments.parse(ARGV) { |opt, idx, val|
	case opt
		when "-a"
			opts['ServerHost'] = val
		when "-p"
			opts['ServerPort'] = val
		when "-v"
			opts['LogLevel'] = val
		when "-d"
			background = true
		when "-s"
			browser_start = true
		when "-h"
			print(
				"\nUsage: msfweb <options>\n" +
				arguments.usage)
			exit
	end
}


# This is stupid, but we need to override the ARGV constant

ostderr = $stderr
$stderr = StringIO.new

ARGV = [
	'-p', opts['ServerPort'], 
	'-b', opts['ServerHost'],
	'-e', 'production',
	(background ? '-d' : '')
]

$stderr.close
$stderr = ostderr

$browser_url   = "http://#{opts['ServerHost']}:#{opts['ServerPort']}/"
$browser_start = browser_start

$stderr.puts ""
$stderr.puts "[*] Starting msfweb v#{Msf::Framework::Version} on #{$browser_url}"
$stderr.puts ""

load(msfserv)
