From d17f75a010a2e2dc14cf3b930dc0187f5332adfe Mon Sep 17 00:00:00 2001 From: Darko Poljak Date: Sat, 11 Jan 2020 11:29:32 +0100 Subject: [PATCH] Support user defined processes User defined processes are defined by new cdist beta command 'process'. Processes can be defined in `process` subdirectory in `$HOME/.cdist` or in custom directories specified through CDIST_PROCESS_PATH environment variable. `/process` processes are defined in subdirectories, where a directory must contain `__init__.py` file to be recognized as a process, and it is then imported as a module. Since scanning and registering processes happens before cdist arguments are parsed, then standard cdist logging cannot be used in this stage. This is why CDIST_PROCESS_DEBUG environemnt variable turns on debug messages. Dummy example (`~/.cdist/process/homeprocess/__init__.py`): #!/usr/bin/env python3 # -*- coding: utf-8 -*- import logging import subprocess log = logging.getLogger(__name__) def register(parent_parser): parser = parent_parser.add_parser('cdist-help') parser.set_defaults(func=cdist_help) def cdist_help(args): cmd = [ "cdist", "-h", ] log.info("Running my process cdist help") subprocess.check_call(cmd) --- cdist/argparse.py | 11 ++++++- cdist/process.py | 81 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 cdist/process.py diff --git a/cdist/argparse.py b/cdist/argparse.py index 611c484a..013530f0 100644 --- a/cdist/argparse.py +++ b/cdist/argparse.py @@ -7,10 +7,11 @@ import functools import cdist.configuration import cdist.preos import cdist.info +import cdist.process # set of beta sub-commands -BETA_COMMANDS = set(('install', 'inventory', )) +BETA_COMMANDS = set(('install', 'inventory', 'process', )) # set of beta arguments for sub-commands BETA_ARGS = { 'config': set(('tag', 'all_tagged_hosts', 'use_archiving', )), @@ -468,6 +469,14 @@ def get_parsers(): 'pattern', nargs='?', help='Glob pattern.') parser['info'].set_defaults(func=cdist.info.Info.commandline) + # Process + parser['process'] = parser['sub'].add_parser( + 'process', parents=[parser['loglevel'], parser['beta'], ]) + parser['process_sub'] = parser['process'].add_subparsers(title="Processes") + parser['process'].set_defaults(func=functools.partial( + cdist.process.commandline, parser=parser['process'])) + cdist.process.setup(parser['process_sub']) + for p in parser: parser[p].epilog = EPILOG diff --git a/cdist/process.py b/cdist/process.py new file mode 100644 index 00000000..78b3c21b --- /dev/null +++ b/cdist/process.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# 2020 Darko Poljak (darko.poljak at gmail.com) +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# +# + +import os +import sys +import importlib +import re +import cdist + + +PROCESS_PARENT = 'process' +_PROCESS_DEBUG = os.environ.get('CDIST_PROCESS_DEBUG', None) +if _PROCESS_DEBUG: + def _debug(msg): + print('[cdist process debug] {}'.format(msg)) +else: + def _debug(msg): + pass + + +_process_path = [] + +_env_path = os.environ.get('CDIST_PROCESS_PATH', None) +if _env_path: + for x in re.split(r'(?