qubes-installer-qubes-os/anaconda/utils/log_picker/argparser.py
2013-01-24 01:45:53 +01:00

280 lines
13 KiB
Python

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