Example #1
0
 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)
Example #2
0
                   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: