o b$ @sPdZddlZddlmZddlmZmZmZddlm Z ddl m Z ddl m Z mZmZmZmZmZed\ZZZd ZeejGd d d Zd&d dZie jde jde jde jde jde j de j!de j"de j#de j$de j%de j&de j'de j(de j)de j*de j+de j,d e j-d!e j.d"e j/d#e j0d$e j1d%iZ2dS)'z> Base functionality useful to various parts of Twisted Names. N) implementer)defererror interfaces)Logger)dns)DNSFormatError DNSNameErrorDNSNotImplementedErrorDNSQueryRefusedErrorDNSServerErrorDNSUnknownError)rrc @sVeZdZdZeZejeej e ej e ej eejeiZdZddZddZd>ddZd d Zd>d d Zd>d dZd>ddZd>ddZd>ddZd>ddZd>ddZd>ddZd>ddZd>ddZ d>dd Z!d>d!d"Z"d>d#d$Z#d>d%d&Z$d>d'd(Z%d>d)d*Z&d>d+d,Z'd>d-d.Z(d>d/d0Z)d>d1d2Z*d>d3d4Z+d>d5d6Z,d>d7d8Z-d?d:d;Z.dr@rBrDrFrHrJrLrNrPrRrTrVrXrZr\r^rdrarrrrr!sN                           rr_cs~sdSttdr?|D]}|jkr#|jtjkr#ttj|jj Sq |D]}|jkr>|jtj kr>ttj|jj Sq&|D]}|jkrY|jtj krYttj |jj SqA|D],}|jkr|jtj krt||jj|d}|s|j|jjjddS|Sq\|D]1}|jtjkrqddlm}|j|jjjdtjfgdfd d }j|SdS) am Resolve a name to an IP address, following I{CNAME} records and I{NS} referrals recursively. This is an implementation detail of L{ResolverBase.getHostByName}. @param resolver: The resolver to use for the next query (unless handling an I{NS} referral). @type resolver: L{IResolver} @param name: The name being looked up. @type name: L{dns.Name} @param answers: All of the records returned by the previous query (answers, authority, and additional concatenated). @type answers: L{list} of L{dns.RRHeader} @param level: Remaining recursion budget. This is decremented at each recursion. The query returns L{None} when it reaches 0. @type level: L{int} @returns: The first IPv4 or IPv6 address (as a dotted quad or colon quibbles), or L{None} when no result is found. @rtype: native L{str} or L{None} N inet_ntop)rbr)clientascii)serverscs$|\}}}t|||dS)Nrw)re)rhrirjrklevelr% nsResolverrr queryAgains z!extractRecord..queryAgain)hasattrsocketr%rrr5rvAF_INET6payloadaddressr3r/AF_INETr;rerdr9 twisted.namesrxResolverdecodePORTr1r`)resolverr%answersr|rrlrxr~rr{rresB   rer1r4r6r:r<rFr>r@rBrHrJrDrNrPr8rRrTrVrXrLr\rZr^)r_)3rprzope.interfacertwisted.internetrrrtwisted.loggerrrrtwisted.names.errorrr r r r r range_ANS_AUTH_ADD EMPTY_RESULT IResolverrrer/r3r5r9r;rEr=r?rArGrIrCrMrOr7rQrSrUrWrKr[rYr]rrrrrsn      B