a hCY@s(ddlZddlZddlZddlZddlZddlZddlmZmZmZm Z m Z m Z m Z m Z ddlmZmZmZmZmZmZmZddlmZddlmZmZmZeeZejre dZ!e"dZ#Gd d d eZ$Gd d d eZ%Gd ddeZ&Gddde&ej'Z(Gddde&Z)Gddde&Z*dS)N)BinaryIOCallableClassVar Collection GeneratorMappingSequenceType) JsonError JsonObject JsonValue create_objectget_boolget_enumget_str)CockpitProblem)EndpointRouter RoutingRule_T_PcsleZdZUded<eddfdd Zeddd Zd eed d d Z eddddZ ddddZ Z S)ChannelRoutingRulezdict[str, list[Type[Channel]]]tablezCollection[Type[Channel]])router channel_typescs\t|i|_|D]}|j|jg}||q|jD]}|jddddq@dS)NcSs t|jSN)len restrictions)clsr 3/usr/lib/python3.9/site-packages/cockpit/channel.py5z-ChannelRoutingRule.__init__..T)keyreverse)super__init__r setdefaultpayloadappendvaluessort)selfrrrentry __class__r r!r')s  zChannelRoutingRule.__init__returncCs>i}|jD]*\}}g}|D]}||jq|||<q|Sr)ritemsextend capabilities)r-resultr)ZimplsZcapsimplr r r!r57s zChannelRoutingRule.capabilitieszCollection[tuple[str, object]])roptionsr2cCs@|D]6\}}||}|dur$dS|dur||krdSqdS)NFT)get)r-rr8r$Zexpected_valueZ our_valuer r r!check_restrictionsAs  z%ChannelRoutingRule.check_restrictionszChannel | Noner8r2cCsZ|jdusJ|d}t|ts&dS|j|gD] }||j|r4||jSq4dS)Nr))rr9 isinstancestrrr:r)r-r8r)rr r r! apply_ruleRs  zChannelRoutingRule.apply_ruleNcCsdSrr r-r r r!shutdown_szChannelRoutingRule.shutdown) __name__ __module__ __qualname____annotations__rr'r r5boolr:r>r@ __classcell__r r r/r!r&s   rc@s eZdZdS) ChannelErrorN)rArBrCr r r r!rGcsrGc@sZeZdZUdZdZdZeed<dZe ed<eZ e ed<eed<d ed <d Z d ed <ded<dZ ded<dZ ded<dZdZeed<ded<eed dddZeeed dddZdded d d!d"Zed d#d$d%Zd d&d'd(Zd d&d)d*Zd d&d+d,Zed d-d.d/Zed d-d0d1Zed d2d3d4Zeed d5d6d7Zed8d2d9d:Zed d;deeed?d@dAZ!d d&dBdCZ"ed&dDdEZ#d d&dFdGZ$dHdIZ%dedJdKZ&dfd d dLdMdNZ'eed2dOdPZ(eed2dQdRZ)eed2dSdTZ*dgd eedUdVdWZ+dXdYZ,d d&dZd[Z-e.j/d\d]Z0d^ed_<eed d`dadbZ1ed d-dcddZ2d S)hChanneli@i F _send_pingsr _out_sequence _out_window _ack_byteszset[asyncio.Task]_tasksNJsonObject | None _close_argsz ClassVar[str]r)r z&ClassVar[Sequence[tuple[str, object]]]rzClassVar[Sequence[str]]r5 is_binaryz codecs.IncrementalDecoder | Nonedecoder)commandmessager2cCs|dkrt|_t|d|_t|dddr0d|_t|ddgddu|_t|d d |_t|d d gddu|_ d|_ | | |np|d kr| n^|dkr|nL|dkr|n:|dkr||n&|dkr||n|dkr||dS)Nopenchannelz flow-controlF)defaultTz send-acksbytesgrouprWZbinaryrawreadydoneclosepingpongr8)setrMrrVrrIrrLrYrQrRZfreeze_endpointdo_opendo_readydo_donedo_closedo_pingdo_pong do_options)r-rSrTr r r! do_controls.       zChannel.do_control)rVrSrTr2c Cs|jdurdSzLz|||Wn6tyV}ztdt|d|WYd}~n d}~00Wn2ty}z||WYd}~n d}~00dS)Nprotocol-errorrT)rOrhr rGr=r] get_attrs)r-rVrSrTexcr r r!do_channel_controls ,zChannel.do_channel_controlz str | None)hostrY_messager2cCs<|jdurdS|durdS|dur0|j|kr0dS|dSr)rOrYrd)r-rnrYror r r!do_kills zChannel.do_killr;cCstdSrNotImplementedErrorr-r8r r r!raszChannel.do_openr1cCsdSrr r?r r r!rbszChannel.do_readycCsdSrr r?r r r!rcszChannel.do_donecCs |dSrr]r?r r r!rdszChannel.do_closerTr2cCstddddS)Nz not-supportedz)This channel does not implement "options"rj)rGr-rTr r r!rgszChannel.do_optionscCs||dSr) send_pongrvr r r!reszChannel.do_pingdatar2cCs|jr|jdt|ddS)NZack)rX)rL send_controlrr-ryr r r!send_ackszChannel.send_ack)rVryr2c Cs^|jdurdSz||s$||Wn2tyX}z||WYd}~n d}~00dSr)rOdo_datar|rGr]rk)r-rVryrlr r r!do_channel_datas  zChannel.do_channel_dataz bool | NonecCs~|dS)aHandles incoming data to the channel. Return value is True if the channel takes care of send acks on its own, in which case it should call self.send_ack() on `data` at some point. None or False means that the acknowledgement is sent automatically.Trtr{r r r!r}szChannel.do_data)kwargsr2cKs ||jfddi|dS)NrSr[)Z thaw_endpointrz)r-rr r r!r[sz Channel.readyfinal)ryrr2c Cs\|jdusJz|jj||dWStyV}ztdt|d|WYd}~n d}~00dS)Nrrirj)rRdecodeUnicodeDecodeErrorrGr=)r-ryrrlr r r!Z__decode_frames zChannel.__decode_framecCs(|jdur|jddd|jdddS)Nr#Trr\)rS)rR_Channel__decode_framerzr?r r r!r\s z Channel.donecCs |jduSr)rOr?r r r! is_closingszChannel.is_closingcCs||jdSr)Zshutdown_endpointrOr?r r r! _close_nowszChannel._close_nowcCs(|j||jdur$|js$|dSr)rMremoverOr)r-taskr r r! _task_dones zChannel._task_donecCs4|jdusJt|}|j|||j|S)zCreate a task associated with the channel. All tasks must exit before the channel can close. You may not create new tasks after calling .close(). N)rOasyncio create_taskrMaddadd_done_callbackr)r- coroutinenamerr r r!r s    zChannel.create_task) close_argsr2cCs*|jdurdS|pi|_|js&|dS)zRequests the channel to be closed. After you call this method, you won't get anymore `.do_*()` calls. This will wait for any running tasks to complete before sending the close message. N)rOrMr)r-rr r r!r]s   z Channel.closecCsX||j||jrL|jt|}|jtj|tjkrF|jd|d||_|j|jkS)aSend binary data and handle book-keeping for flow control. The flow control is "advisory". The data is sent immediately, even if it's larger than the window. In general you should try to send packets which are approximately Channel.BLOCK_SIZE in size. Returns True if there is still room in the window, or False if you should stop writing for now. In that case, `.do_resume_send()` will be called later when there is more room. Be careful with text channels (i.e. without binary="raw"): you are responsible for ensuring that @data is valid UTF-8. This isn't validated here for efficiency reasons. r^)rSsequence) Zsend_channel_datarVrIrJrrH BLOCK_SIZErzrK)r-ryZ out_sequencer r r! send_bytes$szChannel.send_bytescCs<|jr||S|jdur,tddd|_|||S)aDSend data and transparently handle UTF-8 for text channels Use this for channels which can be text, but are not guaranteed to get valid UTF-8 frames -- i.e. multi-byte characters may be split across frames. This is expensive, so prefer send_text() or send_bytes() wherever possible. Nzutf-8strict)errors)rQrrRcodecsgetincrementaldecoder send_textrr{r r r! send_data=s   zChannel.send_datacCs||S)zSend UTF-8 string data and handle book-keeping for flow control. Similar to `send_bytes`, but for text data. The data is sent as UTF-8 encoded bytes. )rencoder{r r r!rNszChannel.send_text)msgrr2cKs |jt||d}||S)N ) json_encoderrrr)r-rrZprettyr r r! send_jsonUszChannel.send_jsoncCs@|jstd|jdS|dtj|_|j|jkr<|dS)NzGot wild pong on channel %sr) rIloggerZwarningrVrH SEND_WINDOWrKrJdo_resume_sendrvr r r!rfYs  zChannel.do_pongcCsdS)zs,($    = f