"""
Module that parses the command line for dynamo-consistency
"""
import os
import sys
import optparse
from ._version import __version__
# My executables
# Also include exec.py because dynamo runs everything after renaming it to that
EXES = ['exec.py', 'check-phedex', 'dynamo-consistency', 'set-status',
'consistency-web-install', 'consistency-invalidate',
'consistency-dump-tree']
[docs]def get_parser(modname='__main__', # pylint: disable=too-complex
prog=os.path.basename(sys.argv[0])):
"""
:param str modname: The module to fetch the ``__doc__`` optionally ``__usage__`` from.
If you want the parser for a particular file,
this would usually be ``__name__``
:param str prog: The name for the program that we want the parser for
:returns: A parser based on the program name and the arguments to pass it
:rtype: optparse.OptionParser, list
"""
mod = sys.modules[modname]
usage = '%s\n%s' % (mod.__usage__, mod.__doc__) if '__usage__' in dir(mod) else None
parser = optparse.OptionParser(usage=usage, version='dynamo-consistency %s' % __version__)
# Don't add all the options for irrelevant scripts
# Keep in mind, dynamo renames everything to "exec.py" before running it
# Sphinx does the weird thing where it imports all the executables at the same time
add_all = prog in ['exec.py', 'dynamo-consistency'] or prog == 'sphinx-build'
parser.add_option('--config', metavar='FILE', dest='CONFIG',
help='Sets the location of the configuration file to read.')
selection_group = optparse.OptionGroup(parser, 'Selection Options')
if add_all or prog in ['consistency-invalidate', 'consistency-dump-tree']:
selection_group.add_option('--site', metavar='PATTERN', dest='SITE_PATTERN',
help='Sets the pattern used to select a site to run on next.')
if add_all:
selection_group.add_option('--lock', metavar='NAME', dest='LOCK_NAME',
help='Sets the lock name that should be used for this run.',
default=None)
if prog == 'consistency-dump-tree':
selection_group.add_option('--remote', action='store_true', dest='REMOTE',
help='Dump the remote site listing instead of the inventory')
if add_all or prog == 'consistency-dump-tree':
selection_group.add_option('--date-string', metavar='YYYYMMDD', dest='DATESTRING',
help='Set the datestring to pull for RAL-Reader listers')
log_group = optparse.OptionGroup(parser, 'Logging Options')
if add_all:
log_group.add_option('--update-summary', action='store_true', dest='UPDATESUMMARY',
help='Forces the update of the summary table, even if loading trees')
log_group.add_option('--email', action='store_true', dest='EMAIL',
help='Send an email on uncaught exception.')
log_group.add_option('--info', action='store_true', dest='INFO',
help='Displays logs down to info level.')
log_group.add_option('--debug', action='store_true', dest='DEBUG',
help='Displays logs down to debug level.')
backend_group = optparse.OptionGroup(
parser, 'Behavior Options',
'These options will change the backend loaded and actions taken')
if add_all:
backend_group.add_option('--no-orphan', action='store_true', dest='NOORPHAN',
help='Do not delete any orphan files.')
backend_group.add_option('--cms', action='store_true', dest='CMS',
help='Run actions specific to CMS collaboration data.')
backend_group.add_option('--no-sam', action='store_true', dest='NOSAM',
help='Disables the SAM readiness check.')
backend_group.add_option('--more-logs', action='store_true', dest='MORELOGS',
help='Clean any "AdditionalLogDeletions" directories.')
backend_group.add_option('--no-inventory', action='store_true', dest='NO_INV',
help='Do not connect the inventory. Used to test unmerged')
if add_all or prog in ['consistency-dump-tree']:
backend_group.add_option('--unmerged', action='store_true', dest='UNMERGED',
help='Run actions on "/store/unmerged".')
backend_group.add_option('--v1', action='store_true', dest='V1',
help='Connect to Dynamo database directly')
if add_all:
backend_group.add_option('--v1-reporting', action='store_true', dest='V1_REPORTING',
help='Connect to Dynamo database directly for registry only.')
backend_group.add_option('--cnf', metavar='FILE', dest='CNF', default='/etc/my.cnf',
help='Point to a non-default location of a ``my.cnf`` file.')
if add_all or prog in ['consistency-dump-tree'] or prog.startswith('test_'):
backend_group.add_option('--test', action='store_true', dest='TEST',
help='Run with a test instance of backend module.')
for group in [selection_group, log_group, backend_group]:
if group.option_list:
parser.add_option_group(group)
argv = sys.argv if prog in EXES else [
arg for arg in sys.argv if arg in
[opt.get_opt_string() for opt in parser.option_list] +
[opt.get_opt_string()
for group in parser.option_groups
for opt in group.option_list]
]
if prog.startswith('test_'):
argv.append('--test')
return parser, argv
PARSER, ARGV = get_parser()
OPTS, ARGS = PARSER.parse_args(ARGV)
if os.path.basename(sys.argv[0]) != 'sphinx-build':
def pretty_exe(_):
"""A dummy since we don't care about the docs here"""
pass
else:
import inspect
# We only get here while running Sphinx.
# In that case, you should also install what's in docs/requirements.txt
from customdocs import pretty_exe_doc # pylint: disable=import-error
[docs] def pretty_exe(name):
"""
Modifies the calling module's doc string
:param str name: The desired heading for the new docstring
"""
mod = inspect.getmodule(inspect.stack()[1][0])
pretty_exe_doc(name, lambda: get_parser(mod.__name__, name)[0], 2)