commit a383fca9fc051e140797879b67e4fb8b9fa71264 Author: pierre.geeraert Date: Thu Jun 25 08:41:08 2026 +0100 First commit diff --git a/parser.py b/parser.py new file mode 100644 index 0000000..f28084c --- /dev/null +++ b/parser.py @@ -0,0 +1,74 @@ +import re +import sys + +def parse_file(file_path): + results = [] + + with open(file_path, "r", encoding="utf-8", errors="ignore") as f: + for line in f: + + # Look for lines containing recap info + if "ok=" in line and "failed=" in line and "unreachable=" in line: + + # Extract host (first non-time token before :) + host_match = re.search(r"(?:\d{2}:\d{2}:\d{2}\s+)?(\S+)\s+:", line) + if not host_match: + continue + + host = host_match.group(1) + + # Extract values individually (order-independent) + def get_value(field): + match = re.search(rf"{field}=(\d+)", line) + return int(match.group(1)) if match else 0 + + ok = get_value("ok") + changed = get_value("changed") + unreachable = get_value("unreachable") + failed = get_value("failed") + + status = ( + "UNREACHABLE" if unreachable > 0 + else "FAILED" if failed > 0 + else "OK" + ) + + results.append({ + "host": host, + "ok": ok, + "changed": changed, + "unreachable": unreachable, + "failed": failed, + "status": status + }) + + return results + + +def print_report(results): + unreachable_hosts = [] + failed_hosts = [] + + print("\n=== FULL HOST REPORT ===") + for r in results: + print(f"{r['host']} -> {r['status']} " + f"(ok={r['ok']}, changed={r['changed']}, " + f"failed={r['failed']}, unreachable={r['unreachable']})") + + if r["status"] == "UNREACHABLE": + unreachable_hosts.append(r["host"]) + elif r["status"] == "FAILED": + failed_hosts.append(r["host"]) + + print("\n=== SUMMARY ===") + + print("\nUNREACHABLE HOSTS:") + print("\n".join(unreachable_hosts) if unreachable_hosts else " None") + + print("\nFAILED HOSTS:") + print("\n".join(failed_hosts) if failed_hosts else " None") + + +if __name__ == "__main__": + results = parse_file(sys.argv[1]) + print_report(results)