o Qa2-@sddlmZmZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z zeWn ey;eZYnwddlZddlZddlmZmZmZmZgZdAddZedd d Zed ejejZe eZ!d d Z"ed d dZ#ede$ddddfddZ%ede$ddddfddZ&edddZ'edddZ(eddBddZ)eddCd d!Z*ed!dBd"d#Z+ed#dCd$d%Z,ed%dDd&d'Z-ed'dEd(d)Z.ed)d*d+Z/ed+d,d-Z0dFd/d0Z1ed0d1d2Z2ed2d3d4Z3ed4d5d6Z4ed6d7d8Z5ed8d9d:Z6ed:z ddl7Z7d;d<Z8Wne9ySddl:Z:d=d<Z8Ynwed<z ddl;Z;d>d?Z|t|}z||Wn&ty5}z|jtjkr+t|WYd}~nd}~ww|d8}|dks t||S)N?rr)osumaskr%OSErrorerrnoEEXIST)prefix randchars createfunc old_umasktriesdirnameerrrmktmpsomethingJs$      r4TMPz/tmpz/tmpdir- cCst||tjSN)r4r(mkdir)r-r.rrrmktmpdir]sr9z /tmpfile-cCsdd}t|||S)NcSsttt|tjtjBSr7)r(closeopen deunicodiseO_CREATO_EXCL)filenamerrrcszmktmpfile..)r4)r-r.r/rrr mktmpfilebs rBcCs`t}tt|d} |d}|sn||q Wd|S1s'wY|S)NrbTi)rr<r=readupdate hexdigest)r@hfpdatarrr hash_file_md5hs   rJc Cs |tj}g}|r+tjttj|s+|||r+tjttj|r|r||tj|}zt d|t t|Wn8t t fyg}zt d||j fWYd}~dSd}~wty}zt d||fWYd}~dSd}~ww|s-dS)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)NFT)splitr(seppathisdirr=joinappendrrr8r*IOErrorstrerror Exception)dir_name pathmembers tmp_stackcur_dirr3rrrmkdir_with_parentsus,    rXreplacecC|stjj}t||||Sr7)S3Configencodingrstringr]errorssilentrrr unicodise rbcCt|||dS)z. Alias to silent version of unicodise T)rbr_r]r`rrr unicodise_srfcCrZr7)r[r\r]r r^rrrr=rcr=cCrd)z0 Alias to silent version of deunicodise T)r=rerrr deunicodise_srgrhcCstt|||ddS)zs Convert 'string' to Unicode according to current encoding and replace all invalid characters with '?' u�?)rbr=rY)r_r]rrrunicodise_safesrjcCs |dur tjj}t|||Sr7)r[r\urlencoding_moder)r_rkunicode_outputrrrurlencode_strings  rmcCstjjdk}t||S)z replace_nonprintables(string) Replaces all non-printable characters 'ch' in 'string' where ord(ch) <= 26 with ^@, ^A, ... ^Z fixbucket)r[r\rkr)r_warning_messagerrrreplace_nonprintabless rpc Cst|tr|St|tst|tjrtt|St|dr'tt|St|dr3t|dSt|t sBt|t sBt|t rz| drUtt|ddWSt|WSt yzt|WYSt y}z td|WYd}~nd}~wwYnwtjd|) 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 timetuplestrftimez%s+rNz&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).) isinstancerrtime struct_timemktimehasattrrqrrstrunicodebytes startswith ValueErrorstrptimerr[ ExceptionsParameterError)texrrr time_to_epochs0        rTcCsB|rtd|tj}|rtjd||dfntd|tj}|r3tjd||dft|dkrAtjd|t|dkrOtjd ||rt|d kr_tjd |td |tjrotjd |td|tjrtjd|td|tjstjd|td|tjstjd|dS)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 (-).rz([^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)researchUNICODEr[rrgroupsr$)bucket dns_strictinvalidrrrcheck_bucket_names0   rcCs(zt|ddWStjjyYdSw)NT)rF)rr[rrrrrr check_bucket_name_dns_conformity s rcCsd|vrdSt|S)zk Check whether either the host_bucket support buckets and either bucket name is dns compatible %(bucket)sF)r) bucket_host bucket_namerrrcheck_bucket_name_dns_supportsrcCsZdtjjvr |dfStjjddi}t||tj}|s&|dfS|ddfS)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. rFrz(?P.*)rT)r[r\ host_bucketrrmatchrgroup)hostnamepatternmrrrgetBucketFromHostnames rcCstjjd|iS)Nr)r[r\rrrrrrgetHostnameFromBucket3srcCszt}|}|dkr4|||dkr0|t||}|s! |S|||t|8}|dks|S|||S)Nrr)rseekrDminrEr$rF)buffermfileoffset chunk_size send_chunkmd5_hash size_leftrIrrrcalculateChecksum8s   rcCtt|jS)z>returns a username from the password databse for the given uid)rfpwdgetpwuidpw_nameuidrrrgetpwuid_usernameMrcCs ttSr7)rfgetpassgetuserrrrrrRs cCr)zs                           "