Module: Rex::Ui::Text::DispatcherShell::CommandDispatcher

Included in:
Post::Meterpreter::Ui::Console::CommandDispatcher
Defined in:
lib/rex/ui/text/dispatcher_shell.rb

Overview

Empty template base class for command dispatchers.

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#shellObject

No tab completion items by default



223
224
225
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 223

def shell
  @shell
end

#tab_complete_itemsObject

No tab completion items by default



223
224
225
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 223

def tab_complete_items
  @tab_complete_items
end

Instance Method Details

#cmd_help(cmd = nil, *ignored) ⇒ Object Also known as: cmd_?

Displays the help banner. With no arguments, this is just a list of all commands grouped by dispatcher. Otherwise, tries to use a method named cmd_#<code>cmd</code>_help for the first dispatcher that has a command named cmd. If no such method exists, uses cmd as a regex to compare against each enstacked dispatcher’s name and dumps commands of any that match.



137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 137

def cmd_help(cmd=nil, *ignored)
	if cmd
		help_found = false
		cmd_found = false
		shell.dispatcher_stack.each do |dispatcher|
			next unless dispatcher.respond_to?(:commands)
			next if (dispatcher.commands.nil?)
			next if (dispatcher.commands.length == 0)

			if dispatcher.respond_to?("cmd_#{cmd}")
				cmd_found = true
				break unless dispatcher.respond_to? "cmd_#{cmd}_help"
				dispatcher.send("cmd_#{cmd}_help")
				help_found = true
				break
			end
		end

		unless cmd_found
			# We didn't find a cmd, try it as a dispatcher name
			shell.dispatcher_stack.each do |dispatcher|
				if dispatcher.name =~ /#{cmd}/i
					print_line(dispatcher.help_to_s)
					cmd_found = help_found = true
				end
			end
		end
		print_error("No help for #{cmd}, try -h") if cmd_found and not help_found
		print_error("No such command") if not cmd_found
	else
		print(shell.help_to_s)
	end
end

#cmd_help_helpObject



125
126
127
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 125

def cmd_help_help
	print_line "There's only so much I can do"
end

#cmd_help_tabs(str, words) ⇒ Object

Tab completion for the help command

By default just returns a list of all commands in all dispatchers.



176
177
178
179
180
181
182
183
184
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 176

def cmd_help_tabs(str, words)
	return [] if words.length > 1

	tabs = []
	shell.dispatcher_stack.each { |dispatcher|
		tabs += dispatcher.commands.keys
	}
	return tabs
end

#commandsObject

Returns nil for an empty set of commands.

This method should be overridden to return a Hash with command names for keys and brief help text for values.



42
43
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 42

def commands
end

#deprecated_cmd(method = nil, *args) ⇒ Object

Print a warning that the called command is deprecated and optionally forward to the replacement method (useful for when commands are renamed).



96
97
98
99
100
101
102
103
104
105
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 96

def deprecated_cmd(method=nil, *args)
	cmd = caller[0].match(/`cmd_(.*)'/)[1]
	print_error "The #{cmd} command is DEPRECATED"
	if cmd == "db_autopwn"
		print_error "See http://r-7.co/xY65Zr instead"
	elsif method and self.respond_to?("cmd_#{method}")
		print_error "Use #{method} instead"
		self.send("cmd_#{method}", *args)
	end
end

#deprecated_commandsObject

Returns an empty set of commands.

This method should be overridden if the dispatcher has commands that should be treated as deprecated. Deprecated commands will not show up in help and will not tab-complete, but will still be callable.



52
53
54
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 52

def deprecated_commands
	[]
end

#deprecated_help(method = nil) ⇒ Object



107
108
109
110
111
112
113
114
115
116
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 107

def deprecated_help(method=nil)
	cmd = caller[0].match(/`cmd_(.*)_help'/)[1]
	print_error "The #{cmd} command is DEPRECATED"
	if cmd == "db_autopwn"
		print_error "See http://r-7.co/xY65Zr instead"
	elsif method and self.respond_to?("cmd_#{method}_help")
		print_error "Use 'help #{method}' instead"
		self.send("cmd_#{method}_help")
	end
end

#help_to_s(opts = {}) ⇒ Object

Return a pretty, user-readable table of commands provided by this dispatcher.



192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 192

def help_to_s(opts={})
	# If this dispatcher has no commands, we can't do anything useful.
	return "" if commands.nil? or commands.length == 0

	# Display the commands
	tbl = Table.new(
		'Header'  => "#{self.name} Commands",
		'Indent'  => opts['Indent'] || 4,
		'Columns' =>
			[
				'Command',
				'Description'
			],
		'ColProps' =>
			{
				'Command' =>
					{
						'MaxWidth' => 12
					}
			})

	commands.sort.each { |c|
		tbl << c
	}

	return "\n" + tbl.to_s + "\n"
end

#initialize(shell) ⇒ Object

Initializes the command dispatcher mixin.



31
32
33
34
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 31

def initialize(shell)
	self.shell = shell
	self.tab_complete_items = []
end

Wraps shell.print



87
88
89
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 87

def print(msg = '')
	shell.print(msg)
end

Wraps shell.print_error



59
60
61
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 59

def print_error(msg = '')
	shell.print_error(msg)
end

Wraps shell.print_good



80
81
82
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 80

def print_good(msg = '')
	shell.print_good(msg)
end

Wraps shell.print_line



73
74
75
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 73

def print_line(msg = '')
	shell.print_line(msg)
end

Wraps shell.print_status



66
67
68
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 66

def print_status(msg = '')
	shell.print_status(msg)
end

#tab_complete_filenames(str, words) ⇒ Object

Provide a generic tab completion for file names.

If the only completion is a directory, this descends into that directory and continues completions with filenames contained within.



231
232
233
234
235
236
237
238
239
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 231

def tab_complete_filenames(str, words)
	matches = ::Readline::FILENAME_COMPLETION_PROC.call(str)
	if matches and matches.length == 1 and File.directory?(matches[0])
		dir = matches[0]
		dir += File::SEPARATOR if dir[-1,1] != File::SEPARATOR
		matches = ::Readline::FILENAME_COMPLETION_PROC.call(dir)
	end
	matches
end

#update_prompt(prompt = nil, prompt_char = nil, mode = false) ⇒ Object

Wraps shell.update_prompt



121
122
123
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 121

def update_prompt(prompt=nil, prompt_char = nil, mode = false)
	shell.update_prompt(prompt, prompt_char, mode)
end