§
    AxÅjr  ã                   ó¦   — d 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 ddl	m
Z
 ddlmZ ddlmZ  ej        d¬	¦  «          G d
„ d¦  «        ZdS )zH
Runpod | CLI | Utils | SSH Command

Connect and run commands over SSH.
é    N)Ú
STOP_EVENTé   )Úget_pod_ssh_ip_port)Úget_ignore_list)Úfind_ssh_key_fileT)Ú	autoresetc                   óV   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zdd„Zd„ ZdS )ÚSSHConnectionz"Connect and run commands over SSH.c                 ób  — || _         	 t          |¦  «        \  | _        | _        t	          | j        | j        ¦  «        | _        t          j        ¦   «         | _        | j         	                    t          j
        ¦   «         ¦  «         | j                             | j        | j        d| j        ¬¦  «         nV# t          j        $ rD}t          t          j        j        d|› d�z   |¦  «         t#          j        d¦  «         Y d }~nd }~ww xY wt'          j        t&          j        | j        ¦  «         d S )NÚroot)ÚportÚusernameÚkey_filenameú[ú]r   )Úpod_idr   Úpod_ipÚpod_portr   Úkey_fileÚparamikoÚ	SSHClientÚsshÚset_missing_host_key_policyÚAutoAddPolicyÚconnectÚSSHExceptionÚprintÚcoloramaÚForeÚREDÚsysÚexitÚsignalÚSIGINTÚ_signal_handler)Úselfr   Úerrs      úIC:\Projects\Historical\venv\Lib\site-packages\runpod/cli/utils/ssh_cmd.pyÚ__init__zSSHConnection.__init__   s  € ØˆŒð	Ý)<¸VÑ)DÔ)DÑ&ˆDŒK˜œÝ-¨d¬k¸4¼=ÑIÔIˆDŒMåÔ)Ñ+Ô+ˆDŒHØŒH×0Ò0µÔ1GÑ1IÔ1IÑJÔJÐJØŒH×ÒØ”Ø”]ØØ!œ]ð	 ñ ô ð ð øõ Ô$ð 	ð 	ð 	Ý•(”-Ô# m¨& m m mÑ3°SÑ9Ô9Ð9ÝŒH�Q‰KŒKˆKˆKˆKˆKˆKˆKøøøøð	øøøõ 	Œ•f”m TÔ%9Ñ:Ô:Ð:Ð:Ð:s   ‰B+B5 Â5DÃ:DÄDc                 ó   — | S ©N© ©r&   s    r(   Ú	__enter__zSSHConnection.__enter__0   s   € Øˆó    c                 ó4   — ~~~|                       ¦   «          d S r+   )Úclose)r&   Úexc_typeÚ	exc_valueÚ	tracebacks       r(   Ú__exit__zSSHConnection.__exit__3   s   € Ø�i Ø�
Š
‰Œˆˆˆr/   c                 óD   — dddddt          | j        ¦  «        d| j        gS )z.Get the SSH options for connecting to the pod.z-ozStrictHostKeyChecking=nozLogLevel=ERRORz-pz-i)Ústrr   r   r-   s    r(   Ú_get_ssh_optionszSSHConnection._get_ssh_options7   s2   € ð Ø&ØØØÝ�”ÑÔØØŒMð	
ð 		
r/   c                 óÖ   — ~~|                       ¦   «          t          t          j        j        d| j        › d�z   d¦  «         t          j        ¦   «          t          j	        d¦  «         dS )zHandle signals.r   r   zSSH Connection Closedr   N)
r1   r   r   r   ÚBLUEr   r   Úsetr!   r"   )r&   ÚsignumÚframes      r(   r%   zSSHConnection._signal_handlerD   s\   € à�EØ�
Š
‰ŒˆÝ�hŒmÔ Ð#5 t¤{Ð#5Ð#5Ð#5Ñ5Ð7NÑOÔOÐOÝŒÑÔÐÝŒ�‰Œˆˆˆr/   c                 óÜ  — d„ }|D ]å}d                      ddd|g¦  «        }| j                             |¦  «        \  }}}t          j        ||t
          j        j        | j        fd¬¦  «        }t          j        ||t
          j        j	        | j        fd¬¦  «        }	| 
                    ¦   «          |	 
                    ¦   «          |                      ¦   «          |	                      ¦   «          ŒædS )	z&Runs a list of bash commands over SSH.c                 óf   — | D ]-}|r)t          |d|› d�z   |                     ¦   «         ¦  «         Œ.d S )Nr   r   )r   Ústrip)ÚstreamÚcolorÚprefixÚlines       r(   Úhandle_streamz1SSHConnection.run_commands.<locals>.handle_streamO   sI   € Øð ?ð ?�Øð ?Ý˜% - f - - -Ñ/°·²±´Ñ>Ô>Ð>øð?ð ?r/   z && zsource /root/.bashrczsource /etc/rp_environmentzHwhile IFS= read -r -d '' line; do export "$line"; done < /proc/1/environT)ÚtargetÚargsÚdaemonN)Újoinr   Úexec_commandÚ	threadingÚThreadr   r   ÚGREENr   r    Ústart)
r&   ÚcommandsrE   ÚcommandÚfull_commandÚ_ÚstdoutÚstderrÚstdout_threadÚstderr_threads
             r(   Úrun_commandszSSHConnection.run_commandsL   s  € ð	?ð 	?ð 	?ð
  ð 	!ð 	!ˆGØ!Ÿ;š;à*Ø0Ø`Øð	ñô ˆLð !%¤× 5Ò 5°lÑ CÔ CÑˆAˆv�vå%Ô,Ø$Ø�hœmÔ1°4´;Ð?Øðñ ô ˆMõ
 &Ô,Ø$Ø�hœmÔ/°´Ð=Øðñ ô ˆMð ×ÒÑ!Ô!Ð!Ø×ÒÑ!Ô!Ð!à×ÒÑ Ô Ð Ø×ÒÑ Ô Ð Ð ð5	!ð 	!r/   c                 ó–   — | j                              ¦   «         5 }|                     ||¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z+Copy local file to remote machine over SSH.N)r   Ú	open_sftpÚput)r&   Ú
local_pathÚremote_pathÚsftps       r(   Úput_filezSSHConnection.put_filep   s‹   € àŒX×ÒÑ!Ô!ð 	. TØ�HŠH�Z Ñ-Ô-Ð-ð	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ó   š>¾AÁAc                 ó–   — | j                              ¦   «         5 }|                     ||¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z.Fetch a remote file to local machine over SSH.N)r   rY   Úget)r&   r\   r[   r]   s       r(   Úget_filezSSHConnection.get_fileu   s‹   € àŒX×ÒÑ!Ô!ð 	. TØ�HŠH�[ *Ñ-Ô-Ð-ð	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð 	.ð 	.r_   c                 óz   — dg|                       ¦   «         z   d| j        › �gz   }t          j        |d¬¦  «         dS )z(Launch an interactive terminal over SSH.r   úroot@T©ÚcheckN)r8   r   Ú
subprocessÚrun)r&   Úcmds     r(   Úlaunch_terminalzSSHConnection.launch_terminalz   sH   € àˆg˜×-Ò-Ñ/Ô/Ñ/Ð3H¸4¼;Ð3HÐ3HÐ2IÑIˆåŒ�s $Ð'Ñ'Ô'Ð'Ð'Ð'r/   Fc           	      óL  — g d¢}t          ¦   «         D ]}|                     d|g¦  «         Œ|r|                     d¦  «         |                     ddd                     |                      ¦   «         ¦  «        › �|d| j        › d|› �g¦  «         t          j        |d	¬
¦  «        S )a`  Sync a local directory to a remote directory over SSH.

        A .runpodignore file can be used to ignore files and directories.
        This file should be placed in the root of the local directory to sync.

        Args:
            local_path (str): The local directory to sync.
            remote_path (str): The remote directory to sync.
        )Úrsyncz-avzz
--no-ownerz
--no-groupz	--excludez--quietz-ezssh ú rd   ú:Tre   )r   ÚextendÚappendrI   r8   r   rg   rh   )r&   r[   r\   ÚquietÚ	rsync_cmdÚpatterns         r(   rl   zSSHConnection.rsync€   sÏ   € ð BÐAÐAˆ	å&Ñ(Ô(ð 	5ð 	5ˆGØ×Ò˜k¨7Ð3Ñ4Ô4Ð4Ð4àð 	(Ø×Ò˜YÑ'Ô'Ð'à×ÒàØ:�s—x’x × 5Ò 5Ñ 7Ô 7Ñ8Ô8Ð:Ð:ØØ3˜œÐ3Ð3 kÐ3Ð3ð	ñ	
ô 	
ð 	
õ Œ~˜i¨tÐ4Ñ4Ô4Ð4r/   c                 ó8   — | j                              ¦   «          dS )zClose the SSH connection.N)r   r1   r-   s    r(   r1   zSSHConnection.close�   s   € àŒ�ŠÑÔÐÐÐr/   N)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r)   r.   r5   r8   r%   rW   r^   rb   rj   rl   r1   r,   r/   r(   r
   r
      sÅ   € € € € € Ø,Ð,ð;ð ;ð ;ð*ð ð ðð ð ð
ð 
ð 
ðð ð ð"!ð "!ð "!ðH.ð .ð .ð
.ð .ð .ð
(ð (ð (ð5ð 5ð 5ð 5ð:ð ð ð ð r/   r
   )rx   r#   rg   r!   rK   r   r   Ú
runpod.clir   Úrp_infor   Úrp_runpodignorer   Úrp_userspacer   Úinitr
   r,   r/   r(   ú<module>r~      sæ   ððð ð €€€Ø Ð Ð Ð Ø 
€
€
€
Ø Ð Ð Ð à €€€Ø €€€à !Ð !Ð !Ð !Ð !Ð !à (Ð (Ð (Ð (Ð (Ð (Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø +Ð +Ð +Ð +Ð +Ð +à €„˜Ð Ñ Ô Ð ðGð Gð Gð Gð Gñ Gô Gð Gð Gð Gr/   