L iw-ddlZddlZddlmZmZmZmZddlmZddl m Z m Z ddl m Z mZGdde ZGd d eZGd d e Zdd Zy)N)FTPFTP_TLSError error_perm)Any)AbstractBufferedFileAbstractFileSystem)infer_storage_options isfilelikec eZdZdZdZdZdZ dfd ZdZe dZ e d Z dd Z d Zd Zdfd Z ddZdZd dZddedededdfdZd!dededdfdZdZdZdZd"fd ZxZS)# FTPFileSystemzA filesystem over classic FTP/FftpNc  <t |di| ||_||_|xsd|_|xsd|xsd|xsdf|_||_| |_|||_nd|_| |_ |j|jr|jjyy)a You can use _get_kwargs_from_urls to get some kwargs from a reasonable FTP url. Authentication will be anonymous if username/password are not given. Parameters ---------- host: str The remote server name/ip to connect to port: int Port to connect with username: str or None If authenticating, the user's identifier password: str of None User's password on the server, if using acct: str or None Some servers also need an "account" string for auth block_size: int or None If given, the read-ahead or write buffer size. tempdir: str Directory on remote to put temporary files when in a transaction timeout: int Timeout of the ftp connection in seconds encoding: str Encoding to use for directories and filenames in FTP connection tls: bool Use FTP-TLS, by default False z/tmpNi) super__init__hostporttempdircredtimeoutencoding blocksizetls_connectrprot_p) selfrrusernamepasswordacct block_sizerrrrkwargs __class__s `/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/fsspec/implementations/ftp.pyrzFTPFileSystem.__init__sX "6"  (& NHNDJB>     !'DN"DN  88 HHOO  c"|jrt}nt}||j|j|_|j j |j|j|j j|jy)N)rr) rrrrrrconnectrrloginr)r ftp_clss r'rzFTPFileSystem._connectMs[ 88GG4<<$--H DII. "r(c`dt|djdjdzS)Nrpath)r lstriprstrip)clsr.s r'_strip_protocolzFTPFileSystem._strip_protocolVs.*408??DKKCPPPr(cdt|}|jdd|jdd|S)Nr.protocol)r pop)urlpathouts r'_get_kwargs_from_urlsz#FTPFileSystem._get_kwargs_from_urlsZs-#G,   D! r(c T|j|}g}||jvr |jj|Dcgc]\}}|dvr |ddvr||f}}}|D]^\}}dj |dk(rdn||jdg|d<|ddk(rt|d|d<nd |d<|dd k(sZd |d<`||j|<|jj||} |st| Dcgc]\}}| c}}S| Dcgc]\}}| c}}Scc}}w#t$rt |j|}YwxYw#t$rF |j|}|ddk(r||fg}n##ttf$r}t||d}~wwxYwYwxYwcc}}wcc}}w) N).z..type)pdircdirrrnamefilesizerdir directory)r2dircachermlsdr_mlsd2joinr/intrinfo IndexErrorFileNotFoundErrorgetsorted) r r.detailr%r7fndetailsrHexcfiless r'lszFTPFileSystem.lsas##D) t}} $ ;1.2XX]]4-@)R[0#FO3CCW C$' 6KB&)hh#s{biinE'GFOv&0*-gfo*>*+v%/*5 6'* d# !!$,7+"g278 8+01KB11; "1 40C1 ;;99T?DF|v- $d|nz*;+D1s:;  ;81sxD'D!D'AE :E 8 F  F$!D''E E E  E FE54F5F FFFFc |jdk(rddddS|j|jjdd} t fd|D}|S#t $r}t |d}~wwxYw)NrrrB)r>r@r;Tc34K|]}|dk(s |yw)r>Nr).0fr.s r' z%FTPFileSystem.info..s=Q1V9+.cbs MM! r(RETR )rcallback) isdirosr.existsmkdirr openr retrbinaryrclose)r rpathlpathr%rbras @r'get_filezFTPFileSystem.get_files ::e 77>>%(  e G5$'G  E7Onn  % MMO!r(c |t||||fi|Sgfd} |jjd||j||djS#t t f$r}t||d}~wwxYw)Nc(j|yr^)append)r`r7s r'rbz"FTPFileSystem.cat_file..cbs JJqMr(rcrrestrdr() rcat_filerrjrrrrJrF) r r.startendr%rborig_excr7r&s @r'rtzFTPFileSystem.cat_files ?7#D%?? ?  8 HH  v..  xx}z" 8#D)x 7 8s,AA<+ A77A<c ||j|}|xs |j}t|||||j||S)N)moder$r autocommit cache_options)r2rFTPFiler)r r.ryr$r{rzr%s r'_openzFTPFileSystem._opensH##D)14>>   !LL!'  r(c|j|}|jj||j|j |yr^)r2rdeleteinvalidate_cacherXr r.s r'_rmzFTPFileSystem._rms9##D)  dll401r(c|j|||}t|D]6}|j|r|j|&|j |8y)N) recursivemaxdepth) expand_pathreversedisfilerm_filermdir)r r.rrpathsps r'rmzFTPFileSystem.rmsM  X N% A{{1~ Q 1  r(r.create_parentsr%returnc (|j|}|j|}||jk7r&|j|s|r|j |||j j ||j|j|y)Nr)r2rX root_markerrgrhrmkdr)r r.rr%parents r'rhzFTPFileSystem.mkdirsr##D)d# T%% %dkk&.An JJvnJ =  T dll401r(exist_okc|j|}|j|r|st|dy|j|dy)Nz exists without `exist_ok`Tr)r2rgFileExistsErrorrh)r r.rs r'makedirszFTPFileSystem.makedirssK##D) ;;t %.H&IJJ JJtDJ 1r(c|j|}|jj||j|j |yr^)r2rrmdrrXrs r'rzFTPFileSystem.rmdirs9##D)  T dll401r(c |j|}|j|}|jj|||j|j ||j|j |yr^)r2rrenamerrX)r path1path2r%s r'mvzFTPFileSystem.mvsb$$U+$$U+ u% dll512 dll512r(c8|jjyr^)rrkr s r'__del__zFTPFileSystem.__del__s r(c||jjn|jj|dt||yr^)rCclearr5rr)r r.r&s r'rzFTPFileSystem.invalidate_caches9 < MM   ! MM  dD )  &r() NNNNNzutf-8F)T)NN)rbNNT)FNFr^)__name__ __module__ __qualname____doc__rcachabler4rr classmethodr2 staticmethodr8rRrHrnrtr}rrstrboolrrhrrrrr __classcell__r&s@r'rr s'KHH   :x#QQ #2J *,  *2 2#2t2c2d22S2D2T22 3''r(rceZdZdZy) TransferDonez+Internal exception to break out of transferN)rrrrrr(r'rrs5r(rcHeZdZdZ dfd ZdZdZdZddZxZ S) r|z9Interact with a remote FTP file with read/write bufferingc t |||f|||||d||sH|j|_dj |dt t jg|_yy)N)ryr$rz cache_typer{rr)rrr.targetrFruuiduuid4) r fsr.ryr$rzrr{r%r&s r'rzFTPFile.__init__sr    !!!'  ))DK&"3S5F!GHDIr(cd|jj|j|jyr^)rrr.rrs r'commitzFTPFile.commit)s  499dkk*r(cN|jj|jyr^)rrr.rs r'discardzFTPFile.discard,s  499r(cgdgfd} jjjdjj|djS#t $rv jjj jjjn)#t$rjjYnwxYwYwxYw)aGet bytes between given byte limits Implemented by raising an exception in the fetch callback when the number of bytes received reaches the requested amount. Will fail if the server does not respect the REST command on retrieve requests. rcdxxt|z cc<dz kDr2j|dz dz jkrtj|dz k(rjkrtyy)Nr)lenrqr@r)r`rvr7r rutotals r'rdz&FTPFile._fetch_range..callback;s !HA HQx#+% 17e uQx789?&& 1 Qx3;&3?"",;&r(rcrrr() rrrjr.rrabort getmultilinerrrF)r rurvrdr7rs``` @@r' _fetch_rangezFTPFile._fetch_range/s # # # GGKK " " {#..! # xx} # # !!# ((* #  " #  #s7AA&& C%0AB98C%9#CC%CC%$C%c|jjd|jjj d|j |j|j |jy)NrzSTOR )rrsT)bufferseekrr storbinaryr.roffset)r finals r' _upload_chunkzFTPFile._upload_chunkXsT   DII; T[[  r()rdefaultT readaheadNr) rrrrrrrrrrrs@r'r|r| s2C I2+'Rr(r|cHg}g}|j||j|D]|}|j}t|dkr"|ddj |dd|d|d|d|d d f}|d d dd k(r d|d d<nd|d d<|j|~|S)a( Fall back to using `dir` instead of `mlsd` if not supported. This parses a Linux style `ls -l` response to `dir`, but the response may be platform dependent. Parameters ---------- ftp: ftplib.FTP path: str Expects to be given path, but defaults to ".".  rr)modifyz unix.ownerz unix.group unix.moder@rdrAr;r?)rArqsplitrrF)rr.linesminfoline split_linethiss r'rErE`s E EGGD%,,ZZ\ z?Q   rN((:a?3(m(m']"1     7;  "c )#DGFO$DGFO T%& Lr()r:)rfrftplibrrrrtypingrspecr r utilsr r r Exceptionrr|rErr(r'rsK 22;5z'&z'z 9 P"Pf#r(