Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
ó
s	”dc @sdZddlZddlZddlZddlZddlZddlZddlmZddlZddl	Z	ddl
Z
ddlZddlZddlm
Z
ddlmZyddlmZmZWn'ek
rýddlmZmZnXddlmZy ddlmZmZmZWn-ek
r]ddlmZmZmZnXdd	lmZdd
lmZyddl m!Z!Wn!ek
rµddl"m!Z!nXddl#m$Z%dd
l&m'Z'ddl(m)Z)ddl(m*Z*dZ+dZ,dZ-dZ.e!j/dddde0ddƒe!j/dddde0ddƒgZ1e!j2ddddd ƒe!j2d!dddd"ƒe!j2d#dddd$ƒe!j2d%de3dd&dd'ƒe!j2d(de+dd)dd*ƒe!j2d+ddd,d-dd.ƒe!j2d/d,d0dd1ƒe!j/d2de0dd3ƒe!j2d4dd5dd6ƒg	Z4e!j/d7de5dd8ƒe!j/d9de0dd:ƒe!j/d;de0dd<ƒe!j/d=de0dd>ƒe!j6d?dd@ddAƒgZ7e!j6dBddCddDƒe!j6dEddFddGƒe!j2dHddIddJƒe!j2dKddLddMƒe!j2dNddOddPƒe!j2dQddRddSƒe!j2dTddUddVƒe!j2dWddXddYƒe!j8dZdd[d\d]d^d_d`gddaƒe!j/dbde0ddcƒe!j/ddde0ddeƒe!j2dfddgddhƒe!j2diddgddjƒe!j6dkddlddmƒgZ9e!j2dnddoddpƒe!j2dqddrƒe!j2dsddtddrƒe!j6dude-ddvƒe!j6dwde.ddxƒe!j6dyddzdd{ƒe!j6d|dd}d~d~ddƒe!j6d€ddddƒe!j2d‚ddƒdddd„ƒe!j2d…dd†dd‡ƒe!j2dˆdd‰ddŠƒe!j2d‹dd‰ddŒƒe!j2ddd‰ddŽƒe!j2ddd‰ddƒe!j2d‘dd‰dd’ƒe!j2d“dd”dd•ƒe!j2d–de'ƒdd—ƒe!j2d˜dddd™ƒe!j2dšdd›ddœƒe!j2dddžddŸƒe!j2d ddždd¡ƒe!j2d¢dd£dd¤ƒe!j2d¥dd¦dd§ƒe!j2d¨dd©ddªƒe!j2d«dd¬dd­ƒe!j/d®de0dd¯ƒe!j/d°de0dd±ƒgZ:e!j;Z;e;j<e:ƒe;j=e4ƒe;j=e7ƒe;j=e9ƒe;j=e1ƒy$e>ej?d²ƒZ@e;e@gƒWn"ek
rQe;ejAd@ƒnXd³e;jBƒkpsd³e*jCƒkr‰dd´lDmEZEnddµl(mFZEe%jGe!j;e;jHjIƒƒe%jJe;jHjIƒƒZKy˜e;jLjIƒdkrûeKjMjNe%jOƒnie;jLjIƒd¶kr&	eKjMjNe%jPƒn>e;jLjIƒd·krQ	eKjMjNe%jQƒneKjMjNe%jRƒWn'ek
rŽ	eKjMjNe%j%jRƒnXi&e3d¸6d@d6gd¹6dºd»6i
e3d¼6e3d½6e3d¾6e3d¿6e3dÀ6e3dÁ6e3dÂ6e3dÃ6e3dÄ6e3dÅ6e3dÆ6e3dÇ6e3dÈ6dÉ6e5dÊ6e3dË6d‰dÌ6d‰dÍ6ej?jSd΃dÏ6ej?jSdЃdÑ6ej?jSd҃dÓ6d‰dÔ6d‰dÕ6e3dÖ6e5d×6e0dØ6e3dÙ6d‰dÚ6d‰dÛ6d‰dÜ6e3dÝ6e0d¶6ddÞ6e3dß6gdà6e0d6e0dá6e5dâ6e0dã6e0dä6e5då6dædç6dædè6dædé6dædê6e0dë6e3dì6ZTdí„ZUdæZVdîZWejXƒZYejZej[ƒƒj\Z]dïZ^dðZ_dñ„Z`dò„Zadó„Zbdôecfdõ„ƒYZddöedfd÷„ƒYZedøecfdù„ƒYZfdúefdû„ƒYZgdüdý„Zhdþ„Zidÿ„Zjekdkr
ejƒndS(sd Trilio Fuse plugin implimentation

    This module is based on the vaultfuse.py module and will eventually
    become the new vaultfuse.py module once integration and refactoring
    of the existing vaultswift.py is complete.

    Currently this module is temporary for the 2.6 release and will be merged
    into a new vaultfuse.py for the next release.
iÿÿÿÿN(tdatetime(tThread(tgetpwnam(tQueuetEmpty(tLRUCache(tFUSEtFuseOSErrort
Operations(tClientError(tbunchify(tcfg(tlog(tget_ssl_cert_path(tvaults3(t
config_parsers%Y-%m-%d %H:%M:%Ss$80bc80ff-0c51-4534-86a2-ec5e719643c2iditdebugtshorttdtdefaultthelpsUPrint debugging output (set logging level to DEBUG instead of default WARNING level).tverbosetvsWPrint more verbose output (set logging level to INFO instead of default WARNING level).s
log-configtmetavartPATHsßIf this option is specified, the logging configuration file specified is used and overrides any other logging options specified. Please see the Python logging module documentation for details on logging configuration files.slog-config-appends(Optional) Log Appendswatch-log-files(Optional) Watch logs
log-formattFORMATsÞA logging.Formatter log message format string which may use any of the available logging.LogRecord attributes. This option is deprecated.  Please use logging_context_format_string and logging_default_format_string instead.slog-date-formattDATE_FORMATsCFormat string for %%(asctime)s in log records. Default: %(default)sslog-filetdeprecated_nametlogfilesZ(Optional) Name of log file to output to. If no default is set, logging will go to stdout.slog-dirtlogdirs@(Optional) The base directory used for relative --log-file pathss
use-syslogsUse syslog for logging.ssyslog-log-facilitytLOG_USERs$syslog facility to receive log linest
use_stderrsLog output to standard errortuse_journals%Enable Systemd native journal supporttuse_eventlogs Log output to Windows Event Log.tuse_jsons4Enables JSON formatting in the logs when set to Truetrate_limit_burstisBurst limittlog_rotate_intervalis0Interval, number of hours, of log rate limiting.tmax_logfile_counti<sNumber of log files to retain.tlog_rotate_interval_typetHourssUnits of log rotation intervaltlog_rotation_typetintervalstype of log retentiontlogging_context_format_stringsw%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user)s %(tenant)s] %(instance)s%(message)ss2format string to use for log messages with contexttlogging_default_format_stringsV%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)ss5format string to use for log messages without contexttlogging_debug_format_suffixs$%(funcName)s %(pathname)s:%(lineno)ds0data to append to log format when level is DEBUGtlogging_exception_prefixs?%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)ss5prefix each line of exception output with this formattdefault_log_levelssamqplib=WARNssqlalchemy=WARNs	boto=WARNs	suds=INFOs
keystone=INFOseventlet.wsgi.server=WARNslist of logger=LEVEL pairstpublish_errorsspublish error eventstfatal_deprecationssmake deprecations fataltinstance_formats[instance: %(uuid)s] sBIf an instance is passed with the log message, format it like thistinstance_uuid_formatsGIf an instance UUID is passed with the log message, format it like thistrate_limit_intervalis2Interval, number of seconds, of log rate limiting.tvault_storage_typets3s'Storage type: nfs, swift-i, swift-s, s3tvault_data_directorys'Location where snapshots will be storedtvault_data_directory_olds/var/triliovaulttqueue_depths-The number of writes to be queued (writeback)tworker_pool_sizes3Number of worker threads to process the write queuetvault_retry_countis(The number of times we retry on failurestvault_segment_sizei isvault object segmentation sizetvault_cache_sizes6Number of segments of an object that need to be cachedt
rootwrap_confs/etc/nova/rootwrap.confsrootwrap config filetvault_s3_auth_versiontDEFAULTsS3 Authentication typetvault_s3_access_key_idts	S3 Key IDtvault_s3_secret_access_keysS3 Secret Access Keytvault_s3_region_names	S3 Regiontvault_s3_buckets	S3 Buckettvault_s3_endpoint_urlsS3 Endpoint URLtvault_s3_ssltFalsesEnable SSL certificatetvault_s3_ssl_certsUse SSL certificate bundletvault_s3_signature_versionsS3 signature version to usetvault_s3_read_timeoutt30s3Time in seconds to wait for a response to API callstvault_enable_threadpooltTruesEnable backend thread pooltvault_threaded_filesystems"Allow multiple file system threadstmax_uploads_pendingt20sNumber of file uploads.tvault_cache_usernametnovasSystem username.tvault_logging_levelterrors0Logging level filter (debug, info, warn, error).tvault_s3_max_pool_connectionst500s>The maximum number of connections to keep in a connection pooltbucket_object_locks#S3 bucket object locking is enabledtuse_manifest_suffixsyTo preserve backward compatibility, set this to False.When set to False, s3fuse creates manifest file nameswithout suffixtFLAGts3fuse_sys_admin(tfs(tutilstinfotwarntsync_totheaders1.0tauth_versiontproject_nametregion_nametuser_domain_namet
endpoint_typetobject_storage_urltproject_domain_idtuser_idtuser_domain_idt	tenant_idtservice_typet
project_idt
auth_tokentproject_domain_namet
os_optionstssl_compressiontos_storage_urltos_usernametos_passwordt	OS_CACERTt	os_cacerttOS_CERTtos_certtOS_KEYtos_keytos_tenant_nametos_auth_urlt
os_auth_tokentinsecuretsnettsync_keytauthtusertkeytread_acltretriest	write_acltmetatuse_slotchecksumtchangedtleave_segmentstskip_identicali
tsegment_threadstobject_dd_threadstobject_uu_threadstcontainer_threadstyes_alltobject_namecCs4dtd<tjtd<tjtd<tjtd<tjtd<tjtd<tjtd<tjtd	<tj	td
<dtd<d
td<tj
r£tj
tdd<ntjrÀtjtdd<ntjj
ƒdkrötjdtjƒdtd<n:tjj
ƒdkr0tjjtjƒr0tjtd<ndS(Ns1.0RaRR‚tbucketts3_signaturets3_read_timeoutRURWRXRAts3_ssl_certt
GOVERNANCEtretention_modeRoRfRctfalsescInvalid S3 SSL cert file path: %sUsing Default path, set the value to False for insecure connectionttrue(toptionstCONFR@RBRDRIRJRURWRXRERCRFtlowertLOGR^RHtostpathtexists(((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt
option_configs.










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

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




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
















cCsSy,tjƒ}t|ƒ}|j||ƒWn tk
rN}tj|ƒnXdS(sý Utility method to be dispatched to a worker
            thread in order to clean up old segments.

        Args:
            backend (class instance): Instance of the backend plugin.
            segment_list (list): List of segments to remove.
        N(RšRR
tdelete_object_listR÷RRø(R¹tbackendtsegment_listRRH((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt__purge_old_segments_task‰scCs |j||jƒ|j|xyP|j|jddt|dƒ}|j|ƒ\}}g}d}|j|d|dsnd}d}	d}
x³trL||j|kr·Pny%|j|j||d|ƒ}Wn?t	k
rt
jdƒ|j|j||d|ƒ}nX|j||d	rŸt|ƒ}t
|jtjƒ}
|ji|j||dd
6|jd6|jd6|
d
6|jd6ƒn‰|j||d
}
|ji|j||dd
6|j||jddƒd6|j||dd6|
d
6|j||dd6ƒ|tj7}|d7}|	|
7}	qšW|j||di|d6t|ƒd6t|	ƒd6ƒd}xátrj|rj|j|||ƒ}
t|
ƒdkrÄPnt|
ƒ}
y|j||d}Wn
d}nX|jdƒ}tt|
ƒt|gƒƒ}t|ƒdkrZ|j||j|j|ƒn|tj7}qWndSWn tk
r•}t j!|ƒnXWdQXdS(sé Handle object_close by updating the manifest.

         Waits for all of the background jobs to complete prior to updating
         manifest using the main thread. Also queues up tasks to clean up
         any old segments.
        ssegments-dirR¯s	-segmentsiR%R,R&iR)RŸR(tetagt
size_bytestcontent_typeRAthashiRs
segment-counts
total-sizeN("RãRRÞRÛRõR¼RµRMRÌR¥R4R5R
tmintst_sizeR›R;Rÿt
version_idRMRORtstrRKtlentsortedtstriptlistRïRt+_BackendRepository__purge_old_segments_taskR÷RRø(R¹R‘RÄtsegments_dirRR´RtsegmentsRÆt
total_sizetsegment_sizeR"tstattobjectstpt
purge_listRH((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR>˜s¤

	












cCsj|j||ƒ|j|G|j||ƒ|j|j|ƒ|j|j|ƒ|j|dj|ƒytj|ƒWntk
r’nXt	|j|dƒdkryD|jj|dƒ}|jj|dƒ}tj|j|ƒƒWntk
rnX|jj|ƒn|j
:|j|sZ||jkrZ|jj|dƒqZnWdQXWdQXdS(NR%i(R>RÞRãR?RäRÛRžR@R¥RURÔtremoveR½RáRâ(R¹R‘RÄtohtpios((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÉs,



c

Cs«|j|˜yU||j|krW|j||dtkrW|j||d}nL|j||ƒ}|j|jddt|dƒ}tjj||ƒ}t	j
ƒ}d|j|k|d<|j|ƒ\}	}
t|ƒ|d<|
j
dƒ|d	<t|ƒ}|	||dg}|j||j|ƒ|j||j|j||||||ƒWn;tk
r }tj|ƒ|j||j|ƒ‚nXWdQXdS(
NR)R&ssegments-dirR¯s	-segmentst0t
path_validR]R‘(RÞRÛRMt,_BackendRepository__next_segname_from_offsetRõR¼RžRŸR±RšRRµRUtrstripR
RätaddRãRt&_BackendRepository__object_upload_taskR÷RRøRb(
R¹R‘RÆRÃRÄtseg_fullnametsegnameRZRRtobjtargs1RH((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÅ)s6		
	
c	Csntjd||tjƒjfƒ|d}|d}	|d }|j|WdQXy%t|_|j|||	|ƒ}
WnOt	k
rË}tj
|ƒ|j||j||j|ƒWdQX‚nX|j|||j
|kri|j
||<n||j
||d<t|j
||d<|
jddƒ|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].iiNR&R)t	VersionIdRAR((RR]RßRóRôRÞRMRft
put_objectR÷RøRäRbRÛRõ(R¹RJRnRR‘RÆRkRÄRÃtbuf_lentrespRH((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt__object_upload_taskPs.


	
!cCsKxžtr tjdƒ|j|x||j||krAwn||j|krtd|tt|ƒtdƒfƒ‚n|j||d}PWdQXqW|j	|j
dƒƒ\}}i}|j||jddƒ|d<t|ƒ}||g}y#|j
j||ƒ}	t|	ƒSWn#tk
rF}
tj|
ƒ‚nXdS(	Ngš™™™™™¹?sobject %s not found iR&R¯R(RARS(RMR4R5RÞRäRÛR÷tSEGMENT_FORMATR.RµRhRõR
RÝt
get_objectt	bytearrayRRø(R¹R‘RÆRÄRkRRmRRnRÃRH((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÇus.	
$
c
CsÉ|jj|tjƒƒ|j||j|ƒ\}}tjƒ}t|ƒ}|g}|dkr…|dkr…|j|ƒny|j	j
||ƒWn tk
r¾}tj
|ƒnXWdQXdS(NRAR¯(RÞR0RßR1RµRšRR
RÿRÝt
delete_objectR÷RRø(R¹R‘RRmRRnRH((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRȓs		
cCs3|r
dS|j|tjƒ}|j||ƒdS(N(RÁRžR=RÉ(R¹R‘RÊRÄ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR˦scCsštjƒ}d|d<t|d<t|d<t|d<tjj|dt|ƒƒ|d<g}|dkrrg}n	|g}t|ƒ}|j	j
||ƒS(NRRRRs%016xR´RA(RšRRÔRGRžRŸR±R.R
RÝt
list_segments(R¹RRZRÆRR§((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRK¬s



#		c	Cs
|j|ƒ\}}|j|jddƒ}|r}|jdtƒr_|j|ƒ\}}n|j|ƒ\}}|}n
|d}|j|||ƒ}t|ƒdkrÈtt	|ƒt	dƒfStt	|ƒt	t
|ƒdj|ƒdjdƒddƒdfS(	Nssegments-dirR¯s	-segmentsiiÿÿÿÿiR'i(RµRÛRõRÔR»R¼RKRURtR.RVR°(	R¹RŸRÆRR´RZtcR`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(
NR&s
-segments/issegments-dirs	-segmentsiiÿÿÿÿR'i(RÞRµRÛRõRÔR°RKRURtR.RV(
R¹RŸRÆRR´RDRZRyR`Rz((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytcurr_segname_from_offsetÓs (	
	c
s’tjj|ƒrŽyUtj|ƒ‰t‡fd†dDƒƒ}d
|d<t|dd
ƒ|d<|SWn tk
r‰}tj|ƒnXd
Sd
S(së Utility to check the tmpfs cache and return stat() from that.

         This method looks to see if the object (directory) exists in the
         local cache and will perform a stat() locally instead of calling
         all the way to the backend.

        Args:
            object_cache_path (str): Cache path to the object we
                                     need stat infor on.

        Returns:
            Dictionary of stat() information or None if object does not exist.
        c3s$|]}|tˆ|ƒfVqdS(N(tgetattr(t.0R‚(R"(s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pys	<genexpr>ÿstst_atimetst_ctimetst_gidtst_modetst_mtimetst_nlinkRRtst_uidit
st_blksizet	st_blocksN(sst_atimesst_ctimesst_gidsst_modesst_mtimesst_nlinksst_sizesst_uid(
RžRŸtisdirtlstattdictR.R÷RRøRÔ(R¹tobject_cache_patht	stat_infoRú((R"s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt_stat_cacheìs(


c
s=|j|ƒ}|j|ƒ\}}tjƒ}|dkrEg}n	|g}d|d<t|d<t|d<t|d<d|d<t|ƒ}i}|dkr¸||d<|j|ƒnd}yÃ|jj	||ƒ‰|j
|d<|j|d<ˆd	jd
dƒ|d<ˆd	jddƒ|d
<ˆd	jddƒ|d<t
ˆdƒ|d<t
ˆdƒ|d<t
ˆdƒ|d<d|d<d|d<|dk	r³d|kr³d|d<nt
ˆdƒ|d<|ddkrã|dks+|ddkrÿ|dks+|ddkr|dks+ˆdtkr€d|d<d|d<d |d<|j|ƒ}	tjj|	ƒs€tj|	d!ƒq€nWn“tk
rÙytj|ƒWntk
rµnXtj|d"tƒtj|ƒn>tk
r}
tj|ƒ‰t‡fd#†d'Dƒƒ}nXd$|d%<t
|dd$ƒ|d&<|S((NRARRRRR´RR…RtETagRMRoRStContentTypeROt	timestampRR€RƒiR„iíR‚tauthorized_keyi€tsizeRRit	directoryiiiýAiét
ignore_errorsc3s$|]}|tˆ|ƒfVqdS(N(R}(R~R‚(R"(s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pys	<genexpr>VsiR†R‡(sst_atimesst_ctimesst_gidsst_modesst_mtimesst_nlinksst_sizesst_uid(R½RµRšRRÔRGR
RÿRÝR!RÚRhRõR.RMR
RžRŸR tmkdirR	RbR÷tshutiltrmtreeR‰RŠ(R¹R‘RÄRCRR´RR§Rtcontainer_pathRH((R"s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÌs€		
















cCs-ytj|dƒ}Wn#tk
r;}tj|ƒ‚nXd}x™||j|krÝy&|jj|j||d|ƒWn@tk
rÀt	j
dƒ|jj|j||d|ƒnX||j||d7}qEWy|jj||ƒWn1tk
r(t	j
dƒ|jj||ƒnXdS(Ns%Y-%m-%dT%H:%M:%SiR&iRN(RtstrptimeR÷RRøRÛRÝtput_object_segment_retentionR¥R4R5tput_manifest_retention(R¹R‘tretainuntiltdtRHRÆ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt_set_object_retentionjs(
	

	

c	CsC|j|tjƒ}zyì|j|Ùtj|j|ƒ}d}xF||j|kr|j||d}|j|dƒ||7}qHW|jddƒ|dkrÆ|j	||j
dƒƒn&|j
dƒ||<|jj||ƒ||j||<WdQXWn#t
k
r)}tj|ƒ‚nXWd|j||ƒXdS(NiRNR%Rœtutf8sutf-8(RÁRžR/RÞRtdeepcopyRÛR?RÔRžtdecodeRÝtupdate_object_attributesR÷RRøRÉ(	R¹R‘R&RRÄtattrsRÆR’RH((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_setxattrˆs,		

cCs|j|tjƒ}zñyÇ|j|´tj|j|ƒ}d}xF||j|kr|j||d}|j|dƒ||7}qHW|j|dƒ|jddƒ|j	j
||ƒ|j|j|dƒWdQXWn#tk
r}tj
|ƒ‚nXWd|j||ƒXdS(NiRNR%(RÁRžR/RÞRR RÛR?RÔRÝR¢R÷RRøRÉ(R¹R‘R&RÄR£RÆR’RH((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_removexattr¡s&	
!
cCs¢|j|tjƒ}zuyK|j|8tj|j|ƒ}|jdƒ|jƒ}|SWdQXWn#t	k
rˆ}t
j|ƒ‚nXWd|j||ƒXdS(NR%(
RÁRžR/RÞRR RÛR?tkeysR÷RRøRÉ(R¹R‘RÄR£R¦RH((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_listxattr¶s

cCs‡|j|tjƒ}zZy0|j|t|j||dƒSWdQXWn#tk
rm}tj|ƒ‚nXWd|j	||ƒXdS(Nsutf-8(
RÁRžR/RÞtbytesRÛR÷RRøRÉ(R¹R‘R&RÄRH((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_getxattrÅs"
ccs€g}|jdƒd}g}||jj|ƒ7}x(|D] }|j|jdƒdƒq<Wxt|ƒD]}|VqmWdS(NR¯iÿÿÿÿ(RhRÝtlist_objectsRÿR°RX(R¹R‘RÄtlistingtdir_pathtdirentstlsttr((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÍÐs
cCsdS(N((R¹R‘RÎ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÏÛscCs||td<tjƒ}t|ƒ}|sAyó|j|ƒ}|j|ƒ}g}x|D]}|j|dƒqVW|jj||ƒ|jdƒ}|dk	r|g}	|jj
|	|ƒytj|j
|ƒƒWntk
rènXytj|j
|ƒƒWqtk
rqXnWqAtk
r=}
tj|
ƒqAXny|jj|ƒWn tk
rw}
tj|
ƒnXdS(NRŠR&ssegments-dir(RšRR
RR#RÿRÝRIRõRÔtrmdir_objectRžtrmdirR
R¥RbR÷RRøtdelete_object_manifest(R¹R‘RŠRtobj_manifesttobj_metadataRKtmanRZR§RH((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-bytesRsx-account-bytes-usediÿÿÿÿR’tf_blockstf_bfreetf_bavailitf_favailtf_frsize(RšRR
RÝR!R÷RRøRterrnotENOENTR.(	R¹R‘RRntstvRHR¶R¸R((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÑs*





c
Csütjd|ƒ|j|ƒ\}}tjƒ}t|ƒ}||g}y|jj||ƒWn!tk
r„}tj	|ƒdSX|j
|ƒ}	|tkrÁ|j
tj
j||ƒƒ}	nytj|	|ƒWn tk
r÷}tj	|ƒnXdS(Ns	mkdir, %si(RRRµRšRR
RÝRR÷RøR
RGRžRŸR±R7(
R¹RŸRÎtistRRmRR§RHt
cache_path((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR• s$
!cCsO|j|ƒ\}}tjƒ}d|d<t|ƒ}|jdƒd}g}y ||jj|ddƒ7}Wn tk
r’}t	j
|ƒnXt|ƒdkr·tt
jƒ‚ny#|jj|jdƒg|ƒWn tk
rü}t	j
|ƒnXtjjt|jdƒƒ}y ||jj|ddƒ7}Wn tk
r]}t	j
|ƒnXt|ƒdkr¹y#|jj|jdƒg|ƒWq¹tk
rµ}t	j
|ƒq¹Xny5|j|ƒ}	tjj|	ƒrítj|	ƒnWntk
rnXy5|j|ƒ}
tjj|
ƒr6tj|
ƒnWntk
rJnXdS(NR´R¯t	max_itemsii(RµRšRRÔR
RhRÝRªR÷RRøRURR»t	ENOTEMPTYR°RžRŸR±R¼RRRˆR–R—R¥R
(R¹R‘RRmRRŸt	dir_itemsRHtseg_pathtsegment_cache_pathR¿((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR±@sR
 #
 #


cCsptjd|ƒyG|j|ƒ\}}|jtjj||ƒƒ}tj||ƒSWntk
rknXdS(Ns	chmod, %s(	RRRµR
RžRŸR±tchmodR¥(R¹RŸRÎRR´R¿((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÅws
cCsstjd|ƒyJ|j|ƒ\}}|jtjj||ƒƒ}tj|||ƒSWntk
rnnXdS(Ns	chown, %s(	RRRµR
RžRŸR±tchownR¥(R¹RŸtuidtgidRR´R¿((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÆ€s
cCstdƒ‚dS(NsNot Applicable(R÷(R¹R&ttarget((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytsymlink‰sc
Cs§|jj|dƒ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
rPnÂX|j
|ƒ}|jd|dƒ}	g}
xZ|D]R}|
ji|d	d
6|dd6|d
d
6|jddƒd6|dd6ƒqƒW|j||
di|	d6|dd6|dd6ƒt	}Wn#tk
r8}tj
|ƒ‚nXz#y|j
|ƒ}|j|ƒ}|jd|dƒ}	g}xZ|D]R}|ji|d	d
6|dd6|d
d
6|jddƒd6|dd6ƒq€W|j||di|	d6|dd6|dd6ƒy|j|dt	ƒWn tk
rB}tj
|ƒnXWntk
rZ‚nXWd|r¢y|j|dtƒWq¢tk
rž}tj
|ƒq¢XnXdS(Nis%s in use. Try againsrename, %s -> %st~RŠssegments-dirs	-segmentsiR&RŸRPRMRNR(RARORs
segment-counts
total-size(RÛRõRÔR4R5R÷RRRÐRMRøR#RGRRÿRR¥(
R¹toldtnewtnewbak_nameRHtnew_metadatatold_metadatatnewfile_existstnew_manifestRZtnewbak_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ÉR&RR´tcache_path_targettcache_path_name((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÖþscCs_tjd|ƒt|ƒ\}}|j|ƒ}ytj||ƒWntk
rZdSXdS(Nsutimens, %si(RRRµR
RžtutimeR¥(R¹RŸttimesRR´R¿((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytutimenss
cCsdS(Ni((R¹RŸ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytdestroys(N(1RÒRÓRºRRçRåRµR	RR
RRRR#RÁRYR>RÉRÅRjR®RÇRÈRÔRËRKRgR|RRÌRžR¤R¥R§R©RÍRÏRGRÐRÑR•R±RÅRÆRÊRÕRÖRÛRÜ(((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÕsV	)#								<	”		s		'	%					*T							#	 	7						r	t	FuseCachecBszeZd„Zd„Zed„Zd„Zdd„Zd„Z	d„Z
d„Zd„Zd	„Z
d
„Zd„ZRS(
cCs.||_||_i|_tjƒ|_ttƒj|_	ttƒj
|_tj
j|jƒsÁyDtj|jƒtj|jt|j	ƒdt|jƒgƒWq*tk
r½‚q*Xnitj|jƒ}|j|j	ks÷|j|jkr*tjtjt|j	ƒdt|jƒgƒndS(Nt:(R¸t
repositorytlrucacheRßRàt
lrucache_lockRR×RØRhRÙRÚRžRŸRˆR[R•RÆRTR¥R^R…RR›R7(R¹R¸RßRŒ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRº-s$			(

c
Csš|jj||ƒ}|jv|jj|iƒ|j|j|dƒ}|j|j|itdtj	ƒd6t
jƒd6|d6td6ƒWdQX|S(NtmaxsizeRàtlrulockR‘twrites_before_update_manifest(
RßRÁRáRàR0R?RÔRR›R<RßRàtNUMBER_UPLOADS_BEFORE_FLUSH(R¹R‘RÀRÄtitem((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÁCs

c	CsÍtjd|tjƒjfƒ|j||}|d}|dfyMxFtr‘|jƒ\}}|drL|jj	|||d|ƒqLqLWWnt
k
r¦nXWdQX|rÉ|jj||ƒndS(NsCache object_flush [%s] [%x]RàRãR)tdata(RRRßRóRôRàRMtpopitemRßRÅtKeyErrorR>(R¹R‘RÄtupdate_manifestRætcacheRÂ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_flushSs 
	
	

cCstjd|tjƒjfƒ|j||dtƒ|jE|j|j	|dƒt|j|ƒs€|jj	|dƒnWdQX|jj
||ƒdS(NsCache object_close [%s] [%x]Rê(RRRßRóRôRìRGRáRàR?RÔRURßRÉ(R¹R‘RÄ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÉjs
cCs|jj|||ƒdS(N(RßRË(R¹R‘RÊRÄ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRËwsccsmxf|dkrh|tjtj}||}t|tj|ƒ}|||fV||7}||8}qWdS(Ni(R›R;RQ(R¹RÆRÊt
seg_offsettbasetseg_len((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt_walk_segmentszs

c
CsÊtƒ}|j||d x˜|j||ƒD]„\}}}y!|j||d|d}	Wn<tk
r y|j||d}
t|
ƒtjkr9|
jƒ\}}|dr9|jj	|||d|ƒ|j||dcd8<|j||ds6|jj
||ƒt|j||d<q6q9n|jj|||ƒ}	it
d6|	d6|j||d|<Wq¡tk
rœ}
tj|
ƒdSXnX||	|||!7}q2WWdQXt|ƒS(NRãRàRçR)Räii(RvRàRðR¥RUR›R<RèRßRÅR>RåRÇRGR÷RRøR¨(R¹R‘RÊRÆRÄt
output_buft	segoffsetRîRïtsegdataRëRÂRæRH((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_read…sB			


		
	!
	c
CsNtjd|tjƒjfƒt|ƒ}d}|j||dûxó|j||ƒD]ß\}}}	|j||d}
||
krÄt|
ƒtj	kr:|
j
ƒ\}}|dr:|jj|||d|ƒ|j||dcd8<|j||ds7|jj
||ƒt|j||d<q7q:nyO|jj|||ƒ}
|
dkrptd	ƒ‚nitd6|
d6|
|<WqÒtk
rÀtdƒ}
itd6|
d6|
|<qÒXn|
|d}
t|
ƒ|kr|
jd
||	t|
ƒƒn||||	!|
|||	+t|
|d<||	7}q[WWdQXt|ƒS(NsCache object_write [%s] [%x]iRãRàR)RçRäisObject not foundt(RRRßRóRôRURàRðR›R<RèRßRÅR>RåRÇRÔR÷RGR¥RvRMtextend(R¹R‘RÃRÆRÄRÊtbufptrRòRîRïRëRÂRæRó((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytobject_writeÀ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ŸRC((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR±scCs"|jj|ƒ}tj||ƒS(N(RßR½RžRÅ(R¹RŸRÎRC((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÅscCs%|jj|ƒ}tj|||ƒS(N(RßR½RžRÆ(R¹RŸRÇRÈRC((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÆsN(RÒRÓRºRÁRMRìRÉRÔRËRðRôRøR•R±RÅRÆ(((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÝ,s			
		;	T			tTrilioVaultcBseZdd„Zd„Zd„Zd„Zedd„ƒZd„Z	d„Z
d„Zd„Zd	„Z
d
„Zd„Zd„Zd
„Zd„Zd„Zd„Zd„Zd„Zdd„Zd„Zdd„Zd„Zd„Zdd„Zd„Zd„Zd„ZRS(cCs7||_|pt|ƒ|_t||jƒ|_dS(N(R¸RÕRßRÝRë(R¹R¸Rß((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRº%s	cCs|jj||ƒdS(N(RßRÏ(R¹RŸRÎ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytaccess-scCs|jj||ƒS(N(RßRÅ(R¹RŸRÎ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÅ0scCs|jj|||ƒS(N(RßRÆ(R¹RŸRÇRÈ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÆ3scCs|jj||ƒS(N(RßRÌ(R¹RŸRÄ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR}6scCs|jj|||ƒS(N(RßR¤(R¹RŸR&RR’((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytsetxattr:scCs>|jdƒs|jdƒr+tddƒS|jj||ƒS(NtsecuritytsystemRAsutf-8(R»R¨RßR©(R¹RŸR&((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytgetxattr=s
cCs|jj|ƒS(N(RßR§(R¹RŸ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt	listxattrBscCs|jj||ƒS(N(RßR¥(R¹RŸR&((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytremovexattrEsccsBddg}|j|jj||ƒƒx|D]}|Vq/WdS(NR's..(RöRßRÍ(R¹RŸRÄR­R¯((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytreaddirHs
cCsEtj|j|ƒƒ}|jdƒr=tjj||jƒS|SdS(NR¯(RžtreadlinkR½R»RŸtrelpathR¸(R¹RŸtpathname((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRNscCstj|jj|ƒ||ƒS(N(RžtmknodRßR½(R¹RŸRÎtdev((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR`scCs|jj|ƒS(N(RßR±(R¹RŸ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR±cscCs|jj||ƒS(N(RßR•(R¹RŸRÎ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR•fscCs|jj|ƒS(N(RßRÑ(R¹RŸ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytstatfsiscCs|jj|ƒS(N(RßRÐ(R¹RŸ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytunlinklscCs|jj||ƒS(N(RßRÊ(R¹R&RÉ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÊoscCs|jj||ƒS(N(RßRÕ(R¹RÌRÍ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÕrscCs|jj||ƒS(N(RßRÖ(R¹RÉR&((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÖuscCs|jj||ƒS(N(RßRÛ(R¹RŸRÚ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRÛxscCs|jj||ƒS(N(RëRÁ(R¹RŸRÎ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR9~scCs|j|tjƒS(N(R9RžtO_CREAT(R¹RŸRÎtfi((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytcreatescCs|jj||||ƒ}|S(N(RëRô(R¹RŸRÊRÆRÄRÃ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytread„scCs|jj||||ƒS(N(RëRø(R¹RŸRÃRÆRÄ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyR:ˆscCs|jj||d|ƒdS(NRÄ(RëRË(R¹RŸRÊRÄ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyttruncate‹scCs|jj||ƒdS(N(RëRì(R¹RŸRÄ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytflushŽscCs|jj||ƒdS(N(RëRÉ(R¹RŸRÄ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytrelease‘scCs!tjd|ƒ|jj|ƒS(Nsdestroy, %s(RRRßRÜ(R¹RŸ((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRܘsN( RÒRÓRÔRºRúRÅRÆR®R}RûRþRÿRRRRR±R•RRRÊRÕRÖRÛR9RRR:R
RRRÜ(((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRù$s:																						s/etc/fuse.confcCsd}tjj|ƒrft|dƒ:}x0|D](}d|kr1d|kr1d}Pq1q1WWdQXn|dkrd}tjj|ƒr¹t|dƒ}|jƒdd}WdQXntd	d
ƒ}|j|ƒWdQXtjd	|ƒtjd	ƒtj	ddgƒndS(
NiR¯tuser_allow_othert#isuser_allow_other 
trts
s/tmp/fuse.conf.tmptwts/etc/fuse.confs	root:root(
RžRŸR R9RR:R[RRbRÆ(t	conf_filetfoundRGtlinetstoutf((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt	fuse_confs"

c	CsÞyytj|dgƒWntk
r-nXtjj|ƒr¯tj|ƒ}ttƒj	}tt
ƒj}|j|koˆ|j
|kstj|dtdt
gƒqn\tj|dgƒtj|dgƒtj|tdt
gƒtj|tdt
gƒWn tk
r.}tj|ƒnXgtjtjƒD]-}tjtjjtj|ƒdtƒ^qBt|dt|ƒƒ}t}tjjƒdkr¯t}nt||d|d	td
tdtdtƒdS(
Ns-ls-RRÞs-pR”RßR™t	nothreadst
foregroundtnonemptyt
big_writestallow_other( R[tumountR¥RžRŸRˆR^RR×RØt
FUSE_GROUPRÙR…RRÆR•R÷RRøtlistdirR›R7R–R—R±RMRùRÕRNRœRGR(	t
mountpointt	cacheroottmountpoint_statRhRÚRHtxttvaultplugintdisable_fuse_threads((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pytmain±sB
$A	cCsNtƒtƒtjtƒ}|jtƒ|jtƒttj	tj
ƒdS(s$Main routine that drives fuse mount.N(R¡RRRÜRštvalidate_s3_clienttset_retention_modeR(R›R6R7(t	s3backend((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyRûãs

t__main__(lRüRžtgrptsysR»R4tgetpassRRR;R–R¬RßRtpwdRRRtImportErrortqueuet
cachetoolsRtfuseRRRR¥tfusepytbotocore.exceptionsR	ts3fuse.bunch_p3R
toslo_configRtoslo.configtoslo_logRR¢ts3fuse.utilsR
ts3fuseRRt_DEFAULT_LOG_DATE_FORMATR¼tQUEUE_DEPTHtWORKER_POOL_SIZEtBoolOptRGtcommon_cli_optstStrOptRÔtlogging_cli_optsRMtIntOpttgeneric_log_optstListOpttlog_optst
vault_optsR›t
register_optstregister_cli_optsRTtenvirontflagtargvtlist_all_sectionstsectionsts3fuse.privsepR[R\tsetupR4Rœt	getLoggerRRStloggertsetLeveltDEBUGtINFOtWARNR¤RõRšR¡tCACHE_LOW_WATERMARKtCACHE_HIGH_WATERMARKtgetuserR×tgetgrgidtgetgidtgr_nameR RtRåR®RµR¶tobjectR·RÕRÝRùRR(RûRÒ(((s6/usr/lib/python2.7/site-packages/s3fuse/s3vaultfuse.pyt<module>sv
 
 
			







	"		
	4ÿÿÿÿÿ øy	2