c06aa1fa11b26527c75194e42f91ac57038466ec
[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 import yaml
10 from ruamel.yaml import YAML
11
12 import salty_linter
13
14 default_types = pkg_resources.resource_filename('salty_linter', 'data/salty_linter.yaml')
15
16 pp = pprint.PrettyPrinter(indent=4)
17
18 # - option to pick an alternate type database, say for a specific version of salt (defaults to salty-linter.yaml)
19 argparser = argparse.ArgumentParser(description="salty-linter. Let's lint some salt, mateys",
20 epilog='Now let\'s get some salt states in ship shop shape !')
21 argparser.add_argument('--verbose', dest='verbose', action='store_true', help="Let's be super chatty and generate a lot of output.")
22 argparser.add_argument('--no-werror', dest='werror', action='store_false', help="Don't treat warnings as errors")
23 argparser.add_argument('--typedb', nargs='?', default=default_types, type=argparse.FileType('r'), help="alternative type database.")
24 argparser.add_argument('sls', nargs='+', help="list of salt state files")
25 argparser.set_defaults(verbose=False, werror=True)
26 args = argparser.parse_args()
27
28 pp.pprint(args)
29
30 if args.verbose:
31 print("HI I'M SALTY_LINTER. LETS GET CHATTY.")
32
33 # Open the type database file and read in the type database
34 # Error out of that file doesn't parse / doesn't exist / is unreadab
35 typedb = yaml.load(args.typedb)
36
37 if args.verbose:
38 print("HERE'S YOUR TYPE DATABSE. WALLOW IN IT.")
39 pp.pprint(typedb)
40 print("WRAP UP YOUR TYPE DATABASE WALLOWING.")
41
42 exit_status = 0
43 for an_sls_filename in args.sls:
44 print('PROCESSING: ' + an_sls_filename)
45
46 # Check if the file exists and is readable
47 fullpath_sls_filename = os.path.abspath(an_sls_filename)
48 if not os.path.isfile(fullpath_sls_filename):
49 print("error: {} is not a file".format(an_sls_filename))
50 exit_status = 1
51 continue
52 elif not access(fullpath_sls_filename, R_OK):
53 print("error: {} is not readable".format(an_sls_filename))
54 exit_status = 1
55 continue
56
57 with open(fullpath_sls_filename) as fp:
58 yaml = YAML(typ='rt')
59 sls_yaml = yaml.load(fp)
60 (lint_errors, lint_warnings) = salty_linter.lint(sls_yaml, typedb)
61 if lint_errors or (lint_warnings and args.werror):
62 exit_status = 1
63 for (line_number, an_error) in lint_errors:
64 print("Error: " + an_sls_filename + ": " + str(line_number) + ": " + an_error)
65 for (line_number, a_warning) in lint_warnings:
66 print("Warning: " + an_sls_filename + ": " + str(line_number) + ": " + a_warning)
67
68 if exit_status == 0:
69 print("NO OBVIOUS FAILURES.")
70 else:
71 print("MORE SHIP-SHOPPING FOR YOU !")
72 sys.exit(exit_status)
73