3 X(@sZddlZddlZddlZddlZddlZddlZddlmZmZm Z m Z m Z m Z m Z mZmZmZmZmZmZmZmZddlZejddZejddZddZd d Zd d Zd dZddZddZddZ ddZ!ddZ"ddZ#ddZ$ddZ%dd Z&d!d"Z'd#d$Z(d%d&Z)d'd(Z*d)d*Z+d+d,Z,ej-d2krBe.Z/ne0Z/d.d/Z1d0d1Z2dS)3N)bootedis_fifo_is_fifo is_socket _is_socketis_socket_inet_is_socket_inetis_socket_unix_is_socket_unixis_socket_sockaddr_is_socket_sockaddris_mq_is_mq listen_fdsnotifyccsHy dVWn8tk rB}z|jtjkr0tjWYdd}~XnXdS)N)OSErrorerrnoZENOSYSpytestskip)er#/usr/lib64/python3.6/test_daemon.py skip_enosyss   rc cs4tj|}z |VWd|dj|djXdS)Nr)socketZ socketpairclose)Zfamilypairrrrclosing_socketpairs    rcCs*tjjdrts&tntdks&tdS)Nz/run/systemd/systemFT>FT)ospathexistsrAssertionErrorrrrr test_booted&s  r"cCsJ|jdj}tj|tj|tjtjB}t|ds8t t||sFt dS)Nz test.fifo) joinstrpathposixmkfiforopenO_RDONLY O_NONBLOCKrr!)tmpdirrfdrrr test__is_fifo.s   r,cCsR|jd}|jd|j}tj|tjtjB}t|d s>tt|| sNtdS)Nz test.fifoboo) r#writer$rr'r(r)rr!)r*filerr+rrrtest__is_fifo_file6s   r0cCs\|jdj}tjttdd s(tWdQRXtjttd| sNtWdQRXdS)Nz test.fiforr1)r#r$rraisesrrr!)r*rrrrtest__is_fifo_bad_fd?s    r3cCsr|jdj}tj|tj|tjtjB}tj|d}t |dsDt t ||sRt t |ds`t t ||snt dS)Nz test.fifor) r#r$r%r&rr'r(r)fdopenrr!)r*rr+r/rrr test_is_fifoHs   r6cCs~|jd}|jd|j}tj|tjtjB}tj|d}t|d sJt t|| sZt t|d sjt t|| szt dS)Nz test.fifor-r4) r#r.r$rr'r(r)r5rr!)r*r/rr+rrrtest_is_fifo_fileSs   r7cCs\|jdj}tjttdd s(tWdQRXtjttd| sNtWdQRXdS)Nz test.fiforr1r1)r#r$rr2rrr!)r*rrrrtest_is_fifo_bad_fd_s    r8cCs>yt|Stk r8}z|jtjks*tdSd}~XnXdS)NF)r rrEBADFr!)argerrorrrr is_mq_wrapperhs r<cCs>yt|Stk r8}z|jtjks*tdSd}~XnXdS)NF)rrrr9r!)r:r;rrr_is_mq_wrapperps r=c Csttj}x|D]}t| s&tt| s4tt| sBttt|d sZtWdQRX|j }t| sztt| stt| sttt|d stWdQRXt | stt | stt | sttt |d stWdQRXqWWdQRXdS)Nz127.0.0.1:2000)rrAF_UNIXrr!r<rrr filenorr=rr )rsockr+rrrtest_no_mismatchxs$ rAcCsLttj6}x,|D]"}x||jfD]}t|s:tt|tjsJtt|tj s\tt|tjtjsptt|tjtj stt t |dtjdd stWdQRXq*Wt |stt |tjstt |tj stt |tjtjstt |tjtj stt t |dtjdd s0tWdQRXqWWdQRXdS)Nz 8.8.8.8:2000r) rrr>r?rr!AF_INET SOCK_STREAM SOCK_DGRAMrr rr )rr@r:rrrtest_is_sockets" & rEcECs,tjtjtj}|jd |j\}}dj|}xd D]}xT||jfD]B}tt |dtj stt WdQRXtt |d|tj st WdQRXtt |d||dst WdQRXtt |d|d dst WdQRXt"t |d|| d st WdQRXt j tt |dddWdQRXtt |dtj  sft WdQRXtt |dtj st WdQRXqTWt j tt|dddWdQRXtt|dtj  st WdQRXtt|dtj st WdQRX|jd q>WWdQRXdS) N 127.0.0.1rz:{}r) listeningi@)Zflowinfoz129.168.11.11:23 )rFr)rrr1) contextlibclosingrrBbindZ getsocknameformatr?rr rCr!rr2 ValueErrorrDr Zlisten)r@ZaddrZportrGr:rrrtest_is_socket_sockaddrs:      &  $   rNc Csttj}x|D]}|j}t|s*tt|tjs:tt|tj sLtt|tjtjs`tt|tjtj svtt|stt|tjstt|tj stt|tjtjstt|tjtj stqWWdQRXdS)N) rrr>r?rr!rBrCrD)rr@r+rrrtest__is_sockets    rOc Cs~ttjj}xb|D]Z}xT||jfD]D}t|s4tt|dd sFtt|tjsVtt|tj s$tq$WqWWdQRXdS)Nz /no/such/path)r)rrr>r?r r!rCrD)rr@r:rrrtest_is_socket_unixs   rPc Csrttj^}xV|D]N}|j}t|s*tt|ddd s>tt|tjsNtt|tj stqWWdQRXdS)Nrrz /no/such/pathr1)rrr>r?r r!rCrD)rr@r+rrrtest__is_socket_unixs   rQcCsFtjdtjdtgks"ttdgks2ttdgksBtdS)N LISTEN_FDS LISTEN_PIDTF)runsetenvrr!rrrrtest_listen_fds_no_fdss   rUcCsZdtjd<ttjtjd<tddddgks2ttddddgksHttgksVtdS) N3rRrSFT)renvironstrgetpidrr!rrrrtest_listen_fdss  r]cCsPdtjd<ttjtjd<tddgks.ttdgks>ttgksLtdS)N1rRrSFrW)rrZr[r\rr!rrrrtest_listen_fds_default_unsets  r_c Cstddkstttdgddks,tWdQRXtdddgddksNttdtjddksfttdtjd ddkstdS) NzREADY=1Fz FDSTORE=1)fdsr)pid)rbr`)r)rr!rrr\rrrrtest_notify_no_sockets rcrWc/Csdtjd<tjttdWdQRXtjt$ttdgdWdQRXWdQRXtjttdddgdWdQRXtjttdtjdWdQRXtjttdtjd d WdQRXdS) Nz /dev/null NOTIFY_SOCKETzREADY=1z FDSTORE=1)r`rra)rb)rbr`)r)rrZrr2connection_errorrrr\rrrrtest_notify_bad_sockets       rfcCs|jdj}tjtjtj}y|j|Wn2tjk r\}ztjd|WYdd}~XnXt tdd}|j tj |d|t j d<tdstttdgd stWdQRXtddd gd sttdt jd sttdt jd d stdS)Nrzfailed to bind socket (%s) SO_PASSCREDrrdzREADY=1z FDSTORE=1)r`ra)rb)rbr`)r)r#r$rr>rDrKr;rZxfailgetattrZ setsockoptZ SOL_SOCKETrrZrr!rr\)r*rr@rrgrrrtest_notify_with_sockets     rj)rW)3sysrr%rrIrZsystemd.daemonrrrrrrrr r r r r rrrrcontextmanagerrrr"r,r0r3r6r7r8r<r=rArErNrOrPrQrUr]r_rc version_infoConnectionRefusedErrorrerrfrjrrrrsBD        &