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
-
#shell ⇒ Object
No tab completion items by default.
-
#tab_complete_items ⇒ Object
No tab completion items by default.
Instance Method Summary collapse
-
#cmd_help(cmd = nil, *ignored) ⇒ Object
(also: #cmd_?)
Displays the help banner.
- #cmd_help_help ⇒ Object
-
#cmd_help_tabs(str, words) ⇒ Object
Tab completion for the help command.
-
#commands ⇒ Object
Returns nil for an empty set of commands.
-
#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). -
#deprecated_commands ⇒ Object
Returns an empty set of commands.
- #deprecated_help(method = nil) ⇒ Object
-
#help_to_s(opts = {}) ⇒ Object
Return a pretty, user-readable table of commands provided by this dispatcher.
-
#initialize(shell) ⇒ Object
Initializes the command dispatcher mixin.
-
#print(msg = '') ⇒ Object
Wraps shell.print.
-
#print_error(msg = '') ⇒ Object
Wraps shell.print_error.
-
#print_good(msg = '') ⇒ Object
Wraps shell.print_good.
-
#print_line(msg = '') ⇒ Object
Wraps shell.print_line.
-
#print_status(msg = '') ⇒ Object
Wraps shell.print_status.
-
#print_warning(msg = '') ⇒ Object
Wraps shell.print_warning.
-
#tab_complete_filenames(str, words) ⇒ Object
Provide a generic tab completion for file names.
-
#update_prompt(prompt = nil, prompt_char = nil, mode = false) ⇒ Object
Wraps shell.update_prompt.
Instance Attribute Details
#shell ⇒ Object
No tab completion items by default
230 231 232 |
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 230 def shell @shell end |
#tab_complete_items ⇒ Object
No tab completion items by default
230 231 232 |
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 230 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.
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 170 171 172 173 174 175 176 |
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 144 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_help ⇒ Object
132 133 134 |
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 132 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.
183 184 185 186 187 188 189 190 191 |
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 183 def cmd_help_tabs(str, words) return [] if words.length > 1 tabs = [] shell.dispatcher_stack.each { |dispatcher| tabs += dispatcher.commands.keys } return tabs end |
#commands ⇒ Object
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).
103 104 105 106 107 108 109 110 111 112 |
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 103 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_commands ⇒ Object
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
114 115 116 117 118 119 120 121 122 123 |
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 114 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.
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 |
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 199 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 |
#print(msg = '') ⇒ Object
Wraps shell.print
94 95 96 |
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 94 def print(msg = '') shell.print(msg) end |
#print_error(msg = '') ⇒ Object
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 |
#print_good(msg = '') ⇒ Object
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 |
#print_line(msg = '') ⇒ Object
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 |
#print_status(msg = '') ⇒ Object
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 |
#print_warning(msg = '') ⇒ Object
Wraps shell.print_warning
87 88 89 |
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 87 def print_warning(msg = '') shell.print_warning(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.
238 239 240 241 242 243 244 245 246 |
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 238 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
128 129 130 |
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 128 def update_prompt(prompt=nil, prompt_char = nil, mode = false) shell.update_prompt(prompt, prompt_char, mode) end |