ó w§Qc@s€dZddlZddlZddlZddlZddlZddlZdZdZ dZ dZ de fd„ƒYZ dS( s*Help for building DNS wire format messagesiÿÿÿÿNiiiitRenderercBs‰eZdZd ddd d„Zd„Zd„Zejj d„Z d„Z d„Z d d „Z ejjd „Zd „Zd „ZRS(stHelper class for building DNS wire-format messages. Most applications can use the higher-level L{dns.message.Message} class and its to_wire() method to generate wire-format messages. This class is for those applications which need finer control over the generation of messages. Typical use:: r = dns.renderer.Renderer(id=1, flags=0x80, max_size=512) r.add_question(qname, qtype, qclass) r.add_rrset(dns.renderer.ANSWER, rrset_1) r.add_rrset(dns.renderer.ANSWER, rrset_2) r.add_rrset(dns.renderer.AUTHORITY, ns_rrset) r.add_edns(0, 0, 4096) r.add_rrset(dns.renderer.ADDTIONAL, ad_rrset_1) r.add_rrset(dns.renderer.ADDTIONAL, ad_rrset_2) r.write_header() r.add_tsig(keyname, secret, 300, 1, 0, '', request_mac) wire = r.get_wire() @ivar output: where rendering is written @type output: cStringIO.StringIO object @ivar id: the message id @type id: int @ivar flags: the message flags @type flags: int @ivar max_size: the maximum size of the message @type max_size: int @ivar origin: the origin to use when rendering relative names @type origin: dns.name.Name object @ivar compress: the compression table @type compress: dict @ivar section: the section currently being rendered @type section: int (dns.renderer.QUESTION, dns.renderer.ANSWER, dns.renderer.AUTHORITY, or dns.renderer.ADDITIONAL) @ivar counts: list of the number of RRs in each section @type counts: int list of length 4 @ivar mac: the MAC of the rendered message (if TSIG was used) @type mac: string iiÿÿcCs›tjƒ|_|dkr3tjddƒ|_n ||_||_||_||_ i|_ t |_ ddddg|_ |jjdƒd|_dS(sôInitialize a new renderer. @param id: the message id @type id: int @param flags: the DNS message flags @type flags: int @param max_size: the maximum message size; the default is 65535. If rendering results in a message greater than I{max_size}, then L{dns.exception.TooBig} will be raised. @type max_size: int @param origin: the origin to use when rendering relative names @type origin: dns.name.Namem or None. iiÿÿti tNt (t cStringIOtStringIOtoutputtNonetrandomtrandinttidtflagstmax_sizetorigintcompresstQUESTIONtsectiontcountstwritetmac(tselfR R R R ((s2/usr/lib64/python2.7/site-packages/dns/renderer.pyt__init__Js       cCs~|jj|ƒ|jjƒg}x9|jjƒD](\}}||kr3|j|ƒq3q3Wx|D]}|j|=qfWdS(sÕTruncate the output buffer at offset I{where}, and remove any compression table entries that pointed beyond the truncation point. @param where: the offset @type where: int N(RtseekttruncateRt iteritemstappend(Rtwheretkeys_to_deletetktv((s2/usr/lib64/python2.7/site-packages/dns/renderer.pyt _rollbackgs    cCs=|j|kr9|j|kr-tjj‚n||_ndS(sZSet the renderer's current section. Sections must be rendered order: QUESTION, ANSWER, AUTHORITY, ADDITIONAL. Sections may be empty. @param section: the section @type section: int @raises dns.exception.FormError: an attempt was made to set a section value less than the current section. N(Rtdnst exceptiont FormError(RR((s2/usr/lib64/python2.7/site-packages/dns/renderer.pyt _set_sectionys cCs¨|jtƒ|jjƒ}|j|j|j|jƒ|jjtj d||ƒƒ|jjƒ}||j kr‘|j |ƒt j j‚n|jtcd7O}|jtƒ|jjƒ}|jjtjddtjj ||dƒƒ|d k r¼|jjƒ}xÇ|D]¿}tjd|j dƒ}|jj|ƒ|jjƒ} |j |jƒ|jjƒ} | | dksöt ‚|jj| dƒtjd| | ƒ}|jj|ƒ|jjddƒq„W|jjƒ} | |dkslt ‚|jj|dƒtjd| |ƒ}|jj|ƒ|jjddƒn|jjƒ} | |jkrö|j|ƒtjj‚n|jtcd 7s