a h@sddlZddlZddlZddlZddlmZddlmZmZddl m Z m Z m Z m Z mZmZmZmZddlmZmZmZeeZGdddeZGd d d eeZdS) N)Dict) ChannelErrorProtocolChannel)JsonDict JsonObjectget_boolget_enumget_int get_objectget_strget_strv)SubprocessProtocolSubprocessTransport WindowSizec@s&eZdZdZejeejdddZdS)SocketStreamChannelstreamloopoptionsreturnc s,d|vrd|vrtdddzd|vrZt|d}d|}|fdd|IdH\}}n\d|vrt|d}t|d d }d |d |}|fd d||IdH\}}n tdddtd|WnZty} z@td|| t | t rd} nd} t| t | d| WYd} ~ n d} ~ 00 |S)NZunixportprotocol-errorz-cannot specify both "port" and "unix" optionsmessagez Unix socket csSNrselfr;/usr/lib/python3.9/site-packages/cockpit/channels/stream.py+z6SocketStreamChannel.create_transport..addressZ localhostz TCP socket :csSrrrrrrr 3r!z7no "port" or "unix" or other address option for channelz$SocketStreamChannel: connected to %sz0SocketStreamChannel: connecting to %s failed: %s not-foundZ terminated) rr Zcreate_unix_connectionr Zcreate_connectionloggerdebugOSErrorinfo isinstanceConnectionRefusedErrorstr close_on_eof) rrrpathZlabel transport_rhosterrorZproblemrrrcreate_transport"s0      " (z$SocketStreamChannel.create_transportN) __name__ __module__ __qualname__payloadasyncioAbstractEventLooprZ Transportr2rrrrrsrc@sTeZdZdZdZddddZedddZedd d d Ze j ee d d dZ dS)SubprocessStreamChannelr))spawnNN)rcCs |dSr)r,rrrrprocess_exitedIsz&SubprocessStreamChannel.process_exitedcCs,d|ji}|j}|dur(||d<|S)Nz exit-statusr) _transportZget_returncodeZ get_stderr)rargsstderrrrr_get_close_argsLs  z'SubprocessStreamChannel._get_close_args)rrcCs&t|dtd}|dur"|j|dS)Nwindow)r rr<Zset_window_size)rrr@rrr do_optionsTsz"SubprocessStreamChannel.do_optionsrc st|d}t|dgdd}t|dd}t|ddd }t|d td}t|d g}|d kr`tj} n|d krptj} ntj } t t j } z| t dd|DWn tytddddYn0z>t|||||| || d} | } d| i|_td|| | WSty,} ztd| WYd} ~ nxd} ~ 0tyZ} ztd| WYd} ~ nJd} ~ 0ty} z(td|t| td| WYd} ~ n d} ~ 00dS)Nr:err)outignorerrZ directory.ptyF)defaultr@environrCrDcss|]}|ddVqdS)=N)split).0errr kr!z;SubprocessStreamChannel.create_transport..rz+invalid "environ" option for stream channelr)rFr@envcwdr>pidzSpawned process args=%s pid=%ir$z access-deniedzFailed to spawn %s: %szinternal-error)r r r rr r subprocessZSTDOUTZDEVNULLPIPEdictosrHupdate ValueErrorrrZget_pidZ _ready_infor%r&FileNotFoundErrorPermissionErrorr'r(r+)rrrr=rBrPrFr@rHr>rOr.rQr1rrrr2Zs:      z(SubprocessStreamChannel.create_transport) r3r4r5r6Z restrictionsr;rr?rAr7r8rr2rrrrr9Es r9)r7ZloggingrUrRtypingrZchannelrrZjsonutilrrrr r r r r Z transportsrrrZ getLoggerr3r%rr9rrrrs ( &