U
    X(                     @   sZ  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mZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZ d dlZejdd Zej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*d)d* Z+d+d, Z,e j-d-krBe.Z/ne0Z/d.d/ Z1d0d1 Z2dS )2    N)bootedis_fifo_is_fifo	is_socket
_is_socketis_socket_inet_is_socket_inetis_socket_unix_is_socket_unixis_socket_sockaddr_is_socket_sockaddris_mq_is_mq
listen_fdsnotifyc               
   c   sH   z
d V  W n8 t k
rB }  z| jtjkr0t   W 5 d } ~ X Y nX d S N)OSErrorerrnoZENOSYSpytestskip)e r   :/usr/lib/python3/dist-packages/systemd/test/test_daemon.pyskip_enosys   s    
r   c                 c   s4   t | }z
|V  W 5 |d   |d   X d S )Nr      )socketZ
socketpairclose)Zfamilypairr   r   r   closing_socketpair   s
    

r   c                   C   s*   t jdrt s&tnt dks&td S )Nz/run/systemd/system>   FT)ospathexistsr   AssertionErrorr   r   r   r   test_booted&   s    r#   c                 C   sJ   |  dj}t| t|tjtjB }t|d s8t	t||sFt	d S )N	test.fifo)
joinstrpathposixmkfifor   openO_RDONLY
O_NONBLOCKr   r"   )tmpdirr    fdr   r   r   test__is_fifo.   s
    
r.   c                 C   sN   |  d}|d |j}t|tjtjB }t|d r<tt||rJtd S )Nr$   boo)	r%   writer&   r   r)   r*   r+   r   r"   r,   filer    r-   r   r   r   test__is_fifo_file6   s    

r3   c              	   C   sX   |  dj}tt tdd r&tW 5 Q R X tt td|rJtW 5 Q R X d S Nr$   )r%   r&   r   raisesr   r   r"   r,   r    r   r   r   test__is_fifo_bad_fd?   s
    r8   c                 C   sr   |  dj}t| t|tjtjB }t|d}t	|d sDt
t	||sRt
t	|d s`t
t	||snt
d S )Nr$   r)r%   r&   r'   r(   r   r)   r*   r+   fdopenr   r"   )r,   r    r-   r2   r   r   r   test_is_fifoH   s    
r;   c                 C   sv   |  d}|d |j}t|tjtjB }t|d}t|d rHt	t||rVt	t|d rdt	t||rrt	d S )Nr$   r/   r9   )
r%   r0   r&   r   r)   r*   r+   r:   r   r"   r1   r   r   r   test_is_fifo_fileS   s    

r<   c              	   C   sX   |  dj}tt tdd r&tW 5 Q R X tt td|rJtW 5 Q R X d S r4   )r%   r&   r   r6   r   r   r"   r7   r   r   r   test_is_fifo_bad_fd_   s
    r=   c              
   C   sH   z
t | W S  tk
rB } z|jtjks,tW Y dS d }~X Y nX d S NF)r   r   r   EBADFr"   argerrorr   r   r   is_mq_wrapperh   s
    
rC   c              
   C   sH   z
t | W S  tk
rB } z|jtjks,tW Y dS d }~X Y nX d S r>   )r   r   r   r?   r"   r@   r   r   r   _is_mq_wrapperp   s
    
rD   c                  C   s   t tj} | D ]}t|r tt|r,tt|r8tt  t|drNtW 5 Q R X |	 }t|rltt|rxtt|rtt  t|drtW 5 Q R X t
|rtt|rtt|rtt  t|drtW 5 Q R X qW 5 Q R X d S )Nz127.0.0.1:2000)r   r   AF_UNIXr   r"   rC   r   r   r   filenor   rD   r   r   r   sockr-   r   r   r   test_no_mismatchx   s$    rI   c                  C   s4  t tj} | D ]}|| fD ]}t|s4tt|tjsDtt|tjrTtt|tjtjshtt|tjtjr|tt	  t
|dtjddrtW 5 Q R X q$t|stt|tjstt|tjrtt|tjtjstt|tjtjrtt	  t|dtjddrtW 5 Q R X qW 5 Q R X d S )Nz8.8.8.8:2000r   )r   r   rE   rF   r   r"   AF_INETSOCK_STREAM
SOCK_DGRAMr   r   r   r   r   rH   rA   r   r   r   test_is_socket   s"    
"rN   c                  C   s  t ttj} | d |  \}}d|}dD ]}| |  fD ]<}t  t	|dtj
sltW 5 Q R X t  t	|d| tj
stW 5 Q R X t  t	|d| |dstW 5 Q R X t  t	|d| ddstW 5 Q R X t   t	|d| | drtW 5 Q R X tt t	|ddd W 5 Q R X t  t	|d	tj
rZtW 5 Q R X t  t	|dtjrtW 5 Q R X qLtt t|dd
d W 5 Q R X t  t|d	tj
rtW 5 Q R X t  t|dtjrtW 5 Q R X | d q:W 5 Q R X d S )N)	127.0.0.1r   z:{})r   r   rO   )	listeningr5   i@ )Zflowinfoz129.168.11.11:23r      )
contextlibclosingr   rJ   bindZgetsocknameformatrF   r   r   rK   r"   r   r6   
ValueErrorrL   r   Zlisten)rH   ZaddrZportrP   rA   r   r   r   test_is_socket_sockaddr   s:    


   $ rW   c               	   C   s   t tj} | D ]}| }t|s(tt|tjs8tt|tjrHtt|tjtjs\tt|tjtjrptt|s|tt|tjstt|tjrtt|tjtjstt|tjtjrtqW 5 Q R X d S r   )	r   r   rE   rF   r   r"   rJ   rK   rL   rG   r   r   r   test__is_socket   s    rX   c               	   C   sr   t tj^} | D ]R}|| fD ]@}t|s0tt|ddr@tt|tjsPtt|tjr tq qW 5 Q R X d S )N/no/such/path)r    )r   r   rE   rF   r	   r"   rK   rL   rM   r   r   r   test_is_socket_unix   s    rZ   c               	   C   sj   t tjV} | D ]J}| }t|s(tt|dddr:tt|tjsJtt|tjrtqW 5 Q R X d S )Nr   r5   rY   )r   r   rE   rF   r
   r"   rK   rL   rG   r   r   r   test__is_socket_unix   s    r[   c                   C   sF   t d t d t g ks"ttdg ks2ttdg ksBtd S )N
LISTEN_FDS
LISTEN_PIDTF)r   unsetenvr   r"   r   r   r   r   test_listen_fds_no_fds   s
    

r_   c                   C   sZ   dt jd< tt  t jd< tddddgks2ttddddgksHtt g ksVtd S )	N3r\   r]   F         Tr   environstrgetpidr   r"   r   r   r   r   test_listen_fds   s
    
rh   c                   C   sP   dt jd< tt  t jd< tddgks.tt dgks>tt g ksLtd S )N1r\   r]   Fra   rd   r   r   r   r   test_listen_fds_default_unset   s
    
rj   c                	   C   s   t ddkstt  t dg ddks,tW 5 Q R X t dddgddksNtt dt ddksftt dt dd	dkstd S )
NREADY=1F	FDSTORE=1fdsr      pidr   rq   rn   )r   r"   r   r   rg   r   r   r   r   test_notify_no_socket  s    rt   )ra   c                
   C   s   dt jd< tt td W 5 Q R X tt$ t  tdg d W 5 Q R X W 5 Q R X tt tdddgd W 5 Q R X tt tdt  d W 5 Q R X tt tdt  d	d
 W 5 Q R X d S )Nz	/dev/nullNOTIFY_SOCKETrk   rl   rm   r   ro   rp   rr   rs   )r   re   r   r6   connection_errorr   r   rg   r   r   r   r   test_notify_bad_socket  s    
 rw   c              
   C   s   |  dj}ttjtj}z|| W n2 tjk
r\ } ztd|  W 5 d }~X Y nX t	tdd}|
tj|d |tjd< tdstt  tdg d	stW 5 Q R X tddd
gd	sttdt dsttdt ddstd S )Nr   zfailed to bind socket (%s)SO_PASSCRED   r   ru   rk   rl   rm   ro   rp   rr   rs   )r%   r&   r   rE   rL   rT   rB   r   ZxfailgetattrZ
setsockoptZ
SOL_SOCKETr   re   r   r"   r   rg   )r,   r    rH   r   rx   r   r   r   test_notify_with_socket  s     
r{   )3sysr   r'   r   rR   r   Zsystemd.daemonr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   contextmanagerr   r   r#   r.   r3   r8   r;   r<   r=   rC   rD   rI   rN   rW   rX   rZ   r[   r_   rh   rj   rt   version_infoConnectionRefusedErrorrv   r   rw   r{   r   r   r   r   <module>   sF   D


				&			