blob: e6d9cd916acc12327549cd2256cab5c3f9549910 [file] [log] [blame]
Alexbab1efe2019-04-23 18:51:23 -05001import pkgutil
Alex265f45e2019-04-23 18:51:23 -05002import sys
3import traceback
4
Alexbab1efe2019-04-23 18:51:23 -05005from cfg_checker.common import config, logger, logger_cli
Alex265f45e2019-04-23 18:51:23 -05006from cfg_checker.common.exception import CheckerException
Alexbab1efe2019-04-23 18:51:23 -05007from cfg_checker.helpers.args_utils import MyParser
Alex265f45e2019-04-23 18:51:23 -05008
Alexbab1efe2019-04-23 18:51:23 -05009main_pkg_name = __name__.split('.')[0]
10mods_package_name = "modules"
11mods_import_path = main_pkg_name + '.' + mods_package_name
12mods_prefix = mods_import_path + '.'
Alex265f45e2019-04-23 18:51:23 -050013
Alexbab1efe2019-04-23 18:51:23 -050014commands = {}
15parsers = {}
16helps = {}
17# Pure dynamic magic, loading all 'do_*' methods from available modules
18_m = __import__(mods_import_path, fromlist=[main_pkg_name])
19for _imp, modName, isMod in pkgutil.iter_modules(_m.__path__, mods_prefix):
20 # iterate all packages, add to dict
21 if isMod:
22 # load module
23 _p = _imp.find_module(modName).load_module(modName)
24 # create a shortname
25 mod_name = modName.split('.')[-1]
26 # A package! Create it and add commands
27 commands[mod_name] = \
28 [_n[3:] for _n in dir(_p) if _n.startswith("do_")]
29 parsers[mod_name] = getattr(_p, 'init_parser')
30 helps[mod_name] = getattr(_p, 'command_help')
Alex265f45e2019-04-23 18:51:23 -050031
32
33def execute_command(args, command):
34 # Validate the commands
35 # check command
36 if command not in commands:
37 logger_cli.info("\n# Please, type a command listed above")
38 return 0
39 elif args.type not in commands[command]:
40 # check type
41 logger_cli.info(
42 "\n# Please, select '{}' command type listed above".format(
43 command
44 )
45 )
46 return 0
47 else:
48 # form function name to call
49 _method_name = "do_" + args.type
50 _target_module = __import__(
Alexbab1efe2019-04-23 18:51:23 -050051 mods_prefix + command,
Alex265f45e2019-04-23 18:51:23 -050052 fromlist=[""]
53 )
54 _method = getattr(_target_module, _method_name)
55
56 # Execute the command
57 try:
58 _method(args)
59 return 0
60 except CheckerException as e:
61 logger_cli.error("\nERROR: {}".format(
62 e.message
63 ))
64
65 exc_type, exc_value, exc_traceback = sys.exc_info()
66 logger_cli.debug("\n{}".format(
67 "".join(traceback.format_exception(
68 exc_type,
69 exc_value,
70 exc_traceback
71 ))
72 ))
73 return 1
Alexbab1efe2019-04-23 18:51:23 -050074
75
76def cli_command(_title, _name):
77 my_parser = MyParser(_title)
78 parsers[_name](my_parser)
79
80 # parse arguments
81 try:
82 args = my_parser.parse_args()
83 except TypeError:
84 logger_cli.info("\n# Please, check arguments")
85 sys.exit(0)
86
87 # force use of sudo
88 config.ssh_uses_sudo = True
89
90 # Execute the command
91 result = execute_command(args, _name)
92 logger.debug(result)
93 sys.exit(result)