Source code for pysap.utils.console

# encoding: utf-8
# pysap - Python library for crafting SAP's network protocols packets
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# Author:
#   Martin Gallo (@martingalloar)
#   Code contributed by SecureAuth to the OWASP CBAS project
#

# Standard imports
from cmd import Cmd
# Optional imports
try:
    from tabulate import tabulate
except ImportError:
    tabulate = None


# Base Console
[docs]class BaseConsole (Cmd, object): # Initialization def __init__(self, options): super(BaseConsole, self).__init__() self.prompt = "pysap's console>" self._hist = [] self.options = options self.runtimeoptions = {} # Console Command definitions
[docs] def do_history(self, args): """Show commands history.""" self._print(self._hist)
[docs] def do_exit(self, args): """Exit console.""" return -1
[docs] def do_help(self, args): """Show help.""" super(BaseConsole, self).do_help(args)
[docs] def do_options(self, args): """Show/set options.""" # If no args, print the current options if not args: options_dict = vars(self.options) self._print("Configuration options:") for option, value in list(options_dict.items()): self._print("[" + option + "] = " + str(value)) self._print("Run-time options:") for option in list(self.runtimeoptions.keys()): self._print("[" + option + "] = " + str(self.runtimeoptions[option])) # Set a run-time option else: args = args.split(" ", 1) if len(args) == 2: option = args.pop(0) # Extract the option value = args.pop(0) if option in list(self.runtimeoptions.keys()): self.runtimeoptions[option] = value else: self._error("Invalid or non run-time option.") else: self._error("Invalid number of parameters.") self.do_help("options")
[docs] def complete_options(self, text, line, begidx, endidx): if not text: # Complete list of run-time options return list(self.runtimeoptions.keys()) else: # Options starting with text return [option for option in list(self.runtimeoptions.keys()) if option.startswith(text)]
[docs] def do_script(self, args): """Runs a script file.""" if not args: self._error("Invalid number of parameters.") self.do_help("script") else: try: scriptfile = open(args, 'r') for line in scriptfile: if not line[0] in ["\n", "#"]: self.precmd(line) self.onecmd(line) except IOError: self._error("Error reading script file.")
# Console output methods def _tabulate(self, table, **args): if tabulate: tabular = tabulate(table, args) self._print(tabular) else: self._print("\n".join("\t| ".join([str(col).strip() for col in line]).expandtabs(20) for line in table)) def _print(self, string=""): print(str(string)) self._log(string) def _log(self, string=""): if self.options.consolelog: # To console file if specified self.options.consolelog.write(str(string) + "\n") def _debug(self, string=""): if self.options.verbose: self._print(string) def _error(self, string): self._print("Error: " + string) # To console if log file specified # Override of cmd.Cmd methods and hooks
[docs] def preloop(self): super(BaseConsole, self).preloop() self._hist = [] self._debug("Entering console " + self.intro) self._log(self.ruler * 24) self._log(self.intro)
[docs] def postloop(self): super(BaseConsole, self).postloop() self._debug("Exiting console " + self.intro) self._log(self.ruler * 24) self._log()
[docs] def precmd(self, line): self._hist += [line.strip()] self._debug("Executing console command: " + line) self._log(self.prompt + str(line)) return line
[docs] def postcmd(self, stop, line): return super(BaseConsole, self).postcmd(stop, line)
[docs] def emptyline(self): pass