grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026a q©jùEã@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl mZmZmZddlmZmZe d¡jZeddœdd„ZdZe e¡Zd ZGd d „d ejƒ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Úprctls ricsÚeZdZUdZeeed<ejed<ej ed<ded<eed<eed<e ed <e ed <e ed <d Z e 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!6s    z_Transport.__init__©r c Csât d||j|j¡zt |jtj¡}Wnfty<YdSt yŽ}z<|j rb|j t j 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ÚBlockingIOErrorr rÚerrnoZEIOÚabortÚlenZ data_receivedÚ _close_readerZ eof_receivedÚclose)r'ÚdataÚexcZ keep_openr r r Ú _read_readyQs$  $  z_Transport._read_readycCs|jS©N)r©r'r r r Ú is_readingjsz_Transport.is_readingcCs| ¡d|_dS©Nr)Ú pause_readingrr7r r r r1msz_Transport._close_readercCs|jr|j |j¡d|_dS©NF)rrÚ remove_readerrr7r r r r:qsz_Transport.pause_readingcCs,|js(|jdkr(|j |j|j¡d|_dS)NrT)rrrÚ add_readerr5r7r r r r&vsz_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_eofcCs@|jr J‚d|_|jdur0t 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 Ú —r+z3_Transport.get_write_buffer_size..)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 cCs,|dus|dksJ‚|dus(|dks(J‚dS©Nrr )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|¡|jdusJ‚zt |j|j¡}WnDtyDd}Yn0tyr}z| |¡WYd}~dSd}~00t d|¡|rÔ|j  ¡}t |ƒ|krºt d¡|j  ||d…¡qÔ|t |ƒ8}t d|¡q€|j�st d¡|  ¡|j �rt 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#rr$Úwritevrr-r r/Úpopleftr0Ú appendleftr@rrDr)r'Ún_bytesr4rGr r r Ú _write_ready£s4          z_Transport._write_readycCs,|jdur(|j ¡|j |j¡d|_dSr6)rrZresume_writingrZ remove_writerrr7r r r r@Äs  z_Transport._remove_write_queue)r3r cCsLt d||j¡|jdusJ‚|j |j|j¡t |f¡|_|j   ¡dS)Nz!%s creating write queue for fd %s) r"r#rrrZ add_writerrUÚ collectionsÚdequerZ pause_writing©r'r3r r r Ú_create_write_queueÊs z_Transport._create_write_queuec Csæ|jrt d|j¡dS|jr"J‚|jdurl|j |¡t|jƒtkrhd  |j¡}|j  ¡|j |¡dSzt   |j|¡}WnDt y”d}Yn0tyÂ}z| |¡WYd}~dSd}~00|t|ƒkrâ| ||d…¡dS)Nz+ignoring write() to closing transport fd %ir+r)rr"r#rrrÚappendr0ÚIOV_MAXÚjoinÚclearr$Úwriter-r r/rY)r'r3Zall_datarTr4r 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_closingsz_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/rCrErJrKrPrDrUr@ÚbytesrYr^r2Z BaseProtocolr_r`rarbÚ __classcell__r r r(r r'sP    üü !  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_exited sz!SubprocessProtocol.process_exited)rcrdreÚ__doc__ror r r r rn srnc@seZdZedœdd„ZdS)Ú WindowSize)ÚvaluecCst|dƒ|_t|dƒ|_dS)NÚrowsÚcols)rrsrt)r'rrr r r r!s zWindowSize.__init__N)rcrdrerr!r r r r rqsrqcs(eZdZUdZdZded<dZded<dZded<ded <d d œee d œd d„Z dddœdd„Z d ddœe j eee ededœ‡fdd„Zeddœdd„Zedœdd„Zddœdd„Zedœd d!„Zddœd"d#„Zee jd$œd%d&„Zejdd'œd(d)„Zddœd*d+„Zddœd,d-„Zddœd.d/„Z ‡Z!S)0Ú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Ú_pty_fdzsubprocess.Popen[bytes] | NoneÚ_processÚ _returncodezSpooler | NoneÚ_stderrF©Úreset©r{r cCs(|jdur |jj|d�jdd�SdSdS)NrzÚreplace)ÚerrorsÚ)ryÚgetÚdecode)r'r{r r r Ú get_stderr-s zSubprocessTransport.get_stderrzsubprocess.Popen[bytes])Úprocessr c süddœ‡fdd„ ‰ddœ‡‡‡‡fdd„ }ttddœ‡‡‡fdd„ }zt ˆj¡‰ˆj ˆ|¡Wn”ttfyöd }tˆj|dƒ}|duräz t   ¡}Wn.tyÈ}zt d ƒ|‚WYd}~n d}~00|  ˆj¡t ˆj||ƒ| ˆj|¡Yn0dS) Nr*cs2tˆjtƒsJ‚t dˆj¡ˆjs.ˆj ¡dS)NzProcess exited with status %d)Ú isinstancerrnr"r#rxrror r7r r Ú flag_exit4sz1SubprocessTransport.watch_exit..flag_exitcsjt ˆjd¡\}}|ˆjks J‚zt |¡ˆ_WntyH|ˆ_Yn0ˆj ˆ¡t ˆ¡ˆƒdSrO) r$ÚwaitpidÚpidÚwaitstatus_to_exitcoderxÚ ValueErrorrr<r2)r‡Ústatus©r…Zpidfdrƒr'r r Ú pidfd_ready:s    z3SubprocessTransport.watch_exit..pidfd_ready)r‡Úcoder csˆj|ksJ‚|ˆ_ˆƒdSr6)r‡rx)r‡r�)r…rƒr'r r Úchild_watch_firedEsz9SubprocessTransport.watch_exit..child_watch_firedZ!_cockpit_transports_child_watcherz&pidfd support required on Python 3.14+)rfr$Ú pidfd_openr‡rr=ÚAttributeErrorr ÚgetattrrhZSafeChildWatcherÚ RuntimeErrorZ attach_loopÚsetattrZadd_child_handler)r'rƒrŒrŽZquarkZwatcherÚer r‹r Ú watch_exit3s"      zSubprocessTransport.watch_exit)ÚptyÚwindowzWindowSize | None)rrrr–r—Úkwargsc  sddœ‡fdd„ }ˆr|t ¡\|_}|dur6| |¡||d<tj|f|||ddœ|¤Ž|_t |¡|j|j} } d|_nPtj|ftj tj |dœ|¤Ž|_|jj s¨J‚|jj s´J‚|jj   ¡} |jj   ¡} |jj durît||jj   ¡ƒ|_nd|_tƒ ||| | ¡| |j¡dS)Nr*cs$tttjƒˆr t dtjd¡dSrO)rÚ SET_PDEATHSIGÚsignalÚSIGTERMÚfcntlÚioctlÚtermiosZ TIOCSCTTYr ©r–r r Ú preexec_fnks z0SubprocessTransport.__init__..preexec_fnÚstderrT)ÚstdinÚstdoutr Zstart_new_session)r¢r£r )r$ÚopenptyrvÚset_window_sizeÚ subprocessÚPopenrwr2rÚPIPEr¢r£Úfilenor¡ÚSpoolerryr r!r•) r'rrrr–r—r˜r Z session_fdrrr(rŸr r!as:  þþ ÿÿ     zSubprocessTransport.__init__)Úsizer c Cs2|jdusJ‚t |jtjt d|j|j¡¡dS)NZ2H4x) rvrœr�ržZ TIOCSWINSZÚstructÚpackrsrt)r'r«r r r r¥�sz#SubprocessTransport.set_window_sizer*cCs|jdusJ‚|jjduSr6)rwr¢r7r r r rC“sz!SubprocessTransport.can_write_eofcCs4|jdusJ‚|jjdusJ‚|jj ¡d|_dSr9)rwr¢r2rr7r r r rD—s z"SubprocessTransport._write_eof_nowcCs|jdusJ‚|jjSr6)rwr‡r7r r r Úget_pid�szSubprocessTransport.get_pidcCs|jSr6)rxr7r 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 cCs~|jdusJ‚|jdur.t d||jj¡dSz&t |jj|¡t d||jj¡Wn$tyxt 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.)rwrxr"r#r‡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)"rcrdrerprvrgrwrxrkÚstrr‚r•rhrirnrrr!rqr¥rCrDrfr®r¯Ú Transportr±ršZSignalsrµr¶r³r>rmr r r(r rus6    3úù.rucsNeZdZdZd ejejeedœ‡fdd„ Ze dœdd „Z d dœd d „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)r’r7r r r rDäszStdioTransport._write_eof_now)rr) rcrdrerprhrirjrfr!rkrCrDrmr r r(r r»Ôs r»c@sŒeZdZUdZejed<eed<ded<ejedœdd„Zd d œd d „Z e d œd d„Z ddœ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Ú_fdz list[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-r r½rZr2rXr r r r5ýs   zSpooler._read_readycCs,|jdkrdSt |jgggd¡gggfkS)NrFr)r¼Úselectr7r r r Ú _is_ready s zSpooler._is_readyFrzr|cCs,| ¡r| ¡qd |j¡}|r(g|_|S)Nr+)rÀr5r\r½)r'r{Úresultr r r r€s   z Spooler.getcCs.|jdkr*|j |j¡t |j¡d|_dSr9)r¼rr<r$r2r7r r r r2s  z Spooler.closecCs | ¡dSr6)r2r7r r r rbszSpooler.__del__)rcrdrerprhrirgrfr!r5rkrÀrlr€r2rbr r r r rªès    rª)%rprhrVZctypesr.rœZloggingr$r¿ršr¬r¦ržÚtypingrrrZjsonutilrrZCDLLrr rfr™Z getLoggerrcr"r[rºrrjrnrqrur»rªr r r r Ús6  e=