I removed the KeyboardInterrupt handler from the original program and
have now put it back as an async handler for SIGINT. This is helpful
when the user accidentally starts the program with no arguments and it
just sits there until he hits Ctrl-C (which would previously have
shown a stack trace).
r"""
Convert tinydns and dnscache logs to human-readable form
"""
r"""
Convert tinydns and dnscache logs to human-readable form
"""
+from signal import signal, SIGINT
+from sys import exit, stdin
from argparse import ArgumentParser, FileType
from djbdns.io import parse_logfile
from argparse import ArgumentParser, FileType
from djbdns.io import parse_logfile
# Parse zero or more positional arguments into a list of
# "logfiles". If none are given, read from stdin instead.
# 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"),
parser.add_argument("logfiles",
metavar="LOGFILE",
type=FileType("r"),
#
# So anyway, don't run this on several million logfiles.
args = parser.parse_args()
#
# 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: exit(0))
+
for f in args.logfiles:
parse_logfile(f)
for f in args.logfiles:
parse_logfile(f)