
    çgAA                         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
Z
ddlmZmZ ddlmZmZ  e j        d          Z G d d	e          Z G d
 de          ZdS )    N)suppress)quote   )AbstractBufferedFileAbstractFileSystem)infer_storage_optionstokenizewebhdfsc                   \    e Zd ZdZ e ej                              ZdZ	 	 	 	 	 	 	 	 	 	 	 d# fd	Z	e
d             Zd	 Zd$dZ	 	 	 	 	 d%dZed             Zed             Zed             Zd Zd&dZd Zd Zd Zd'dZd Zd Zd Zd(dZd Zd Zd&dZ d Z!d&dZ"d  Z#d! Z$d" Z% xZ&S ))WebHDFSa  
    Interface to HDFS over HTTP using the WebHDFS API. Supports also HttpFS gateways.

    Four auth mechanisms are supported:

    insecure: no auth is done, and the user is assumed to be whoever they
        say they are (parameter ``user``), or a predefined value such as
        "dr.who" if not given
    spnego: when kerberos authentication is enabled, auth is negotiated by
        requests_kerberos https://github.com/requests/requests-kerberos .
        This establishes a session based on existing kinit login and/or
        specified principal/password; parameters are passed with ``kerb_kwargs``
    token: uses an existing Hadoop delegation token from another secured
        service. Indeed, this client can also generate such tokens when
        not insecure. Note that tokens expire, but can be renewed (by a
        previously specified user) and may allow for proxying.
    basic-auth: used when both parameter ``user`` and parameter ``password``
        are provided.

    )r
   webHDFS  FNTc                     | j         rdS  t                      j        di | |
rdnd d| d| d| _        || _        |pi | _        i | _        |	pi | _        |||t          d          || j        d<   || _	        || _
        ||t          d	          n|
|| j        d
<   |
|| j        d<   |r|t          d          || _        || _        |                                  dt          ||           | _        dS )a  
        Parameters
        ----------
        host: str
            Name-node address
        port: int
            Port for webHDFS
        kerberos: bool
            Whether to authenticate with kerberos for this connection
        token: str or None
            If given, use this token on every call to authenticate. A user
            and user-proxy may be encoded in the token and should not be also
            given
        user: str or None
            If given, assert the user name to connect with
        password: str or None
            If given, assert the password to use for basic auth. If password
            is provided, user must be provided also
        proxy_to: str or None
            If given, the user has the authority to proxy, and this value is
            the user in who's name actions are taken
        kerb_kwargs: dict
            Any extra arguments for HTTPKerberosAuth, see
            `<https://github.com/requests/requests-kerberos/blob/master/requests_kerberos/kerberos_.py>`_
        data_proxy: dict, callable or None
            If given, map data-node addresses. This can be necessary if the
            HDFS cluster is behind a proxy, running on Docker or otherwise has
            a mismatch between the host-names given by the name-node and the
            address by which to refer to them from the client. If a dict,
            maps host names ``host->data_proxy[host]``; if a callable, full
            URLs are passed, and function must conform to
            ``url->data_proxy(url)``.
        use_https: bool
            Whether to connect to the Name-node using HTTPS instead of HTTP
        session_cert: str or Tuple[str, str] or None
            Path to a certificate file, or tuple of (cert, key) files to use
            for the requests.Session
        session_verify: str, bool or None
            Path to a certificate file to use for verifying the requests.Session.
        kwargs
        Nhttpshttpz://:z/webhdfs/v1z_If passing a delegation token, must not set user or proxy_to, as these are encoded in the token
delegationzQIf passing a password, the user must also beset in order to set up the basic-authz	user.namedoaszJIf using Kerberos auth, do not specify the user, this is handled by kinit.webhdfs_ )_cachedsuper__init__urlkerbkerb_kwargsparsproxy
ValueErroruserpasswordsession_certsession_verify_connectr	   _fsid)selfhostportkerberostokenr    r!   proxy_tor   
data_proxy	use_httpsr"   r#   kwargs	__class__s                 Z/var/www/html/ai-engine/env/lib/python3.11/site-packages/fsspec/implementations/webhdfs.pyr   zWebHDFS.__init__-   ss   r < 	F""6"""!*6ggSS4SS$SSS	&,"	%2
8#7   
 ',DIl#	 | <    )-	+& (DIf 	(2  
 ),6t 4 466


    c                     | j         S N)r%   r&   s    r0   fsidzWebHDFS.fsid   s
    zr1   c                 @   t          j                    | _        | j        r| j        | j        _        | j        | j        _        | j        rddlm	}  |di | j
        | j        _        | j        /| j        *ddlm}  || j        | j                  | j        _        d S d S d S )Nr   )HTTPKerberosAuth)HTTPBasicAuthr   )requestsSessionsessionr"   certr#   verifyr   requests_kerberosr7   r   authr    r!   requests.authr8   )r&   r7   r8   s      r0   r$   zWebHDFS._connect   s    ')) 	2 $ 1DL"19 	E:::::: 0 0 D D43C D DDL9 T]%>333333 -di G GDL ! %>%>r1   getc                    |                      | j        t          |pdd          z             }|                                }|                    | j                   |                                |d<   t                              d||           | j	        
                    |                                ||||          }	|	j        dv r	 |	                                }
|
d         d	         }|
d         d
         }|dv rt          |          |dv rt          |          |dv rt          |          t!          |          # t          t"          f$ r Y nw xY w|	                                 |	S )N z/=)safeopzsending %s with %s)methodr   paramsdataallow_redirects)i  i  i  i  i  RemoteExceptionmessage	exception)IllegalArgumentExceptionUnsupportedOperationException)SecurityExceptionAccessControlException)FileNotFoundException)_apply_proxyr   r   copyupdater   upperloggerdebugr;   requeststatus_codejsonr   PermissionErrorFileNotFoundErrorRuntimeErrorKeyErrorraise_for_status)r&   rE   rF   pathrH   redirectr.   r   argsouterrmsgexps                r0   _callzWebHDFS._call   s   5$+G+G+G GHH{{}}DIXXZZT
)3777l""<<>>$ # 
 
 ?777,hhjj+,Y7+,[9 WWW$S//)KKK)#...555+C000&s+++ )    	
s   0E EErbc           
      L    |p| j         }t          | |||| j        |||          S )a^  

        Parameters
        ----------
        path: str
            File location
        mode: str
            'rb', 'wb', etc.
        block_size: int
            Client buffer size for read-ahead or write buffer
        autocommit: bool
            If False, writes to temporary file that only gets put in final
            location upon commit
        replication: int
            Number of copies of file on the cluster, write mode only
        permissions: str or int
            posix permissions, write mode only
        kwargs

        Returns
        -------
        WebHDFile instance
        )mode
block_sizetempdir
autocommitreplicationpermissions)	blocksize	WebHDFilerl   )r&   r`   rj   rk   rm   rn   ro   r.   s           r0   _openzWebHDFS._open   sB    B  14>
!L!##	
 	
 	
 		
r1   c                 V    | d                                          | d<   | d         | d<   | S )Ntypelengthsize)lower)infos    r0   _process_infozWebHDFS._process_info   s-    F|))++VH~Vr1   c                 ,    t          |          d         S )Nr`   )r   )clsr`   s     r0   _strip_protocolzWebHDFS._strip_protocol   s    $T**622r1   c                     t          |           }|                    dd            |                    dd            d|v r|                    d          |d<   |S )Nr`   protocolusernamer    )r   pop)urlpathrc   s     r0   _get_kwargs_from_urlszWebHDFS._get_kwargs_from_urls   s\    #G,,
D!!!''*--CK
r1   c                     |                      d|          }|                                d         }||d<   |                     |          S )NGETFILESTATUSr`   
FileStatusname)rg   rZ   ry   )r&   r`   rc   rx   s       r0   rx   zWebHDFS.info  sF    jjtj44xxzz,'V!!$'''r1   c                 F   |                      d|          }|                                d         d         }|D ];}|                     |           |                    d          dz   |d         z   |d<   <|rt	          |d 	          S t	          d
 |D                       S )N
LISTSTATUSr   FileStatusesr   /
pathSuffixr   c                     | d         S )Nr   r   )is    r0   <lambda>zWebHDFS.ls.<locals>.<lambda>  s
    qy r1   )keyc              3   &   K   | ]}|d          V  dS )r   Nr   ).0rx   s     r0   	<genexpr>zWebHDFS.ls.<locals>.<genexpr>  s&      994$v,999999r1   )rg   rZ   ry   rstripsorted)r&   r`   detailrc   infosrx   s         r0   lsz
WebHDFS.ls  s    jjDj11

>*<8 	G 	GDt$$$;;s++c1D4FFDLL 	:%%8%89999995999999r1   c                 d    |                      d|          }|                                d         S )z8Total numbers of files, directories and bytes under pathGETCONTENTSUMMARYr   ContentSummaryrg   rZ   )r&   r`   rc   s      r0   content_summaryzWebHDFS.content_summary  s,    jj,4j88xxzz*++r1   c                 p   |                      d|d          }d|j        v rh|                     |j        d                   }| j                            |          }|                                 |                                d         S |                                 |                                d         S )z/Checksum info of file, giving method and resultGETFILECHECKSUMF)r`   ra   LocationFileChecksum)rg   headersrR   r;   rA   r_   rZ   )r&   r`   rc   locationout2s        r0   ukeyzWebHDFS.ukey  s    jj*jFF$$((Z)@AAH<##H--D!!###99;;~..  """88::n--r1   c                 `    |                      d          }|                                d         S )zGet user's home directoryGETHOMEDIRECTORYPathr   )r&   rc   s     r0   home_directoryzWebHDFS.home_directory*  s'    jj+,,xxzz&!!r1   c                     |r|                      d|          }n|                      d          }|                                d         }|t          d          |d         S )zRetrieve token which can give the same authority to other uses

        Parameters
        ----------
        renewer: str or None
            User who may use this token; if None, will be current user
        GETDELEGATIONTOKEN)renewerTokenNz1No token available for this user/security context	urlString)rg   rZ   r   )r&   r   rc   ts       r0   get_delegation_tokenzWebHDFS.get_delegation_token/  sf      	3**17*CCCC**122CHHJJw9PQQQ~r1   c                 f    |                      dd|          }|                                d         S )z/Make token live longer. Returns new expiry timeRENEWDELEGATIONTOKENputrF   r*   longr   )r&   r*   rc   s      r0   renew_delegation_tokenzWebHDFS.renew_delegation_token@  s-    jj/UjKKxxzz&!!r1   c                 6    |                      dd|           dS )z Stop the token from being usefulCANCELDELEGATIONTOKENr   r   Nrg   )r&   r*   s     r0   cancel_delegation_tokenzWebHDFS.cancel_delegation_tokenE  s!    

*5
FFFFFr1   c                 8    |                      dd||           dS )a  Set the permission at path

        Parameters
        ----------
        path: str
            location to set (file or directory)
        mod: str or int
            posix epresentation or permission, give as oct string, e.g, '777'
            or 0o777
        SETPERMISSIONr   )rF   r`   
permissionNr   )r&   r`   mods      r0   chmodzWebHDFS.chmodI  s$     	

?5t
LLLLLr1   c                 F    i }|||d<   |||d<    | j         dd|d| dS )zChange owning user and/or groupNownergroupSETOWNERr   rF   r`   )r   r   )r&   r`   r   r   r.   s        r0   chownzWebHDFS.chownV  sJ    #F7O#F7O
Ae$AA&AAAAAr1   c                 8    |                      d|d|           dS )a9  
        Set file replication factor

        Parameters
        ----------
        path: str
            File location (not for directories)
        replication: int
            Number of copies of file on the cluster. Should be smaller than
            number of data nodes; normally 3 on most systems.
        SETREPLICATIONr   )r`   rF   rn   Nr   )r&   r`   rn   s      r0   set_replicationzWebHDFS.set_replication_  s%     	

#$u+
VVVVVr1   c                 6    |                      dd|           d S )NMKDIRSr   r   r   r&   r`   r.   s      r0   mkdirzWebHDFS.mkdirm  s     

8E
55555r1   c                     |du r$|                      |          rt          |          |                     |           d S )NF)existsFileExistsErrorr   )r&   r`   exist_oks      r0   makedirszWebHDFS.makedirsp  sD    uT!2!2!$'''

4r1   c                 8    |                      dd||           d S )NRENAMEr   )rF   r`   destinationr   )r&   path1path2r.   s       r0   mvz
WebHDFS.mvu  s"    

8E5
IIIIIr1   c                 @    |                      dd||rdnd           d S )NDELETEdeletetruefalse)rF   r`   	recursiver   )r&   r`   r   r.   s       r0   rmz
WebHDFS.rmx  s<    

 )6ffw	 	 	
 	
 	
 	
 	
r1   c                 0    |                      |           d S r3   )r   r   s      r0   rm_filezWebHDFS.rm_file  s    r1   c                 8   |                      |          5 }d                    |                     |          dt          j        d           g          }	 |                      |d          5 }t          j        ||           d d d            n# 1 swxY w Y   |                     ||           nP# t          $ rC t          t                    5  |                     |           d d d            n# 1 swxY w Y    w xY w	 d d d            d S # 1 swxY w Y   d S )Nr   z.tmp.   wb)openjoin_parentsecrets	token_hexshutilcopyfileobjr   BaseExceptionr   r\   r   )r&   lpathrpathr.   lstream	tmp_fnamerstreams          r0   cp_filezWebHDFS.cp_file  s   YYu 	$,,u"5"57Vw?PQS?T?T7V7V!WXXIYYy$// 97&w8889 9 9 9 9 9 9 9 9 9 9 9 9 9 9	5))))    /00 ' 'GGI&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' ' *	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	sr   A DB1-BB1B	B1B	B10D1C>C1%C>1C55C>8C59C>>DDDc                     | j         r*t          | j                   r|                      |          }n=| j         r6| j                                         D ]\  }}|                    ||d          }|S )N   )r   callableitemsreplace)r&   r   kvs       r0   rR   zWebHDFS._apply_proxy  sy    : 	5(4:.. 	5zz(++HHZ 	5
((** 5 51#++Aq!44r1   )r   FNNNNNNFNT)rA   NNT)rh   NTNNFr3   )NN)'__name__
__module____qualname____doc__strtempfile
gettempdirrl   r~   r   propertyr5   r$   rg   rr   staticmethodry   classmethodr|   r   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rR   __classcell__r/   s   @r0   r   r      s        * c%(%''((G#H
 c7 c7 c7 c7 c7 c7J   XH H H$   F +
 +
 +
 +
Z   \
 3 3 [3   \( ( (	: 	: 	: 	:, , ,

. 
. 
." " "
   "" " "
G G GM M MB B B BW W W6 6 6   
J J J
 
 
 
          r1   r   c                   B     e Zd ZdZ fdZd	dZd Zd Zd Zd Z	 xZ
S )
rq   z"A file living in HDFS over webHDFSc                 H    t                      j        ||fi | |                                }|                    dd           |                    dd            |                    dd           |                    dd            |                    dd          | _        |                    d          }|                    dd          du rQ| j        | _        t          j        	                    |t          t          j                                        | _        d S d S )Nro   rn   i  rl   rm   F)r   r   rS   rA   r   ro   r`   targetosr   r   uuiduuid4)r&   fsr`   r.   rl   r/   s        r0   r   zWebHDFile.__init__  s    T,,V,,,::mT**2JJ}d+++::mT**2JJ}d+++!::mS99**Y''::lE**e33)DKWc$*,,.?.?@@DIII 43r1   Fc                     | j         j                            | j        | j                                        ddi          }|                                 dS )zWrite one part of a multi-block file upload

        Parameters
        ==========
        final: bool
            This is the last block, so should complete file, if
            self.autocommit is True.
        content-typeapplication/octet-stream)rH   r   T)r  r;   postr   buffergetvaluer_   )r&   finalrc   s      r0   _upload_chunkzWebHDFile._upload_chunk  sZ     go""M%%''#%?@ # 
 

 	tr1   c                    | j                                         }d| j        v rd\  }}n
d\  }}d|d<    | j        j        ||| j        fddi|}| j                            |j        d                   }d	| j        v r| j        j        	                    |d
di          }|
                                  | j        j        dd| j        fddi|}| j                            |j        d                   | _        dS dS )zCreate remote file/uploada)APPENDPOST)CREATEPUTr   	overwritera   Fr   wr  r  )r   r  r  N)r.   rS   rj   r  rg   r`   rR   r   r;   r   r_   r   )r&   r.   rE   rF   rc   r   r   s          r0   _initiate_uploadzWebHDFile._initiate_upload  s   !!##$))JB(JB"(F;dgmB	LLELVLL7''J(?@@$)7?&&>3M"N '  D !!### 47=649WWuWPVWWD G00j1IJJDMMM r1   c                    t          |d          }t          | j        |          }||k    s|| j        k    rdS | j                            d| j        |||z
  d          }|                                 d|j        v rK|j        d         }| j        j        	                    | j        
                    |                    }|j        S |j        S )Nr   r1   OPENF)r`   offsetru   ra   r   )maxminrv   r  rg   r`   r_   r   r;   rA   rR   content)r&   startendrc   r   r   s         r0   _fetch_rangezWebHDFile._fetch_range  s    E1$)S!!C<<5DI--3gmm5uu  
 
 	$${:.H7?&&tw';';H'E'EFFD<;r1   c                 P    | j                             | j        | j                   d S r3   )r  r   r`   r  r4   s    r0   commitzWebHDFile.commit  s"    

49dk*****r1   c                 D    | j                             | j                   d S r3   )r  r   r`   r4   s    r0   discardzWebHDFile.discard  s    

49r1   r   )r   r   r   r   r   r  r  r&  r(  r*  r  r  s   @r0   rq   rq     s        ,,A A A A A   "K K K(   + + +      r1   rq   )loggingr	  r   r   r   r
  
contextlibr   urllib.parser   r9   specr   r   utilsr   r	   	getLoggerrV   r   rq   r   r1   r0   <module>r1     s    				                  ; ; ; ; ; ; ; ; 3 3 3 3 3 3 3 3		9	%	%D D D D D  D D DNI I I I I$ I I I I Ir1   