blob: 9ac05f361a3a9b3098169334a00228bf26fba0a2 [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
Alexcf91b182019-05-31 11:57:07 -050035 # check commands
36 if not hasattr(args, 'type') or not args.type:
37 logger_cli.info("\n# Please, type a command listed above")
38 return 0
Alexd0391d42019-05-21 18:48:55 -050039 _type = args.type.replace("-", "_") if "-" in args.type else args.type
Alex265f45e2019-04-23 18:51:23 -050040 if command not in commands:
41 logger_cli.info("\n# Please, type a command listed above")
42 return 0
Alexd0391d42019-05-21 18:48:55 -050043 elif _type not in commands[command]:
Alex265f45e2019-04-23 18:51:23 -050044 # check type
45 logger_cli.info(
46 "\n# Please, select '{}' command type listed above".format(
47 command
48 )
49 )
50 return 0
51 else:
52 # form function name to call
Alexd0391d42019-05-21 18:48:55 -050053 _method_name = "do_" + _type
Alex265f45e2019-04-23 18:51:23 -050054 _target_module = __import__(
Alexbab1efe2019-04-23 18:51:23 -050055 mods_prefix + command,
Alex265f45e2019-04-23 18:51:23 -050056 fromlist=[""]
57 )
58 _method = getattr(_target_module, _method_name)
59
60 # Execute the command
61 try:
62 _method(args)
63 return 0
64 except CheckerException as e:
65 logger_cli.error("\nERROR: {}".format(
66 e.message
67 ))
68
69 exc_type, exc_value, exc_traceback = sys.exc_info()
70 logger_cli.debug("\n{}".format(
71 "".join(traceback.format_exception(
72 exc_type,
73 exc_value,
74 exc_traceback
75 ))
76 ))
77 return 1
Alexbab1efe2019-04-23 18:51:23 -050078
79
80def cli_command(_title, _name):
81 my_parser = MyParser(_title)
82 parsers[_name](my_parser)
83
84 # parse arguments
85 try:
Alexd0391d42019-05-21 18:48:55 -050086 args, unknown = my_parser.parse_known_args()
Alexbab1efe2019-04-23 18:51:23 -050087 except TypeError:
88 logger_cli.info("\n# Please, check arguments")
89 sys.exit(0)
90
Alexd0391d42019-05-21 18:48:55 -050091 if unknown:
92 logger_cli.error(
93 "# Unexpected arguments: {}".format(
94 ", ".join(["'{}'".format(a) for a in unknown])
95 )
96 )
97 sys.exit(1)
98
Alexbab1efe2019-04-23 18:51:23 -050099 # force use of sudo
100 config.ssh_uses_sudo = True
101
102 # Execute the command
103 result = execute_command(args, _name)
104 logger.debug(result)
105 sys.exit(result)