
    i.                     .   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlmZmZmZmZmZmZmZ d dlmZ d dlmZmZ ddlmZ ddlmZ ddlmZ dd	l m!Z! dd
l"m#Z#m$Z$ ddl%m&Z& ddl'm(Z(m)Z)m*Z*m+Z+ ddl,m-Z-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9  ejt                  e;      Z< G d d      Z= G d de5e/      Z>d%dZ?d%dZ@deAfdZBdeAddfdZCdeDdeeDeDf   fdZEd%dZFd d!d"eAddfd#ZGe;d$k(  r eG        yy)&    N)DictIterableListOptionalSequenceTupleType)interaction_client)bus	run_async   )	polyfills)__version__)ChannelRoutingRule)CHANNEL_TYPES)ConfigEnvironment)EXPORTS)	JsonError
JsonObject	JsonValueget_dict)BridgeConfigPackagesPackagesListener)PeersRoutingRule)HostRoutingRule)Router)SuperuserRoutingRule)StdioTransportc                       e Zd ZU eej
                     ed<   deee	e
ej                     f      fdZde	dej                  ddfdZy)	InternalBus	exporteesexportsc           	      ~   t        j                         \  }}t        j                  j	                  |j                               | _        t        j                  j	                  |j                         d      | _        |D cg c]&  \  }}| j                  j                  | |             ( c}}| _	        y c c}}w )N)fdT)r&   server)
socket
socketpairr   Busnewdetachclientr'   
add_objectr#   )selfr$   client_socketserver_socketpathclss         0/usr/lib/python3/dist-packages/cockpit/bridge.py__init__zInternalBus.__init__,   s    '-'8'8':$}ggkk]%9%9%;k<ggkk]%9%9%;DkIOVW)$$++00su=WWs   +B9r2   objreturnNc                 n    | j                   j                  | j                  j                  ||             y N)r#   appendr'   r.   )r/   r2   r6   s      r4   exportzInternalBus.export2   s%    dkk44T3?@    )__name__
__module____qualname__r   r   Slot__annotations__r   r   strr	   
BaseObjectr5   r;    r<   r4   r"   r"   )   sX    CHH~XsD4H/H)I J XA3 AS^^ A Ar<   r"   c                        e Zd ZU eed<   eed<   ee   ed<   ee	   ed<   e
j                  ed<   de
j                  f fdZdefdZedefd	       Zd
eddfdZddZddZ xZS )Bridgechannelsinternal_buspackagesbridge_configsargsc                    t        t              | _        g | _        || _        t        | |j                        | _        | j                  j                  d| j                         | j                  j                  dt                      | j                  j                  dt                      t        |       | _        |j                  rU| j                  j                  t        dg ddgd      t        ddd	t         j"                  d
ddgd      f       d | _        nZ|j                  rd | _        nFt'        |       | _        | j                  j                  d| j$                         | j)                          t+        | t,              | _        t0        | e  t5        |       | j                  | j.                  | j                  g       y )N)
privilegedz
/superuserz/configz/environmentT)sudoz-kz-Apython3-ic# cockpit-bridge--privilegedzSUDO_ASKPASS=ferny-askpass)rM   spawnenvironStartTransientUnitrP   rQ   rR   )rM   polkitmethodrS   z	/packages)r"   r   rH   rJ   rK   r   rM   superuser_ruler;   r   r   r   
peers_rulebeipackset_configsr   sys
executablerI   r   packages_loadedr   r   rG   superr5   r   )r/   rK   	__class__s     r4   r5   zBridge.__init__=   ss   '0 	24DOOT  t/B/BC  FH5  ?*40<<++"&g <= 
 "&"2!nne5GX	 -  !DM__ DM$TNDM$$[$--@  "*4?D!MMOO	
 	r<   r7   c                 B   t        j                  t        j                               }t	        j
                  |j                        j                  }|g}t	        j                         D ]E  }|j                  |j                  v s|j                  |vs+|j                  |j                         G | j                  j                         | j                         |j                  |j                  |||j                   |j                  |j"                  |j$                  ddS )N)fullnamegidgroupgroupshomenameshelluid)rG   
os_releaseuser)pwdgetpwuidosgetuidgrpgetgrgidpw_gidgr_namegetgrallpw_namegr_memr:   rG   capabilitiesget_os_releasepw_gecospw_dirpw_shellpw_uid)r/   pwrd   re   grs        r4   infozBridge.infoj   s    \\"))+& RYY'//,,. 	*BzzRYY&2::V+Cbjj)	*
 224--/KKyy 		

yy	
 	
r<   c                     	 t        dd      } | 5  t	        | j                               cd d d        S # t        $ r: 	 t        dd      } n(# t        $ r t        j                  d       i cY cY S w xY wY gw xY w# 1 sw Y   y xY w)Nz/etc/os-releasezutf-8)encodingz/usr/lib/os-releasez6Neither /etc/os-release nor /usr/lib/os-release exists)openFileNotFoundErrorloggerwarningparse_os_releaseread)files    r4   rx   zBridge.get_os_release   s    	)G<D  	1#DIIK0	1 	1 ! 	1GD$ WX	 		1 	1s=   4 A:	A7AA7 A1,A70A11A76A7:BmessageNc                     t        j                  t              5  t        |d      }| j                  j                  |       d d d        y # 1 sw Y   y xY w)N	superuser)
contextlibsuppressr   r   rX   init)r/   r   r   s      r4   do_initzBridge.do_init   sG       + 	0 +6I$$Y/	0 	0 	0s   (AAc                     ddid| j                         dd}| j                  ,t        j                  | j                  j                        |d<   | j	                  |       y )Nzexplicit-superuserTr   r   )rw   commandz
os-releaseversionrI   )rx   rI   dictfromkeyswrite_control)r/   	init_argss     r4   do_send_initzBridge.do_send_init   sZ    148--/	-
	 ==$$(MM$--2H2H$IIj!9%r<   c                     | j                   sJ | j                   j                         }| j                  |k7  r>| j                  j	                  |       | j
                  j	                  |       || _        y y r9   )rI   get_bridge_configsrJ   rX   r[   rY   )r/   rJ   s     r4   r^   zBridge.packages_loaded   sa    }}}99;.0++N;OO''7"0D 1r<   r7   N)r=   r>   r?   r   rA   r"   r   r   r   r   argparse	Namespacer5   r   r   staticmethodrx   r   r   r^   __classcell__)r`   s   @r4   rF   rF   6   s      x  \**


+X// +Z
j 
4 1J 1 10z 0d 0&1r<   rF   r7   c                 8  K   t         j                  d       t        j                  t	        j
                               }|j                  t        j                  d<   |j                  t        j                  d<   |j                  t        j                  d<   t         j                  d       t        |       }t        t        j                         |       t         j                  d       	 |j                          d {    y 7 # t        t         f$ r Y y w xY ww)NzHi. How are you today?HOMESHELLUSERzStarting the router.z/Startup done.  Looping until connection closes.)r   debugrl   rm   rn   ro   rz   rT   r{   ru   rF   r    asyncioget_running_loopcommunicateBrokenPipeErrorConnectionResetError)rK   merouters      r4   runr      s     
LL)* 
biik	"BBJJv++BJJwBJJv
LL'(D\F7++-v6
LLBC  """12 s<   C'D*D =D>D DD DDDDc                     	 t        j                         \  } }| 5  |5  t        j                  dd|j	                         g       d d d        t        j
                  | dd      \  }}}}d d d        	 \  }t        j                  dd       t        j                  |d       |D ]  }t        j                  |        y # 1 sw Y   {xY w# 1 sw Y   cxY w# t        $ r Y y w xY w# D ]  }t        j                  |        w xY w)N   zcockpit.send-stderr)fdsr   z	ferny.end)
r(   r)   r
   r   filenorecv_fdsOSErrorrn   dup2close)ourstheirs_msgr   _flags_addr	stderr_fdr&   s           r4   try_to_receive_stderrr      s    ((*f 	C \"**1.C&--/IZ[\'-tQ'B$D#vu	C	
	 	""1k2
	1 	BHHRL	\ \	C 	C    	BHHRL	sK   C C(C $C*C 30C'  C		CCC 	C$#C$'Dc                      t        j                  t        j                  d      j                        sy	 dd l} t        j                  j                  | j                  j                                y# t        $ r Y yw xY w)Nr   Fr   T)statS_ISSOCKrn   fstatst_modesystemd.journalImportErrorloggingroot
addHandlerjournalJournalHandler)systemds    r4   setup_journaldr      sa    
 ==!,,-
 LLGOO::<=  s   A1 1	A=<A=r   c                    t        j                  dd      }t               st        j                  d       | s|dk(  r3t        j
                         j                  t        j                         y|r\|j                  d      D ]G  }|j                         }|st        j
                  |      j                  t        j                         I yy)	zOSetup our logger with optional filtering of modules if COCKPIT_DEBUG env is setCOCKPIT_DEBUG z#%(name)s-%(levelname)s: %(message)s)formatall)level,N)
rn   getenvr   r   basicConfig	getLoggersetLevelDEBUGsplitstrip)r   modulesmodules      r4   setup_loggingr      s     ii,G #HI5 $$7==$9	mmC( 	>F\\^Ff%..w}}=	> 
r<   textc                 (   i }| j                         D ]W  }|j                         }|r|j                  d      r'	 |j                  d      \  }}t	        j                  |      \  }|||<   Y |S # t
        $ r t        j                  d|       Y }w xY w)N#=z'Ignoring invalid line in os-release: %r)
splitlinesr   
startswithr   shlex
ValueErrorr   r   )r   rj   linekvv_parseds         r4   r   r     s    J! 
!zz|ts+	::c?DAq ;;q>LX !
1
! 	  	NNDdK	s   +A//BBc                  <   	 t        j                  g dt         j                  t         j                  d      } | j                  J t	        j                  | j                  j                         d      D ]9  }|j                  d      s|j                  ddd      t        j                  d<    y  | j                          | j                          y # t        $ r t        j                  d	       Y y t        $ r }t        j!                  d
|       Y d }~y d }~ww xY w)N)z	ssh-agentshz-ecz)echo SSH_AUTH_SOCK=$SSH_AUTH_SOCK; read aT)stdinstdoutuniversal_newlines)punctuation_charszSSH_AUTH_SOCK=r   r   SSH_AUTH_SOCKz,Couldn't start ssh-agent (FileNotFoundError)zCould not start ssh-agent: %s)
subprocessPopenPIPEr   r   readliner   replacern   rT   	terminatewaitr   r   r   r   r   )proctokenexcs      r4   start_ssh_agentr     s    = g&0oojoobfh{{&&&
 [[!5!5!74P 	E 01.3mm<LbRS.T

?+	
 NNIIK ECD =6<<=s*   BC %C 1!C D3D;DDF)rZ   rZ   c                    t        j                          t        j                  d      }|j	                  ddd       |j	                  ddd       |j	                  d	dd
       |j	                  ddd       |j	                  ddd       |j                         }| |_        |j                  r
t                t        |j                         |j                  rt               j                          y |j                  rt        dt          d       y |j"                  rOt        t%        j&                  t               j)                         D cg c]  }|j*                   c}d             y dt,        j.                  vr|j                  s
t1                t3        t5        |      |j                         y c c}w )Nz@cockpit-bridge is run automatically inside of a Cockpit session.)descriptionrR   
store_truezPrivileged copy of the bridge)actionhelpz
--packagesz Show Cockpit package informationz	--bridgesz Show Cockpit bridges informationz--debugz"Enable debug output (very verbose)z	--versionz Show Cockpit version information)r   z	Version: z
Protocol: 1r   )indentr   )r   installr   ArgumentParseradd_argument
parse_argsrZ   rM   r   r   r   rI   r   showr   printr   bridgesjsondumpsr   __dict__rn   rT   r   r   r   )rZ   parserrK   configs       r4   mainr
  -  s^   $$1stF
|Bab
\@bc
L?ab
	,=ab
L?abD DL 

# }}
		+m45	djj
8U8U8WXf&//Xabcd bjj( c$itzz* Ys   F;__main__r   )Hr   r   r   rp   r  r   rn   rl   r   r(   r   r   r\   typingr   r   r   r   r   r   r	   cockpit._vendor.fernyr
   cockpit._vendor.systemd_ctypesr   r   r   r   _versionr   channelr   rG   r   r	  r   r   internal_endpointsr   jsonutilr   r   r   r   rI   r   r   r   peerr   remoter   r   r   r   r   
transportsr    r   r=   r   r"   rF   r   r   boolr   r   rB   r   r   r
  rD   r<   r4   <module>r     s      
   	 
     
 H H H 4 9  ! ' # ' ' @ @ > > " #  + &			8	$
A 
Aw1V% w1t,, &>D >T >(3 4S>  =4 " (+T (+d (+V zF r<   