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    
s3-fuse-plugin / usr / lib / python2.7 / dist-packages / s3fuse / s3vaultfuse.pyc
Size: Mime:
ó
Z¢`c,@s
dZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddl
mZddl
mZddl
mZyddlmZmZWn'ek
rñddlmZmZnXddlmZddlmZy dd	lmZmZmZWn#dd	lmZmZmZnXdd
lTddlZyddlmZWn!ek
r¥ddl mZnXddl!m"Z#dd
l$m%Z%ddl$m&Z&ddl'm(Z(dZ)dZ*dZ+dZ,ej-dddde.ddƒej-dddde.ddƒgZ/ej0ddddd ƒej0d!dddd"ƒej0d#dddd$ƒej0d%de1dd&dd'ƒej0d(de)dd)dd*ƒej0d+ddd,d-dd.ƒej0d/d,d0dd1ƒej-d2de.dd3ƒej0d4dd5dd6ƒg	Z2ej-d7de3dd8ƒej-d9de.dd:ƒej-d;de.dd<ƒej-d=de.dd>ƒej4d?dd@ddAƒgZ5ej4dBddCddDƒej4dEddFddGƒej0dHddIddJƒej0dKddLddMƒej0dNddOddPƒej0dQddRddSƒej0dTddUddVƒej0dWddXddYƒej6dZdd[d\d]d^d_d`gddaƒej-dbde.ddcƒej-ddde.ddeƒej0dfddgddhƒej0diddgddjƒej4dkddlddmƒgZ7ej0dnddoddpƒej0dqddrƒej0dsddtddrƒej0duddvddwƒej0dxddyddzƒej0d{dd|dd}ƒej0d~dddd€ƒej0ddd‚ddƒƒej0d„dd…dd†ƒej0d‡dd…ddˆƒej0d‰ddŠdd‹ƒej0dŒddddŽƒej0dddddƒej0d‘dd’dd“ƒej0d”dd•dd–ƒej0d—dd˜dd™ƒej4dšde+dd›ƒej4dœde,ddƒej4džddŸdd ƒej0d¡dd¢dd£ƒej4d¤dd¥d¦d¦dd§ƒej4d¨dddd©ƒej0dªdd«dddd¬ƒej0d­dd®dd¯ƒej0d°dd±dd²ƒej0d³dd±dd´ƒej0dµdd±dd¶ƒej0d·dd±dd¸ƒej0d¹dd±ddºƒej0d»dd¼dd½ƒej0d¾dd±dd¿ƒej0dÀddddÁƒej0dÂddÃddăej0dÅddÆddǃej0dÈdd¼ddɃej0dÊdd¼dd˃ej0dÌddÍdd΃ej0dÏddÐddуej0dÒddÓddԃg'Z8ej9Z9e9j:e8ƒe9j;e2ƒe9j;e5ƒe9j;e7ƒe9j;e/ƒy$e<ej=dÕƒZ>e9e>gƒWne9ej?d@ƒnXe#j@ej9e9jAjBƒƒe#jCe9jAjBƒƒZDedÖd׃ZEy˜e9jFjBƒdkrÆ	eDjGjHe#jIƒnie9jFjBƒdØkrñ	eDjGjHe#jJƒn>e9jFjBƒdÙkr
eDjGjHe#jKƒneDjGjHe#jLƒWn'eMk
rY
eDjGjHe#j#jLƒnXi&e1dÚ6d@d6gdÛ6dÜdÝ6i
e1dÞ6e1dß6e1dà6e1dá6e1dâ6e1dã6e1dä6e1då6e1dæ6e1dç6e1dè6e1dé6e1dê6dë6e3dì6e1dí6d±dî6d±dï6ej=jNdðƒdñ6ej=jNdòƒdó6ej=jNdôƒdõ6d±dö6d±d÷6e1dø6e3dù6e.dú6e1dû6d±dü6d±dý6d±dþ6e1dÿ6e.dØ6dd6e1d6gd6e.d6e.d6e3d6e.d6e.d6e3d6dd	6dd
6dd6dd6e.d
6e1d6ZOe
jPƒZQd„ZRd„ZSdZTd×ZUddlVZVeVjWƒZXejYejZƒƒj[Z\dZ]ia^dZ_d„Z`d„Zad„Zbdfd„ƒYZcdedfd„ƒYZedeefd„ƒYZfdedfd„ƒYZgd•efd„ƒYZhdd „Zid!„Zjd"„Zkeld#kr
ekƒ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(tThread(tBoundedSemaphore(tmkstemp(tQueuetEmpty(tgetpwnam(tLRUCache(tFUSEtFuseOSErrort
Operations(t*(tcfg(tlog(tutils(tvaults3(tfss%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/triliovaultttmpfs_mount_pathttmpfssLLocation with respect to CONF.vault_data_directory_oldwhere tmpfs is mountedtvault_storage_nfs_exporttlocals
NFS Exporttvault_storage_nfs_optionstnolocksNFS Optionstvault_swift_auth_versiontKEYSTONE_V2s KEYSTONE_V2 KEYSTONE_V3 TEMPAUTHtvault_swift_auth_urlshttp://localhost:5000/v2.0sKeystone Authorization URLtvault_swift_tenanttadminsSwift tenanttvault_swift_usernamesSwift usernametvault_swift_passwordtpasswordsSwift passwordtvault_swift_region_namet	RegionOnesSwift Region Nametvault_swift_domain_idsSwift domain idtvault_swift_domain_nametDefaultsSwift domain nametvault_swift_container_prefixtTrilioVaultsSwift Container Prefixtvault_swift_segment_sizet33554432sDefault segment size 34MBtqueue_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_swift_url_templates,http://localhost:8080/v1/AUTH_%(project_id)ssThe URL of the Swift endpointtvault_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_ssltTruesUse SSLtvault_s3_ssl_certsUse SSL certificate bundletvault_s3_signature_versionsS3 signature version to usetvault_s3_support_empty_dirtFalses,S3 backend needs empty directory work aroundtvault_s3_read_timeoutt120s3Time in seconds to wait for a response to API callstvault_enable_threadpoolsEnable 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).tFLAGtvalueitinfotwarntsync_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_namecs"tjˆƒ‡fd†ƒ}|S(Ncstˆ||ŽSWdQXdS(N(t
manifest_lock(targstkwargs(twrapped(s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt_wrap¦s(t	functoolstwraps(R¨R©((R¨s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytsynchronized¥scCsvtjjƒdkst‚tjdks0t‚dtd<tjtd<tjtd<tjtd<tj	td<tj
td	<tjjƒd
krttd<n
t
td<tjjƒd
krÉttd<n
t
td<tjrðtjtd
d<ntjr
tjtd
d<ntjjƒdkr/t
td<nCtjjtjƒrTtjtd<ntjdtjƒdtd<dS(NR5RWs1.0RtR”R•tbucketts3_signaturets3_read_timeoutttruetsupport_empty_dirts3_sslR‚RyRvtfalsets3_ssl_certscInvalid S3 SSL cert file path: %sUsing Default path, set the value to False for insecure connectionRY(tCONFR4tlowertAssertionErrorRVtoptionsRXRZR\RaRdRbR_RcR^R]R[R`tostpathtexiststLOGRq(((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt
option_config­s4









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

(RªR«(RÄRÅ((RÄs6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytdisable_loggingÜscCs}tjj|ƒ\}}d}xR|dkrr|dkrQtjj||ƒ}n|}tjj|ƒ\}}q!W||fS(NRYt/(RYRÇ(R¹Rºtsplittjoin(Rºtheadttailtprefix((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytsplit_head_tailìscCstjj|ƒ\}}|S(N(R¹RºRÈ(RºRÊRË((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytget_headùst	tmpfsfilecBs)eZeed„Zd„Zd„ZRS(cCs||_||_dS(N(tremovetpersist_exit(tselfRÐRÑ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt__init__ÿs		cCsmtjjtjtjƒ}td|ƒ\}|_tj|ƒ|j	r\tj	|jƒnt
jƒ|jS(Ntdir(R¹RºRÉRµR7R8Rt	open_filetcloseRÐt
tmpfs_sematacquire(RÒttmpfs_mountpathtfh((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt	__enter__s	
	
cGs*|js&tjƒtj|jƒndS(N(RÑR×treleaseR¹RÐRÕ(RÒR¦((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt__exit__s	
(t__name__t
__module__RcRÓRÛRÝ(((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRÏþs		tObjectRepositorycBsŒeZd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Z	dd„Zdd	„Zd
„Z
d„Zd„Zd
„ZRS(cKs
||_dS(N(troot(RÒRáR§((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRÓ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/dist-packages/s3fuse/s3vaultfuse.pyt_full_segment_paths
cCs8|jdƒr|d}ntjj|j|ƒ}|S(NRÇi(RâR¹RºRÉRá(RÒRåRº((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRä%s
cCsdS(N((RÒR¤tflags((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytobject_open+scCsdS(N((RÒR¤tofftbufRÚ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt
object_upload.scCsdS(N((RÒR¤toffsetRÚ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytobject_download1scCsdS(N((RÒR¤((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt
object_delete4scCsdS(N((RÒR¤RÚ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytobject_close7scCsdS(N((RÒR¤tlengthRÚ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytobject_truncate:scCsdS(N((RÒR¤RÚ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytobject_getattr=scCsdS(N((RÒRºRÚ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytobject_readdir@scCsdS(N((RÒRºtmode((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt
object_accessCscCsdS(N((RÒRº((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt
object_unlinkFscCsdS(N((RÒRº((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt
object_statfsIsN(RÞRßRÓRæRäRèRëRíRîRïtNoneRñRòRóRõRöR÷(((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRàs											tBackendRepositorycBseZd„Zdefd„ƒYZdd'd„ƒYZd„Zd„Zd„Zd„Z	d	„Z
id
„Zd„Ze
d„ƒZd
„Zd„Ze
d„ƒZd„Zd„Zed„ƒZd„Zd(d„Zd„Zd„Zd„Zd„Zd(d„Zd„Zd„Ze d„Z!d„Z"e d„Z#d„Z$d „Z%d!„Z&d"„Z'd#„Z(d$„Z)d(d%„Z*d&„Z+RS()cKswtt|ƒj||ttƒj|_ttƒj|_i|_	t
jtƒ|_
i|_i|_i|_dS(N(tsuperRùRÓRt	FUSE_USERtpw_uidR{tpw_gidtgroup_idtmanifestRt	S3BackendR¸t_BackendRepository__backendt!_BackendRepository__manifest_lockt_BackendRepository__worker_poolt_BackendRepository__pending_ios(RÒRáR§((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRÓNs			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ÓRRt_BackendWorker__backendt_BackendWorker__job_queuet	threadingtEventt_stop_eventR_tdaemontstart(RÒt	job_queueR¸((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRÓns
		cCs|jjƒdS(N(R
tset(RÒ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytstopxscCs
|jjƒS(N(R
tis_set(RÒ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytstopped{scCs±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¼RpRtcurrent_threadtidentRRtgetR_Rt	task_doneRt	Exceptiont	exception(RÒRÄR¦tkargste((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytrun~s
(RÞRßt__doc__RÓRRR(((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRjs
	
		tBackendWorkerPoolcBs;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µROR
tworkerstrangetappendRùR(RÒtnum_threadsR¸t_((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRӗs
		cCs@x|jD]}|jƒq
Wx|jD]}|jƒq(WdS(N(RRRÉ(RÒtt((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt__del__ŸscOs|jj|||fƒdS(s+ Add a job to the worker queue
            N(R
tput(RÒRÄR¦R((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytadd_job¦scCs%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/dist-packages/s3fuse/s3vaultfuse.pytmap«s
cCs|jjƒdS(s> Wait for completion of all the jobs in the queue
            N(R
RÉ(RÒ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytwait_completion±s(RÞRßRRÓR#R%R'R((((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyR“s				cCs}tjj|ƒ\}}d}xR|dkrr|dkrQtjj||ƒ}n|}tjj|ƒ\}}q!W||fS(NRYRÇ(RYRÇ(R¹RºRÈRÉ(RÒRºRÊRËRÌ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRͶscCstjj|ƒ\}}|S(N(R¹RºRÈ(RÒRºRÊRË((s6/usr/lib/python2.7/dist-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/dist-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/dist-packages/s3fuse/s3vaultfuse.pyR*Ìs
cCsY|j|ƒ\}}i}i}tjƒ}||d<t|ƒ}|jj|ƒ}|S(NR¤(RÍR¸tcopytbunchifyRtget_object_manifest(RÒR¤t	containerRÌtput_headerstmrt_optsRÿ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt_read_object_manifestÒs
cCs’|j|ƒ\}}i}i}d|d<tjƒ}||d<x(|jƒD]\}	}
|
|d|	<qNWt|ƒ}|jj|||ƒdS(NR°sx-static-large-objectR¤sx-object-meta-(RÍR¸R,titemsR-Rtupload_object_manifest(RÒR¤tobject_manifesttmetadataR/RÌR0R1R2R•Ro((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt_write_object_manifestæs

	
cCs|j|ƒ\}}tjƒ}|dkr6g}n	|g}d|d<t|d<t|d<t|d<d|d<t|ƒ}i}|dkr©||d<|j|ƒnd}|jj||ƒ}i}xD|dj	ƒD]2\}	}
d|	krÛ|
||	j
d	ƒd
<qÛqÛW|S(NRYt	delimiterthumanttotalstlongRÌtheaderss
x-object-metasx-object-meta-i(RÍR¸R,RøRcR-RRtstat_objectR4RÈ(RÒR¤R/RÌR2R¦RtstR7R•Ro((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt_get_object_metadataÿs,		





cCs…|j|ƒ\}}|j|ƒ}|jj|tjƒƒ|j|<|tjkp‚|tddƒtddƒtddƒfk}|j|||j	kr¥iid6|j	|<|tjksI|tddƒtddƒtddƒfksI|tddƒtddƒfksI|tddƒtd	dƒtd
dƒfkrÌy|j
|ƒ}Wn@tk
rž}tj
d|ƒtjdƒ|j
|ƒ}nXx\|D]T}	|	d
jdƒdjdƒd}
t|
dƒ}t|	d<|	|j	||<q¦W|j|ƒ}|d|j	|d<y+|j|j	|dƒ}
tj|
ƒWntk
r`nXtjjtjj|ƒƒs›tjtjj|ƒƒnt|dƒ}|jtj|ƒƒWdQXq¥tjjtjj|ƒƒstjtjj|ƒƒn|tddƒtddƒtddƒfksE|tjkry|j|ƒWntk
rinXyt|dƒ}WdQXWqtk
r™qXny$|j|dƒ}
tj|
ƒWntk
rÔnXtj||ƒ}zL|jt j!t"ƒ|j#|<itd6|j	|d|<|j$||ƒWd|j#j%|dƒ|j	|dj%|dƒtj'|ƒXyt|dƒ}WdQXWq¥tk
r¡q¥XnWdQXtj||ƒ}yPi|d6|j	|d|<|jt j!t"ƒ|j#|<t(ƒ|j)|<|SWnqtk
r€}tj*|ƒ|j#j%|dƒ|j	|dj%|dƒ|j)j%|dƒtj'|ƒ‚nXdS(Nt8000it8800tc000topen_handlest8401t8402t8002t8802tc002s+Manifest for %s not found. Trying in 5 secsitnames
-segments/it.itmodifiedssegments-dirtwt8001t8801t0001s	-segmentstreadonly(+RÍRäRRRtRLockR¹tO_RDONLYtintRÿR3RR¼RpttimetsleepRÈRcR@tmakedirsRÁRºR»tdirnametopentwritetjsontdumpstO_RDWRRöRæRRµRPR¸Rt
_object_closetpopRøRÖRRR(RÒR¤RçR/RÌt	full_pathRQRÿtextsegtoffstrRìR7tsegment_dirtfRÚ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRè:s®	00$0
$

-









cCs†y_g}x*|D]"}|jtjj||ƒƒqWtjƒ}t|ƒ}|j||ƒWn tk
r}t	j
|ƒnXdS(s4 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(RR¹RºRÉR¸R,R-tdelete_object_listRR¼R(RÒtbackendR/tsegment_listtdelete_listtobjR2Ra((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt__purge_old_segments_task½s
 cCs[|j|jƒ|j|7y|j|jddt|dƒ}|j|ƒ\}}g}i}d}|j|d|ds)d}	d}
d}xtr|	|j|kr¹Pny%|j|j||	d|ƒ}Wn5t	j
dƒ|j|j||	d|ƒ}nX|j||	d	rt|ƒ}
t|
j
tjƒ}|ji|j||	dd
6|
jd6|d6|
jd
6ƒnk|j||	d}|ji|j||	dd
6|j||	dd6|d6|j||	d
d
6ƒ|	tj7}	|d7}|
|7}
qœW|j||di|d6t|ƒd6t|
ƒd6ƒd}	xÌtr%|r%|j|||	ƒ}t|ƒdkr”Pnt|ƒ}|j|j||	dƒ\}}tt|ƒt|gƒƒ}t|ƒdkr|j|j|j||ƒn|	tj7}	q]WndSWn tk
rP}tj|ƒ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	-segmentsiRDRQRJiRLRºtetagt
size_bytestcontent_typethashiR7s
segment-counts
total-sizeN(RR(RRÿRRãRÍR_RòRURVR-tmintst_sizeRµRSRRlRnR8tstrRhtlentsortedtlistRR%t+_BackendRepository__purge_old_segments_taskRR¼R(RÒR¤RÚtsegments_dirR/RÌR6t
segments_listtsegmentsRìt
total_sizetsegment_sizeR?tstattobjectstctpt
purge_listRa((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyR^Ðsš
	









c	Cs|j||ƒ|jj|ƒ|jj|ƒ|j|dj|ƒytj|ƒWntk
rlnX|j|ct	|j|dƒdkrÙytj
|j|ƒƒWntk
rÅnX|jj|ƒnWdQX||jkr|jj|dƒndS(NRDi(
R^RR_RRÿR¹RÖRÁRRsRÐRäRø(RÒR¤RÚ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRïJs"

cCsî|j|Ûyƒ||j|krW|j||dtkrW|j||d}nL|j||ƒ}|j|jddt|dƒ}tjj||ƒ}t	j
ƒ}d|j|k|d<|j|ƒ\}	}
tdtƒ<}t
|d	ƒ}|j|ƒWdQXt|ƒ|d
<WdQX|
jdƒ|d<t|ƒ}|	|g}
|j|j|ƒ|j|j|j|
|||||ƒWnPtk
rã}tj|ƒ||j|ksÉt‚|j|j|ƒ‚nXWdQXdS(NRLRJssegments-dirRÇs	-segmentst0t
path_validRÑtwbR{R¤(RRÿR_t,_BackendRepository__next_segname_from_offsetRRãR¹RºRÉR¸R,RÍRÏRYRZRstrstripR-RtaddRR%t&_BackendRepository__object_upload_taskRR¼RR·RÐ(RÒR¤RìRêRÚtseg_fullnametsegnameRwR2R/RjttempfsRetargs1Ra((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRë`s:
	
c	Cs„tjd||tjƒjfƒ|j|||j|ksJt‚WdQXzy|j||ƒWndt	k
rÍ}tj
|ƒ|j|2||j|ks­t‚|j|j|ƒWdQX‚nXWdtj
ƒtj|dƒX|j|ƒ||j|kr#i|j||<n||j||d<t|j||d<||j|ksft‚|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].NiRJRL(R¼RpRRRRRR·t
upload_objectRRRÐR×RÜR¹RÿR_(	RÒRgR‹R2R¤RìRˆRÚRa((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt__object_upload_task‰s.

c

Cs–xštrœtjdƒ|j|t||j|kr=wn||j|kr}td|tt|ƒtdƒfƒ‚n|j||d}PWdQXqW|j	|j
dƒƒ\}}tdtƒÆ}tj
ƒ}d|d<d|d<|j
dƒ|d	<t|ƒ}||g}	yN|jj|	|ƒt|j
dƒd
ƒ}
|
jƒ}WdQXt|ƒSWn#tk
r‹}tj|ƒ‚nXWdQXdS(Ngš™™™™™¹?sobject %s not foundiRJRÇRÐRÌt
out_directorytout_filetrb(R_RURVRRRÿRtSEGMENT_FORMATRTRÍR…RÏR¸R,RøR-Rtdownload_objectRYtreadt	bytearrayR¼R(
RÒR¤RìRÚRˆR/RjRŠR2R‹ReRêRa((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRíªs6	
#


c	Cs°|j||j|ƒ\}}tjƒ}t|ƒ}|g}|dkrl|dkrl|j|ƒny|jj||ƒWn tk
r¥}t	j
|ƒnXWdQXdS(NRYRÇ(RRÍR¸R,R-RRt
delete_objectRR¼R(RÒR¤R/RjR2R‹Ra((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRîÌs	
cCs3|r
dS|j|tjƒ}|j||ƒdS(N(RèR¹tO_WRONLYRï(RÒR¤RðRÚ((s6/usr/lib/python2.7/dist-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(NR9R:R;R<s%016xRÌRY(R¸R,RøRcR¹RºRÉRTR-Rt
list_segments(RÒR/RwRìR2R¦((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRhâ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ÿÿÿÿiRKi(RÍRÿRRøRâRãRhRsR‘RTRtRÈ(	RÒRºRìR/RÌRwR~Rtfiles((s6/usr/lib/python2.7/dist-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(
NRJs
-segments/issegments-dirs	-segmentsiiÿÿÿÿRKi(RRÍRÿRRøRÈRhRsR‘RTRt(
RÒRºRìR/RÌRbRwR~RR˜((s6/usr/lib/python2.7/dist-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/dist-packages/s3fuse/s3vaultfuse.pys	<genexpr>4stst_atimetst_ctimetst_gidtst_modetst_mtimetst_nlinkRqtst_uidit
st_blksizet	st_blocksN(sst_atimesst_ctimesst_gidsst_modesst_mtimesst_nlinksst_sizesst_uid(
R¹RºtisdirtlstattdictRTRR¼RRø(RÒtobject_cache_patht	stat_infoR((R?s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt_stat_cache"s(


c

s&|j|ƒ}|j|ƒ}|dk	r.|S|j|ƒ\}}tjƒ}|dkrdg}n	|g}d|d<t|d<t|d<t|d<d|d<t|ƒ}i}|dkr×||d<|j|ƒnd}y©|j	j
||ƒ‰|j|d<|j|d<ˆd	j
d
dƒ|d<ˆd	j
ddƒ|d
<tˆdƒ|d<tˆdƒ|d<tˆdƒ|d<d|d<d|d<|dk	r¸d|kr¸d|d<ntˆdƒ|d<|ddkrè|dks0|ddkr|dks0|ddkr |dks0ˆdtkr…d|d<d|d<d|d<|j|ƒ}	tjj|	ƒs…tj|	dƒq…nWnwtk
rÿ}
|dkr­|}n|jtjj||ƒƒ}|j|ƒ}ytj|ƒ‰Wn¾tk
r­|}t|ƒdkr"|jƒnyttjj|ddƒ|d<|j	j||ƒ‰tˆƒdkrˆtjtjj|ƒdƒn
tj|ƒWq®tk
r©q®XnX|d ksÍ|d! j d"ƒrÑdStj|ƒ‰t!‡fd#†d'Dƒƒ}nXd$|d%<t|dd$ƒ|d&<|S((NRYR9R:R;R<RÌRŸR£R=tETagRltContentTypeRnt	timestampRRžR¡iR¢iíR tauthorized_keyi€tsizeRqit	directoryiiiýAiét4913iÿÿÿÿt~c3s$|]}|tˆ|ƒfVqdS(N(R›(RœR•(R?(s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pys	<genexpr>šsiR¤R¥(sst_atimesst_ctimesst_gidsst_modesst_mtimesst_nlinksst_sizesst_uid("RäR«RøRÍR¸R,RcR-RRR>RþR{RRTR_R*R¹RºR»tmkdirRRÉR)R§RÁRsR_tlist_objectsRXR¼RptendswithR¨(
RÒR¤RÚR`RR/RÌR2R¦tcontainer_pathRatmkdirsR‹((R?s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRòKsž		













	



ccsÊg}|j|ƒ\}}tjƒ}d|d<t|d<t|d<t|d<d|d<g}|dkrtg}n2|g}|dkr¦|dk	r¦|d|d<ng}t|ƒ}||jj||ƒ7}xÖ|D]Î}	|j|	ƒ\}
}|
dks|dkrWtj	j
||j|	ƒƒ}ytj|dd	ƒWqWt
k
rSqWXn|
dk	rØ|
dkrØd
|
krØd|
krØ|
|kr¦|j|
ƒq¦qØqØWxt|ƒD]}
|
Vq·WdS(NR9R:R;R<RÌRYRÇRôiés	-segmentst	_segments(RÍR¸R,RøRcR-RRµR¹RºRÉR)RWRÁRRu(RÒR¤RÚtlistingR/RÌR2R¦tdirentstlstt	componenttrestR¸tr((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRó®sB




		

cCsdS(N((RÒR¤Rô((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRõÝscCs|td<tjƒ}t|ƒ}|s	y»|j|ƒ}|j|ƒ}g}x|D]}|j|dƒqVW|jj||ƒ|jdƒ}|dk	râ|g}	|jj
|	|ƒytj|j
|ƒƒWqâqâXnWq	tk
r}
tj|
ƒq	Xn|j|ƒ\}}|g}
|dkrO|dkrO|
j|ƒny|jj|
|ƒWn tk
rˆ}
tj|
ƒnXdS(NRRJssegments-dirRYRÇ(R¸R,R-R3R@RRRfRRøtrmdir_objectR¹trmdirR*RR¼RRÍR•(RÒR¤RR2tobj_manifesttobj_metadataRhtmanRwR¦RaR/RjR‹((s6/usr/lib/python2.7/dist-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-RR>RR¼RRterrnotENOENTRT(	RÒR¤R2R‹tstvRaRÅRÇtdt((s6/usr/lib/python2.7/dist-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-Rtmkdir_objectRRR*RcR¹RºRÉRW(
RÒRºRôtistR/RjR2R¦Rat
cache_path((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyR´"s$
!c
Cs|j|ƒ\}}tjƒ}d|d<t|ƒ}|g}|dkrh|dkrh|j|ƒng}y#||jj||ddƒ7}Wn tk
r³}t	j
|ƒnXt|ƒdkrØtt
jƒ‚ny|jj||ƒWn tk
r}t	j
|ƒnX|jdtƒy#||jj||ddƒ7}Wn tk
rg}t	j
|ƒnXt|ƒdkr·y|jj||ƒWq·tk
r³}t	j
|ƒq·Xn|j|ƒ}tjj|ƒrètj|ƒn|j|ƒ}	tjj|	ƒrtj|	ƒSdS(NRÌRYRÇt	max_itemsii(RÍR¸R,RøR-RRRµRR¼RRsRRÊt	ENOTEMPTYRÀtinsertRãR+R¹RºR¦RÁR*(
RÒRºR/RjR2R‹t	dir_itemsRatsegment_cache_pathRÐ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRÁBsH
	#
#
cCsptjd|ƒyG|j|ƒ\}}|jtjj||ƒƒ}tj||ƒSWntk
rknXdS(Ns	chmod, %s(	R¼RRÍR*R¹RºRÉtchmodRÁ(RÒRºRôR/RÌRÐ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRÖqs
cCsstjd|ƒyJ|j|ƒ\}}|jtjj||ƒƒ}tj|||ƒSWntk
rnnXdS(Ns	chown, %s(	R¼RRÍR*R¹RºRÉtchownRÁ(RÒRºtuidtgidR/RÌRÐ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyR×zs
cCstdƒ‚dS(NsNot Applicable(R(RÒRJttarget((s6/usr/lib/python2.7/dist-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
rC}nXt
}yÛy|j|ƒ}Wntk
ru}n¯X|j|ƒ}|jd|dƒ}	g}
xG|D]?}|
ji|d	d
6|dd6|d
d
6|dd6ƒq¨W|j||
di|	d6|dd6|dd6ƒt
}Wn#tk
rJ}tj|ƒ‚nXzyõ|j|ƒ}|j|ƒ}|jd|dƒ}	g}xG|D]?}|ji|d	d
6|dd6|d
d
6|dd6ƒq’W|j||di|	d6|dd6|dd6ƒy|j	|dt
ƒWn tk
rA}tj|ƒnXWntk
rY‚nXWd|r¡y|j	|dt
ƒWq¡tk
r}tj|ƒq¡XnXdS(Nis%s in use. Try againsrename, %s -> %sR³Rssegments-dirs	-segmentsiRJRºRoRlRmRnR7s
segment-counts
total-size(RÿRRøR·RURVRR¼RRöR_RR@RcR3RR8RÁ(
RÒtoldtnewtnewbak_nameRatnew_metadatatold_metadatatnewfile_existstnew_manifestRwtnewbak_manifestRÄtold_manifest((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytrename†s–!







cCstjd|ƒt|ƒ\}}|jtjj||ƒƒ}t|ƒ\}}|jtjj||ƒƒ}tj||ƒS(Nslink, %s(R¼RRÍR*R¹RºRÉtlink(RÒRÚRJR/RÌtcache_path_targettcache_path_name((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRæ÷scCs_tjd|ƒt|ƒ\}}|j|ƒ}ytj||ƒWntk
rZdSXdS(Nsutimens, %si(R¼RRÍR*R¹tutimeRÁ(RÒRºttimesR/RÌRÐ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytutimensÿs
cCsty\tjjtjtjƒ}tjj|ƒr[tjj|ƒr[tj	|dddƒnWntk
ronXdS(Nttimeoutii(R¹RºRÉRµR7R8R¦tismountRtumountRøRÁ(RÒRºRÙ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytdestroys
(N(,RÞRßRÓRRRRÍR)R+R*R3R8R@R¬RèRvR^RïRëR‡RÆRíRîRøRñRhR„RšR«RòRóRõRcRöR÷R´RÁRÖR×RÛRåRæRëRï(((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRùMsJ	)#						;ƒ		z	)	!"					)c	/	#	 	/						q	t	FuseCachecBszeZd„Zd„Zed„Zd„Zdd„Zd„Z	d„Z
d„Zd„Zd	„Z
d
„Zd„ZRS(
cCsÚ||_||_t|_ttƒj|_ttƒj|_t	j
j|jƒs²yDtj
|jƒtj|jt|jƒdt|jƒgƒWqtk
r®‚qXnit	j|jƒ}|j|jksè|j|jkrtjtjt|jƒdt|jƒgƒny¤t	j
jtjtjƒ}t	j
j|ƒs[tj|ƒnt	j
j|ƒs¾dttjƒttjƒ}dd|d}tjdd|d|gƒnWntk
rÕ‚nXdS(Nt:issize=%dM,mode=0777iiR9s-o(Rát
repositorytlrucacheRRûRüR{RýRþR¹RºR¦RR´R×RrRÁR|R£RŸRµR7RÉR8R
tensure_treeRíRTRSRTtmount(RÒRáRòRªRÙt
tmpfs_sizettmpfs_buffer_cfg((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRÓ-s6			4

3	#
cCs||jj||ƒ}|jj|dƒr=|jj|ƒnitdtjƒd6t	j
ƒd6|d6td6|j|<|S(NtmaxsizeRótlrulockR¤twrites_before_update_manifest(RòRèRóRRøR_RRµRTRtLocktNUMBER_UPLOADS_BEFORE_FLUSH(RÒR¤RçRÚ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRèRs
c	Csßtjd|tjƒjfƒ|j|}|d|ksCt‚|d}|dfyMxFtr£|jƒ\}}|dr^|j	j
|||d|ƒq^q^WWntk
r¸nXWdQX|rÛ|j	j||ƒndS(NsCache object_flush [%s] [%x]R¤RóRùRLtdata(
R¼RRRRRóR·R_tpopitemRòRëtKeyErrorR^(RÒR¤RÚtupdate_manifesttitemtcacheRé((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytobject_flush_s"

	
	

cCs]tjd|tjƒjfƒ|j||dtƒ|jj||ƒ|j	j
|ƒdS(NsCache object_close [%s] [%x]R(R¼RRRRRRcRòRïRóR_(RÒR¤RÚ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRïvscCs|jj|||ƒdS(N(RòRñ(RÒR¤RðRÚ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRñ€sccsmxf|dkrh|tjtj}||}t|tj|ƒ}|||fV||7}||8}qWdS(Ni(RµRSRp(RÒRìRðt
seg_offsettbasetseg_len((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt_walk_segmentsƒs

c
CsË|j|d|kst‚tƒ}|j|dˆx€|j||ƒD]l\}}}y|j|d|d}	Wn(tk
r¡yó|j|d}
t|
ƒtjkr>|
jƒ\}}|dr>|j	j
|||d|ƒ|j|dcd8<|j|ds;|j	j||ƒt|j|d<q;q>n|j	j
|||ƒ}	itd6|	d6|j|d|<Wq¢tk
r}
tj|
ƒdSXnX||	|||!7}qKWWdQXt|ƒS(	NR¤RùRóRýRLRúii(RóR·R”RRÁRsRµRTRþRòRëR^RüRíRcRR¼Rtbytes(RÒR¤RðRìRÚt
output_buft	segoffsetRRtsegdataRRéRRa((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytobject_readŽsB		

	

	
	
	c
CsWtjd|tjƒjfƒt|ƒ}|j|d|ksIt‚d}|j|dëxã|j||ƒD]Ï\}}}	|j|d}
||
krÍt|
ƒt	j
krC|
jƒ\}}|drC|jj
|||d|ƒ|j|dcd	8<|j|ds@|jj||ƒt|j|d<q@qCnyO|jj|||ƒ}
|
dkrytd
ƒ‚nitd6|
d6|
|<WqÛtk
rÉtd	ƒ}
itd6|
d6|
|<qÛXn|
|d}
t|
ƒ|kr|
jd||	t|
ƒƒn||||	!|
|||	+t|
|d<||	7}qtWWdQXt|ƒS(NsCache object_write [%s] [%x]R¤iRùRóRLRýRúisObject not foundt(R¼RRRRRsRóR·RRµRTRþRòRëR^RüRíRøRRcRÁR”R_textend(RÒR¤RêRìRÚRðtbufptrR
RRRRéRR((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytobject_writeÇsN	
	

	
"cCstj|jj|ƒ|ƒS(N(R¹R´RòRä(RÒRºRô((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyR´scCs|jj|ƒ}tj|ƒS(N(RòRäR¹RÁ(RÒRºR`((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRÁscCs"|jj|ƒ}tj||ƒS(N(RòRäR¹RÖ(RÒRºRôR`((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRÖ"scCs%|jj|ƒ}tj|||ƒS(N(RòRäR¹R×(RÒRºRØRÙR`((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyR×&sN(RÞRßRÓRèR_RRïRøRñRRRR´RÁRÖR×(((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRð,s	%	
	
		9	T			cBsõeZdd„Zd„Zd„Zd„Zedd„ƒZd„Z	d„Z
d„Zd„Zd	„Z
d
„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/dist-packages/s3fuse/s3vaultfuse.pyRÓ+s	cCs|jj||ƒdS(N(RòRõ(RÒRºRô((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytaccess3scCs|jj||ƒS(N(RòRÖ(RÒRºRô((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRÖ6scCs|jj|||ƒS(N(RòR×(RÒRºRØRÙ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyR×9scCs|jj||ƒS(N(RòRò(RÒRºRÚ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyR›<sccsBddg}|j|jj||ƒƒx|D]}|Vq/WdS(NRKs..(RRòRó(RÒRºRÚR»R¿((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytreaddir@s
cCsEtj|j|ƒƒ}|jdƒr=tjj||jƒS|SdS(NRÇ(R¹treadlinkRäRâRºtrelpathRá(RÒRºtpathname((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRFscCstj|jj|ƒ||ƒS(N(R¹tmknodRòRä(RÒRºRôtdev((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRXscCs|jj|ƒS(N(RòRÁ(RÒRº((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRÁ[scCs|jj||ƒS(N(RòR´(RÒRºRô((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyR´^scCs|jj|ƒS(N(RòR÷(RÒRº((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytstatfsascCs|jj|ƒS(N(RòRö(RÒRº((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytunlinkdscCs|jj||ƒS(N(RòRÛ(RÒRJRÚ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRÛgscCs|jj||ƒS(N(RòRå(RÒRÜRÝ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRåjscCs|jj||ƒS(N(RòRæ(RÒRÚRJ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRæmscCs|jj||ƒS(N(RòRë(RÒRºRê((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRëpscCs|jj||ƒS(N(RRè(RÒRºRô((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRYvscCs|j|tjƒS(N(RYR¹tO_CREAT(RÒRºRôtfi((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytcreateyscCs|jj||||ƒ}|S(N(RR(RÒRºRðRìRÚRê((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyR“|scCs|jj||||ƒS(N(RR(RÒRºRêRìRÚ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRZ€scCs|jj||d|ƒdS(NRÚ(RRñ(RÒRºRðRÚ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyttruncateƒscCs|jj||ƒdS(N(RR(RÒRºRÚ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytflush†scCs|jj||ƒdS(N(RRï(RÒRºRÚ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyR܉scCs!tjd|ƒ|jj|ƒS(Nsdestroy, %s(R¼RRòRï(RÒRº((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRïsN(RÞRßRøRÓRRÖR×RÆR›RRRRÁR´RRRÛRåRæRëRYRR“RZRRRÜRï(((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRL*s2																		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»RYR“RZRR,RÐR×(t	conf_filetfoundRetlinetstoutf((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt	fuse_conf•s"

c
Csy¾ytj|dgƒWntk
r-nXtjj|ƒratj|dtdtgƒn\tj	|dgƒtj	|dgƒtj|tdtgƒtj|tdtgƒWn t
k
rà}tj|ƒnXgtj
tjƒD]-}tjtjjtj|ƒdtƒ^qôt|dt|ƒƒ}t}tjjƒdkrat}nt||d|d	td
tdtdtƒdS(
Ns-ls-RRñs-pt
ignore_errorsRòR°t	nothreadst
foregroundtnonemptyt
big_writestallow_other(RRîRÁR¹RºR¦R×Rût
FUSE_GROUPR´RR¼RtlistdirRµR7tshutiltrmtreeRÉR_RLRùRgR¶RcR(t
mountpointt	cacherootRatxttvaultplugintdisable_fuse_threads((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytmain¨s8
!A	cCs=tƒtjtjkst‚tƒttjtjƒdS(s$Main routine that drives fuse mount.N(	R½RµRORPR·R(R8R6R7(((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRÔst__main__(mRR¹tgrptsysRÊRUR[R1Rªt
subprocessRRRttempfileRRRtImportErrortqueuetpwdRt
cachetoolsRtfuseRRR	tfusepyts3fuse.bunch_p3tasttoslo_configRtoslo.configtoslo_logRR¾ts3fuseR
Rts3fuse.privsepRt_DEFAULT_LOG_DATE_FORMATRãtQUEUE_DEPTHtWORKER_POOL_SIZEtBoolOptRctcommon_cli_optstStrOptRøtlogging_cli_optsR_tIntOpttgeneric_log_optstListOpttlog_optstcontego_vault_optsRµt
register_optstregister_cli_optsRrtenvirontflagtargvtsetupR4R¶t	getLoggerR¼R×RltloggertsetLeveltDEBUGtINFOtWARNRÀRÁRR¸RûR¥R¬R½tCACHE_LOW_WATERMARKtCACHE_HIGH_WATERMARKtgetpasstgetuserRûtgetgrgidtgetgidtgr_nameR/R‘RóRüRÆRÍRÎRÏtobjectRàRùRðRLR(R8RRÞ(((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt<module>s¶
  

		






##		#		
	4ÿÿÿÿãþk	,