#!/usr/bin/env python import argparse from os import access, R_OK import os.path import pkg_resources import pprint import sys from ruamel.yaml import YAML import salty_linter default_types = pkg_resources.resource_filename('salty_linter', 'data/salty_linter.yaml') pp = pprint.PrettyPrinter(indent=4) # - option to pick an alternate type database, say for a specific version of salt (defaults to salty-linter.yaml) argparser = argparse.ArgumentParser(description="salty-linter. Let's lint some salt, mateys", epilog='Now let\'s get some salt states in ship shop shape !') argparser.add_argument('--verbose', dest='verbose', action='store_true', help="Let's be super chatty and generate a lot of output.") argparser.add_argument('--no-werror', dest='werror', action='store_false', help="Don't treat warnings as errors") argparser.add_argument('sls', nargs='+', help="list of salt state files") argparser.set_defaults(verbose=False, werror=True) args = argparser.parse_args() if args.verbose: print("HELLO EVERYONE I'M SALTY-LINTER AND I'M VERBOSE.") exit_status = 0 for an_sls_filename in args.sls: print('PROCESSING: ' + an_sls_filename) # Check if the file exists and is readable fullpath_sls_filename = os.path.abspath(an_sls_filename) if not os.path.isfile(fullpath_sls_filename): print("error: {} is not a file".format(an_sls_filename)) exit_status = 1 continue elif not access(fullpath_sls_filename, R_OK): print("error: {} is not readable".format(an_sls_filename)) exit_status = 1 continue with open(fullpath_sls_filename) as fp: yaml = YAML(typ='jinja2') sls_yaml = yaml.load(fp) (lint_errors, lint_warnings) = salty_linter.lint(sls_yaml) if lint_errors or (lint_warnings and args.werror): exit_status = 1 for (line_number, an_error) in lint_errors: print("Error: " + an_sls_filename + ": " + str(line_number) + ": " + an_error) for (line_number, a_warning) in lint_warnings: print("Warning: " + an_sls_filename + ": " + str(line_number) + ": " + a_warning) if exit_status == 0: print("NO OBVIOUS FAILURES.") sys.exit(exit_status)