3 ‡×X(ã@sZddlZddlZddlZddlZddlZddlZddlmZmZm Z m Z m Z m Z m Z mZmZmZmZmZmZmZmZddlZejdd„ƒZejdd„ƒZdd„Zd d „Zd d „Zd d„Zdd„Zdd„Zdd„Z dd„Z!dd„Z"dd„Z#dd„Z$dd„Z%dd „Z&d!d"„Z'd#d$„Z(d%d&„Z)d'd(„Z*d)d*„Z+d+d,„Z,ej-d2k�rBe.Z/ne0Z/d.d/„Z1d0d1„Z2dS)3é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ÚnotifyccsHy dVWn8tk rB}z|jtjkr0tjƒ‚WYdd}~XnXdS)N)ÚOSErrorÚerrnoZENOSYSÚpytestÚskip)Úe©rú#/usr/lib64/python3.6/test_daemon.pyÚ skip_enosyss   rc cs4tj|ƒ}z |VWd|djƒ|djƒXdS)Nré)ÚsocketZ socketpairÚclose)ZfamilyÚpairrrrÚclosing_socketpairs    rcCstjjdƒrndS)Nz/run/systemd/system)ÚosÚpathÚexistsrrrrÚ test_booted&s r!cCs.|jdƒj}tj|ƒtj|tjtjBƒ}dS)Nz test.fifo)ÚjoinÚstrpathÚposixÚmkfiforÚopenÚO_RDONLYÚ O_NONBLOCK)ÚtmpdirrÚfdrrrÚ test__is_fifo.s  r+cCs2|jdƒ}|jdƒ|j}tj|tjtjBƒ}dS)Nz test.fifoÚboo)r"Úwriter#rr&r'r()r)Úfilerr*rrrÚtest__is_fifo_file6s   r/cCs<|jdƒj}tjtƒ�WdQRXtjtƒ�WdQRXdS)Nz test.fifo)r"r#rÚraisesr)r)rrrrÚtest__is_fifo_bad_fd?s     r1cCs:|jdƒj}tj|ƒtj|tjtjBƒ}tj|dƒ}dS)Nz test.fifoÚr) r"r#r$r%rr&r'r(Úfdopen)r)rr*r.rrrÚ test_is_fifoHs    r4cCs>|jdƒ}|jdƒ|j}tj|tjtjBƒ}tj|dƒ}dS)Nz test.fifor,r2)r"r-r#rr&r'r(r3)r)r.rr*rrrÚtest_is_fifo_fileSs    r5cCs<|jdƒj}tjtƒ�WdQRXtjtƒ�WdQRXdS)Nz test.fifo)r"r#rr0r)r)rrrrÚtest_is_fifo_bad_fd_s     r6cCs.yt|ƒStk r(}zdSd}~XnXdS)NF)r r)ÚargÚerrorrrrÚ is_mq_wrapperhsr9cCs.yt|ƒStk r(}zdSd}~XnXdS)NF)rr)r7r8rrrÚ_is_mq_wrapperpsr:cCsfttjƒ�R}xJ|D]B}tƒ�WdQRX|jƒ}tƒ�WdQRXtƒ�WdQRXqWWdQRXdS)N)rrÚAF_UNIXrÚfileno)rÚsockr*rrrÚtest_no_mismatchxs    r>cCsbttjƒ�N}xF|D]>}x&||jƒfD]}tƒ�WdQRXq$Wtƒ�WdQRXqWWdQRXdS)N)rrr;r<r)rr=r7rrrÚtest_is_socketŽs  r?cCCs`tjtjtjƒƒ��B}|jdƒ|jƒ\}}dj|ƒ}�xd D�]}x¶||jƒfD]¦}tƒ�WdQRXtƒ�WdQRXtƒ�WdQRXtƒ�WdQRXtƒ�WdQRXt j t ƒ�t |ddd�WdQRXtƒ�WdQRXtƒ�WdQRXqRWt j t ƒ�t |dddƒWdQRXtƒ�WdQRXtƒ�WdQRX|jdƒq>WWdQRXdS) Nú 127.0.0.1rz:{}ri@â)Zflowinfoé )r@r)rr)Ú contextlibÚclosingrZAF_INETÚbindZ getsocknameÚformatr<rrr0Ú ValueErrorr r Zlisten)r=ZaddrZportZ listeningr7rrrÚtest_is_socket_sockaddr¢s:             rGc Cs0ttjƒ�}x|D] }|jƒ}qWWdQRXdS)N)rrr;r<)rr=r*rrrÚtest__is_socketÈs   rHc Cs>ttjƒ�*}x"|D]}x||jƒfD]}q$WqWWdQRXdS)N)rrr;r<)rr=r7rrrÚtest_is_socket_unixØs  rIc Cs0ttjƒ�}x|D] }|jƒ}qWWdQRXdS)N)rrr;r<)rr=r*rrrÚtest__is_socket_unixás  rJcCstjdƒtjdƒdS)NÚ LISTEN_FDSÚ LISTEN_PID)rÚunsetenvrrrrÚtest_listen_fds_no_fdsês  rNcCs dtjd<ttjƒƒtjd<dS)NÚ3rKrL)rÚenvironÚstrÚgetpidrrrrÚtest_listen_fdsós rScCs dtjd<ttjƒƒtjd<dS)NÚ1rKrL)rrPrQrRrrrrÚtest_listen_fds_default_unsetûs rUc Cstƒ�WdQRXdS)N)rrrrrÚtest_notify_no_sockets rVéc/CsÔdtjd<tjtƒ�tdƒWdQRXtjtƒ�$tƒ�tdgd�WdQRXWdQRXtjtƒ�tdddgd�WdQRXtjtƒ�tdtjƒd�WdQRXtjtƒ�tdtjƒd d �WdQRXdS) Nz /dev/nullÚ NOTIFY_SOCKETzREADY=1z FDSTORE=1)Úfdsré)Úpid)r[rY)r)rrPrr0Úconnection_errorrrrRrrrrÚtest_notify_bad_sockets       r]cCsš|jdƒj}tjtjtjƒ}y|j|ƒWn2tjk r\}ztjd|ƒWYdd}~XnXt tddƒ}|j tj |dƒ|t j d<tƒ�WdQRXdS)Nrzfailed to bind socket (%s)Ú SO_PASSCREDérrX)r"r#rr;Z SOCK_DGRAMrDr8rZxfailÚgetattrZ setsockoptZ SOL_SOCKETrrPr)r)rr=rr^rrrÚtest_notify_with_sockets     ra)rW)3Úsysrr$rrBrZsystemd.daemonrrrrrrrr r r r r rrrrÚcontextmanagerrrr!r+r/r1r4r5r6r9r:r>r?rGrHrIrJrNrSrUrVÚ version_infoÚConnectionRefusedErrorr\rr]rarrrrÚsBD        &