3 ¢báW¨ã@s<dZddlmZddlZddlZddlZGdd„deƒZdS)z)DNS nodes. A node is a set of rdatasets.é)ÚStringIONc@sŠeZdZdZdgZdd„Zdd„Zdd„Zd d „Zd d „Z d d„Z dd„Z e j jdfdd„Ze j jdfdd„Ze j jfdd„Zdd„ZdS)ÚNodez“A DNS node. A node is a set of rdatasets @ivar rdatasets: the node's rdatasets @type rdatasets: list of dns.rdataset.Rdataset objectsÚ rdatasetscCs g|_dS)zInitialize a DNS node. N)r)Úself©rú/usr/lib/python3.6/node.pyÚ__init__$sz Node.__init__cKsPtƒ}x8|jD].}t|ƒdkr|j|j|f|Žƒ|jdƒqW|jƒdd…S)a+Convert a node to text format. Each rdataset at the node is printed. Any keyword arguments to this method are passed on to the rdataset's to_text() method. @param name: the owner name of the rdatasets @type name: dns.name.Name object @rtype: string rÚ Nééÿÿÿÿ)rrÚlenÚwriteÚto_textÚgetvalue)rÚnameÚkwÚsÚrdsrrrr*s   z Node.to_textcCsdtt|ƒƒdS)Nz )ÚstrÚid)rrrrÚ__repr__;sz Node.__repr__cCs@x|jD]}||jkrdSqWx|jD]}||jkr&dSq&WdS)zSTwo nodes are equal if they have the same rdatasets. @rtype: bool FT)r)rÚotherZrdrrrÚ__eq__>s    z Node.__eq__cCs |j|ƒ S)N)r)rrrrrÚ__ne__Nsz Node.__ne__cCs t|jƒS)N)r r)rrrrÚ__len__Qsz Node.__len__cCs t|jƒS)N)Úiterr)rrrrÚ__iter__Tsz Node.__iter__FcCsHx |jD]}|j|||ƒr|SqW|s*t‚tjj||ƒ}|jj|ƒ|S)aFind an rdataset matching the specified properties in the current node. @param rdclass: The class of the rdataset @type rdclass: int @param rdtype: The type of the rdataset @type rdtype: int @param covers: The covered type. Usually this value is dns.rdatatype.NONE, but if the rdtype is dns.rdatatype.SIG or dns.rdatatype.RRSIG, then the covers value will be the rdata type the SIG/RRSIG covers. The library treats the SIG and RRSIG types as if they were a family of types, e.g. RRSIG(A), RRSIG(NS), RRSIG(SOA). This makes RRSIGs much easier to work with than if RRSIGs covering different rdata types were aggregated into a single RRSIG rdataset. @type covers: int @param create: If True, create the rdataset if it is not found. @type create: bool @raises KeyError: An rdataset of the desired type and class does not exist and I{create} is not True. @rtype: dns.rdataset.Rdataset object )rÚmatchÚKeyErrorÚdnsÚrdatasetÚRdatasetÚappend)rÚrdclassÚrdtypeÚcoversÚcreaterrrrÚ find_rdatasetWs  zNode.find_rdatasetc Cs2y|j||||ƒ}Wntk r,d}YnX|S)aEGet an rdataset matching the specified properties in the current node. None is returned if an rdataset of the specified type and class does not exist and I{create} is not True. @param rdclass: The class of the rdataset @type rdclass: int @param rdtype: The type of the rdataset @type rdtype: int @param covers: The covered type. @type covers: int @param create: If True, create the rdataset if it is not found. @type create: bool @rtype: dns.rdataset.Rdataset object or None N)r(r)rr$r%r&r'rrrrÚ get_rdatasetys  zNode.get_rdatasetcCs&|j|||ƒ}|dk r"|jj|ƒdS)azDelete the rdataset matching the specified properties in the current node. If a matching rdataset does not exist, it is not an error. @param rdclass: The class of the rdataset @type rdclass: int @param rdtype: The type of the rdataset @type rdtype: int @param covers: The covered type. @type covers: int N)r)rÚremove)rr$r%r&rrrrÚdelete_rdataset’szNode.delete_rdatasetcCs:t|tjjƒstdƒ‚|j|j|j|jƒ|j j |ƒdS)a8Replace an rdataset. It is not an error if there is no rdataset matching I{replacement}. Ownership of the I{replacement} object is transferred to the node; in other words, this method does not store a copy of I{replacement} at the node, it stores I{replacement} itself. zreplacement is not an rdatasetN) Ú isinstancer r!r"Ú ValueErrorr+r$r%r&rr#)rZ replacementrrrÚreplace_rdataset¤s  zNode.replace_rdatasetN)Ú__name__Ú __module__Ú __qualname__Ú__doc__Ú __slots__rrrrrrrr Z rdatatypeZNONEr(r)r+r.rrrrrs ! r) r2ÚiorZ dns.rdatasetr Z dns.rdatatypeZ dns.rendererÚobjectrrrrrÚs