ansible-later/ansiblelater/__main__.py

80 lines
3.1 KiB
Python
Raw Normal View History

2018-12-19 10:19:07 +00:00
#!/usr/bin/env python
import logging
import optparse
import os
import sys
from appdirs import AppDirs
from pkg_resources import resource_filename
from ansiblelater import classify
from ansiblelater.utils import info, warn, read_config, get_property
def main():
config_dir = AppDirs("ansible-later").user_config_dir
default_config_file = os.path.join(config_dir, "config.ini")
parser = optparse.OptionParser("%prog playbook_file|role_file|inventory_file",
version="%prog " + get_property("__version__"))
parser.add_option('-c', dest='configfile', default=default_config_file,
help="Location of configuration file: [%s]" % default_config_file)
parser.add_option('-d', dest='rulesdir',
help="Location of standards rules")
parser.add_option('-q', dest='log_level', action="store_const", default=logging.WARN,
const=logging.ERROR, help="Only output errors")
parser.add_option('-s', dest='standards_filter', action='append',
help="limit standards to specific names")
parser.add_option('-v', dest='log_level', action="store_const", default=logging.WARN,
const=logging.INFO, help="Show more verbose output")
options, args = parser.parse_args(sys.argv[1:])
settings = read_config(options.configfile)
# Merge CLI options with config options. CLI options override config options.
for key, value in options.__dict__.items():
if value:
setattr(settings, key, value)
if os.path.exists(settings.configfile):
info("Using configuration file: %s" % settings.configfile, settings)
else:
warn("No configuration file found at %s" % settings.configfile, settings, file=sys.stderr)
if not settings.rulesdir:
rules_dir = os.path.join(resource_filename('ansiblelater', 'examples'))
warn("Using example standards found at %s" % rules_dir, settings, file=sys.stderr)
settings.rulesdir = rules_dir
if len(args) == 0:
candidates = []
for root, dirs, files in os.walk("."):
for filename in files:
candidates.append(os.path.join(root, filename))
else:
candidates = args
errors = 0
for filename in candidates:
if ':' in filename:
(filename, lines) = filename.split(":")
else:
lines = None
candidate = classify(filename)
if candidate:
if candidate.binary:
info("Not reviewing binary file %s" % filename, settings)
continue
if candidate.vault:
info("Not reviewing vault file %s" % filename, settings)
continue
if lines:
info("Reviewing %s lines %s" % (candidate, lines), settings)
else:
info("Reviewing all of %s" % candidate, settings)
errors = errors + candidate.review(settings, lines)
else:
info("Couldn't classify file %s" % filename, settings)
return errors
main()