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    rcCstjjdrndS)Nz/run/systemd/system)ospathexistsrrrr test_booted&s r!cCs.|jdj}tj|tj|tjtjB}dS)Nz test.fifo)joinstrpathposixmkfiforopenO_RDONLY O_NONBLOCK)tmpdirrfdrrr test__is_fifo.s  r+cCs2|jd}|jd|j}tj|tjtjB}dS)Nz test.fifoboo)r"writer#rr&r'r()r)filerr*rrrtest__is_fifo_file6s   r/cCs<|jdj}tjtWdQRXtjtWdQRXdS)Nz test.fifo)r"r#rraisesr)r)rrrrtest__is_fifo_bad_fd?s     r1cCs:|jdj}tj|tj|tjtjB}tj|d}dS)Nz test.fifor) 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*rrrtest_is_fifo_fileSs    r5cCs<|jdj}tjtWdQRXtjtWdQRXdS)Nz test.fifo)r"r#rr0r)r)rrrrtest_is_fifo_bad_fd_s     r6cCs.yt|Stk r(}zdSd}~XnXdS)NF)r r)argerrorrrr is_mq_wrapperhsr9cCs.yt|Stk r(}zdSd}~XnXdS)NF)rr)r7r8rrr_is_mq_wrapperpsr:cCsfttjR}xJ|D]B}tWdQRX|j}tWdQRXtWdQRXqWWdQRXdS)N)rrAF_UNIXrfileno)rsockr*rrrtest_no_mismatchxs    r>cCsbttjN}xF|D]>}x&||jfD]}tWdQRXq$WtWdQRXqWWdQRXdS)N)rrr;r<r)rr=r7rrrtest_is_sockets  r?cCCs`tjtjtjB}|jd|j\}}dj|}xd D]}x||jfD]}tWdQRXtWdQRXtWdQRXtWdQRXtWdQRXt j t t |dddWdQRXtWdQRXtWdQRXqRWt j t t |dddWdQRXtWdQRXtWdQRX|jdq>WWdQRXdS) N 127.0.0.1rz:{}ri@)Zflowinfo )r@r)rr) contextlibclosingrZAF_INETbindZ getsocknameformatr<rrr0 ValueErrorr r Zlisten)r=ZaddrZportZ listeningr7rrrtest_is_socket_sockaddrs:             rGc Cs0ttj}x|D] }|j}qWWdQRXdS)N)rrr;r<)rr=r*rrrtest__is_sockets   rHc Cs>ttj*}x"|D]}x||jfD]}q$WqWWdQRXdS)N)rrr;r<)rr=r7rrrtest_is_socket_unixs  rIc Cs0ttj}x|D] }|j}qWWdQRXdS)N)rrr;r<)rr=r*rrrtest__is_socket_unixs  rJcCstjdtjddS)N LISTEN_FDS LISTEN_PID)runsetenvrrrrtest_listen_fds_no_fdss  rNcCs dtjd<ttjtjd<dS)N3rKrL)renvironstrgetpidrrrrtest_listen_fdss rScCs dtjd<ttjtjd<dS)N1rKrL)rrPrQrRrrrrtest_listen_fds_default_unsets rUc CstWdQRXdS)N)rrrrrtest_notify_no_sockets rVc/Csdtjd<tjttdWdQRXtjt$ttdgdWdQRXWdQRXtjttdddgdWdQRXtjttdtjdWdQRXtjttdtjd d WdQRXdS) Nz /dev/null NOTIFY_SOCKETzREADY=1z FDSTORE=1)fdsr)pid)r[rY)r)rrPrr0connection_errorrrrRrrrrtest_notify_bad_sockets       r]cCs|jdj}tjtjtj}y|j|Wn2tjk r\}ztjd|WYdd}~XnXt tdd}|j tj |d|t j d<tWdQRXdS)Nrzfailed to bind socket (%s) SO_PASSCREDrrX)r"r#rr;Z SOCK_DGRAMrDr8rZxfailgetattrZ setsockoptZ SOL_SOCKETrrPr)r)rr=rr^rrrtest_notify_with_sockets     ra)rW)3sysrr$rrBrZsystemd.daemonrrrrrrrr r r r r rrrrcontextmanagerrrr!r+r/r1r4r5r6r9r:r>r?rGrHrIrJrNrSrUrV version_infoConnectionRefusedErrorr\rr]rarrrrsBD        &