def _update(url): """ Update plugins from a repository :param url: the url of the repository """ dont_touch = ['', 'README', '.gitignore'] print ' --- updating plugins from %s ---' % url from zipfile import ZipFile as zip # download req = urllib2.urlopen(url) tmp_file = tempfile.NamedTemporaryFile(mode='wb', suffix='.zip', delete=False) tmp_file.write(req.read()) tmp_file.close() #extract tmp_dir = tempfile.mkdtemp() z = zip(tmp_file.name) for info in z.infolist(): f = info.filename p = os.path.sep.join(f.split(os.path.sep)[1:]) directory, filename = os.path.split(p) if filename not in dont_touch: data = z.read(f) out_path = os.path.join(tmp_dir, filename) if os.path.isdir(f): print '\t[mkdir] %s to %s' % (f, out_path) os.mkdir(out_path) else: print '\t[cp] %s to %s' % (f, out_path) with open(out_path, 'wb') as out: out.write(data) #removing files from plugins directory plug_dir = constants.plugin_directory() for f in os.listdir(plug_dir): if f not in dont_touch: print '\t[rm] %s' % os.path.join(plug_dir, f) os.remove(os.path.join(plug_dir, f)) #move new files to plugin directory for plug in os.listdir(tmp_dir): print '\t[mv] %s to %s' % (os.path.join(tmp_dir, plug), plug_dir) shutil.move(os.path.join(tmp_dir, plug), plug_dir) #removing tmp files shutil.rmtree(tmp_dir) os.remove(tmp_file.name)
def load_plugins(): """ Load the plugin into BioScript application """ # update plugins from github do_update = tg.config.get('plugins.update') if do_update and do_update.lower() in ['1', 'true', 't']: _update(tg.config.get('plugins.github.url')) # initialize plugin manager with yapsy plug_dir = constants.plugin_directory() manager = PluginManager(restrict='bs-operation') manager.add_plugin_path(plug_dir) print ' --- init plugins located in %s ---' % plug_dir # from yapsy.PluginManager import PluginManager # manager = PluginManager() # manager.setPluginPlaces([plug_dir]) # manager.setCategoriesFilter({ # "Operations": OperationPlugin, # }) # manager.collectPlugins() # check plugins and add in db if not already plugids = [] for name, clazz in manager.plugins().iteritems(): plug = clazz() #p = plug.plugin_object _check_plugin_info(plug) if tg.config['pylons.app_globals']: _check_in_database(plug) plugids.append(plug.unique_id()) # check deprecated plugins if tg.config['pylons.app_globals']: for p in DBSession.query(Plugin).all(): if p.generated_id not in plugids: p.deprecated = True DBSession.add(p) DBSession.flush() return manager