def parse(self): dns = None section = None paren = False rr = [] try: while True: tok, val = next(self.i) if tok == 'COMMENT': if 'Sending:' in val or 'Got answer:' in val: if dns: self.parseQuestions(q, dns) self.parseAnswers(a, auth, ar, dns) yield (dns) dns = DNSRecord() q, a, auth, ar = [], [], [], [] elif val.startswith('; ->>HEADER<<-'): self.expect('NL') val2 = self.expect('COMMENT') dns.header = self.parseHeader(val, val2) elif val.startswith('; QUESTION'): section = q elif val.startswith('; ANSWER'): section = a elif val.startswith('; AUTHORITY'): section = auth elif val.startswith('; ADDITIONAL'): section = ar elif val.startswith(';') or tok[1].startswith('<<>>'): pass elif dns and section == q: q.append(val.split()) elif tok == 'ATOM': if val == '(': paren = True elif val == ')': paren = False else: rr.append(val) elif tok == 'NL' and not paren and rr: if self.debug: print(">>", rr) section.append(rr) rr = [] except StopIteration: if rr: self.section.append(rr) if dns: self.parseQuestions(q, dns) self.parseAnswers(a, auth, ar, dns) yield (dns)
default=False, help="Short output - rdata only (default: false)") p.add_argument("--debug", action='store_true', default=False, help="Drop into CLI after request (default: false)") p.add_argument("domain", metavar="<domain>", help="Query domain") p.add_argument("qtype", metavar="<type>", default="A", nargs="?", help="Query type (default: A)") args = p.parse_args() # Construct request q = DNSRecord(q=DNSQuestion(args.domain, getattr(QTYPE, args.qtype))) address, _, port = args.server.partition(':') port = int(port or 53) if args.query: print(";; Sending%s:" % (" (TCP)" if args.tcp else "")) if args.hex: print(";; QUERY:", binascii.hexlify(q.pack()).decode()) print(q) print() a_pkt = q.send(address, port, tcp=args.tcp) a = DNSRecord.parse(a_pkt) if a.header.tc and args.noretry == False: