ó
    ¡7�jžX  ã                   óò  • S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKJr  S SKJrJrJrJrJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJrJr  S S	KJr  S S
K J!r!  S SK"J#r#J$r$  S SK%J&r&  S SK'J(r(J)r)J*r*  S SK+J,r,  S SK-J.r.J/r/  S SK0J1r1J2r2  S SK3J4r4  \Rj                  " S5      r6S\4S jr7S\\8   4S jr9 " S S\)5      r:SSSS.\Rv                  Er; " S S\25      r< " S S\Rz                  5      r>S \8S\?\\8   \\8   4   4S! jr@S"\\8   S#\8S$\S%\8S\?\\8   \\8   4   4
S& jrAS"\\8   S'\\8   S\?\\8   \\8   4   4S( jrB " S) S*\,5      rC " S+ S,\15      rDS0S- jrES0S. jrF\GS/:X  a  \F" 5         gg)1é    N)ÚPath)ÚDictÚIterableÚLiteralÚOptionalÚSequence)Ú	polyfills)Úferny)Ú
bootloader)ÚBridgeBeibootHelper)Úparse_os_releaseÚsetup_logging)ÚChannelRoutingRule)ÚPackagesChannel)Ú
JsonObjectÚget_str)Úsupported_oses)ÚPackagesÚPackagesLoaderÚpatch_libexecdir)ÚPeer)ÚCockpitProblemÚCockpitProtocolError)ÚRouterÚRoutingRule)ÚStdioTransportzcockpit.beibootÚreturnc                  óî  • [         R                  R                  [        R                  5      S-  n U R                  5       n[        R                  R                  S5      nUc  [        R                  R                  S5      n[        R                  " USS9  [        US5      n[        R                  SU5         UR                  5       U:w  a  [        R                  S5        [        eUR!                  5       R"                  S	-  (       d  [        R                  S
5        [        e U$ ! [$        [        4 a;    [        R                  S5        UR'                  U5        UR)                  S5         U$ f = f)zÈCreate askpass executable

We need this for the flatpak: ssh and thus the askpass program run on the host (via flatpak-spawn),
not the flatpak. Thus we cannot use the shipped cockpit-askpass program.
zinteraction_client.pyÚXDG_CACHE_HOMEz~/.cacheT)Úexist_okzcockpit-client-askpasszChecking if %s exists...z.  ... it exists but is not the same version...é@   z;  ... it has the correct contents, but is not executable...z  ... writing contents.iÀ  )Ú	importlibÚ	resourcesÚfilesr
   Ú__name__Ú
read_bytesÚosÚenvironÚgetÚpathÚ
expanduserÚmakedirsr   ÚloggerÚdebugÚ
ValueErrorÚstatÚst_modeÚFileNotFoundErrorÚwrite_bytesÚchmod)Úsrc_pathÚsrc_dataÚxdg_cache_homeÚ	dest_paths       Ú1/usr/lib/python3/dist-packages/cockpit/beiboot.pyÚensure_ferny_askpassr:   1   s,  € ô ×"Ñ"×(Ñ(¬¯©Ó8Ð;RÑR€HØ×"Ñ"Ó$€Hô —Z‘Z—^‘^Ð$4Ó5€NØÑÜŸ™×+Ñ+¨JÓ7ˆÜ‡K‚K�¨Ò.Ü�^Ð%=Ó>€Iä
‡L�LÐ+¨YÔ7ð
Ø×ÑÓ! XÓ-Ü�L‰LÐIÔJÜÐØ�~‰~Ó×'Ñ'¨%×/Ü�L‰LÐVÔWÜÐð 0ð Ðøô œzÐ*ó Ü�‰Ð.Ô/Ø×Ñ˜hÔ'Ø�‰˜ÕàÐðús   Â:A,D) Ä)AE4Å3E4c               #   óì   #   • [         R                  " 5        HW  n U R                   HD  nUR                  S;   d  M  [	        UR
                  [        5      (       d  M6  UR
                  v •  MF     MY     g 7f)N)úpath-existsúpath-not-exists)r   Úload_manifestsÚ
conditionsÚnameÚ
isinstanceÚvalueÚstr)ÚmanifestÚ	conditions     r9   Úget_interesting_filesrF   S   sS   é € Ü"×1Ò1Ö3ˆØ!×,Ô,ˆIØ�~‰~Ð!CÕCÌ
ÐS\×SbÑSbÔdg×HhÓHhØ—o‘oÔ%ó -ò 4ùs   ‚6A4¼A4ÁA4c                   óX   • \ rS rSr% \\\4   \S'   S\S\S\4S jr	S\\\4   4S jr
Srg	)
ÚProxyPackagesLoaderéZ   Úfile_statusrE   rB   r   c                 ó¼   • [        U[        5      (       d   eX R                  ;   d   eUS:X  a  U R                  U   $ US:X  a  U R                  U   (       + $ [        e)Nr<   r=   )rA   rC   rJ   ÚKeyError)ÚselfrE   rB   s      r9   Úcheck_conditionÚ#ProxyPackagesLoader.check_condition]   sb   € Ü˜%¤×%Ñ%Ð%Ð%Ø×(Ñ(Ó(Ð(Ð(à˜Ó%Ø×#Ñ# EÑ*Ð*ØÐ+Ó+Ø×'Ñ'¨Ñ.Ô.Ð.äˆNó    c                 ó   • Xl         g ©N©rJ   )rM   rJ   s     r9   Ú__init__ÚProxyPackagesLoader.__init__h   s   € Ø&ÕrP   rS   N)r%   Ú
__module__Ú__qualname__Ú__firstlineno__r   rC   ÚboolÚ__annotations__ÚobjectrN   rT   Ú__static_attributes__© rP   r9   rH   rH   Z   s>   ‡ Ø�c˜4�i‘Ó ð	¨ð 	°Vð 	Àô 	ð' D¨¨d¨¡O÷ 'rP   rH   zŠ
    import os
    def report_exists(files):
        command('cockpit.report-exists', {name: os.path.exists(name) for name in files})
    zþ
    import os
    def check_os_release(_argv):
        try:
            with open('/etc/os-release') as f:
                command('cockpit.check-os-release', f.read())
        except OSError:
                command('cockpit.check-os-release', "")
    z³
    import os
    def force_exec(argv):
        try:
            os.execvp(argv[0], argv)
        except OSError as e:
            command('cockpit.fail-no-cockpit', str(e))
    )Úreport_existsÚcheck_os_releaseÚ
force_execc                   óX   ^ • \ rS rSr% S\S'   S\4U 4S jjrS\SS4S jrSS	 jr	S
r
U =r$ )ÚDefaultRoutingRuleé‡   zPeer | NoneÚpeerÚrouterc                 ó$   >• [         TU ]  U5        g rR   )ÚsuperrT   )rM   re   Ú	__class__s     €r9   rT   ÚDefaultRoutingRule.__init__Š   s   ø€ Ü‰Ñ˜Õ rP   Úoptionsr   c                 ó   • U R                   $ rR   )rd   )rM   rj   s     r9   Ú
apply_ruleÚDefaultRoutingRule.apply_rule�   s   € Ø�y‰yÐrP   c                 óT   • U R                   b  U R                   R                  5         g g rR   )rd   Úclose©rM   s    r9   ÚshutdownÚDefaultRoutingRule.shutdown�   s   € Ø�9‰9Ñ Ø�I‰I�O‰OÕð !rP   r]   ©r   N)r%   rV   rW   rX   rZ   r   rT   r   rl   rq   r\   Ú__classcell__©rh   s   @r9   rb   rb   ‡   s2   ø‡ Ø
Óð!˜v÷ !ð *ð °ô ÷ò rP   rb   c            
       ó€   • \ rS rSr% Sr\\S'   S\S\\   4S jr	S\S\S\S	\\   4S
 jr
S\S\S\\   S\S	S4
S jrSrg)ÚAuthorizeResponderé•   )zferny.askpassúcockpit.report-existsúcockpit.fail-no-cockpitúcockpit.check-os-releasere   Úbasic_passwordc                 ó.   • Xl         X l        US LU l        g rR   )re   r|   Úhave_basic_password)rM   re   r|   s      r9   rT   ÚAuthorizeResponder.__init__™   s   € ØŒØ,ÔØ#1¸Ð#=ˆÕ rP   ÚmessagesÚpromptÚhintr   c           	   ƒ   ó”  #   • [         R                  SX!U5        U R                  (       aL  SUR                  5       ;   a8  U R                  b+  [         R                  SU5        U R                  nS U l        U$ US:X  a  g [
        R                  " SU5      n[
        R                  " SU5      n0 nU(       ac  U(       a\  UR                  S5      nUS:X  a  [         R                  S	U5        g
U SUR                  S5       S3US'   UR                  S5      US'   [        R                  " 5        S[        R                  " 5        3n	SU	 3n
U
S-   [        R                  " UR                  5       5      R                  5       -   nU R                  R                   " U4S UUUSS.UD6I S h  v•N nUR#                  U
5      (       d  [%        SU SU
 35      eUR'                  U
5      R)                  5       n[        R*                  " UR                  5       5      R                  5       n[         R                  S[-        U5      5        U$  N�7f)Nz3AuthorizeResponder: prompt %r, messages %r, hint %rz	password:z=AuthorizeResponder: sending Basic auth password for prompt %rÚnonez$\n(\w+) key fingerprint is ([^.]+)\.zauthenticity of host '([^ ]+) é   z	127.0.0.1z,auto-accepting fingerprint for 127.0.0.1: %sÚyesÚ z login-datazhost-keyé   ÚdefaultÚ-zX-Conversation F)Útimeoutr€   r�   r‚   ÚechozAuthorizeResponder: response z does not match challenge zReturning a %d chars response)r-   r.   r~   Úlowerr|   ÚreÚsearchÚgroupr'   ÚgetpidÚtimeÚbase64Ú	b64encodeÚencodeÚdecodere   Úrequest_authorizationÚ
startswithr   ÚremoveprefixÚstripÚ	b64decodeÚlen)rM   r€   r�   r‚   ÚreplyÚfp_matchÚ
host_matchÚargsÚhostnameÚchallenge_idÚchallenge_prefixÚ	challengeÚresponseÚb64s                 r9   Ú
do_askpassÚAuthorizeResponder.do_askpassž   s  é € Ü�‰ÐJÈFÐ^bÔcà×#×#¨°v·|±|³~Ó(Eð ×"Ñ"Ñ.Ü—‘Ð\Ð^dÔeØ×+Ñ+�Ø&*�Ô#Ø�à�6‹>ð ô —9’9ÐDÀfÓMˆä—Y’YÐ@À&ÓIˆ
ØˆÞž
Ø!×'Ñ'¨Ó*ˆHà˜;Ó&Ü—‘ÐKÈZÔXØð
 #+ ¨1¨X¯^©^¸AÓ->Ð,?¸{ÐKˆD�Ñà&Ÿn™n¨QÓ/ˆD�‰OäŸ)š)›+˜ a¬¯	ª	« }Ð5ˆØ,¨\¨NÐ;ÐØ$ sÑ*¬V×-=Ò-=¸f¿m¹m»oÓ-N×-UÑ-UÓ-WÑWˆ	ØŸ™×:Ò:¸9ð CØCGØDLØBHØ@DØ@EñCð >BñC÷ Cˆð ×"Ñ"Ð#3×4Ñ4Ü&Ø/°¨zÐ9SÐTdÐSeÐfóhð hà×#Ñ#Ð$4Ó5×;Ñ;Ó=ˆÜ×#Ò# C§J¡J£LÓ1×8Ñ8Ó:ˆÜ�‰Ð4´c¸(³mÔDØˆñCùs   ‚F&IÆ(IÆ)BIÚcommandr    ÚfdsÚstderrNc              ƒ   óž  ^#   • [         R                  SXU5        US:X  ad  Uu  n[        [        U5      S9U R                  l        U R                  R                  R                  S[        U R                  [        /5      5        US:X  a  [        SUS   S9eUS:X  Gao  [        US   5      m[         R                  S	T5        [         R                  S
[        5        [         HC  n[        U4S jUR                  5        5       5      (       d  M-  [         R                  SU5          g    [         R                  ST5         [        S5       n[        UR!                  5       5      nS S S 5        TR'                  S5      WR'                  S5      :X  a;  TR'                  S5      UR'                  S5      :X  a  [         R                  SU5        g TR'                  STR'                  SS5      5       STR'                  SS5       3n
[        SU
S9eg ! , (       d  f       N¯= f! ["         a   n	[         R%                  SU	5         S n	A	g S n	A	ff = f7f)NzGot ferny command %s %s %sry   )Úloaderr   rz   z
no-cockpit)Úmessager{   z'cockpit.check-os-release: remote OS: %rz,cockpit.check-os-release: supported OSes: %rc              3   óP   >#   • U  H  u  pTR                  U5      U:H  v •  M     g 7frR   )r)   )Ú.0ÚkÚvÚ	remote_oss      €r9   Ú	<genexpr>Ú7AuthorizeResponder.do_custom_command.<locals>.<genexpr>õ   s!   øé € ÐHº±°�y—}‘} QÓ'¨1Ö,ºùs   ƒ#&z8cockpit.check-os-release: remote matches supported OS %rz$cockpit.check-os-release: remote: %rz/etc/os-releasezIfailed to read local /etc/os-release, skipping OS compatibility check: %sÚIDÚ
VERSION_IDz7cockpit.check-os-release: remote OS matches local OS %rÚNAMEÚ?r‡   Ú )Úunsupported)r-   r.   r   rH   re   ÚpackagesÚrouting_rulesÚinsertr   r   r   r   r   ÚallÚitemsÚopenÚreadÚOSErrorÚwarningr)   )rM   r©   r    rª   r«   rJ   ÚosinfoÚfÚthis_osÚer»   r³   s              @r9   Údo_custom_commandÚ$AuthorizeResponder.do_custom_commandâ   sÞ  øé € Ü�‰Ð1°7À&ÔIàÐ-Ó-Ø‰LˆKä#+Ô3FÀ{Ó3SÑ#TˆD�K‰KÔ Ø�K‰K×%Ñ%×,Ñ,¨QÔ0BÀ4Ç;Á;ÔQ`ÐPaÓ0bÔcàÐ/Ó/Ü  °t¸A±wÑ?Ð?àÐ0Ô0Ü(¨¨a©Ó1ˆIÜ�L‰LÐBÀIÔNÜ�L‰LÐGÌÔXç(�äÔH¸¿¹¼ÓH×HÓHÜ—L‘LÐ![Ð]cÔdÙñ	 )ô �L‰LÐ?ÀÔKðÜÐ+Ô,°Ü.¨q¯v©v«xÓ8�G÷ -ð �}‰}˜TÓ" g§k¡k°$Ó&7Ó7¸I¿M¹MÈ,Ó<WÐ[b×[fÑ[fÐgsÓ[tÓ<tÜ—‘ÐVÐX_Ô`Øà&Ÿ]™]¨6°9·=±=ÀÀsÓ3KÓLÐMÈQÈyÏ}É}Ð]iÐkmÓOnÐNoÐpˆKÜ  ¸;ÑGÐGð3 1÷ -Õ,ûäó Ü—‘ÐjÐlmÔnÜûðüs[   ƒD	IÄ0IÅH  ÅHÅ&H  Å.B!IÈ
HÈH  ÈIÈH  È 
I
È*IÉ IÉI
É
I)r|   r~   re   )r%   rV   rW   rX   Úcommandsr   rZ   r   rC   rT   r§   ÚtupleÚlistÚintrÉ   r\   r]   rP   r9   rw   rw   •   sƒ   ‡ Øp€HØƒNð>˜vð >°xÀ±}ô >ð
B¨ð B°cð BÀð BÈÐRUÉô BðH%H¨sð %H¸%ð %HÀdÈ3Áið %HÐY\ð %HÐae÷ %HrP   rw   Úcommentc                 ó   • SSSU  34S4$ )NÚpython3z-icz# r]   r]   )rÏ   s    r9   Úpython_interpreterrÒ   
  s   € Ø�u  7 )˜nÐ-¨rÐ1Ð1rP   ÚcmdÚdestÚssh_askpassÚssh_optsc                 óF  • UR                  S5      u  pEnUR                  5       (       aN  UR                  S5      (       d8  UR                  S5      (       a  UR                  S5      (       a  USS nSUSU/nOSU/nS/UQUQ[        R
                  " U 5      P7S	U< 3S
S44$ )NÚ:Ú[Ú]r…   éÿÿÿÿz-pz--ÚsshzSSH_ASKPASS=z	DISPLAY=xzSSH_ASKPASS_REQUIRE=force)Ú
rpartitionÚisdigitÚendswithr˜   ÚshlexÚjoin)rÓ   rÔ   rÕ   rÖ   ÚhostÚ_ÚportÚdestinations           r9   Úvia_sshræ     s¹   € Ø—O‘O CÓ(�M€DˆTà‡|�|‡~�~˜dŸm™m¨C×0Ñ0à�?‰?˜3×Ñ D§M¡M°#×$6Ñ$6Ø˜˜"�:ˆDØ˜T 4¨Ð.‰à˜T�lˆð 	ðØðØ&ðÜ(-¯
ª
°3«ñð �{‘oÐ&ð 	Ø#ððð rP   Úenvc                 ó&   • SS/S U 5       QU Q7S4$ )Nzflatpak-spawnz--hostc              3   ó,   #   • U  H
  nS U 3v •  M     g7f)z--env=Nr]   )r°   Úkvs     r9   r´   Ú flatpak_spawn.<locals>.<genexpr>'  s   é € Ð	&¢#˜BˆF�2�$�-¢#ùs   ‚r]   r]   )rÓ   rç   s     r9   Úflatpak_spawnrì   $  s2   € à˜ðá	&¡#Ó	&ðð 
ñðð	ð rP   c                   ó´   ^ • \ rS rSr% S\S'   S\S\S\R                  4U 4S jjr	SS
 jr
SS jrSS jrS\\   S\\   SS	4S jrSS jrS\SS	4S jrSrU =r$ )ÚSshPeeri-  zMLiteral["always"] | Literal["never"] | Literal["supported"] | Literal["auto"]Úmodere   rå   r    c                 óâ   >• X l         UR                  U l        [        R                  " 5       U l        [        U R                  R                  5      S-  U l        S U l        [        TU ])  U5        g )Nzuser-known-hosts)rå   Úremote_bridgeÚtempfileÚTemporaryDirectoryÚtmpdirr   r@   Úknown_hosts_filer|   rg   rT   )rM   re   rå   r    rh   s       €r9   rT   ÚSshPeer.__init__0  sY   ø€ Ø&ÔØ!×/Ñ/ˆÔÜ×1Ò1Ó3ˆŒÜ $ T§[¡[×%5Ñ%5Ó 6Ð9KÑ KˆÔØ,0ˆÔÜ‰Ñ˜Õ rP   r   Nc              ƒ   ó¾   #   • [         R                  R                  S5      (       a  U R                  5       I S h  v•N   g U R	                  5       I S h  v•N   g  N N7f)Nz/.flatpak-info)r'   r*   ÚexistsÚconnect_from_flatpakÚconnect_from_bastion_hostrp   s    r9   Údo_connect_transportÚSshPeer.do_connect_transport8  sE   é € ä�7‰7�>‰>Ð*×+Ñ+Ø×+Ñ+Ó-×-Ñ-à×0Ñ0Ó2×2Ñ2ñ .á2ùs!   ‚8AºA»AÁAÁAÁAc              ƒ   óÖ   #   • [        S5      u  pU R                  S:w  a   [        XR                  [        5       5      u  p[	        X5      u  pU R                  X5      I S h  v•N   g  N7f)Núcockpit-bridgeÚ	localhost)rÒ   rå   ræ   r:   rì   Úboot)rM   rÓ   rç   s      r9   rù   ÚSshPeer.connect_from_flatpak?  sX   é € ä%Ð&6Ó7‰ˆð ×Ñ˜{Ó*ä˜s×$4Ñ$4Ô6JÓ6LÓM‰HˆCä  Ó*‰ˆà�i‰i˜Ó!×!Ó!ùs   ‚AA)Á!A'Á"A)c              ƒ   óž  #   • S nSS/nU R                   R                  S5      I S h  v•N n[        US5      nUR                  S5      (       ax  [        R
                  " USS  5      R                  5       nUR                  S5      u  pgnUR                  S5      u  p‡U l        U(       a  [        R                  S	U5        US
U/-  nU R                  c  USS/-  n[        S5      u  pš[        S5      n[        U[        5      (       d   e[        U5      nUR!                  5       (       d  [        R#                  SU5        [$        R&                  " S5      nUb
  USSU 3/-  nUb0  U R(                  R+                  U5        USSU R(                  < 3/-  n[-        X�R.                  U/UQ76 u  pšU R1                  Xš5      I S h  v•N   g  GN¡ N7f)Nz-ozNumberOfPasswordPrompts=1Ú*r¥   zBasic é   Ú rØ   z,got username %s and password from Basic authz-lzPasswordAuthentication=norþ   z${libexecdir}/cockpit-askpassz+Could not find cockpit-askpass helper at %rÚCOCKPIT_SSH_KNOWN_HOSTS_FILEzGlobalKnownHostsFile=zUserKnownHostsfile=)re   Úrequest_authorization_objectr   r˜   r“   r›   r–   Ú	partitionr|   r-   r.   rÒ   r   rA   rC   r   rø   Úerrorr'   Úgetenvrõ   Ú
write_textræ   rå   r   )rM   Úknown_hostsr    Úauthr¥   ÚdecodedÚuser_passwordrã   ÚuserrÓ   rç   ÚaskpassrÕ   Úenv_known_hostss                 r9   rú   Ú!SshPeer.connect_from_bastion_hostL  sÆ  é € ØˆàÐ1Ð2ˆð —[‘[×=Ñ=¸cÓB×BˆÜ˜4 Ó,ˆà×Ñ˜x×(Ñ(Ü×&Ò& x°° |Ó4×;Ñ;Ó=ˆGØ,3×,=Ñ,=¸dÓ,CÑ)ˆM˜kØ+8×+BÑ+BÀ3Ó+GÑ(ˆD�TÔ(ÞÜ—‘ÐKÈTÔRØ˜˜t˜Ñ$�à×ÑÑ&Ø�TÐ6Ð7Ñ7ˆDô &Ð&6Ó7‰ˆô #Ð#BÓCˆÜ˜'¤3×'Ñ'Ð'Ð'Ü˜7“mˆØ×!Ñ!×#Ñ#Ü�L‰LÐFÈÔPäŸ)š)Ð$BÓCˆØÑ&Ø�TÐ2°?Ð2CÐDÐEÑEˆDàÑ"Ø×!Ñ!×,Ñ,¨[Ô9Ø�TÐ0°×1FÑ1FÑ0IÐJÐKÑKˆDÜ˜3× 0Ñ 0°+ÐEÀÒE‰ˆà�i‰i˜Ó!×!Ñ!òC CñB 	"ùs"   ‚%G§G¨FGÇGÇGÇGrÓ   rç   c              ƒ   óœ  #   • [        U 5      n[        R                  " [        U R                  U R
                  5      U/5      n[        R                  SX5        U R                  XUSS9I S h  v•N nU R                  S:X  a  SS/44/nOHU R                  S:X  a  SS/44/nO0U R                  S	:X  a  SS/44S
/ 44/nOU R                  S:X  d   e/ n[        R                  " / UQS[        [        5       5      /4PUR                  Q[        S9nUR!                  UR#                  5       5        UR%                  5       I S h  v•N   g  NÙ N7f)Nz Launching command: cmd=%s env=%sT)r«   Ústart_new_sessionÚautoÚtry_execrþ   Úalwaysr`   Ú	supportedr_   Úneverr^   )Úgadgets)r   r
   ÚInteractionAgentrw   re   r|   r-   r.   Úspawnrñ   r   Úmake_bootloaderrÍ   rF   ÚstepsÚBEIBOOT_GADGETSÚwriter•   Úcommunicate)rM   rÓ   rç   Úbeiboot_helperÚagentÚ	transportÚexec_cockpit_bridge_stepsÚstage1s           r9   r   ÚSshPeer.bootu  sl  é € Ü,¨TÓ2ˆÜ×&Ò&Ô(:¸4¿;¹;È×H[ÑH[Ó(\Ð^lÐ'mÓnˆä�‰Ð7¸ÔBØŸ*™* S°eÈt˜*ÐT×Tˆ	à×Ñ Ó'Ø*4Ð8HÐ7IÐ6KÐ)LÐ(MÑ%Ø×Ñ 8Ó+Ø*6Ð:JÐ9KÐ8MÐ)NÐ(OÑ%Ø×Ñ ;Ó.à*4Ð8HÐ7IÐ6KÐ)LÐOaÐdfÐchÐNiÐ(jÑ%à×%Ñ%¨Ó0Ð0Ð0Ø(*Ð%ô ×+Ò+ð -
Ø&ð-
àœtÔ$9Ó$;Ó<Ð=Ð>ð-
ð ×!Ñ!ð-
ô #ñ	$ˆð
 	�‰˜Ÿ™›Ô(ð ×ÑÓ!×!Ñ!ñ- Uñ, 	"ùs%   ‚A,EÁ.EÁ/CEÅE
ÅEÅ
Ec                 ó   • S U l         g rR   )r|   rp   s    r9   Údo_superuser_init_doneÚSshPeer.do_superuser_init_done’  s
   € Ø"ˆÕrP   r®   c                 ót  • [         R                  SXR                  S L5        [        US5      R	                  S5      (       aP  [        US5      nU R                  b7  [         R                  S5        U R                  SX R                  S9  S U l        g [         R                  S5        U R                  SWS	S
9  g )Nz*SshPeer.do_authorize: %r; have password %sr¤   zplain1:Úcookiez-SshPeer.do_authorize: responded with passwordÚ	authorize)r©   r-  r¥   z0SshPeer.do_authorize: authentication-unavailablezauthentication-unavailable)r©   r-  Úproblem)r-   r.   r|   r   r˜   Úwrite_control)rM   r®   r-  s      r9   Údo_authorizeÚSshPeer.do_authorize•  s¡   € Ü�‰ÐAÀ7×L_ÑL_ÐgkÐLkÔlÜ�7˜KÓ(×3Ñ3°I×>Ñ>Ü˜W hÓ/ˆFØ×"Ñ"Ñ.Ü—‘ÐLÔMØ×"Ñ"¨;¸v×PcÑPcÐ"ÑdØ&*�Ô#Øä�‰ÐGÔHØ×Ñ ;°vÐGcÐÒdrP   )r|   rå   rõ   rñ   rô   rs   )r%   rV   rW   rX   rZ   r   rC   ÚargparseÚ	NamespacerT   rû   rù   rú   r   r   r*  r   r1  r\   rt   ru   s   @r9   rî   rî   -  s|   ø‡ Ø
YÓYð!˜vð !°Cð !¸x×?QÑ?Q÷ !ô3ô"ô'"ðR"˜h s™mð "°(¸3±-ð "ÀDô "ô:#ðe Jð e°4÷ eò erP   rî   c                   óz   ^ • \ rS rSr% Sr\\   \S'   \\S'   S\	R                  4U 4S jjrS rS rSS	 jrS
rU =r$ )Ú	SshBridgei£  Nr¼   Ússh_peerr    c                 ó”   >• [        U 5      n[        TU ]	  U/5        [        XR                  U5      U l        U R
                  Ul        g rR   )rb   rg   rT   rî   rå   r7  rd   )rM   r    Úrulerh   s      €r9   rT   ÚSshBridge.__init__§  s?   ø€ ô " $Ó'ˆÜ‰Ñ˜$˜Ô ô   ×&6Ñ&6¸Ó=ˆŒØ—M‘Mˆ�	rP   c                 ó   • g rR   r]   rp   s    r9   Údo_send_initÚSshBridge.do_send_init²  s   € ØrP   c                 óf   • [         R                  SU5        U R                  R                  U5        g )NzSshBridge.do_init: %r)r-   r.   r7  r0  )rM   r®   s     r9   Údo_initÚSshBridge.do_initµ  s%   € ô 	�‰Ð,¨gÔ6Ø�‰×#Ñ# GÕ,rP   c                 óN   • U R                   R                  U R                  5        g rR   )r7  Úadd_done_callbackro   rp   s    r9   Úsetup_sessionÚSshBridge.setup_session»  s   € à�‰×'Ñ'¨¯
©
Õ3rP   )r7  rs   )r%   rV   rW   rX   r¼   r   r   rZ   rî   r3  r4  rT   r<  r?  rC  r\   rt   ru   s   @r9   r6  r6  £  s>   ø‡ Ø#'€Hˆh�xÑ Ó'ØÓð	"˜X×/Ñ/÷ 	"òò-÷4ò 4rP   r6  c              ƒ   ó   #   • [         R                  S5        [        U 5      n[        [        R
                  " 5       U5         [        UR                  R                  5       I S h  v•N 5      nUR                  R                  R                  5       (       a6  UR                  SSSSUR                  R                  R                  5       0S9  UR                  S0 5      n[        U[        5      (       d  UR                  SS	S
S9  g [        U[        5      (       d   eSUS'   UR                  (       a,  [        R!                  UR                  R                  5      US'   UR                  U5        UR                  R#                  5         [         R                  S5        UR?                  5          URA                  5       I S h  v•N   g  GNd! [$        R&                   Gak  n[$        R(                  R+                  [-        U5      5      n[         R                  SXE5        [        U[$        R.                  5      (       a  SnO€[        U[$        R0                  5      (       a  SnO^[        U[$        R2                  5      (       a  SnO<[        U[4        5      (       a  SnO$[        U[$        R6                  5      (       a  SnOSnUR                  R                  R                  5       (       a>  UR                  SU[-        U5      UR                  R                  R                  5       S9  OUR                  SU[-        U5      S9   S nAg S nAf[8         a:  n[         R                  SU5        UR                  UR:                  SS9   S nAg S nAf[        R<                   a    [         R                  S5         g f = f GNø! [B         a     g f = f7f)NzHi. How are you today?r.  zx-login-datarŠ   zknown-hosts)r©   r¤   r-  Ú
login_dataÚcapabilitiesÚinitzprotocol-errorzcapabilities must be a dict)r©   r/  r®   Tzexplicit-superuserr¼   z.ferny.InteractionError: %s, interpreted as: %rzauthentication-failedzinvalid-hostkeyzunknown-hostkeyzunknown-hostzinternal-error)r©   r/  r®   r  zCockpitProblem: %s)r©   z"Peer bridge got cancelled, exitingz/Startup done.  Looping until connection closes.)"r-   r.   r6  r   ÚasyncioÚget_running_loopÚdictr7  Ústartrõ   rø   r0  Ú	read_textÚ
setdefaultrA   r¼   ÚfromkeysÚthaw_endpointr
   ÚInteractionErrorÚ
ssh_errorsÚget_exception_for_ssh_stderrrC   ÚSshAuthenticationErrorÚSshChangedHostKeyErrorÚSshHostKeyErrorrÃ   ÚSshErrorr   ÚattrsÚCancelledErrorrC  r"  ÚBrokenPipeError)r    Úbridger®   rG  Úexcr	  r/  s          r9   Úrunr]  À  sû  é € Ü
‡L�LÐ)Ô*ä�t‹_€FÜ”7×+Ò+Ó-¨vÔ6ð6Ü˜VŸ_™_×2Ñ2Ó4×4Ó5ˆà�?‰?×+Ñ+×2Ñ2×4Ñ4Ø× Ñ Ø#¨~ÀcØ! 6§?¡?×#CÑ#C×#MÑ#MÓ#OðWð !ñ ð ×)Ñ)¨.¸"Ó=ˆÜ˜,¬×-Ñ-Ø× Ñ ¨Ð9IÐSpÐ ÑqØÜ˜,¬×-Ñ-Ð-Ð-Ø-1ˆÐ)Ñ*ð �?�?Ü"&§-¡-°·±×0HÑ0HÓ"IˆG�JÑà×Ñ˜WÔ%Ø�‰×%Ñ%Ô'ô@ ‡L�LÐBÔCØ
×ÑÔðØ× Ñ Ó"×"Ñ"òu 5øô0 ×!Ñ!ô Ü× Ñ ×=Ñ=¼cÀ#»hÓGˆÜ�‰ÐEÀsÔRÜ�eœU×9Ñ9×:Ñ:Ø-‰GÜ˜œu×;Ñ;×<Ñ<Ø'‰GÜ˜œu×4Ñ4×5Ñ5Ø'‰GÜ˜œw×'Ñ'à$‰GÜ˜œuŸ~™~×.Ñ.Ø-‰Gà&ˆGà�?‰?×+Ñ+×2Ñ2×4Ñ4Ø× Ñ ¨¸Ì#ÈeË*Ø-3¯_©_×-MÑ-M×-WÑ-WÓ-Yð !ò [ð × Ñ ¨¸Ì#ÈeË*Ð ÑUÜûÜó Ü�‰Ð)¨3Ô/Ø×Ñ˜SŸY™Y°ÐÑ7ÜûÜ×!Ñ!ó Ü�‰Ð9Ô:Ùðúò 	#øÜó áðüs¥   ‚A OÁ"G Á%G	Á&BG ÄOÄBG Æ
%OÆ0N> ÇN;ÇN> ÇOÇ	G ÇN8Ç!E!MÍOÍN8Í0N	ÎOÎ	,N8Î5OÎ7N8Î8OÎ;N> Î>
OÏOÏ
OÏOc                  óT  • [         R                  " 5         [        R                  " SS9n U R	                  S/ SQSSS9  U R	                  SS	S
9  U R	                  SSS9  U R                  5       n[        UR                  S9  [        R                  " [        U5      UR                  S9  g )Nz@cockpit-bridge is run automatically inside of a Cockpit session.)Údescriptionz--remote-bridge)r  r  r  r  r  zÞHow to run cockpit-bridge from the remote host: auto: if installed (default), never: always copy the local one; supported: if not installed, copy local one for compatible OSes, fail otherwise; always: fail if not installed)Úchoicesr‰   Úhelpz--debugÚ
store_true)Úactionrå   z5Name of the remote host to connect to, or 'localhost')ra  )r.   )
r	   Úinstallr3  ÚArgumentParserÚadd_argumentÚ
parse_argsr   r.   rI  r]  )Úparserr    s     r9   Úmainri    s™   € Ü×ÒÔä×$Ò$Ð1sÑt€FØ
×ÑÐ)Ò3[Ðekð8ð ñ 9ð
 ×Ñ˜	¨,ÐÑ7Ø
×Ñ˜Ð,cÐÑdØ×ÑÓ€Dä˜Ÿ
™
Ò#ä‡K‚K”�D“	 §¡Ó,rP   Ú__main__rs   )Hr3  rI  r“   Úimportlib.resourcesr"   Úloggingr'   rŽ   rà   rò   r’   Úpathlibr   Útypingr   r   r   r   r   Úcockpitr	   Úcockpit._vendorr
   Úcockpit._vendor.beir   Úcockpit.beipackr   Úcockpit.bridger   r   Úcockpit.channelr   Úcockpit.channelsr   Úcockpit.jsonutilr   r   Úcockpit.osinfor   Úcockpit.packagesr   r   r   Úcockpit.peerr   Úcockpit.protocolr   r   Úcockpit.routerr   r   Úcockpit.transportsr   Ú	getLoggerr-   r:   rC   rF   rH   r   rb   ÚAskpassHandlerrw   rÌ   rÒ   ræ   rì   rî   r6  r]  ri  r%   r]   rP   r9   Ú<module>r     s¼  ðó$ Û Û Û Û Û 	Û 	Û Û Û Ý ß >Õ >å Ý !Ý *Ý /ß :Ý .Ý ,ß 0Ý )ß GÑ GÝ ß Aß .Ý -à	×	Ò	Ð,Ó	-€ð˜dô ðD&˜x¨™}ô &ô'˜.ô 'ð&ð
ðñð. ×Ñð/€ô6˜ô ôrH˜×-Ñ-ô rHðj2 ð 2¨¨h°s©m¸XÀc¹]Ð.JÑ(Kô 2ð�˜#‘ð  cð ¸ð Èð ÐQVÐW_Ð`cÑWdÐfnÐorÑfsÐWsÑQtô ð,�x ‘}ð ¨8°C©=ð ¸UÀ8ÈCÁ=ÐRZÐ[^ÑR_ÐC_Ñ=`ô ôseˆdô seôl4�ô 4ô:DôN-ð$ ˆzÓÙ…Fð rP   