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-el9 / usr / lib / python3.9 / site-packages / s3fuse / __pycache__ / s3vaultfuse.cpython-39.opt-1.pyc
Size: Mime:
a

]‰rg]Mã'@sædZddlZddlZddlZddlZddlZddlZddlmZddlZddl	Z	ddl
Z
ddlZddlZddlm
Z
ddlmZzddlmZmZWn"ey¶ddlmZmZYn0ddlmZzddlmZmZmZWn(eyddlmZmZmZYn0dd	lmZdd
lmZzddl m!Z!Wn eyNddl"m!Z!Yn0dd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]gd^¢d_d5e!j.d`ddad5e!j.dbddcd5e!j0dddedfd5e!j0dgdedhd5e!j2diddjd5gZ5e!j0dkdldmd5e!j0dndodpe!j0dqdrdod5e!j2dse,dtd5e!j2due-dvd5e!j2dwdxdyd5e!j2dzd{d|d5e!j2d}d~dd5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!j7Z7e7 8e6¡e7 9e1¡e7 9e3¡e7 9e5¡e7 9e/¡ze:ej;d¶ƒZ<e7e<gƒWn&eyhe7ej=dCd…ƒYn0d·e7 >¡vs†d·e) ?¡vr”dd¸l@mAZAndd¹l#mBZAe% Ce7¡ZDddCgdºdddddddddddddd»œ
d:dd‡d‡ej; Ed¼¡ej; Ed½¡ej; Ed¾¡d‡d‡dd:ddd‡d‡d‡ddddgddd:ddd:d¿d¿d¿d¿ddd&ZFdÁd„ZGd¿ZHdÃZIe J¡ZKe Le M¡¡jNZOdÄZPdÅZQdÆdDŽ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_typeÚintervalztype 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_levels)z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_sizeizvault 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)Úutilsú1.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
 ¡dkrÞtj tj¡rÞtjtd
<n(tj
 ¡dkrt dtj¡dtd
<dS)Nr@rFrHrIZbucketZs3_signatureZs3_read_timeoutr:r<r=Zs3_sslr*Zs3_ssl_certZ
s3_ssl_verifyZ
COMPLIANCEZretention_moderGrBrAÚ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©rWrWú6/usr/lib/python3.9/site-packages/s3fuse/s3vaultfuse.pyÚ
option_configˆs@




ÿ



ÿ
ÿýÿrYéz
%016x.%08xi@Bcst ˆ¡‡fdd„ƒ}|S)Ncsòztj tj¡Wn"ty4tj tjj¡Yn0z~ˆ|i|¤ŽWztj tj¡WStyztj tjj¡YS0Sztj tj¡Wqîty²tj tjj¡Yqî0n8ztj tj¡Wn"tyêtj tjj¡Yn00dS©N)ÚloggingÚdisableZERRORÚ
BaseExceptionZNOTSET)ÚargsÚkwargs©ÚfuncrWrXÚwrapper¸s&ûýz disable_logging.<locals>.wrapper)Ú	functoolsÚwraps)rbrcrWrarXÚdisable_logging·srfcCsRtj |¡\}}d}|dvrJ|dkr4tj ||¡}n|}tj |¡\}}q||fS©Nr*)r*ú/©rRrSÚsplitÚjoin)rSÚheadÚtailÚprefixrWrWrXÚsplit_head_tailÈsrocCstj |¡\}}|Sr[©rRrSrj)rSrlrmrWrWrXÚget_headÕsrqc@s€eZdZdd„Zdd„Zdd„Zdd„Zd	d
„Zdd„Zd
d„Z	dd„Z
ddd„Zddd„Zdd„Z
dd„Zdd„Zdd„ZdS) ÚObjectRepositorycKs
||_dSr[)Úroot©Úselfrsr`rWrWrXÚ__init__ÛszObjectRepository.__init__cCs.| d¡r|dd…}tj t|¡}| |¡S©Nrhr)Ú
startswithrRrSrkÚ_SEGMENT_PREFIXÚ
_full_path©ruÚpartialrSrWrWrXÚ_full_segment_pathßs
z#ObjectRepository._full_segment_pathcCs*| d¡r|dd…}tj |j|¡}|Srw©rxrRrSrkrsr{rWrWrXrzæs
zObjectRepository._full_pathcCsdSr[rW)rurMÚflagsrWrWrXÚobject_openìszObjectRepository.object_opencCsdSr[rW)rurMÚoffÚbufÚfhrWrWrXÚ
object_uploadïszObjectRepository.object_uploadcCsdSr[rW)rurMÚoffsetrƒrWrWrXÚobject_downloadòsz ObjectRepository.object_downloadcCsdSr[rW)rurMrWrWrXÚ
object_deleteõszObjectRepository.object_deletecCsdSr[rW©rurMrƒrWrWrXÚobject_closeøszObjectRepository.object_closeNcCsdSr[rW©rurMÚlengthrƒrWrWrXÚobject_truncateûsz ObjectRepository.object_truncatecCsdSr[rWrˆrWrWrXÚobject_getattrþszObjectRepository.object_getattrcCsdSr[rW©rurSrƒrWrWrXÚobject_readdirszObjectRepository.object_readdircCsdSr[rW©rurSÚmoderWrWrXÚ
object_accessszObjectRepository.object_accesscCsdSr[rW©rurSrWrWrXÚ
object_unlinkszObjectRepository.object_unlinkcCsdSr[rWr“rWrWrXÚ
object_statfs
szObjectRepository.object_statfs)N)N)Ú__name__Ú
__module__Ú__qualname__rvr}rzr€r„r†r‡r‰rŒrrr’r”r•rWrWrWrXrrÚs

rrcseZdZ‡fdd„ZGdd„deƒZGdd„dƒZdd„Zd	d
„Zdd„Z	d
d„Z
dd„Zdd„Zifdd„Z
dd„Zdd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd[d*d+„Zd,d-„Zd.d/„Zd0d1„Zd2d3„Zd\d4d5„Zd6d7„Zd8d9„Zd:d;„Z d<d=„Z!d>d?„Z"d@dA„Z#dBdC„Z$d]dEdF„Z%dGdH„Z&d^dIdJ„Z'dKdL„Z(dMdN„Z)dOdP„Z*dQdR„Z+dSdT„Z,dUdV„Z-d_dWdX„Z.dYdZ„Z/‡Z0S)`ÚBackendRepositorycsvtt|ƒj|fi|¤Žttƒj|_ttƒj|_i|_	t
 t¡|_
i|_t ¡|_i|_i|_i|_| dt¡|_dS)Nr)Úsuperr™rvrÚ	FUSE_USERÚpw_uidrCÚpw_gidÚgroup_idÚmanifestrÚ	S3BackendrOÚ_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_poolrt©Ú	__class__rWrXrvs
zBackendRepository.__init__c@s0eZdZdZdd„Zdd„Zdd„Zdd	„Zd
S)zBackendRepository.BackendWorkerzU A thread used to asyncronously perform backend jobs placed in the job_queue
        cCs8t |¡t |¡|_||_t ¡|_d|_	| 
¡dS)NT)rrvrr Ú_BackendWorker__backendÚ_BackendWorker__job_queuer£ÚEventÚ_stop_eventÚdaemonÚstart)ruÚ	job_queuerOrWrWrXrv1s

z(BackendRepository.BackendWorker.__init__cCs|j ¡dSr[)r°Úset©rurWrWrXÚstop;sz$BackendRepository.BackendWorker.stopcCs
|j ¡Sr[)r°Úis_setrµrWrWrXÚstopped>sz'BackendRepository.BackendWorker.stoppedc
Cs²t dt ¡j¡| ¡s®zL|j dd¡\}}}z&||jg|¢Ri|¤ŽW|j 	¡n|j 	¡0Wqt
y~YqYqtyª}zt |¡WYd}~qd}~00qdS)zO Start up the worker and block until there is an item in the queue
            zStarting worker thread[%x].TrN)
rUrJr£Úcurrent_threadÚidentr¸r®Úgetr­Z	task_donerÚ	ExceptionÚ	exception)rurbr_ÚkargsÚerWrWrXÚrunAsÿÿz#BackendRepository.BackendWorker.runN)r–r—r˜Ú__doc__rvr¶r¸rÀrWrWrWrXÚ
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|_t|ƒD]}|j t |j|¡¡qdSr[)	rrPr#r³ÚworkersÚrangeÚappendr™rÂ)ruZnum_threadsrOÚ_rWrWrXrvZsÿz,BackendRepository.BackendWorkerPool.__init__cCs,|jD]}| ¡q|jD]}| ¡qdSr[)rÃr¶rk)ruÚtrWrWrXÚ__del__bs


z+BackendRepository.BackendWorkerPool.__del__cOs|j |||f¡dS)z+ Add a job to the worker queue
            N)r³Zput)rurbr_r¾rWrWrXÚadd_jobisz+BackendRepository.BackendWorkerPool.add_jobcCs|D]}| ||¡qdS)z4 Add a list of jobs to the worker queue
            N)rÉ)rurbZ	args_listr_rWrWrXÚmapnsz'BackendRepository.BackendWorkerPool.mapcCs|j ¡dS)z> Wait for completion of all the jobs in the queue
            N)r³rkrµrWrWrXÚwait_completiontsz3BackendRepository.BackendWorkerPool.wait_completionN)	r–r—r˜rÁrvrÈrÉrÊrËrWrWrWrXr©Vsr©cCsRtj |¡\}}d}|dvrJ|dkr4tj ||¡}n|}tj |¡\}}q||fSrgri)rurSrlrmrnrWrWrXroysz!BackendRepository.split_head_tailcCstj |¡\}}|Sr[rp)rurSrlrmrWrWrXÚ	_get_head…szBackendRepository._get_headcCs.| d¡r|dd…}tj t|¡}| |¡Srw)rxrRrSrkryÚ
_get_cacher{rWrWrXÚ_get_segment_cache‰s
z$BackendRepository._get_segment_cachecCs*| d¡r|dd…}tj |j|¡}|Srwr~r{rWrWrXr͏s
zBackendRepository._get_cachecCs6| |¡\}}t ¡}||d<t|ƒ}|j |¡}|S)NrM)rorOÚcopyrr¡Zget_object_manifest)rurMÚ	containerrnÚ_optsrŸrWrWrXÚ_read_object_manifest•sz'BackendRepository._read_object_manifestcCs|j |¡}|Sr[)r¡Zget_object_headers)rurMÚmanifest_headerrWrWrXÚ_get_object_headerssz%BackendRepository._get_object_headersc
Csd| |¡\}}i}d|d<t ¡}||d<| ¡D]\}}	|	|d|<q2t|ƒ}|j |||¡dS)NrNzx-static-large-objectrMúx-object-meta-)rorOrÏÚitemsrr¡Zupload_object_manifest)
rurMÚobject_manifestÚmetadatarÐrnZput_headersrÑrIÚvaluerWrWrXÚ_write_object_manifest¡sÿz(BackendRepository._write_object_manifestcCsBt d|¡t ¡}t|ƒ}t| d¡dg}|j ||¡dS)Nú	mkdir, %srhú	-segments)	rUrrOrÏrryÚlstripr¡Úmkdir_object)rurMrÑr_rWrWrXÚ_create_segments_folder²s
z)BackendRepository._create_segments_folderc
CsÎ| |¡\}}t ¡}|dkr$g}n|g}d|d<d|d<d|d<d|d<d|d<t|ƒ}|dkrv||d<| |¡nd}|j ||¡}i}|dd	 ¡D],\}}	d
|vrÀ|	|| d
¡d<qœ|	||<qœ|S)Nr*Ú	delimiterFÚhumanÚtotalsÚlongrnÚheadersZMetadatarÕr)	rorOrÏrrÅr¡Ústat_objectrÖrj)
rurMrÐrnrÑr_ÚstrØrIrÙrWrWrXÚ_get_object_metadataºs,
z&BackendRepository._get_object_metadatacCst| |¡\}}| |¡}|tddƒ@tjk}|jB|j |t 	¡¡|j
 |d¡|j
|d7<Wdƒn1sz0Y|j|Î|j |i¡|j |i¡||j
vrŽ|tddƒ@tjksð|tj@tjksð|tj@tjkr¾z| |¡}Wn6ty4t d|¡t d¡| |¡}Yn0z| |¡}Wn6tyzt d|¡t d¡| |¡}Yn0dii|j
|<| d|¡|j
|d<| d	d
¡|j
|d<|D]V}	|	d d
¡d}
|
 d¡d}
t|
dƒ}|	 dd
¡|	d<d|	d<|	|j
||<qº| |¡}|j
| |¡z&| |j
|d¡}
tj|
ddWntyfYn0tjtj |¡ddt|dƒ }|  t! "|¡¡Wdƒn1s°0YnÐtjtj |¡dd|tj#@tj#krPz| $|¡WntyYn0z0t|dƒ}Wdƒn1s.0YWntyNYn0z | %|d¡}
tj|
ddWnty„Yn0t ||¡}z€| &|¡|j'|j||<dii|j
|<ddi|j
|d|<| (||¡W|j| )|d¡|j
|d )|d¡t *|¡n4|j| )|d¡|j
|d )|d¡t *|¡0z0t|dƒ}Wdƒn1sl0YWntyŒYn0zddl+m,}||ƒ -¡Wnty¾Yn0t ||¡}zDzŽd|i|j
|d|<| .t/j0t1¡|j||<t2ƒ|j||<|WW|j"|j
|d8<Wdƒn1sF0YWdƒStyÔ}z\t 3|¡|j| )|d¡|j
|d )|d¡|j| )|d¡t *|¡‚WYd}~n
d}~00W|j"|j
|d8<Wdƒn1s0Yn<|j"|j
|d8<Wdƒn1sD0Y0Wdƒn1sf0YdS)NZffr(rrz+Manifest for %s not found. Trying in 5 secsrÚopen_handlesÚKeyÚ	VersionIdr*Ú	versionIdÚnameú
-segments/Ú.FÚmodifiedúsegments-dirT)Úexist_okÚwrÜÚreadonly)ÚPath)4rorzÚintrRÚO_RDONLYr¥r¢Ú
setdefaultr£ÚRLockr¦r§r¨rŸÚO_RDWRÚO_APPENDrÔr¼rUrJÚtimeÚsleeprÒr»rjrçÚupdateÚmakedirsr^rSÚdirnameÚopenÚwriteÚjsonÚdumpsÚO_WRONLYr”r}rßrªÚ
_object_closeÚpopÚcloseÚpathlibrôÚtouchr©rPr$rOr´r½)rurMrrÐrnÚ	full_pathrórÓrŸÚsegZoffstrr…rØZsegment_dirÚfrƒrôÚexrWrWrXr€ös*
ÿÿ0ÿþýÿÿÿÿÿÿ

ÿ4ÿ$ÿ
ÿÿÿÿÿÿýÿÿ$ÿÿÿÿ	2ö

4ÿzBackendRepository.object_openc
CsTz t ¡}t|ƒ}| ||¡Wn.tyN}zt |¡WYd}~n
d}~00dS)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)rOrÏrÚdelete_object_listr¼rUr½)ruÚbackendÚsegment_listrÑr
rWrWrXZ__purge_old_segments_task™sz+BackendRepository.__purge_old_segments_taskcCsî|j|| ¡|j|ºzv|j| ddt|d¡}| |¡\}}g}d}|j|d|dsˆd}d}	d}
||j|vrސqºz| |j||d|¡}Wn6tyât	 
d¡| |j||d|¡}Yn0|j||d	r:t|ƒ}t|j
tjƒ}
| |j||d|j|j|
|jd
œ¡nd|j||d}
| |j||d|j|| dd
¡|j||d|
|j||dd
œ¡|tj7}|d7}|	|
7}	q||j|||t|ƒt|	ƒdœdd}|rˆ| |||¡}
t|
ƒdkrqˆt|
ƒ}
z|j||d}Wnd
}Yn0| d¡}tt|
ƒt|gƒƒ}t|ƒdkrz|j|| |j|¡|tj7}qÞWWdƒdStyÈ}zt  |¡WYd}~n
d}~00Wdƒn1sà0YdS)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.
        rðrhrÜrrèrórìrrï)rSrëÚetagÚ
size_bytesÚcontent_typerrër*Úhashrr©rðú
segment-countú
total-size©rØTN)!r§rËr¢rŸr»ryrorr^rûrürÚminÚst_sizerPr&rÅÚ
version_idrrrÚÚstrrÚlenÚsortedÚstripÚlistr´rÉÚ+_BackendRepository__purge_old_segments_taskr¼rUr½)rurMrƒÚsegments_dirrÐrnr×Úsegmentsr…Z
total_sizeÚsegment_sizeræÚstatZobjectsÚpZ
purge_listr
rWrWrXr¨sÎ
þÿÿÿþ
þ
ÿÿùÿÿÿÿÿÿÿþöÿ

ýý


þzBackendRepository._object_closec	CsH| ||¡|j||j| |¡|j| |¡|j|d |¡zt |¡WntynYn0t	|j|dƒdkrÖz0|j |d¡}|j |d¡}t 
| |¡¡WntyÈYn0|j |¡|j6|j
|s||jvr|j |d¡Wdƒn1s0YWdƒn1s:0YdS)Nrèr)rr¢r§rr¨rŸrRrr^rÚremoverzr¥r¦)rurMrƒZohZpiosrWrWrXr‰s*zBackendRepository.object_closec

Cszz,|j|š||j|vrH|j||ddurH|j||d}n8| ||¡}|j| ddt|d¡}tj ||¡}t 	¡}d|j|v|d<Wdƒn1s®0Y| 
|¡\}	}
t|ƒ|d	<|
 d¡|d
<t
|ƒ}|	||d	g}|j|| |¡|j|| |j||||||¡WnFtyt}z,t |¡|j|| |¡‚WYd}~n
d}~00dS)NrïTrìrðrhrÜÚ0Ú
path_validr$rM)r¢rŸÚ,_BackendRepository__next_segname_from_offsetr»ryrRrSrkrOrÏrorÚrstriprr¨Úaddr§rÉÚ&_BackendRepository__object_upload_taskr¼rUr½r')
rurMr…r‚rƒÚseg_fullnameZsegnamer"rÑrÐÚobjÚargs1r
rWrWrXr„8s@ÿþÿ
þ0ý
zBackendRepository.object_uploadcCsŠt d||t ¡jf¡|d}|d}	|dd…}|j|Wdƒn1sV0Yzd|_| |||	|¡}
Wnntyè}zVt 	|¡|j|$|j
|| |¡Wdƒn1sÈ0Y‚WYd}~n
d}~00|j|€||j|vri|j||<||j||d<d|j||d<|
 
dd	¡|j||d
<|j
|| |¡Wdƒn1s|0YdS)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ïrêr*rë)rUrJr£r¹rºr¢r)Z
put_objectr¼r½r¨r'rŸr»)rurr0rÑrMr…r.rƒr‚Zbuf_lenZrespr
rWrWrXZ__object_upload_task_s4ÿÿ
2
ÿz&BackendRepository.__object_upload_taskc
Cszt d¡|j|~||j||vr6Wdƒq||j|vrdtd|tt|ƒtdƒfƒ‚|j||d}Wdƒq¤Wdƒq1s˜0Yq| | 	d¡¡\}}i}|j|| 
dd¡|d<t|ƒ}||g}z|j 
||¡}	t|	ƒWStyD}
z,|
jd	d
dkr.t |
¡‚WYd}
~
n:d}
~
0tyt}zt |¡‚WYd}~n
d}~00dS)Ngš™™™™™¹?zobject %s not found rrìrhrër*rÚResponseMetadataÚHTTPStatusCodeé”)rûrür¢r¨rŸr¼ÚSEGMENT_FORMATrõror+r»rr¡Z
get_objectÚ	bytearrayrÚresponserUr½)rurMr…rƒr.rÐr/rÑr0r‚r¿r
rWrWrXr†„s:
ÿÿ.ÿ


z!BackendRepository.object_downloadcCsÀ|j |t ¡¡|j|| |¡\}}t ¡}t|ƒ}|g}|dkr\|dkr\| |¡z|j	 
||¡Wn.tyœ}zt 
|¡WYd}~n
d}~00Wdƒn1s²0YdS)Nr*rh)r¢r÷r£rørorOrÏrrÅr¡Z
delete_objectr¼rUr½)rurMrÐr/rÑr0r
rWrWrXr‡¦sÿ

zBackendRepository.object_deleteNcCs&|rdS| |tj¡}| ||¡dSr[)r€rRrr‰rŠrWrWrXrŒ¹sz!BackendRepository.object_truncatec
Cs¨t ¡}d|d<d|d<d|d<d|d<tj |dt|ƒ¡|d<g}|dkrTg}n|g}t|ƒ}z|j ||¡WSt	y¢}zt
 |¡‚WYd}~n
d}~00dS)	NràFrárârãz%016xrnr*)rOrÏrRrSrkrõrr¡Z
list_segmentsr¼rUr½)rurÐr"r…rÑr_r
rWrWrXr¿s 
zBackendRepository.segment_listc	CsÀ| |¡\}}|j| dd¡}|rT| dt¡r@| |¡\}}| |¡\}}|}n|d}| |||¡}t|ƒdkrŠtt|ƒtdƒfStt|ƒtt	|ƒd 
|¡d 
d¡ddƒdfS)	NrðrhrÜréÿÿÿÿrrîr()rorŸr»rxryrrr4rõrrj)	rurSr…rÐrnr"Úcr&ÚfilesrWrWrXZ__next_segname_from_offsetÕs"$ÿþz,BackendRepository.__next_segname_from_offsetc
Cs|j|¨| |¡\}}|j |d¡rd||j|vrd|j||d}| d¡dWdƒS|j| dd¡}|rŽ| |¡\}}|}n|d}| |||¡}	Wdƒn1s¸0Yt|	ƒdkrâtt|ƒtdƒfStt|ƒtt	|	ƒd |¡d d¡dd	ƒfS)
NrìrírrðrÜrr7rîr()
r¢rorŸr»rjrrr4rõr)
rurSr…rÐrnrr"r8r&r9rWrWrXÚcurr_segname_from_offsetês",$þz*BackendRepository.curr_segname_from_offsetc
s†tj |¡r‚zBt |¡‰t‡fdd„dDƒƒ}d|d<t|ddƒ|d<|WSty|}zt |¡WYd}~n
d}~00dSdS)	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ˆ|ƒfVqdSr[©Úgetattr©Ú.0rI©rærWrXÚ	<genexpr>sÿz0BackendRepository._stat_cache.<locals>.<genexpr>©Úst_atimeÚst_ctimeÚst_gidÚst_modeÚst_mtimeÚst_nlinkrÚst_uidéÚ
st_blksizerÚ	st_blocksN)	rRrSÚisdirÚlstatÚdictrõr¼rUr½)ruZobject_cache_pathÚ	stat_infor¿rWr?rXÚ_stat_caches
þ
zBackendRepository._stat_cachecsÚ| |¡}| |¡\}}t ¡}|dkr.g}n|g}d|d<d|d<d|d<d|d<d|d<t|ƒ}i}|dkr„||d<| |¡nd}z`|j ||¡‰|j|d<|j	|d	<ˆd
 
dd¡|d<ˆd
 
d
d¡|d<ˆd
 
dd¡|d<tˆdƒ|d<tˆdƒ|d<tˆdƒ|d<d|d<d|d<|durFd|vrFd|d<tˆdƒ|d<|ddkrn|dks¬|ddkr†|dus¬|ddkrž|dks¬ˆddurèd |d<d!|d<d"|d<| |¡}	t
j |	¡sèt
 |	d#¡WnÎtyj}
zf|
jd$d%d&krt |
¡zt
 |¡Wnty<Yn0tj|dd't
 |¡WYd}
~
nXd}
~
0ty¸}z6t |¡t
 |¡‰t‡fd(d)„d*Dƒƒ}WYd}~n
d}~00d+|d,<t|dd+ƒ|d-<|S).Nr*ràFrárârãrnrDrHräZETagrrêrZContentTyperZ	timestamprBrCrFrrGiírEZauthorized_keyi€ÚsizerrZ	directoryTéiiýAiér1r2r3©Ú
ignore_errorsc3s|]}|tˆ|ƒfVqdSr[r;r=r?rWrXr@psÿz3BackendRepository.object_getattr.<locals>.<genexpr>rArIrJrK)rzrorOrÏrrÅr¡råržrCr»rõrÍrRrSrTÚmkdirrr6rUr½r'r¼ÚshutilÚrmtreerMrN)rurMrƒr
rÐrnrÑr_rZcontainer_pathr¿r
rWr?rXr-sŒ



ÿÿ
þþ
ýý
ü



þz BackendRepository.object_getattrc
Csbzt |d¡}Wn0ty@}zt |¡‚WYd}~n
d}~00d}||j|vrîz4|jj|j||d||j|| d¡dWnLt	yÔt
 d¡|jj|j||d||j|| d¡dYn0||j||d7}qFz2|j| d¡}|jj||||j|dd	Wn<t	y\t
 d¡|jj||||j|dd	Yn0dS)
Nz%Y-%m-%dT%H:%M:%Srrìrë)rërrré)rérë)
rÚstrptimer¼rUr½rŸr¡Zput_object_segment_retentionr»r^rûrüZput_manifest_retention)rurMÚretainuntilÚdtr
r…Z
object_keyrWrWrXÚ_set_object_retention…s>
þ

þ
þ


þz'BackendRepository._set_object_retentionc	
Cs2| |tj¡}zzÊ|j|¬t |j|¡}d}||j|vrj|j||d}| |d¡||7}q4| dd¡|dkr’| || 	d¡¡n| 	d¡||<|j
 ||¡||j||<Wdƒn1sÐ0YWn2ty}zt
 |¡‚WYd}~n
d}~00W| ||¡n| ||¡0dS)NrrrèrYÚutf8úutf-8)r€rRrör¢rÏÚdeepcopyrŸrr[Údecoder¡Úupdate_object_attributesr¼rUr½r‰)	rurMrìrÙrƒÚattrsr…rQr
rWrWrXÚobject_setxattrªs.
ÿÿ0
z!BackendRepository.object_setxattrc
Cs| |tj¡}zòz°|j|’t |j|¡}d}||j|vrh|j||d}| |d¡||7}q2| |d¡| dd¡|j 	||¡|j| |d¡Wdƒn1s´0YWn0t
yð}zt |¡‚WYd}~n
d}~00W| 
||¡n| 
||¡0dS)Nrrrè)r€rRrör¢rÏr^rŸrr¡r`r¼rUr½r‰)rurMrìrƒrar…rQr
rWrWrXÚobject_removexattrÃs&
ÿ4
z$BackendRepository.object_removexattrc
CsÈ| |tj¡}z¦zd|j|Ft |j|¡}| d¡| ¡}|WdƒWW| 	||¡S1sh0YWn0t
y¤}zt |¡‚WYd}~n
d}~00W| 	||¡n| 	||¡0dS)Nrè)
r€rRrör¢rÏr^rŸrÚkeysr‰r¼rUr½)rurMrƒrardr
rWrWrXÚobject_listxattrØs
û
z"BackendRepository.object_listxattrc
Cs¶| |tj¡}z”zR|j|4t|j||dƒWdƒWW| ||¡S1sV0YWn0ty’}zt 	|¡‚WYd}~n
d}~00W| ||¡n| ||¡0dS)Nr])
r€rRrör¢ÚbytesrŸr‰r¼rUr½)rurMrìrƒr
rWrWrXÚobject_getxattrçs$û
z!BackendRepository.object_getxattrc	
cs’g}| d¡d}g}zF||j |¡7}|D]}| | d¡d¡q,t|ƒD]
}|VqNWn0tyŒ}zt |¡‚WYd}~n
d}~00dS)Nrhr7)	r+r¡Úlist_objectsrÅrjr r¼rUr½)	rurMrƒZlistingZdir_pathÚdirentsZlstÚrr
rWrWrXròs
z BackendRepository.object_readdircCsdSr[rW)rurMr‘rWrWrXr’szBackendRepository.object_accessFc
CsN|td<t ¡}t|ƒ}|sz¸| |¡}| |¡}g}|D]}| |d¡q<|j ||¡| d¡}|durÔ|g}	|j 	|	|¡zt
 | |¡¡Wnt
yªYn0zt
 | |¡¡Wnt
yÒYn0Wn0ty}
zt |
¡WYd}
~
n
d}
~
00z|j |¡Wn0tyH}
zt |
¡WYd}
~
n
d}
~
00dS)NrLrìrð)rOrÏrrÒrçrÅr¡rr»Úrmdir_objectrRÚrmdirrÍr^r'r¼rUr½Zdelete_object_manifest)rurMrLrÑZobj_manifestZobj_metadatarÚmanr"r_r
rWrWrXr”s>





zBackendRepository.object_unlinkc	
CsÒt ¡}t|ƒ}g}z|j ||¡}Wn8ty^}z t |¡tt	j
ƒ‚WYd}~n
d}~00d|dvr’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-usedr7rQÚf_blocksÚf_bfreeÚf_bavailrÚf_favailÚf_frsize)rOrÏrr¡rår¼rUr½r	ÚerrnoÚENOENTrõ)	rurMrÑr0Zstvr
rnrprZrWrWrXr•'s,
 ÿzBackendRepository.object_statfsc

Csât d|¡| |¡\}}t ¡}t|ƒ}||g}z|j ||¡Wn0tyv}zt 	|¡WYd}~dSd}~00| 
|¡}	|durž| 
tj 
||¡¡}	zt |	|¡Wn.tyÜ}zt 	|¡WYd}~n
d}~00dS)NrÛrF)rUrrorOrÏrr¡rÞr¼r½rÍrRrSrkrþ)
rurSr‘ZistrÐr/rÑr_r
Ú
cache_pathrWrWrXrUFs$

 zBackendRepository.mkdirc
Cs| |¡\}}t ¡}d|d<t|ƒ}| d¡d}g}z||jj|dd7}Wn.ty~}zt 	|¡WYd}~n
d}~00t
|ƒdkr–ttj
ƒ‚z|j | d¡g|¡Wn.tyÞ}zt 	|¡WYd}~n
d}~00tj t| d¡¡}z||jj|dd7}Wn0ty<}zt 	|¡WYd}~n
d}~00t
|ƒdkr˜z|j | d¡g|¡Wn0ty–}zt 	|¡WYd}~n
d}~00z&| |¡}	tj |	¡r¼t |	¡WntyÒYn0z&| |¡}
tj |
¡røt |
¡WntyYn0dS)Nrnrhr%)Z	max_itemsr)rorOrÏrr+r¡rhr¼rUr½rr	rsZ	ENOTEMPTYrkrRrSrkryrÝrÎrLrVrWr^rÍ)rurMrÐr/rÑrSZ	dir_itemsr
Zseg_pathZsegment_cache_pathrurWrWrXrlfsR 

 


zBackendRepository.rmdircCsVt d|¡z0| |¡\}}| tj ||¡¡}t ||¡WStyPYn0dS)Nz	chmod, %s)	rUrrorÍrRrSrkÚchmodr^)rurSr‘rÐrnrurWrWrXrvszBackendRepository.chmodcCsXt d|¡z2| |¡\}}| tj ||¡¡}t |||¡WStyRYn0dS)Nz	chown, %s)	rUrrorÍrRrSrkÚchownr^)rurSÚuidÚgidrÐrnrurWrWrXrw¦szBackendRepository.chowncCstdƒ‚dS)NzNot Applicable)r¼©rurìÚtargetrWrWrXÚsymlink¯szBackendRepository.symlinkc
Csj|j |d¡r2t d¡|j |d¡r2td|ƒ‚t d||f¡|d}z|j|ddWn.tyŒ}zt |¡WYd}~n
d}~00zL| 	|¡}| 	|¡}| d|d¡| d|d¡krØ|j|ddWd	SWntyìYn0d
}z¤z| 	|¡}WntyYn~0| 
|¡}| d|d¡}	g}
|D]4}|
 |d|d|d
| dd¡|ddœ¡q:|j||
|	|d|ddœdd}Wn2t
yÈ}zt |¡‚WYd}~n
d}~00zLzÊ| 
|¡}| 	|¡}| d|d¡}	g}|D]4}| |d|d|d
| dd¡|ddœ¡qü|j|||	|d|ddœdz|j|ddWn0ty”}zt |¡WYd}~n
d}~00Wn2t
yÊ}zt |¡‚WYd}~n
d}~00W|rfz|j|d
dWn0ty}zt |¡WYd}~n
d}~00nL|rdz|j|d
dWn0tyb}zt |¡WYd}~n
d}~000d	S)Néz%s in use. Try againzrename, %s -> %sú~T)rLrðrÜrFrìrrrër*r)rSrrrërrrrr)rŸr»rûrür¼rUrr”r½rçrÒrÅrÚr^)
ruÚoldÚnewZnewbak_namer
Znew_metadataZold_metadataZnewfile_existsZnew_manifestr"Znewbak_manifestrmZold_manifestrWrWrXÚrename²s´

 

ÿ

ÿ
ýÿýÿ



ûÿ
ýý$
"ü"zBackendRepository.renamecCsZt d|¡t|ƒ\}}| tj ||¡¡}t|ƒ\}}| tj ||¡¡}t ||¡S)Nzlink, %s)rUrrorÍrRrSrkÚlink)rur{rìrÐrnZcache_path_targetZcache_path_namerWrWrXr‚%szBackendRepository.linkcCsNt d|¡t|ƒ\}}| |¡}zt ||¡WntyHYdS0dS)Nzutimens, %sr)rUrrorÍrRÚutimer^)rurSÚtimesrÐrnrurWrWrXÚutimens-s
zBackendRepository.utimenscCsdS©NrrWr“rWrWrXÚdestroy;szBackendRepository.destroy)N)N)F)F)N)1r–r—r˜rvrrÂr©rorÌrÎrÍrÒrÔrÚrßrçr€r!rr‰r„r-r†r‡rŒrr*r:rPrr[rbrcrergrr’r”r•rUrlrvrwr|rr‚r…r‡Ú
__classcell__rWrWr«rXr™s\)#ÿ
<$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|_t ¡|_ttƒj|_	ttƒj
|_tj
 |j¡sŽz4t |j¡t |jt|j	ƒdt|jƒg¡WqÖtyŠ‚YqÖ0nHt |j¡}|j|j	ks²|j|jkrÖt tjt|j	ƒdt|jƒg¡dS)Nú:)rsÚ
repositoryÚlrucacher£r¤Ú
lrucache_lockrr›rœrCrržrRrSrLr>rUrwrr^r%rHrDrPr")rursr‹rOrWrWrXrvTs*
ÿ

ÿÿzFuseCache.__init__c	Cs€|j ||¡}|jX|j |i¡|j| |d¡}|j| |ttjdt	 
¡|tdœ¡Wdƒn1sr0Y|S)N)Úmaxsize)rŒÚlrulockrMÚwrites_before_update_manifest)r‹r€rrŒr÷rrrPr'r£r¤ÚNUMBER_UPLOADS_BEFORE_FLUSH)rurMrrƒÚitemrWrWrXr€js
ü&zFuseCache.object_openTc	Cs°t d|t ¡jf¡|j||}|d}|dTz0| ¡\}}|dr:|j |||d|¡q:Wnt	yzYn0Wdƒn1s0Y|r¬|j 
||¡dS)NzCache object_flush [%s] [%x]rŒrrïÚdata)rUrr£r¹rºrŒÚpopitemr‹r„ÚKeyErrorr)rurMrƒÚupdate_manifestr’ÚcacherrWrWrXÚobject_flushzs$ÿÿ
ÿ
$zFuseCache.object_flushcCsŽt d|t ¡jf¡|j||dd|j>|j| |d¡t	|j|ƒs^|j |d¡Wdƒn1sr0Y|j
 ||¡dS)NzCache object_close [%s] [%x]F)r–)rUrr£r¹rºr˜rrŒrrr‹r‰rˆrWrWrXr‰‘sÿÿ,zFuseCache.object_closeNcCs|j |||¡dSr[)r‹rŒrŠrWrWrXrŒžszFuseCache.object_truncateccsR|dkrN|tjtj}||}t|tj|ƒ}|||fV||7}||8}qdSr†)rPr&r)rur…r‹Z
seg_offsetÚbaseÚseg_lenrWrWrXÚ_walk_segments¡sÿzFuseCache._walk_segmentscCs²tƒ}|j||d~| ||¡D]^\}}}z |j||d|d}	WntyrzÆ|j||d}
t|
ƒtjkrü|
 ¡\}}|drü|j 	|||d|¡|j||dd8<|j||dsü|j 
||¡t|j||d<|j |||¡}	d|	dœ|j||d|<WnBt
yl}
z(t |
¡WYd}
~
YWdƒd	Sd}
~
00Yn0||	|||…7}q(Wdƒn1s 0Yt|ƒS)
NrrŒr“rïrrF©rïr“r)r5rŒr›r^rrPr'r”r‹r„rr‘r†r¼rUr½rf)rurMr‹r…rƒZ
output_bufÚ	segoffsetr™ršÚsegdatar—rr’r
rWrWrXÚobject_read¬sr	ÿÿÿÿÿ
ÿÿþÿÿþÿÿþÿÿÿÿ
.6zFuseCache.object_readc
CsÔt d|t ¡jf¡t|ƒ}d}|j||d‚| ||¡D]b\}}}	|j||d}
||
vrFt|
ƒtj	krä|
 
¡\}}|drä|j |||d|¡|j||dd8<|j||dsät
|j||d<z4|j |||¡}
|
durtd	ƒ‚d
|
dœ|
|<Wn*tyBtdƒ}
d|
dœ|
|<Yn0n|
|d}
t|
ƒ|krz|
 d
||	t|
ƒ¡||||	…|
|||	…<d|
|d<||	7}qFWdƒn1sÂ0Yt|ƒS)NzCache object_write [%s] [%x]rrrŒrïr“rrzObject not foundFrœTó)rUrr£r¹rºrrŒr›rPr'r”r‹r„r‘r†r¼r^r5Úextend)rurMr‚r…rƒr‹Zbufptrrr™ršr—rr’ržrWrWrXÚobject_writeçs`ÿÿÿ
ÿÿþÿþÿÿ
*zFuseCache.object_writecCst |j |¡|¡Sr[)rRrUr‹rzrrWrWrXrU<szFuseCache.mkdircCs|j |¡}t |¡Sr[)r‹rzrRrl)rurSr
rWrWrXrl?szFuseCache.rmdircCs|j |¡}t ||¡Sr[)r‹rzrRrv)rurSr‘r
rWrWrXrvCszFuseCache.chmodcCs|j |¡}t |||¡Sr[)r‹rzrRrw)rurSrxryr
rWrWrXrwGszFuseCache.chown)T)N)r–r—r˜rvr€r˜r‰rŒr›rŸr¢rUrlrvrwrWrWrWrXr‰Ss

;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ƒ|_dSr[)rsr™r‹r‰r—)rursr‹rWrWrXrvMszTrilioVault.__init__cCs|j ||¡dSr[)r‹r’rrWrWrXÚaccessUszTrilioVault.accesscCs|j ||¡Sr[)r‹rvrrWrWrXrvXszTrilioVault.chmodcCs|j |||¡Sr[)r‹rw)rurSrxryrWrWrXrw[szTrilioVault.chowncCs|j ||¡Sr[)r‹rrŽrWrWrXr<^szTrilioVault.getattrcCs|j |||¡Sr[)r‹rb)rurSrìrÙrQrWrWrXÚsetxattraszTrilioVault.setxattrcCs,| d¡s| d¡rtddƒS|j ||¡S)NZsecurityÚsystemr*r])rxrfr‹rg©rurSrìrWrWrXÚgetxattrds
zTrilioVault.getxattrcCs|j |¡Sr[)r‹rer“rWrWrXÚ	listxattriszTrilioVault.listxattrcCs|j ||¡Sr[)r‹rcr¦rWrWrXÚremovexattrlszTrilioVault.removexattrccs0ddg}| |j ||¡¡|D]
}|Vq dS)Nrîz..)r¡r‹r)rurSrƒrirjrWrWrXÚreaddiroszTrilioVault.readdircCs2t | |¡¡}| d¡r*tj ||j¡S|SdS)Nrh)rRÚreadlinkrzrxrSÚrelpathrs)rurSÚpathnamerWrWrXr«us
zTrilioVault.readlinkcCst |j |¡||¡Sr[)rRÚmknodr‹rz)rurSr‘ÚdevrWrWrXr®‡szTrilioVault.mknodcCs|j |¡Sr[)r‹rlr“rWrWrXrlŠszTrilioVault.rmdircCs|j ||¡Sr[)r‹rUrrWrWrXrUszTrilioVault.mkdircCs|j |¡Sr[)r‹r•r“rWrWrXÚstatfsszTrilioVault.statfscCs|j |¡Sr[)r‹r”r“rWrWrXÚunlink“szTrilioVault.unlinkcCs|j ||¡Sr[)r‹r|rzrWrWrXr|–szTrilioVault.symlinkcCs|j ||¡Sr[)r‹r)rurr€rWrWrXr™szTrilioVault.renamecCs|j ||¡Sr[)r‹r‚)rur{rìrWrWrXr‚œszTrilioVault.linkcCs|j ||¡Sr[)r‹r…)rurSr„rWrWrXr…ŸszTrilioVault.utimenscCs|j ||¡Sr[)r—r€rrWrWrXr¥szTrilioVault.opencCs| |tj¡Sr[)rrRÚO_CREAT)rurSr‘ÚfirWrWrXÚcreate¨szTrilioVault.createcCs|j ||||¡}|Sr[)r—rŸ)rurSr‹r…rƒr‚rWrWrXÚread«szTrilioVault.readcCs|j ||||¡Sr[)r—r¢)rurSr‚r…rƒrWrWrXr¯szTrilioVault.writecCs|jj|||ddS)N)rƒ)r—rŒ)rurSr‹rƒrWrWrXÚtruncate²szTrilioVault.truncatecCs|j ||¡dSr[)r—r˜rŽrWrWrXÚflushµszTrilioVault.flushcCs|j ||¡dSr[)r—r‰rŽrWrWrXÚrelease¸szTrilioVault.releasecCst d|¡|j |¡S)Nzdestroy, %s)rUrr‹r‡r“rWrWrXr‡¿szTrilioVault.destroy)N)N)N)N)N)r–r—r˜rvr£rvrwr<r¤r§r¨r©rªr«r®rlrUr°r±r|rr‚r…rr´rµrr¶r·r¸r‡rWrWrWrXr8Ls8




ú/etc/fuse.confcCsd}tj |¡r\t|dƒ2}|D]}d|vr d|vr d}q>q Wdƒn1sR0Y|dkrd}tj |¡r°t|dƒ }| ¡dd}Wdƒn1s¦0Ytd	d
ƒ}| |¡Wdƒn1sÚ0Yt d	|¡t d	¡t 	ddg¡dS)
NrrjZuser_allow_otherú#rzuser_allow_other 
ZrtÚ
z/tmp/fuse.conf.tmpZwtr¹z	root:root)
rRrSrTrrµrr>rÏr'rw)Z	conf_fileÚfoundrÚlineÚsZoutfrWrWrXÚ	fuse_confÄs"$
.(
r¿c
CsVzÊzt |dg¡Wnty&Yn0tj |¡r€t |¡}ttƒj	}tt
ƒj}|j|krf|j
|ksÈt |dtdt
g¡nHt |dg¡t |dg¡t |tdt
g¡t |tdt
g¡Wn.tyø}zt |¡WYd}~n
d}~00dd„t tj¡Dƒt|t|ƒd}d}tj ¡d	kr8d
}t|||ddddtjddS)Nz-lz-RrŠz-pcSs&g|]}tjtj tj|¡dd‘qS)TrS)rVrWrRrSrkrPr")r>ÚxrWrWrXÚ
<listcomp>ñsýÿzmain.<locals>.<listcomp>)r‹TrNF)Z	nothreadsZ
foregroundZnonemptyZ
big_writesZallow_otherZfsname)r>Zumountr^rRrSrLr%rr›rœÚ
FUSE_GROUPrrHrDrwrUr¼rUr½ÚlistdirrPr"r8r™r6rQrr7)Z
mountpointZ	cacherootZmountpoint_statrCržr
ZtvaultpluginZdisable_fuse_threadsrWrWrXÚmainØsL



ÿ 
üÿørÄcCs<tƒtƒt t¡}| t¡| t¡ttj	tj
ƒdS)z$Main routine that drives fuse mount.N)rYr¿rr rOZvalidate_s3_clientZset_retention_moderÄrPr!r")Z	s3backendrWrWrXrÀ	s


rÀÚ__main__)r¹)^rÁrRÚgrpÚsysrsrûZgetpassrrÏrrVrdr£rÚpwdrrrÚImportErrorZqueueZ
cachetoolsrZfuserr	r
r^ZfusepyZbotocore.exceptionsrZs3fuse.bunch_p3rZoslo_configr
Zoslo.configZs3fuserr\Zs3fuse.utilsrrrZ_DEFAULT_LOG_DATE_FORMATryZQUEUE_DEPTHZWORKER_POOL_SIZEZBoolOptZcommon_cli_optsZStrOptZlogging_cli_optsZIntOptZgeneric_log_optsZListOptZlog_optsZ
vault_optsrPZ
register_optsZregister_cli_optsrÚenvironÚflagÚargvZlist_all_sectionsZsectionsZs3fuse.privsepr>r?ZSetupS3FuseLoggingrUr»rOrYZCACHE_LOW_WATERMARKZCACHE_HIGH_WATERMARKZgetuserr›ÚgetgrgidÚgetgidÚgr_namerÂr4r‘rfrorqÚobjectrrr™r‰r8r¿rÄrÀr–rWrWrWrXÚ<module>sì
üüøý	ÿü
üüýýÓ5ÿýÿýïýýýýûüýüöÿýýý·Qþÿþþþþþþýþþþþþþþþþþþþþþþþþþþþª]





ÿ
ô


Ü(%
4Ozx
4