From 9fe31715056413b42a0be6ba0669559c56cfbe3c Mon Sep 17 00:00:00 2001 From: Guilhem MARION Date: Tue, 11 Oct 2022 07:08:50 +1030 Subject: [PATCH] Add option to output failures only --- certo/__main__.py | 8 +++++--- certo/report.py | 7 +++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/certo/__main__.py b/certo/__main__.py index e0ff646..b1f27dc 100644 --- a/certo/__main__.py +++ b/certo/__main__.py @@ -1,12 +1,13 @@ """ Usage: - certo [-vj] [-d DAYS|--days-to-expiration=DAYS] [-t SECONDS|--timeout=SECONDS] ... + certo [-vjf] [-d DAYS|--days-to-expiration=DAYS] [-t SECONDS|--timeout=SECONDS] ... certo -h | --help Options: -h --help Show this help. -j Output in JSON format [default: False]. -v Increase verbosity [default: False]. + -f --failonly Output failures only [default: False] -d DAYS --days-to-expiration=DAYS Warn about near expiration if within DAYS of the cert's notAfter [default: 5]. -t SECONDS --timeout=SECONDS Timeout for SSL Handshake [default: 5]. """ @@ -23,6 +24,7 @@ async def main(): args = docopt(__doc__) output_as_json = args.get("-j") + output_passes = not args.get("--failonly") if args.get("-v"): logging.getLogger().setLevel(logging.INFO) hostnames = args.get("") @@ -30,9 +32,9 @@ async def main(): # @todo factory if output_as_json: - reporter = JSONReporter() + reporter = JSONReporter(output_passes) else: - reporter = DefaultReporter() + reporter = DefaultReporter(output_passes) jobs = { check_host_certificate_expiration(hs, days_to_expiration) for hs in hostnames diff --git a/certo/report.py b/certo/report.py index f91b1cf..4b98111 100644 --- a/certo/report.py +++ b/certo/report.py @@ -2,8 +2,9 @@ import json class CheckReporter: - def __init__(self): + def __init__(self, output_passes): self.checks = list() + self.output_passes = output_passes def append(self, check): self.checks.append(check) @@ -35,7 +36,7 @@ class JSONReporter(CheckReporter): list( map( lambda check: JSONReporter.__make_check_serialisable(check), - self.checks, + self.checks if self.output_passes else self.failed(), ) ), indent=4, @@ -45,6 +46,8 @@ class JSONReporter(CheckReporter): class DefaultReporter(CheckReporter): def append(self, check): super().append(check) + if check.check_successful and not self.output_passes: + return result = f"[{'PASS' if check.check_successful else 'FAIL'}] Check host {check.hostname}" if check.debug: result += f" - {check.debug}"