From e6e30d8c8f72b904b34e93d2b9c4aef39b965b59 Mon Sep 17 00:00:00 2001 From: Scott Moser Date: Thu, 28 Jan 2010 17:16:11 -0500 Subject: 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 --- ec2init/__init__.py | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) (limited to 'ec2init/__init__.py') diff --git a/ec2init/__init__.py b/ec2init/__init__.py index 5405b5e4..b88e3ddd 100644 --- a/ec2init/__init__.py +++ b/ec2init/__init__.py @@ -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 -- cgit v1.2.3