Esempio n. 1
0
 def parse(self):
     dns = None
     section = None
     paren = False
     rr = []
     try:
         while True:
             tok, val = next(self.i)
             if tok == 'COMMENT':
                 if val.startswith('; ->>HEADER<<-'):
                     # Start new record
                     if dns:
                         # If we have a current record complete this
                         self.parseQuestions(q, dns)
                         self.parseAnswers(a, auth, ar, dns)
                         yield (dns)
                     dns = DNSRecord()
                     q, a, auth, ar = [], [], [], []
                     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('; OPT'):
                     # Only partial support for parsing EDNS records
                     self.expect('NL')
                     val2 = self.expect('COMMENT')
                     self.parseEDNS(val2, dns)
                 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)
Esempio n. 2
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)