ansible-later/ansiblelater/__main__.py

103 lines
2.8 KiB
Python
Raw Permalink Normal View History

2018-12-19 11:19:07 +01:00
#!/usr/bin/env python
2019-04-04 16:06:18 +02:00
"""Main program."""
2018-12-19 11:19:07 +01:00
import argparse
2019-04-16 11:33:21 +02:00
import multiprocessing
2019-04-16 10:09:14 +02:00
import sys
2019-03-28 01:20:43 +01:00
from ansiblelater import LOG, __version__, logger
from ansiblelater.candidate import Candidate
from ansiblelater.rule import SingleRules
from ansiblelater.settings import Settings
2018-12-19 11:19:07 +01:00
def main():
2019-04-04 16:06:18 +02:00
"""Run main program."""
parser = argparse.ArgumentParser(
description="Validate Ansible files against best practice guideline"
2020-04-05 14:33:43 +02:00
)
parser.add_argument(
"-c", "--config", dest="config_file", metavar="CONFIG", help="path to configuration file"
2020-04-05 14:33:43 +02:00
)
parser.add_argument(
"-r",
"--rules-dir",
dest="rules.dir",
metavar="DIR",
action="append",
help="directory of rules",
)
parser.add_argument(
"-B",
"--no-builtin",
dest="rules.builtin",
action="store_false",
help="disables built-in rules",
2020-04-05 14:33:43 +02:00
)
parser.add_argument(
"-i",
"--include-rules",
dest="rules.include_filter",
metavar="TAGS",
2020-04-05 14:33:43 +02:00
action="append",
help="limit rules to given id/tags",
2020-04-05 14:33:43 +02:00
)
parser.add_argument(
"-x",
"--exclude-rules",
2020-04-05 14:33:43 +02:00
dest="rules.exclude_filter",
metavar="TAGS",
2020-04-05 14:33:43 +02:00
action="append",
help="exclude rules by given it/tags",
2020-04-05 14:33:43 +02:00
)
parser.add_argument(
"-v", dest="logging.level", action="append_const", const=-1, help="increase log level"
)
parser.add_argument(
"-q", dest="logging.level", action="append_const", const=1, help="decrease log level"
)
2019-04-02 16:34:03 +02:00
parser.add_argument("rules.files", nargs="*")
parser.add_argument("-V", "--version", action="version", version=f"%(prog)s {__version__}")
args = parser.parse_args().__dict__
2018-12-19 11:19:07 +01:00
settings = Settings(args=args)
2019-04-03 17:42:46 +02:00
config = settings.config
2019-04-02 16:34:03 +02:00
2019-04-03 17:42:46 +02:00
logger.update_logger(LOG, config["logging"]["level"], config["logging"]["json"])
SingleRules(config["rules"]["dir"])
2019-04-03 17:42:46 +02:00
2019-04-16 11:33:21 +02:00
workers = max(multiprocessing.cpu_count() - 2, 2)
p = multiprocessing.Pool(workers)
tasks = []
for filename in config["rules"]["files"]:
candidate = Candidate.classify(filename, settings)
2019-04-02 16:34:03 +02:00
if candidate:
if candidate.binary:
LOG.info(f"Not reviewing binary file {filename}")
2019-04-02 16:34:03 +02:00
continue
if candidate.vault:
LOG.info(f"Not reviewing vault file {filename}")
2019-04-02 16:34:03 +02:00
continue
LOG.info(f"Reviewing all of {candidate}")
tasks.append(candidate)
2019-04-02 16:34:03 +02:00
else:
LOG.info(f"Couldn't classify file {filename}")
errors = sum(p.map(_review_wrapper, tasks))
2019-04-16 11:33:21 +02:00
p.close()
p.join()
return_code = 1 if errors != 0 else 0
2019-04-16 10:09:14 +02:00
sys.exit(return_code)
2019-04-15 17:26:02 +02:00
2018-12-19 11:19:07 +01:00
def _review_wrapper(candidate):
return candidate.review()
2019-04-16 11:33:21 +02:00
2019-01-08 16:22:19 +01:00
if __name__ == "__main__":
main()