o
    i/                     @   s   d Z ddlmZmZ ddlZddlZddlZddlZddl	Zddl
ZddlZddlZddlZddlZddlZG dd dejjZG dd dejjZeZejZejZejZejZdS )zDNS Dynamic Update Support    )AnyListNc                   @   s,   e Zd ZdZdZdZdZdZedd Z	dS )	UpdateSectionzUpdate sectionsr            c                 C      dS )Nr    )clsr	   r	   A/home/app/Keep/.python/lib/python3.10/site-packages/dns/update.py_maximum+      zUpdateSection._maximumN)
__name__
__module____qualname____doc__ZONEPREREQUPDATE
ADDITIONALclassmethodr   r	   r	   r	   r   r   #   s    r   c                       s  e Zd ZeZdejjddejj	dfdej
jeB dB dejjdedB dej
jdB dej
jeB dedB f fdd	Zed
eejj fddZejdd Zed
eejj fddZejdd Zed
eejj fddZejdd Zd)ddZdd Zdej
jeB ded
dfddZdej
jeB ded
dfddZdej
jeB ded
dfddZdej
jeB ded
dfd d!Z	d*dej
jeB d"ejj eB dB d
dfd#d$Z!d%d& Z"d'd( Z#  Z$S )+UpdateMessageNzonerdclasskeyringkeynamekeyalgorithmidc                    s   t  j|d |  jtjtjjO  _t|trtj	
|}|| _tjj|}|| _| jr>| j| j| j|tjjddd |durL| j|||d dS dS )ax  Initialize a new DNS Update object.

        See the documentation of the Message class for a complete
        description of the keyring dictionary.

        *zone*, a ``dns.name.Name``, ``str``, or ``None``, the zone
        which is being updated.  ``None`` should only be used by dnspython's
        message constructors, as a zone is required for the convenience
        methods like ``add()``, ``replace()``, etc.

        *rdclass*, an ``int`` or ``str``, the class of the zone.

        The *keyring*, *keyname*, and *keyalgorithm* parameters are passed to
        ``use_tsig()``; see its documentation for details.
        )r   T)createZforce_uniqueN)	algorithm)super__init__flagsdnsopcodeZto_flagsr   
isinstancestrname	from_textorigin
rdataclass
RdataClassmakezone_rdclass
find_rrsetr   	rdatatypeSOAZuse_tsig)selfr   r   r   r   r   r   	__class__r	   r   r!   4   s&   
zUpdateMessage.__init__returnc                 C   
   | j d S )zThe zone section.r   sectionsr1   r	   r	   r   r   _      
zUpdateMessage.zonec                 C      || j d< d S )Nr   r6   r1   vr	   r	   r   r   d      c                 C   r5   )zThe prerequisite section.r   r6   r8   r	   r	   r   prerequisiteh   r9   zUpdateMessage.prerequisitec                 C   r:   )Nr   r6   r;   r	   r	   r   r>   m   r=   c                 C   r5   )zThe update section.r   r6   r8   r	   r	   r   updateq   r9   zUpdateMessage.updatec                 C   r:   )Nr   r6   r;   r	   r	   r   r?   v   r=   c              
   C   sB   |du r| j }| }| ||| j|j||dd}||| dS )z&Add a single RR to the update section.NT)r?   coversr.   r-   rdtypeadd)r1   r'   ttlrddeletingsectionr@   rrsetr	   r	   r   _add_rrz   s   zUpdateMessage._add_rrc           
      G   s   t |trtj|d}t |d tjjr4|D ]}|r"| ||j |D ]}| j	||j
||d q$qdS t|}t|d}t |d tjjrc|rS| ||d j |D ]}| j	||||d qUdS tjj|d}|ru| || |D ]}	tj| j||	| j}| j	||||d qwdS )a  Add records.

        *replace* is the replacement mode.  If ``False``,
        RRs are added to an existing RRset; if ``True``, the RRset
        is replaced with the specified contents.  The second
        argument is the section to add to.  The third argument
        is always a name.  The other arguments can be:

                - rdataset...

                - ttl, rdata...

                - ttl, rdtype, string...
        Nr   )rF   )r%   r&   r#   r'   r(   rdatasetRdatasetdeleterA   rH   rC   listintpoprdataRdatar/   	RdataTyper,   r-   r)   )
r1   replacerF   r'   argsrdsrD   rC   rA   sr	   r	   r   _add   s2   
zUpdateMessage._addr'   rS   c                 G      | j d| j|g|R   dS )zAdd records.

        The first argument is always a name.  The other
        arguments can be:

                - rdataset...

                - ttl, rdata...

                - ttl, rdtype, string...
        FNrV   r?   r1   r'   rS   r	   r	   r   rB      s   zUpdateMessage.addc              
   G   sL  t |trtj|d}t|dkr)| | j|tjj	tj
j	tj
jtjj	dd dS t |d tjjrH|D ]}|D ]}| |d|tjj q8q4dS t|}t |d tjjrf|D ]}| |d|tjj qWdS tj
j|d}t|dkr| | j|| j|tj
jtjj	dd dS |D ]}tj| j||| j}| |d|tjj qdS )zDelete records.

        The first argument is always a name.  The other
        arguments can be:

                - *empty*

                - rdataset...

                - rdata...

                - rdtype, [string...]
        Nr   T)r%   r&   r#   r'   r(   lenr.   r?   r*   ANYr/   NONErI   rJ   rH   rL   rO   rP   rQ   r,   rN   r-   r)   )r1   r'   rS   rT   rD   largsrA   rU   r	   r	   r   rK      sZ   

zUpdateMessage.deletec                 G   rW   )ab  Replace records.

        The first argument is always a name.  The other
        arguments can be:

                - rdataset...

                - ttl, rdata...

                - ttl, rdtype, string...

        Note that if you want to replace the entire node, you should do
        a delete of the name followed by one or more calls to add.
        TNrX   rY   r	   r	   r   rR      s   zUpdateMessage.replacec              
   G   s  t |trtj|d}t|dkr'| | j|tjj	tj
j	tj
jddd dS t |d tjjs?t |d tjjs?t|dkrnt |d tjjs`t|}|dd | jd| j|g|R   dS | jd| j|g|R   dS tj
j|d }| | j|tjj	|tj
jddd dS )aS  Require that an owner name (and optionally an rdata type,
        or specific rdataset) exists as a prerequisite to the
        execution of the update.

        The first argument is always a name.
        The other arguments can be:

                - rdataset...

                - rdata...

                - rdtype, string...
        Nr   Tr   F)r%   r&   r#   r'   r(   rZ   r.   r>   r*   r[   r/   r\   rI   rJ   rO   rP   rL   insertrV   rQ   r,   )r1   r'   rS   r]   rA   r	   r	   r   present
  sD   
zUpdateMessage.presentrA   c              
   C   s~   t |trtj|d}|du r%| | j|tjjtj	j
tj	jddd dS tj	j|}| | j|tjj|tj	jddd dS )zRequire that an owner name (and optionally an rdata type) does
        not exist as a prerequisite to the execution of the update.NT)r%   r&   r#   r'   r(   r.   r>   r*   r\   r/   r[   rQ   r,   )r1   r'   rA   r	   r	   r   absent?  s0   
zUpdateMessage.absentc                 C   r   )NTr	   )r1   valuer	   r	   r   _get_one_rr_per_rrseta  r   z#UpdateMessage._get_one_rr_per_rrsetc                 C   s   d }d}|t jkrtj|s|tjjks| jrtjj	n$| js$tjj	|tjj
tjjfv rA|}| jd j}|tjj
kp@|t jk}||||fS )NFr   )r   r   r#   r*   Zis_metaclassr/   r0   r   	exceptionZ	FormErrorr[   r\   r   r   )r1   rF   r'   r   rA   rE   emptyr	   r	   r   _parse_rr_headere  s$   

zUpdateMessage._parse_rr_header)NN)N)%r   r   r   r   Z_section_enumr#   r*   INZtsigZdefault_algorithmr'   Namer&   r+   r   rM   r!   propertyr   rG   ZRRsetr   setterr>   r?   rH   rV   rB   rK   rR   r_   r/   rQ   r`   rb   re   __classcell__r	   r	   r2   r   r   0   sb    

+



(<8

"r   )r   typingr   r   Zdns.enumr#   Zdns.exceptionZdns.messageZdns.nameZ
dns.opcodeZ	dns.rdataZdns.rdataclassZdns.rdatasetZdns.rdatatypeZ	dns.rrsetZdns.tsigenumIntEnumr   messageMessager   ZUpdater   r   r   r   r	   r	   r	   r   <module>   s,     N
