HEX
Server: Apache
System: Linux 185.122.168.184.host.secureserver.net 5.14.0-570.52.1.el9_6.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Oct 15 06:39:08 EDT 2025 x86_64
User: barbeatleanalyti (1024)
PHP: 8.1.33
Disabled: NONE
Upload Files
File: //usr/lib/python3.9/site-packages/cockpit/__pycache__/transports.cpython-39.opt-1.pyc
a

�/�hOG�@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
mZmZmZddlmZmZe�d�jZedd�dd�ZdZe�e�Zd	ZGd
d�dej�ZGdd
�d
ej�Z Gdd�d�Z!Gdd�deej"�Z"Gdd�de�Z#Gdd�d�Z$dS)zKBi-directional asyncio.Transport implementations based on file descriptors.�N)�Any�ClassVar�Sequence�)�
JsonObject�get_int)�args�returncGst|�dkrtd��dS)Nrzprctl() failed)�	sys_prctl�OSError)r�r�6/usr/lib/python3.9/site-packages/cockpit/transports.py�prctl'srics�eZdZUdZeeed<ejed<ej	ed<ded<eed<eed<e
ed	<e
ed
<e
ed<dZe
ed
<dHejej	eedd��fdd�
Zdd�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�extracs�t��|�||_||_t�d||||�d|_d|_d|_d|_	||_
||_t�
|d�||krnt�
|d�|j�|�|��dS)Nz/Created transport %s for protocol %s, fds %d %dF)�super�__init__rr�logger�debugrrrrrr�os�set_blockingZconnection_made�resume_reading)�selfrrrrr��	__class__rr
r!Bsz_Transport.__init__�r	c
Cs�t�d||j|j�zt�|jtj�}Wnfty<YdSt	y�}z<|j
rb|jtjkrbd}n|�
|�WYd}~dSWYd}~n
d}~00|dkr�t�dt|��|j�|�n(t�d�|��|j��}|s�|��dS)NzRead ready on %s %s %d�z  read %d bytesz	  got EOF)r"r#rrr$�readrr�BlockingIOErrorrr�errnoZEIO�abort�lenZ
data_received�
_close_readerZeof_received�close)r'�data�excZ	keep_openrrr
�_read_ready]s$
$

z_Transport._read_readycCs|jS�N)r�r'rrr
�
is_readingvsz_Transport.is_readingcCs|��d|_dS�Nr)�
pause_readingrr7rrr
r1ysz_Transport._close_readercCs|jr|j�|j�d|_dS�NF)rr�
remove_readerrr7rrr
r:}sz_Transport.pause_readingcCs,|js(|jdkr(|j�|j|j�d|_dS)NrT)rrr�
add_readerr5r7rrr
r&�sz_Transport.resume_readingcCsdSr6rr7rrr
�_close�sz_Transport._closezException | None)r4r	cCs4d|_|��|��|j�|jj|�|��dS�NT)rr1�_remove_write_queuerZ	call_soonrZconnection_lostr>)r'r4rrr
r/�s
z_Transport.abortcCst�dSr6��NotImplementedErrorr7rrr
�
can_write_eof�sz_Transport.can_write_eofcCs6d|_|jdur&t�d|�|��nt�d|�dS)NTz%s got EOF.  closing backend.z,%s got EOF.  bytes in queue, deferring close)rrr"r#�_write_eof_nowr7rrr
�	write_eof�s


z_Transport.write_eofcCs"|jdurdStdd�|jD��S)Nrcss|]}t|�VqdSr6)r0)�.0�blockrrr
�	<genexpr>�r+z3_Transport.get_write_buffer_size.<locals>.<genexpr>)r�sumr7rrr
�get_write_buffer_size�s
z _Transport.get_write_buffer_sizeztuple[int, int]cCsdS)N)rrrr7rrr
�get_write_buffer_limits�sz"_Transport.get_write_buffer_limits�
int | None)�high�lowr	cCsdSr6r)r'rMrNrrr
�set_write_buffer_limits�sz"_Transport.set_write_buffer_limitscCst�dSr6rAr7rrr
rD�sz_Transport._write_eof_nowc
Cst�d|�zt�|j|j�}WnDty6d}Yn0tyd}z|�|�WYd}~dSd}~00t�d|�|r�|j�	�}t
|�|kr�t�d�|j�||d��q�|t
|�8}t�d|�qr|j�s
t�d�|��|j
�r�t�d�|��|j�r
|��dS)Nz%s _write_readyrz,  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$�writevrrr-rr/�popleftr0�
appendleftr@rrDr)r'�n_bytesr4rGrrr
�_write_ready�s2




z_Transport._write_readycCs,|jdur(|j��|j�|j�d|_dSr6)rrZresume_writingrZ
remove_writerrr7rrr
r@�s

z_Transport._remove_write_queue)r3r	cCs>t�d||j�|j�|j|j�t�|f�|_|j	�
�dS)Nz!%s creating write queue for fd %s)r"r#rrZ
add_writerrT�collections�dequerrZ
pause_writing�r'r3rrr
�_create_write_queue�sz_Transport._create_write_queuec
Cs�|jrt�d|j�dS|jdurb|j�|�t|j�tkr^d�|j�}|j�	�|j�|�dSzt
�|j|�}WnDty�d}Yn0t
y�}z|�|�WYd}~dSd}~00|t|�kr�|�||d��dS)Nz+ignoring write() to closing transport fd %ir+r)rr"r#rr�appendr0�IOV_MAX�join�clearr$�writer-rr/rX)r'r3Zall_datarSr4rrr
r]�s&


z_Transport.writecCs2|jr
dSd|_|��|jdur&dS|��dSr?)rr1rr/r7rrr
r2�s
z_Transport.closecCs|jSr6)rr7rrr
�get_protocol
sz_Transport.get_protocolcCs|jSr6)rr7rrr
�
is_closing
sz_Transport.is_closing)rr	cCst�dSr6rA)r'rrrr
�set_protocolsz_Transport.set_protocolcCs|��dSr6)r>r7rrr
�__del__sz_Transport.__del__)rrN)N)NN)&�__name__�
__module__�__qualname__rr�int�__annotations__�asyncio�AbstractEventLoop�Protocol�boolrr!r5r8r1r:r&r>r/rCrErJrKrOrDrTr@�bytesrXr]r2ZBaseProtocolr^r_r`ra�
__classcell__rrr(r
r3sP


��	! 
rc@seZdZdZdd�dd�ZdS)�SubprocessProtocolzBAn extension to asyncio.Protocol for use with SubprocessTransport.Nr*cCst�dS)z"Called when subprocess has exited.NrAr7rrr
�process_exitedsz!SubprocessProtocol.process_exited)rbrcrd�__doc__rnrrrr
rmsrmc@seZdZed�dd�ZdS)�
WindowSize)�valuecCst|d�|_t|d�|_dS)N�rows�cols)rrrrs)r'rqrrr
r!szWindowSize.__init__N)rbrcrdrr!rrrr
rpsrpcsVeZdZUdZdZded<dZded<dZded<ded	<ee	j
d
�dd��Zee	je	j
d
�dd��Z
dd�eed�dd�Zeedd�dd�Zddd�e	jeeeeded��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	Cs@z t�t�t��d��t��WSttfy6Yn0t��S�Nr)	r$r2�
pidfd_open�getpidrgZPidfdChildWatcher�AttributeErrorrZSafeChildWatcherrrrr
�_create_watcher:s
z#SubprocessTransport._create_watcher)rr	cCs:d}t||d�}|dur6t��}|�|�t|||�|S)NZ!_cockpit_transports_child_watcher)�getattrrtr}Zattach_loop�setattr)rZquarkZwatcherrrr
�_get_watcherDs
z SubprocessTransport._get_watcherF��reset�r�r	cCs(|jdur |jj|d�jdd�SdSdS)Nr��replace)�errors�)rx�get�decode)r'r�rrr
�
get_stderrPs
zSubprocessTransport.get_stderr)�pid�coder	cCs(||_t�d|j�|js$|j��dS)NzProcess exited with status %d)rur"r#rrrn)r'r�r�rrr
�_exitedVs
zSubprocessTransport._exited)�pty�windowzWindowSize | None)rrrr�r��kwargscs
dd��fdd�}�r|t��\|_}|dur6|�|�||d<tj|f|||dd�|��|_t�|�|j|j}	}
d|_n8tj|ftj	tj	|d�|��|_|jj
��}	|jj��}
|jj
dur�t||jj
���|_nd|_t��|||	|
�|�|��|jj|j�dS)Nr*cs$tttj��r t�dtjd�dSry)r�
SET_PDEATHSIG�signal�SIGTERM�fcntl�ioctl�termiosZ	TIOCSCTTYr�r�rr
�
preexec_fnrsz0SubprocessTransport.__init__.<locals>.preexec_fn�stderrT)�stdin�stdoutr�Zstart_new_session)r�r�r�)r$�openptyrv�set_window_size�
subprocess�Popenrwr2r�PIPEr��filenor�r��Spoolerrxr r!r�Zadd_child_handlerr�r�)r'rrrr�r�r�r�Z
session_fdrrr(r�r
r!hs6

��
��zSubprocessTransport.__init__)�sizer	c	Cs$t�|jtjt�d|j|j��dS)NZ2H4x)	r�r�rvr�Z
TIOCSWINSZ�struct�packrrrs)r'r�rrr
r��sz#SubprocessTransport.set_window_sizecCs|jjduSr6)rwr�r7rrr
rC�sz!SubprocessTransport.can_write_eofcCs|jj��d|_dSr9)rwr�r2rr7rrr
rD�sz"SubprocessTransport._write_eof_nowcCs|jjSr6)rwr�r7rrr
�get_pid�szSubprocessTransport.get_pidcCs|jSr6)rur7rrr
�get_returncode�sz"SubprocessTransport.get_returncode)�fdr	cCst�dSr6rA)r'r�rrr
�get_pipe_transport�sz&SubprocessTransport.get_pipe_transport)�sigr	cCsp|jdur t�d||jj�dSz&t�|jj|�t�d||jj�Wn$tyjt�d||jj�Yn0dS)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.)rur"r#rwr�r$�kill�ProcessLookupError)r'r�rrr
�send_signal�s
zSubprocessTransport.send_signalcCs|�tj�dSr6)r�r�r�r7rrr
�	terminate�szSubprocessTransport.terminatecCs|�tj�dSr6)r�r��SIGKILLr7rrr
r��szSubprocessTransport.killcCsz|jdurt�|j�d|_|jdurv|jjdurF|jj��d|j_z|��Wn"tytt�d|jj	�Yn0dS)Nzcan't kill %i due to EPERM)
rvr$r2rwr�r��PermissionErrorr"r#r�r7rrr
r>�s

zSubprocessTransport._close)&rbrcrdrorurfrvrw�staticmethodrgZAbstractChildWatcherr}rhr�rj�strr�rer�rmrrr!rpr�rCrDr�r��	Transportr�r�ZSignalsr�r�r�r>rlrrr(r
rt$s>
	��/rtcsNeZdZdZd
ejejeed��fdd�
Ze	d�dd	�Z
d
d�dd�Z�ZS)�StdioTransportz�A bi-directional transport that corresponds to stdin/out.

    Can talk to just about anything:
        - files
        - pipes
        - character devices (including terminals)
        - sockets
    rr)rrr�r�cst��||||�dSr6)r r!)r'rrr�r�r(rr
r!�szStdioTransport.__init__r*cCsdSr;rr7rrr
rC�szStdioTransport.can_write_eofNcCstd��dS)NzCan't write EOF to stdout)�RuntimeErrorr7rrr
rD�szStdioTransport._write_eof_now)rr)
rbrcrdrorgrhrirer!rjrCrDrlrrr(r
r��s	r�c@s�eZdZUdZejed<eed<ded<ejed�dd�Zd	d
�dd�Z	e
d
�d
d�Zdd�e
ed�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)rr�cCs@||_d|_g|_t�|�|_t�|jd�|�|j|j�dS)NrF)rr�r�r$�dupr%r=r5)r'rr�rrr
r!�szSpooler.__init__Nr*cCs^zt�|jd�}Wn(ty&YdSty:d}Yn0|dkrR|j�|�n|��dS)Ni r+)r$r,r�r-rr�rYr2rWrrr
r5s
zSpooler._read_readycCs,|jdkrdSt�|jgggd�gggfkS)NrFr)r��selectr7rrr
�	_is_readys
zSpooler._is_readyFr�r�cCs,|��r|��qd�|j�}|r(g|_|S)Nr+)r�r5r[r�)r'r��resultrrr
r�s
zSpooler.getcCs.|jdkr*|j�|j�t�|j�d|_dSr9)r�rr<r$r2r7rrr
r2!s
z
Spooler.closecCs|��dSr6)r2r7rrr
ra'szSpooler.__del__)rbrcrdrorgrhrfrer!r5rjr�rkr�r2rarrrr
r��s


	r�)%rorgrUZctypesr.r�Zloggingr$r�r�r�r�r��typingrrrZjsonutilrrZCDLLrr
rer�Z	getLoggerrbr"rZr�rrirmrprtr�r�rrrr
�<module>s6
e9