add the part-handler plugin
If a part of a multipart file is 'text/part-handler' then it is expected to be python code that implements 2 methods - list_types() list the types that this part-handler supports, return a list. ie: return(['text/plain']) - handle_parts(data,ctype,filename,payload) this method will be called: once, when loaded, with ctype == '__begin__' once per part once, at the end, with ctype == '__end__' - ctype is the content type ('text/plain') - filename is the filename portion of the mime data - payload is the content of the part - data is currently the cloud object, but this could change
This commit is contained in:
parent
00f8ad2d5e
commit
bb6aef06db
12
doc/examples/part-handler.txt
Normal file
12
doc/examples/part-handler.txt
Normal file
@ -0,0 +1,12 @@
|
||||
#part-handler
|
||||
# vi: syntax=python ts=4
|
||||
|
||||
def list_types():
|
||||
return(["text/plain", "text/go-cubs-go"])
|
||||
|
||||
def handle_part(data,ctype,filename,payload):
|
||||
if ctype == "__end__" or ctype == "__begin__": return
|
||||
|
||||
print "==== received ctype=%s filename=%s ====" % (ctype,filename)
|
||||
print payload
|
||||
print "==== end ctype=%s filename=%s" % (ctype, filename)
|
@ -8,7 +8,8 @@ starts_with_mappings={
|
||||
'#include' : 'text/x-include-url',
|
||||
'#!' : 'text/x-shellscript',
|
||||
'#cloud-config' : 'text/cloud-config',
|
||||
'#upstart-job' : 'text/upstart-job'
|
||||
'#upstart-job' : 'text/upstart-job',
|
||||
'#part-handler' : 'text/part-handler'
|
||||
}
|
||||
|
||||
# if 'str' is compressed return decompressed otherwise return it
|
||||
|
@ -30,6 +30,7 @@ import yaml
|
||||
|
||||
datadir = '/var/lib/cloud/data'
|
||||
semdir = '/var/lib/cloud/sem'
|
||||
pluginsdir = datadir + '/plugins'
|
||||
cachedir = datadir + '/cache'
|
||||
userdata_raw = datadir + '/user-data.txt'
|
||||
userdata = datadir + '/user-data.txt.i'
|
||||
@ -228,13 +229,37 @@ class EC2Init:
|
||||
func(data,"__end__",None,None)
|
||||
|
||||
def handle_handler(self,data,ctype,filename,payload):
|
||||
if ctype == "__begin__" or ctype == "__end__": return
|
||||
if ctype == "__end__": return
|
||||
if ctype == "__begin__" :
|
||||
self.handlercount = 0
|
||||
return
|
||||
|
||||
# add the path to the plugins dir to the top of our list for import
|
||||
if self.handlercount == 0:
|
||||
sys.path.insert(0,pluginsdir)
|
||||
|
||||
self.handlercount=self.handlercount+1
|
||||
|
||||
# write content to pluginsdir
|
||||
modname = 'part-handler-%03d' % self.handlercount
|
||||
modfname = modname + ".py"
|
||||
util.write_file("%s/%s" % (pluginsdir,modfname), payload, 0600)
|
||||
|
||||
try:
|
||||
mod = __import__(modname)
|
||||
lister = getattr(mod, "list_types")
|
||||
handler = getattr(mod, "handle_part")
|
||||
except:
|
||||
import traceback
|
||||
traceback.print_exc(file=sys.stderr)
|
||||
return
|
||||
|
||||
# - do something to include the handler, ie, eval it or something
|
||||
# - call it with '__begin__'
|
||||
handler(data, "__begin__", None, None)
|
||||
|
||||
# - add it self.part_handlers
|
||||
# self.part_handlers['new_type']=handler
|
||||
print "Do not know what to do with a handler yet, sorry"
|
||||
for mtype in lister():
|
||||
self.part_handlers[mtype]=handler
|
||||
|
||||
def handle_user_script(self,data,ctype,filename,payload):
|
||||
if ctype == "__end__": return
|
||||
|
@ -24,7 +24,8 @@ starts_with_mappings={
|
||||
'#include' : 'text/x-include-url',
|
||||
'#!' : 'text/x-shellscript',
|
||||
'#cloud-config' : 'text/cloud-config',
|
||||
'#upstart-job' : 'text/upstart-job'
|
||||
'#upstart-job' : 'text/upstart-job',
|
||||
'#part-handler' : 'text/part-handler'
|
||||
}
|
||||
|
||||
def get_type(fname,deftype):
|
||||
|
Loading…
x
Reference in New Issue
Block a user