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:
ó
7f¢`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/site-packages/s3fuse/s3vaultfuse.pyt_wrap¦s(t	functoolstwraps(R¨R©((R¨s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytsynchronized¥scCsFdtd<tjtd<tjtd<tjtd<tjtd<tjtd<tjjƒdkrmt	td	<n
t
td	<tjjƒdkr™t	td
<n
t
td
<tjrÀtjtdd<ntj
rÝtj
tdd
<ntjjƒdkrÿt
td<nCtjjtjƒr$tjtd<ntjdtjƒdtd<dS(Ns1.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(toptionstCONFRXRZR\RaRdRbtlowerR_RcR^R]R[R`tostpathtexiststLOGRq(((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt
option_config­s0









		
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/site-packages/s3fuse/s3vaultfuse.pytwrapperÝs

(RªR«(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(NRYt/(RYRÆ(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ùst	tmpfsfilecBs)eZeed„Zd„Zd„ZRS(cCs||_||_dS(N(tremovetpersist_exit(tselfRÏRÐ((s6/usr/lib/python2.7/site-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/site-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/site-packages/s3fuse/s3vaultfuse.pyt__exit__s	
(t__name__t
__module__RcRÒRÚRÜ(((s6/usr/lib/python2.7/site-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/site-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/site-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/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¤tofftbufRÙ((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_download1scCsdS(N((RÑR¤((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt
object_delete4scCsdS(N((RÑR¤RÙ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_close7scCsdS(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_getattr=scCsdS(N((RÑR¹RÙ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_readdir@scCsdS(N((RÑR¹tmode((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt
object_accessCscCsdS(N((RÑR¹((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt
object_unlinkFscCsdS(N((RÑR¹((s6/usr/lib/python2.7/site-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/site-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/site-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ÒRRÿt_BackendWorker__backendt_BackendWorker__job_queuet	threadingtEventt_stop_eventR_tdaemontstart(RÑt	job_queueRµ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÒns
		cCs|jjƒdS(N(R	tset(RÑ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytstopxscCs
|jjƒS(N(R	tis_set(RÑ((s6/usr/lib/python2.7/site-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/site-packages/s3fuse/s3vaultfuse.pytrun~s
(RÝRÞt__doc__RÒRRR(((s6/usr/lib/python2.7/site-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/site-packages/s3fuse/s3vaultfuse.pyRҗs
		cCs@x|jD]}|jƒq
Wx|jD]}|jƒq(WdS(N(RRRÈ(RÑtt((s6/usr/lib/python2.7/site-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/site-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/site-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/site-packages/s3fuse/s3vaultfuse.pytwait_completion±s(RÝRÞRRÒR"R$R&R'(((s6/usr/lib/python2.7/site-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/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
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/site-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ËR/R0R1R•Ro((s6/usr/lib/python2.7/site-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_objectR3RÇ(RÑR¤R.RËR1R¦RtstR6R•Ro((s6/usr/lib/python2.7/site-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þR2RR»RpttimetsleepRÇRcR?tmakedirsRÀR¹RºtdirnametopentwritetjsontdumpstO_RDWRRõRåRR¶RPRµRt
_object_closetpopR÷RÕR
RR(RÑR¤RæR.RËt	full_pathRPRþtextsegtoffstrRëR6tsegment_dirtfRÙ((s6/usr/lib/python2.7/site-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_listtobjR1R`((s6/usr/lib/python2.7/site-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	-segmentsiRCRPRIiRKR¹tetagt
size_bytestcontent_typethashiR6s
segment-counts
total-sizeN(RR'RRþRRâRÌR_RñRTRUR,tmintst_sizeR¶RSRRkRmR7tstrRgtlentsortedtlistR
R$t+_BackendRepository__purge_old_segments_taskRR»R(RÑR¤RÙtsegments_dirR.RËR5t
segments_listtsegmentsRët
total_sizetsegment_sizeR>tstattobjectstctpt
purge_listR`((s6/usr/lib/python2.7/site-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(NRCi(
R]RR^RRþR¸RÕRÀRRrRÏRãR÷(RÑR¤RÙ((s6/usr/lib/python2.7/site-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|
|||||ƒWn7tk
rÊ}tj|ƒ|j|j|ƒ‚nXWdQXdS(NRKRIssegments-dirRÆs	-segmentst0t
path_validRÐtwbRzR¤(RRþR_t,_BackendRepository__next_segname_from_offsetRRâR¸R¹RÈRµR+RÌRÎRXRYRrtrstripR,RtaddRR$t&_BackendRepository__object_upload_taskRR»RRÏ(RÑR¤RëRéRÙtseg_fullnametsegnameRvR1R.RittempfsRdtargs1R`((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRê`s8
	
c	Cs9tjd||tjƒjfƒ|j|WdQXzfy|j||ƒWnKtk
r›}tj|ƒ|j||j	|j
|ƒWdQX‚nXWdtjƒt
j
|dƒX|j|j||j|krñi|j||<n||j||d<t|j||d<|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].NiRIRK(R»RpRRRRt
upload_objectRRRRÏRÖRÛR¸RþR_(	RÑRfRŠR1R¤RëR‡RÙR`((s6/usr/lib/python2.7/site-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 foundiRIRÆRÏRËt
out_directorytout_filetrb(R_RTRURRRþRtSEGMENT_FORMATRSRÌR„RÎRµR+R÷R,Rtdownload_objectRXtreadt	bytearrayR»R(
RÑR¤RëRÙR‡R.RiR‰R1RŠRdRéR`((s6/usr/lib/python2.7/site-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.RiR1RŠR`((s6/usr/lib/python2.7/site-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/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(NR8R9R:R;s%016xRËRY(RµR+R÷RcR¸R¹RÈRSR,Rt
list_segments(RÑR.RvRëR1R¦((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRgâ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ÿÿÿÿiRJi(RÌRþRR÷RáRâRgRrRRSRsRÇ(	RÑR¹RëR.RËRvR}R~tfiles((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(
NRIs
-segments/issegments-dirs	-segmentsiiÿÿÿÿRJi(RRÌRþRR÷RÇRgRrRRSRs(
RÑR¹RëR.RËRaRvR}R~R—((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>4stst_atimetst_ctimetst_gidtst_modetst_mtimetst_nlinkRptst_uidit
st_blksizet	st_blocksN(sst_atimesst_ctimesst_gidsst_modesst_mtimesst_nlinksst_sizesst_uid(
R¸R¹tisdirtlstattdictRSRR»RR÷(RÑtobject_cache_patht	stat_infoR((R>s6/usr/lib/python2.7/site-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((NRYR8R9R:R;RËRžR¢R<tETagRktContentTypeRmt	timestampRœRR iR¡iíRŸtauthorized_keyi€tsizeRpit	directoryiiiýAiét4913iÿÿÿÿt~c3s$|]}|tˆ|ƒfVqdS(N(Rš(R›R•(R>(s6/usr/lib/python2.7/site-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{RRSR_R)R¸R¹RºtmkdirRRÈR(R¦RÀRrR^tlist_objectsRWR»RptendswithR§(
RÑR¤RÙR_RR.RËR1R¦tcontainer_pathR`tmkdirsRŠ((R>s6/usr/lib/python2.7/site-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(NR8R9R:R;RËRYRÆRóiés	-segmentst	_segments(RÌRµR+R÷RcR,RR´R¸R¹RÈR(RVRÀRRt(RÑR¤RÙtlistingR.RËR1R¦tdirentstlstt	componenttrestR·tr((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRò®sB




		

cCsdS(N((RÑR¤Ró((s6/usr/lib/python2.7/site-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RIssegments-dirRYRÆ(RµR+R,R2R?RRReRR÷trmdir_objectR¸trmdirR)RR»RRÌR”(RÑR¤RR1tobj_manifesttobj_metadataRgtmanRvR¦R`R.RiRŠ((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,RR=RR»RRterrnotENOENTRS(	RÑR¤R1RŠtstvR`RÄRÆtdt((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,Rtmkdir_objectRRR)RcR¸R¹RÈRV(
RÑR¹RótistR.RiR1R¦R`t
cache_path((s6/usr/lib/python2.7/site-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»RRrRRÉt	ENOTEMPTYR¿tinsertRâR*R¸R¹R¥RÀR)(
RÑR¹R.RiR1RŠt	dir_itemsR`tsegment_cache_pathRÏ((s6/usr/lib/python2.7/site-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/site-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/site-packages/s3fuse/s3vaultfuse.pyRÖzs
cCstdƒ‚dS(NsNot Applicable(R(RÑRIttarget((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytsymlinkƒsc
Cs…|jj|dƒrMtjdƒ|jj|dƒrMtd|ƒ‚qMntjd||fƒ|d}y|j|dt	ƒWn tk
r§}tj
|ƒnXye|j|ƒ}|j|ƒ}|jd|dƒ|jd|dƒkr|j|dt	ƒdSWntk
r"}nXt}yÛy|j|ƒ}Wntk
rT}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
r)}tj
|ƒ‚nXzyõ|j
|ƒ}|j|ƒ}|jd|dƒ}	g}xG|D]?}|ji|d	d
6|dd6|d
d
6|dd6ƒqqW|j||di|	d6|dd6|dd6ƒy|j|dt	ƒWn tk
r }tj
|ƒnXWntk
r8‚nXWd|r€y|j|dtƒWq€tk
r|}tj
|ƒq€XnXdS(Nis%s in use. Try againsrename, %s -> %sR²Rssegments-dirs	-segmentsiRIR¹RnRkRlRmR6s
segment-counts
total-size(RþRR÷RTRURR»RRõR_RR?RcR2RR7RÀ(
RÑtoldtnewtnewbak_nameR`tnew_metadatatold_metadatatnewfile_existstnew_manifestRvtnewbak_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ÌR)R¸R¹RÈtlink(RÑRÙRIR.RË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ÌR)R¸tutimeRÀ(RÑR¹ttimesR.RËRÏ((s6/usr/lib/python2.7/site-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/site-packages/s3fuse/s3vaultfuse.pytdestroys
(N(,RÝRÞRÒRRRRÌR(R*R)R2R7R?R¬RçRuR]RîRêR†RÅRìRíR÷RðRgRƒR™RªRñRòRôRcRõRöR³RÀRÕRÖRÚRäRåRêRî(((s6/usr/lib/python2.7/site-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ÖRqRÀR{R¢RžR¶R7RÈR8R
tensure_treeRìRSRSRTtmount(RÑRàRñR©RØt
tmpfs_sizettmpfs_buffer_cfg((s6/usr/lib/python2.7/site-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/site-packages/s3fuse/s3vaultfuse.pyRçRs
c	CsÉtjd|tjƒjfƒ|j|}|d}|dfyMxFtr|jƒ\}}|drH|jj	|||d|ƒqHqHWWnt
k
r¢nXWdQX|rÅ|jj||ƒndS(NsCache object_flush [%s] [%x]RòRøRKtdata(R»RRRRRòR_tpopitemRñRêtKeyErrorR](RÑR¤RÙtupdate_manifesttitemtcacheRè((s6/usr/lib/python2.7/site-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/site-packages/s3fuse/s3vaultfuse.pyRîvscCs|jj|||ƒdS(N(RñRð(RÑR¤RïRÙ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRð€sccsmxf|dkrh|tjtj}||}t|tj|ƒ}|||fV||7}||8}qWdS(Ni(R¶RSRo(RÑRëRït
seg_offsettbasetseg_len((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt_walk_segmentsƒs

c
Cs®tƒ}|j|dˆx€|j||ƒD]l\}}}y|j|d|d}	Wn(tk
r„yó|j|d}
t|
ƒtjkr!|
jƒ\}}|dr!|jj	|||d|ƒ|j|dcd8<|j|ds|jj
||ƒt|j|d<qq!n|jj|||ƒ}	it
d6|	d6|j|d|<Wq…tk
r€}
tj|
ƒdSXnX||	|||!7}q.WWdQXt|ƒS(NRøRòRüRKRùii(R“RòRRÀRrR¶RTRýRñRêR]RûRìRcRR»Rtbytes(RÑR¤RïRëRÙt
output_buft	segoffsetRRtsegdataRRèRR`((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_readŽs@			

	

	
	
	c
Cs:tjd|tjƒjfƒt|ƒ}d}|j|dëxã|j||ƒD]Ï\}}}	|j|d}
||
kr°t|
ƒtj	kr&|
j
ƒ\}}|dr&|jj|||d|ƒ|j|dcd8<|j|ds#|jj
||ƒt|j|d<q#q&nyO|jj|||ƒ}
|
dkr\td	ƒ‚nitd6|
d6|
|<Wq¾tk
r¬tdƒ}
itd6|
d6|
|<q¾Xn|
|d}
t|
ƒ|krò|
jd
||	t|
ƒƒn||||	!|
|||	+t|
|d<||	7}qWWWdQXt|ƒS(NsCache object_write [%s] [%x]iRøRòRKRüRùisObject not foundt(R»RRRRRrRò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/site-packages/s3fuse/s3vaultfuse.pytobject_writeÇsL	
	

	
"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¹R_((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÀscCs"|jj|ƒ}tj||ƒS(N(Rñ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¹R×RØR_((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÖ&sN(RÝRÞRÒRçR_RRîR÷RðRRRR³RÀRÕRÖ(((s6/usr/lib/python2.7/site-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/site-packages/s3fuse/s3vaultfuse.pyRÒ+s	cCs|jj||ƒdS(N(RñRô(RÑR¹Ró((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytaccess3scCs|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×RØ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÖ9scCs|jj||ƒS(N(RñRñ(RÑR¹RÙ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRš<sccsBddg}|j|jj||ƒƒx|D]}|Vq/WdS(NRJs..(R
RñRò(RÑR¹RÙRºR¾((s6/usr/lib/python2.7/site-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/site-packages/s3fuse/s3vaultfuse.pyRFscCstj|jj|ƒ||ƒS(N(R¸tmknodRñRã(RÑR¹Rótdev((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRXscCs|jj|ƒS(N(RñRÀ(RÑR¹((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÀ[scCs|jj||ƒS(N(RñR³(RÑR¹Ró((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.pytstatfsascCs|jj|ƒS(N(RñRõ(RÑR¹((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytunlinkdscCs|jj||ƒS(N(RñRÚ(RÑRIRÙ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÚgscCs|jj||ƒS(N(RñRä(RÑRÛRÜ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRäjscCs|jj||ƒS(N(RñRå(RÑRÙRI((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRåmscCs|jj||ƒS(N(RñRê(RÑR¹Ré((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRêpscCs|jj||ƒS(N(RRç(RÑR¹Ró((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRXvscCs|j|tjƒS(N(RXR¸tO_CREAT(RÑR¹Rótfi((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytcreateyscCs|jj||||ƒ}|S(N(RR(RÑR¹RïRëRÙRé((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR’|scCs|jj||||ƒS(N(RR(RÑR¹RéRëRÙ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRY€scCs|jj||d|ƒdS(NRÙ(RRð(RÑR¹RïRÙ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyttruncateƒscCs|jj||ƒdS(N(RR(RÑR¹RÙ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytflush†scCs|jj||ƒdS(N(RRî(RÑR¹RÙ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRۉ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ÒRRÕRÖRÅRšRRRRÀR³RRRÚRäRåRêRXRR’RYRRRÛRî(((s6/usr/lib/python2.7/site-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ºRXR’RYRR+RÏRÖ(t	conf_filetfoundRdtlinetstoutf((s6/usr/lib/python2.7/site-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	cacherootR`txttvaultplugintdisable_fuse_threads((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytmain¨s8
!A	cCs%tƒtƒttjtjƒdS(s$Main routine that drives fuse mount.N(R¼R'R7R¶R6R7(((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÔst__main__(mRR¸tgrptsysRÉRTRZR0Rª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_optsRqtenvirontflagtargvtsetupR4R·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'R7RRÝ(((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt<module>s¶
  

		






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