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    
Size: Mime:
ó
s	”dc @sdZddlZddlZddlZddlZddlZddlZddlmZddlZddl	Z	ddl
Z
ddlZddlZddlm
Z
ddlmZyddlmZmZWn'ek
rýddlmZmZnXddlmZy ddlmZmZmZWn-ek
r]ddlmZmZmZnXdd	lmZdd
lmZyddl m!Z!Wn!ek
rµddl"m!Z!nXddl#m$Z%dd
l&m'Z'ddl(m)Z)ddl(m*Z*dZ+dZ,dZ-dZ.e!j/dddde0ddƒe!j/dddde0ddƒgZ1e!j2ddddd ƒe!j2d!dddd"ƒe!j2d#dddd$ƒe!j2d%de3dd&dd'ƒe!j2d(de+dd)dd*ƒe!j2d+ddd,d-dd.ƒe!j2d/d,d0dd1ƒe!j/d2de0dd3ƒe!j2d4dd5dd6ƒg	Z4e!j/d7de5dd8ƒe!j/d9de0dd:ƒe!j/d;de0dd<ƒe!j/d=de0dd>ƒe!j6d?dd@ddAƒgZ7e!j6dBddCddDƒe!j6dEddFddGƒe!j2dHddIddJƒe!j2dKddLddMƒe!j2dNddOddPƒe!j2dQddRddSƒe!j2dTddUddVƒe!j2dWddXddYƒe!j8dZdd[d\d]d^d_d`gddaƒe!j/dbde0ddcƒe!j/ddde0ddeƒe!j2dfddgddhƒe!j2diddgddjƒe!j6dkddlddmƒgZ9e!j2dnddoddpƒe!j2dqddrƒe!j2dsddtddrƒe!j6dude-ddvƒe!j6dwde.ddxƒe!j6dyddzdd{ƒe!j6d|dd}d~d~ddƒe!j6d€ddddƒe!j2d‚ddƒdddd„ƒe!j2d…dd†dd‡ƒe!j2dˆdd‰ddŠƒe!j2d‹dd‰ddŒƒe!j2ddd‰ddŽƒe!j2ddd‰ddƒe!j2d‘dd‰dd’ƒe!j2d“dd”dd•ƒe!j2d–de'ƒdd—ƒe!j2d˜dddd™ƒe!j2dšdd›ddœƒe!j2dddžddŸƒe!j2d ddždd¡ƒe!j2d¢dd£dd¤ƒe!j2d¥dd¦dd§ƒe!j2d¨dd©ddªƒe!j2d«dd¬dd­ƒe!j/d®de0dd¯ƒe!j/d°de0dd±ƒgZ:e!j;Z;e;j<e:ƒe;j=e4ƒe;j=e7ƒe;j=e9ƒe;j=e1ƒy$e>ej?d²ƒZ@e;e@gƒWn"ek
rQe;ejAd@ƒnXd³e;jBƒkpsd³e*jCƒkr‰dd´lDmEZEnddµl(mFZEe%jGe!j;e;jHjIƒƒe%jJe;jHjIƒƒZKy˜e;jLjIƒdkrûeKjMjNe%jOƒnie;jLjIƒd¶kr&	eKjMjNe%jPƒn>e;jLjIƒd·krQ	eKjMjNe%jQƒneKjMjNe%jRƒWn'ek
rŽ	eKjMjNe%j%jRƒnXi&e3d¸6d@d6gd¹6dºd»6i
e3d¼6e3d½6e3d¾6e3d¿6e3dÀ6e3dÁ6e3dÂ6e3dÃ6e3dÄ6e3dÅ6e3dÆ6e3dÇ6e3dÈ6dÉ6e5dÊ6e3dË6d‰dÌ6d‰dÍ6ej?jSd΃dÏ6ej?jSdЃdÑ6ej?jSd҃dÓ6d‰dÔ6d‰dÕ6e3dÖ6e5d×6e0dØ6e3dÙ6d‰dÚ6d‰dÛ6d‰dÜ6e3dÝ6e0d¶6ddÞ6e3dß6gdà6e0d6e0dá6e5dâ6e0dã6e0dä6e5då6dædç6dædè6dædé6dædê6e0dë6e3dì6ZTdí„ZUdæZVdîZWejXƒZYejZej[ƒƒj\Z]dïZ^dðZ_dñ„Z`dò„Zadó„Zbdôecfdõ„ƒYZddöedfd÷„ƒYZedøecfdù„ƒYZfdúefdû„ƒYZgdüdý„Zhdþ„Zidÿ„Zjekdkr
ejƒndS(sd 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.
iÿÿÿÿN(tdatetime(tThread(tgetpwnam(tQueuetEmpty(tLRUCache(tFUSEtFuseOSErrort
Operations(tClientError(tbunchify(tcfg(tlog(tget_ssl_cert_path(tvaults3(t
config_parsers%Y-%m-%d %H:%M:%Ss$80bc80ff-0c51-4534-86a2-ec5e719643c2iditdebugtshorttdtdefaultthelpsUPrint debugging output (set logging level to DEBUG instead of default WARNING level).tverbosetvsWPrint more verbose output (set logging level to INFO instead of default WARNING level).s
log-configtmetavartPATHsß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.slog-config-appends(Optional) Log Appendswatch-log-files(Optional) Watch logs
log-formattFORMATsÞ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.slog-date-formattDATE_FORMATsCFormat string for %%(asctime)s in log records. Default: %(default)sslog-filetdeprecated_nametlogfilesZ(Optional) Name of log file to output to. If no default is set, logging will go to stdout.slog-dirtlogdirs@(Optional) The base directory used for relative --log-file pathss
use-syslogsUse syslog for logging.ssyslog-log-facilitytLOG_USERs$syslog facility to receive log linest
use_stderrsLog output to standard errortuse_journals%Enable Systemd native journal supporttuse_eventlogs Log output to Windows Event Log.tuse_jsons4Enables JSON formatting in the logs when set to Truetrate_limit_burstisBurst limittlog_rotate_intervalis0Interval, number of hours, of log rate limiting.tmax_logfile_counti<sNumber of log files to retain.tlog_rotate_interval_typetHourssUnits of log rotation intervaltlog_rotation_typetintervalstype of log retentiontlogging_context_format_stringsw%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user)s %(tenant)s] %(instance)s%(message)ss2format string to use for log messages with contexttlogging_default_format_stringsV%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)ss5format string to use for log messages without contexttlogging_debug_format_suffixs$%(funcName)s %(pathname)s:%(lineno)ds0data to append to log format when level is DEBUGtlogging_exception_prefixs?%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)ss5prefix each line of exception output with this formattdefault_log_levelssamqplib=WARNssqlalchemy=WARNs	boto=WARNs	suds=INFOs
keystone=INFOseventlet.wsgi.server=WARNslist of logger=LEVEL pairstpublish_errorsspublish error eventstfatal_deprecationssmake deprecations fataltinstance_formats[instance: %(uuid)s] sBIf an instance is passed with the log message, format it like thistinstance_uuid_formatsGIf an instance UUID is passed with the log message, format it like thistrate_limit_intervalis2Interval, number of seconds, of log rate limiting.tvault_storage_typets3s'Storage type: nfs, swift-i, swift-s, s3tvault_data_directorys'Location where snapshots will be storedtvault_data_directory_olds/var/triliovaulttqueue_depths-The number of writes to be queued (writeback)tworker_pool_sizes3Number of worker threads to process the write queuetvault_retry_countis(The number of times we retry on failurestvault_segment_sizei isvault object segmentation sizetvault_cache_sizes6Number of segments of an object that need to be cachedt
rootwrap_confs/etc/nova/rootwrap.confsrootwrap config filetvault_s3_auth_versiontDEFAULTsS3 Authentication typetvault_s3_access_key_idts	S3 Key IDtvault_s3_secret_access_keysS3 Secret Access Keytvault_s3_region_names	S3 Regiontvault_s3_buckets	S3 Buckettvault_s3_endpoint_urlsS3 Endpoint URLtvault_s3_ssltFalsesEnable SSL certificatetvault_s3_ssl_certsUse SSL certificate bundletvault_s3_signature_versionsS3 signature version to usetvault_s3_read_timeoutt30s3Time in seconds to wait for a response to API callstvault_enable_threadpooltTruesEnable backend thread pooltvault_threaded_filesystems"Allow multiple file system threadstmax_uploads_pendingt20sNumber of file uploads.tvault_cache_usernametnovasSystem username.tvault_logging_levelterrors0Logging level filter (debug, info, warn, error).tvault_s3_max_pool_connectionst500s>The maximum number of connections to keep in a connection pooltbucket_object_locks#S3 bucket object locking is enabledtuse_manifest_suffixsyTo preserve backward compatibility, set this to False.When set to False, s3fuse creates manifest file nameswithout suffixtFLAGts3fuse_sys_admin(tfs(tutilstinfotwarntsync_totheaders1.0tauth_versiontproject_nametregion_nametuser_domain_namet
endpoint_typetobject_storage_urltproject_domain_idtuser_idtuser_domain_idt	tenant_idtservice_typet
project_idt
auth_tokentproject_domain_namet
os_optionstssl_compressiontos_storage_urltos_usernametos_passwordt	OS_CACERTt	os_cacerttOS_CERTtos_certtOS_KEYtos_keytos_tenant_nametos_auth_urlt
os_auth_tokentinsecuretsnettsync_keytauthtusertkeytread_acltretriest	write_acltmetatuse_slotchecksumtchangedtleave_segmentstskip_identicali
tsegment_threadstobject_dd_threadstobject_uu_threadstcontainer_threadstyes_alltobject_namecCsdtjjƒdkst‚tjdks0t‚dtd<tjtd<tjtd<tjtd<tj	td<tj
td	<tjtd
<tjtd<tj
td<d
td<dtd<tjrÓtjtdd<ntjrðtjtdd<ntjjƒdkr&tjdtjƒd
td<n:tjjƒdkr`tjjtjƒr`tjtd<ndS(NR5R?s1.0RaRR‚tbucketts3_signaturets3_read_timeoutRURWRXRAts3_ssl_certt
GOVERNANCEtretention_modeRoRfRctfalsescInvalid S3 SSL cert file path: %sUsing Default path, set the value to False for insecure connectionttrue(tCONFR4tlowertAssertionErrorR>toptionsR@RBRDRIRJRURWRXRERCRFtLOGR^RHtostpathtexists(((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt
option_configs2










		
is
%016x.%08xiècs"tjˆƒ‡fd†ƒ}|S(Ncs•ytjjtjƒWn'tk
r@tjjtjjƒnXˆ||Ž}ytjjtjƒWn'tk
rtjjtjjƒnX|S(N(tloggingtdisabletERRORt
BaseExceptiontNOTSET(targstkwargstresult(tfunc(s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytwrapper¼s

(t	functoolstwraps(R«R¬((R«s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytdisable_logging»scCs}tjj|ƒ\}}d}xR|dkrr|dkrQtjj||ƒ}n|}tjj|ƒ\}}q!W||fS(NRAt/(RAR°(RŸR tsplittjoin(R theadttailtprefix((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytsplit_head_tailËscCstjj|ƒ\}}|S(N(RŸR R±(R R³R´((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytget_headØstObjectRepositorycBsŒeZd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Z	dd„Zdd	„Zd
„Z
d„Zd„Zd
„ZRS(cKs
||_dS(N(troot(tselfR¹R©((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt__init__Þs	cCs>|jdƒr|d}ntjjt|ƒ}|j|ƒS(NR°i(t
startswithRŸR R²t_SEGMENT_PREFIXt
_full_path(RºtpartialR ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt_full_segment_pathâs
cCs8|jdƒr|d}ntjj|j|ƒ}|S(NR°i(R¼RŸR R²R¹(RºR¿R ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR¾és
cCsdS(N((RºR‘tflags((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_openïscCsdS(N((RºR‘tofftbuftfh((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt
object_uploadòscCsdS(N((RºR‘toffsetRÅ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_downloadõscCsdS(N((RºR‘((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt
object_deleteøscCsdS(N((RºR‘RÅ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_closeûscCsdS(N((RºR‘tlengthRÅ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_truncateþscCsdS(N((RºR‘RÅ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_getattrscCsdS(N((RºR RÅ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_readdirscCsdS(N((RºR tmode((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt
object_accessscCsdS(N((RºR ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt
object_unlink
scCsdS(N((RºR ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt
object_statfs
sN(t__name__t
__module__R»RÀR¾RÂRÆRÈRÉRÊtNoneRÌRÍRÎRÐRÑRÒ(((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR¸Ýs											tBackendRepositorycBsºeZd„Zdefd„ƒYZdd-d„ƒYZd„Zd„Zd„Zd„Z	d	„Z
id
„Zd„Zd„Z
d
„Zd„Zd„Zd„Zd„Zd„Zed„ƒZd„Zd.d„Zd„Zd„Zd„Zd„Zd.d„Zd„Zd„Zd„Z d„Z!d„Z"d „Z#d!„Z$e%d"„Z&d#„Z'e%d$„Z(d%„Z)d&„Z*d'„Z+d(„Z,d)„Z-d*„Z.d.d+„Z/d,„Z0RS(/cKs¤tt|ƒj||ttƒj|_ttƒj|_i|_	t
jtƒ|_
i|_tjƒ|_i|_i|_i|_|jdtƒ|_dS(Ni(tsuperRÖR»Rt	FUSE_USERtpw_uidRhtpw_gidtgroup_idtmanifestRt	S3BackendRt_BackendRepository__backendt!_BackendRepository__manifest_lockt	threadingtLockt#_BackendRepository__open_close_lockt_BackendRepository__in_opent_BackendRepository__worker_poolt_BackendRepository__pending_iostBackendWorkerPoolt,_BackendRepository__object_open_backend_pool(RºR¹R©((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR»s					t
BackendWorkercBs2eZdZd„Zd„Zd„Zd„ZRS(sU A thread used to asyncronously perform backend jobs placed in the job_queue
        cCsNtj|ƒtj|ƒ|_||_tjƒ|_t	|_
|jƒdS(N(RR»RRÝt_BackendWorker__backendt_BackendWorker__job_queueRàtEventt_stop_eventRMtdaemontstart(Rºt	job_queueR((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR»4s
		cCs|jjƒdS(N(Rìtset(Rº((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytstop>scCs
|jjƒS(N(Rìtis_set(Rº((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytstoppedAscCs±tjdtjƒjƒx|jƒs¬yJ|jjtdƒ\}}}z||j	||ŽWd|jj
ƒXWqtk
r‰qqtk
r¨}tj
|ƒqXqWdS(sO Start up the worker and block until there is an item in the queue
            sStarting worker thread[%x].iN(RžR]Ràtcurrent_threadtidentRóRêtgetRMRét	task_doneRt	Exceptiont	exception(RºR«R¨tkargste((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytrunDs
(RÓRÔt__doc__R»RñRóRü(((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRè0s
	
		RæcBs;eZdZd„Zd„Zd„Zd„Zd„ZRS(sU Pool of backend worker threads that consume selected tasks from a job queue
        cCsUttjƒ|_g|_x3t|ƒD]%}|jjtj|j|ƒƒq(WdS(N(	RRšR8RïtworkerstrangetappendRÖRè(Rºtnum_threadsRt_((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR»]s
		cCs@x|jD]}|jƒq
Wx|jD]}|jƒq(WdS(N(RþRñR²(Rºtt((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt__del__escOs|jj|||fƒdS(s+ Add a job to the worker queue
            N(Rïtput(RºR«R¨Rú((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytadd_joblscCs%x|D]}|j||ƒqWdS(s4 Add a list of jobs to the worker queue
            N(R(RºR«t	args_listR¨((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytmapqs
cCs|jjƒdS(s> Wait for completion of all the jobs in the queue
            N(RïR²(Rº((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytwait_completionws(RÓRÔRýR»RRRR	(((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRæYs				cCs}tjj|ƒ\}}d}xR|dkrr|dkrQtjj||ƒ}n|}tjj|ƒ\}}q!W||fS(NRAR°(RAR°(RŸR R±R²(RºR R³R´Rµ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR¶|scCstjj|ƒ\}}|S(N(RŸR R±(RºR R³R´((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt	_get_headˆscCs>|jdƒr|d}ntjjt|ƒ}|j|ƒS(NR°i(R¼RŸR R²R½t
_get_cache(RºR¿R ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt_get_segment_cacheŒs
cCs8|jdƒr|d}ntjj|j|ƒ}|S(NR°i(R¼RŸR R²R¹(RºR¿R ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR’s
cCsM|j|ƒ\}}tjƒ}||d<t|ƒ}|jj|ƒ}|S(NR‘(R¶RtcopyR
RÞtget_object_manifest(RºR‘t	containerRµt_optsRÜ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt_read_object_manifest˜s
c
CsŒ|j|ƒ\}}i}d|d<tjƒ}||d<x(|jƒD]\}}	|	|d|<qHWt|ƒ}|jj|||ƒdS(NR™sx-static-large-objectR‘sx-object-meta-(R¶RR
titemsR
RÞtupload_object_manifest(
RºR‘tobject_manifesttmetadataRRµtput_headersRR‚tvalue((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt_write_object_manifest s

	
cCsYtjd|ƒtjƒ}t|ƒ}t|jdƒdg}|jj||ƒdS(Ns	mkdir, %sR°s	-segments(	RžRRR
R
R½tlstripRÞtmkdir_object(RºR‘RR¨((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt_create_segments_folder±s
c
Cs|j|ƒ\}}tjƒ}|dkr6g}n	|g}d|d<t|d<t|d<t|d<d|d<t|ƒ}|dkr£||d<|j|ƒnd}|jj||ƒ}i}xR|ddj	ƒD]<\}}	d	|kr|	||j
d	ƒd
<qÙ|	||<qÙW|S(NRAt	delimiterthumanttotalstlongRµtheaderstMetadatasx-object-meta-i(R¶RR
RÕRGR
RRÞtstat_objectRR±(
RºR‘RRµRR¨tstRR‚R((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt_get_object_metadata¹s,		





!cCsÀ|j|ƒ\}}|j|ƒ}|tddƒ@tjk}|jD|jj|tj	ƒƒ|j
j|dƒ|j
|cd7<WdQX|j||jj|iƒ|jj|iƒ||j
krm|tddƒ@tjks|tj@tjks|tj@tjkrµy|j|ƒ}Wn>tk
rmtjd|ƒtjdƒ|j|ƒ}nXiid6|j
|<xx|D]p}|djd	ƒd}	|	jd
ƒd}	t|	dƒ}
|jddƒ|d<t|d
<||j
||
<q‰W|j|ƒ}|j
|j|ƒy1|j|j
|dƒ}tj|dtƒWntk
rdnXtjtjj|ƒdtƒt |dƒ}
|
j!t"j#|ƒƒWdQXqmtjtjj|ƒdtƒ|tj$@tj$krBy|j%|ƒWntk
rnXyt |dƒ}
WdQXWqBtk
r>qBXny*|j&|dƒ}tj|dtƒWntk
rnXtj ||ƒ}ze|j'|ƒ|j(|j||<iid6|j
|<itd6|j
|d|<|j)||ƒWd|j|j*|dƒ|j
|dj*|dƒtj,|ƒXyt |dƒ}
WdQXWqmtk
riqmXny$ddl-m.}||ƒj/ƒWntk
r¤nXtj ||ƒ}zØyXi|d6|j
|d|<|j0t1j2t3ƒ|j||<t4ƒ|j||<|SWnytk
r}tj5|ƒ|j|j*|dƒ|j
|dj*|dƒ|j|j*|dƒtj,|ƒ‚nXWd|j|j
|cd8<WdQXXWdQXdS(Ntffiiis+Manifest for %s not found. Trying in 5 secsitopen_handlestnames
-segments/t.t	versionIdRAtmodifiedssegments-dirtexist_oktws	-segmentstreadonlyiÿÿÿÿ(tPath(6R¶R¾tintRŸtO_RDONLYRâRßt
setdefaultRàtRLockRãRäRåRÜtO_RDWRtO_APPENDRRøRžR]ttimetsleepR±RöRGR$tupdatetmakedirsRMR¦R tdirnametopentwritetjsontdumpstO_WRONLYRÑRÀRRçt
_object_closetpopRÕtclosetpathlibR.ttouchRæRšR9RRðRù(RºR‘RÁRRµt	full_pathR-RÜtsegtoffstrRÇRtsegment_dirtfRÅR.tex((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÂõsÄ
	
















cCsSy,tjƒ}t|ƒ}|j||ƒWn tk
rN}tj|ƒnXdS(sý 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(RR
R
tdelete_object_listRøRžRù(Rºtbackendtsegment_listRRI((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt__purge_old_segments_task‰scCs |j||jƒ|j|xyP|j|jddt|dƒ}|j|ƒ\}}g}d}|j|d|dsnd}d}	d}
x³trL||j|kr·Pny%|j|j||d|ƒ}Wn?t	k
rt
jdƒ|j|j||d|ƒ}nX|j||d	rŸt|ƒ}t
|jtjƒ}
|ji|j||dd
6|jd6|jd6|
d
6|jd6ƒn‰|j||d
}
|ji|j||dd
6|j||jddƒd6|j||dd6|
d
6|j||dd6ƒ|tj7}|d7}|	|
7}	qšW|j||di|d6t|ƒd6t|	ƒd6ƒd}xátrj|rj|j|||ƒ}
t|
ƒdkrÄPnt|
ƒ}
y|j||d}Wn
d}nX|jdƒ}tt|
ƒt|gƒƒ}t|ƒdkrZ|j||j|j|ƒn|tj7}qWndSWn tk
r•}t j!|ƒnXWdQXdS(sé 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.
        ssegments-dirR°s	-segmentsiR&R-R'iR*R R)tetagt
size_bytestcontent_typeRAthashiRs
segment-counts
total-sizeN("RäR	RßRÜRöR½R¶RMRÍR¦R5R6R
tmintst_sizeRšR;Rt
version_idRNRPRtstrRLtlentsortedtstriptlistRðRt+_BackendRepository__purge_old_segments_taskRøRžRù(RºR‘RÅtsegments_dirRRµRtsegmentsRÇt
total_sizetsegment_sizeR#tstattobjectstpt
purge_listRI((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR?˜s¤

	












cCsŽ|j||ƒ|j|k|j||ƒ|j|j|ƒ|j|j|ƒ|j|dj|ƒytj|ƒWntk
r’nXt	|j|dƒdkr?yh|jj|dƒ}|dksÚt‚|jj|dƒ}|dkst‚tj|j
|ƒƒWntk
r+nX|jj|ƒn|j:|j|s~||jkr~|jj|dƒq~nWdQXWdQXdS(NR&i(R?RßRäR@RåRÜRŸRAR¦RVRÕRœtremoveR¾RâRã(RºR‘RÅtohtpios((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÊs0



c

CsÈ|j|µyU||j|krW|j||dtkrW|j||d}nL|j||ƒ}|j|jddt|dƒ}tjj||ƒ}t	j
ƒ}d|j|k|d<|j|ƒ\}	}
t|ƒ|d<|
j
dƒ|d	<t|ƒ}|	||dg}|j||j|ƒ|j||j|j||||||ƒWnXtk
r½}tj|ƒ||j||ksŸt‚|j||j|ƒ‚nXWdQXdS(
NR*R'ssegments-dirR°s	-segmentst0t
path_validR^R‘(RßRÜRMt,_BackendRepository__next_segname_from_offsetRöR½RŸR R²RR
R¶RVtrstripR
RåtaddRäRt&_BackendRepository__object_upload_taskRøRžRùRœRc(
RºR‘RÇRÄRÅtseg_fullnametsegnameR[RRtobjtargs1RI((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÆ)s8		
	
c	CsÅtjd||tjƒjfƒ|d}|d}	|d }|j|"||j||kslt‚WdQXy%t|_	|j
|||	|ƒ}
Wnltk
r}tj|ƒ|j|:||j||ksát‚|j||j
|ƒWdQX‚nX|j|¬||j|kr;i|j||<n||j||d<t|j||d<|
jddƒ|j||d	<||j||ks£t‚|j||j
|ƒWdQXdS(
sP Method run by a worker in the thread pool to upload an object segment.
        s6Object [%s] segment [%s] upload running in thread[%x].iiNR'R*t	VersionIdRAR)(RžR]RàRôRõRßRåRœRMRgt
put_objectRøRùRcRÜRö(RºRKRoRR‘RÇRlRÅRÄtbuf_lentrespRI((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt__object_upload_taskPs2


#	
!cCsKxžtr tjdƒ|j|x||j||krAwn||j|krtd|tt|ƒtdƒfƒ‚n|j||d}PWdQXqW|j	|j
dƒƒ\}}i}|j||jddƒ|d<t|ƒ}||g}y#|j
j||ƒ}	t|	ƒSWn#tk
rF}
tj|
ƒ‚nXdS(	Ngš™™™™™¹?sobject %s not found iR'R°R)RART(RMR5R6RßRåRÜRøtSEGMENT_FORMATR/R¶RiRöR
RÞt
get_objectt	bytearrayRžRù(RºR‘RÇRÅRlRRnRRoRÄRI((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÈus.	
$
c
CsÉ|jj|tjƒƒ|j||j|ƒ\}}tjƒ}t|ƒ}|g}|dkr…|dkr…|j|ƒny|j	j
||ƒWn tk
r¾}tj
|ƒnXWdQXdS(NRAR°(RßR1RàR2R¶RR
R
RRÞt
delete_objectRøRžRù(RºR‘RRnRRoRI((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRɓs		
cCs3|r
dS|j|tjƒ}|j||ƒdS(N(RÂRŸR>RÊ(RºR‘RËRÅ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR̦scCsštjƒ}d|d<t|d<t|d<t|d<tjj|dt|ƒƒ|d<g}|dkrrg}n	|g}t|ƒ}|j	j
||ƒS(NRRRRs%016xRµRA(RR
RÕRGRŸR R²R/R
RÞt
list_segments(RºRR[RÇRR¨((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRL¬s



#		c	Cs
|j|ƒ\}}|j|jddƒ}|r}|jdtƒr_|j|ƒ\}}n|j|ƒ\}}|}n
|d}|j|||ƒ}t|ƒdkrÈtt	|ƒt	dƒfStt	|ƒt	t
|ƒdj|ƒdjdƒddƒdfS(	Nssegments-dirR°s	-segmentsiiÿÿÿÿiR(i(R¶RÜRöRÕR¼R½RLRVRuR/RWR±(	RºR RÇRRµR[tcRatfiles((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt__next_segname_from_offset¾s	
	0c
	Cs@|j|Ä|j|ƒ\}}|jj|dƒrq||j|krq|j||d}|jdƒdS|j|jddƒ}|r®|j|ƒ\}}|}n
|d}|j|||ƒ}	WdQXt|	ƒdkrÿtt	|ƒt	dƒfStt	|ƒt	t
|	ƒdj|ƒdjdƒdd	ƒfS(
NR's
-segments/issegments-dirs	-segmentsiiÿÿÿÿR(i(RßR¶RÜRöRÕR±RLRVRuR/RW(
RºR RÇRRµRER[RzRaR{((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytcurr_segname_from_offsetÓs (	
	c
s’tjj|ƒrŽyUtj|ƒ‰t‡fd†dDƒƒ}d
|d<t|dd
ƒ|d<|SWn tk
r‰}tj|ƒnXd
Sd
S(së 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(tgetattr(t.0R‚(R#(s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pys	<genexpr>ÿstst_atimetst_ctimetst_gidtst_modetst_mtimetst_nlinkRStst_uidit
st_blksizet	st_blocksN(sst_atimesst_ctimesst_gidsst_modesst_mtimesst_nlinksst_sizesst_uid(
RŸR tisdirtlstattdictR/RøRžRùRÕ(Rºtobject_cache_patht	stat_infoRû((R#s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt_stat_cacheìs(


c
s=|j|ƒ}|j|ƒ\}}tjƒ}|dkrEg}n	|g}d|d<t|d<t|d<t|d<d|d<t|ƒ}i}|dkr¸||d<|j|ƒnd}yÃ|jj	||ƒ‰|j
|d<|j|d<ˆd	jd
dƒ|d<ˆd	jddƒ|d
<ˆd	jddƒ|d<t
ˆdƒ|d<t
ˆdƒ|d<t
ˆdƒ|d<d|d<d|d<|dk	r³d|kr³d|d<nt
ˆdƒ|d<|ddkrã|dks+|ddkrÿ|dks+|ddkr|dks+ˆdtkr€d|d<d|d<d |d<|j|ƒ}	tjj|	ƒs€tj|	d!ƒq€nWn“tk
rÙytj|ƒWntk
rµnXtj|d"tƒtj|ƒn>tk
r}
tj|ƒ‰t‡fd#†d'Dƒƒ}nXd$|d%<t
|dd$ƒ|d&<|S((NRARRRRRµR‚R†R tETagRNRpRTtContentTypeRPt	timestampR€RR„iR…iíRƒtauthorized_keyi€tsizeRSit	directoryiiiýAiét
ignore_errorsc3s$|]}|tˆ|ƒfVqdS(N(R~(RR‚(R#(s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pys	<genexpr>VsiR‡Rˆ(sst_atimesst_ctimesst_gidsst_modesst_mtimesst_nlinksst_sizesst_uid(R¾R¶RR
RÕRGR
RRÞR"RÛRhRöR/RMRRŸR R¡tmkdirR	RcRøtshutiltrmtreeRŠR‹(RºR‘RÅRDRRµRR¨Rtcontainer_pathRI((R#s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÍs€		
















cCs-ytj|dƒ}Wn#tk
r;}tj|ƒ‚nXd}x™||j|krÝy&|jj|j||d|ƒWn@tk
rÀt	j
dƒ|jj|j||d|ƒnX||j||d7}qEWy|jj||ƒWn1tk
r(t	j
dƒ|jj||ƒnXdS(Ns%Y-%m-%dT%H:%M:%SiR'iRO(RtstrptimeRøRžRùRÜRÞtput_object_segment_retentionR¦R5R6tput_manifest_retention(RºR‘tretainuntiltdtRIRÇ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt_set_object_retentionjs(
	

	

c	CsC|j|tjƒ}zyì|j|Ùtj|j|ƒ}d}xF||j|kr|j||d}|j|dƒ||7}qHW|jddƒ|dkrÆ|j	||j
dƒƒn&|j
dƒ||<|jj||ƒ||j||<WdQXWn#t
k
r)}tj|ƒ‚nXWd|j||ƒXdS(NiROR&Rtutf8sutf-8(RÂRŸR0RßR
tdeepcopyRÜR@RÕRŸtdecodeRÞtupdate_object_attributesRøRžRùRÊ(	RºR‘R'RRÅtattrsRÇR“RI((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_setxattrˆs,		

cCs|j|tjƒ}zñyÇ|j|´tj|j|ƒ}d}xF||j|kr|j||d}|j|dƒ||7}qHW|j|dƒ|jddƒ|j	j
||ƒ|j|j|dƒWdQXWn#tk
r}tj
|ƒ‚nXWd|j||ƒXdS(NiROR&(RÂRŸR0RßR
R¡RÜR@RÕRÞR£RøRžRùRÊ(RºR‘R'RÅR¤RÇR“RI((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_removexattr¡s&	
!
cCs¢|j|tjƒ}zuyK|j|8tj|j|ƒ}|jdƒ|jƒ}|SWdQXWn#t	k
rˆ}t
j|ƒ‚nXWd|j||ƒXdS(NR&(
RÂRŸR0RßR
R¡RÜR@tkeysRøRžRùRÊ(RºR‘RÅR¤R§RI((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_listxattr¶s

cCs‡|j|tjƒ}zZy0|j|t|j||dƒSWdQXWn#tk
rm}tj|ƒ‚nXWd|j	||ƒXdS(Nsutf-8(
RÂRŸR0RßtbytesRÜRøRžRùRÊ(RºR‘R'RÅRI((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_getxattrÅs"
ccs€g}|jdƒd}g}||jj|ƒ7}x(|D] }|j|jdƒdƒq<Wxt|ƒD]}|VqmWdS(NR°iÿÿÿÿ(RiRÞtlist_objectsRR±RY(RºR‘RÅtlistingtdir_pathtdirentstlsttr((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÎÐs
cCsdS(N((RºR‘RÏ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÐÛscCs||td<tjƒ}t|ƒ}|sAyó|j|ƒ}|j|ƒ}g}x|D]}|j|dƒqVW|jj||ƒ|jdƒ}|dk	r|g}	|jj
|	|ƒytj|j
|ƒƒWntk
rènXytj|j
|ƒƒWqtk
rqXnWqAtk
r=}
tj|
ƒqAXny|jj|ƒWn tk
rw}
tj|
ƒnXdS(NRŠR'ssegments-dir(RR
R
RR$RRÞRJRöRÕtrmdir_objectRŸtrmdirRR¦RcRøRžRùtdelete_object_manifest(RºR‘RŠRtobj_manifesttobj_metadataRLtmanR[R¨RI((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÑÞs>

	



c	Csütjƒ}t|ƒ}g}y|jj||ƒ}Wn/tk
rh}tj|ƒtt	j
ƒ‚nXd|dkrªt|dƒ}t|dƒt|dƒ}nd}t|dƒ}i}||d<||d<||d<d	|d
<d	|d<|S(Nsx-account-meta-quota-bytesR sx-account-bytes-usediÿÿÿÿR“tf_blockstf_bfreetf_bavailitf_favailtf_frsize(RR
R
RÞR"RøRžRùRterrnotENOENTR/(	RºR‘RRotstvRIR·R¹Rž((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÒs*





c
Csütjd|ƒ|j|ƒ\}}tjƒ}t|ƒ}||g}y|jj||ƒWn!tk
r„}tj	|ƒdSX|j
|ƒ}	|tkrÁ|j
tj
j||ƒƒ}	nytj|	|ƒWn tk
r÷}tj	|ƒnXdS(Ns	mkdir, %si(RžRR¶RR
R
RÞRRøRùRRGRŸR R²R8(
RºR RÏtistRRnRR¨RIt
cache_path((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR– s$
!cCsO|j|ƒ\}}tjƒ}d|d<t|ƒ}|jdƒd}g}y ||jj|ddƒ7}Wn tk
r’}t	j
|ƒnXt|ƒdkr·tt
jƒ‚ny#|jj|jdƒg|ƒWn tk
rü}t	j
|ƒnXtjjt|jdƒƒ}y ||jj|ddƒ7}Wn tk
r]}t	j
|ƒnXt|ƒdkr¹y#|jj|jdƒg|ƒWq¹tk
rµ}t	j
|ƒq¹Xny5|j|ƒ}	tjj|	ƒrítj|	ƒnWntk
rnXy5|j|ƒ}
tjj|
ƒr6tj|
ƒnWntk
rJnXdS(NRµR°t	max_itemsii(R¶RR
RÕR
RiRÞR«RøRžRùRVRR¼t	ENOTEMPTYR±RŸR R²R½RRR‰R—R˜R¦R(RºR‘RRnRR t	dir_itemsRItseg_pathtsegment_cache_pathRÀ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR²@sR
 #
 #


cCsptjd|ƒyG|j|ƒ\}}|jtjj||ƒƒ}tj||ƒSWntk
rknXdS(Ns	chmod, %s(	RžRR¶RRŸR R²tchmodR¦(RºR RÏRRµRÀ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÆws
cCsstjd|ƒyJ|j|ƒ\}}|jtjj||ƒƒ}tj|||ƒSWntk
rnnXdS(Ns	chown, %s(	RžRR¶RRŸR R²tchownR¦(RºR tuidtgidRRµRÀ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÇ€s
cCstdƒ‚dS(NsNot Applicable(Rø(RºR'ttarget((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytsymlink‰sc
CsÈ|jj|dƒdks!t‚|jj|dƒrntjdƒ|jj|dƒrntd|ƒ‚qnntjd||fƒ|d}y|j	|dt
ƒWn tk
rÈ}tj|ƒnXye|j|ƒ}|j|ƒ}|jd|dƒ|jd|dƒkr-|j	|dt
ƒdSWntk
rAnXt
}yìy|j|ƒ}Wntk
rqnÂX|j|ƒ}|jd|dƒ}	g}
xZ|D]R}|
ji|d	d
6|dd6|d
d
6|jddƒd6|dd6ƒq¤W|j||
di|	d6|dd6|dd6ƒt
}Wn#tk
rY}tj|ƒ‚nXz#y|j|ƒ}|j|ƒ}|jd|dƒ}	g}xZ|D]R}|ji|d	d
6|dd6|d
d
6|jddƒd6|dd6ƒq¡W|j||di|	d6|dd6|dd6ƒy|j	|dt
ƒWn tk
rc}tj|ƒnXWntk
r{‚nXWd|rÃy|j	|dt
ƒWqÃtk
r¿}tj|ƒqÃXnXdS(Nis%s in use. Try againsrename, %s -> %st~RŠssegments-dirs	-segmentsiR'R RQRNROR)RARPRs
segment-counts
total-size(RÜRöRÕRœR5R6RøRžRRÑRMRùR$RGRRRR¦(
Rºtoldtnewtnewbak_nameRItnew_metadatatold_metadatatnewfile_existstnew_manifestR[tnewbak_manifestR¶told_manifest((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytrenameŒsœ!




	





cCstjd|ƒt|ƒ\}}|jtjj||ƒƒ}t|ƒ\}}|jtjj||ƒƒ}tj||ƒS(Nslink, %s(RžRR¶RRŸR R²tlink(RºRÊR'RRµtcache_path_targettcache_path_name((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR×þscCs_tjd|ƒt|ƒ\}}|j|ƒ}ytj||ƒWntk
rZdSXdS(Nsutimens, %si(RžRR¶RRŸtutimeR¦(RºR ttimesRRµRÀ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytutimenss
cCsdS(Ni((RºR ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytdestroys(N(1RÓRÔR»RRèRæR¶R
RRRRRR$RÂRZR?RÊRÆRkR¯RÈRÉRÕRÌRLRhR}RŽRÍRŸR¥R¦R¨RªRÎRÐRGRÑRÒR–R²RÆRÇRËRÖR×RÜRÝ(((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÖsV	)#								<	”		s		'	%					*T							#	 	7						r	t	FuseCachecBszeZd„Zd„Zed„Zd„Zdd„Zd„Z	d„Z
d„Zd„Zd	„Z
d
„Zd„ZRS(
cCs.||_||_i|_tjƒ|_ttƒj|_	ttƒj
|_tj
j|jƒsÁyDtj|jƒtj|jt|j	ƒdt|jƒgƒWq*tk
r½‚q*Xnitj|jƒ}|j|j	ks÷|j|jkr*tjtjt|j	ƒdt|jƒgƒndS(Nt:(R¹t
repositorytlrucacheRàRát
lrucache_lockRRØRÙRhRÚRÛRŸR R‰R[R–RÇRUR¦R_R†R‚RšR7(RºR¹RàR((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR»-s$			(

c
Cs¬|jj||ƒ}|jˆ|jj|iƒ|j|j|dƒ}|dks]t‚|j|j|itdt	j
ƒd6tjƒd6|d6t
d6ƒWdQX|S(NtmaxsizeRátlrulockR‘twrites_before_update_manifest(RàRÂRâRáR1R@RÕRœRRšR<RàRátNUMBER_UPLOADS_BEFORE_FLUSH(RºR‘RÁRÅtitem((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÂCs

c	Csãtjd|tjƒjfƒ|j||}|d|ksGt‚|d}|dfyMxFtr§|jƒ\}}|drb|j	j
|||d|ƒqbqbWWntk
r¼nXWdQX|rß|j	j||ƒndS(NsCache object_flush [%s] [%x]R‘RáRäR*tdata(
RžRRàRôRõRáRœRMtpopitemRàRÆtKeyErrorR?(RºR‘RÅtupdate_manifestRçtcacheRÃ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_flushSs"
	
	

cCstjd|tjƒjfƒ|j||dtƒ|jE|j|j	|dƒt|j|ƒs€|jj	|dƒnWdQX|jj
||ƒdS(NsCache object_close [%s] [%x]Rë(RžRRàRôRõRíRGRâRáR@RÕRVRàRÊ(RºR‘RÅ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÊjs
cCs|jj|||ƒdS(N(RàRÌ(RºR‘RËRÅ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÌwsccsmxf|dkrh|tjtj}||}t|tj|ƒ}|||fV||7}||8}qWdS(Ni(RšR;RR(RºRÇRËt
seg_offsettbasetseg_len((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt_walk_segmentszs

c
Csë|j||d|ks!t‚tƒ}|j||d x˜|j||ƒD]„\}}}y!|j||d|d}	Wn<tk
rÁy|j||d}
t|
ƒtjkrZ|
jƒ\}}|drZ|j	j
|||d|ƒ|j||dcd8<|j||dsW|j	j||ƒt|j||d<qWqZn|j	j
|||ƒ}	itd6|	d6|j||d|<WqÂtk
r½}
tj|
ƒdSXnX||	|||!7}qSWWdQXt|ƒS(	NR‘RäRáRèR*Råii(RáRœRwRñR¦RVRšR<RéRàRÆR?RæRÈRGRøRžRùR©(RºR‘RËRÇRÅt
output_buft	segoffsetRïRðtsegdataRìRÃRçRI((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_read…sD!		


		
	!
	c
Csotjd|tjƒjfƒt|ƒ}|j||d|ksMt‚d}|j||dûxó|j||ƒD]ß\}}}	|j||d}
||
kråt|
ƒt	j
kr[|
jƒ\}}|dr[|jj
|||d|ƒ|j||dcd	8<|j||dsX|jj||ƒt|j||d<qXq[nyO|jj|||ƒ}
|
dkr‘td
ƒ‚nitd6|
d6|
|<Wqótk
rátd	ƒ}
itd6|
d6|
|<qóXn|
|d}
t|
ƒ|kr'|
jd||	t|
ƒƒn||||	!|
|||	+t|
|d<||	7}q|WWdQXt|ƒS(NsCache object_write [%s] [%x]R‘iRäRáR*RèRåisObject not foundt(RžRRàRôRõRVRáRœRñRšR<RéRàRÆR?RæRÈRÕRøRGR¦RwRMtextend(RºR‘RÄRÇRÅRËtbufptrRóRïRðRìRÃRçRô((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_writeÀsN!	
		
"cCstj|jj|ƒ|ƒS(N(RŸR–RàR¾(RºR RÏ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR–scCs|jj|ƒ}tj|ƒS(N(RàR¾RŸR²(RºR RD((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR²scCs"|jj|ƒ}tj||ƒS(N(RàR¾RŸRÆ(RºR RÏRD((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÆscCs%|jj|ƒ}tj|||ƒS(N(RàR¾RŸRÇ(RºR RÈRÉRD((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÇsN(RÓRÔR»RÂRMRíRÊRÕRÌRñRõRùR–R²RÆRÇ(((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÞ,s			
		;	T			tTrilioVaultcBseZdd„Zd„Zd„Zd„Zedd„ƒZd„Z	d„Z
d„Zd„Zd	„Z
d
„Zd„Zd„Zd
„Zd„Zd„Zd„Zd„Zd„Zdd„Zd„Zdd„Zd„Zd„Zdd„Zd„Zd„Zd„ZRS(cCs7||_|pt|ƒ|_t||jƒ|_dS(N(R¹RÖRàRÞRì(RºR¹Rà((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR»%s	cCs|jj||ƒdS(N(RàRÐ(RºR RÏ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytaccess-scCs|jj||ƒS(N(RàRÆ(RºR RÏ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÆ0scCs|jj|||ƒS(N(RàRÇ(RºR RÈRÉ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÇ3scCs|jj||ƒS(N(RàRÍ(RºR RÅ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR~6scCs|jj|||ƒS(N(RàR¥(RºR R'RR“((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytsetxattr:scCs>|jdƒs|jdƒr+tddƒS|jj||ƒS(NtsecuritytsystemRAsutf-8(R¼R©RàRª(RºR R'((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytgetxattr=s
cCs|jj|ƒS(N(RàR¨(RºR ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt	listxattrBscCs|jj||ƒS(N(RàR¦(RºR R'((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytremovexattrEsccsBddg}|j|jj||ƒƒx|D]}|Vq/WdS(NR(s..(R÷RàRÎ(RºR RÅR®R°((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytreaddirHs
cCsEtj|j|ƒƒ}|jdƒr=tjj||jƒS|SdS(NR°(RŸtreadlinkR¾R¼R trelpathR¹(RºR tpathname((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRNscCstj|jj|ƒ||ƒS(N(RŸtmknodRàR¾(RºR RÏtdev((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR`scCs|jj|ƒS(N(RàR²(RºR ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR²cscCs|jj||ƒS(N(RàR–(RºR RÏ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR–fscCs|jj|ƒS(N(RàRÒ(RºR ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytstatfsiscCs|jj|ƒS(N(RàRÑ(RºR ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytunlinklscCs|jj||ƒS(N(RàRË(RºR'RÊ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRËoscCs|jj||ƒS(N(RàRÖ(RºRÍRÎ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÖrscCs|jj||ƒS(N(RàR×(RºRÊR'((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR×uscCs|jj||ƒS(N(RàRÜ(RºR RÛ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÜxscCs|jj||ƒS(N(RìRÂ(RºR RÏ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR:~scCs|j|tjƒS(N(R:RŸtO_CREAT(RºR RÏtfi((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytcreatescCs|jj||||ƒ}|S(N(RìRõ(RºR RËRÇRÅRÄ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytread„scCs|jj||||ƒS(N(RìRù(RºR RÄRÇRÅ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR;ˆscCs|jj||d|ƒdS(NRÅ(RìRÌ(RºR RËRÅ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyttruncate‹scCs|jj||ƒdS(N(RìRí(RºR RÅ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytflushŽscCs|jj||ƒdS(N(RìRÊ(RºR RÅ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytrelease‘scCs!tjd|ƒ|jj|ƒS(Nsdestroy, %s(RžRRàRÝ(RºR ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRݘsN( RÓRÔRÕR»RûRÆRÇR¯R~RüRÿRRRRRR²R–RR	RËRÖR×RÜR:RR
R;RRRRÝ(((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRú$s:																						s/etc/fuse.confcCsd}tjj|ƒrft|dƒ:}x0|D](}d|kr1d|kr1d}Pq1q1WWdQXn|dkrd}tjj|ƒr¹t|dƒ}|jƒdd}WdQXntd	d
ƒ}|j|ƒWdQXtjd	|ƒtjd	ƒtj	ddgƒndS(
NiR°tuser_allow_othert#isuser_allow_other 
trts
s/tmp/fuse.conf.tmptwts/etc/fuse.confs	root:root(
RŸR R¡R:R
R;R[R
RcRÇ(t	conf_filetfoundRHtlinetstoutf((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt	fuse_confs"

c	CsÞyytj|dgƒWntk
r-nXtjj|ƒr¯tj|ƒ}ttƒj	}tt
ƒj}|j|koˆ|j
|kstj|dtdt
gƒqn\tj|dgƒtj|dgƒtj|tdt
gƒtj|tdt
gƒWn tk
r.}tj|ƒnXgtjtjƒD]-}tjtjjtj|ƒdtƒ^qBt|dt|ƒƒ}t}tjjƒdkr¯t}nt||d|d	td
tdtdtƒdS(
Ns-ls-RRßs-pR•RàR™t	nothreadst
foregroundtnonemptyt
big_writestallow_other( R[tumountR¦RŸR R‰R_RRØRÙt
FUSE_GROUPRÚR†R‚RÇR–RøRžRùtlistdirRšR7R—R˜R²RMRúRÖRNR›RGR(	t
mountpointt	cacheroottmountpoint_statRhRÛRItxttvaultplugintdisable_fuse_threads((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytmain±sB
$A	cCsftƒtjtjkst‚tƒtjtƒ}|j	tƒ|j
tƒttjtj
ƒdS(s$Main routine that drives fuse mount.N(R¢RšR8R9RœRRRÝRtvalidate_s3_clienttset_retention_modeR)R6R7(t	s3backend((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRüãs

t__main__(lRýRŸtgrptsysR¼R5tgetpassRR
R<R—R­RàRtpwdRRRtImportErrortqueuet
cachetoolsRtfuseRRRR¦tfusepytbotocore.exceptionsR	ts3fuse.bunch_p3R
toslo_configRtoslo.configtoslo_logRR£ts3fuse.utilsR
ts3fuseRRt_DEFAULT_LOG_DATE_FORMATR½tQUEUE_DEPTHtWORKER_POOL_SIZEtBoolOptRGtcommon_cli_optstStrOptRÕtlogging_cli_optsRMtIntOpttgeneric_log_optstListOpttlog_optst
vault_optsRšt
register_optstregister_cli_optsRUtenvirontflagtargvtlist_all_sectionstsectionsts3fuse.privsepR[R\tsetupR4R›t	getLoggerRžRStloggertsetLeveltDEBUGtINFOtWARNR¥RöRR¢tCACHE_LOW_WATERMARKtCACHE_HIGH_WATERMARKtgetuserRØtgetgrgidtgetgidtgr_nameR!RuRæR¯R¶R·tobjectR¸RÖRÞRúRR)RüRÓ(((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt<module>sv
 
 
			







	"		
	4ÿÿÿÿÿ øy	2