;>Sc @sGdZddlZddlZddlZddlZddlZddlZddlZddl Zddl Zddl Zddl Zddl ZddlZddlZddlZddlZddlZddlZddlZdejjfdYZdejjfdYZdejjfdYZd ejjfd YZd ejjfd YZd ejjfdYZdefdYZdefdYZ e!de"e!e!e"e#e"e"e"d Z$defdYZ%dZ&dZ'ej(j)e!e"dde!e!dZ*e"dddZ+dS(s DNS MessagesiNt ShortHeadercBseZdZRS(s<Raised if the DNS packet passed to from_wire() is too short.(t__name__t __module__t__doc__(((s1/usr/lib64/python2.7/site-packages/dns/message.pyR'st TrailingJunkcBseZdZRS(sSRaised if the DNS packet passed to from_wire() has extra junk at the end of it.(RRR(((s1/usr/lib64/python2.7/site-packages/dns/message.pyR+stUnknownHeaderFieldcBseZdZRS(s]Raised if a header field name is not recognized when converting from text into a message.(RRR(((s1/usr/lib64/python2.7/site-packages/dns/message.pyR0stBadEDNScBseZdZRS(saRaised if an OPT record occurs somewhere other than the start of the additional data section.(RRR(((s1/usr/lib64/python2.7/site-packages/dns/message.pyR5stBadTSIGcBseZdZRS(s_Raised if a TSIG record occurs somewhere other than the end of the additional data section.(RRR(((s1/usr/lib64/python2.7/site-packages/dns/message.pyR:stUnknownTSIGKeycBseZdZRS(s/Raised if we got a TSIG but don't know the key.(RRR(((s1/usr/lib64/python2.7/site-packages/dns/message.pyR?stMessagecBs eZdZddZdZdZdedZdZ dZ dZ dZ e jjdeed Ze jjdeed Zdd d Zdd dd de jjdZd d ddddZedZdZdZdZdZRS(s, A DNS message. @ivar id: The query id; the default is a randomly chosen id. @type id: int @ivar flags: The DNS flags of the message. @see: RFC 1035 for an explanation of these flags. @type flags: int @ivar question: The question section. @type question: list of dns.rrset.RRset objects @ivar answer: The answer section. @type answer: list of dns.rrset.RRset objects @ivar authority: The authority section. @type authority: list of dns.rrset.RRset objects @ivar additional: The additional data section. @type additional: list of dns.rrset.RRset objects @ivar edns: The EDNS level to use. The default is -1, no Edns. @type edns: int @ivar ednsflags: The EDNS flags @type ednsflags: long @ivar payload: The EDNS payload size. The default is 0. @type payload: int @ivar options: The EDNS options @type options: list of dns.edns.Option objects @ivar request_payload: The associated request's EDNS payload size. @type request_payload: int @ivar keyring: The TSIG keyring to use. The default is None. @type keyring: dict @ivar keyname: The TSIG keyname to use. The default is None. @type keyname: dns.name.Name object @ivar keyalgorithm: The TSIG algorithm to use; defaults to dns.tsig.default_algorithm. Constants for TSIG algorithms are defined in dns.tsig, and the currently implemented algorithms are HMAC_MD5, HMAC_SHA1, HMAC_SHA224, HMAC_SHA256, HMAC_SHA384, and HMAC_SHA512. @type keyalgorithm: string @ivar request_mac: The TSIG MAC of the request message associated with this message; used when validating TSIG signatures. @see: RFC 2845 for more information on TSIG fields. @type request_mac: string @ivar fudge: TSIG time fudge; default is 300 seconds. @type fudge: int @ivar original_id: TSIG original id; defaults to the message's id @type original_id: int @ivar tsig_error: TSIG error code; default is 0. @type tsig_error: int @ivar other_data: TSIG other data. @type other_data: string @ivar mac: The TSIG MAC for this message. @type mac: string @ivar xfr: Is the message being used to contain the results of a DNS zone transfer? The default is False. @type xfr: bool @ivar origin: The origin of the zone in messages which are used for zone transfers or for DNS dynamic updates. The default is None. @type origin: dns.name.Name object @ivar tsig_ctx: The TSIG signature context associated with this message. The default is None. @type tsig_ctx: hmac.HMAC object @ivar had_tsig: Did the message decoded from wire format have a TSIG signature? @type had_tsig: bool @ivar multi: Is this message part of a multi-message sequence? The default is false. This variable is used when validating TSIG signatures on messages which are part of a zone transfer. @type multi: bool @ivar first: Is this message standalone, or the first of a multi message sequence? This variable is used when validating TSIG signatures on messages which are part of a zone transfer. @type first: bool @ivar index: An index of rrsets in the message. The index key is (section, name, rdclass, rdtype, covers, deleting). Indexing can be disabled by setting the index to None. @type index: dict cCs!|dkr!tjj|_n ||_d|_g|_g|_g|_g|_ d|_ d|_ d|_ g|_ d|_d|_d|_tjj|_d|_d|_d|_d|_|j|_d|_t|_d|_d|_t|_t|_t |_!i|_"dS(Niiti,(#tNonetdnstentropyt random_16tidtflagstquestiontanswert authorityt additionaltednst ednsflagstpayloadtoptionstrequest_payloadtkeyringtkeynamettsigtdefault_algorithmt keyalgorithmt request_mact other_datat tsig_errortfudget original_idtmactFalsetxfrtoriginttsig_ctxthad_tsigtmultitTruetfirsttindex(tselfR((s1/usr/lib64/python2.7/site-packages/dns/message.pyt__init__s:                          cCsd|j dS(Ns(R(R.((s1/usr/lib64/python2.7/site-packages/dns/message.pyt__repr__scCs |jS(N(tto_text(R.((s1/usr/lib64/python2.7/site-packages/dns/message.pyt__str__scKs5tj}|d|jIJ|dtjjtjj|jIJtjj|j|j }|dtjj|IJ|dtjj|jIJ|j dkr|d|j IJ|j dkr|dtjj |j IJn|dI|j IJntjj |j}|r%|d IJn |d IJx*|jD]}||j|||IJq9W|ro|d IJn |d IJx*|jD]}||j|||IJqW|r|d IJn |dIJx*|jD]}||j|||IJqW|dIJx*|jD]}||j|||IJqW|jd S(sConvert the message to text. The I{origin}, I{relativize}, and any other keyword arguments are passed to the rrset to_wire() method. @rtype: string sid %ds opcode %ssrcode %ssflags %sisedns %ss eflags %sRs;ZONEs ;QUESTIONs;PREREQs;ANSWERs;UPDATEs ;AUTHORITYs ;ADDITIONALi(t cStringIOtStringIORR topcodeR2t from_flagsRtrcodeRRt edns_to_textRt is_updateRRRRtgetvalue(R.R't relativizetkwtstrcR:trrset((s1/usr/lib64/python2.7/site-packages/dns/message.pyR2sB "       cCs-t|tstS|j|jkr)tS|j|jkr?tSx$|jD]}||jkrItSqIWx$|jD]}||jkrptSqpWx$|jD]}||jkrtSqWx$|jD]}||jkrtSqWx$|jD]}||jkrtSqWx$|jD]}||jkr tSq WtS(sTwo messages are equal if they have the same content in the header, question, answer, and authority sections. @rtype: bool( t isinstanceR R%RRRRRR+(R.tothertn((s1/usr/lib64/python2.7/site-packages/dns/message.pyt__eq__s2cCs|j| S(s0Are two messages not equal? @rtype: bool(RD(R.RB((s1/usr/lib64/python2.7/site-packages/dns/message.pyt__ne__scCs|jtjj@dksU|j|jksUtjj|jtjj|jkrYtStjj|j|jtjj krt Stjj |jrt Sx$|j D]}||j krtSqWx$|j D]}||j krtSqWt S(s1Is other a response to self? @rtype: booli( RR tQRRR6R7R%R8RtNOERRORR+R:R(R.RBRC((s1/usr/lib64/python2.7/site-packages/dns/message.pyt is_response s"cCs\||jkrdS||jkr&dS||jkr9dS||jkrLdStddS(Niiiisunknown section(RRRRt ValueError(R.tsection((s1/usr/lib64/python2.7/site-packages/dns/message.pytsection_number sc Cs|j||||||f} |s|jdk r[|jj| } | dk r| Sqx0|D]%} | j|||||rb| SqbWn|stntjj|||||} |j | |jdk r| |j| O}|dkrg}n||_||_||_||_||_dS(s_Configure EDNS behavior. @param edns: The EDNS level to use. Specifying None, False, or -1 means 'do not use EDNS', and in this case the other parameters are ignored. Specifying True is equivalent to specifying 0, i.e. 'use EDNS0'. @type edns: int or bool or None @param ednsflags: EDNS flag values. @type ednsflags: int @param payload: The EDNS sender's payload field, which is the maximum size of UDP datagram the sender can handle. @type payload: int @param request_payload: The EDNS payload size to use when sending this message. If not specified, defaults to the value of payload. @type request_payload: int or None @param options: The EDNS options @type options: None or list of dns.edns.Option objects @see: RFC 2671 iil~iN(R R%R+RRRRR(R.RRRRR((s1/usr/lib64/python2.7/site-packages/dns/message.pytuse_ednss(              cCsf|r:|jdkr"|jn|jtjjO_n(|jdkrb|jtjjM_ndS(s Enable or disable 'DNSSEC desired' flag in requests. @param wanted: Is DNSSEC desired? If True, EDNS is enabled if required, and then the DO bit is set. If False, the DO bit is cleared if EDNS is enabled. @type wanted: bool iN(RRoRR RtDO(R.twanted((s1/usr/lib64/python2.7/site-packages/dns/message.pyt want_dnssecs  cCstjj|j|jS(s.Return the rcode. @rtype: int (R R8R7RR(R.((s1/usr/lib64/python2.7/site-packages/dns/message.pyR8scCstjj|\}}|jdM_|j|O_|jdM_|j|O_|jdkr~|jdkr~d|_ndS(sPSet the rcode. @param rcode: the rcode @type rcode: int iliN(R R8tto_flagsRRR(R.R8tvaluetevalue((s1/usr/lib64/python2.7/site-packages/dns/message.pyt set_rcodescCstjj|jS(s/Return the opcode. @rtype: int (R R6R7R(R.((s1/usr/lib64/python2.7/site-packages/dns/message.pyR6!scCs.|jdM_|jtjj|O_dS(sTSet the opcode. @param opcode: the opcode @type opcode: int iN(RR R6Rs(R.R6((s1/usr/lib64/python2.7/site-packages/dns/message.pyt set_opcode'sN(RRRR R/R1R3R+R2RDRERHRKR t rdatatypetNONER%RYRZRhRRRnRoRrR8RvR6Rw(((s1/usr/lib64/python2.7/site-packages/dns/message.pyR Cs.J  3     - !. )*   t _WireReadercBs;eZdZeeedZdZdZdZRS(sWire format reader. @ivar wire: the wire-format message. @type wire: string @ivar message: The message object being built @type message: dns.message.Message object @ivar current: When building a message object from wire format, this variable contains the offset from the beginning of wire of the next octet to be read. @type current: int @ivar updating: Is the message a dynamic update? @type updating: bool @ivar one_rr_per_rrset: Put each RR into its own RRset? @type one_rr_per_rrset: bool @ivar ignore_trailing: Ignore trailing junk at end of request? @type ignore_trailing: bool @ivar zone_rdclass: The class of the zone in messages which are DNS dynamic updates. @type zone_rdclass: int cCs^tjj||_||_d|_t|_tjj |_ ||_ ||_ ||_ dS(Ni(R twiredatat maybe_wraptwiretmessagetcurrentR%tupdatingt rdataclasstINt zone_rdclasst question_onlytone_rr_per_rrsettignore_trailing(R.R}R~RRR((s1/usr/lib64/python2.7/site-packages/dns/message.pyR/Es     c Cs|jr$|dkr$tjjnxtd|D]}tjj|j|j\}}|j j dk r|j |j j }n|j||_t jd|j|j|jd!\}}|jd|_|j j|j j|||dtdt|jr4||_q4q4WdS(sRead the next I{qcount} records from the wire data and add them to the question section. @param qcount: the number of questions in the message @type qcount: intiis!HHiRVRWN(RR t exceptiont FormErrortxrangeRQt from_wireR}RR~R'R R<tstructtunpackRYRR+R(R.tqcounttitqnametusedRSRR((s1/usr/lib64/python2.7/site-packages/dns/message.pyt _get_questionPs! # cCs|js|jrt}nt}t}xjtd|D]Y}|j}tjj|j |j\}}|} |j j d k r|j |j j }n|j||_tjd|j |j|jd!\} } } } |jd|_| tjjkr||j jk s|rtn| |j _| |j _| d@d?|j _g|j _|j}| }x|dkrtjd|j ||d!\}}|d}tjj||j ||}|j jj|||}|d|}qfWt}n| tjjkr5||j jko)||dks5tn|j jd krVtd n|j jj| }|d krtd |n| |j _tj j!|j |j| \|j _"|j _#tj j$|j | |t%t&j&|j j'||j| |j j(|j j)|j j* |j _(t|j _+nK| dkrJd} n|jr| tj,j-ksw| tj,j.kr| }|j/} nd }|tj,j-ks|tj,j.kr||j j0krtjj.}d }n9tj1j| | |j |j| |j j }|j2}|j j3r:| tjj4kr:t}n|j j5||| | ||t|}|d k r|j6|| n|j| |_q7Wd S( s/Read the next I{count} records from the wire data and add them to the specified section. @param section: the section of the message to which to add records @type section: list of dns.rrset.RRset objects @param count: the number of records to read @type count: intis!HHIHi iis!HHiis"got signed message without keyringskey '%s' unknownN(7RRR+R%RRR RQRR}R~R'R R<RRRxtOPTRRRRRRtoption_from_wireRPtTSIGRRRRLRRtget_algorithm_and_macRR$tvalidatetintttimeRR(R*R,R)RtANYRyRRtrdataRTR&tSOARYtadd(R.RJtcountRWtseen_optRtrr_startRQRt absolute_nameRSRRtttltrdlenRtoptslentotypetolentopttsecretRURTtrdR@((s1/usr/lib64/python2.7/site-packages/dns/message.pyt _get_sectionhs  ! )                          cCsHt|j}|dkr$tntjd|jd \|j_|j_}}}}d|_t j j |jjrt |_ n|j||jrdS|j|jj||j|jj||j|jj||j r|j|krtn|jjrD|jjrD|jj rD|jjj|jndS(sNRead a wire format DNS message and build a dns.message.Message object.i s!HHHHHHN(tlenR}RRRR~RRRR R6R:R+RRRRRRRRRR*R(R)tupdate(R.tlRtancounttaucounttadcount((s1/usr/lib64/python2.7/site-packages/dns/message.pytreads$  7      (RRRR%R/RRR(((s1/usr/lib64/python2.7/site-packages/dns/message.pyRz/s   bR c Csttdd} || _|| _|| _|| _|| _|| _|| _t|| || | } | j | S(s)Convert a DNS wire format message into a message object. @param keyring: The keyring to use if the message is signed. @type keyring: dict @param request_mac: If the message is a response to a TSIG-signed request, I{request_mac} should be set to the MAC of that request. @type request_mac: string @param xfr: Is this message part of a zone transfer? @type xfr: bool @param origin: If the message is part of a zone transfer, I{origin} should be the origin name of the zone. @type origin: dns.name.Name object @param tsig_ctx: The ongoing TSIG context, used when validating zone transfers. @type tsig_ctx: hmac.HMAC object @param multi: Is this message part of a multiple message sequence? @type multi: bool @param first: Is this message standalone, or the first of a multi message sequence? @type first: bool @param question_only: Read only up to the end of the question section? @type question_only: bool @param one_rr_per_rrset: Put each RR into its own RRset @type one_rr_per_rrset: bool @param ignore_trailing: Ignore trailing junk at end of request? @type ignore_trailing: bool @raises ShortHeader: The message is less than 12 octets long. @raises TrailingJunk: There were octets in the message past the end of the proper DNS message. @raises BadEDNS: An OPT record was in the wrong section, or occurred more than once. @raises BadTSIG: A TSIG record was not the last record of the additional data section. @rtype: dns.message.Message objectRi( R RRR&R'R(R*R,RzR( R}RRR&R'R(R*R,RRRtmtreader((s1/usr/lib64/python2.7/site-packages/dns/message.pyRs(         t _TextReadercBs;eZdZdZdZdZdZdZRS(sText format reader. @ivar tok: the tokenizer @type tok: dns.tokenizer.Tokenizer object @ivar message: The message object being built @type message: dns.message.Message object @ivar updating: Is the message a dynamic update? @type updating: bool @ivar zone_rdclass: The class of the zone in messages which are DNS dynamic updates. @type zone_rdclass: int @ivar last_name: The most recently read name when building a message object from text format. @type last_name: dns.name.Name object cCsC||_tjj||_d|_tjj|_ t |_ dS(N( R~R t tokenizert TokenizerttokR t last_nameRRRR%R(R.ttextR~((s1/usr/lib64/python2.7/site-packages/dns/message.pyR/,s   cCs|jj}|j}|dkr<|jj|j_n:|dkrx^tr|jj}|js|jj|Pn|jj t j j |jB|j_ qKWt j j |jj rvt|_qvn|dkr|jj|j_|jj|jjd>B|j_nb|dkr|jjdkrAd|j_nx2tr|jj}|jsy|jj|Pn|jjt j j|jB|j_qDWn|dkr|jj|j_|jjdkrvd|j_qvn|dkr6|jj}|jj t j jt j j |B|j_ n@|d krp|jj}|jjt jj |nt|jjd S( s5Process one line from the text format header section.RRRiteflagsiRR6R8N(RRLRttget_intR~RR+t is_identifiertungetRR RlR6R:RRRtedns_from_textRt get_stringRsRvR8Rtget_eol(R.RJttokentwhatR((s1/usr/lib64/python2.7/site-packages/dns/message.pyt _header_line3sR             #   ( c CsS|jjdt}|js?tjj|jd|_ n|j }|jj}|j srtj j nyCtj j|j}|jj}|j stj j nWn5tj j k rtj j ntj j}nXtjj|j}|jj|jj|||dtdt|jrB||_n|jjdS(s7Process one line from the text format question section.t want_leadingRVRWN(RRLR+t is_whitespaceR RQRlRtR RRRt SyntaxErrorRRRxR~RYRRRR(R.RJRRQRRRS((s1/usr/lib64/python2.7/site-packages/dns/message.pyt_question_lineas.      c Csgd}|jjdt}|jsEtjj|jd|_ n|j }|jj}|j sxtj j ny@t |jd}|jj}|j stj j nWn/tj j k rtj j n d}nXyytjj|j}|jj}|j s,tj j n|tjjksP|tjjkrb|}|j}nWn5tj j k rtj j ntjj}nXtjj|j}|jj}|js|jj|tjj|||jd}|j} nd}tjj} |jj||||| |t|j} |dk rc| j||ndS(sfProcess one line from the text format answer, authority, or additional data sections. RiN(R RRLR+RR RQRlRtRRRRRRRRyRRRxt is_eol_or_eofRRRTR~RYRR( R.RJRURRQRRRRSRRTR@((s1/usr/lib64/python2.7/site-packages/dns/message.pyt_rr_line~sT      $    cCsR|j}d }x<|jjtt}|jr7Pn|jr1|jj}|dkrj|j}n|dks|dkr|j }|j j }n|dks|dkr|j }|j j }nT|dks|dkr|j }|j j}n$|dkr|j }|j j}n|jjqn|jj|||qd S( sNRead a text format DNS message and build a dns.message.Message object.tHEADERtQUESTIONtZONER_tPREREQR`tUPDATERbN(RR RRLR+Rt is_commentRttupperRR~RRRRRRR(R.t line_methodRJRtu((s1/usr/lib64/python2.7/site-packages/dns/message.pyRs4           (RRRR/RRRR(((s1/usr/lib64/python2.7/site-packages/dns/message.pyRs   .  5cCs&t}t||}|j|S(sConvert the text format message into a message object. @param text: The text format message. @type text: string @raises UnknownHeaderField: @raises dns.exception.SyntaxError: @rtype: dns.message.Message object(R RR(RRR((s1/usr/lib64/python2.7/site-packages/dns/message.pyRls  cCstjdkrt}d}n t}d}t||rQt||}t}nt}zt|}Wd|r}|j nX|S(sRead the next text format message from the specified file. @param f: file or string. If I{f} is a string, it is treated as the name of a file to open. @raises UnknownHeaderField: @raises dns.exception.SyntaxError: @rtype: dns.message.Message objectitrURgN( tsyst hexversiont basestringRjRAtfileR+R%Rltclose(tftstr_typetoptst want_closeR((s1/usr/lib64/python2.7/site-packages/dns/message.pyt from_files   iic Cst|ttfr*tjj|}nt|ttfrTtjj|}nt|ttfr~tjj|}nt} | j tj j O_ | j | j |||dt dt | j|||||| j|| S(sWMake a query message. The query name, type, and class may all be specified either as objects of the appropriate type, or as strings. The query will have a randomly choosen query id, and its DNS flags will be set to dns.flags.RD. @param qname: The query name. @type qname: dns.name.Name object or string @param rdtype: The desired rdata type. @type rdtype: int @param rdclass: The desired rdata class; the default is class IN. @type rdclass: int @param use_edns: The EDNS level to use; the default is None (no EDNS). See the description of dns.message.Message.use_edns() for the possible values for use_edns and their meanings. @type use_edns: int or bool or None @param want_dnssec: Should the query indicate that DNSSEC is desired? @type want_dnssec: bool @param ednsflags: EDNS flag values. @type ednsflags: int @param payload: The EDNS sender's payload field, which is the maximum size of UDP datagram the sender can handle. @type payload: int @param request_payload: The EDNS payload size to use when sending this message. If not specified, defaults to the value of payload. @type request_payload: int or None @param options: The EDNS options @type options: None or list of dns.edns.Option objects @see: RFC 2671 @rtype: dns.message.Message objectRVRW(RARjRkR RQRlRxRR RtRDRYRR+RoRr( RRSRRRoRrRRRRR((s1/usr/lib64/python2.7/site-packages/dns/message.pyt make_querys$  i i,cCs|jtjj@r(tjjdntjj|j}tjj|jtjj@B|_|r{|jtjj O_n|j |j t |j |_ |jdkr|jdd||jn|jr |j|j|j|ddd|j|j|_n|S(s Make a message which is a response for the specified query. The message returned is really a response skeleton; it has all of the infrastructure required of a response, but none of the content. The response's question section is a shallow copy of the query's question section, so the query's question RRsets should not be changed. @param query: the query to respond to @type query: dns.message.Message object @param recursion_available: should RA be set in the response? @type recursion_available: bool @param our_payload: payload size to advertise in EDNS responses; default is 8192. @type our_payload: int @param fudge: TSIG time fudge; default is 300 seconds. @type fudge: int @rtype: dns.message.Message objects&specified query message is not a queryiR N(RR RFRRR~R RRtRARwR6tlistRRRoRR)RnRRR RR$R(tquerytrecursion_availablet our_payloadR"tresponse((s1/usr/lib64/python2.7/site-packages/dns/message.pyt make_response6s   (,RR4trandomRRRtdns.ednsR t dns.exceptiont dns.flagstdns.namet dns.opcodet dns.entropyt dns.rcodet dns.rdatatdns.rdataclasst dns.rdatatypet dns.rrsett dns.renderertdns.tsigt dns.wiredataRRRRt DNSExceptionRRRRtobjectR RzR R%R+RRRlRRRRR(((s1/usr/lib64/python2.7/site-packages/dns/message.pytsP                      5    0