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

Included in:
Msf::Ui::Console::CommandDispatcher, 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


230
231
232
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 230

def shell
  @shell
end

#tab_complete_itemsObject

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_helpObject


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

#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).


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_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


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

Wraps shell.print


94
95
96
# File 'lib/rex/ui/text/dispatcher_shell.rb', line 94

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

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