3
b2-                 @   s  d dl mZm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 ye W n ek
rx   eZY nX d dlZd dlZd dlmZmZmZmZ g ZdAddZejd d	d
 Zejd
 ejej Ze eZ!dd Z"ejd dd Z#ejd ej$ddd dfddZ%ejd ej$ddd dfddZ&ejd dd Z'ejd dd Z(ejd dBddZ)ejd dCd d!Z*ejd! dDd"d#Z+ejd# dEd$d%Z,ejd% dFd&d'Z-ejd' dGd(d)Z.ejd) d*d+ Z/ejd+ d,d- Z0dHd/d0Z1ejd0 d1d2 Z2ejd2 d3d4 Z3ejd4 d5d6 Z4ejd6 d7d8 Z5ejd8 d9d: Z6ejd: yd dl7Z7d;d< Z8W n& e9k
r   d dl:Z:d=d< Z8Y nX ejd< yd dl;Z;d>d? Z<W n e9k
r   d@d? Z<Y nX ejd? dS )I    )absolute_importdivisionN)md5)debug)base_urlencode_stringbase_replace_nonprintablesbase_unicodisebase_deunicodiseFc             C   sl   |rt | pt| } |r`ddddg}d}x| dkrF| d } |jd}q*W |rTt | pZt| |fS | dfS d S )	NKMGT i   i   r   )floatintpop)sizehuman_readablefloating_pointZcoeffsZcoeff r   H/oak/stanford/groups/akundaje/marinovg/programs/s3cmd-master/S3/Utils.py
formatSize'   s    
r   c             C   s*   i }x | D ]}|d ||d j  < q
W |S )zL
    Header keys are always in lowercase in python2 but not in python3.
       r   )lower)listretvaltupler   r   r   convertHeaderTupleListToDict5   s    
r   c             C   s6   d}x,| dkr0|t tjdtd  7 }| d8 } qW |S )Nr   r   r   )
_rnd_charsrandomrandint_rnd_chars_len)lenr   r   r   r   rndstrA   s
    
r#   c             C   s   t jd}d}xj|dkrx| t| }y|| P W n: tk
rl } z|jtjkr\t j|  W Y d d }~X nX |d8 }qW t j| |S )N?      r   r   )osumaskr#   OSErrorerrnoEEXIST)prefix	randchars
createfuncZ	old_umaskZtriesdirnameer   r   r   mktmpsomethingJ   s    



r0   TMPz/tmpz/tmpdir-
   c             C   s   t | |tjS )N)r0   r&   mkdir)r+   r,   r   r   r   mktmpdir]   s    r4   z	/tmpfile-   c             C   s   dd }t | ||S )Nc             S   s   t jt jt| t jt jB S )N)r&   closeopendeunicodiseO_CREATO_EXCL)filenamer   r   r   <lambda>c   s    zmktmpfile.<locals>.<lambda>)r0   )r+   r,   r-   r   r   r   	mktmpfileb   s    r=   c          
   C   sH   t  }tt| d&}x|jd}|s(P |j| qW W d Q R X |j S )Nrb    i   i   )r   r7   r8   readupdate	hexdigest)r;   hfpdatar   r   r   hash_file_md5h   s    
rF   c             C   s   | j tj}g }x0|r@tjjttjj| r@|j|j  qW x|r|j|j  tjj|}yt	d|  tj
t| W qD ttfk
r } zt	d||jf  dS d}~X qD tk
r } zt	d||f  dS d}~X qDX qDW dS )z
    mkdir_with_parents(dst_dir)

    Create directory 'dir_name' with all parent directories

    Returns True on success, False otherwise.
    z	mkdir(%s)z(Can not make directory '%s' (Reason: %s)FNT)splitr&   seppathisdirr8   joinappendr   r   r3   r(   IOErrorstrerror	Exception)Zdir_nameZpathmembersZ	tmp_stackZcur_dirr/   r   r   r   mkdir_with_parentsu   s"     rP   replacec             C   s   |st jj j}t| |||S )N)S3Configencodingr   )stringrT   errorssilentr   r   r   	unicodise   s    rX   c             C   s   t | ||dS )z.
    Alias to silent version of unicodise
    T)rX   )rU   rT   rV   r   r   r   unicodise_s   s    rY   c             C   s   |st jj j}t| |||S )N)rR   rS   rT   r	   )rU   rT   rV   rW   r   r   r   r8      s    r8   c             C   s   t | ||dS )z0
    Alias to silent version of deunicodise
    T)r8   )rU   rT   rV   r   r   r   deunicodise_s   s    rZ   c             C   s   t t| ||jddS )zs
    Convert 'string' to Unicode according to current encoding
    and replace all invalid characters with '?'
    u   �?)rX   r8   rQ   )rU   rT   r   r   r   unicodise_safe   s    r\   c             C   s    |d krt jj j}t| ||S )N)rR   rS   urlencoding_moder   )rU   r]   unicode_outputr   r   r   urlencode_string   s    r_   c             C   s   t jj jdk}t| |S )z
    replace_nonprintables(string)

    Replaces all non-printable characters 'ch' in 'string'
    where ord(ch) <= 26 with ^@, ^A, ... ^Z
    	fixbucket)rR   rS   r]   r   )rU   Zwarning_messager   r   r   replace_nonprintables   s    ra   c             C   s  t | tr| S t | ts$t | tjr2ttj| S t| drNttj| j S t| drft| jdS t | t	st | t
st | try*| jdrtj t| dd  S t| S  tk
r    y
tj| S  tk
 r } ztd| W Y dd}~X nX Y nX tjjd|  dS )	zConvert time specified in a variety of forms into UNIX epoch time.
    Accepts datetime.datetime, int, anything that has a strftime() method, and standard time 9-tuples
    	timetuplestrftimez%s+r   Nz&Failed to parse date with strptime: %sz}Unable to convert %r to an epoch time. Pass an epoch time. Try `date -d 'now + 1 year' +%%s` (shell) or time.mktime (Python).)
isinstancer   r   timestruct_timemktimehasattrrb   rc   strunicodebytes
startswith
ValueErrorstrptimer   rR   
ExceptionsParameterError)texr   r   r   time_to_epoch   s(    


 


rt   Tc             C   sJ  |r6t jd| t j}|rftjjd| |j d f n0t jd| t j}|rftjjd| |j d f t| dk rtjjd|  t| dkrtjjd	|  |rFt| d
krtjjd|  t jd| t jrtjjd|  t jd| t jrtjjd|  t jd| t js$tjjd|  t jd| t jsFtjjd|  dS )Nz([^a-z0-9\.-])zBucket name '%s' contains disallowed character '%s'. The only supported ones are: lowercase us-ascii letters (a-z), digits (0-9), dot (.) and hyphen (-).r   z([^A-Za-z0-9\._-])zBucket name '%s' contains disallowed character '%s'. The only supported ones are: us-ascii letters (a-z, A-Z), digits (0-9), dot (.), hyphen (-) and underscore (_).   z0Bucket name '%s' is too short (min 3 characters)   z1Bucket name '%s' is too long (max 255 characters)r$   z0Bucket name '%s' is too long (max 63 characters)z-\.zEBucket name '%s' must not contain sequence '-.' for DNS compatibilityz\.\.zEBucket name '%s' must not contain sequence '..' for DNS compatibilityz	^[0-9a-z]z4Bucket name '%s' must start with a letter or a digitz	[0-9a-z]$z2Bucket name '%s' must end with a letter or a digitT)researchUNICODErR   rp   rq   groupsr"   )bucket
dns_strictinvalidr   r   r   check_bucket_name   s.    r~   c             C   s*   yt | ddS  tjjk
r$   dS X d S )NT)r|   F)r~   rR   rp   rq   )r{   r   r   r    check_bucket_name_dns_conformity
  s    r   c             C   s   d| krdS t |S )zk
    Check whether either the host_bucket support buckets and
    either bucket name is dns compatible
    z
%(bucket)sF)r   )Zbucket_hostZbucket_namer   r   r   check_bucket_name_dns_support  s    r   c             C   sZ   dt jj jkr| dfS t jj jj ddi }tj|| tj}|sL| dfS |jddfS )z
    bucket, success = getBucketFromHostname(hostname)

    Only works for hostnames derived from bucket names
    using Config.host_bucket pattern.

    Returns bucket name and a boolean success flag.
    z
%(bucket)sFr{   z(?P<bucket>.*)r   T)rR   rS   host_bucketr   rw   matchry   group)hostnamepatternmr   r   r   getBucketFromHostname  s    	r   c             C   s   t jj jj d| i S )Nr{   )rR   rS   r   r   )r{   r   r   r   getHostnameFromBucket3  s    r   c             C   sj   t  }|}| dkrX|j| xD|dkrT|jt||}|s<P |j| |t|8 }qW n
|j|  |j S )Nr   r   )r   seekr@   minrA   r"   rB   )bufferZmfileoffsetZ
chunk_sizeZ
send_chunkZmd5_hashZ	size_leftrE   r   r   r   calculateChecksum8  s    



r   c             C   s   t tj| jS )z>returns a username from the password databse for the given uid)rY   pwdgetpwuidpw_name)uidr   r   r   getpwuid_usernameM  s    r   c             C   s   t tj S )N)rY   getpassZgetuser)r   r   r   r   r   R  s    c             C   s   t tj| jS )z<returns a groupname from the group databse for the given gid)rY   grpgetgrgidgr_name)gidr   r   r   getgrgid_grpnameX  s    r   c             C   s   dS )NZnobodyr   )r   r   r   r   r   \  s    )FF)NrQ   F)NrQ   )NrQ   F)NrQ   )N)NF)T)=
__future__r   r   r&   rf   rw   rU   Z
string_modr   r)   hashlibr   loggingr   rk   	NameErrorrj   	S3.ConfigrR   S3.ExceptionsS3.BaseUtilsr   r   r   r	   __all__r   rL   r   ascii_lettersdigitsr   r"   r!   r#   r0   getenvr4   r=   rF   rP   rX   rY   r8   rZ   r\   r_   ra   rt   r~   r   r   r   r   r   r   r   ImportErrorr   r   r   r   r   r   r   <module>	   s   






















	
"


	




