grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026a q©jÝTã@sTddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ddl mZmZmZmZddlmZddlmZddlmZddlmZddlmZmZdd lmZdd lm Z dd l!m"Z"m#Z#dd l$m%Z%dd l&m'Z'm(Z(m)Z)ddl*m+Z+ddl,m-Z-m.Z.ddl/m0Z0m1Z1ddl2m3Z3e 4d¡Z5e dœdd„Z6Gdd„de(ƒZ7ddddœej8¥Z8Gdd„de1ƒZ9Gdd„dej:ƒZ;eee<e} zt d| ¡WYd} ~ dSd} ~ 00ˆ d¡| d¡k�r|ˆ d¡| d¡k�r|t d|¡dSˆ dˆ dd¡¡›dˆ dd¡›�} t d| d�‚dS)NzGot ferny command %s %s %srP)ÚloaderrrQz no-cockpit)ÚmessagerRz'cockpit.check-os-release: remote OS: %rz,cockpit.check-os-release: supported OSes: %rc3s |]\}}ˆ |¡|kVqdSr7)r%)Ú.0ÚkÚv©Z remote_osr1r2Ú Ýóz7AuthorizeResponder.do_custom_command..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: %sZIDZ VERSION_IDz7cockpit.check-os-release: remote OS matches local OS %rÚNAMEú?rYÚ)Ú unsupported)r)r*rr4rEÚpackagesZ routing_rulesÚinsertr rrr rÚallÚitemsÚopenÚreadÚOSErrorZwarningr%) r8rqrlrrrsr5ZosinfoÚfZthis_osÚerr1ryr2Údo_custom_commandÊs6       . , &z$AuthorizeResponder.do_custom_command)r!r;r<Zcommandsrr?rr=r9rpÚtupleÚlistÚintr‰r1r1r1r2rOzs GrO)ÚcommentrcCsddd|›�fdfS)NZpython3z-icz# r1r1)r�r1r1r2Úpython_interpreteròsrŽ)ÚcmdÚdestÚ ssh_askpassÚssh_optsrcGs‚| d¡\}}}| ¡rP| d¡sP| d¡rB| d¡rB|dd…}d|d|g}nd|g}dg|¢|¢t |¡‘Rd |›�d d ffS) Nú:ú[ú]rXéÿÿÿÿz-pz--Zsshz SSH_ASKPASS=z DISPLAY=xzSSH_ASKPASS_REQUIRE=force)Ú rpartitionÚisdigitÚendswithrgÚshlexÚjoin)r�r�r‘r’ÚhostÚ_ÚportÚ destinationr1r1r2Úvia_sshös& ÿÿÿÿûþr ©r�ÚenvrcCs ddgdd„|Dƒ¢|¢RdfS)Nz flatpak-spawnz--hostcss|]}d|›�VqdS)z--env=Nr1)rvZkvr1r1r2rzr{z flatpak_spawn..r1r1)r�r¢r1r1r2Ú flatpak_spawn sÿ þýür£cs”eZdZUded<eeejdœ‡fdd„ Zddœdd „Z ddœd d „Z ddœd d „Z e ee eddœdd„Z ddœdd„Zeddœdd„Z‡ZS)ÚSshPeerzMLiteral["always"] | Literal["never"] | Literal["supported"] | Literal["auto"]Úmode)rErŸrlcs@||_|j|_t ¡|_t|jjƒd|_d|_t ƒ  |¡dS)Nzuser-known-hosts) rŸÚ remote_bridgeÚtempfileZTemporaryDirectoryZtmpdirrÚnameÚknown_hosts_filerSrFr9)r8rErŸrlrGr1r2r9s  zSshPeer.__init__NrcÃs.tj d¡r| ¡IdHn| ¡IdHdS)Nz/.flatpak-info)r#r&ÚexistsÚconnect_from_flatpakÚconnect_from_bastion_hostrLr1r1r2Údo_connect_transport s zSshPeer.do_connect_transportcÃsNtdƒ\}}|jdkr*t||jtƒƒ\}}t||ƒ\}}| ||¡IdHdS)Núcockpit-bridgeZ localhost)rŽrŸr r3r£Úboot)r8r�r¢r1r1r2r«'s   zSshPeer.connect_from_flatpakcÃsJd}ddg}|j d¡IdH}t|dƒ}| d¡r†t |dd…¡ ¡}| d¡\}}}| d¡\}}|_|r†t   d |¡|d |g7}|jdurœ|dd g7}t d ƒ\} } t d ƒ} t | ƒ} |  ¡sÌt  d| ¡t d¡} | durð|dd| ›�g7}|du�r|j |¡|dd|j›�g7}t| |j| g|¢RŽ\} } | | | ¡IdHdS)Nz-ozNumberOfPasswordPrompts=1Ú*rozBasic éúr“z,got username %s and password from Basic authz-lzPasswordAuthentication=nor®z${libexecdir}/cockpit-askpassz+Could not find cockpit-askpass helper at %rZCOCKPIT_SSH_KNOWN_HOSTS_FILEzGlobalKnownHostsFile=zUserKnownHostsfile=)rEZrequest_authorization_objectrrgrdrjrfÚ partitionrSr)r*rŽrrrªÚerrorr#Úgetenvr©Ú write_textr rŸr¯)r8Ú known_hostsrlZauthroZdecodedZ user_passwordr�Úuserr�r¢Zaskpassr‘Zenv_known_hostsr1r1r2r¬4s4           z!SshPeer.connect_from_bastion_hostr¡cÃsêt|ƒ}t t|j|jƒ|g¡}t d||¡|j|||dd�IdH}|j dkr`ddgffg}n@|j dkrzddgffg}n&|j d krœddgffd gffg}ng}t j g|¢d t t  ¡ƒgf‘|j¢td �}| | ¡¡| ¡IdHdS) Nz Launching command: cmd=%s env=%sT)rsZstart_new_sessionÚautoZtry_execr®ÚalwaysrBÚ supportedrAr@)Zgadgets)r rZInteractionAgentrOrErSr)r*Zspawnr¦r Zmake_bootloaderr‹rZget_condition_filesZstepsÚBEIBOOT_GADGETSÚwritereÚ communicate)r8r�r¢Zbeiboot_helperZagentZ transportZexec_cockpit_bridge_stepsZstage1r1r1r2r¯]s,   ÿþýüz SshPeer.bootcCs d|_dSr7)rSrLr1r1r2Údo_superuser_init_donezszSshPeer.do_superuser_init_done)rurcCs|t d||jdu¡t|dƒ d¡r^t|dƒ}|jdur^t d¡|jd||jd�d|_dSt d¡|jd|d d �dS) Nz*SshPeer.do_authorize: %r; have password %srnzplain1:Úcookiez-SshPeer.do_authorize: responded with passwordÚ authorize)rqrÀroz0SshPeer.do_authorize: authentication-unavailablezauthentication-unavailable)rqrÀÚproblem)r)r*rSrrgÚ write_control)r8rurÀr1r1r2Ú do_authorize}s    zSshPeer.do_authorize)r!r;r<r?rr=ÚargparseÚ Namespacer9r­r«r¬rr¯r¿rrÄrNr1r1rGr2r¤s  )r¤csbeZdZUdZeeed<eed<ej dœ‡fdd„ Z ddœdd „Z d d „Z ddœd d „Z ‡ZS)Ú SshBridgeNr€Ússh_peer)rlcs2t|ƒ}tƒ |g¡t||j|ƒ|_|j|_dSr7)rCrFr9r¤rŸrÈrD)r8rlZrulerGr1r2r9�szSshBridge.__init__rcCsdSr7r1rLr1r1r2Ú do_send_initšszSshBridge.do_send_initcCst d|¡|j |¡dS)NzSshBridge.do_init: %r)r)r*rÈrÃ)r8rur1r1r2Údo_init�s zSshBridge.do_initcCs|j |j¡dSr7)rÈZadd_done_callbackrKrLr1r1r2Ú setup_session£szSshBridge.setup_session)r!r;r<r€rrr?r¤rÅrÆr9rÉrÊrËrNr1r1rGr2rÇ‹s  rÇc ÃsVt d¡t|ƒ}tt ¡|ƒz¤t|j ¡IdHƒ}|jj   ¡r`|j dddd|jj   ¡id�|  di¡}t|tƒsŒ|j dd d d �WdSd |d <|jr¬t |jj¡|d<|  |¡|j ¡W�nRtj�y´}zÔtj t|ƒ¡}t d||¡t|tjƒ�r d}nRt|tjƒ�rd}n>t|tjƒ�r2d}n*t|tƒ�rDd}nt|tjƒ�rXd}nd}|jj   ¡�rŠ|j d|t|ƒ|jj   ¡d�n|j d|t|ƒd �WYd}~dSd}~0t�yö}z*t d|¡|j |jdd�WYd}~dSd}~0tj�yt d¡YdS0t d¡| ¡z|  ¡IdHWnt!�yPYn0dS)NzHi. How are you today?rÁz x-login-datar\z known-hosts)rqrnrÀZ login_dataÚ capabilitiesÚinitzprotocol-errorzcapabilities must be a dict)rqrÂruTzexplicit-superuserr€z.ferny.InteractionError: %s, interpreted as: %rzauthentication-failedzinvalid-hostkeyzunknown-hostkeyz unknown-hostzinternal-error)rqrÂrur·zCockpitProblem: %s)rqz"Peer bridge got cancelled, exitingz/Startup done. Looping until connection closes.)"r)r*rÇrÚasyncioZget_running_loopÚdictrÈÚstartr©rªrÃÚ read_textÚ setdefaultÚ isinstancer€ÚfromkeysZ thaw_endpointrZInteractionErrorZ ssh_errorsZget_exception_for_ssh_stderrr=ZSshAuthenticationErrorZSshChangedHostKeyErrorZSshHostKeyErrorr†ZSshErrorrÚattrsZCancelledErrorrËr¾ÚBrokenPipeError)rlZbridgerurÌÚexcr´rÂr1r1r2Úrun¨sj   ÿÿ     ÿ   rØcCsrt ¡tjdd�}|jdgd¢ddd�|jdd d �|jd d d �| ¡}t|jd�tj t |ƒ|jd�dS)Nz@cockpit-bridge is run automatically inside of a Cockpit session.)Ú descriptionz--remote-bridge)r¹Úneverr»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')rÜ)r*) rÚinstallrÅÚArgumentParserÚ add_argumentÚ parse_argsr r*rÎrØ)Úparserrlr1r1r2Úmainïs ÿ räÚ__main__)FrÅrÎrdZimportlib.resourcesrZloggingr#r_ršr§rcÚpathlibrÚtypingrrrrZcockpitrZcockpit._vendorrZcockpit._vendor.beir Zcockpit.beipackr Zcockpit.bridger r Zcockpit.channelr Zcockpit.channels.packagesrZcockpit.jsonutilrrZcockpit.osinforZcockpit.packagesrrrZ cockpit.peerrZcockpit.protocolrrZcockpit.routerrrZcockpit.transportsrZ getLoggerr)r3r4r¼rCZAskpassHandlerrOr=rŠrŽr r£r¤rÇrØrär!r1r1r1r2ÚsZ           "  ñéx ** vG