diff options
Diffstat (limited to 'src/lib/Bcfg2/Options.py')
-rw-r--r-- | src/lib/Bcfg2/Options.py | 215 |
1 files changed, 112 insertions, 103 deletions
diff --git a/src/lib/Bcfg2/Options.py b/src/lib/Bcfg2/Options.py index 07d089f05..3f4e9a83c 100644 --- a/src/lib/Bcfg2/Options.py +++ b/src/lib/Bcfg2/Options.py @@ -334,6 +334,16 @@ def get_bool(val): raise ValueError("Not a boolean value", val) +def get_timeout(val): + """ convert the timeout value into a float or None """ + if val is None: + return val + timeout = float(val) # pass ValueError up the stack + if timeout <= 0: + return None + return timeout + + def get_size(value): """ Given a number of bytes in a human-readable format (e.g., '512m', '2g'), get the absolute number of bytes as an integer """ @@ -582,38 +592,37 @@ SERVER_UMASK = \ default='0077', odesc='<Server umask>', cf=('server', 'umask')) +SERVER_AUTHENTICATION = \ + Option('Default client authentication method', + default='cert+password', + odesc='{cert|bootstrap|cert+password}', + cf=('communication', 'authentication')) # database options DB_ENGINE = \ Option('Database engine', default='sqlite3', - cf=('database', 'engine'), - deprecated_cf=('statistics', 'database_engine')) + cf=('database', 'engine')) DB_NAME = \ Option('Database name', default=os.path.join(SERVER_REPOSITORY.default, "etc/bcfg2.sqlite"), - cf=('database', 'name'), - deprecated_cf=('statistics', 'database_name')) + cf=('database', 'name')) DB_USER = \ Option('Database username', default=None, - cf=('database', 'user'), - deprecated_cf=('statistics', 'database_user')) + cf=('database', 'user')) DB_PASSWORD = \ Option('Database password', default=None, - cf=('database', 'password'), - deprecated_cf=('statistics', 'database_password')) + cf=('database', 'password')) DB_HOST = \ Option('Database host', default='localhost', - cf=('database', 'host'), - deprecated_cf=('statistics', 'database_host')) + cf=('database', 'host')) DB_PORT = \ Option('Database port', default='', - cf=('database', 'port'), - deprecated_cf=('statistics', 'database_port')) + cf=('database', 'port')) # Django options WEB_CFILE = \ @@ -635,8 +644,7 @@ DJANGO_DEBUG = \ DJANGO_WEB_PREFIX = \ Option('Web prefix', default=None, - cf=('reporting', 'web_prefix'), - deprecated_cf=('statistics', 'web_prefix'),) + cf=('reporting', 'web_prefix')) # Reporting options REPORTING_FILE_LIMIT = \ @@ -803,6 +811,16 @@ CLIENT_EXIT_ON_PROBE_FAILURE = \ long_arg=True, cf=('client', 'exit_on_probe_failure'), cook=get_bool) +CLIENT_PROBE_TIMEOUT = \ + Option("Timeout when running client probes", + default=None, + cf=('client', 'probe_timeout'), + cook=get_timeout) +CLIENT_COMMAND_TIMEOUT = \ + Option("Timeout when client runs other external commands (not probes)", + default=None, + cf=('client', 'command_timeout'), + cook=get_timeout) # bcfg2-test and bcfg2-lint options TEST_NOSEOPTS = \ @@ -869,125 +887,65 @@ CLIENT_RPM_INSTALLONLY = \ 'kernel-default', 'kernel-largesmp-devel', 'kernel-largesmp', 'kernel-xen', 'gpg-pubkey'], cf=('RPM', 'installonlypackages'), - deprecated_cf=('RPMng', 'installonlypackages'), cook=list_split) CLIENT_RPM_PKG_CHECKS = \ Option("Perform RPM package checks", default=True, cf=('RPM', 'pkg_checks'), - deprecated_cf=('RPMng', 'pkg_checks'), cook=get_bool) CLIENT_RPM_PKG_VERIFY = \ Option("Perform RPM package verify", default=True, cf=('RPM', 'pkg_verify'), - deprecated_cf=('RPMng', 'pkg_verify'), cook=get_bool) CLIENT_RPM_INSTALLED_ACTION = \ Option("RPM installed action", default="install", - cf=('RPM', 'installed_action'), - deprecated_cf=('RPMng', 'installed_action')) + cf=('RPM', 'installed_action')) CLIENT_RPM_ERASE_FLAGS = \ Option("RPM erase flags", default=["allmatches"], cf=('RPM', 'erase_flags'), - deprecated_cf=('RPMng', 'erase_flags'), cook=list_split) CLIENT_RPM_VERSION_FAIL_ACTION = \ Option("RPM version fail action", default="upgrade", - cf=('RPM', 'version_fail_action'), - deprecated_cf=('RPMng', 'version_fail_action')) + cf=('RPM', 'version_fail_action')) CLIENT_RPM_VERIFY_FAIL_ACTION = \ Option("RPM verify fail action", default="reinstall", - cf=('RPM', 'verify_fail_action'), - deprecated_cf=('RPMng', 'verify_fail_action')) + cf=('RPM', 'verify_fail_action')) CLIENT_RPM_VERIFY_FLAGS = \ Option("RPM verify flags", default=[], cf=('RPM', 'verify_flags'), - deprecated_cf=('RPMng', 'verify_flags'), cook=list_split) -CLIENT_YUM24_INSTALLONLY = \ - Option('YUM24 install-only packages', - default=['kernel', 'kernel-bigmem', 'kernel-enterprise', - 'kernel-smp', 'kernel-modules', 'kernel-debug', - 'kernel-unsupported', 'kernel-devel', 'kernel-source', - 'kernel-default', 'kernel-largesmp-devel', - 'kernel-largesmp', 'kernel-xen', 'gpg-pubkey'], - cf=('YUM24', 'installonlypackages'), - cook=list_split) -CLIENT_YUM24_PKG_CHECKS = \ - Option("Perform YUM24 package checks", - default=True, - cf=('YUM24', 'pkg_checks'), - cook=get_bool) -CLIENT_YUM24_PKG_VERIFY = \ - Option("Perform YUM24 package verify", - default=True, - cf=('YUM24', 'pkg_verify'), - cook=get_bool) -CLIENT_YUM24_INSTALLED_ACTION = \ - Option("YUM24 installed action", - default="install", - cf=('YUM24', 'installed_action')) -CLIENT_YUM24_ERASE_FLAGS = \ - Option("YUM24 erase flags", - default=["allmatches"], - cf=('YUM24', 'erase_flags'), - cook=list_split) -CLIENT_YUM24_VERSION_FAIL_ACTION = \ - Option("YUM24 version fail action", - cf=('YUM24', 'version_fail_action'), - default="upgrade") -CLIENT_YUM24_VERIFY_FAIL_ACTION = \ - Option("YUM24 verify fail action", - default="reinstall", - cf=('YUM24', 'verify_fail_action')) -CLIENT_YUM24_VERIFY_FLAGS = \ - Option("YUM24 verify flags", - default=[], - cf=('YUM24', 'verify_flags'), - cook=list_split) -CLIENT_YUM24_AUTODEP = \ - Option("YUM24 autodependency processing", - default=True, - cf=('YUM24', 'autodep'), - cook=get_bool) CLIENT_YUM_PKG_CHECKS = \ Option("Perform YUM package checks", default=True, cf=('YUM', 'pkg_checks'), - deprecated_cf=('YUMng', 'pkg_checks'), cook=get_bool) CLIENT_YUM_PKG_VERIFY = \ Option("Perform YUM package verify", default=True, cf=('YUM', 'pkg_verify'), - deprecated_cf=('YUMng', 'pkg_verify'), cook=get_bool) CLIENT_YUM_INSTALLED_ACTION = \ Option("YUM installed action", default="install", - cf=('YUM', 'installed_action'), - deprecated_cf=('YUMng', 'installed_action')) + cf=('YUM', 'installed_action')) CLIENT_YUM_VERSION_FAIL_ACTION = \ Option("YUM version fail action", default="upgrade", - cf=('YUM', 'version_fail_action'), - deprecated_cf=('YUMng', 'version_fail_action')) + cf=('YUM', 'version_fail_action')) CLIENT_YUM_VERIFY_FAIL_ACTION = \ Option("YUM verify fail action", default="reinstall", - cf=('YUM', 'verify_fail_action'), - deprecated_cf=('YUMng', 'verify_fail_action')) + cf=('YUM', 'verify_fail_action')) CLIENT_YUM_VERIFY_FLAGS = \ Option("YUM verify flags", default=[], cf=('YUM', 'verify_flags'), - deprecated_cf=('YUMng', 'verify_flags'), cook=list_split) CLIENT_POSIX_UID_WHITELIST = \ Option("UID ranges the POSIXUsers tool will manage", @@ -1115,7 +1073,8 @@ SERVER_COMMON_OPTIONS = dict(repo=SERVER_REPOSITORY, protocol=SERVER_PROTOCOL, web_configfile=WEB_CFILE, backend=SERVER_BACKEND, - vcs_root=SERVER_VCS_ROOT) + vcs_root=SERVER_VCS_ROOT, + authentication=SERVER_AUTHENTICATION) CRYPT_OPTIONS = dict(encrypt=ENCRYPT, decrypt=DECRYPT, @@ -1126,6 +1085,14 @@ CRYPT_OPTIONS = dict(encrypt=ENCRYPT, cfg=CRYPT_CFG, remove=CRYPT_REMOVE) +PATH_METADATA_OPTIONS = dict(owner=MDATA_OWNER, + group=MDATA_GROUP, + mode=MDATA_MODE, + secontext=MDATA_SECONTEXT, + important=MDATA_IMPORTANT, + paranoid=MDATA_PARANOID, + sensitive=MDATA_SENSITIVE) + DRIVER_OPTIONS = \ dict(apt_install_path=CLIENT_APT_TOOLS_INSTALL_PATH, apt_var_path=CLIENT_APT_TOOLS_VAR_PATH, @@ -1139,15 +1106,6 @@ DRIVER_OPTIONS = \ rpm_version_fail_action=CLIENT_RPM_VERSION_FAIL_ACTION, rpm_verify_fail_action=CLIENT_RPM_VERIFY_FAIL_ACTION, rpm_verify_flags=CLIENT_RPM_VERIFY_FLAGS, - yum24_installonly=CLIENT_YUM24_INSTALLONLY, - yum24_pkg_checks=CLIENT_YUM24_PKG_CHECKS, - yum24_pkg_verify=CLIENT_YUM24_PKG_VERIFY, - yum24_installed_action=CLIENT_YUM24_INSTALLED_ACTION, - yum24_erase_flags=CLIENT_YUM24_ERASE_FLAGS, - yum24_version_fail_action=CLIENT_YUM24_VERSION_FAIL_ACTION, - yum24_verify_fail_action=CLIENT_YUM24_VERIFY_FAIL_ACTION, - yum24_verify_flags=CLIENT_YUM24_VERIFY_FLAGS, - yum24_autodep=CLIENT_YUM24_AUTODEP, yum_pkg_checks=CLIENT_YUM_PKG_CHECKS, yum_pkg_verify=CLIENT_YUM_PKG_VERIFY, yum_installed_action=CLIENT_YUM_INSTALLED_ACTION, @@ -1193,7 +1151,9 @@ CLIENT_COMMON_OPTIONS = \ serverCN=CLIENT_SCNS, timeout=CLIENT_TIMEOUT, decision_list=CLIENT_DECISION_LIST, - probe_exit=CLIENT_EXIT_ON_PROBE_FAILURE) + probe_exit=CLIENT_EXIT_ON_PROBE_FAILURE, + probe_timeout=CLIENT_PROBE_TIMEOUT, + command_timeout=CLIENT_COMMAND_TIMEOUT) CLIENT_COMMON_OPTIONS.update(DRIVER_OPTIONS) CLIENT_COMMON_OPTIONS.update(CLI_COMMON_OPTIONS) @@ -1214,10 +1174,11 @@ REPORTING_COMMON_OPTIONS = dict(reporting_file_limit=REPORTING_FILE_LIMIT, class OptionParser(OptionSet): - """ - OptionParser bootstraps option parsing, - getting the value of the config file - """ + """ OptionParser bootstraps option parsing, getting the value of + the config file. This should only be instantiated by + :func:`get_option_parser`, below, not by individual plugins or + scripts. """ + def __init__(self, args, argv=None, quiet=False): if argv is None: argv = sys.argv[1:] @@ -1232,25 +1193,73 @@ class OptionParser(OptionSet): self.argv = [] self.do_getopt = True - def reparse(self): + def reparse(self, argv=None, do_getopt=None): """ parse the options again, taking any changes (e.g., to the config file) into account """ + self.parse(argv=argv, do_getopt=do_getopt) + + def parse(self, argv=None, do_getopt=None): for key, opt in self.optinfo.items(): self[key] = opt - if "args" not in self.optinfo: + if "args" not in self.optinfo and "args" in self: del self['args'] - self.parse(self.argv, self.do_getopt) - - def parse(self, argv, do_getopt=True): - self.argv = argv - self.do_getopt = do_getopt - OptionSet.parse(self, self.argv, do_getopt=self.do_getopt) + self.argv = argv or sys.argv[1:] + if self.do_getopt is None: + if do_getopt: + self.do_getopt = do_getopt + else: + self.do_getopt = True + if do_getopt is None: + do_getopt = self.do_getopt + OptionSet.parse(self, self.argv, do_getopt=do_getopt) def add_option(self, name, opt): """ Add an option to the parser """ self[name] = opt self.optinfo[name] = opt + def add_options(self, options): + """ Add a set of options to the parser """ + self.update(options) + self.optinfo.update(options) + def update(self, optdict): dict.update(self, optdict) self.optinfo.update(optdict) + + +#: A module-level OptionParser object that all plugins, etc., can use. +#: This should not be used directly, but retrieved via +#: :func:`get_option_parser`. +_PARSER = None + + +def load_option_parser(args, argv=None, quiet=False): + """ Load an :class:`Bcfg2.Options.OptionParser` object, caching it + in :attr:`_PARSER` for later retrieval via + :func:`get_option_parser`. + + :param args: The argument set to parse. + :type args: dict of :class:`Bcfg2.Options.Option` objects + :param argv: The command-line argument list. If this is not + provided, :attr:`sys.argv` will be used. + :type argv: list of strings + :param quiet: Be quiet when bootstrapping the argument parser. + :type quiet: bool + :returns: :class:`Bcfg2.Options.OptionParser` + """ + global _PARSER # pylint: disable=W0603 + _PARSER = OptionParser(args, argv=argv, quiet=quiet) + return _PARSER + + +def get_option_parser(): + """ Get an already-created :class:`Bcfg2.Options.OptionParser` object. If + :attr:`_PARSER` has not been populated, then a new OptionParser + will be created with basic arguments. + + :returns: :class:`Bcfg2.Options.OptionParser` + """ + if _PARSER is None: + return load_option_parser(CLI_COMMON_OPTIONS) + return _PARSER |