Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
python3-s3fuse-plugin / usr / lib / python3.6 / site-packages / s3fuse / __pycache__ / s3vaultfuse.cpython-36.opt-1.pyc
Size: Mime:
3

©DgóGãG@södZddlZddlZddlZddlZddlZddlZddlmZddlZddl	Z	ddl
Z
ddlZddlZddlm
Z
ddlmZyddlmZmZWn$ek
r¸ddlmZmZYnXddlmZyddlmZmZmZWn*ek
rddlmZmZmZYnXdd	lmZdd
lmZyddl m!Z!Wn"ek
rTddl"m!Z!YnXddl#m$Z%dd
l&m'Z'ddl#m(Z(ddl#m)Z)dZ*dZ+dZ,dZ-e!j.ddddde!j.dddddgZ/e!j0dddde!j0d dd!de!j0d"dd#de!j0d$dd%d&d'e!j0d(e*d)d*d'e!j0d+dd,d-d.e!j0d/d0d1d2e!j.d3dd4d5e!j0d6d7d8d5g	Z1e!j.d9d:d;d5e!j.d<dd=d5e!j.d>dd?d5e!j.d@ddAd5e!j2dBdCdDd5gZ3e!j2dEdFdGd5e!j2dHdIdJd5e!j0dKdLdMd5e!j0dNdOdPd5e!j0dQdRdSd5e!j0dTdUdVd5e!j0dWdXdYd5e!j0dZd[d\d5e!j4d]d^d_d`dadbdcgddd5e!j.deddfd5e!j.dgddhd5e!j0didjdkd5e!j0dldjdmd5e!j2dnddod5gZ5e!j0dpdqdrd5e!j0dsdtdue!j0dvdwdtd5e!j2dxe,dyd5e!j2dze-d{d5e!j2d|d}d~d5e!j2ddâd‚d5e!j2dƒd„d…d5e!j0d†d‡ddˆd'e!j0d‰dŠd‹d5e!j0dŒddŽd5e!j0dddd5e!j0d‘dd’d5e!j0d“dd”d5e!j0d•dd–d5e!j0d—d˜d™d5e!j.dšd:d›d5e!j0dœe'ƒdd5e!j0dždŸd d5e!j0d¡d¢d£d5e!j0d¤d¥d¦d5e!j0d§d¥d¨d5e!j0d©dªd«d5e!j0d¬d­d®d5e!j0d¯d°d±d5e!j0d²d³d´d5e!j0dµd¶d·d5e!j.d¸dd¹d5e!j.dºdd»d5gZ6e!j7Z7e7j8e6ƒe7j9e1ƒe7j9e3ƒe7j9e5ƒe7j9e/ƒye:ej;d¼ƒZ<e7e<gƒWn(ek
rxe7ej=dCd…ƒYnXd½e7j>ƒks–d½e)j?ƒkr¤dd¾l@mAZAndd¿l#mBZAe%jCe7ƒZDddCgdÀdddddddddddddd\
d:dddej;jEdƒej;jEdÃej;jEdădddd:dddddddddgddd:ddd:dÅdÅdÅdÅdddƜ&ZFdÇdȄZGdÅZHdÉZIejJƒZKejLejMƒƒjNZOdÊZPdËZQdÌd̈́ZRdÎdτZSdÐdфZTGdÒdӄdÓeUƒZVGdÔdՄdÕeVƒZWGdÖdׄd×eUƒZXGdØd°„d°eƒZYdãdÚdۄZZdÜd݄Z[dÞd߄Z\e]dàkròe\ƒdS)äad Trilio Fuse plugin implimentation

    This module is based on the vaultfuse.py module and will eventually
    become the new vaultfuse.py module once integration and refactoring
    of the existing vaultswift.py is complete.

    Currently this module is temporary for the 2.6 release and will be merged
    into a new vaultfuse.py for the next release.
éN)Údatetime)ÚThread)Úgetpwnam)ÚQueueÚEmpty)ÚLRUCache)ÚFUSEÚFuseOSErrorÚ
Operations)ÚClientError)Úbunchify)Úcfg)Ú
tr_logging)Úget_ssl_cert_path)Úvaults3)Ú
config_parserz%Y-%m-%d %H:%M:%Sz$80bc80ff-0c51-4534-86a2-ec5e719643c2édéÚdebugÚdFzUPrint debugging output (set logging level to DEBUG instead of default WARNING level).)ZshortÚdefaultÚhelpÚverboseÚvzWPrint more verbose output (set logging level to INFO instead of default WARNING level).z
log-configÚPATHzßIf this option is specified, the logging configuration file specified is used and overrides any other logging options specified. Please see the Python logging module documentation for details on logging configuration files.)Úmetavarrzlog-config-appendz(Optional) Log Appendzwatch-log-filez(Optional) Watch logz
log-formatZFORMATzÞA logging.Formatter log message format string which may use any of the available logging.LogRecord attributes. This option is deprecated.  Please use logging_context_format_string and logging_default_format_string instead.)rrrzlog-date-formatZDATE_FORMATzCFormat string for %%(asctime)s in log records. Default: %(default)szlog-fileZlogfilezZ(Optional) Name of log file to output to. If no default is set, logging will go to stdout.)rÚdeprecated_namerzlog-dirZlogdirz@(Optional) The base directory used for relative --log-file paths)rrz
use-syslogzUse syslog for logging.)rrzsyslog-log-facilityZLOG_USERz$syslog facility to receive log linesZ
use_stderrTzLog output to standard errorZuse_journalz%Enable Systemd native journal supportZuse_eventlogz Log output to Windows Event Log.Zuse_jsonz4Enables JSON formatting in the logs when set to TrueZrate_limit_burstézBurst limitZlog_rotate_intervaléz0Interval, number of hours, of log rate limiting.Zmax_logfile_counté<zNumber of log files to retain.Zlog_rotate_interval_typeZHourszUnits of log rotation intervalZlog_rotation_typeZintervalztype of log retentionZlogging_context_format_stringzw%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user)s %(tenant)s] %(instance)s%(message)sz2format string to use for log messages with contextZlogging_default_format_stringzV%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)sz5format string to use for log messages without contextZlogging_debug_format_suffixz$%(funcName)s %(pathname)s:%(lineno)dz0data to append to log format when level is DEBUGZlogging_exception_prefixz?%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)sz5prefix each line of exception output with this formatZdefault_log_levelszamqplib=WARNzsqlalchemy=WARNz	boto=WARNz	suds=INFOz
keystone=INFOzeventlet.wsgi.server=WARNzlist of logger=LEVEL pairsZpublish_errorszpublish error eventsZfatal_deprecationszmake deprecations fatalZinstance_formatz[instance: %(uuid)s] zBIf an instance is passed with the log message, format it like thisZinstance_uuid_formatzGIf an instance UUID is passed with the log message, format it like thisZrate_limit_intervalz2Interval, number of seconds, of log rate limiting.Zvault_storage_typeZs3z'Storage type: nfs, swift-i, swift-s, s3Úvault_data_directoryz'Location where snapshots will be stored)rÚvault_data_directory_oldz/var/triliovaultÚqueue_depthz-The number of writes to be queued (writeback)Úworker_pool_sizez3Number of worker threads to process the write queueZvault_retry_countéz(The number of times we retry on failuresÚvault_segment_sizeé izvault object segmentation sizeÚvault_cache_sizeéz6Number of segments of an object that need to be cachedZ
rootwrap_confz/etc/nova/rootwrap.confzrootwrap config fileZvault_s3_auth_versionZDEFAULTzS3 Authentication typeÚvault_s3_access_key_idÚz	S3 Key IDÚvault_s3_secret_access_keyzS3 Secret Access KeyÚvault_s3_region_namez	S3 RegionÚvault_s3_bucketz	S3 BucketÚvault_s3_endpoint_urlzS3 Endpoint URLÚvault_s3_sslÚFalsezEnable SSL certificateÚvault_s3_ssl_verifyz)Whether or not to verify SSL certificatesÚvault_s3_ssl_certzUse SSL certificate bundleÚvault_s3_signature_versionrzS3 signature version to useÚvault_s3_read_timeoutZ30z3Time in seconds to wait for a response to API callsZvault_enable_threadpoolÚTruezEnable backend thread poolÚvault_threaded_filesystemz"Allow multiple file system threadsZmax_uploads_pendingZ20zNumber of file uploads.Zvault_cache_usernameZnovazSystem username.Úvault_storage_nfs_exportÚTrilioVaultzendpoint/bucket_nameZvault_logging_levelÚerrorz0Logging level filter (debug, info, warn, error).Úvault_s3_max_pool_connectionsÚ500z>The maximum number of connections to keep in a connection poolÚbucket_object_lockz#S3 bucket object locking is enabledÚuse_manifest_suffixzyTo preserve backward compatibility, set this to False.When set to False, s3fuse creates manifest file nameswithout suffixZFLAGZs3fuse_sys_admin)Úfs)Úutilsz1.0)
Zproject_nameÚregion_nameZuser_domain_nameZ
endpoint_typeÚobject_storage_urlZproject_domain_idÚuser_idZuser_domain_idZ	tenant_idZservice_typeZ
project_idZ
auth_tokenZproject_domain_nameZ	OS_CACERTZOS_CERTZOS_KEYé
)&Zsync_torÚheaderÚauth_versionÚ
os_optionsZssl_compressionZos_storage_urlZos_usernameZos_passwordZ	os_cacertZos_certZos_keyZos_tenant_nameZos_auth_urlZ
os_auth_tokenZinsecureZsnetZsync_keyZauthÚuserÚkeyZread_aclÚinfoZretriesZ	write_aclÚmetarZuse_sloZchecksumZchangedÚleave_segmentsZskip_identicalZsegment_threadsZobject_dd_threadsZobject_uu_threadsZcontainer_threadsZyes_allÚobject_namecCs
dtd<tjtd<tjtd<tjtd<tjtd<tjtd<tjtd<tjtd	<tj	td
<tj
td<dtd
<tjtd<dtd<tjrtjtdd<tj
r¤tj
tdd<tjs¶tjtd<nPtj
jƒdkrÞtjjtjƒrÞtjtd
<n(tj
jƒdkrtjdtjƒdtd
<dS)Nz1.0rErGrHZbucketZs3_signatureZs3_read_timeoutr:r<r=Zs3_sslr*Zs3_ssl_certZ
s3_ssl_verifyZ
COMPLIANCEZretention_moderFrAr@ÚtrueZfalsezcInvalid S3 SSL cert file path: %sUsing Default path, set the value to False for insecure connection)ÚoptionsÚCONFr)r+r-r3r4r:r<r=r/r1r.r,ÚlowerÚosÚpathÚexistsr2ÚLOGÚwarn©rVrVú!/usr/lib/python3.6/s3vaultfuse.pyÚ
option_configˆs6










rXéz
%016x.%08xi@Bcstjˆƒ‡fdd„ƒ}|S)Ncs‚ytjjtjƒWn$tk
r6tjjtjjƒYnXz
ˆ||ŽSytjjtjƒWn$tk
rztjjtjjƒYnXXdS)N)ÚloggingÚdisableZERRORÚ
BaseExceptionZNOTSET)ÚargsÚkwargs)ÚfuncrVrWÚwrapper¸s
z disable_logging.<locals>.wrapper)Ú	functoolsÚwraps)r_r`rV)r_rWÚdisable_logging·s
rccCsVtjj|ƒ\}}d}x8|dkrL|dkr6tjj||ƒ}n|}tjj|ƒ\}}qW||fS)Nr*ú/)r*rd)rQrRÚsplitÚjoin)rRÚheadÚtailÚprefixrVrVrWÚsplit_head_tailÈs
rjcCstjj|ƒ\}}|S)N)rQrRre)rRrgrhrVrVrWÚget_headÕsrkc@s€eZdZdd„Zdd„Zdd„Zdd„Zd	d
„Zdd„Zd
d„Z	dd„Z
ddd„Zddd„Zdd„Z
dd„Zdd„Zdd„ZdS) ÚObjectRepositorycKs
||_dS)N)Úroot)Úselfrmr^rVrVrWÚ__init__ÛszObjectRepository.__init__cCs.|jdƒr|dd…}tjjt|ƒ}|j|ƒS)Nrdr)Ú
startswithrQrRrfÚ_SEGMENT_PREFIXÚ
_full_path)rnÚpartialrRrVrVrWÚ_full_segment_pathßs
z#ObjectRepository._full_segment_pathcCs*|jdƒr|dd…}tjj|j|ƒ}|S)Nrdr)rprQrRrfrm)rnrsrRrVrVrWrræs
zObjectRepository._full_pathcCsdS)NrV)rnrLÚflagsrVrVrWÚobject_openìszObjectRepository.object_opencCsdS)NrV)rnrLÚoffÚbufÚfhrVrVrWÚ
object_uploadïszObjectRepository.object_uploadcCsdS)NrV)rnrLÚoffsetryrVrVrWÚobject_downloadòsz ObjectRepository.object_downloadcCsdS)NrV)rnrLrVrVrWÚ
object_deleteõszObjectRepository.object_deletecCsdS)NrV)rnrLryrVrVrWÚobject_closeøszObjectRepository.object_closeNcCsdS)NrV)rnrLÚlengthryrVrVrWÚobject_truncateûsz ObjectRepository.object_truncatecCsdS)NrV)rnrLryrVrVrWÚobject_getattrþszObjectRepository.object_getattrcCsdS)NrV)rnrRryrVrVrWÚobject_readdirszObjectRepository.object_readdircCsdS)NrV)rnrRÚmoderVrVrWÚ
object_accessszObjectRepository.object_accesscCsdS)NrV)rnrRrVrVrWÚ
object_unlinkszObjectRepository.object_unlinkcCsdS)NrV)rnrRrVrVrWÚ
object_statfs
szObjectRepository.object_statfs)N)N)Ú__name__Ú
__module__Ú__qualname__rortrrrvrzr|r}r~r€rr‚r„r…r†rVrVrVrWrlÚs

rlcsˆeZdZ‡fdd„ZGdd„deƒZGdd„dƒZdd„Zd	d
„Zdd„Z	d
d„Z
dd„Zifdd„Zdd„Z
dd„Zdd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„ZdYd(d)„Zd*d+„Zd,d-„Zd.d/„Zd0d1„ZdZd2d3„Zd4d5„Zd6d7„Zd8d9„Zd:d;„Z d<d=„Z!d>d?„Z"d@dA„Z#d[dCdD„Z$dEdF„Z%d\dGdH„Z&dIdJ„Z'dKdL„Z(dMdN„Z)dOdP„Z*dQdR„Z+dSdT„Z,d]dUdV„Z-dWdX„Z.‡Z/S)^ÚBackendRepositorycsrtt|ƒj|f|Žttƒj|_ttƒj|_i|_	t
jtƒ|_
i|_tjƒ|_i|_i|_i|_|jdtƒ|_dS)Nr)ÚsuperrŠrorÚ	FUSE_USERÚpw_uidrBÚpw_gidÚgroup_idÚmanifestrÚ	S3BackendrNÚ_BackendRepository__backendÚ!_BackendRepository__manifest_lockÚ	threadingÚLockÚ#_BackendRepository__open_close_lockÚ_BackendRepository__in_openÚ_BackendRepository__worker_poolÚ_BackendRepository__pending_iosÚBackendWorkerPoolÚ,_BackendRepository__object_open_backend_pool)rnrmr^)Ú	__class__rVrWros
zBackendRepository.__init__c@s0eZdZdZdd„Zdd„Zdd„Zdd	„Zd
S)zBackendRepository.BackendWorkerzU A thread used to asyncronously perform backend jobs placed in the job_queue
        cCs8tj|ƒtj|ƒ|_||_tjƒ|_d|_	|j
ƒdS)NT)rrorr‘Ú_BackendWorker__backendÚ_BackendWorker__job_queuer”ZEventÚ_stop_eventZdaemonÚstart)rnÚ	job_queuerNrVrVrWro1s

z(BackendRepository.BackendWorker.__init__cCs|jjƒdS)N)rŸÚset)rnrVrVrWÚstop;sz$BackendRepository.BackendWorker.stopcCs
|jjƒS)N)rŸZis_set)rnrVrVrWÚstopped>sz'BackendRepository.BackendWorker.stoppedcCs¤tjdtjƒjƒxŠ|jƒsžy<|jjddƒ\}}}z||jf|ž|ŽWd|jj	ƒXWqt
k
rpwYqtk
rš}ztj|ƒWYdd}~XqXqWdS)zO Start up the worker and block until there is an item in the queue
            zStarting worker thread[%x].TrN)
rTrIr”Úcurrent_threadÚidentr¤ržÚgetrZ	task_donerÚ	ExceptionÚ	exception)rnr_r]ÚkargsÚerVrVrWÚrunAs
z#BackendRepository.BackendWorker.runN)r‡rˆr‰Ú__doc__ror£r¤r¬rVrVrVrWÚ
BackendWorker-s

r®c@s8eZdZdZdd„Zdd„Zdd„Zdd	„Zd
d„ZdS)
z#BackendRepository.BackendWorkerPoolzU Pool of backend worker threads that consume selected tasks from a job queue
        cCs>ttjƒ|_g|_x&t|ƒD]}|jjtj|j|ƒƒqWdS)N)	rrOr"r¡ÚworkersÚrangeÚappendrŠr®)rnZnum_threadsrNÚ_rVrVrWroZs
z,BackendRepository.BackendWorkerPool.__init__cCs4x|jD]}|jƒqWx|jD]}|jƒq WdS)N)r¯r£rf)rnÚtrVrVrWÚ__del__bsz+BackendRepository.BackendWorkerPool.__del__cOs|jj|||fƒdS)z+ Add a job to the worker queue
            N)r¡Zput)rnr_r]rªrVrVrWÚadd_jobisz+BackendRepository.BackendWorkerPool.add_jobcCsx|D]}|j||ƒqWdS)z4 Add a list of jobs to the worker queue
            N)rµ)rnr_Z	args_listr]rVrVrWÚmapns
z'BackendRepository.BackendWorkerPool.mapcCs|jjƒdS)z> Wait for completion of all the jobs in the queue
            N)r¡rf)rnrVrVrWÚwait_completiontsz3BackendRepository.BackendWorkerPool.wait_completionN)	r‡rˆr‰r­ror´rµr¶r·rVrVrVrWršVsršcCsVtjj|ƒ\}}d}x8|dkrL|dkr6tjj||ƒ}n|}tjj|ƒ\}}qW||fS)Nr*rd)r*rd)rQrRrerf)rnrRrgrhrirVrVrWrjys
z!BackendRepository.split_head_tailcCstjj|ƒ\}}|S)N)rQrRre)rnrRrgrhrVrVrWÚ	_get_head…szBackendRepository._get_headcCs.|jdƒr|dd…}tjjt|ƒ}|j|ƒS)Nrdr)rprQrRrfrqÚ
_get_cache)rnrsrRrVrVrWÚ_get_segment_cache‰s
z$BackendRepository._get_segment_cachecCs*|jdƒr|dd…}tjj|j|ƒ}|S)Nrdr)rprQrRrfrm)rnrsrRrVrVrWr¹s
zBackendRepository._get_cachecCs6|j|ƒ\}}tjƒ}||d<t|ƒ}|jj|ƒ}|S)NrL)rjrNÚcopyrr’Zget_object_manifest)rnrLÚ	containerriÚ_optsrrVrVrWÚ_read_object_manifest•sz'BackendRepository._read_object_manifestc
Csh|j|ƒ\}}i}d|d<tjƒ}||d<x |jƒD]\}}	|	|d|<q4Wt|ƒ}|jj|||ƒdS)NrMzx-static-large-objectrLzx-object-meta-)rjrNr»Úitemsrr’Zupload_object_manifest)
rnrLÚobject_manifestÚmetadatar¼riZput_headersr½rHÚvaluerVrVrWÚ_write_object_manifests
z(BackendRepository._write_object_manifestcCsBtjd|ƒtjƒ}t|ƒ}t|jdƒdg}|jj||ƒdS)Nz	mkdir, %srdz	-segments)	rTrrNr»rrqÚlstripr’Úmkdir_object)rnrLr½r]rVrVrWÚ_create_segments_folder®s
z)BackendRepository._create_segments_folderc
CsÒ|j|ƒ\}}tjƒ}|dkr$g}n|g}d|d<d|d<d|d<d|d<d|d<t|ƒ}|dkrv||d<|j|ƒnd}|jj||ƒ}i}x@|dd	jƒD],\}}	d
|krÂ|	||jd
ƒd<qž|	||<qžW|S)Nr*Ú	delimiterFÚhumanÚtotalsÚlongriÚheadersZMetadatazx-object-meta-r)	rjrNr»rr±r’Ústat_objectr¿re)
rnrLr¼rir½r]ÚstrÁrHrÂrVrVrWÚ_get_object_metadata¶s,z&BackendRepository._get_object_metadatachCsÖ|j|ƒ\}}|j|ƒ}|tddƒ@tjk}|j8|jj|tj	ƒƒ|j
j|dƒ|j
|d7<WdQRX|j|P|jj|iƒ|jj|iƒ||j
kr¤|tddƒ@tjksÜ|tj@tjksÜ|tj@tjkr*y|j|ƒ}Wn8tk
r"tjd|ƒtjdƒ|j|ƒ}YnXdii|j
|<x^|D]V}|djd	ƒd}	|	jd
ƒd}	t|	dƒ}
|jddƒ|d<d
|d<||j
||
<q8W|j|ƒ}|j
|j|ƒy&|j|j
|dƒ}tj|ddWntk
rèYnXtjtjj|ƒddt|dƒ}
|
jt j!|ƒƒWdQRXnztjtjj|ƒdd|tj"@tj"krªy|j#|ƒWntk
rvYnXyt|dƒ}
WdQRXWntk
r¨YnXy |j$|dƒ}tj|ddWntk
ràYnXtj||ƒ}zN|j%|ƒ|j&|j||<dii|j
|<dd
i|j
|d|<|j'||ƒWd|j|j(|dƒ|j
|dj(|dƒtj)|ƒXyt|dƒ}
WdQRXWntk
r¢YnXyddl*m+}||ƒj,ƒWntk
rÖYnXtj||ƒ}z¼yBd|i|j
|d|<|j-t.j/t0ƒ|j||<t1ƒ|j||<|Stk
rœ}zVtj2|ƒ|j|j(|dƒ|j
|dj(|dƒ|j|j(|dƒtj)|ƒ‚WYdd}~XnXWd|j|j
|d8<WdQRXXWdQRXdS)NZffr(rrz+Manifest for %s not found. Trying in 5 secsrÚopen_handlesÚnamez
-segments/Ú.Ú	versionIdr*FÚmodifiedzsegments-dirT)Úexist_okÚwz	-segmentsÚreadonly)ÚPath)3rjrrÚintrQÚO_RDONLYr–r“Ú
setdefaultr”ÚRLockr—r˜r™rÚO_RDWRÚO_APPENDr¾r¨rTrIÚtimeÚsleeprer§rÎÚupdateÚmakedirsr\rRÚdirnameÚopenÚwriteÚjsonÚdumpsÚO_WRONLYr…rtrÆr›Ú
_object_closeÚpopÚcloseZpathlibr×ZtouchršrOr#rNr¢r©)rnrLrur¼riÚ	full_pathrÖrÚsegZoffstrr{rÁZsegment_dirÚfryr×ÚexrVrVrWrvòsÂ







zBackendRepository.object_opencCsRy tjƒ}t|ƒ}|j||ƒWn,tk
rL}ztj|ƒWYdd}~XnXdS)zý Utility method to be dispatched to a worker
            thread in order to clean up old segments.

        Args:
            backend (class instance): Instance of the backend plugin.
            segment_list (list): List of segments to remove.
        N)rNr»rÚdelete_object_listr¨rTr©)rnÚbackendÚsegment_listr½rîrVrVrWZ__purge_old_segments_task†sz+BackendRepository.__purge_old_segments_taskcCsÖ|j||jƒ|j|®yv|j|jddt|dƒ}|j|ƒ\}}g}d}|j|d|ds–d}d}	d}
x@||j|krPy|j|j||d|ƒ}Wn8tk
ræt	j
dƒ|j|j||d|ƒ}YnX|j||d	r>t|ƒ}t|j
tjƒ}
|j|j||d|j|j|
|jd
œƒnd|j||d}
|j|j||d|j||jdd
ƒ|j||d|
|j||dd
œƒ|tj7}|d7}|	|
7}	q€W|j|||t|ƒt|	ƒdœdd}x°dr”|r”|j|||ƒ}
t|
ƒdkrPt|
ƒ}
y|j||d}Wnd
}YnX|jdƒ}tt|
ƒt|gƒƒ}t|ƒdkr†|j||j|j|ƒ|tj7}qæWdStk
rÆ}ztj |ƒWYdd}~XnXWdQRXdS)zé Handle object_close by updating the manifest.

         Waits for all of the background jobs to complete prior to updating
         manifest using the main thread. Also queues up tasks to clean up
         any old segments.
        zsegments-dirrdz	-segmentsrrÏrÖrÐrrÓ)rRrÒÚetagÚ
size_bytesÚcontent_typerórÒr*Úhashrôr)zsegments-dirz
segment-countz
total-size)rÁTN)!r˜r·r“rr§rqrjrr\rÞrßrÚminÚst_sizerOr%r±Ú
version_idròrôrÃÚstrrñÚlenÚsortedÚstripÚlistr¢rµÚ+_BackendRepository__purge_old_segments_taskr¨rTr©)rnrLryÚsegments_dirr¼rirÀZsegmentsr{Z
total_sizeÚsegment_sizerÍÚstatZobjectsÚpZ
purge_listrîrVrVrWrè•sž





zBackendRepository._object_closec!Cs |j||ƒ|j|þ|j|j|ƒ|j|j|ƒ|j|dj|ƒytj|ƒWntk
rpYnXt	|j|dƒdkrÚy0|jj|dƒ}|jj|dƒ}tj
|j|ƒƒWntk
rÌYnX|jj|ƒ|j,|j
|s||jkr|jj|dƒWdQRXWdQRXdS)NrÏr)rèr“r˜rér™rrQrêr\rúÚremoverrr–r—)rnrLryZohZpiosrVrVrWr~s*zBackendRepository.object_closec
Csdy|j|||j|krH|j||ddkrH|j||d}n8|j||ƒ}|j|jddt|dƒ}tjj||ƒ}tj	ƒ}d|j|k|d<WdQRX|j
|ƒ\}	}
t|ƒ|d	<|
jdƒ|d
<t
|ƒ}|	||d	g}|j||j|ƒ|j||j|j||||||ƒWnDtk
r^}z&tj|ƒ|j||j|ƒ‚WYdd}~XnXdS)NrÓTrÐzsegments-dirrdz	-segmentsÚ0Ú
path_validrrL)r“rÚ,_BackendRepository__next_segname_from_offsetr§rqrQrRrfrNr»rjrúÚrstriprr™Úaddr˜rµÚ&_BackendRepository__object_upload_taskr¨rTr©r)
rnrLr{rxryÚseg_fullnameZsegnamerÿr½r¼ÚobjÚargs1rîrVrVrWrz%s6

zBackendRepository.object_uploadc$CsHtjd||tjƒjfƒ|d}|d}	|dd…}|j|WdQRXyd|_|j|||	|ƒ}
WnXtk
r¾}z<tj	|ƒ|j||j
||j|ƒWdQRX‚WYdd}~XnX|j|t||j|krèi|j||<||j||d<d|j||d<|
j
dd	ƒ|j||d
<|j
||j|ƒWdQRXdS)zP Method run by a worker in the thread pool to upload an object segment.
        z6Object [%s] segment [%s] upload running in thread[%x].rr$NTrÐrÓÚ	VersionIdr*rÒ)rTrIr”r¥r¦r“rZ
put_objectr¨r©r™rrr§)rnrðrr½rLr{r
ryrxZbuf_lenZresprîrVrVrWZ__object_upload_taskLs.

z&BackendRepository.__object_upload_taskcCsLxztjdƒ|j|\||j||kr,w||j|krZtd|tt|ƒtdƒfƒ‚|j||d}PWdQRXqW|j|j	dƒƒ\}}i}|j||j
ddƒ|d<t|ƒ}||g}y|jj
||ƒ}	t|	ƒStk
r}
z&|
jd	d
dkrtj|
ƒ‚WYdd}
~
Xn0tk
rF}ztj|ƒ‚WYdd}~XnXdS)Ngš™™™™™¹?zobject %s not found rrÐrdrÒr*røÚResponseMetadataÚHTTPStatusCodei”)rÞrßr“r™rr¨ÚSEGMENT_FORMATrØrjrr§rr’Z
get_objectÚ	bytearrayrÚresponserTr©)rnrLr{ryr
r¼rr½rrxr«rîrVrVrWr|qs6


z!BackendRepository.object_downloadcCsª|jj|tjƒƒ|j|„|j|ƒ\}}tjƒ}t|ƒ}|g}|dkr\|dkr\|j|ƒy|j	j
||ƒWn,tk
rš}ztj
|ƒWYdd}~XnXWdQRXdS)Nr*rd)r“rÚr”rÛrjrNr»rr±r’Z
delete_objectr¨rTr©)rnrLr¼rr½rrîrVrVrWr}“s

zBackendRepository.object_deleteNcCs&|rdS|j|tjƒ}|j||ƒdS)N)rvrQrçr~)rnrLrryrVrVrWr€¦sz!BackendRepository.object_truncatecCs¤tjƒ}d|d<d|d<d|d<d|d<tjj|dt|ƒƒ|d<g}|dkrTg}n|g}t|ƒ}y|jj||ƒSt	k
rž}zt
j|ƒ‚WYdd}~XnXdS)	NrÇFrÈrÉrÊz%016xrir*)rNr»rQrRrfrØrr’Z
list_segmentsr¨rTr©)rnr¼rÿr{r½r]rîrVrVrWrñ¬s 
zBackendRepository.segment_listc	CsÀ|j|ƒ\}}|j|jddƒ}|rT|jdtƒr@|j|ƒ\}}|j|ƒ\}}|}n|d}|j|||ƒ}t|ƒdkrŠtt|ƒtdƒfStt|ƒtt	|ƒdj
|ƒdj
dƒddƒdfS)	Nzsegments-dirrdz	-segmentsrrrÑr(éÿÿÿÿ)rjrr§rprqrñrúrrØrûre)	rnrRr{r¼rirÿÚcrÚfilesrVrVrWZ__next_segname_from_offsetÂs$z,BackendRepository.__next_segname_from_offsetc
Csò|j||j|ƒ\}}|jj|dƒrV||j|krV|j||d}|jdƒdS|j|jddƒ}|r€|j|ƒ\}}|}n|d}|j|||ƒ}	WdQRXt|	ƒdkrÀtt|ƒtdƒfStt|ƒtt	|	ƒd	j|ƒdjdƒddƒfS)
NrÐz
-segments/rzsegments-dirz	-segmentsrrÑr(r)
r“rjrr§rerñrúrrØrû)
rnrRr{r¼rirìrÿrrrrVrVrWÚcurr_segname_from_offset×s z*BackendRepository.curr_segname_from_offsetcs‚tjj|ƒr~y@tj|ƒ‰t‡fdd„dDƒƒ}d|d<t|d	dƒ|d
<|Stk
rx}ztj|ƒWYdd}~XnXdSdS)aë Utility to check the tmpfs cache and return stat() from that.

         This method looks to see if the object (directory) exists in the
         local cache and will perform a stat() locally instead of calling
         all the way to the backend.

        Args:
            object_cache_path (str): Cache path to the object we
                                     need stat infor on.

        Returns:
            Dictionary of stat() information or None if object does not exist.
        c3s|]}|tˆ|ƒfVqdS)N)Úgetattr)Ú.0rH)rÍrVrWú	<genexpr>sz0BackendRepository._stat_cache.<locals>.<genexpr>Úst_atimeÚst_ctimeÚst_gidÚst_modeÚst_mtimeÚst_nlinkr÷Úst_uidiÚ
st_blksizeÚ	st_blocksN)rrrrrrr÷r )	rQrRÚisdirÚlstatÚdictrØr¨rTr©)rnZobject_cache_pathÚ	stat_infor«rV)rÍrWÚ_stat_cacheðs(



zBackendRepository._stat_cachecsØ|j|ƒ}|j|ƒ\}}tjƒ}|dkr.g}n|g}d|d<d|d<d|d<d|d<d|d<t|ƒ}i}|dkr„||d<|j|ƒnd}y`|jj||ƒ‰|j|d<|j	|d	<ˆd
j
ddƒ|d<ˆd
j
d
dƒ|d<ˆd
j
ddƒ|d<tˆdƒ|d<tˆdƒ|d<tˆdƒ|d<d|d<d|d<|dk	rFd|krFd|d<tˆdƒ|d<|ddkrn|dks¬|ddkr†|dks¬|ddkrž|dks¬ˆddkrèd |d<d!|d<d"|d<|j|ƒ}	t
jj|	ƒsèt
j|	d#ƒWnÌtk
rj}
zb|
jd$d%d&krtj|
ƒyt
j|ƒWntk
r@YnXtj|dd't
j|ƒWYdd}
~
XnNtk
r¶}z0tj|ƒt
j|ƒ‰t‡fd(d)„d-Dƒƒ}WYdd}~XnXd*|d+<t|dd*ƒ|d,<|S).Nr*rÇFrÈrÉrÊrirr rËZETagròr
røZContentTyperôZ	timestamprrrrriírZauthorized_keyi€Úsizer÷rZ	directoryTéiiýAiérri”)Ú
ignore_errorsc3s|]}|tˆ|ƒfVqdS)N)r)rrH)rÍrVrWr^sz3BackendRepository.object_getattr.<locals>.<genexpr>ir!r")rrrrrrr÷r )rrrjrNr»rr±r’rÌrrBr§rØr¹rQrRrSÚmkdirrrrTr©rr¨ÚshutilÚrmtreer$r%)rnrLryrër¼rir½r]rZcontainer_pathr«rîrV)rÍrWrs†







z BackendRepository.object_getattrcCsytj|dƒ}Wn.tk
r>}ztj|ƒ‚WYdd}~XnXd}x„||j|krÈy |jj|j||d|ƒWn:tk
r®t	j
dƒ|jj|j||d|ƒYnX||j||d7}qFWy|jj||ƒWn.tk
r
t	j
dƒ|jj||ƒYnXdS)Nz%Y-%m-%dT%H:%M:%SrrÐrró)rZstrptimer¨rTr©rr’Zput_object_segment_retentionr\rÞrßZput_manifest_retention)rnrLÚretainuntilÚdtrîr{rVrVrWÚ_set_object_retentionrs(


z'BackendRepository._set_object_retentionc	Cs|j|tjƒ}zîyº|j|¦tj|j|ƒ}d}x8||j|krj|j||d}|j|dƒ||7}q4W|jddƒ|dkr”|j||j	dƒƒn|j	dƒ||<|j
j||ƒ||j||<WdQRXWn.tk
rø}zt
j|ƒ‚WYdd}~XnXWd|j||ƒXdS)NrrórÏr.Úutf8zutf-8)rvrQrÙr“r»Údeepcopyrrér0Údecoder’Úupdate_object_attributesr¨rTr©r~)	rnrLrÐrÂryÚattrsr{r(rîrVrVrWÚobject_setxattrs*
z!BackendRepository.object_setxattrcCsö|j|tjƒ}zÔy |j|Œtj|j|ƒ}d}x8||j|krj|j||d}|j|dƒ||7}q4W|j|dƒ|jddƒ|jj	||ƒ|j|j|dƒWdQRXWn.t
k
rÞ}ztj|ƒ‚WYdd}~XnXWd|j
||ƒXdS)NrrórÏ)rvrQrÙr“r»r2rrér’r4r¨rTr©r~)rnrLrÐryr5r{r(rîrVrVrWÚobject_removexattr©s$ 
z$BackendRepository.object_removexattrcCs’|j|tjƒ}zpy<|j|(tj|j|ƒ}|jdƒ|jƒ}|SQRXWn.t	k
rz}zt
j|ƒ‚WYdd}~XnXWd|j||ƒXdS)NrÏ)
rvrQrÙr“r»r2rréÚkeysr¨rTr©r~)rnrLryr5r8rîrVrVrWÚobject_listxattr¾s

z"BackendRepository.object_listxattrcCs€|j|tjƒ}z^y*|j|t|j||dƒSQRXWn.tk
rh}ztj|ƒ‚WYdd}~XnXWd|j	||ƒXdS)Nzutf-8)
rvrQrÙr“Úbytesrr¨rTr©r~)rnrLrÐryrîrVrVrWÚobject_getxattrÍs
z!BackendRepository.object_getxattrc	cs˜g}|jdƒd}g}yN||jj|ƒ7}x |D]}|j|jdƒdƒq.Wxt|ƒD]
}|VqTWWn.tk
r’}ztj|ƒ‚WYdd}~XnXdS)Nrdrr)	rr’Úlist_objectsr±rerýr¨rTr©)	rnrLryZlistingZdir_pathÚdirentsZlstÚrrîrVrVrWr‚Øs

z BackendRepository.object_readdircCsdS)NrV)rnrLrƒrVrVrWr„çszBackendRepository.object_accessFc&CsR|td<tjƒ}t|ƒ}|syÀ|j|ƒ}|j|ƒ}g}x|D]}|j|dƒq>W|jj||ƒ|jdƒ}|dk	rÜ|g}	|jj	|	|ƒyt
j|j|ƒƒWnt
k
r°YnXyt
j|j|ƒƒWnt
k
rÚYnXWn.tk
r}
ztj|
ƒWYdd}
~
XnXy|jj|ƒWn.tk
rL}
ztj|
ƒWYdd}
~
XnXdS)NrKrÐzsegments-dir)rNr»rr¾rÎr±r’rïr§Úrmdir_objectrQÚrmdirr¹r\rr¨rTr©Zdelete_object_manifest)rnrLrKr½Zobj_manifestZobj_metadatarñÚmanrÿr]rîrVrVrWr…ês>






zBackendRepository.object_unlinkc	CsÐtjƒ}t|ƒ}g}y|jj||ƒ}Wn6tk
r\}ztj|ƒtt	j
ƒ‚WYdd}~XnXd|dkrt|dƒ}t|dƒt|dƒ}nd}t|dƒ}i}||d<||d<||d<d	|d
<d	|d<|S)
Nzx-account-meta-quota-bytesrËzx-account-bytes-usedrr(Úf_blocksÚf_bfreeÚf_bavailrÚf_favailÚf_frsizer)rNr»rr’rÌr¨rTr©r	ÚerrnoÚENOENTrØ)	rnrLr½rZstvrîrBrDr/rVrVrWr†
s*
zBackendRepository.object_statfsc
CsÚtjd|ƒ|j|ƒ\}}tjƒ}t|ƒ}||g}y|jj||ƒWn*tk
rp}ztj	|ƒdSd}~XnX|j
|ƒ}	|dkr˜|j
tjj
||ƒƒ}	ytj|	|ƒWn,tk
rÔ}ztj	|ƒWYdd}~XnXdS)Nz	mkdir, %srF)rTrrjrNr»rr’rÅr¨r©r¹rQrRrfrá)
rnrRrƒZistr¼rr½r]rîÚ
cache_pathrVrVrWr+,s$

zBackendRepository.mkdircKCs|j|ƒ\}}tjƒ}d|d<t|ƒ}|jdƒd}g}y||jj|dd7}Wn,tk
r|}ztj	|ƒWYdd}~XnXt
|ƒdkr”ttj
ƒ‚y|jj|jdƒg|ƒWn,tk
rÚ}ztj	|ƒWYdd}~XnXtjjt|jdƒƒ}y||jj|dd7}Wn.tk
r6}ztj	|ƒWYdd}~XnXt
|ƒdkry|jj|jdƒg|ƒWn.tk
rŽ}ztj	|ƒWYdd}~XnXy&|j|ƒ}	tjj|	ƒr´tj|	ƒWntk
rÌYnXy&|j|ƒ}
tjj|
ƒròtj|
ƒWntk
r
YnXdS)Nrirdr$)Z	max_itemsr)rjrNr»rrr’r<r¨rTr©rúr	rGZ	ENOTEMPTYr?rQrRrfrqrÄrºr#r,r-r\r¹)rnrLr¼rr½rRZ	dir_itemsrîZseg_pathZsegment_cache_pathrIrVrVrWr@LsR




zBackendRepository.rmdircCsVtjd|ƒy.|j|ƒ\}}|jtjj||ƒƒ}tj||ƒStk
rPYnXdS)Nz	chmod, %s)	rTrrjr¹rQrRrfÚchmodr\)rnrRrƒr¼rirIrVrVrWrJƒszBackendRepository.chmodcCsXtjd|ƒy0|j|ƒ\}}|jtjj||ƒƒ}tj|||ƒStk
rRYnXdS)Nz	chown, %s)	rTrrjr¹rQrRrfÚchownr\)rnrRÚuidÚgidr¼rirIrVrVrWrKŒszBackendRepository.chowncCstdƒ‚dS)NzNot Applicable)r¨)rnrÐÚtargetrVrVrWÚsymlink•szBackendRepository.symlinkc
OCs |jj|dƒr2tjdƒ|jj|dƒr2td|ƒ‚tjd||fƒ|d}y|j|ddWn,tk
rŠ}ztj|ƒWYdd}~XnXyJ|j	|ƒ}|j	|ƒ}|jd|dƒ|jd|dƒkrÔ|j|ddd	SWntk
rêYnXd
}yªy|j	|ƒ}Wntk
rYn‚X|j
|ƒ}|jd|dƒ}	g}
x<|D]4}|
j|d|d|d
|jddƒ|ddœƒq<W|j||
|	|d|ddœdd}Wn0t
k
rÊ}ztj|ƒ‚WYdd}~XnXzyÌ|j
|ƒ}|j	|ƒ}|jd|dƒ}	g}x<|D]4}|j|d|d|d
|jddƒ|ddœƒqW|j|||	|d|ddœdy|j|ddWn.tk
r˜}ztj|ƒWYdd}~XnXWn0t
k
rÌ}ztj|ƒ‚WYdd}~XnXWd|ry|j|d
dWn.tk
r}ztj|ƒWYdd}~XnXXd	S)Néz%s in use. Try againzrename, %s -> %sú~T)rKzsegments-dirz	-segmentsrFrÐrõrórÒr*rô)rRròrórÒrôz
segment-countz
total-size)zsegments-dirz
segment-countz
total-size)rÁ)rr§rÞrßr¨rTrr…r©rÎr¾r±rÃr\)
rnÚoldÚnewZnewbak_namerîZnew_metadataZold_metadataZnewfile_existsZnew_manifestrÿZnewbak_manifestrAZold_manifestrVrVrWÚrename˜s–












 
zBackendRepository.renamecCsZtjd|ƒt|ƒ\}}|jtjj||ƒƒ}t|ƒ\}}|jtjj||ƒƒ}tj||ƒS)Nzlink, %s)rTrrjr¹rQrRrfÚlink)rnrNrÐr¼riZcache_path_targetZcache_path_namerVrVrWrUszBackendRepository.linkcCsNtjd|ƒt|ƒ\}}|j|ƒ}ytj||ƒWntk
rHdSXdS)Nzutimens, %sr)rTrrjr¹rQÚutimer\)rnrRÚtimesr¼rirIrVrVrWÚutimenss
zBackendRepository.utimenscCsdS)NrrV)rnrRrVrVrWÚdestroy!szBackendRepository.destroy)N)N)F)F)N)0r‡rˆr‰rorr®ršrjr¸rºr¹r¾rÃrÆrÎrvrþrèr~rzr	r|r}r€rñrrr'rr0r6r7r9r;r‚r„r…r†r+r@rJrKrOrTrUrXrYÚ
__classcell__rVrV)rœrWrŠsX)#	<s'%"
*
X
#
 7		s
rŠc@speZdZdd„Zdd„Zddd„Zdd	„Zddd„Zd
d„Zdd„Z	dd„Z
dd„Zdd„Zdd„Z
dd„Zd
S)Ú	FuseCachecCsÜ||_||_i|_tjƒ|_ttƒj|_	ttƒj
|_tj
j|jƒsy4tj|jƒtj|jt|j	ƒdt|jƒgƒWqØtk
rŒ‚YqØXnHtj|jƒ}|j|j	ks´|j|jkrØtjtjt|j	ƒdt|jƒgƒdS)Nú:)rmÚ
repositoryÚlrucacher”r•Ú
lrucache_lockrrŒrrBrŽrrQrRr#r>r+rKrùr\rr rrOr!)rnrmr]r&rVrVrWro:s$
 
zFuseCache.__init__cCsl|jj||ƒ}|jN|jj|iƒ|j|j|dƒ}|j|j|ttjdt	j
ƒ|tdœƒWdQRX|S)N)Úmaxsize)r^ÚlrulockrLÚwrites_before_update_manifest)r]rvr_r^rÚrérrOr'r”r•ÚNUMBER_UPLOADS_BEFORE_FLUSH)rnrLruryÚitemrVrVrWrvPs
zFuseCache.object_openTcCs¢tjd|tjƒjfƒ|j||}|d}|dPy4x.|jƒ\}}|dr<|jj|||d|ƒq<WWnt	k
r€YnXWdQRX|rž|jj
||ƒdS)NzCache object_flush [%s] [%x]r^rarÓÚdata)rTrr”r¥r¦r^Úpopitemr]rzÚKeyErrorrè)rnrLryÚupdate_manifestrdÚcacherwrVrVrWÚobject_flush`s 
zFuseCache.object_flushc
Csztjd|tjƒjfƒ|j||dd|j4|j|j|dƒt	|j|ƒs^|jj|dƒWdQRX|j
j||ƒdS)NzCache object_close [%s] [%x]F)rh)rTrr”r¥r¦rjr_r^rérúr]r~)rnrLryrVrVrWr~wszFuseCache.object_closeNcCs|jj|||ƒdS)N)r]r€)rnrLrryrVrVrWr€„szFuseCache.object_truncateccsVxP|dkrP|tjtj}||}t|tj|ƒ}|||fV||7}||8}qWdS)Nr)rOr%rö)rnr{rZ
seg_offsetÚbaseÚseg_lenrVrVrWÚ_walk_segments‡s
zFuseCache._walk_segmentsc!Cs”tƒ}|j||dlxb|j||ƒD]P\}}}y |j||d|d}	Wntk
rhyÌ|j||d}
t|
ƒtjkr|
jƒ\}}|dr|jj	|||d|ƒ|j||dd8<|j||ds|jj
||ƒt|j||d<|jj|||ƒ}	d|	dœ|j||d|<Wn,t
k
rb}
ztj|
ƒd	Sd}
~
XnXYnX||	|||…7}q,WWdQRXt|ƒS)
Nrar^rerÓrbrF)rÓrer)rr^rmr\rúrOr'rfr]rzrèrcr|r¨rTr©r:)rnrLrr{ryZ
output_bufÚ	segoffsetrkrlÚsegdatarirwrdrîrVrVrWÚobject_read’s@	


"zFuseCache.object_readcCsÆtjd|tjƒjfƒt|ƒ}d}|j||d€xv|j||ƒD]d\}}}	|j||d}
||
krLt|
ƒtj	krè|
j
ƒ\}}|drè|jj|||d|ƒ|j||dd8<|j||dsèt
|j||d<y4|jj|||ƒ}
|
dkrtd	ƒ‚d
|
dœ|
|<Wn,tk
rHtdƒ}
d|
dœ|
|<YnXn|
|d}
t|
ƒ|kr€|
jd
||	t|
ƒƒ||||	…|
|||	…<d|
|d<||	7}qJWWdQRXt|ƒS)NzCache object_write [%s] [%x]rrar^rÓrerbrzObject not foundF)rÓreTó)rTrr”r¥r¦rúr^rmrOr'rfr]rzrcr|r¨r\rÚextend)rnrLrxr{ryrZbufptrrnrkrlrirwrdrorVrVrWÚobject_writeÍsJ


zFuseCache.object_writecCstj|jj|ƒ|ƒS)N)rQr+r]rr)rnrRrƒrVrVrWr+"szFuseCache.mkdircCs|jj|ƒ}tj|ƒS)N)r]rrrQr@)rnrRrërVrVrWr@%szFuseCache.rmdircCs|jj|ƒ}tj||ƒS)N)r]rrrQrJ)rnrRrƒrërVrVrWrJ)szFuseCache.chmodcCs|jj|ƒ}tj|||ƒS)N)r]rrrQrK)rnrRrLrMrërVrVrWrK-szFuseCache.chown)T)N)r‡rˆr‰rorvrjr~r€rmrprsr+r@rJrKrVrVrVrWr[9s

;Ur[c@söeZdZd:dd„Zdd„Zdd„Zdd	„Zd;d
d„Zdd
„Zdd„Z	dd„Z
dd„Zdd„Zdd„Z
dd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd<d(d)„Zd*d+„Zd=d,d-„Zd.d/„Zd0d1„Zd>d2d3„Zd4d5„Zd6d7„Zd8d9„ZdS)?r8NcCs&||_|pt|ƒ|_t||jƒ|_dS)N)rmrŠr]r[ri)rnrmr]rVrVrWro3szTrilioVault.__init__cCs|jj||ƒdS)N)r]r„)rnrRrƒrVrVrWÚaccess;szTrilioVault.accesscCs|jj||ƒS)N)r]rJ)rnrRrƒrVrVrWrJ>szTrilioVault.chmodcCs|jj|||ƒS)N)r]rK)rnrRrLrMrVrVrWrKAszTrilioVault.chowncCs|jj||ƒS)N)r]r)rnrRryrVrVrWrDszTrilioVault.getattrcCs|jj|||ƒS)N)r]r6)rnrRrÐrÂr(rVrVrWÚsetxattrGszTrilioVault.setxattrcCs,|jdƒs|jdƒrtddƒS|jj||ƒS)NZsecurityÚsystemr*zutf-8)rpr:r]r;)rnrRrÐrVrVrWÚgetxattrJs
zTrilioVault.getxattrcCs|jj|ƒS)N)r]r9)rnrRrVrVrWÚ	listxattrOszTrilioVault.listxattrcCs|jj||ƒS)N)r]r7)rnrRrÐrVrVrWÚremovexattrRszTrilioVault.removexattrccs4ddg}|j|jj||ƒƒx|D]
}|Vq"WdS)NrÑz..)rrr]r‚)rnrRryr=r>rVrVrWÚreaddirUs
zTrilioVault.readdircCs2tj|j|ƒƒ}|jdƒr*tjj||jƒS|SdS)Nrd)rQÚreadlinkrrrprRÚrelpathrm)rnrRÚpathnamerVrVrWr{[s
zTrilioVault.readlinkcCstj|jj|ƒ||ƒS)N)rQÚmknodr]rr)rnrRrƒZdevrVrVrWr~mszTrilioVault.mknodcCs|jj|ƒS)N)r]r@)rnrRrVrVrWr@pszTrilioVault.rmdircCs|jj||ƒS)N)r]r+)rnrRrƒrVrVrWr+sszTrilioVault.mkdircCs|jj|ƒS)N)r]r†)rnrRrVrVrWÚstatfsvszTrilioVault.statfscCs|jj|ƒS)N)r]r…)rnrRrVrVrWÚunlinkyszTrilioVault.unlinkcCs|jj||ƒS)N)r]rO)rnrÐrNrVrVrWrO|szTrilioVault.symlinkcCs|jj||ƒS)N)r]rT)rnrRrSrVrVrWrTszTrilioVault.renamecCs|jj||ƒS)N)r]rU)rnrNrÐrVrVrWrU‚szTrilioVault.linkcCs|jj||ƒS)N)r]rX)rnrRrWrVrVrWrX…szTrilioVault.utimenscCs|jj||ƒS)N)rirv)rnrRrƒrVrVrWrã‹szTrilioVault.opencCs|j|tjƒS)N)rãrQÚO_CREAT)rnrRrƒZfirVrVrWÚcreateŽszTrilioVault.createcCs|jj||||ƒ}|S)N)rirp)rnrRrr{ryrxrVrVrWÚread‘szTrilioVault.readcCs|jj||||ƒS)N)rirs)rnrRrxr{ryrVrVrWrä•szTrilioVault.writecCs|jj|||ddS)N)ry)rir€)rnrRrryrVrVrWÚtruncate˜szTrilioVault.truncatecCs|jj||ƒdS)N)rirj)rnrRryrVrVrWÚflush›szTrilioVault.flushcCs|jj||ƒdS)N)rir~)rnrRryrVrVrWÚreleasežszTrilioVault.releasecCstjd|ƒ|jj|ƒS)Nzdestroy, %s)rTrr]rY)rnrRrVrVrWrY¥szTrilioVault.destroy)N)N)N)N)N)r‡rˆr‰rortrJrKrrurwrxryrzr{r~r@r+rr€rOrTrUrXrãr‚rƒrär„r…r†rYrVrVrVrWr82s8




ú/etc/fuse.confcCsÐd}tjj|ƒrJt|dƒ*}x"|D]}d|kr"d|kr"d}Pq"WWdQRX|dkrÌd}tjj|ƒrˆt|dƒ}|jƒdd}WdQRXtd	d
ƒ}|j|ƒWdQRXtjd	|ƒtjd	ƒtj	ddgƒdS)
Nrr>Zuser_allow_otherú#rzuser_allow_other 
ZrtÚ
z/tmp/fuse.conf.tmpZwtz/etc/fuse.confz	root:root)
rQrRrSrãrƒrär>r»rrK)Z	conf_fileÚfoundríÚlineÚsZoutfrVrVrWÚ	fuse_confªs"

rcCsVyÌytj|dgƒWntk
r(YnXtjj|ƒr‚tj|ƒ}ttƒj	}tt
ƒj}|j|kof|j
|ksÊtj|dtdt
gƒnHtj|dgƒtj|dgƒtj|tdt
gƒtj|tdt
gƒWn,tk
rø}ztj|ƒWYdd}~XnXdd„tjtjƒDƒt|t|ƒd}d}tjjƒd	kr8d
}t|||ddddtjddS)Nz-lz-Rr\z-pcSs&g|]}tjtjjtj|ƒdd‘qS)T)r*)r,r-rQrRrfrOr!)rÚxrVrVrWú
<listcomp>Øszmain.<locals>.<listcomp>)r]TrMF)Z	nothreadsZ
foregroundZnonemptyZ
big_writesZallow_otherZfsname)r>Zumountr\rQrRr#rrrŒrÚ
FUSE_GROUPrŽr rrKr+r¨rTr©ÚlistdirrOr!r8rŠr6rPrr7)Z
mountpointZ	cacherootZmountpoint_statrBrrîZtvaultpluginZdisable_fuse_threadsrVrVrWÚmain¾sD




r’cCs<tƒtƒtjtƒ}|jtƒ|jtƒttj	tj
ƒdS)z$Main routine that drives fuse mount.N)rXrrr‘rNZvalidate_s3_clientZset_retention_moder’rOr r!)Z	s3backendrVrVrWr¬òs


r¬Ú__main__i€i)r‡)^r­rQZgrpÚsysrGrÞZgetpassrr»rår,rar”rÚpwdrrrÚImportErrorZqueueZ
cachetoolsrZfuserr	r
r\ZfusepyZbotocore.exceptionsrZs3fuse.bunch_p3rZoslo_configr
Zoslo.configZs3fuserrZZs3fuse.utilsrrrZ_DEFAULT_LOG_DATE_FORMATrqZQUEUE_DEPTHZWORKER_POOL_SIZEZBoolOptZcommon_cli_optsZStrOptZlogging_cli_optsZIntOptZgeneric_log_optsZListOptZlog_optsZ
vault_optsrOZ
register_optsZregister_cli_optsrùÚenvironÚflagÚargvZlist_all_sectionsZsectionsZs3fuse.privsepr>r?ZSetupS3FuseLoggingrTr§rNrXZCACHE_LOW_WATERMARKZCACHE_HIGH_WATERMARKZgetuserrŒZgetgrgidÚgetgidZgr_namerrrcrcrjrkÚobjectrlrŠr[r8rr’r¬r‡rVrVrVrWÚ<module>sx

















%
45zx
4