mirror of
https://gitlab.nic.cz/knot/knot-dns.git
synced 2026-02-03 18:49:28 -05:00
samples/probe_dump.py: add --json option
This commit is contained in:
parent
746017e484
commit
1729a53709
1 changed files with 64 additions and 2 deletions
|
|
@ -6,10 +6,60 @@
|
|||
"""A simple Knot DNS probe client."""
|
||||
|
||||
import argparse
|
||||
import datetime
|
||||
import json
|
||||
import libknot
|
||||
import libknot.probe
|
||||
import sys
|
||||
|
||||
def extract_dns_header(probe, fieldname):
|
||||
val = getattr(probe, fieldname)
|
||||
return {
|
||||
"additionals": val.additionals,
|
||||
"answers": val.answers,
|
||||
"authorities": val.authorities,
|
||||
"flag_aa": val.flag_aa,
|
||||
"flag_ad": val.flag_ad,
|
||||
"flag_cd": val.flag_cd,
|
||||
"flag_qr": val.flag_qr,
|
||||
"flag_ra": val.flag_ra,
|
||||
"flag_rd": val.flag_rd,
|
||||
"flag_tc": val.flag_tc,
|
||||
"flag_z": val.flag_z,
|
||||
"id": val.id,
|
||||
"opcode": val.opcode,
|
||||
"questions": val.questions,
|
||||
"rcode": val.rcode,
|
||||
}
|
||||
|
||||
def extract_addr(probe, fieldname):
|
||||
val = getattr(probe, fieldname)
|
||||
return probe.addr_str(val)
|
||||
|
||||
def extract_safe(probe, fieldname):
|
||||
convert_func = getattr
|
||||
try:
|
||||
convert_func = {
|
||||
'local_addr': extract_addr,
|
||||
'remote_addr': extract_addr,
|
||||
'query_hdr': extract_dns_header,
|
||||
'reply_hdr': extract_dns_header,
|
||||
'query_name': lambda probe, _: probe.qname_str(),
|
||||
}[fieldname]
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
return convert_func(probe, fieldname)
|
||||
|
||||
def convert_json(probe):
|
||||
probe_as_dict = {}
|
||||
for field in probe._fields_:
|
||||
fieldname = field[0]
|
||||
fieldtype = field[1]
|
||||
fieldlen = field[2] if len(field) > 2 else None
|
||||
|
||||
probe_as_dict[fieldname] = extract_safe(probe, fieldname)
|
||||
return probe_as_dict
|
||||
|
||||
def probe_loop(args):
|
||||
try:
|
||||
|
|
@ -25,7 +75,14 @@ def probe_loop(args):
|
|||
while (True):
|
||||
if probe.consume(data, 1000) > 0:
|
||||
for item in data:
|
||||
print(item.str(color=not args.no_color, timestamp=not args.no_timestamp))
|
||||
if args.json:
|
||||
item_json = convert_json(item)
|
||||
if not args.no_timestamp:
|
||||
item_json["timestamp"] = datetime.datetime.now().isoformat()
|
||||
log = json.dumps(item_json)
|
||||
else:
|
||||
log = item.str(color=not args.no_color, timestamp=not args.no_timestamp)
|
||||
print(log)
|
||||
except KeyboardInterrupt:
|
||||
sys.exit(0)
|
||||
|
||||
|
|
@ -49,10 +106,15 @@ if __name__ == "__main__":
|
|||
default=1,
|
||||
help="the probe channel"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--json",
|
||||
action='store_true',
|
||||
help="Print JSON formatted"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--no-color",
|
||||
action='store_true',
|
||||
help="don't colorize the output"
|
||||
help="don't colorize the output (JSON is never colorized)"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--no-timestamp",
|
||||
|
|
|
|||
Loading…
Reference in a new issue