blob: a10d4a0ded8acfa10f96d52789eff8c94beab027 [file] [log] [blame]
Alex Savatieiev5118de02019-02-20 15:50:42 -06001import argparse
2import os
3import sys
Alex Savatieieve9613992019-02-21 18:20:35 -06004import traceback
Alex Savatieiev799bee32019-02-20 17:19:26 -06005from logging import INFO, DEBUG
Alex Savatieiev5118de02019-02-20 15:50:42 -06006
7import reporter
Alex Savatieiev9c642112019-02-26 13:55:43 -06008from cfg_checker.common.exception import ConfigException
Alex Savatieiev5118de02019-02-20 15:50:42 -06009from cfg_checker.common import utils, const
10from cfg_checker.common import config, logger, logger_cli, pkg_dir
11from cfg_checker.clients import salt
12
13from cfg_checker.pkg_check import CloudPackageChecker
Alex Savatieiev9b2f6512019-02-20 18:05:00 -060014from cfg_checker.network_checks import NetworkChecker
Alex Savatieiev5118de02019-02-20 15:50:42 -060015
16pkg_dir = os.path.dirname(__file__)
17pkg_dir = os.path.normpath(pkg_dir)
18
Alex Savatieiev9c642112019-02-26 13:55:43 -060019commands = {
20 'packages': ['report'],
21 'network': ['check', 'report'],
22 'reclass': ['list', 'diff']
23}
Alex Savatieiev5118de02019-02-20 15:50:42 -060024
25class MyParser(argparse.ArgumentParser):
26 def error(self, message):
27 sys.stderr.write('Error: {0}\n\n'.format(message))
28 self.print_help()
29
30
Alex Savatieiev5118de02019-02-20 15:50:42 -060031def help_message():
32 print"""
33 Please, use following examples to generate info reports:\n
34 cfg_checker packages report\n
35 cfg_checker network check\n
36 cfg_checker network report\n
37 """
38 return
39
Alex Savatieiev9c642112019-02-26 13:55:43 -060040
41def get_file_arg(args):
Alex Savatieieve47f7f42019-02-20 16:41:23 -060042 if args.file:
Alex Savatieiev9c642112019-02-26 13:55:43 -060043 return args.file
Alex Savatieieve47f7f42019-02-20 16:41:23 -060044 else:
Alex Savatieiev9c642112019-02-26 13:55:43 -060045 raise ConfigException("No report filename supplied")
46
47
48def packages_report(args):
49 """Create package versions report
50
51 :args: - parser arguments
52 :return: - no return value
53 """
54 _filename = get_file_arg(args)
55
Alex Savatieiev5118de02019-02-20 15:50:42 -060056 # init connection to salt and collect minion data
57 pChecker = CloudPackageChecker()
58 # collect data on installed packages
59 pChecker.collect_installed_packages()
60 # diff installed and candidates
61 # pChecker.collect_packages()
62 # report it
63 pChecker.create_html_report(_filename)
64
65
Alex Savatieiev9c642112019-02-26 13:55:43 -060066def network_check(args):
67 logger_cli.info("# Network check (CLI output)")
Alex Savatieiev9b2f6512019-02-20 18:05:00 -060068 netChecker = NetworkChecker()
69 netChecker.collect_network_info()
70 netChecker.print_network_report()
Alex Savatieiev5118de02019-02-20 15:50:42 -060071
72 return
73
74
Alex Savatieiev9c642112019-02-26 13:55:43 -060075def network_report(args):
76 logger_cli.info("# Network check (HTML report: '{}')".format(args.file))
77 _filename = get_file_arg(args)
78
Alex Savatieiev9b2f6512019-02-20 18:05:00 -060079 netChecker = NetworkChecker()
80 netChecker.collect_network_info()
Alex Savatieiev9c642112019-02-26 13:55:43 -060081 netChecker.create_html_report(_filename)
82
83 return
84
85
86def reclass_list(args):
87 logger_cli.info("Reclass list: to be implemented")
88
89 return
90
91
92def reclass_diff(args):
93 logger_cli.info("Reclass comparer (HTML report: '{}'".format(args.file))
94 _filename = get_file_arg(args)
Alex Savatieiev5118de02019-02-20 15:50:42 -060095
96 return
97
98
99def config_check_entrypoint():
Alex Savatieiev9c642112019-02-26 13:55:43 -0600100 """
101 Main entry point. Uses nested parsers structure
102 with a default function to execute the comand
103
104 :return: - no return value
105 """
Alex Savatieiev5118de02019-02-20 15:50:42 -0600106 # Main entrypointр
107 parser = MyParser(prog="Cloud configuration checker")
Alex Savatieiev9c642112019-02-26 13:55:43 -0600108
109 # Parsers (each parser can have own arguments)
110 # - subparsers (command)
111 # |- pkg_parser
112 # | - pkg_subparsers (type)
113 # | - pkg_report_parser (default func - pkg_check)
114 # |- net_parser
115 # | - net_subparsers (type)
116 # | - net_check_parser (default func - net_check)
117 # | - net_report_parser (default func - net_report)
118 # - reclass_parser
119 # - reclass_list (default func - reclass_list)
120 # - reclass_compare (default func - reclass_diff)
121
Alex Savatieiev799bee32019-02-20 17:19:26 -0600122 parser.add_argument(
123 "-d",
124 "--debug",
125 action="store_true", default=False,
126 help="Set CLI logging level to DEBUG"
127 )
Alex Savatieiev9c642112019-02-26 13:55:43 -0600128 parser.add_argument(
129 '-f',
130 '--file',
131 help="HTML filename to save report"
132 )
Alex Savatieiev5118de02019-02-20 15:50:42 -0600133 subparsers = parser.add_subparsers(dest='command')
134 # packages
135 pkg_parser = subparsers.add_parser(
136 'packages',
137 help="Package versions check (Candidate vs Installed)"
138 )
139 pkg_subparsers = pkg_parser.add_subparsers(dest='type')
140
141 pkg_report_parser = pkg_subparsers.add_parser(
142 'report',
143 help="Report package versions to HTML file"
144 )
Alex Savatieiev5118de02019-02-20 15:50:42 -0600145
146 # networking
147 net_parser = subparsers.add_parser(
148 'network',
Alex Savatieiev9c642112019-02-26 13:55:43 -0600149 help="Network infrastructure checks and reports"
Alex Savatieiev5118de02019-02-20 15:50:42 -0600150 )
151 net_subparsers = net_parser.add_subparsers(dest='type')
152
153 net_check_parser = net_subparsers.add_parser(
154 'check',
155 help="Do network check and print the result"
156 )
Alex Savatieiev5118de02019-02-20 15:50:42 -0600157
158 net_report_parser = net_subparsers.add_parser(
159 'report',
160 help="Generate network check report"
161 )
Alex Savatieiev5118de02019-02-20 15:50:42 -0600162
Alex Savatieiev9c642112019-02-26 13:55:43 -0600163 # reclass
164 reclass_parser = subparsers.add_parser(
165 'reclass',
166 help="Reclass related checks and reports"
167 )
168 reclass_subparsers = reclass_parser.add_subparsers(dest='type')
169 reclass_list_parser = reclass_subparsers.add_parser(
170 'list',
171 help="List models available to compare"
172 )
173
174 reclass_diff_parser = reclass_subparsers.add_parser(
175 'diff',
176 help="List models available to compare"
177 )
178
Alex Savatieiev5118de02019-02-20 15:50:42 -0600179 #parse arguments
Alex Savatieiev9c642112019-02-26 13:55:43 -0600180 try:
181 args = parser.parse_args()
182 except TypeError as e:
183 logger_cli.info("\nPlease, check arguments")
184 return
Alex Savatieiev5118de02019-02-20 15:50:42 -0600185
Alex Savatieiev799bee32019-02-20 17:19:26 -0600186 # Handle options
187 if args.debug:
188 logger_cli.setLevel(DEBUG)
189 else:
190 logger_cli.setLevel(INFO)
191
Alex Savatieiev9c642112019-02-26 13:55:43 -0600192 # Validate the commands
193 # check command
194 if args.command not in commands:
195 logger_cli.info("\nPlease, type a command listed above")
196 return
197 elif args.type not in commands[args.command]:
198 # check type
199 logger_cli.info(
200 "\nPlease, select '{}' command type listed above".format(
201 args.command
202 )
203 )
204 return
205 else:
206 # form function name to call
207 _method_name = args.command + "_" + args.type
208 _this_module = sys.modules[__name__]
209 _method = getattr(_this_module, _method_name)
210
Alex Savatieiev5118de02019-02-20 15:50:42 -0600211 # Execute the command
Alex Savatieiev9c642112019-02-26 13:55:43 -0600212 result = _method(args)
Alex Savatieiev5118de02019-02-20 15:50:42 -0600213
214 logger.debug(result)
Alex Savatieiev5118de02019-02-20 15:50:42 -0600215
216if __name__ == '__main__':
Alex Savatieieve47f7f42019-02-20 16:41:23 -0600217 try:
218 config_check_entrypoint()
Alex Savatieiev9c642112019-02-26 13:55:43 -0600219 except ConfigException as e:
Alex Savatieieve9613992019-02-21 18:20:35 -0600220 exc_type, exc_value, exc_traceback = sys.exc_info()
221 logger_cli.error("\nERROR: {}\n\n{}".format(
222 e.message,
223 "".join(traceback.format_exception(
224 exc_type,
225 exc_value,
226 exc_traceback
227 ))
228 ))