o
    ßý°j!:  ã                   @   sÒ   d Z ddlmZmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
mZmZmZmZmZ dd	lmZmZmZ dd
lmZ ddlmZmZmZmZmZ e
eegZG dd„ deƒZG dd„ deƒZG dd„ deƒZ dS )Ú
é    )ÚdatetimeÚMINYEAR)Úlinesep)Úrandint)Úsleepé   )ÚFIRSTÚROUND_ROBINÚRANDOMÚSEQUENCE_TYPESÚSTRING_TYPESÚget_config_parameteré   )ÚLDAPUnknownStrategyErrorÚLDAPServerPoolErrorÚLDAPServerPoolExhaustedError)ÚServer)ÚlogÚlog_enabledÚERRORÚBASICÚNETWORKc                   @   s   e Zd Zdd„ ZdS )ÚServerStatec                 C   s   || _ || _|| _d S ©N)ÚserverÚlast_checked_timeÚ	available)Úselfr   r   r   © r   ú…/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/ldap3/core/pooling.pyÚ__init__(   s   
zServerState.__init__N)Ú__name__Ú
__module__Ú__qualname__r!   r   r   r   r    r   '   s    r   c                   @   sL   e Z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S )ÚServerPoolStatec                 C   sH   g | _ |j| _|| _d| _|  ¡  t ¡ | _tt	ƒr"t
t	d| ƒ d S d S )Nr   z"instantiated ServerPoolState: <%r>)Úserver_statesÚstrategyÚserver_poolÚlast_used_serverÚrefreshr   ÚnowÚinitialize_timer   r   r   )r   r(   r   r   r    r!   /   s   
ÿzServerPoolState.__init__c                 C   s|   dt  }| jr| jD ]}|t|jƒt  7 }q
n|dt  7 }|dt| jƒ t  7 }|d| jdkr1dnt| j| j jƒ 7 }|S )Nú	servers: ÚNoneúPool strategy: z - Last used server: éÿÿÿÿ)r   r&   Ústrr   r'   r)   )r   ÚsÚstater   r   r    Ú__str__:   s   
ÿ(zServerPoolState.__str__c              	   C   sJ   g | _ | jjD ]}| j  t|ttddƒdƒ¡ qtdt| j ƒd ƒ| _	d S )Nr   Tr   )
r&   r(   ÚserversÚappendr   r   r   r   Úlenr)   )r   r   r   r   r    r*   F   s   zServerPoolState.refreshc                 C   s   | j | j jS r   )r&   r)   r   ©r   r   r   r    Úget_current_serverL   s   z"ServerPoolState.get_current_serverc                 C   s  | j r~| jjtkr| jjr| jdd�| _nWd| _nS| jjtkr@| jjr-|  | jd ¡| _n?| jd t| j ƒk r<| jd nd| _n,| jjt	kr\| jjrP|  
¡ | _ntdt| j ƒd ƒ| _nttƒrhttd| jjƒ tdƒ‚ttƒrwttd| jƒ | j | j jS ttƒrˆttd| ƒ tdƒ‚)	Nr   )Ústartingr   z$unknown server pooling strategy <%s>zunknown server pooling strategyz&server returned from Server Pool: <%s>zno servers in Server Pool <%s>zno servers in server pool)r&   r(   r'   r	   ÚactiveÚfind_active_serverr)   r
   r7   r   Úfind_active_random_serverr   r   r   r   r   r   r   r   r8   r   r   r    Ú
get_serverO   s,   &zServerPoolState.get_serverc                 C   s(  | j j}|r†ttƒrttd| ƒ | jd d … }|ry| tdt|ƒd ƒ¡}|j	sVt
| j jtƒr3| j js?t ¡ |j j| j jk rKttƒrJttd|jƒ qttƒrVttd|jƒ t ¡ |_ttƒrfttd|jƒ |j ¡ rtd|_	| j |¡S d|_	|st
| j jtƒs„|d8 }|sttƒr�ttd	| ƒ td
ƒ‚)Nz4entering loop for finding active server in pool <%s>r   r   z8server <%s> excluded from checking because it is offlineúserver <%s> reinserted in poolú%checking server <%s> for availabilityTFzSno random active server available in Server Pool <%s> after maximum number of trieszNno random active server available in server pool after maximum number of tries)r(   r;   r   r   r   r&   Úpopr   r7   r   Ú
isinstanceÚexhaustÚboolr   r+   r   Úsecondsr   Úcheck_availabilityÚindexr   r   )r   ÚcounterÚ	temp_listÚserver_stater   r   r    r=   q   s8   .

íçz)ServerPoolState.find_active_random_serverc                 C   s¶  t dƒ}| jj}|t| jƒkrd}|rÍttƒrttd|| ƒ d}t| jƒ}||d k r²|d7 }|| |k r9|| n|| | }| j| }|js�t	| jj
tƒrR| jj
s^t ¡ |j j| jj
k r„ttƒrƒt	| jj
tƒrqttd|jƒ nttd|j| jj
t ¡ |j j ƒ q%ttƒr�ttd|jƒ t ¡ |_ttƒrŸttd	|jƒ |j ¡ r©d
|_|S d|_||d k s+t	| jjtƒs½|d8 }ttƒrÇttd|ƒ t|ƒ |sttƒr×ttd| ƒ tdƒ‚)NÚPOOLING_LOOP_TIMEOUTr   z@entering loop number <%s> for finding active server in pool <%s>r0   r   z5server <%s> excluded from checking because is offlinezDserver <%s> excluded from checking because is offline for %d secondsr?   r@   TFz9waiting for %d seconds before retrying pool servers cyclezLno active server available in Server Pool <%s> after maximum number of trieszGno active server available in server pool after maximum number of tries)r   r(   r;   r7   r&   r   r   r   r   rB   rC   rD   r   r+   r   rE   r   rF   r   r   r   )r   r:   Úconf_pool_timeoutrH   rG   Ú	pool_sizeÚoffsetrJ   r   r   r    r<   ‘   sN   
 
.$

ëà"z"ServerPoolState.find_active_serverc                 C   ó
   t | jƒS r   )r7   r&   r8   r   r   r    Ú__len__½   ó   
zServerPoolState.__len__N)r"   r#   r$   r!   r4   r*   r9   r>   r=   r<   rP   r   r   r   r    r%   .   s    " ,r%   c                   @   sp   e Zd Zdedddf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S )Ú
ServerPoolNTFc                 C   sÂ   |t vrttƒrttd|ƒ tdƒ‚|r#|s#ttƒrttdƒ tdƒ‚g | _tƒ | _|| _	|| _
|| _d | _t|ttf ƒrD|  |¡ nt|tƒrP|  t|ƒ¡ || _ttƒr_ttd| ƒ d S d S )Nzunknown pooling strategy <%s>zunknown pooling strategyz3cannot instantiate pool with exhaust and not activez<pools can be exhausted only when checking for active serverszinstantiated ServerPool: <%r>)ÚPOOLING_STRATEGIESr   r   r   r   r   r5   ÚdictÚpool_statesr;   rC   ÚsingleÚ_pool_staterB   r   r   Úaddr   r'   r   )r   r5   Úpool_strategyr;   rC   Úsingle_stater   r   r    r!   Â   s,   

ÿzServerPool.__init__c                 C   s†   dt  }| jr| jD ]
}|t|ƒt  7 }q
n|dt  7 }|dt| jƒ 7 }|d| jr/t| jƒnd 7 }|d| jr=t| jƒnd 7 }|S )Nr-   r.   r/   z - active: ÚFalsez - exhaust pool: )r   r5   r1   r'   r;   rC   )r   r2   r   r   r   r    r4   à   s   
ÿzServerPool.__str__c                 C   s~   d}| j r |d7 }| j D ]
}|| ¡ d 7 }q|d d… d }n|d7 }|d | ¡7 }|d | ¡7 }|d	 | ¡7 }|d
7 }|S )NzServerPool(servers=ú[z, éþÿÿÿú]r.   z, pool_strategy={0.strategy!r}z, active={0.active!r}z, exhaust={0.exhaust!r}ú))r5   Ú__repr__Úformat)r   Úrr   r   r   r    r`   ì   s   
zServerPool.__repr__c                 C   rO   r   )r7   r5   r8   r   r   r    rP   ü   rQ   zServerPool.__len__c                 C   s
   | j | S r   )r5   )r   Úitemr   r   r    Ú__getitem__ÿ   rQ   zServerPool.__getitem__c                 C   s
   | j  ¡ S r   )r5   Ú__iter__r8   r   r   r    re     rQ   zServerPool.__iter__c                 C   sú   t |tƒr|| jvr| j |¡ nNt |tƒr| j t|ƒ¡ n@t |tƒrQ|D ])}t |tƒr4| j |¡ q&t |tƒrB| j t|ƒ¡ q&ttƒrLttd| ƒ t	dƒ‚nttƒr[ttd| ƒ t	dƒ‚| j
rn| jrl| j ¡  d S d S | jD ]	}| j|  ¡  qqd S )Nz,element must be a server in Server Pool <%s>z%server in ServerPool must be a ServerzLserver must be a Server of a list of Servers when adding to Server Pool <%s>z+server must be a Server or a list of Server)rB   r   r5   r6   r   r   r   r   r   r   rV   rW   r*   rU   )r   r5   r   Ú
connectionr   r   r    rX     s4   

€



ø
ÿ
þzServerPool.addc                 C   sr   || j v r| j  |¡ nttƒrttd|| ƒ tdƒ‚| jr*| jr(| j ¡  d S d S | j	D ]	}| j	|  ¡  q-d S )Nz/server %s to be removed not in Server Pool <%s>zserver not in server pool)
r5   Úremover   r   r   r   rV   rW   r*   rU   )r   r   rf   r   r   r    rg   "  s   
ÿ
þzServerPool.removec                 C   s8   | j r| jst| ƒ| _| j| j|< d S t| ƒ| j|< d S r   )rV   rW   r%   rU   ©r   rf   r   r   r    Ú
initialize2  s
   
zServerPool.initializec                 C   ó6   || j v r| j |  ¡ S ttƒrttd|| ƒ tdƒ‚©Nz-connection <%s> not in Server Pool State <%s>z!connection not in ServerPoolState)rU   r>   r   r   r   r   rh   r   r   r    r>   ;  ó
   
zServerPool.get_serverc                 C   rj   rk   )rU   r9   r   r   r   r   rh   r   r   r    r9   C  rl   zServerPool.get_current_server)r"   r#   r$   r
   r!   r4   r`   rP   rd   re   rX   rg   ri   r>   r9   r   r   r   r    rR   Á   s"    
û	rR   N)!Ú__doc__r   r   Úosr   Úrandomr   Útimer   Ú r	   r
   r   r   r   r   Ú
exceptionsr   r   r   r   r   Ú	utils.logr   r   r   r   r   rS   Úobjectr   r%   rR   r   r   r   r    Ú<module>   s     
 