Merge custom prompt code
git-svn-id: file:///home/svn/framework3/trunk@13272 4d416f70-5f16-0410-b530-b9f4589650daunstable
parent
b930b2622f
commit
1902b92878
|
@ -72,8 +72,16 @@ class Driver < Msf::Ui::Driver
|
||||||
|
|
||||||
histfile = opts['HistFile'] || Msf::Config.history_file
|
histfile = opts['HistFile'] || Msf::Config.history_file
|
||||||
|
|
||||||
|
# Initialize attributes
|
||||||
|
self.framework = opts['Framework'] || Msf::Simple::Framework.create(opts)
|
||||||
|
|
||||||
|
if self.framework.datastore['Prompt']
|
||||||
|
prompt = self.framework.datastore['Prompt']
|
||||||
|
prompt_char = self.framework.datastore['Prompt_Char'] || DefaultPromptChar
|
||||||
|
end
|
||||||
|
|
||||||
# Call the parent
|
# Call the parent
|
||||||
super(prompt, prompt_char, histfile)
|
super(prompt, prompt_char, histfile, framework)
|
||||||
|
|
||||||
# Temporarily disable output
|
# Temporarily disable output
|
||||||
self.disable_output = true
|
self.disable_output = true
|
||||||
|
@ -81,9 +89,6 @@ class Driver < Msf::Ui::Driver
|
||||||
# Load pre-configuration
|
# Load pre-configuration
|
||||||
load_preconfig
|
load_preconfig
|
||||||
|
|
||||||
# Initialize attributes
|
|
||||||
self.framework = opts['Framework'] || Msf::Simple::Framework.create(opts)
|
|
||||||
|
|
||||||
# Initialize the user interface to use a different input and output
|
# Initialize the user interface to use a different input and output
|
||||||
# handle if one is supplied
|
# handle if one is supplied
|
||||||
input = opts['LocalInput']
|
input = opts['LocalInput']
|
||||||
|
@ -99,12 +104,6 @@ class Driver < Msf::Ui::Driver
|
||||||
output = Rex::Ui::Text::Output::Stdio.new
|
output = Rex::Ui::Text::Output::Stdio.new
|
||||||
end
|
end
|
||||||
|
|
||||||
# Verify console compatibility on Windows (require Console2)
|
|
||||||
if Rex::Compat.is_windows and not Rex::Compat.win32_console2_verify and input.kind_of?(Rex::Ui::Text::Input::Stdio)
|
|
||||||
$stdout.puts "Error: The Metasploit Framework is not compatible with this console"
|
|
||||||
exit(1)
|
|
||||||
end
|
|
||||||
|
|
||||||
init_ui(input, output)
|
init_ui(input, output)
|
||||||
init_tab_complete
|
init_tab_complete
|
||||||
|
|
||||||
|
@ -390,6 +389,9 @@ class Driver < Msf::Ui::Driver
|
||||||
handle_console_logging(val) if (glob)
|
handle_console_logging(val) if (glob)
|
||||||
when "loglevel"
|
when "loglevel"
|
||||||
handle_loglevel(val) if (glob)
|
handle_loglevel(val) if (glob)
|
||||||
|
when "prompt"
|
||||||
|
update_prompt(val, framework.datastore['Prompt_Char'] || DefaultPromptChar, true)
|
||||||
|
when "prompt_char"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -78,8 +78,8 @@ module DispatcherShell
|
||||||
#
|
#
|
||||||
# Wraps shell.update_prompt
|
# Wraps shell.update_prompt
|
||||||
#
|
#
|
||||||
def update_prompt(prompt=nil)
|
def update_prompt(prompt=nil, prompt_char = nil, mode = false)
|
||||||
shell.update_prompt(prompt)
|
shell.update_prompt(prompt, prompt_char, mode)
|
||||||
end
|
end
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -204,7 +204,7 @@ module DispatcherShell
|
||||||
#
|
#
|
||||||
# Initialize the dispatcher shell.
|
# Initialize the dispatcher shell.
|
||||||
#
|
#
|
||||||
def initialize(prompt, prompt_char = '>', histfile = nil)
|
def initialize(prompt, prompt_char = '>', histfile = nil, framework = nil)
|
||||||
super
|
super
|
||||||
|
|
||||||
# Initialze the dispatcher array
|
# Initialze the dispatcher array
|
||||||
|
|
|
@ -18,8 +18,6 @@ begin
|
||||||
# Initializes the readline-aware Input instance for text.
|
# Initializes the readline-aware Input instance for text.
|
||||||
#
|
#
|
||||||
def initialize(tab_complete_proc = nil)
|
def initialize(tab_complete_proc = nil)
|
||||||
|
|
||||||
|
|
||||||
if(not Object.const_defined?('Readline'))
|
if(not Object.const_defined?('Readline'))
|
||||||
begin
|
begin
|
||||||
require 'readline'
|
require 'readline'
|
||||||
|
@ -79,14 +77,66 @@ begin
|
||||||
# down other background threads. This is important when there are many active
|
# down other background threads. This is important when there are many active
|
||||||
# background jobs, such as when the user is running Karmetasploit
|
# background jobs, such as when the user is running Karmetasploit
|
||||||
#
|
#
|
||||||
def pgets
|
def pgets(framework = nil)
|
||||||
|
|
||||||
line = nil
|
line = nil
|
||||||
orig = Thread.current.priority
|
orig = Thread.current.priority
|
||||||
|
|
||||||
begin
|
begin
|
||||||
Thread.current.priority = -20
|
Thread.current.priority = -20
|
||||||
|
|
||||||
output.prompting
|
output.prompting
|
||||||
|
if framework
|
||||||
|
if prompt.include?("%T")
|
||||||
|
t = Time.now
|
||||||
|
if framework.datastore['Time_Fmt']
|
||||||
|
t = t.strftime(framework.datastore['Time_Fmt'])
|
||||||
|
end
|
||||||
|
prompt.gsub!(/%T/, t.to_s)
|
||||||
|
end
|
||||||
|
|
||||||
|
if prompt.include?("%H")
|
||||||
|
hostname = ENV['HOSTNAME']
|
||||||
|
if hostname.nil?
|
||||||
|
hostname = `hostname`.split('.')[0]
|
||||||
|
end
|
||||||
|
|
||||||
|
# check if hostname is still nil
|
||||||
|
if hostname.nil?
|
||||||
|
hostname = ENV['COMPUTERNAME']
|
||||||
|
end
|
||||||
|
|
||||||
|
if hostname.nil?
|
||||||
|
hostname = 'unknown'
|
||||||
|
end
|
||||||
|
|
||||||
|
prompt.gsub!(/%H/, hostname.chomp)
|
||||||
|
end
|
||||||
|
|
||||||
|
if prompt.include?("%U")
|
||||||
|
user = ENV['USER']
|
||||||
|
if user.nil?
|
||||||
|
user = `whoami`
|
||||||
|
end
|
||||||
|
|
||||||
|
# check if username is still nil
|
||||||
|
if user.nil?
|
||||||
|
user = ENV['USERNAME']
|
||||||
|
end
|
||||||
|
|
||||||
|
if user.nil?
|
||||||
|
user = 'unknown'
|
||||||
|
end
|
||||||
|
|
||||||
|
prompt.gsub!(/%U/, user.chomp)
|
||||||
|
end
|
||||||
|
|
||||||
|
prompt.gsub!(/%S/, framework.sessions.count.to_s)
|
||||||
|
prompt.gsub!(/%J/, framework.jobs.count.to_s)
|
||||||
|
prompt.gsub!(/%L/, Rex::Socket.source_address("50.50.50.50"))
|
||||||
|
prompt.gsub!(/%D/, ::Dir.getwd)
|
||||||
|
end
|
||||||
|
|
||||||
line = ::Readline.readline(prompt, true)
|
line = ::Readline.readline(prompt, true)
|
||||||
::Readline::HISTORY.pop if (line and line.empty?)
|
::Readline::HISTORY.pop if (line and line.empty?)
|
||||||
ensure
|
ensure
|
||||||
|
|
|
@ -36,7 +36,7 @@ module Shell
|
||||||
#
|
#
|
||||||
# Initializes a shell that has a prompt and can be interacted with.
|
# Initializes a shell that has a prompt and can be interacted with.
|
||||||
#
|
#
|
||||||
def initialize(prompt, prompt_char = '>', histfile = nil)
|
def initialize(prompt, prompt_char = '>', histfile = nil, framework = nil)
|
||||||
# Set the stop flag to false
|
# Set the stop flag to false
|
||||||
self.stop_flag = false
|
self.stop_flag = false
|
||||||
self.disable_output = false
|
self.disable_output = false
|
||||||
|
@ -48,6 +48,8 @@ module Shell
|
||||||
|
|
||||||
self.histfile = histfile
|
self.histfile = histfile
|
||||||
self.hist_last_saved = 0
|
self.hist_last_saved = 0
|
||||||
|
|
||||||
|
self.framework = framework
|
||||||
end
|
end
|
||||||
|
|
||||||
def init_tab_complete
|
def init_tab_complete
|
||||||
|
@ -124,7 +126,7 @@ module Shell
|
||||||
break if (self.stop_flag or self.stop_count > 1)
|
break if (self.stop_flag or self.stop_count > 1)
|
||||||
|
|
||||||
init_tab_complete
|
init_tab_complete
|
||||||
line = input.pgets
|
line = input.pgets(self.framework)
|
||||||
log_output(input.prompt)
|
log_output(input.prompt)
|
||||||
|
|
||||||
# If a block was passed in, pass the line to it. If it returns true,
|
# If a block was passed in, pass the line to it. If it returns true,
|
||||||
|
@ -176,14 +178,21 @@ module Shell
|
||||||
#
|
#
|
||||||
# Change the input prompt.
|
# Change the input prompt.
|
||||||
#
|
#
|
||||||
def update_prompt(prompt = nil, new_prompt_char = nil)
|
# prompt - the actual prompt
|
||||||
|
# new_prompt_char the char to append to the prompt
|
||||||
|
# mode - append or not to append - false = append true = make a new prompt
|
||||||
|
def update_prompt(prompt = nil, new_prompt_char = nil, mode = false)
|
||||||
if (self.input)
|
if (self.input)
|
||||||
if (prompt)
|
if prompt
|
||||||
new_prompt = self.init_prompt + ' ' + prompt + prompt_char + ' '
|
new_prompt = self.init_prompt + ' ' + prompt + prompt_char + ' '
|
||||||
else
|
else
|
||||||
new_prompt = self.prompt || ''
|
new_prompt = self.prompt || ''
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if mode
|
||||||
|
new_prompt = prompt + (new_prompt_char || prompt_char) + ' '
|
||||||
|
end
|
||||||
|
|
||||||
# Save the prompt before any substitutions
|
# Save the prompt before any substitutions
|
||||||
self.prompt = new_prompt
|
self.prompt = new_prompt
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue