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:
ó
ìƒã`c,@sÚdZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl	m
Z
ddl	mZddlm
Z
yddlmZmZWn'ek
råddlmZmZnXddlmZddlmZy dd	lmZmZmZWn#dd	lmZmZmZnXdd
lTddlZyddlmZWn!ek
r™ddlmZnXddl m!Z"dd
l#m$Z$ddl#m%Z%ddl&m'Z'dZ(dZ)dZ*dZ+ej,dddde-ddƒej,dddde-ddƒgZ.ej/ddddd ƒej/d!dddd"ƒej/d#dddd$ƒej/d%de0dd&dd'ƒej/d(de(dd)dd*ƒej/d+ddd,d-dd.ƒej/d/d,d0dd1ƒej,d2de-dd3ƒej/d4dd5dd6ƒg	Z1ej,d7de2dd8ƒej,d9de-dd:ƒej,d;de-dd<ƒej,d=de-dd>ƒej3d?dd@ddAƒgZ4ej3dBddCddDƒej3dEddFddGƒej/dHddIddJƒej/dKddLddMƒej/dNddOddPƒej/dQddRddSƒej/dTddUddVƒej/dWddXddYƒej5dZdd[d\d]d^d_d`gddaƒej,dbde-ddcƒej,ddde-ddeƒej/dfddgddhƒej/diddgddjƒej3dkddlddmƒgZ6ej/dnddoddpƒej/dqddrƒej/dsddtddrƒej/duddvddwƒej/dxddyddzƒej/d{dd|dd}ƒej/d~dddd€ƒej/ddd‚ddƒƒej/d„dd…dd†ƒej/d‡dd…ddˆƒej/d‰ddŠdd‹ƒej/dŒddddŽƒej/dddddƒej/d‘dd’dd“ƒej/d”dd•dd–ƒej/d—dd˜dd™ƒej3dšde*dd›ƒej3dœde+ddƒej3džddŸdd ƒej/d¡dd¢dd£ƒej3d¤dd¥d¦d¦dd§ƒej3d¨dddd©ƒej/dªdd«dddd¬ƒej/d­dd®dd¯ƒej/d°dd±dd²ƒej/d³dd±dd´ƒej/dµdd±dd¶ƒej/d·dd±dd¸ƒej/d¹dd±ddºƒej/d»dd¼dd½ƒej/d¾dd±dd¿ƒej/dÀddddÁƒej/dÂddÃddăej/dÅddÆddǃej/dÈdd¼ddɃej/dÊdd¼dd˃ej/dÌddÍdd΃ej/dÏddÐddуej/dÒddÓddԃg'Z7ej8Z8e8j9e7ƒe8j:e1ƒe8j:e4ƒe8j:e6ƒe8j:e.ƒy$e;ej<dÕƒZ=e8e=gƒWne8ej>d@ƒnXe"j?ej8e8j@jAƒƒe"jBe8j@jAƒƒZCedÖd׃ZDy˜e8jEjAƒdkrº	eCjFjGe"jHƒnie8jEjAƒdØkrå	eCjFjGe"jIƒn>e8jEjAƒdÙkr
eCjFjGe"jJƒneCjFjGe"jKƒWn'eLk
rM
eCjFjGe"j"jKƒnXi&e0dÚ6d@d6gdÛ6dÜdÝ6i
e0dÞ6e0dß6e0dà6e0dá6e0dâ6e0dã6e0dä6e0då6e0dæ6e0dç6e0dè6e0dé6e0dê6dë6e2dì6e0dí6d±dî6d±dï6ej<jMdðƒdñ6ej<jMdòƒdó6ej<jMdôƒdõ6d±dö6d±d÷6e0dø6e2dù6e-dú6e0dû6d±dü6d±dý6d±dþ6e0dÿ6e-dØ6dd6e0d6gd6e-d6e-d6e2d6e-d6e-d6e2d6dd	6dd
6dd6dd6e-d
6e0d6ZNd„ZOdZPd×ZQddlRZReRjSƒZTdZUiaVdZWd„ZXd„ZYd„ZZdfd„ƒYZ[de\fd„ƒYZ]de]fd„ƒYZ^de\fd„ƒYZ_d•efd„ƒYZ`dd„Zad „Zbd!„Zcedd"krÖecƒ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_namecCsvtjjƒ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(targstkwargstresult(tfunc(s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytwrapperÒs

(t	functoolstwraps(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_download&scCsdS(N((RÎR¤((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt
object_delete)scCsdS(N((RÎR¤RÖ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytobject_close,scCsdS(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_getattr2scCsdS(N((RÎR²RÖ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytobject_readdir5scCsdS(N((RÎR²tmode((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt
object_access8scCsdS(N((RÎR²((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt
object_unlink;scCsdS(N((RÎR²((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt
object_statfs>sN(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d„Z
d
„Zd„Zd„Zd„Zd„Zed„ƒZd„Zd(d„Zd„Zd„Zd„Zd„Zd(d„Zd„Zd„Zed„Z d„Z!ed„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ÏCs			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_queuet	threadingtEventt_stop_eventR_tdaemontstart(RÎt	job_queueR°((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRÏcs
		cCs|jjƒdS(N(Rtset(RÎ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytstopmscCs
|jjƒS(N(Rtis_set(RÎ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytstoppedpscCs±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_threadtidentR
RtgetR_Rt	task_doneRt	Exceptiont	exception(RÎR¾R»tkargste((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytrunss
(RÚRÛt__doc__RÏRR
R(((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyR_s
	
		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ÏRR!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°tcopytbunchifyRýtget_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)Rýtupload_object_manifest(RÎR¤tobject_manifesttmetadataR+RÈR,R-R.R•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)RRýtstat_objectR0RÄ(RÎR¤R+RÈR.R»RtstR3R•Ro((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt_get_object_metadataôs,		





cCs¨|j|ƒ\}}|j|ƒ}|jj|tjƒƒ|j|<|j|i|j|<|tjkp|t	ddƒt	ddƒt	ddƒfk|j|d<|tjks>|t	ddƒt	ddƒt	ddƒfks>|t	ddƒt	ddƒfks>|t	ddƒt	d	dƒt	d
dƒ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
rUnXtjjtjj|ƒƒstjtjj|ƒƒnt|dƒ}
|
jtj|ƒƒWdQXnŸtjjtjj|ƒƒsûtjtjj|ƒƒn|t	ddƒt	ddƒt	ddƒfks:|tjkr’y|j|ƒWntk
r^nXyt|dƒ}
WdQXWq’tk
rŽq’Xny$|j|dƒ}tj|ƒWntk
rÉnXtj||ƒ}z0|jt j!t"ƒ|j#|<|j$||ƒWd|j#j%|dƒtj'|ƒXyt|dƒ}
WdQXWntk
r_nXWdQXtj||ƒ}|jt j!t"ƒ|j#|<t(ƒ|j)|<|S(Nt8000it8800tc000treadonlyt8401t8402t8002t8802tc002s+Manifest for %s not found. Trying in 5 secsitnames
-segments/it.itmodifiedssegments-dirtwt8001t8801t0001s	-segments(*RÉRàRþRRtRLockRûR±tO_RDONLYtintR/RR´RpttimetsleepRÄRcR<tmakedirsR¹R²R³tdirnametopentwritetjsontdumpstO_RDWRRòRâRR­RPR°Rÿt
_object_closetpopRôRÒR
R(RÎR¤RãR+RÈt	full_pathRûtextsegtoffstrRèR3tsegment_dirtfRÖ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRäs–	
;#0$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_listtobjR.R\((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt__purge_old_segments_task¤s
 cCsS|j|jƒ|j|/y|j|jddt|dƒ}|j|ƒ\}}g}i}d}|j|ds!d}	d}
d}xtr|	|j|kr±Pn|j||	dr…y%|j|j||	d|ƒ}Wn5t	j
dƒ|j|j||	d|ƒ}nXt|ƒ}
t|
j
tjƒ}|ji|j||	dd	6|
jd
6|d6|
jd6ƒnk|j||	d}|ji|j||	dd	6|j||	d
d
6|d6|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}	qUWndSWn tk
rH}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	-segmentsiR@RHRFiR²tetagt
size_bytestcontent_typethashiR3s
segment-counts
total-sizeN(RÿR$RþRûRRßRÉR_RîRPRQR)tmintst_sizeR­RSRRgRiR4tstrRctlentsortedtlistR
R!t+_BackendRepository__purge_old_segments_taskRR´R(RÎR¤RÖtsegments_dirR+RÈR2t
segments_listtsegmentsRèt
total_sizetsegment_sizeR;tstattobjectstctpt
purge_listR\((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRY·sš
	









cCs‡|j||ƒ|jj|ƒ|jj|ƒytj|ƒWntk
rTnXytj|j|ƒƒWntk
r‚nXdS(N(	RYRÿRZRR±RÒR¹RÌRà(RÎR¤RÖ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRë1s

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|
|||||ƒWnMtk
rà}tj|ƒ||j|ksÉt‚|j|j|ƒnXWdQXdS(NRHRFssegments-dirRÃs	-segmentst0t
path_validRÍtwbRvR¤(RþRûR_t,_BackendRepository__next_segname_from_offsetRRßR±R²RÅR°R(RÉRËRTRURntrstripR)RtaddRÿR!t&_BackendRepository__object_upload_taskRR´RR¯RÌ(RÎR¤RèRæRÖtseg_fullnametsegnameRrR.R+RettempfsR`targs1R\((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRç?s8
	
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].NiRFRH(R´RpRRRRþRR¯t
upload_objectRRRÌRÓRØR±RûR_(	RÎRbR†R.R¤RèRƒRÖR\((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt__object_upload_taskgs.

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 foundiRFRÃRÌRÈt
out_directorytout_filetrb(R_RPRQRþRRûRtSEGMENT_FORMATRORÉR€RËR°R(RôR)Rýtdownload_objectRTtreadt	bytearrayR´R(
RÎR¤RèRÖRƒR+ReR…R.R†R`RæR\((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Ã(RþRÉR°R(R)RRýt
delete_objectRR´R(RÎR¤R+ReR.R†R\((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRêªs	
cCs@|r
dS|j|tjƒ}|jj|ƒtj|ƒdS(N(RäR±tO_WRONLYRÿRZRÒ(RÎR¤RìRÖ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRíºs
cCsštjƒ}d|d<t|d<t|d<t|d<tjj|dt|ƒƒ|d<g}|dkrrg}n	|g}t|ƒ}|j	j
||ƒS(NR5R6R7R8s%016xRÈRY(R°R(RôRcR±R²RÅROR)Rýt
list_segments(RÎR+RrRèR.R»((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRcÁ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ÿÿÿÿiRGi(RÉRûRRôRÞRßRcRnRŒRORoRÄ(	RÎR²RèR+RÈRrRyRztfiles((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(
NRFs
-segments/issegments-dirs	-segmentsiiÿÿÿÿRGi(RþRÉRûRRôRÄRcRnRŒRORo(
RÎR²RèR+RÈR]RrRyRzR“((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>stst_atimetst_ctimetst_gidtst_modetst_mtimetst_nlinkRltst_uidit
st_blksizet	st_blocksN(sst_atimesst_ctimesst_gidsst_modesst_mtimesst_nlinksst_sizesst_uid(
R±R²tisdirtlstattdictRORR´RRô(RÎtobject_cache_patht	stat_infoR((R;s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt_stat_caches(


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((NRYR5R6R7R8RÈRšRžR9tETagRgtContentTypeRit	timestampR˜R™RœiRiíR›tauthorized_keyi€tsizeRlit	directoryiiiýAiét4913iÿÿÿÿt~c3s$|]}|tˆ|ƒfVqdS(N(R–(R—R•(R;(s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pys	<genexpr>ysiRŸR (sst_atimesst_ctimesst_gidsst_modesst_mtimesst_nlinksst_sizesst_uid("RàR¦RôRÉR°R(RcR)RRýR:RúR{RROR_R&R±R²R³tmkdirRRÅR%R¢R¹RnRZtlist_objectsRSR´RptendswithR£(
RÎR¤RÖR[RR+RÈR.R»tcontainer_pathR\tmkdirsR†((R;s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRî*sž		













	



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(NR5R6R7R8RÈRYRÃRðiés	-segmentst	_segments(RÉR°R(RôRcR)RýR°R±R²RÅR%RRR¹RRp(RÎR¤RÖtlistingR+RÈR.R»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
|	|ƒtj|j
|ƒƒnWqûtk
r÷}
tj|
ƒqûXn|j|ƒ\}}|g}
|dkrA|dkrA|
j|ƒny|jj|
|ƒWn tk
rz}
tj|
ƒnXdS(NRRFssegments-dirRYRÃ(R°R(R)R/R<RRýRaRRôtrmdir_objectR±trmdirR&RR´RRÉR(RÎR¤RR.tobj_manifesttobj_metadataRctmanRrR»R\R+ReR†((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRò¿s8

	
	
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-bytesR9sx-account-bytes-usediÿÿÿÿR«tf_blockstf_bfreetf_bavailitf_favailtf_frsize(R°R(R)RýR:RR´RRterrnotENOENTRO(	RÎR¤R.R†tstvR\RÀ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)Rýtmkdir_objectRRR&RcR±R²RÅRR(
RÎR²RðtistR+ReR.R»R\t
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)RRýR°RR´RRnRRÅt	ENOTEMPTYR»tinsertRßR'R±R²R¡R¼R&(
RÎR²R+ReR.R†t	dir_itemsR\tsegment_cache_pathRË((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyR¼sH
	#
#
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ÑMs
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ÒVs
cCstdƒ‚dS(NsNot Applicable(R(RÎRFttarget((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytsymlink_sc
CsCtjd||fƒ|d}y|j|dtƒWn tk
rZ}tj|ƒnXye|j|ƒ}|j|ƒ}|jd|dƒ|jd|dƒkr¿|j|dtƒdSWn tk
râ}tj|ƒnXt}yèy|j|ƒ}Wn tk
r!}tj|ƒn¯X|j	|ƒ}|jd|dƒ}	g}
xG|D]?}|
j
i|dd6|d	d
6|dd6|dd6ƒqTW|j||
d
i|	d6|dd6|dd6ƒt}Wntk
rç‚nXzyõ|j	|ƒ}|j|ƒ}|jd|dƒ}	g}xG|D]?}|j
i|dd6|d	d
6|dd6|dd6ƒq/W|j||d
i|	d6|dd6|dd6ƒy|j|dtƒWn tk
rÞ}tj|ƒnXWntk
rö‚nXWd|r>y|j|dtƒWq>tk
r:}tj|ƒq>XnXdS(Nsrename, %s -> %sR®Rssegments-dirs	-segmentsiRFR²RjRgRhRiR3s
segment-counts
total-size(
R´RRòR_RRR<RRcR/RR4R¹(
RÎtoldtnewtnewbak_nameR\tnew_metadatatold_metadatatnewfile_existstnew_manifestRrtnewbak_manifestR¿told_manifest((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytrenamebsŠ






cCstjd|ƒt|ƒ\}}|jtjj||ƒƒ}t|ƒ\}}|jtjj||ƒƒ}tj||ƒS(Nslink, %s(R´RRÉR&R±R²RÅtlink(RÎRÕRFR+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.pytdestroyÝs
(N(+RÚRÛRÏRRRRÉR%R'R&R/R4R<RäRqRYRëRçR‚RÂRéRêRôRíRcRR•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õBsJ	)#							‘		z		(	!"					)c	/	 	 	/						g	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ÒRmR¹RwRžRšR­R7RÅR8R
tensure_treeRèRORSRTtmount(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ôRZRR­RTRtLocktNUMBER_UPLOADS_BEFORE_FLUSH(RÎR¤RãRÖ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRä$s
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ôRHtdata(
R´RRRRRîR¯R_tpopitemRíRçtKeyErrorRY(RÎR¤RÖtupdate_manifesttitemtcacheRå((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytobject_flush1s"

	
	

cCs]tjd|tjƒjfƒ|j||dtƒ|jj||ƒ|j	j
|ƒdS(NsCache object_close [%s] [%x]Rû(R´RRRRRþRcRíRëRîRZ(RÎR¤RÖ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRëHscCs|jj|||ƒdS(N(RíRí(RÎR¤RìRÖ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRíRsccsmxf|dkrh|tjtj}||}t|tj|ƒ}|||fV||7}||8}qWdS(Ni(R­RSRk(RÎRèRìt
seg_offsettbasetseg_len((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt_walk_segmentsUs

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øRHRõii(RîR¯RRR¹RnR­RTRùRíRçRYR÷RéRcRR´Rtbytes(RÎR¤RìRèRÖt
output_buft	segoffsetRRtsegdataRýRåRüR\((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îRHRøRõisObject not foundt(R´RRRRRnRîR¯RR­RTRùRíRçRYR÷RéRôRRcR¹RR_textend(RÎR¤RæRèRÖRìtbufptrRRRRýRåRüR((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_RþRëRôRíRRRR¯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.pytaccessscCs|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²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–sccsBddg}|j|jj||ƒƒx|D]}|Vq/WdS(NRGs..(R	RíRï(RÎR²RÖR¶Rº((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytreaddirs
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.pyRscCstj|jj|ƒ||ƒS(N(R±tmknodRíRà(RÎR²Rðtdev((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.pyR¼-scCs|jj||ƒS(N(RíR¯(RÎR²Rð((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyR¯0scCs|jj|ƒS(N(RíRó(RÎR²((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytstatfs3scCs|jj|ƒS(N(RíRò(RÎR²((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytunlink6scCs|jj||ƒS(N(RíRÖ(RÎRFRÕ((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à<scCs|jj||ƒS(N(RíRá(RÎRÕRF((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æBscCs|jj||ƒS(N(RýRä(RÎR²Rð((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRTHscCs|j|tjƒS(N(RTR±tO_CREAT(RÎR²Rðtfi((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytcreateKscCs|jj||||ƒ}|S(N(RýR(RÎR²RìRèRÖRæ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRŽNscCs|jj||||ƒS(N(RýR(RÎR²RæRèRÖ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyRURscCs|jj||d|ƒdS(NRÖ(RýRí(RÎR²RìRÖ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyttruncateUscCs|jj||ƒdS(N(RýRþ(RÎR²RÖ((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytflushXscCs|jj||ƒdS(N(RýRë(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êbsN(RÚRÛRôRÏRRÑRÒRÂR–R
RRR¼R¯RRRÖRàRáRæRTRRŽRURRRØ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³RTRŽRURR(RÌRÒ(t	conf_filetfoundR`tlinetstoutf((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt	fuse_confgs"

c
Csy¾ytj|dgƒWntk
r-nXtjj|ƒratj|dtdtgƒn\tj|dgƒtj|dgƒtj|tdtgƒtj|tdtgƒWn t	k
rà}t
j|ƒnXgtjt
jƒD]-}tjtjjt
j|ƒdtƒ^qôt|dt|ƒƒ}t}t
jjƒ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÷R¯RR´RtlistdirR­R7tshutiltrmtreeRÅR_RLRõRgR®RcR(t
mountpointt	cacherootR\txttvaultplugintdisable_fuse_threads((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pytmainzs8
!A	cCs=tƒtjtjkst‚tƒttjtjƒdS(s$Main routine that drives fuse mount.N(	RµR­RORPR¯R#R2R6R7(((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyR¦st__main__(eRR±tsysRÅRPRVR+RÀ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_optsRmtenvirontflagtargvtsetupR4R®t	getLoggerR´RÓRltloggertsetLeveltDEBUGtINFOtWARNR¸R¹RR°RµtCACHE_LOW_WATERMARKtCACHE_HIGH_WATERMARKtgetpasstgetuserR÷RŒRîR÷RÂRÉRÊRËtobjectRÜRõRëRLR#R2RRÚ(((s6/usr/lib/python2.7/dist-packages/s3fuse/s3vaultfuse.pyt<module>s®
  

		






##	#		
	4ÿÿÿÿÀþk	,