diff options
Diffstat (limited to 'utils/log_picker/argparser.py')
-rw-r--r-- | utils/log_picker/argparser.py | 279 |
1 files changed, 279 insertions, 0 deletions
diff --git a/utils/log_picker/argparser.py b/utils/log_picker/argparser.py new file mode 100644 index 000000000..7bc8a0bfa --- /dev/null +++ b/utils/log_picker/argparser.py @@ -0,0 +1,279 @@ +import optparse +import log_picker.sending as sending + + +class ArgError(Exception): + pass + + +class SimpleOptionGroup (optparse.OptionGroup): + + def _group_info_helper(self, formatter): + res = "" + lines = self.description.split('\n') + for line in lines: + res += formatter._format_text(line) + res += '\n' + return res + + def format_help(self, formatter): + result = formatter.format_heading(self.title) + formatter.indent() + result += self._group_info_helper(formatter) + formatter.dedent() + return result + + +class _OptionParserWithRaise(optparse.OptionParser): + def error(self, msg): + raise ArgError(msg) + + +class ArgParser(object): + + def __init__(self): + self.options = None + self.parser = None + + + def _generate_bz_it_group(self): + if sending.RHBZ in sending.NOT_AVAILABLE and \ + sending.STRATA in sending.NOT_AVAILABLE: + return None + + if sending.RHBZ in sending.NOT_AVAILABLE: + title = "Send the report to the Red Hat Ticketing system | options" + params_info = \ + "-r, --rhel \n"\ + " Send the report to the Red Hat Ticketing \n"\ + " system. \n"\ + "-i ID, --idbug=ID \n"\ + " The case number in the Red Hat Ticketing \n"\ + " system. \n"\ + "-l USERNAME, --login=USERNAME \n"\ + " Set the Red Hat Customer Portal username. \n" + + bzg = SimpleOptionGroup(self.parser, title, params_info) + bzg.add_option("-r", "--rhel", action="store_true", dest="strata") + + elif sending.STRATA in sending.NOT_AVAILABLE: + title = "Send the report to the Bugzilla | options" + params_info = \ + "-b, --bugzilla \n"\ + " Send the report to the Bugzilla. \n"\ + "-i ID, --idbug=ID \n"\ + " Set the bug id in the Bugzilla. \n"\ + "-l USERNAME, --login=USERNAME \n"\ + " Set the bugzilla username. \n" + + bzg = SimpleOptionGroup(self.parser, title, params_info) + bzg.add_option("-b", "--bugzilla", action="store_true", + dest="bugzilla") + + else: + title = "Send the report to the Bugzilla or the Red Hat Ticketing" \ + " system | options" + params_info = \ + "-b, --bugzilla \n"\ + " Send the report to the Bugzilla. \n"\ + "-r, --rhel \n"\ + " Send the report to the Red Hat Ticketing \n"\ + " system. \n"\ + "-i ID, --idbug=ID \n"\ + " Set the bug id in the Bugzilla/Case number \n"\ + " in the Red Hat Ticketing system. \n"\ + "-l USERNAME, --login=USERNAME \n"\ + " Set the Bugzilla/Red Hat Cutomer Portal \n"\ + " username. \n" + + bzg = SimpleOptionGroup(self.parser, title, params_info) + bzg.add_option("-b", "--bugzilla", action="store_true", + dest="bugzilla") + bzg.add_option("-r", "--rhel", action="store_true", dest="strata") + + bzg.add_option("-i", "--idbug", dest="bug_id", metavar="ID") + bzg.add_option("-l", "--login", dest="login", metavar="USERNAME") + + return bzg + + + def _generate_email_group(self): + if sending.EMAIL in sending.NOT_AVAILABLE: + return None + + title = "Send the report to an email | options" + params_info = \ + "-e, --email \n"\ + " Send the report to an email address. \n"\ + "-s ADDRESS, --server=ADDRESS \n"\ + " Set the SMTP server address. \n"\ + "-f EMAIL, --from=EMAIL \n"\ + " Set your email address. \n"\ + "-t EMAIL, --to=EMAIL \n"\ + " Set the destination email address. \n" + + + emailg = SimpleOptionGroup(self.parser, title, params_info) + emailg.add_option("-e", "--email", action="store_true", dest="email") + emailg.add_option("-s", "--server", dest="smtp_addr", metavar="ADDRESS") + emailg.add_option("-f", "--from", dest="from_addr", metavar="EMAIL") + emailg.add_option("-t", "--to", dest="to_addr", metavar="EMAIL") + return emailg + + + def _generate_scp_group(self): + if sending.SCP in sending.NOT_AVAILABLE: + return None + + title = "Send the report via secure copy (scp) | options" + params_info = \ + "-o, --scp \n"\ + " Send the report to the remote computer via scp.\n"\ + "-l USERNAME, --login=USERNAME \n"\ + " Set the remote username. \n"\ + "-a HOST, --host=HOST \n"\ + " Set the remote host address. \n"\ + "-p PATH, --path=PATH \n"\ + " Set the file path on the remote host. \n" + + scpg = SimpleOptionGroup(self.parser, title, params_info) + scpg.add_option("-o", "--scp", action="store_true", dest="scp") + scpg.add_option("-l", "--login", dest="login", metavar="USERNAME") + scpg.add_option("-a", "--host", dest="host", metavar="HOST") + scpg.add_option("-p", "--path", dest="path", metavar="PATH") + return scpg + + + def _generate_ftp_group(self): + if sending.FTP in sending.NOT_AVAILABLE: + return None + + title = "Upload the report via FTP | options" + params_info = \ + "-q, --ftp \n"\ + " Upload the report via ftp. \n"\ + "-l USERNAME, --login=USERNAME \n"\ + " Set the ftp username. \n"\ + " Note: For anonymous login don't use this option\n"\ + "-a HOST, --host=HOST \n"\ + " Set the remote host address. \n"\ + " Address syntax: [ftp://]host[:port][path] \n"\ + " Examples of host addresses: \n"\ + " host.com, ftp://host.com:21/path/on/the/host \n" + + ftpg = SimpleOptionGroup(self.parser, title, params_info) + ftpg.add_option("-q", "--ftp", action="store_true", dest="ftp") + ftpg.add_option("-l", "--login", dest="login", metavar="USERNAME") + ftpg.add_option("-a", "--host", dest="host", metavar="HOST") + return ftpg + + + def _generate_local_group(self): + if sending.LOCAL in sending.NOT_AVAILABLE: + return None + + title = "Save the report to the local computer | options" + params_info = \ + "-m, --local \n"\ + " Save the report to a directory on the computer.\n"\ + "-p DIRECTORY, --path=DIRECTORY \n"\ + " Set the local directory. \n" + + localg = SimpleOptionGroup(self.parser, title, params_info) + localg.add_option("-m", "--local", action="store_true", dest="local") + localg.add_option("-p", "--path", dest="path", metavar="PATH") + return localg + + + def _create_parser(self): + self.parser = _OptionParserWithRaise(conflict_handler="resolve") + self.parser.add_option("-c", "--comment", dest="bug_comment", + default=None, help="Report comment.", metavar="COMMENT") + + # Bugzilla and Red Hat Ticketing system options + group = self._generate_bz_it_group() + if group: self.parser.add_option_group(group) + + # Email options + group = self._generate_email_group() + if group: self.parser.add_option_group(group) + + # Scp options + group = self._generate_scp_group() + if group: self.parser.add_option_group(group) + + # Ftp options + group = self._generate_ftp_group() + if group: self.parser.add_option_group(group) + + # Local options + group = self._generate_local_group() + if group: self.parser.add_option_group(group) + + def _parse(self): + (self.options, _) = self.parser.parse_args() + + # Set sender attribute + if self.options.ensure_value('email', None): + self.options.sender = sending.EMAIL + elif self.options.ensure_value('strata', None): + self.options.sender = sending.STRATA + elif self.options.ensure_value('bugzilla', None): + self.options.sender = sending.RHBZ + elif self.options.ensure_value('scp', None): + self.options.sender = sending.SCP + elif self.options.ensure_value('ftp', None): + self.options.sender = sending.FTP + elif self.options.ensure_value('local', None): + self.options.sender = sending.LOCAL + else: + self.options.sender = None + + def _validate(self): + cnt = 0 + if self.options.ensure_value('email', None): cnt += 1 + if self.options.ensure_value('bugzilla', None): cnt += 1 + if self.options.ensure_value('strata', None): cnt += 1 + if self.options.ensure_value('scp', None): cnt += 1 + if self.options.ensure_value('ftp', None): cnt += 1 + if self.options.ensure_value('local', None): cnt += 1 + + if not cnt: + raise ArgError("No send method selected.") + elif cnt > 1: + raise ArgError("Options -b, -r, -e, -o, -q and -m" \ + " are mutually exclusive.") + + missing = [] + if self.options.ensure_value('email', None): + if not self.options.smtp_addr: missing.append('-s') + if not self.options.from_addr: missing.append('-f') + if not self.options.to_addr: missing.append('-t') + elif self.options.ensure_value('bugzilla', None): + if not self.options.bug_id: missing.append('-i') + if not self.options.login: missing.append('-l') + elif self.options.ensure_value('strata', None): + if not self.options.bug_id: missing.append('-i') + if not self.options.login: missing.append('-l') + elif self.options.ensure_value('scp', None): + if not self.options.login: missing.append('-l') + if not self.options.host: missing.append('-a') + elif self.options.ensure_value('ftp', None): + if not self.options.host: missing.append('-a') + elif self.options.ensure_value('local', None): + if not self.options.path: missing.append('-p') + + if missing: + msg = "" + for arg in missing: + msg += '\nArgument "%s" is missing!' % arg + raise ArgError(msg) + + + def parse(self): + """Parse and validate command line arguments.""" + self._create_parser() + self._parse() + self._validate() + return self.options + |