�
;�>Sc@sGdZddlZddlZddlZddlZddlZddlZddlZddl Zddl
ZddlZddlZddl
ZddlZddlZddlZddlZddlZddlZddlZdejjfd��YZdejjfd��YZdejjfd��YZd ejjfd
��YZdejjfd��YZd
ejjfd��YZdefd��YZdefd��YZ e!de"e!e!e"e#e"e"e"d�
Z$defd��YZ%d�Z&d�Z'ej(j)e!e"dde!e!d�Z*e"ddd�Z+dS(sDNS Messagesi����NtShortHeadercBseZdZRS(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'stTrailingJunkcBseZdZRS(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
eZdZdd�Zd�Zd�Zded�Zd�Z d�Z
d�Zd�Ze
jjdeed �Ze
jjdeed
�Zddd�Zdd
ddde
jjd�Zdddddd�Zed�Zd�Zd�Zd�Zd�ZRS(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(Nii����ti,(#tNonetdnstentropyt random_16tidtflagstquestiontanswert authorityt
additionaltednst ednsflagstpayloadtoptionstrequest_payloadtkeyringtkeynamettsigtdefault_algorithmtkeyalgorithmtrequest_mact
other_datat
tsig_errortfudgetoriginal_idtmactFalsetxfrtoriginttsig_ctxthad_tsigtmultitTruetfirsttindex(tselfR((s1/usr/lib64/python2.7/site-packages/dns/message.pyt__init__�s: cCsd|j
dS(Ns<DNS message, ID t>(R(R.((s1/usr/lib64/python2.7/site-packages/dns/message.pyt__repr__�scCs
|j�S(N(tto_text(R.((s1/usr/lib64/python2.7/site-packages/dns/message.pyt__str__�scKs5tj�}|d|jIJ|dtjjtjj|j��IJtjj|j|j �}|dtjj|�IJ|dtjj|j�IJ|j
dkr�|d|j
IJ|j dkr�|dtjj|j �IJn|dI|jIJntjj
|j�}|r%|d IJn
|d
IJx*|jD]}||j|||�IJq9W|ro|dIJn
|dIJx*|jD]}||j|||�IJq�W|r�|d
IJn
|dIJx*|jD]}||j|||�IJq�W|dIJx*|jD]}||j|||�IJqW|j�d S(s�Convert 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 cStringIOtStringIORRtopcodeR2t
from_flagsRtrcodeRRtedns_to_textRt is_updateRRRRtgetvalue(R.R't
relativizetkwtstrcR:trrset((s1/usr/lib64/python2.7/site-packages/dns/message.pyR2�sB "
cCs-t|t�stS|j|jkr)tS|j|jkr?tSx$|jD]}||jkrItSqIWx$|jD]}||jkrptSqpWx$|jD]}||jkr�tSq�Wx$|jD]}||jkr�tSq�Wx$|jD]}||jkr�tSq�Wx$|jD]}||jkrtSqWtS(s�Two 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|j�tjj|j�krYtStjj|j|j�tjj kr�t
Stjj|j�r�t
Sx$|jD]}||jkr�tSq�Wx$|jD]}||jkr�tSq�Wt
S(s1Is other a response to self?
@rtype: booli(
RRtQRRR6R7R%R8RtNOERRORR+R:R(R.RBRC((s1/usr/lib64/python2.7/site-packages/dns/message.pytis_responses"cCs\||jkrdS||jkr&dS||jkr9dS||jkrLdStd��dS(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�|
Sq�x0|D]%}
|
j|||||�rb|
SqbWn|s�t�ntjj|||||�}
|j |
�|jdk r�|
|j| <n|
S(sFind the RRset with the given attributes in the specified section.
@param section: the section of the message to look in, e.g.
self.answer.
@type section: list of dns.rrset.RRset objects
@param name: the name of the RRset
@type name: dns.name.Name object
@param rdclass: the class of the RRset
@type rdclass: int
@param rdtype: the type of the RRset
@type rdtype: int
@param covers: the covers value of the RRset
@type covers: int
@param deleting: the deleting value of the RRset
@type deleting: int
@param create: If True, create the RRset if it is not found.
The created RRset is appended to I{section}.
@type create: bool
@param force_unique: If True and create is also True, create a
new RRset regardless of whether a matching RRset exists already.
@type force_unique: bool
@raises KeyError: the RRset was not found and create was False
@rtype: dns.rrset.RRset objectN(
RKR-RtgettmatchtKeyErrorRR@tRRsettappend(R.RJtnametrdclasstrdtypetcoverstdeletingtcreatetforce_uniquetkeyR@((s1/usr/lib64/python2.7/site-packages/dns/message.pyt
find_rrset,s"
c
CsFy(|j||||||||�} Wntk
rAd} nX| S(sGet the RRset with the given attributes in the specified section.
If the RRset is not found, None is returned.
@param section: the section of the message to look in, e.g.
self.answer.
@type section: list of dns.rrset.RRset objects
@param name: the name of the RRset
@type name: dns.name.Name object
@param rdclass: the class of the RRset
@type rdclass: int
@param rdtype: the type of the RRset
@type rdtype: int
@param covers: the covers value of the RRset
@type covers: int
@param deleting: the deleting value of the RRset
@type deleting: int
@param create: If True, create the RRset if it is not found.
The created RRset is appended to I{section}.
@type create: bool
@param force_unique: If True and create is also True, create a
new RRset regardless of whether a matching RRset exists already.
@type force_unique: bool
@rtype: dns.rrset.RRset object or NoneN(RYRNR(
R.RJRQRRRSRTRURVRWR@((s1/usr/lib64/python2.7/site-packages/dns/message.pyt get_rrsetZs
ic Ks�|dkr0|jdkr'|j}q0d}n|dkrEd}n|dkrZd}ntjj|j|j||�}x-|jD]"}|j|j|j |j
�q�Wx*|jD]}|jtjj
||�q�Wx*|jD]}|jtjj||�q�W|jdkr9|j|j|j|j|j�nx*|jD]}|jtjj||�qCW|j�|jdk r�|j|j|j|j|j|j|j|j|j |j!�|j"|_"n|j#�S(s7Return a string containing the message in DNS compressed wire
format.
Additional keyword arguments are passed to the rrset to_wire()
method.
@param origin: The origin to be appended to any relative names.
@type origin: dns.name.Name object
@param max_size: The maximum size of the wire format output; default
is 0, which means 'the message's request payload, if nonzero, or
65536'.
@type max_size: int
@raises dns.exception.TooBig: max_size was exceeded
@rtype: string
ii��iN($RRtrenderertRendererRRRtadd_questionRQRSRRRt add_rrsettANSWERRt AUTHORITYRtadd_ednsRRRRt
ADDITIONALtwrite_headerRRtadd_tsigRR"R#R!R RRR$tget_wire(R.R'tmax_sizeR=trR@((s1/usr/lib64/python2.7/site-packages/dns/message.pytto_wire}s6 ! %
i,R
cCs�||_|dkr.|jj�d|_n3t|ttf�rXtjj |�}n||_||_
||_|dkr�|j|_
n ||_
||_||_dS(swWhen sending, a TSIG signature using the specified keyring
and keyname should be added.
@param keyring: The TSIG keyring to use; defaults to None.
@type keyring: dict
@param keyname: The name of the TSIG key to use; defaults to None.
The key must be defined in the keyring. If a keyring is specified
but a keyname is not, then the key used will be the first key in the
keyring. Note that the order of keys in a dictionary is not defined,
so applications should supply a keyname when a keyring is used, unless
they know the keyring contains only one key.
@type keyname: dns.name.Name or string
@param fudge: TSIG time fudge; default is 300 seconds.
@type fudge: int
@param original_id: TSIG original id; defaults to the message's id
@type original_id: int
@param tsig_error: TSIG error code; default is 0.
@type tsig_error: int
@param other_data: TSIG other data.
@type other_data: string
@param algorithm: The TSIG algorithm to use; defaults to
dns.tsig.default_algorithm
iN(RRtkeysRRAtstrtunicodeRRQt from_textRR"RR#R!R (R.RRR"R#R!R t algorithm((s1/usr/lib64/python2.7/site-packages/dns/message.pytuse_tsig�s icCs�|dks|tkr!d}n|tkr6d}n|dkrK|}n|dkrrd}d}d}g}n-|dM}||d>O}|dkr�g}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
i����il�~iN(RR%R+RRRRR(R.RRRRR((s1/usr/lib64/python2.7/site-packages/dns/message.pytuse_edns�s(
cCsf|r:|jdkr"|j�n|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(RRoRRRtDO(R.twanted((s1/usr/lib64/python2.7/site-packages/dns/message.pytwant_dnssecs
cCstjj|j|j�S(s.Return the rcode.
@rtype: int
(RR8R7RR(R.((s1/usr/lib64/python2.7/site-packages/dns/message.pyR8scCs�tjj|�\}}|jdM_|j|O_|jdM_|j|O_|jdkr~|jdkr~d|_ndS(sPSet the rcode.
@param rcode: the rcode
@type rcode: int
i�l��iN(RR8tto_flagsRRR(R.R8tvaluetevalue((s1/usr/lib64/python2.7/site-packages/dns/message.pyt set_rcodescCstjj|j�S(s/Return the opcode.
@rtype: int
(RR6R7R(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
i��N(RRR6Rs(R.R6((s1/usr/lib64/python2.7/site-packages/dns/message.pyt
set_opcode'sN(RRRRR/R1R3R+R2RDRERHRKRt rdatatypetNONER%RYRZRhRRRnRoRrR8RvR6Rw(((s1/usr/lib64/python2.7/site-packages/dns/message.pyR Cs.J 3
-!. )*
t_WireReadercBs;eZdZeeed�Zd�Zd�Zd�ZRS(s�Wire 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(Rtwiredatat
maybe_wraptwiretmessagetcurrentR%tupdatingt
rdataclasstINtzone_rdclasst
question_onlytone_rr_per_rrsettignore_trailing(R.R}R~R�R�R�((s1/usr/lib64/python2.7/site-packages/dns/message.pyR/Es cCs|jr$|dkr$tjj�nx�td|�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(s�Read 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(R�Rt exceptiont FormErrortxrangeRQt from_wireR}RR~R'RR<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
jdk r�|j
|j
j�}n|j||_tjd|j |j|jd!�\}
}}}
|jd|_|
tjjkr�||j
jk s|rt�n||j
_||j
_|d@d?|j
_g|j
_|j}|
}x�|dkr�tjd|j ||d!�\}}|d}tjj||j ||�}|j
jj|�||}|d|}qfWt}n�|
tjjkr5||j
jko)||dks5t�n|j
jdkrVtd ��n|j
jj| �}|dkr�td
|��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
j0kr�tjj.}d}n9tj1j||
|j |j|
|j
j�}|j2�}|j
j3r:|
tjj4kr:t}n|j
j5||||
||t|�}|dk r�|j6||�n|j|
|_q7WdS(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
i�is!HHiis"got signed message without keyringskey '%s' unknownN(7R�R�R+R%R�RRRQR�R}R~R'RR<R�R�RxtOPTRRRRRRtoption_from_wireRPtTSIGRRRRLRRtget_algorithm_and_macRR$tvalidatetintttimeRR(R*R,R)R�tANYRyR�RtrdataRTR&tSOARYtadd(R.RJtcountRWtseen_optR�trr_startRQR�t
absolute_nameRSRRtttltrdlenRtoptslentotypetolentopttsecretRURTtrdR@((s1/usr/lib64/python2.7/site-packages/dns/message.pyt_get_sectionhs� ! )
cCsHt|j�}|dkr$t�ntjd|jd �\|j_|j_}}}}d|_t j
j|jj�r�t|_
n|j|�|jr�dS|j|jj|�|j|jj|�|j|jj|�|jr|j|krt�n|jjrD|jjrD|jjrD|jjj|j�ndS(sNRead a wire format DNS message and build a dns.message.Message
object.is!HHHHHHN(tlenR}RR�R�R~RRRRR6R:R+R�R�R�R�RRRR�RR*R(R)tupdate(R.tlR�tancounttaucounttadcount((s1/usr/lib64/python2.7/site-packages/dns/message.pytread�s$ 7
(RRRR%R/R�R�R�(((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,R�R�R�tmtreader((s1/usr/lib64/python2.7/site-packages/dns/message.pyR��s(
t_TextReadercBs;eZdZd�Zd�Zd�Zd�Zd�ZRS(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~Rt tokenizert TokenizerttokRt last_nameR�R�R�R%R�(R.ttextR~((s1/usr/lib64/python2.7/site-packages/dns/message.pyR/,s
cCs�|jj�}|j}|dkr<|jj�|j_n:|dkr�x^tr�|jj�}|j�s�|jj|�Pn|jj t
j j|j�B|j_ qKWt
jj
|jj �rvt|_qvn�|dkr|jj�|j_|jj|jjd>B|j_nb|dkr�|jjdkrAd|j_nx2tr�|jj�}|j�sy|jj|�Pn|jjt
j j|j�B|j_qDWn�|dkr�|jj�|j_|jjdkrvd|j_qvn�|dkr6|jj�}|jj t
jjt
jj|��B|j_ n@|d krp|jj�}|jjt
jj|��nt�|jj�d
S(s5Process one line from the text format header section.RRRiteflagsiRR6R8N(R�RLRttget_intR~RR+t
is_identifiertungetRRRlR6R:R�RRtedns_from_textRt
get_stringRsRvR8Rtget_eol(R.RJttokentwhatR�((s1/usr/lib64/python2.7/site-packages/dns/message.pyt_header_line3sR # (c CsS|jjdt�}|j�s?tjj|jd�|_ n|j }|jj�}|j
�srtjj�nyCtj
j|j�}|jj�}|j
�s�tjj�nWn5tjjk
r�tjj�ntj
j}nXtjj|j�}|jj|jj|||dtdt�|jrB||_n|jj�dS(s7Process one line from the text format question section.twant_leadingRVRWN(R�RLR+t
is_whitespaceRRQRlRtRR�R�R�tSyntaxErrorR�R�RxR~RYRR�R�R�(R.RJR�RQRRRS((s1/usr/lib64/python2.7/site-packages/dns/message.pyt_question_lineas. c
Csgd}|jjdt�}|j�sEtjj|jd�|_ n|j }|jj�}|j
�sxtjj�ny@t
|jd�}|jj�}|j
�s�tjj�nWn/tjjk
r�tjj�n
d}nXyytjj|j�}|jj�}|j
�s,tjj�n|tjjksP|tjjkrb|}|j}nWn5tjjk
r�tjj�ntjj}nXtjj|j�}|jj�}|j�s|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.
R�iN(RR�RLR+R�RRQRlRtR�R�R�R�R�R�R�RyR�R�Rxt
is_eol_or_eofR�R�RTR~RYR�R�(R.RJRUR�RQR�RRRSR�RTR@((s1/usr/lib64/python2.7/site-packages/dns/message.pyt_rr_line~sT
$ cCsR|j}d }x<|jjtt�}|j�r7Pn|j�r1|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|jj�qn|jj|�||�qd S(
sNRead a text format DNS message and build a dns.message.Message
object.tHEADERtQUESTIONtZONER_tPREREQR`tUPDATERbN(R�RR�RLR+R�t
is_commentRttupperR�R~RR�RRRR�R�(R.tline_methodRJR�tu((s1/usr/lib64/python2.7/site-packages/dns/message.pyR��s4
(RRRR/R�R�R�R�(((s1/usr/lib64/python2.7/site-packages/dns/message.pyR�s . 5cCs&t�}t||�}|j�|S(s�Convert 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 R�R�(R�R�R�((s1/usr/lib64/python2.7/site-packages/dns/message.pyRl�s
cCs�tjdkrt}d}nt}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_file�s iic
Cs�t|ttf�r*tjj|�}nt|ttf�rTtjj|�}nt|ttf�r~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(RARjRkRRQRlRxR�R RtRDRYRR+RoRr(
R�RSRRRoRrRRRRR�((s1/usr/lib64/python2.7/site-packages/dns/message.pyt
make_querys$
i i,cCs|jtjj@r(tjjd��ntjj|j�}tjj|jtjj@B|_|r{|jtjj O_n|j
|j��t|j
�|_
|jdkr�|jdd||j�n|jr|j|j|j|ddd|j�|j|_n|S(sMake 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(RRRFR�R�R~R RR�tRARwR6tlistRRRoRR)RnRRRRR$R(tquerytrecursion_availabletour_payloadR"tresponse((s1/usr/lib64/python2.7/site-packages/dns/message.pyt
make_response6s
(,RR4trandomR�R�R�tdns.ednsRt
dns.exceptiont dns.flagstdns.namet
dns.opcodetdns.entropyt dns.rcodet dns.rdatatdns.rdataclasst
dns.rdatatypet dns.rrsettdns.renderertdns.tsigtdns.wiredataR�R�RRtDNSExceptionRRRRtobjectR RzRR%R+R�R�RlR�R�R�R�R�(((s1/usr/lib64/python2.7/site-packages/dns/message.pyt<module>sP��� 5� 0 |