Checkpoint commit / importlib-inspect approach
[salty_linter.git] / bin / salty-linter
1 #!/usr/bin/env python
2
3 import argparse
4 from os import access, R_OK
5 import os.path
6 import pkg_resources
7 import pprint
8 import sys
9 from ruamel.yaml import YAML
10
11 import salty_linter
12
13 default_types = pkg_resources.resource_filename('salty_linter', 'data/salty_linter.yaml')
14
15 pp = pprint.PrettyPrinter(indent=4)
16
17 # - option to pick an alternate type database, say for a specific version of salt (defaults to salty-linter.yaml)
18 argparser = argparse.ArgumentParser(description="salty-linter. Let's lint some salt, mateys",
19 epilog='Now let\'s get some salt states in ship shop shape !')
20 argparser.add_argument('--verbose', dest='verbose', action='store_true', help="Let's be super chatty and generate a lot of output.")
21 argparser.add_argument('--no-werror', dest='werror', action='store_false', help="Don't treat warnings as errors")
22 argparser.add_argument('sls', nargs='+', help="list of salt state files")
23 argparser.set_defaults(verbose=False, werror=True)
24 args = argparser.parse_args()
25
26 if args.verbose:
27 print("HELLO EVERYONE I'M SALTY-LINTER AND I'M VERBOSE.")
28
29 exit_status = 0
30 for an_sls_filename in args.sls:
31 print('PROCESSING: ' + an_sls_filename)
32
33 # Check if the file exists and is readable
34 fullpath_sls_filename = os.path.abspath(an_sls_filename)
35 if not os.path.isfile(fullpath_sls_filename):
36 print("error: {} is not a file".format(an_sls_filename))
37 exit_status = 1
38 continue
39 elif not access(fullpath_sls_filename, R_OK):
40 print("error: {} is not readable".format(an_sls_filename))
41 exit_status = 1
42 continue
43
44 with open(fullpath_sls_filename) as fp:
45 yaml = YAML(typ='jinja2')
46 sls_yaml = yaml.load(fp)
47 (lint_errors, lint_warnings) = salty_linter.lint(sls_yaml)
48 if lint_errors or (lint_warnings and args.werror):
49 exit_status = 1
50 for (line_number, an_error) in lint_errors:
51 print("Error: " + an_sls_filename + ": " + str(line_number) + ": " + an_error)
52 for (line_number, a_warning) in lint_warnings:
53 print("Warning: " + an_sls_filename + ": " + str(line_number) + ": " + a_warning)
54
55 if exit_status == 0:
56 print("NO OBVIOUS FAILURES.")
57
58 sys.exit(exit_status)
59