#!/usr/bin/python3 r""" Convert tinydns and dnscache logs to human-readable form """ # Avoid clobbering the top-level exit() built-in. import sys from signal import signal, SIGINT from argparse import ArgumentParser, FileType from djbdns.io import parse_logfile # Create an argument parser using the file's docsctring as its # description. parser = ArgumentParser(description = __doc__) # Parse zero or more positional arguments into a list of # "logfiles". If none are given, read from stdin instead. parser.add_argument("logfiles", metavar="LOGFILE", type=FileType("r"), nargs="*", default=[sys.stdin], help="djbdns logfile to process (default: stdin)") # Warning: argparse automatically opens its file arguments here, # and they only get closed when the program terminates. There's no # real benefit to closing them one-at-a-time after calling # parse_logfile(), because the "scarce" resource of open file # descriptors gets consumed immediately, before any processing has # happened. In other words, if you're going to run out of file # descriptors, it's going to happen right now. # # So anyway, don't run this on several million logfiles. args = parser.parse_args() # Install a SIGINT handler so thst we don't spit out a stack trace when # the user accidentally starts the program with no arguments and then # hits Ctrl-C to kill it. signal(SIGINT, lambda s,f: sys.exit(0)) for f in args.logfiles: parse_logfile(f)