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:
Scott Moser 2010-01-28 17:16:11 -05:00
parent 00f8ad2d5e
commit bb6aef06db
4 changed files with 45 additions and 6 deletions

View 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)

View File

@ -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

View File

@ -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

View File

@ -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):