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rt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}|rt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rt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}|rttrttd||  d}t| j}||d k r|d7 }|| |k r9|| n|| | }| j| }|jst	| jj
trR| jj
s^t |j j| jj
k rttrt	| jj
trqttd|j nttd|j| jj
t |j j  q%ttrttd|j t |_ttrttd	|j |j rd
|_|S d|_||d k s+t	| jjts|d8 }ttrttd| t| |sttrt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     
 