a
    W×a)@  ã                   @   sÄ   d dl mZ d dlZd dlZd dlZd dlZd dlmZmZ d dl	m
Z
mZ d dlmZ d dlmZ d dlmZmZ d dlmZ d d	lmZmZ d d
lmZ d dlmZ dZdZG dd„ deƒZdS )é    )Úprint_functionN)ÚTestCaseÚdelete_force)ÚechoÚnetlogon)Ú	Messaging)ÚSamDB)ÚCredentialsÚDONT_USE_KERBEROS)Ú
get_string)ÚUF_WORKSTATION_TRUST_ACCOUNTÚUF_PASSWD_NOTREQD)ÚSEC_CHAN_WKSTA)Úsystem_sessioné   ZPFRSc                       s°   e Zd Z‡ fdd„Z‡ 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d„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Z‡  ZS )'ÚPreforkProcessRestartTestsc                    s&   t t| ƒ ¡  |  ¡ }t|d| _d S )N)Úlp_ctx)Úsuperr   ÚsetUpÚget_loadparmr   Úmsg_ctx)Úselfr   ©Ú	__class__© ú=/usr/lib/python3/dist-packages/samba/tests/prefork_restart.pyr   1   s    z PreforkProcessRestartTests.setUpc                    s   t t| ƒ ¡  d S ©N)r   r   ÚtearDown)r   r   r   r   r   6   s    z#PreforkProcessRestartTests.tearDownc                 C   s:   | j  ¡ }g }|D ]"}|jD ]}| |j|jf¡ qq|S r   )r   Zirpc_all_serversZidsÚappendÚnameÚpid)r   ZservicesÚ	processesZserviceÚidr   r   r   Úget_process_data9   s    

z+PreforkProcessRestartTests.get_process_datac                 C   s*   |   ¡ }|D ]\}}||kr|  S qd S r   )r#   )r   r   r!   Zpnamer    r   r   r   Úget_processB   s
    
z&PreforkProcessRestartTests.get_processc                 C   s@   g }t |ƒD ].}d ||¡}| |  |¡¡ |  || ¡ q|S )Núprefork-worker-{0}-{1})ÚrangeÚformatr   r$   ÚassertIsNotNone)r   r   ÚworkersZpidsÚxÚprocess_namer   r   r   Úget_worker_pidsI   s    z*PreforkProcessRestartTests.get_worker_pidsc                 C   s<   t |ƒ}t|ƒD ]&}d ||¡}|  ||| ddd¡ qd S )Nr%   r   é   é   )Úlenr&   r'   Úwait_for_process)r   r   r)   Znum_workersr*   r+   r   r   r   Úwait_for_workersQ   s    z+PreforkProcessRestartTests.wait_for_workersc                 C   s^   t  |¡ |}||k rH|  |¡}|d ur4||kr4d S t  |¡ ||7 }q|  d ||¡¡ d S )Nz6Times out after {0} seconds waiting for {1} to restart)ÚtimeÚsleepr$   Úfailr'   )r   r   r    Zinitial_delayÚwaitZtimeoutZdelayÚpr   r   r   r0   W   s    



ÿz+PreforkProcessRestartTests.wait_for_processc              	   C   sh   |   ¡ }i }|D ]R\}}| d¡s6| d¡s6| d¡r||v r||| kr|  d |||| ¡¡ qd S )Nzprefork-Z_serverZsrvz+Duplicate process for {0}, pids {1} and {2})r#   Ú
startswithÚendswithr4   r'   )r   r!   Zprocess_mapr   r6   r   r   r   Úcheck_for_duplicate_processesd   s    
ÿþ
ÿÿz8PreforkProcessRestartTests.check_for_duplicate_processesc                 C   sL   | j |  ¡ d}| d| ¡ | ¡ f ¡ tdtjd  |  ¡ |d| _	d S )N)Útemplatez%s\%sz
ldaps://%sÚSERVER)ÚurlÚlpÚcredentials)
Zinsta_credsÚget_credentialsZset_bind_dnZ
get_domainZget_usernamer   ÚosÚenvironr   Zsamdb)r   Zcredsr   r   r   Úsimple_bindr   s    ÿþz&PreforkProcessRestartTests.simple_bindc                 C   s.   t  d|  ¡ ¡}|  g d¢| g d¢¡¡ d S )Nzncalrpc:)r-   é   é   )r   Zrpcechor   ÚassertEqualZEchoData)r   Zconnr   r   r   Úrpc_echo{   s    z#PreforkProcessRestartTests.rpc_echoc                 C   s  t jd }t jd }|  ¡ }|  ¡ }tƒ }td| |||d}t dd¡}t}d|| 	¡ f }	t
||	ƒ dt|ƒ  d¡}
| |	d	d
| tttB ƒ|
dœ¡ tƒ }| |¡ | t¡ | t¡ | |¡ | |d ¡ | |¡ t d| ||¡ t
||	ƒ d S )Nr;   Z	SERVER_IPz	ldap://%s)r<   Zsession_infor>   r=   é    zcn=%s,%sz"%s"z	utf-16-leZcomputerz%s$)ZdnZobjectclassZsAMAccountNameZuserAccountControlZ
unicodePwdú$zncacn_ip_tcp:%s[schannel,seal])r@   rA   r   r?   r   r   ÚsambaZgenerate_random_passwordÚMACHINE_NAMEZ	domain_dnr   r   ÚencodeÚaddÚstrr   r   r	   ZguessZset_secure_channel_typer   Zset_kerberos_stater
   Zset_passwordZset_usernameZset_workstationr   )r   ZserverZhostr=   r>   ZsessionZldbZmachine_passZmachine_nameZ
machine_dnZutf16pwZmachine_credsr   r   r   r      sF    

ý

ú




ýz#PreforkProcessRestartTests.netlogonc                 C   s¶   |   ¡  |  d¡}|  |¡ |  dt¡}t |tj¡ |  	d|ddd¡ |  
d|¡ |  d¡}|  |¡ |  ||¡ |  dt¡}ttƒD ]}|  || || ¡ qˆ|  ¡  |   ¡  d S )Núprefork-master-ldapÚldapr-   r.   )rB   r$   r(   r,   ÚNUM_WORKERSr@   ÚkillÚsignalÚSIGTERMr0   r1   ÚassertNotEqualsr&   r9   ©r   r    r)   Únew_pidÚnew_workersr*   r   r   r   Útest_ldap_master_restart©   s    



z3PreforkProcessRestartTests.test_ldap_master_restartc                 C   sÜ   |   ¡  |  d¡}|  |¡ |  dt¡}t |d tj¡ |  	d|ddd¡ |  d¡}|  |¡ |  
||¡ |  dt¡}|  |d |d ¡ |  
|d |d ¡ |  
|d |d ¡ |  
|d |d ¡ |  ¡  |   ¡  d S )	NrN   rO   r   zprefork-worker-ldap-0r-   r.   rC   rD   )rB   r$   r(   r,   rP   r@   rQ   rR   rS   r0   rE   rT   r9   ©r   r    r)   rV   rW   r   r   r   Útest_ldap_worker_restartÐ   s     



z3PreforkProcessRestartTests.test_ldap_worker_restartc                 C   s®   |   ¡  |  d¡}|  |¡ |  dt¡}|D ]}t |tj¡ q,|  	d|¡ |  d¡}|  |¡ |  
||¡ |  dt¡}ttƒD ]}|  || || ¡ q€|  ¡  |   ¡  d S )NrN   rO   )rB   r$   r(   r,   rP   r@   rQ   rR   rS   r1   rE   r&   rT   r9   ©r   r    r)   r*   rV   rW   r   r   r   Útest_ldap_all_workers_restartú   s    



z8PreforkProcessRestartTests.test_ldap_all_workers_restartc                 C   s¶   |   ¡  |  d¡}|  |¡ |  dt¡}t |tj¡ |  	d|ddd¡ |  
d|¡ |  d¡}|  |¡ |  ||¡ |  dt¡}ttƒD ]}|  || || ¡ qˆ|  ¡  |   ¡  d S )Núprefork-master-rpcÚrpcr-   r.   )rF   r$   r(   r,   rP   r@   rQ   rR   rS   r0   r1   rT   r&   r9   rU   r   r   r   Útest_rpc_master_restart  s    



z2PreforkProcessRestartTests.test_rpc_master_restartc                 C   sð   |   ¡  |  ¡  |  d¡}|  |¡ |  dt¡}t |d tj	¡ |  
d|d ddd¡ |  d¡}|  |¡ |  ||¡ |  dt¡}|  |d |d ¡ |  |d |d ¡ |  |d |d ¡ |  |d |d ¡ |  ¡  |   ¡  |  ¡  d S )	Nr]   r^   r   zprefork-worker-rpc-0r-   r.   rC   rD   )rF   r   r$   r(   r,   rP   r@   rQ   rR   rS   r0   rE   rT   r9   rY   r   r   r   Útest_rpc_worker_zero_restartD  s$    



z7PreforkProcessRestartTests.test_rpc_worker_zero_restartc                 C   sÜ   |   ¡  |  ¡  |  d¡}|  |¡ |  dt¡}|D ]}t |tj	¡ q4t
tƒD ] }|  d |¡|| ddd¡ qP|  d¡}|  |¡ |  ||¡ |  dt¡}t
tƒD ]}|  || || ¡ q¦|  ¡  |   ¡  |  ¡  d S )Nr]   r^   zprefork-worker-rpc-{0}r   r-   r.   )rF   r   r$   r(   r,   rP   r@   rQ   rR   rS   r&   r0   r'   rE   rT   r9   r[   r   r   r   Útest_rpc_all_workers_restartl  s(    

ÿ

z7PreforkProcessRestartTests.test_rpc_all_workers_restartc                 C   sÒ   |   d¡}|  |¡ d}dD ]z}|  dt¡}|   d¡}t |tj¡ t ¡ }|  	d|ddd¡ |  
d|¡ t ¡ }|| }|  ||| ¡ |  ||¡ q|  dt¡}	ttƒD ]}
|  ||
 |	|
 ¡ q¬|  ¡  d S )	Nzprefork-master-echoé   ©r   rb   é
   rd   Zkdcr   r-   r.   r   )r$   r(   r,   rP   r@   rQ   rR   rS   r2   r0   r1   Ú
assertLessÚassertGreaterEqualr&   rT   r9   )r   r    Úbackoff_incrementÚexpectedr)   ÚprocessÚstartÚendÚdurationrW   r*   r   r   r   Útest_master_restart_backoff”  s$    


z6PreforkProcessRestartTests.test_master_restart_backoffc                 C   s‚   d}dD ]l}|   d¡}|  |¡ t |tj¡ t ¡ }|  d|ddd¡ t ¡ }|| }|  ||| ¡ |  	||¡ q|  
¡  d S )Nrb   rc   zprefork-worker-echo-2r   r-   r.   )r$   r(   r@   rQ   rR   rS   r2   r0   re   rf   r9   )r   rg   rh   ri   rj   rk   rl   r   r   r   Útest_worker_restart_backoff¼  s    

z6PreforkProcessRestartTests.test_worker_restart_backoff)Ú__name__Ú
__module__Ú__qualname__r   r   r#   r$   r,   r1   r0   r9   rB   rF   r   rX   rZ   r\   r_   r`   ra   rm   rn   Ú__classcell__r   r   r   r   r   /   s&   		*'*$&(((r   )Z
__future__r   r@   rR   r2   rI   Zsamba.testsr   r   Zsamba.dcerpcr   r   Zsamba.messagingr   Zsamba.samdbr   Zsamba.credentialsr	   r
   Zsamba.compatr   Z
samba.dsdbr   r   Zsamba.dcerpc.miscr   Z
samba.authr   rP   rJ   r   r   r   r   r   Ú<module>   s    