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 t |t js:J|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_eofasyncio Transport) rrrpathZlabel transport_rhosterrorZproblemrrrcreate_transport"s2      " (z$SocketStreamChannel.create_transportN) __name__ __module__ __qualname__payloadr-AbstractEventLooprr.r4rrrrrsrc@sTeZdZdZdZddddZedddZedd d d Ze j ee d d dZ dS)SubprocessStreamChannelr))spawnNN)rcCs |dSr)r,rrrrprocess_exitedIsz&SubprocessStreamChannel.process_exitedcCs<t|jtsJd|ji}|j}|dur8||d<|S)Nz exit-statusr)r) _transportrZget_returncodeZ get_stderr)rargsstderrrrr_get_close_argsLs  z'SubprocessStreamChannel._get_close_args)rrcCs6t|dtd}|dur2t|jts&J|j|dS)Nwindow)r rr)r=rZset_window_size)rrrArrr 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)defaultrAenvironrDrEcss|]}|ddVqdS)=N)split).0errr kr!z;SubprocessStreamChannel.create_transport..rz+invalid "environ" option for stream channelr)rGrAenvcwdr?pidzSpawned process args=%s pid=%ir$z access-deniedzFailed to spawn %s: %szinternal-error)r r r rr r subprocessZSTDOUTZDEVNULLPIPEdictosrIupdate ValueErrorrrZget_pidZ _ready_infor%r&FileNotFoundErrorPermissionErrorr'r(r+)rrrr>rCrQrGrArIr?rPr0rRr3rrrr4Zs:      z(SubprocessStreamChannel.create_transport) r5r6r7r8Z restrictionsr<rr@rBr-r9rr4rrrrr:Es r:)r-ZloggingrVrStypingrZchannelrrZjsonutilrrrr r r r r Z transportsrrrZ getLoggerr5r%rr:rrrrs ( &