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

Ù2Ù_X:ãK@södZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl	m
Z
ddl	mZddlm
Z
yddlmZmZWn$ek
r¨ddlmZmZYnXddlmZddlmZydd	lmZmZmZWn dd	lmZmZmZYnXdd
lTddlZyddlmZWn"ek
r>ddlmZYnXddl m!Z"dd
l#m$Z$ddl#m%Z%ddl&m'Z'dZ(dZ)dZ*dZ+ej,dddddej,dddddgZ-ej.ddddej.d dd!dej.d"dd#dej.d$dd%d&d'ej.d(e(d)d*d'ej.d+dd,d-d.ej.d/d0d1d2ej,d3dd4d5ej.d6d7d8d5g	Z/ej,d9d:d;d5ej,d<dd=d5ej,d>dd?d5ej,d@ddAd5ej0dBdCdDd5gZ1ej0dEdFdGd5ej0dHdIdJd5ej.dKdLdMd5ej.dNdOdPd5ej.dQdRdSd5ej.dTdUdVd5ej.dWdXdYd5ej.dZd[d\d5ej2d]d^d_d`dadbdcgddd5ej,deddfd5ej,dgddhd5ej.didjdkd5ej.dldjdmd5ej0dnddod5gZ3ej.dpdqdrd5ej.dsdtduej.dvdwdtd5ej.dxdydzd5ej.d{d|d}d5ej.d~dd€d5ej.dd‚dƒd5ej.d„d…d†d5ej.d‡dˆd‰d5ej.dŠdˆd‹d5ej.dŒddŽd5ej.ddd‘d5ej.d’d“d”d5ej.d•d–d—d5ej.d˜d™dšd5ej.d›dœdd5ej0dže*dŸd5ej0d e+d¡d5ej0d¢d£d¤d5ej.d¥d¦d§d5ej0d¨dd«d5ej0d¬dd­d5ej.d®d¯dd°d'ej.d±d²d³d5ej.d´dµd¶d5ej.d·dµd¸d5ej.d¹dµdºd5ej.d»dµd¼d5ej.d½dµd¾d5ej.d¿dÀdÁd5ej.dÂdµdÃd5ej.dÄd“dÅd5ej.dÆdÇdÈd5ej.dÉdÊdËd5ej.dÌdÀdÍd5ej.dÎdÀdÏd5ej.dÐdÑdÒd5ej.dÓdÔdÕd5ej.dÖd×dØd5g'Z4ej5Z5e5j6e4ƒe5j7e/ƒe5j7e1ƒe5j7e3ƒe5j7e-ƒye8ej9dÙƒZ:e5e:gƒWne5ej;dCd…ƒYnXe"j<ej5e5j=j>ƒƒe"j?e5j=j>ƒƒZ@edÚdۍZAyre5jBj>ƒdkr6e@jCjDe"jEƒnNe5jBj>ƒdÜkrVe@jCjDe"jFƒn.e5jBj>ƒdÝkrve@jCjDe"jGƒne@jCjDe"jHƒWn&eIk
r¬e@jCjDe"j"jHƒYnXddCgdÞddddddddddddddߜ
d:ddµdµej9jJdàƒej9jJdáƒej9jJdâƒdµdµdd:dddµdµdµddddgddd:ddd:dãdãdãdãdddäœ&ZKdådæ„ZLdãZMdÚZNddlOZOeOjPƒZQdçZRiaSdèZTdédê„ZUdëdì„ZVdídî„ZWGdïdð„dðƒZXGdñdò„dòeYƒZZGdódô„dôeZƒZ[Gdõdö„döeYƒZ\Gd÷d™„d™eƒZ]ddùdú„Z^dûdü„Z_dýdþ„Z`eadÿ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)ÚThread)ÚBoundedSemaphore)Úmkstemp)ÚQueueÚEmpty)Úgetpwnam)ÚLRUCache)ÚFUSEÚFuseOSErrorÚ
Operations)Ú*)Úcfg)Úlog)Úutils)Úvaults3)Úfsz%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.Úvault_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Útmpfs_mount_pathÚtmpfszLLocation with respect to CONF.vault_data_directory_oldwhere tmpfs is mountedZvault_storage_nfs_exportZlocalz
NFS ExportZvault_storage_nfs_optionsZnolockzNFS OptionsZvault_swift_auth_versionZKEYSTONE_V2z KEYSTONE_V2 KEYSTONE_V3 TEMPAUTHZvault_swift_auth_urlzhttp://localhost:5000/v2.0zKeystone Authorization URLZvault_swift_tenantZadminzSwift tenantZvault_swift_usernamezSwift usernameZvault_swift_passwordZpasswordzSwift passwordZvault_swift_region_nameZ	RegionOnezSwift Region NameZvault_swift_domain_idrzSwift domain idZvault_swift_domain_nameZDefaultzSwift domain nameZvault_swift_container_prefixÚTrilioVaultzSwift Container PrefixZvault_swift_segment_sizeZ33554432zDefault segment size 34MBÚ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 failuresZvault_swift_url_templatez,http://localhost:8080/v1/AUTH_%(project_id)szThe URL of the Swift endpointÚvault_segment_sizeé izvault object segmentation sizeÚvault_cache_sizez6Number 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ÚTruezUse SSLÚvault_s3_ssl_certzUse SSL certificate bundleÚvault_s3_signature_versionzS3 signature version to useÚvault_s3_support_empty_dirÚFalsez,S3 backend needs empty directory work aroundÚvault_s3_read_timeoutZ120z3Time in seconds to wait for a response to API callsZvault_enable_threadpoolzEnable backend thread poolÚvault_threaded_filesystemz"Allow multiple file system threadsZmax_uploads_pendingZ20zNumber of file uploads.Zvault_cache_usernameZnovazSystem username.Úvault_logging_levelÚerrorz0Logging level filter (debug, info, warn, error).ZFLAGé)ÚvalueÚinfoÚwarnz1.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_aclr>ZretriesZ	write_aclÚmetarZuse_sloZchecksumZchangedÚleave_segmentsZskip_identicalZsegment_threadsZobject_dd_threadsZobject_uu_threadsZcontainer_threadsZyes_allÚobject_namecCsðdtd<tjtd<tjtd<tjtd<tjtd<tjtd<tjjƒdkrRd	td
<ndtd
<tj	jƒdkrrd	td<ndtd<tj
rŽtj
td
d<tjr¢tjtd
d<tjjƒdkrºdtd<n2t
jjtjƒrÔtjtd<ntjdtjƒdtd<dS)Nz1.0rErGrHZbucketZs3_signatureZs3_read_timeoutÚtrueTZsupport_empty_dirFZs3_sslrFrAr@ZfalseZs3_ssl_certzcInvalid S3 SSL cert file path: %sUsing Default path, set the value to False for insecure connectionr-)ÚoptionsÚCONFr,r.r0r5r8r6Úlowerr2r1r/r4ÚosÚpathÚexistsÚLOGr?©rTrTú!/usr/lib/python3.6/s3vaultfuse.pyÚ
option_config¢s0








rVz
%016x.%08xiècstjˆƒ‡fdd„ƒ}|S)Ncs~ytjjtjƒWn$tk
r6tjjtjjƒYnXˆ||Ž}ytjjtjƒWn$tk
rxtjjtjjƒYnX|S)N)ÚloggingÚdisableÚERRORÚ
BaseExceptionZNOTSET)ÚargsÚkwargsÚresult)ÚfuncrTrUÚwrapperÒs
z disable_logging.<locals>.wrapper)Ú	functoolsÚwraps)r^r_rT)r^rUÚdisable_loggingÑsrbcCsVtjj|ƒ\}}d}x8|dkrL|dkr6tjj||ƒ}n|}tjj|ƒ\}}qW||fS)Nr-ú/)r-rc)rPrQÚsplitÚjoin)rQÚheadÚtailÚprefixrTrTrUÚsplit_head_tailás
ricCstjj|ƒ\}}|S)N)rPrQrd)rQrfrgrTrTrUÚget_headîsrjc@s&eZdZd	dd„Zdd„Zdd„ZdS)
Ú	tmpfsfileFcCs||_||_dS)N)ÚremoveÚpersist_exit)ÚselfrlrmrTrTrUÚ__init__ôsztmpfsfile.__init__cCsLtjjtjtjƒ}t|d\}|_tj|ƒ|j	r>tj	|jƒt
jƒ|jS)N)Údir)rPrQrerNr"r#rÚ	open_fileÚcloserlÚ
tmpfs_semaÚacquire)rnÚtmpfs_mountpathÚfhrTrTrUÚ	__enter__ýs
ztmpfsfile.__enter__cGs|jstjƒtj|jƒdS)N)rmrsÚreleaserPrlrq)rnr[rTrTrUÚ__exit__sztmpfsfile.__exit__N)FF)Ú__name__Ú
__module__Ú__qualname__rorwryrTrTrTrUrkós
	rkc@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)rnr~r\rTrTrUroszObjectRepository.__init__cCs.|jdƒr|dd…}tjjt|ƒ}|j|ƒS)Nrcr)Ú
startswithrPrQreÚ_SEGMENT_PREFIXÚ
_full_path)rnÚpartialrQrTrTrUÚ_full_segment_paths
z#ObjectRepository._full_segment_pathcCs*|jdƒr|dd…}tjj|j|ƒ}|S)Nrcr)rrPrQrer~)rnr‚rQrTrTrUrs
zObjectRepository._full_pathcCsdS)NrT)rnrKÚflagsrTrTrUÚobject_open szObjectRepository.object_opencCsdS)NrT)rnrKÚoffÚbufrvrTrTrUÚ
object_upload#szObjectRepository.object_uploadcCsdS)NrT)rnrKÚoffsetrvrTrTrUÚobject_download&sz ObjectRepository.object_downloadcCsdS)NrT)rnrKrTrTrUÚ
object_delete)szObjectRepository.object_deletecCsdS)NrT)rnrKrvrTrTrUÚobject_close,szObjectRepository.object_closeNcCsdS)NrT)rnrKÚlengthrvrTrTrUÚobject_truncate/sz ObjectRepository.object_truncatecCsdS)NrT)rnrKrvrTrTrUÚobject_getattr2szObjectRepository.object_getattrcCsdS)NrT)rnrQrvrTrTrUÚobject_readdir5szObjectRepository.object_readdircCsdS)NrT)rnrQÚmoderTrTrUÚ
object_access8szObjectRepository.object_accesscCsdS)NrT)rnrQrTrTrUÚ
object_unlink;szObjectRepository.object_unlinkcCsdS)NrT)rnrQrTrTrUÚ
object_statfs>szObjectRepository.object_statfs)N)N)rzr{r|rorƒrr…rˆrŠr‹rŒrŽrrr’r“r”rTrTrTrUr}s

r}cs\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 „Zed!d"„ƒZd#d$„ZdMd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„ZdNd0d1„Zd2d3„Zd4d5„ZdOd7d8„Zd9d:„Z dPd;d<„Z!d=d>„Z"d?d@„Z#dAdB„Z$dCdD„Z%dEdF„Z&dGdH„Z'dQdIdJ„Z(dKdL„Z)‡Z*S)RÚBackendRepositorycsTtt|ƒj|f|Žttƒj|_ttƒj|_i|_	t
jtƒ|_
i|_i|_i|_dS)N)Úsuperr•rorÚ	FUSE_USERÚpw_uidrBÚpw_gidÚgroup_idÚmanifestrÚ	S3BackendrMÚ_BackendRepository__backendÚ!_BackendRepository__manifest_lockÚ_BackendRepository__worker_poolÚ_BackendRepository__pending_ios)rnr~r\)Ú	__class__rTrUroCs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_queueÚ	threadingZEventÚ_stop_eventZdaemonÚstart)rnÚ	job_queuerMrTrTrUrocs

z(BackendRepository.BackendWorker.__init__cCs|jjƒdS)N)r¥Úset)rnrTrTrUÚstopmsz$BackendRepository.BackendWorker.stopcCs
|jjƒS)N)r¥Zis_set)rnrTrTrUÚstoppedpsz'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)
rSr>r¤Úcurrent_threadÚidentrªr£Úgetr¢Z	task_donerÚ	ExceptionÚ	exception)rnr^r[ÚkargsÚerTrTrUÚrunss
z#BackendRepository.BackendWorker.runN)rzr{r|Ú__doc__ror©rªr²rTrTrTrUÚ
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)	rrNr&r§ÚworkersÚrangeÚappendr•r´)rnZnum_threadsrMÚ_rTrTrUroŒs
z,BackendRepository.BackendWorkerPool.__init__cCs4x|jD]}|jƒqWx|jD]}|jƒq WdS)N)rµr©re)rnÚtrTrTrUÚ__del__”sz+BackendRepository.BackendWorkerPool.__del__cOs|jj|||fƒdS)z+ Add a job to the worker queue
            N)r§Zput)rnr^r[r°rTrTrUÚadd_job›sz+BackendRepository.BackendWorkerPool.add_jobcCsx|D]}|j||ƒqWdS)z4 Add a list of jobs to the worker queue
            N)r»)rnr^Z	args_listr[rTrTrUÚmap s
z'BackendRepository.BackendWorkerPool.mapcCs|jjƒdS)z> Wait for completion of all the jobs in the queue
            N)r§re)rnrTrTrUÚwait_completion¦sz3BackendRepository.BackendWorkerPool.wait_completionN)	rzr{r|r³rorºr»r¼r½rTrTrTrUÚBackendWorkerPoolˆsr¾cCsVtjj|ƒ\}}d}x8|dkrL|dkr6tjj||ƒ}n|}tjj|ƒ\}}qW||fS)Nr-rc)r-rc)rPrQrdre)rnrQrfrgrhrTrTrUri«s
z!BackendRepository.split_head_tailcCstjj|ƒ\}}|S)N)rPrQrd)rnrQrfrgrTrTrUÚ	_get_head·szBackendRepository._get_headcCs.|jdƒr|dd…}tjjt|ƒ}|j|ƒS)Nrcr)rrPrQrer€Ú
_get_cache)rnr‚rQrTrTrUÚ_get_segment_cache»s
z$BackendRepository._get_segment_cachecCs*|jdƒr|dd…}tjj|j|ƒ}|S)Nrcr)rrPrQrer~)rnr‚rQrTrTrUrÀÁs
zBackendRepository._get_cachecCs>|j|ƒ\}}i}i}tjƒ}||d<t|ƒ}|jj|ƒ}|S)NrK)rirMÚcopyÚbunchifyrZget_object_manifest)rnrKÚ	containerrhÚput_headersÚmrÚ_optsr›rTrTrUÚ_read_object_manifestÇsz'BackendRepository._read_object_manifestcCsl|j|ƒ\}}i}i}d|d<tjƒ}||d<x |jƒD]\}	}
|
|d|	<q8Wt|ƒ}|jj|||ƒdS)NrLzx-static-large-objectrKzx-object-meta-)rirMrÂÚitemsrÃrZupload_object_manifest)rnrKÚobject_manifestÚmetadatarÄrhrÅrÆrÇrHr=rTrTrUÚ_write_object_manifestÛs
z(BackendRepository._write_object_manifestcCsÈ|j|ƒ\}}tjƒ}|dkr$g}n|g}d|d<d|d<d|d<d|d<d|d<t|ƒ}i}|dkrz||d<|j|ƒnd}|jj||ƒ}i}x2|djƒD]"\}	}
d	|	krž|
||	jd
ƒd<qžW|S)Nr-Ú	delimiterFÚhumanÚtotalsÚlongrhÚheadersz
x-object-metazx-object-meta-r)	rirMrÂrÃr·rÚstat_objectrÉrd)rnrKrÄrhrÇr[rÚstrËrHr=rTrTrUÚ_get_object_metadataôs,z&BackendRepository._get_object_metadatac<CsÄ|j|ƒ\}}|j|ƒ}|jj|tjƒƒ|j|<|j|Ri|j|<|tjkpp|t	ddƒt	ddƒt	ddƒfk|j|d<|tjksà|t	ddƒt	ddƒt	ddƒfksà|t	ddƒt	ddƒfksà|t	ddƒt	d	dƒt	d
dƒfkr*y|j
|ƒ}WnFtk
r4}z(tj
d|ƒtjdƒ|j
|ƒ}WYdd}~XnXxJ|D]B}|d
jdƒdjdƒd}	t	|	dƒ}
d|d<||j||
<q<W|j|ƒ}|d|j|d<y"|j|j|dƒ}tj|ƒWntk
rÖYnXtjjtjj|ƒƒstjtjj|ƒƒt|dƒ}
|
jtj|ƒƒWdQRXn`tjjtjj|ƒƒsRtjtjj|ƒƒ|t	ddƒt	ddƒt	ddƒfks€|tjkrØy|j|ƒWntk
r¤YnXyt|dƒ}
WdQRXWntk
rÖYnXy|j|dƒ}tj|ƒWntk
r
YnXtj||ƒ}z$|jtj t!ƒ|j"|<|j#||ƒWd|j"j$|dƒtj%|ƒXyt|dƒ}
WdQRXWntk
rˆYnXWdQRXtj||ƒ}|jtj t!ƒ|j"|<t&ƒ|j'|<|S)NZ8000éZ8800Zc000ÚreadonlyZ8401Z8402Z8002Z8802Zc002z+Manifest for %s not found. Trying in 5 secsrÚnamez
-segments/rÚ.rFÚmodifiedzsegments-dirÚwZ8001Z8801Z0001z	-segments)(rirržr­r¤ÚRLockr›rPÚO_RDONLYÚintrÈr®rSr>ÚtimeÚsleeprdrÔÚmakedirsrZrQrRÚdirnameÚopenÚwriteÚjsonÚdumpsÚO_RDWRr“rƒr¾rNr'rMrŸÚ
_object_closeÚpoprrr¨r )rnrKr„rÄrhÚ	full_pathr›ÚexÚsegZoffstrr‰rËZsegment_dirÚfrvrTrTrUr…s–


*#
 "


 
zBackendRepository.object_opencCsxyFg}x |D]}|jtjj||ƒƒqWtjƒ}t|ƒ}|j||ƒWn,tk
rr}zt	j
|ƒWYdd}~XnXdS)a4 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.
            container (str): Container name, a.k.a root directory.
            segment_list (list): List of segments to remove.
        N)r·rPrQrerMrÂrÃÚdelete_object_listr®rSr¯)rnÚbackendrÄÚsegment_listZdelete_listÚobjrÇrêrTrTrUZ__purge_old_segments_task¤s
z+BackendRepository.__purge_old_segments_taskcCs–|j|jƒ|j|ry:|j|jddt|dƒ}|j|ƒ\}}g}i}d}|j|dsVd}	d}
d}x |	|j|krˆP|j||	dr*y|j|j||	d|ƒ}Wn0tj	dƒ|j|j||	d|ƒ}YnXt
|ƒ}
t|
jt
jƒ}|j|j||	d|
j||
jd	œƒnP|j||	d
}|j|j||	d|j||	d||j||	dd	œƒ|	t
j7}	|d
7}|
|7}
qxW|j|||t|ƒt|
ƒdœdd}	x˜drT|rT|j|||	ƒ}t|ƒdkrèPt|ƒ}|j|j||	dƒ\}}tt|ƒt|gƒƒ}t|ƒdkrF|j|j|j||ƒ|	t
j7}	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-dirrcz	-segmentsrrÖrÙr×r)rQÚetagÚ
size_bytesÚcontent_typeròÚhashrór)zsegments-dirz
segment-countz
total-size)rËTN)rŸr½ržr›r­r€rirrÞrßrÃÚminÚst_sizerNr)r·rñrórÌÚstrrïÚlenÚsortedÚlistr¨r»Ú+_BackendRepository__purge_old_segments_taskr®rSr¯)rnrKrvÚsegments_dirrÄrhrÊZ
segments_listZsegmentsr‰Z
total_sizeÚsegment_sizerÓÚstatZobjectsÚcÚpZ
purge_listrêrTrTrUrç·s”




zBackendRepository._object_closecCsv|j||ƒ|jj|ƒ|jj|ƒytj|ƒWntk
rFYnXytj|j|ƒƒWntk
rpYnXdS)N)	rçrŸrèr rPrrrZrlr)rnrKrvrTrTrUrŒ1szBackendRepository.object_closec#Csˆ|j|ry*||j|krJ|j||ddkrJ|j||d}n8|j||ƒ}|j|jddt|dƒ}tjj||ƒ}tj	ƒ}d|j|k|d<|j
|ƒ\}	}
tdd	2}t|d
ƒ}|j
|ƒWdQRXt|ƒ|d<WdQRX|
jdƒ|d<t|ƒ}|	|g}
|j|j|ƒ|j|j|j|
|||||ƒWn>tk
rx}z tj|ƒ|j|j|ƒWYdd}~XnXWdQRXdS)
NrÙTr×zsegments-dirrcz	-segmentsÚ0Z
path_valid)rmÚwbrýrK)ržr›Ú,_BackendRepository__next_segname_from_offsetr­r€rPrQrerMrÂrirkrârãrøÚrstriprÃr ÚaddrŸr»Ú&_BackendRepository__object_upload_taskr®rSr¯rl)rnrKr‰r‡rvÚseg_fullnameZsegnamerürÇrÄrðÚtempfsrìÚargs1rêrTrTrUrˆ?s6

zBackendRepository.object_uploadc	*Cstjd||tjƒjfƒ|j|WdQRXzjy|j||ƒWnTtk
r–}z8tj|ƒ|j||j	|j
|ƒWdQRX‚WYdd}~XnXWdtjƒt
j
|dƒX|j|V||j|krÜi|j||<||j||d<d|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].Nrr×TrÙ)rSr>r¤r«r¬ržZ
upload_objectr®r¯r rlrsrxrPr›)	rnrîr	rÇrKr‰rrvrêrTrTrUZ__object_upload_taskgs(

z&BackendRepository.__object_upload_taskc
CsHxvtjdƒ|j|X||j|kr(w||j|krVtd|tt|ƒtdƒfƒ‚|j||d}PWdQRXqW|j|j	dƒƒ\}}t
dd¨}tjƒ}d|d<d|d	<|j	dƒ|d
<t
|ƒ}||g}	y:|jj|	|ƒt|j	dƒdƒ}
|
jƒ}WdQRXt|ƒStk
r8}ztj|ƒ‚WYdd}~XnXWdQRXdS)Ngš™™™™™¹?zobject %s not foundrr×rcT)rlrhZ
out_directoryZout_fileÚrb)rÞrßržr r›r®ÚSEGMENT_FORMATrÝrirrkrMrÂrÃrZdownload_objectrâÚreadÚ	bytearrayrSr¯)
rnrKr‰rvrrÄrðrrÇr	rìr‡rêrTrTrUrŠˆs6

z!BackendRepository.object_downloadcCs˜|j|„|j|ƒ\}}tjƒ}t|ƒ}|g}|dkrJ|dkrJ|j|ƒy|jj||ƒWn,tk
rˆ}zt	j
|ƒWYdd}~XnXWdQRXdS)Nr-rc)ržrirMrÂrÃr·rÚ
delete_objectr®rSr¯)rnrKrÄrðrÇr	rêrTrTrUr‹ªs

zBackendRepository.object_deleteNcCs0|rdS|j|tjƒ}|jj|ƒtj|ƒdS)N)r…rPÚO_WRONLYrŸrèrr)rnrKrrvrTrTrUrŽºs
z!BackendRepository.object_truncatecCsptjƒ}d|d<d|d<d|d<d|d<tjj|dt|ƒƒ|d<g}|dkrTg}n|g}t|ƒ}|jj||ƒS)	NrÍFrÎrÏrÐz%016xrhr-)	rMrÂrPrQrerÝrÃrZ
list_segments)rnrÄrür‰rÇr[rTrTrUrïÁszBackendRepository.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-dirrcz	-segmentsrrrØrÕéÿÿÿÿ)rir›r­rr€rïrørrÝrùrd)	rnrQr‰rÄrhrürÿrÚfilesrTrTrUZ__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žrir›r­rdrïrørrÝrù)
rnrQr‰rÄrhrërürÿrrrTrTrUÚ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ÓrTrUú	<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)	rPrQÚisdirÚlstatÚdictrÝr®rSr¯)rnZobject_cache_pathÚ	stat_infor±rT)rÓrUÚ_stat_caches(



zBackendRepository._stat_cachec
$sR|j|ƒ}|j|ƒ}|dk	r |S|j|ƒ\}}tjƒ}|dkrDg}n|g}d|d<d|d<d|d<d|d<d|d<t|ƒ}i}|dkrš||d<|j|ƒnd}yN|jj||ƒ‰|j	|d<|j
|d	<ˆd
jddƒ|d<ˆd
jd
dƒ|d<tˆdƒ|d<tˆdƒ|d<tˆdƒ|d<d|d<d|d<|dk	rHd|krHd|d<tˆdƒ|d<|ddkrp|dks®|ddkrˆ|dks®|ddkr |dks®ˆddkrêd|d<d|d<d |d<|j
|ƒ}	tjj|	ƒsêtj|	d!ƒWnBtk
r0}
z"|dkr|}|j
tjj||ƒƒ}|j|ƒ}ytj|ƒ‰Wnžtk
rÜ|}t|ƒdkrj|jƒyVtjj|ddƒ|d<|jj||ƒ‰tˆƒdkr´tjtjj|ƒd!ƒn
tj|ƒWntk
rÖYnXYnX|d"ksü|dd)…jd#ƒrdStj|ƒ‰t‡fd$d%„d*Dƒƒ}WYdd}
~
XnXd&|d'<t|dd&ƒ|d(<|S)+Nr-rÍFrÎrÏrÐrhrrrÑZETagrñZContentTyperóZ	timestamprrrrriírZauthorized_keyi€ÚsizerörZ	directoryTéiiýAiéZ4913ú~c3s|]}|tˆ|ƒfVqdS)N)r)rrH)rÓrTrUrysz3BackendRepository.object_getattr.<locals>.<genexpr>irrr)rrrrrrrör)rr#rirMrÂrÃr·rrÒršrBr­rÝrÀrPrQrRÚmkdirr®rer¿r rZrørèÚlist_objectsrárSr>Úendswithr!)
rnrKrvrérrÄrhrÇr[Zcontainer_pathrêÚmkdirsr	rT)rÓrUr*sž








z BackendRepository.object_getattrccsLg}|j|ƒ\}}tjƒ}d|d<d|d<d|d<d|d<d|d<g}|dkrTg}n"|g}|dkrv|dk	rv|d|d<g}t|ƒ}||jj||ƒ7}x˜|D]}	|j|	ƒ\}
}|
dks¼|dkrøtjj||j	|	ƒƒ}ytj
|d	d
Wntk
röYnX|
dk	rš|
dkršd|
kršd|
krš|
|krš|j|
ƒqšWxt
|ƒD]}
|
Vq8WdS)
NrÍFrÎrÏrÐrhr-rcié)r‘z	-segmentsZ	_segments)rirMrÂrÃrr(rPrQrer¿ràrZr·rú)rnrKrvZlistingrÄrhrÇr[ÚdirentsZlstZ	componentÚrestr*ÚrrTrTrUrsB
z BackendRepository.object_readdircCsdS)NrT)rnrKr‘rTrTrUr’¼szBackendRepository.object_accessFcCs:|td<tjƒ}t|ƒ}|sÆy||j|ƒ}|j|ƒ}g}x|D]}|j|dƒq<W|jj||ƒ|jdƒ}|dk	r–|g}	|jj	|	|ƒt
j|j|ƒƒWn,t
k
rÄ}
ztj|
ƒWYdd}
~
XnX|j|ƒ\}}|g}
|dkrô|dkrô|
j|ƒy|jj|
|ƒWn.t
k
r4}
ztj|
ƒWYdd}
~
XnXdS)NrJr×zsegments-dirr-rc)rMrÂrÃrÈrÔr·rrír­Úrmdir_objectrPÚrmdirrÀr®rSr¯rir)rnrKrJrÇZobj_manifestZobj_metadatarïÚmanrür[rêrÄrðr	rTrTrUr“¿s8






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)rMrÂrÃrrÒr®rSr¯r
ÚerrnoÚENOENTrÝ)	rnrKrÇr	Zstvrêr1r3ZdtrTrTrUr”ß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)rSrrirMrÂrÃrZmkdir_objectr®r¯rÀrPrQrerà)
rnrQr‘ZistrÄrðrÇr[rêÚ
cache_pathrTrTrUr'þs$

zBackendRepository.mkdirc
:CsÖ|j|ƒ\}}tjƒ}d|d<t|ƒ}|g}|dkrF|dkrF|j|ƒg}y||jj||dd7}Wn,tk
r}ztj	|ƒWYdd}~XnXt
|ƒdkr¨ttj
ƒ‚y|jj||ƒWn,tk
ræ}ztj	|ƒWYdd}~XnX|jdtƒy||jj||dd7}Wn.tk
r<}ztj	|ƒWYdd}~XnXt
|ƒdkrŽy|jj||ƒWn.tk
rŒ}ztj	|ƒWYdd}~XnX|j|ƒ}tjj|ƒr°tj|ƒ|j|ƒ}	tjj|	ƒrÒtj|	ƒSdS)Nrhr-rcr()Z	max_itemsr)rirMrÂrÃr·rr(r®rSr¯rør
r6Z	ENOTEMPTYr.Úinsertr€rÁrPrQrr/rÀ)
rnrQrÄrðrÇr	Z	dir_itemsrêZsegment_cache_pathr8rTrTrUr/sH






zBackendRepository.rmdircCsVtjd|ƒy.|j|ƒ\}}|jtjj||ƒƒ}tj||ƒStk
rPYnXdS)Nz	chmod, %s)	rSrrirÀrPrQreÚchmodrZ)rnrQr‘rÄrhr8rTrTrUr:MszBackendRepository.chmodcCsXtjd|ƒy0|j|ƒ\}}|jtjj||ƒƒ}tj|||ƒStk
rRYnXdS)Nz	chown, %s)	rSrrirÀrPrQreÚchownrZ)rnrQÚuidÚgidrÄrhr8rTrTrUr;VszBackendRepository.chowncCstdƒ‚dS)NzNot Applicable)r®)rnr×ÚtargetrTrTrUÚsymlink_szBackendRepository.symlinkc
[CsØtjd||fƒ|d}y|j|ddWn,tk
rX}ztj|ƒWYdd}~XnXyJ|j|ƒ}|j|ƒ}|jd|dƒ|jd|dƒkr¢|j|dddSWn,tk
rÐ}ztj|ƒWYdd}~XnXd}y¸y|j|ƒ}Wn.tk
r}ztj|ƒWYdd}~XnxX|j|ƒ}|jd|dƒ}	g}
x2|D]*}|
j|d	|d
|d|dd
œƒq:W|j	||
|	|d|ddœdd}Wnt
k
r¦‚YnXzàyÂ|j|ƒ}|j|ƒ}|jd|dƒ}	g}x2|D]*}|j|d	|d
|d|dd
œƒqÚW|j	|||	|d|ddœdy|j|ddWn.tk
rh}ztj|ƒWYdd}~XnXWnt
k
r„‚YnXWd|rÒy|j|ddWn.tk
rÐ}ztj|ƒWYdd}~XnXXdS)Nzrename, %s -> %sr&T)rJzsegments-dirz	-segmentsrFr×rôròró)rQrñròróz
segment-countz
total-size)zsegments-dirz
segment-countz
total-size)rË)rSrr“r®r¯rÔr­rÈr·rÌrZ)
rnÚoldÚnewZnewbak_namerêZnew_metadataZold_metadataZnewfile_existsZnew_manifestrüZnewbak_manifestr0Zold_manifestrTrTrUÚrenamebs„








 zBackendRepository.renamecCsZtjd|ƒt|ƒ\}}|jtjj||ƒƒ}t|ƒ\}}|jtjj||ƒƒ}tj||ƒS)Nzlink, %s)rSrrirÀrPrQreÚlink)rnr>r×rÄrhZcache_path_targetZcache_path_namerTrTrUrCÉszBackendRepository.linkcCsNtjd|ƒt|ƒ\}}|j|ƒ}ytj||ƒWntk
rHdSXdS)Nzutimens, %sr)rSrrirÀrPÚutimerZ)rnrQÚtimesrÄrhr8rTrTrUÚutimensÑs
zBackendRepository.utimenscCsXy>tjjtjtjƒ}tjj|ƒr<tjj|ƒr<tj	|dddWnt
k
rRYnXdS)Né)Ztimeoutr)rPrQrerNr"r#rÚismountrÚumountrZ)rnrQrurTrTrUÚdestroyÝs
zBackendRepository.destroy)N)N)F)F)N)+rzr{r|rorr´r¾rir¿rÁrÀrÈrÌrÔr…rûrçrŒrˆrrbrŠr‹rŽrïrrr#rrr’r“r”r'r/r:r;r?rBrCrFrJÚ
__classcell__rTrT)r¡rUr•BsL)#z(!"
)
c/
 
 /		g
r•c@speZdZdd„Zdd„Zddd„Zdd	„Zddd„Zd
d„Zdd„Z	dd„Z
dd„Zdd„Zdd„Z
dd„Zd
S)Ú	FuseCachecCsb||_||_t|_ttƒj|_ttƒj|_t	j
j|jƒs†y4tj
|jƒtj|jt|jƒdt|jƒgƒWqÎtk
r‚‚YqÎXnHt	j|jƒ}|j|jksª|j|jkrÎtjtjt|jƒdt|jƒgƒyvt	j
jtjtjƒ}t	j
j|ƒsøtj|ƒt	j
j|ƒsBdttjƒttjƒ}dd|d}tjdd|d|gƒWntk
r\‚YnXdS)Nú:r<zsize=%dM,mode=0777r(ir$z-o)r~Ú
repositoryÚlrucacherr—r˜rBr™ršrPrQrrr'r;r÷rZrþrrrNr"rer#rZensure_treerHrÝr)r+Zmount)rnr~rNr"ruZ
tmpfs_sizeZtmpfs_buffer_cfgrTrTrUroÿs6(
$

zFuseCache.__init__cCsL|jj||ƒ}|jj|dƒr(|jj|ƒttjdtj	ƒ|t
dœ|j|<|S)N)Úmaxsize)rOÚlrulockrKÚwrites_before_update_manifest)rNr…rOr­rèrrNr+r¤ZLockÚNUMBER_UPLOADS_BEFORE_FLUSH)rnrKr„rvrTrTrUr…$s
zFuseCache.object_openTcCsžtjd|tjƒjfƒ|j|}|d}|dPy4x.|jƒ\}}|dr8|jj|||d|ƒq8WWnt	k
r|YnXWdQRX|rš|jj
||ƒdS)NzCache object_flush [%s] [%x]rOrQrÙÚdata)rSrr¤r«r¬rOÚpopitemrNrˆÚKeyErrorrç)rnrKrvÚupdate_manifestÚitemÚcacher†rTrTrUÚobject_flush1s 

zFuseCache.object_flushcCsFtjd|tjƒjfƒ|j||dd|jj||ƒ|jj	|ƒdS)NzCache object_close [%s] [%x]F)rW)
rSrr¤r«r¬rZrNrŒrOrè)rnrKrvrTrTrUrŒHszFuseCache.object_closeNcCs|jj|||ƒdS)N)rNrŽ)rnrKrrvrTrTrUrŽRszFuseCache.object_truncateccsVxP|dkrP|tjtj}||}t|tj|ƒ}|||fV||7}||8}qWdS)Nr)rNr)rõ)rnr‰rZ
seg_offsetÚbaseÚseg_lenrTrTrUÚ_walk_segmentsUs
zFuseCache._walk_segmentsc!Csptƒ}|j|dLxB|j||ƒD]0\}}}y|j|d|d}	Wnötk
rDy²|j|d}
t|
ƒtjkrè|
jƒ\}}|drè|jj	|||d|ƒ|j|dd8<|j|dsè|jj
||ƒt|j|d<|jj|||ƒ}	d|	dœ|j|d|<Wn,t
k
r>}
ztj|
ƒd	Sd}
~
XnXYnX||	|||…7}q(WWdQRXt|ƒS)
NrQrOrTrÙrRrF)rÙrTr)r
rOr]rZrørNr+rUrNrˆrçrSrŠr®rSr¯Úbytes)rnrKrr‰rvZ
output_bufÚ	segoffsetr[r\ÚsegdatarYr†rXrêrTrTrUÚobject_read`s>	

"zFuseCache.object_readcCsÀtjd|tjƒjfƒt|ƒ}d}|j|d~xt|j||ƒD]b\}}}	|j|d}
||
krFt|
ƒtj	krâ|
j
ƒ\}}|drâ|jj|||d|ƒ|j|dd8<|j|dsâ|jj
||ƒt|j|d<y4|jj|||ƒ}
|
dkrtd	ƒ‚d
|
dœ|
|<Wn,tk
rBtdƒ}
d|
dœ|
|<YnXn|
|d}
t|
ƒ|krz|
jd
||	t|
ƒƒ||||	…|
|||	…<d|
|d<||	7}qFWWdQRXt|ƒS)NzCache object_write [%s] [%x]rrQrOrÙrTrRrzObject not foundF)rÙrTTó)rSrr¤r«r¬rørOr]rNr+rUrNrˆrçrSrŠr®rZr
Úextend)rnrKr‡r‰rvrZbufptrr_r[r\rYr†rXr`rTrTrUÚobject_write™sL


zFuseCache.object_writecCstj|jj|ƒ|ƒS)N)rPr'rNr)rnrQr‘rTrTrUr'íszFuseCache.mkdircCs|jj|ƒ}tj|ƒS)N)rNrrPr/)rnrQrérTrTrUr/ðszFuseCache.rmdircCs|jj|ƒ}tj||ƒS)N)rNrrPr:)rnrQr‘rérTrTrUr:ôszFuseCache.chmodcCs|jj|ƒ}tj|||ƒS)N)rNrrPr;)rnrQr<r=rérTrTrUr;øszFuseCache.chown)T)N)rzr{r|ror…rZrŒrŽr]rardr'r/r:r;rTrTrTrUrLþs%


9TrLc@sÚeZdZd2dd„Zdd„Zdd„Zdd	„Zed3d
d„ƒZdd
„Z	dd„Z
dd„Zdd„Zdd„Z
dd„Zdd„Zdd„Zdd„Zdd„Zd4d d!„Zd"d#„Zd5d$d%„Zd&d'„Zd(d)„Zd6d*d+„Zd,d-„Zd.d/„Zd0d1„ZdS)7r%NcCs&||_|pt|ƒ|_t||jƒ|_dS)N)r~r•rNrLrY)rnr~rNrTrTrUroýszTrilioVault.__init__cCs|jj||ƒdS)N)rNr’)rnrQr‘rTrTrUÚaccessszTrilioVault.accesscCs|jj||ƒS)N)rNr:)rnrQr‘rTrTrUr:szTrilioVault.chmodcCs|jj|||ƒS)N)rNr;)rnrQr<r=rTrTrUr;szTrilioVault.chowncCs|jj||ƒS)N)rNr)rnrQrvrTrTrUrszTrilioVault.getattrccs4ddg}|j|jj||ƒƒx|D]
}|Vq"WdS)NrØz..)rcrNr)rnrQrvr+r-rTrTrUÚreaddirs
zTrilioVault.readdircCs2tj|j|ƒƒ}|jdƒr*tjj||jƒS|SdS)Nrc)rPÚreadlinkrrrQÚrelpathr~)rnrQÚpathnamerTrTrUrgs
zTrilioVault.readlinkcCstj|jj|ƒ||ƒS)N)rPÚmknodrNr)rnrQr‘ZdevrTrTrUrj*szTrilioVault.mknodcCs|jj|ƒS)N)rNr/)rnrQrTrTrUr/-szTrilioVault.rmdircCs|jj||ƒS)N)rNr')rnrQr‘rTrTrUr'0szTrilioVault.mkdircCs|jj|ƒS)N)rNr”)rnrQrTrTrUÚstatfs3szTrilioVault.statfscCs|jj|ƒS)N)rNr“)rnrQrTrTrUÚunlink6szTrilioVault.unlinkcCs|jj||ƒS)N)rNr?)rnr×r>rTrTrUr?9szTrilioVault.symlinkcCs|jj||ƒS)N)rNrB)rnr@rArTrTrUrB<szTrilioVault.renamecCs|jj||ƒS)N)rNrC)rnr>r×rTrTrUrC?szTrilioVault.linkcCs|jj||ƒS)N)rNrF)rnrQrErTrTrUrFBszTrilioVault.utimenscCs|jj||ƒS)N)rYr…)rnrQr‘rTrTrUrâHszTrilioVault.opencCs|j|tjƒS)N)rârPÚO_CREAT)rnrQr‘ZfirTrTrUÚcreateKszTrilioVault.createcCs|jj||||ƒ}|S)N)rYra)rnrQrr‰rvr‡rTrTrUrNszTrilioVault.readcCs|jj||||ƒS)N)rYrd)rnrQr‡r‰rvrTrTrUrãRszTrilioVault.writecCs|jj|||ddS)N)rv)rYrŽ)rnrQrrvrTrTrUÚtruncateUszTrilioVault.truncatecCs|jj||ƒdS)N)rYrZ)rnrQrvrTrTrUÚflushXszTrilioVault.flushcCs|jj||ƒdS)N)rYrŒ)rnrQrvrTrTrUrx[szTrilioVault.releasecCstjd|ƒ|jj|ƒS)Nzdestroy, %s)rSrrNrJ)rnrQrTrTrUrJbszTrilioVault.destroy)N)N)N)N)N)rzr{r|rorer:r;rbrrfrgrjr/r'rkrlr?rBrCrFrârnrrãrorprxrJrTrTrTrUr%üs2



ú/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)
rPrQrRrârrãrrÂrlr;)Z	conf_fileÚfoundrìÚlineÚsZoutfrTrTrUÚ	fuse_confgs"

rwcCs yšytj|dgƒWntk
r(YnXtjj|ƒrPtj|dtdtgƒnHtj|dgƒtj|dgƒtj|tdtgƒtj|tdtgƒWn,t	k
rÆ}zt
j|ƒWYdd}~XnXdd„tjt
jƒDƒt|t|ƒd}d}t
jjƒd	krd
}t|||ddddddS)Nz-lz-RrMz-pcSs&g|]}tjtjjtj|ƒdd‘qS)T)Ú
ignore_errors)ÚshutilZrmtreerPrQrerNr")rÚxrTrTrUú
<listcomp>Žszmain.<locals>.<listcomp>)rNTrLF)Z	nothreadsZ
foregroundZnonemptyZ
big_writesZallow_other)rrIrZrPrQrr;r—r'r®rSr¯ÚlistdirrNr"r%r•r9rOr	)Z
mountpointZ	cacherootrêZtvaultpluginZdisable_fuse_threadsrTrTrUÚmainzs8r}cCstƒtƒttjtjƒdS)z$Main routine that drives fuse mount.N)rVrwr}rNr!r"rTrTrTrUr²¦sr²Ú__main__i€i)rq)br³rPÚsysr6rÞräryr`Ú
subprocessr¤rrZtempfilerrrÚImportErrorZqueueÚpwdrZ
cachetoolsrZfuser	r
rZfusepyZs3fuse.bunch_p3ZastZoslo_configr
Zoslo.configZoslo_logrrWZs3fuserrZs3fuse.privseprZ_DEFAULT_LOG_DATE_FORMATr€ZQUEUE_DEPTHZWORKER_POOL_SIZEZBoolOptZcommon_cli_optsZStrOptZlogging_cli_optsZIntOptZgeneric_log_optsZListOptZlog_optsZcontego_vault_optsrNZ
register_optsZregister_cli_optsr÷ÚenvironÚflagÚargvZsetupr rOZ	getLoggerrSrsr:ZloggerZsetLevelÚDEBUGÚINFOZWARNrYrZr­rMrVZCACHE_LOW_WATERMARKZCACHE_HIGH_WATERMARKZgetpassZgetuserr—rrOrSrbrirjrkÚobjectr}r•rLr%rwr}r²rzrTrTrTrUÚ<module>s¼



















#
4Ek,