Ë
    #täi?  ã                   ó¢   — 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 d dlZddl	m
Z
 ddlmZ  ej                  d«      Z G d„ de
«      Zd	„ Zd
„ Zy)é    N)ÚS_ISDIRÚS_ISLNKé   )ÚAbstractFileSystem©Úinfer_storage_optionszfsspec.sftpc                   ó¤   ‡ — e Zd ZdZdZˆ fd„Zd„ Zed„ «       Ze	d„ «       Z
dd„Zdd„Zd	„ Zd
„ Ze	dd„«       Zdd„Zdd„Zd„ Zdd„Zd„ Zd„ Zˆ xZS )ÚSFTPFileSystemzüFiles over SFTP/SSH

    Peer-to-peer filesystem over SSH using paramiko.

    Note: if using this with the ``open`` or ``open_files``, with full URLs,
    there is no way to tell if a path is relative, so all paths are assumed
    to be absolute.
    )ÚsftpÚsshc                 ó¨   •— | j                   ryt        ‰| �  di |¤Ž |j                  dd«      | _        || _        || _        | j                  «        y)aµ  

        Parameters
        ----------
        host: str
            Hostname or IP as a string
        temppath: str
            Location on the server to put files, when within a transaction
        ssh_kwargs: dict
            Parameters passed on to connection. See details in
            https://docs.paramiko.org/en/3.3/api/client.html#paramiko.client.SSHClient.connect
            May include port, username, password...
        NÚtemppathz/tmp© )Ú_cachedÚsuperÚ__init__Úpopr   ÚhostÚ
ssh_kwargsÚ_connect)Úselfr   r   Ú	__class__s      €új/Volumes/fast/ai/experiments/MLX_z-image/.venv/lib/python3.12/site-packages/fsspec/implementations/sftp.pyr   zSFTPFileSystem.__init__   sH   ø€ ð �<Š<ØÜ‰ÑÑ&˜:Ò&Ø"Ÿ™ z°6Ó:ˆŒØˆŒ	Ø$ˆŒØ�‰�ó    c                 óp  — t         j                  d| j                  «       t        j                  «       | _        | j
                  j                  t        j                  «       «        | j
                  j                  | j                  fi | j                  ¤Ž | j
                  j                  «       | _        y )NzConnecting to SFTP server %s)ÚloggerÚdebugr   ÚparamikoÚ	SSHClientÚclientÚset_missing_host_key_policyÚAutoAddPolicyÚconnectr   Ú	open_sftpÚftp©r   s    r   r   zSFTPFileSystem._connect2   su   € Ü�‰Ð3°T·Y±YÔ?Ü×(Ñ(Ó*ˆŒØ�‰×/Ñ/´×0FÑ0FÓ0HÔIØˆ�‰×Ñ˜DŸI™IÑ9¨¯©Ò9Ø—;‘;×(Ñ(Ó*ˆ�r   c                 ó   — t        |«      d   S )NÚpathr   )Úclsr(   s     r   Ú_strip_protocolzSFTPFileSystem._strip_protocol9   s   € ä$ TÓ*¨6Ñ2Ð2r   c                 ód   — t        | «      }|j                  dd «       |j                  dd «       |S )Nr(   Úprotocol)r   r   )ÚurlpathÚouts     r   Ú_get_kwargs_from_urlsz$SFTPFileSystem._get_kwargs_from_urls=   s-   € ä# GÓ,ˆØ�‰�˜ÔØ�‰�
˜DÔ!Øˆ
r   c                 óð   — | j                  |«      }t        j                  d|«       | j                  |«      rt	        d|› �«      ‚|r| j                  |«       y | j                  j                  ||«       y )NzCreating folder %súFile exists: )r*   r   r   ÚexistsÚFileExistsErrorÚmakedirsr%   Úmkdir)r   r(   Úcreate_parentsÚmodes       r   r5   zSFTPFileSystem.mkdirD   s`   € Ø×#Ñ# DÓ)ˆÜ�‰Ð)¨4Ô0Ø�;‰;�tÔÜ! M°$°Ð"8Ó9Ð9áØ�M‰M˜$Õà�H‰H�N‰N˜4 Õ&r   c                 ó  — | j                  |«      r|st        d|› �«      ‚|j                  d«      }|d d dk(  rdnd}|D ]>  }|sŒ|r|› d|› �n|}| j                  |«      rŒ#| j                  j	                  ||«       Œ@ y )Nr1   Ú/é   Ú )r2   r3   Úsplitr%   r5   )r   r(   Úexist_okr7   ÚpartsÚnew_pathÚparts          r   r4   zSFTPFileSystem.makedirsO   s�   € Ø�;‰;�tÔ¡XÜ! M°$°Ð"8Ó9Ð9à—
‘
˜3“ˆØ˜r ˜( cš/‘3¨rˆãˆDÚÙ3;˜h˜Z q¨¨Ñ/À�Ø—{‘{ 8Õ,Ø—H‘H—N‘N 8¨TÕ2ñ	 r   c                 óˆ   — | j                  |«      }t        j                  d|«       | j                  j	                  |«       y )NzRemoving folder %s)r*   r   r   r%   Úrmdir©r   r(   s     r   rB   zSFTPFileSystem.rmdir\   s1   € Ø×#Ñ# DÓ)ˆÜ�‰Ð)¨4Ô0Ø�‰�‰�tÕr   c                 ó†   — | j                  |«      }| j                  | j                  j                  |«      «      }||d<   |S )NÚname)r*   Ú_decode_statr%   Ústat)r   r(   rG   s      r   ÚinfozSFTPFileSystem.infoa   s=   € Ø×#Ñ# DÓ)ˆØ× Ñ  §¡§¡¨tÓ!4Ó5ˆØˆˆV‰Øˆr   c           
      ó   — t        | j                  «      rd}nt        | j                  «      rd}nd}d| j                  || j                  | j
                  t        j                  j                  | j                  t        j                  j                  ¬«      t        j                  j                  | j                  t        j                  j                  ¬«      dœ}|r/dj                  |j                  d«      | j                  g«      |d<   |S )	NÚ	directoryÚlinkÚfiler;   )Útz)rE   ÚsizeÚtypeÚuidÚgidÚtimeÚmtimer9   rE   )r   Úst_moder   Úst_sizeÚst_uidÚst_gidÚdatetimeÚfromtimestampÚst_atimeÚtimezoneÚutcÚst_mtimeÚjoinÚrstripÚfilename)rG   Úparent_pathÚtr.   s       r   rF   zSFTPFileSystem._decode_statg   sÙ   € ä�4—<‘<Ô Ø‰AÜ�T—\‘\Ô"Ø‰AàˆAàØ—L‘LØØ—;‘;Ø—;‘;Ü×%Ñ%×3Ñ3Ø—‘¤(×"3Ñ"3×"7Ñ"7ð 4ó ô ×&Ñ&×4Ñ4Ø—‘¤(×"3Ñ"3×"7Ñ"7ð 5ó ñ
ˆñ ØŸ(™( K×$6Ñ$6°sÓ$;¸T¿]¹]Ð#KÓLˆC�‰KØˆ
r   c                 ó  — | j                  |«      }t        j                  d|«       | j                  j	                  |«      D �cg c]  }| j                  ||«      ‘Œ }}|r|S |D �cg c]  }|d   ‘Œ	 }}t        |«      S c c}w c c}w )NzListing folder %srE   )r*   r   r   r%   Úlistdir_iterrF   Úsorted)r   r(   ÚdetailrG   ÚstatsÚpathss         r   ÚlszSFTPFileSystem.ls€   s‰   € Ø×#Ñ# DÓ)ˆÜ�‰Ð(¨$Ô/Ø;?¿8¹8×;PÑ;PÐQUÔ;VÓWÑ;V°4�×"Ñ" 4¨Õ.Ð;VˆÐWÙØˆLá.3Ó4©e d�T˜&“\¨eˆEÐ4Ü˜%“=Ð ùò Xùò 5s   ÁBÁ(Bc                 óÔ   — | j                  | j                  t        j                  |«      «      d¬«       t        j                  d||«       | j                  j                  ||«       y )NT©r=   zPut file %s into %s)ÚmkdirsÚ_parentÚosÚfspathr   r   r%   Úput)r   ÚlpathÚrpathÚcallbackÚkwargss        r   Úput_filezSFTPFileSystem.put_fileŠ   sG   € Ø�‰�D—L‘L¤§¡¨5Ó!1Ó2¸TˆÔBÜ�‰Ð*¨E°5Ô9Ø�‰�‰�U˜EÕ"r   c                 ó¬   — | j                  |«      rt        j                  |d¬«       y | j                  j	                  | j                  |«      |«       y )NTrk   )Úisdirrn   r4   r%   Úgetr*   )r   rr   rq   rt   s       r   Úget_filezSFTPFileSystem.get_file�   s9   € Ø�:‰:�eÔÜ�K‰K˜¨Ö-à�H‰H�L‰L˜×-Ñ-¨eÓ4°eÕ<r   c                 óü  — t         j                  d|«       |j                  dd«      du r¯dj                  | j                  t        t        j                  «       «      g«      }| j                  j                  |||r|nd¬«      }||_        ||_
        | |_        t        j                  t        |«      |_        t        j                  t         |«      |_        |S | j                  j                  |||r|nd¬«      }|S )z­
        block_size: int or None
            If 0, no buffering, if 1, line buffering, if >1, buffer that many
            bytes, if None use default from paramiko.
        zOpening file %sÚ
autocommitTFr9   éÿÿÿÿ)Úbufsize)r   r   rx   r^   r   ÚstrÚuuidÚuuid4r%   ÚopenÚ
targetpathÚfsÚtypesÚ
MethodTypeÚcommit_a_fileÚcommitÚdiscard_a_fileÚdiscard)r   r(   r7   Ú
block_sizert   Úpath2Úfs          r   Ú_openzSFTPFileSystem._open•   sÍ   € ô 	�‰Ð&¨Ô-Ø�:‰:�l DÓ)¨UÑ2à—H‘H˜dŸm™m¬S´·±³Ó->Ð?Ó@ˆEØ—‘—‘˜e TÁ±:ÐQS�ÓTˆAØˆAŒJØˆAŒLØˆAŒDÜ×'Ñ'¬°qÓ9ˆAŒHÜ×(Ñ(¬¸Ó;ˆAŒIð ˆð —‘—‘˜d DÁ
±*ÐPR�ÓSˆAØˆr   c                 ó”   — | j                  |«      r| j                  j                  |«       y | j                  j                  |«       y ©N)rw   r%   rB   ÚremoverC   s     r   Ú_rmzSFTPFileSystem._rm©   s.   € Ø�:‰:�dÔØ�H‰H�N‰N˜4Õ à�H‰H�O‰O˜DÕ!r   c                 ó®   — | j                  |«      }| j                  |«      }t        j                  d||«       | j                  j	                  ||«       y )NzRenaming %s into %s)r*   r   r   r%   Úposix_rename)r   ÚoldÚnews      r   ÚmvzSFTPFileSystem.mv¯   sG   € Ø×"Ñ" 3Ó'ˆØ×"Ñ" 3Ó'ˆÜ�‰Ð*¨C°Ô5Ø�‰×Ñ˜c 3Õ'r   )Téÿ  )Fr—   r�   )F)ÚrbN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r,   r   r   Úclassmethodr*   Ústaticmethodr/   r5   r4   rB   rH   rF   ri   ru   ry   r�   r‘   r–   Ú__classcell__)r   s   @r   r
   r
      s‡   ø„ ñð €Hôò,+ð ñ3ó ð3ð ñó ðó	'ó3òò
ð òó ðó0!ó#ò
=óò("ö(r   r
   c                 ód   — | j                   j                  | j                  | j                  «       y r�   )rƒ   r–   r   r‚   r&   s    r   r†   r†   ¶   s   € Ø‡G�G‡J�Jˆt�}‰}˜dŸo™oÕ.r   c                 óN   — | j                   j                  | j                  «       y r�   )rƒ   r‘   r   r&   s    r   rˆ   rˆ   º   s   € Ø‡G�G‡K�K�—‘Õr   )rX   Úloggingrn   r„   r   rG   r   r   r   r;   r   Úutilsr   Ú	getLoggerr   r
   r†   rˆ   r   r   r   Ú<module>r¥      sL   ðÛ Û Û 	Û Û ß !ã å !Ý )à	ˆ×	Ñ	˜=Ó	)€ôc(Ð'ô c(òL/ór   