관리-도구
편집 파일: transports.cpython-39.pyc
a ������gOG����������������������@���s��d�Z�ddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddlZddlZddl mZmZmZ�ddlmZmZ�e�d�jZedd�dd�ZdZe�e�Zd ZG�d d��dej�ZG�dd ��d ej�Z G�dd��d�Z!G�dd��deej"�Z"G�dd��de�Z#G�dd��d�Z$dS�)zKBi-directional asyncio.Transport implementations based on file descriptors.�����N)�Any�ClassVar�Sequence����)� JsonObject�get_int)�args�returnc������������������G���s���t�|���dkrtd��d�S�)Nr���zprctl() failed)� sys_prctl�OSError)r�����r����6/usr/lib/python3.9/site-packages/cockpit/transports.py�prctl'���s����r���i���c�����������������������s���e�Zd�ZU�dZee�ed<�ejed<�ej ed<�ded<�eed<�eed<�e ed <�e ed <�e ed<�dZe ed <�dHejej eedd���fdd� Zdd�dd�Z e d�dd�Zdd�dd�Zdd�dd�Zdd�dd�Zdd�dd �ZdId!dd"�d#d$�Ze d�d%d&�Zdd�d'd(�Zed�d)d*�Zd+d�d,d-�ZdJd.d.dd/�d0d1�Zdd�d2d3�Zdd�d4d5�Zdd�d6d7�Zedd8�d9d:�Zedd8�d;d<�Zdd�d=d>�Zej d�d?d@�Z!e d�dAdB�Z"ej ddC�dDdE�Z#dd�dFdG�Z$���Z%S�)K� _Transporti���� BLOCK_SIZE�_loop� _protocolzcollections.deque[bytes] | None�_queue�_in_fd�_out_fd�_closing�_is_reading�_eofF�_eio_is_eof���Nzdict[str, object] | None)�loop�protocol�in_fd�out_fd�extrac��������������������s����t����|��||�_||�_t�d|�|||��d�|�_d|�_d|�_d|�_ ||�_ ||�_t� |d��||krnt� |d��|�j�|���|�����d�S�)Nz/Created transport %s for protocol %s, fds %d %dF)�super�__init__r���r����logger�debugr���r���r���r���r���r����os�set_blockingZconnection_made�resume_reading)�selfr���r���r���r���r����� __class__r���r ���r!���B���s����z_Transport.__init__�r ���c�������������� ���C���s����t��d|�|�j|�j��zt�|�jtj�}W�nf�ty<���Y�d�S��t y��}�z<|�j rb|jtjkrbd}n|�� |��W�Y�d�}~d�S�W�Y�d�}~n d�}~0�0�|dkr�t��dt|���|�j�|��n(t��d��|�����|�j���}|s�|�����d�S�)NzRead ready on %s %s %d�����z read %d bytesz got EOF)r"���r#���r���r���r$����readr���r����BlockingIOErrorr���r����errnoZEIO�abort�lenZ data_received� _close_readerZeof_received�close)r'����data�excZ keep_openr���r���r ����_read_ready]���s$���� $ z_Transport._read_readyc�����������������C���s���|�j�S��N)r����r'���r���r���r ���� is_readingv���s����z_Transport.is_readingc�����������������C���s���|������d|�_d�S��Nr���)� pause_readingr���r7���r���r���r ���r1���y���s����z_Transport._close_readerc�����������������C���s���|�j�r|�j�|�j��d|�_�d�S��NF)r���r���� remove_readerr���r7���r���r���r ���r:���}���s����z_Transport.pause_readingc�����������������C���s,���|�j�s(|�jdkr(|�j�|�j|�j��d|�_�d�S�)Nr���T)r���r���r���� add_readerr5���r7���r���r���r ���r&�������s����z_Transport.resume_readingc�����������������C���s���d�S�r6���r���r7���r���r���r ����_close����s����z_Transport._closezException | None)r4���r ���c�����������������C���s4���d|�_�|�����|�����|�j�|�jj|��|�����d�S��NT)r���r1����_remove_write_queuer���Z call_soonr���Zconnection_lostr>���)r'���r4���r���r���r ���r/�������s ����z_Transport.abortc�����������������C���s���t��d�S�r6�����NotImplementedErrorr7���r���r���r ���� can_write_eof����s����z_Transport.can_write_eofc�����������������C���s@���|�j�r J��d|�_�|�jd�u�r0t�d|���|�����nt�d|���d�S�)NTz%s got EOF. closing backend.z,%s got EOF. bytes in queue, deferring close)r���r���r"���r#����_write_eof_nowr7���r���r���r ���� write_eof����s���� z_Transport.write_eofc�����������������C���s"���|�j�d�u�rdS�tdd��|�j�D���S�)Nr���c�����������������s���s���|�]}t�|�V��qd�S�r6���)r0���)�.0�blockr���r���r ���� <genexpr>����r+���z3_Transport.get_write_buffer_size.<locals>.<genexpr>)r����sumr7���r���r���r ����get_write_buffer_size����s���� z _Transport.get_write_buffer_sizeztuple[int, int]c�����������������C���s���dS�)N)r���r���r���r7���r���r���r ����get_write_buffer_limits����s����z"_Transport.get_write_buffer_limits� int | None)�high�lowr ���c�����������������C���s,���|d�u�s|dksJ��|d�u�s(|dks(J��d�S��Nr���r���)r'���rM���rN���r���r���r ����set_write_buffer_limits����s����z"_Transport.set_write_buffer_limitsc�����������������C���s���t��d�S�r6���rA���r7���r���r���r ���rD�������s����z_Transport._write_eof_nowc�������������� ���C���s��t��d|���|�jd�usJ��zt�|�j|�j�}W�nD�tyD���d}Y�n0�tyr�}�z|��|��W�Y�d�}~d�S�d�}~0�0�t��d|��|r�|�j� ��}t |�|kr�t��d��|�j�||d�����q�|t |�8�}t��d|��q�|�j�st��d��|�����|�j �rt��d��|�����|�j�r|�����d�S�)Nz%s _write_readyr���z, successfully wrote %d bytes from the queuez incomplete block. Stop.z& removed complete block. %d remains.z%s queue drained.z'%s queue drained. closing backend now.)r"���r#���r���r$����writevr���r-���r���r/����popleftr0���� appendleftr@���r���rD���r���)r'����n_bytesr4���rG���r���r���r ����_write_ready����s4���� z_Transport._write_readyc�����������������C���s,���|�j�d�ur(|�j����|�j�|�j��d�|�_�d�S�r6���)r���r���Zresume_writingr���Z remove_writerr���r7���r���r���r ���r@�������s���� z_Transport._remove_write_queue)r3���r ���c�����������������C���sL���t��d|�|�j��|�jd�u�sJ��|�j�|�j|�j��t�|f�|�_|�j � ���d�S�)Nz!%s creating write queue for fd %s)r"���r#���r���r���r���Z add_writerrU����collections�dequer���Z pause_writing�r'���r3���r���r���r ����_create_write_queue����s ����z_Transport._create_write_queuec�������������� ���C���s����|�j�rt�d|�j��d�S�|�jr"J��|�jd�url|�j�|��t|�j�tkrhd� |�j�}|�j� ���|�j�|��d�S�zt�|�j|�}W�nD�t y����d}Y�n0�ty��}�z|��|��W�Y�d�}~d�S�d�}~0�0�|t|�kr�|��||d�����d�S�)Nz+ignoring write() to closing transport fd %ir+���r���)r���r"���r#���r���r���r����appendr0����IOV_MAX�join�clearr$����writer-���r���r/���rY���)r'���r3���Zall_datarT���r4���r���r���r ���r^�������s(���� z_Transport.writec�����������������C���s2���|�j�r d�S�d|�_�|�����|�jd�ur&d�S�|�����d�S�r?���)r���r1���r���r/���r7���r���r���r ���r2�������s���� z_Transport.closec�����������������C���s���|�j�S�r6���)r���r7���r���r���r ����get_protocol ��s����z_Transport.get_protocolc�����������������C���s���|�j�S�r6���)r���r7���r���r���r ���� is_closing ��s����z_Transport.is_closing)r���r ���c�����������������C���s���t��d�S�r6���rA���)r'���r���r���r���r ����set_protocol��s����z_Transport.set_protocolc�����������������C���s���|������d�S�r6���)r>���r7���r���r���r ����__del__��s����z_Transport.__del__)r���r���N)N)NN)&�__name__� __module__�__qualname__r���r����int�__annotations__�asyncio�AbstractEventLoop�Protocol�boolr���r!���r5���r8���r1���r:���r&���r>���r/���rC���rE���rJ���rK���rP���rD���rU���r@����bytesrY���r^���r2���ZBaseProtocolr_���r`���ra���rb���� __classcell__r���r���r(���r ���r���3���sP��� ���� ! r���c�������������������@���s���e�Zd�ZdZdd�dd�ZdS�)�SubprocessProtocolzBAn extension to asyncio.Protocol for use with SubprocessTransport.Nr*���c�����������������C���s���t��dS�)z"Called when subprocess has exited.NrA���r7���r���r���r ����process_exited��s����z!SubprocessProtocol.process_exited)rc���rd���re����__doc__ro���r���r���r���r ���rn�����s���rn���c�������������������@���s���e�Zd�Zed�dd�ZdS�)� WindowSize)�valuec�����������������C���s���t�|d�|�_t�|d�|�_d�S�)N�rows�cols)r���rs���rt���)r'���rr���r���r���r ���r!�����s����zWindowSize.__init__N)rc���rd���re���r���r!���r���r���r���r ���rq�����s���rq���c�����������������������sV��e�Zd�ZU�dZdZded<�dZded<�dZded<�ded <�ee j d �dd��Zee je j d �dd��Z dd�eed�dd�Zeedd�dd�Zddd�e jeee�eded���fdd�Zedd�dd�Zed �d d!�Zdd �d"d#�Zed �d$d%�Zdd �d&d'�Zee jd(�d)d*�Zej dd+�d,d-�Z!dd �d.d/�Z"dd �d0d1�Z#dd �d2d3�Z$���Z%S�)4�SubprocessTransporta���A bi-directional transport speaking with stdin/out of a subprocess. Note: this is not really a normal SubprocessTransport. Although it implements the entire API of asyncio.SubprocessTransport, it is not designed to be used with asyncio.SubprocessProtocol objects. Instead, it pair with normal Protocol objects which also implement the SubprocessProtocol defined in this module (which only has a process_exited() method). Whatever the protocol writes is sent to stdin, and whatever comes from stdout is given to the Protocol via the .data_received() function. If stderr is configured as a pipe, the transport will separately collect data from it, making it available via the .get_stderr() method. NrL����_returncode�_pty_fdzsubprocess.Popen[bytes] | None�_processzSpooler | None�_stderrr*���c���������������� ���C���s@���z t��t��t����d���t���W�S��ttfy6���Y�n0�t���S�rO���) r$���r2���� pidfd_open�getpidrh���ZPidfdChildWatcher�AttributeErrorr���ZSafeChildWatcherr���r���r���r ����_create_watcher:��s���� z#SubprocessTransport._create_watcher)r���r ���c�����������������C���s:���d}t�|�|d��}|d�u�r6t���}|�|���t|�||��|S�)NZ!_cockpit_transports_child_watcher)�getattrru���r}���Zattach_loop�setattr)r���ZquarkZwatcherr���r���r ����_get_watcherD��s���� z SubprocessTransport._get_watcherF��reset�r����r ���c����������������C���s(���|�j�d�ur |�j�j|d�jdd�S�dS�d�S�)Nr�����replace)�errors��)ry����get�decode)r'���r����r���r���r ���� get_stderrP��s���� zSubprocessTransport.get_stderr)�pid�coder ���c�����������������C���sV���t�|�jt�sJ��|�jd�usJ��|�jj|ks.J��||�_t�d|�j��|�jsR|�j� ���d�S�)NzProcess exited with status %d) � isinstancer���rn���rx���r����rv���r"���r#���r���ro���)r'���r����r����r���r���r ����_exitedV��s���� zSubprocessTransport._exited)�pty�windowzWindowSize | None)r���r���r���r����r�����kwargsc�������������������s"��d�d���fdd�}��r|t����\|�_}|d�ur6|��|��||d<�tj|f|||dd�|��|�_t��|��|�j|�j�} } d|�_nPtj|ftj tj |d�|��|�_|�jj s�J��|�jjs�J��|�jj���} |�jj ���} |�jj d�ur�t||�jj ����|�_nd�|�_t���||| | ��|��|��|�jj|�j��d�S�)Nr*���c����������������������s$���t�ttj����r t�dtjd��d�S�rO���)r���� SET_PDEATHSIG�signal�SIGTERM�fcntl�ioctl�termiosZ TIOCSCTTYr����r����r���r ���� preexec_fnr��s����z0SubprocessTransport.__init__.<locals>.preexec_fn�stderrT)�stdin�stdoutr����Zstart_new_session)r����r����r����)r$����openptyrw����set_window_size� subprocess�Popenrx���r2���r����PIPEr����r�����filenor�����Spoolerry���r ���r!���r����Zadd_child_handlerr����r����)r'���r���r���r���r����r����r����r����Z session_fdr���r���r(���r����r ���r!���h��s:���� �� ��zSubprocessTransport.__init__)�sizer ���c�������������� ���C���s2���|�j�d�usJ��t�|�j�tjt�d|j|j���d�S�)NZ2H4x) rw���r����r����r����Z TIOCSWINSZ�struct�packrs���rt���)r'���r����r���r���r ���r�������s����z#SubprocessTransport.set_window_sizec�����������������C���s���|�j�d�usJ��|�j�jd�uS�r6���)rx���r����r7���r���r���r ���rC������s����z!SubprocessTransport.can_write_eofc�����������������C���s4���|�j�d�usJ��|�j�jd�usJ��|�j�j����d|�_d�S�r9���)rx���r����r2���r���r7���r���r���r ���rD������s����z"SubprocessTransport._write_eof_nowc�����������������C���s���|�j�d�usJ��|�j�jS�r6���)rx���r����r7���r���r���r ����get_pid���s����zSubprocessTransport.get_pidc�����������������C���s���|�j�S�r6���)rv���r7���r���r���r ����get_returncode���s����z"SubprocessTransport.get_returncode)�fdr ���c�����������������C���s���t��d�S�r6���rA���)r'���r����r���r���r ����get_pipe_transport���s����z&SubprocessTransport.get_pipe_transport)�sigr ���c�����������������C���s~���|�j�d�usJ��|�jd�ur.t�d||�j�j��d�S�z&t�|�j�j|��t�d||�j�j��W�n$�tyx���t�d||�j�j��Y�n0�d�S�)Nz3won't attempt %s to process %i. It exited already.zsent %s to process %iz3can't send %s to process %i. It's exited just now.)rx���rv���r"���r#���r����r$����kill�ProcessLookupError)r'���r����r���r���r ����send_signal���s���� zSubprocessTransport.send_signalc�����������������C���s���|���tj��d�S�r6���)r����r����r����r7���r���r���r ���� terminate���s����zSubprocessTransport.terminatec�����������������C���s���|���tj��d�S�r6���)r����r�����SIGKILLr7���r���r���r ���r�������s����zSubprocessTransport.killc�����������������C���sz���|�j�d�urt�|�j���d�|�_�|�jd�urv|�jjd�urF|�jj����d�|�j_z|�����W�n"�tyt���t�d|�jj ��Y�n0�d�S�)Nzcan't kill %i due to EPERM) rw���r$���r2���rx���r����r�����PermissionErrorr"���r#���r����r7���r���r���r ���r>������s���� zSubprocessTransport._close)&rc���rd���re���rp���rv���rg���rw���rx����staticmethodrh���ZAbstractChildWatcherr}���ri���r����rk����strr����rf���r����rn���r���r���r!���rq���r����rC���rD���r����r����� Transportr����r����ZSignalsr����r����r����r>���rm���r���r���r(���r ���ru���$��s>��� ��/ru���c�����������������������sN���e�Zd�ZdZd ejejeed���fdd� Ze d�dd �Z d d�dd�Z���ZS�)�StdioTransportz�A bi-directional transport that corresponds to stdin/out. Can talk to just about anything: - files - pipes - character devices (including terminals) - sockets r���r���)r���r���r����r����c��������������������s���t����||||��d�S�r6���)r ���r!���)r'���r���r���r����r����r(���r���r ���r!������s����zStdioTransport.__init__r*���c�����������������C���s���dS�r;���r���r7���r���r���r ���rC������s����zStdioTransport.can_write_eofNc�����������������C���s���t�d��d�S�)NzCan't write EOF to stdout)�RuntimeErrorr7���r���r���r ���rD������s����zStdioTransport._write_eof_now)r���r���) rc���rd���re���rp���rh���ri���rj���rf���r!���rk���rC���rD���rm���r���r���r(���r ���r�������s��� r����c�������������������@���s����e�Zd�ZU�dZejed<�eed<�ded<�ejed�dd�Zd d �dd�Z e d �d d�Zdd�e ed�dd�Z d d �dd�Zd d �dd�Zd S�)r����z�Consumes data from an fd, storing it in a buffer. This makes a copy of the fd, so you don't have to worry about holding it open. r����_fdzlist[bytes]� _contents)r���r����c�����������������C���s@���||�_�d|�_g�|�_t�|�|�_t�|�jd��|�|�j|�j��d�S�)Nr���F)r���r����r����r$����dupr%���r=���r5���)r'���r���r����r���r���r ���r!������s����zSpooler.__init__Nr*���c�����������������C���s^���zt��|�jd�}W�n(�ty&���Y�d�S��ty:���d}Y�n0�|dkrR|�j�|��n|�����d�S�)Ni� ��r+���)r$���r,���r����r-���r���r����rZ���r2���rX���r���r���r ���r5�����s���� zSpooler._read_readyc�����������������C���s,���|�j�dkrdS�t�|�j�gg�g�d�g�g�g�fkS�)Nr���Fr���)r�����selectr7���r���r���r ���� _is_ready��s���� zSpooler._is_readyFr����r����c����������������C���s,���|�����r|�����q�d�|�j�}|r(g�|�_|S�)Nr+���)r����r5���r\���r����)r'���r�����resultr���r���r ���r������s���� zSpooler.getc�����������������C���s.���|�j�dkr*|�j�|�j���t�|�j���d|�_�d�S�r9���)r����r���r<���r$���r2���r7���r���r���r ���r2���!��s���� z Spooler.closec�����������������C���s���|������d�S�r6���)r2���r7���r���r���r ���rb���'��s����zSpooler.__del__)rc���rd���re���rp���rh���ri���rg���rf���r!���r5���rk���r����rl���r����r2���rb���r���r���r���r ���r�������s��� r����)%rp���rh���rV���Zctypesr.���r����Zloggingr$���r����r����r����r����r�����typingr���r���r���Zjsonutilr���r���ZCDLLr���r ���rf���r����Z getLoggerrc���r"���r[���r����r���rj���rn���rq���ru���r����r����r���r���r���r ����<module>���s6��� �e�9