o
    2c?                     @   s&  d Z ddlZzddlZW n ey   ddlZY nw 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ZG dd deZejjG d	d
 d
eZG dd dejjZejjG dd deZG dd dejjZG dd dejjZdS )zDNS Versioned Zones.    Nc                   @   s   e Zd ZdZdS )UseTransactionz-To alter a versioned zone, use a transaction.N)__name__
__module____qualname____doc__ r   r   C/var/www/html/gps/gps/lib/python3.10/site-packages/dns/versioned.pyr      s    r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )Versionc                 C   s   || _ || _i | _d S N)zoneidnodes)selfr   r   r   r   r   __init__   s   
zVersion.__init__c                 C   s6   |  r|| jjstd| jjr|| j}|S )Nz*name is not a subdomain of the zone origin)is_absoluteis_subdomainr   originKeyError
relativizer   namer   r   r   _validate_name!   s   zVersion._validate_namec                 C   s   |  |}| j|S r
   )r   r   getr   r   r   r   get_node)   s   
zVersion.get_nodec                 C   s(   |  |}|d u rd S || jj||S r
   )r   get_rdatasetr   rdclassr   r   rdtypecoversnoder   r   r   r   -   s   
zVersion.get_rdatasetc                 C   s
   | j  S r
   )r   itemsr   r   r   r   r    3   s   
zVersion.itemsN)r   r   r   r   r   r   r   r    r   r   r   r   r	      s    r	   c                       s>   e Zd Zd fdd	Zdd Zdd Zdd	 Zd
d Z  ZS )WritableVersionFc                    sX   t |jdkr|jd jd }nd}t || |s"| j|j |j| _t | _	d S )Nr      )
len	_versionsr   superr   r   updater   setchanged)r   r   replacementr   	__class__r   r   r   8   s   zWritableVersion.__init__c                 C   sp   |  |}| j|}|d u s|j| jkr6| j }| j|_|d ur)|j|j || j|< | j	| |S |S r
   )
r   r   r   r   r   node_factory	rdatasetsextendr*   add)r   r   r   new_noder   r   r   
_maybe_cowJ   s   


zWritableVersion._maybe_cowc                 C   s0   |  |}|| jv r| j|= | j| d S d S r
   )r   r   r*   r1   r   r   r   r   delete_nodeY   s
   

zWritableVersion.delete_nodec                 C   s   |  |}|| d S r
   )r3   replace_rdataset)r   r   rdatasetr   r   r   r   put_rdataset_   s   
zWritableVersion.put_rdatasetc                 C   s8   |  |}|| jj|| t|dkr| j|= d S d S Nr   )r3   delete_rdatasetr   r   r%   r   r   r   r   r   r9   c   s
   
zWritableVersion.delete_rdatasetF)	r   r   r   r   r3   r4   r7   r9   __classcell__r   r   r,   r   r"   7   s    r"   c                       s   e Zd Z fddZ  ZS )ImmutableVersionc                    sX   t  |jd |j| _|jD ]}|j|}|r t||j|< qtj	
|jd| _d S NT)r'   r   r   r   r*   r   r   ImmutableNodedns	immutableDict)r   versionr   r   r,   r   r   r   l   s   
zImmutableVersion.__init__)r   r   r   r   r;   r   r   r,   r   r<   j   s    r<   c                       s"   e Zd ZdgZ fddZ  ZS )Noder   c                    s   t    d| _d S r8   )r'   r   r   r!   r,   r   r   r      s   

zNode.__init__)r   r   r   	__slots__r   r;   r   r   r,   r   rC   ~   s    rC   c                       sf   e Zd ZdgZ fddZejjdf fdd	Zejjdf fdd	Z	ejjfd	d
Z
dd Z  ZS )r>   r   c                    s,   t    |j| _tdd |jD | _d S )Nc                 S   s   g | ]}t j|qS r   )r?   r6   ImmutableRdataset).0rdsr   r   r   
<listcomp>   s    z*ImmutableNode.__init__.<locals>.<listcomp>)r'   r   r   tupler/   )r   r   r,   r   r   r      s
   

zImmutableNode.__init__Fc                       |rt dt |||dS Nr@   F)	TypeErrorr'   find_rdatasetr   r   r   r   creater,   r   r   rM         zImmutableNode.find_rdatasetc                    rJ   rK   )rL   r'   r   rN   r,   r   r   r      rP   zImmutableNode.get_rdatasetc                 C      t dNr@   rL   )r   r   r   r   r   r   r   r9         zImmutableNode.delete_rdatasetc                 C   rQ   rR   rS   )r   r+   r   r   r   r5      rT   zImmutableNode.replace_rdataset)r   r   r   rD   r   r?   	rdatatypeNONErM   r   r9   r5   r;   r   r   r,   r   r>      s    r>   c                       s   e Zd Zg dZeZejjddf fdd	Z	d+ddZ
d,d	d
Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd, fdd 	Zd!d" Zejjdf fd#d$	Zejjdf fd%d&	Zejjfd'd(Zd)d* Z  ZS )-Zone)r&   _versions_lock
_write_txn_write_waiters_write_event_pruning_policy_readersTNc                    sp   t  ||| t | _t | _|du r| j| _	n|| _	d| _
d| _t | _t | _| dt| | dS )a  Initialize a versioned zone object.

        *origin* is the origin of the zone.  It may be a ``dns.name.Name``,
        a ``str``, or ``None``.  If ``None``, then the zone's origin will
        be set by the first ``$ORIGIN`` line in a zone file.

        *rdclass*, an ``int``, the zone's rdata class; the default is class IN.

        *relativize*, a ``bool``, determine's whether domain names are
        relativized to the zone's origin.  The default is ``True``.

        *pruning policy*, a function taking a `Version` and returning
        a `bool`, or `None`.  Should the version be pruned?  If `None`,
        the default policy, which retains one version is used.
        N)r'   r   collectionsdequer&   
_threadingLock_version_lock_default_pruning_policyr\   rY   r[   rZ   r)   r]   _commit_version_unlockedr"   )r   r   r   r   pruning_policyr,   r   r   r      s   



zZone.__init__c           	      C   s(  |d ur|d urt d| j{ |d ur0d }t| jD ]}|j|kr&|} nq|d u r/tdnE|d urp| jr<tjj	}n| j
}d }t| jD ] }|j|}|rf|| jtjj}|rf|d j|krf|} nqF|d u rotdn| jd }t| d|}| j| |W  d    S 1 sw   Y  d S )Nz!cannot specify both id and serialzversion not foundr   zserial not foundr#   F)
ValueErrorrb   reversedr&   r   r   r   r?   r   emptyr   r   r   r   r   rU   SOAserialTransactionr]   r1   )	r   r   rj   rB   vonamenrG   txnr   r   r   reader   sD   


$zZone.readerFc                 C   s   d }	 | j - | jd u r"|| jkr"t| || _d | _	 W d    nt }| j| W d    n1 s6w   Y  |  q| j	  | jS r
   )
rb   rY   r[   rk   r`   EventrZ   appendwait_setup_version)r   r+   eventr   r   r   writer   s   '
*zZone.writerc                 C   s,   t | jdkr| j | _| j  d S d S r8   )r%   rZ   popleftr[   r)   r!   r   r   r   !_maybe_wakeup_one_waiter_unlocked  s   z&Zone._maybe_wakeup_one_waiter_unlockedc                 C      dS r=   r   )r   r   rB   r   r   r   rc   !     zZone._default_pruning_policyc                 C   s   t | jdks	J t | jdkrtdd | jD }n| jd j}| jd j|k rJ| | | jd rN| j  | jd j|k rL| | | jd s2d S d S d S d S )Nr   c                 s   s    | ]}|j jV  qd S r
   )rB   r   )rF   ro   r   r   r   	<genexpr>/  s    z0Zone._prune_versions_unlocked.<locals>.<genexpr>r#   )r%   r&   r]   minr   r\   rw   )r   
least_keptr   r   r   _prune_versions_unlocked%  s   
zZone._prune_versions_unlockedc                    sD    dur dk rt d du rdd }n fdd}| | dS )zYSet a pruning policy that retains up to the specified number
        of versions
        Nr$   zmax versions must be at least 1c                  W   ry   )NFr   )_r   r   r   policy=  rz   z%Zone.set_max_versions.<locals>.policyc                    s   t | j kS r
   )r%   r&   )r   r   max_versionsr   r   r   @  s   )rf   set_pruning_policy)r   r   r   r   r   r   set_max_versions6  s   
zZone.set_max_versionsc                 C   sH   |du r| j }| j || _|   W d   dS 1 sw   Y  dS )a  Set the pruning policy for the zone.

        The *policy* function takes a `Version` and returns `True` if
        the version should be pruned, and `False` otherwise.  `None`
        may also be specified for policy, in which case the default policy
        is used.

        Pruning checking proceeds from the least version and the first
        time the function returns `False`, the checking stops.  I.e. the
        retained versions are always a consecutive sequence.
        N)rc   rb   r\   r~   )r   r   r   r   r   r   D  s   
"zZone.set_pruning_policyc                 C   s@   | j  | j| |   W d    d S 1 sw   Y  d S r
   )rb   r]   remover~   r   ro   r   r   r   	_end_readV  s   
"zZone._end_readc                 C   s    | j |ksJ d | _ |   d S r
   )rY   rx   r   r   r   r   _end_write_unlocked[  s   zZone._end_write_unlockedc                 C   s6   | j  | | W d    d S 1 sw   Y  d S r
   )rb   r   r   r   r   r   
_end_write`  s   "zZone._end_writec                 C   sF   | j | |   |j| _| jd u r|| _|d ur!| | d S d S r
   )r&   rr   r~   r   r   r   r   ro   rB   r   r   r   r   rd   d  s   
zZone._commit_version_unlockedc                 C   s:   | j  | ||| W d    d S 1 sw   Y  d S r
   )rb   rd   r   r   r   r   _commit_versionn  s   "zZone._commit_versionc                    s   |rt t |S r
   )r   r'   	find_node)r   r   rO   r,   r   r   r   r  s   zZone.find_nodec                 C      t r
   r   r   r   r   r   r4   w  rz   zZone.delete_nodec                    $   |rt t |||}tj|S r
   )r   r'   rM   r?   r6   rE   r   r   r   r   rO   r6   r,   r   r   rM   z     zZone.find_rdatasetc                    r   r
   )r   r'   r   r?   r6   rE   r   r,   r   r   r     r   zZone.get_rdatasetc                 C   r   r
   r   r   r   r   r   r   r   r   r9     rz   zZone.delete_rdatasetc                 C   r   r
   r   )r   r   r+   r   r   r   r5     rz   zZone.replace_rdataset)NNr:   )r   r   r   rD   rC   r.   r?   
rdataclassINr   rp   rv   rx   rc   r~   r   r   r   r   r   rd   r   r   r4   rU   rV   rM   r   r9   r5   r;   r   r   r,   r   rW      s8    

!/
rW   c                       sz   e Zd Zd fdd	Zedd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Z  ZS )rk   Nc                    s"   |d u}t  ||| || _d S r
   )r'   r   rB   )r   r   r+   rB   	read_onlyr,   r   r   r     s   
zTransaction.__init__c                 C   s   | j S r
   )managerr!   r   r   r   r     s   zTransaction.zonec                 C   s"   | j d u sJ t| j| j| _ d S r
   )rB   r"   r   r+   r!   r   r   r   rt     s   zTransaction._setup_versionc                 C   s   | j |||S r
   )rB   r   r   r   r   r   _get_rdataset     zTransaction._get_rdatasetc                 C   s   | j rJ | j|| d S r
   )r   rB   r7   )r   r   r6   r   r   r   _put_rdataset  s   
zTransaction._put_rdatasetc                 C   s   | j rJ | j| d S r
   )r   rB   r4   r   r   r   r   _delete_name  s   
zTransaction._delete_namec                 C   s   | j rJ | j||| d S r
   )r   rB   r9   r   r   r   r   _delete_rdataset  s   
zTransaction._delete_rdatasetc                 C   s   | j |d uS r
   )rB   r   r   r   r   r   _name_exists  r   zTransaction._name_existsc                 C   s   | j rdS t| jjdkS )NFr   )r   r%   rB   r*   r!   r   r   r   _changed  s   zTransaction._changedc                 C   sX   | j r| j|  d S |r$t| jjdkr$| j| t| j| jj d S | j	|  d S r8   )
r   r   r   r%   rB   r*   r   r<   r   r   )r   commitr   r   r   _end_transaction  s   zTransaction._end_transactionc                 C   s   | j jd u r|| j _d S d S r
   )rB   r   )r   r   r   r   r   _set_origin  s   zTransaction._set_originc                 c   s.    | j  D ]\}}|D ]}||fV  qqd S r
   )rB   r    )r   r   r   r6   r   r   r   _iterate_rdatasets  s   zTransaction._iterate_rdatasetsr
   )r   r   r   r   propertyr   rt   r   r   r   r   r   r   r   r   r   r;   r   r   r,   r   rk     s    

rk   )r   r^   	threadingr`   ImportErrordummy_threadingdns.exceptionr?   dns.immutabledns.namedns.nodedns.rdataclassdns.rdatatype	dns.rdatadns.rdtypes.ANY.SOAdns.transactiondns.zone	exceptionDNSExceptionr   r	   r"   r@   r<   r   rC   r>   r   rW   transactionrk   r   r   r   r   <module>   s8   3	 k