From 57298bcab8728e1d274f5d604a11c31e885090b4 Mon Sep 17 00:00:00 2001 From: Darko Poljak Date: Mon, 30 Dec 2019 09:32:15 +0100 Subject: [PATCH] Add cdist info command --- cdist/argparse.py | 25 +++++++++ cdist/exec/local.py | 42 +++------------- cdist/exec/util.py | 24 +++++++++ cdist/info.py | 109 ++++++++++++++++++++++++++++++++++++++++ docs/src/man1/cdist.rst | 30 ++++++++++- 5 files changed, 194 insertions(+), 36 deletions(-) create mode 100644 cdist/info.py diff --git a/cdist/argparse.py b/cdist/argparse.py index 7dc683f3..9311bdf4 100644 --- a/cdist/argparse.py +++ b/cdist/argparse.py @@ -6,6 +6,7 @@ import collections import functools import cdist.configuration import cdist.preos +import cdist.info # set of beta sub-commands @@ -436,6 +437,30 @@ def get_parsers(): ' should be POSIX compatible shell.')) parser['shell'].set_defaults(func=cdist.shell.Shell.commandline) + # Info + parser['info'] = parser['sub'].add_parser('info') + parser['info'].add_argument( + '-a', '--all', help='Display all info.', action='store_true', + default=False) + parser['info'].add_argument( + '-c', '--conf-dir', + help='Add configuration directory (can be repeated).', + action='append') + parser['info'].add_argument( + '-e', '--global-explorers', + help='Display info for global explorers.', action='store_true', + default=False) + parser['info'].add_argument( + '-H', '--suppress-headers', + help='Suppress displaying header lines.', action='store_true', + default=False) + parser['info'].add_argument( + '-t', '--types', help='Display info for types.', + action='store_true', default=False) + parser['info'].add_argument( + 'pattern', nargs='?', help='Glob pattern.') + parser['info'].set_defaults(func=cdist.info.Info.commandline) + for p in parser: parser[p].epilog = EPILOG diff --git a/cdist/exec/local.py b/cdist/exec/local.py index f83c85df..ad6c6e36 100644 --- a/cdist/exec/local.py +++ b/cdist/exec/local.py @@ -69,7 +69,6 @@ class Local(object): self.exec_path = exec_path self.custom_initial_manifest = initial_manifest - self._add_conf_dirs = add_conf_dirs self.cache_path_pattern = cache_path_pattern self.quiet_mode = quiet_mode if configuration: @@ -84,16 +83,7 @@ class Local(object): self._init_cache_dir(None) self._init_paths() self._init_object_marker() - self._init_conf_dirs() - - @property - def dist_conf_dir(self): - return os.path.abspath(os.path.join(os.path.dirname(cdist.__file__), - "conf")) - - @property - def home_dir(self): - return cdist.home_dir() + self._init_conf_dirs(add_conf_dirs) def _init_log(self): self.log = logging.getLogger(self.target_host[0]) @@ -140,28 +130,9 @@ class Local(object): # Does not need to be secure - just randomly different from .cdist self.object_marker_name = tempfile.mktemp(prefix='.cdist-', dir='') - def _init_conf_dirs(self): - self.conf_dirs = [] - - self.conf_dirs.append(self.dist_conf_dir) - - # Is the default place for user created explorer, type and manifest - if self.home_dir: - self.conf_dirs.append(self.home_dir) - - # Add directories defined in the CDIST_PATH environment variable - # if 'CDIST_PATH' in os.environ: - # cdist_path_dirs = re.split(r'(?. +# +# + +import cdist +import cdist.configuration +import cdist.core +import cdist.exec.util as util +import os +import glob +import fnmatch + + +class Info(object): + + def __init__(self, conf_dirs, args): + self.conf_dirs = conf_dirs + self.all = args.all + self.display_global_explorers = args.global_explorers + self.display_types = args.types + if not self.display_global_explorers and not self.display_types: + self.all = True + if args.pattern is None: + self.glob_pattern = '*' + else: + self.glob_pattern = args.pattern + self.display_headers = not args.suppress_headers + + @classmethod + def commandline(cls, args): + cfg = cdist.configuration.Configuration(args) + configuration = cfg.get_config(section='GLOBAL') + conf_dirs = util.resolve_conf_dirs(configuration, + args.conf_dir) + c = cls(conf_dirs, args) + c.run() + + def _print_line(self): + print('-' * 78) + + def _print_double_line(self): + print('=' * 78) + + def _display_global_explorers_info(self, conf_path): + if self.display_headers: + print("{} config directory global explorers:".format(conf_path)) + self._print_double_line() + global_explorer_path = os.path.join(conf_path, "explorer", + self.glob_pattern) + for explorer in glob.glob(global_explorer_path): + print(explorer) + if self.display_headers: + self._print_line() + + def _should_display_type(self, dir_entry): + if not dir_entry.is_dir(): + return False + if self.glob_pattern is None: + return True + return fnmatch.fnmatch(dir_entry.name, self.glob_pattern) + + def _display_types_info(self, conf_path): + if self.display_headers: + print("{} config directory types:".format(conf_path)) + self._print_double_line() + types_path = os.path.join(conf_path, "type") + if not os.path.exists(types_path): + if self.display_headers: + self._print_line() + return + with os.scandir(types_path) as it: + for entry in it: + if self._should_display_type(entry): + print(entry.path) + if self.display_headers: + self._print_line() + + def _display_conf_dirs(self): + print("Config directories:") + self._print_double_line() + print("{}".format('\n'.join(self.conf_dirs))) + self._print_line() + + def run(self): + if self.display_headers: + self._display_conf_dirs() + for conf_path in self.conf_dirs: + if self.all or self.display_global_explorers: + self._display_global_explorers_info(conf_path) + if self.all or self.display_types: + self._display_types_info(conf_path) diff --git a/docs/src/man1/cdist.rst b/docs/src/man1/cdist.rst index 55db82ed..69a5df86 100644 --- a/docs/src/man1/cdist.rst +++ b/docs/src/man1/cdist.rst @@ -11,7 +11,7 @@ SYNOPSIS :: - cdist [-h] [-V] {banner,config,install,inventory,preos,shell} ... + cdist [-h] [-V] {banner,config,install,inventory,preos,shell,info} ... cdist banner [-h] [-l LOGLEVEL] [-q] [-v] @@ -84,6 +84,8 @@ SYNOPSIS cdist shell [-h] [-l LOGLEVEL] [-q] [-v] [-s SHELL] + cdist info [-h] [-a] [-c CONF_DIR] [-e] [-H] [-t] [pattern] + DESCRIPTION ----------- @@ -604,6 +606,32 @@ usage. Its primary use is for debugging type parameters. be POSIX compatible shell. +INFO +---- +Display information for cdist (global explorers, types). + +**pattern** + Glob pattern. + +**-h, --help** + Show help message and exit. + +**-a, --all** + Display all info. + +**-c CONF_DIR, --conf-dir CONF_DIR** + Add configuration directory (can be repeated). + +**-e, --global-explorers** + Display info for global explorers. + +**-H, --suppress-headers** + Suppress displaying header lines. + +**-t, --types** + Display info for types. + + CONFIGURATION ------------- cdist obtains configuration data from the following sources in the following