From 74b6099fb058564a74b91b701c07532ed0f4cefc Mon Sep 17 00:00:00 2001 From: Petr Vobornik Date: Wed, 20 Mar 2013 17:28:17 +0100 Subject: Web UI plugin loader https://fedorahosted.org/freeipa/ticket/3235 --- install/configure.ac | 1 - install/tools/Makefile.am | 3 +- install/tools/ipa-webui-regen | 66 ++++++++++++++++++++++++++ install/ui/Makefile.am | 1 - install/ui/ext/Makefile.am | 14 ------ install/ui/ext/extension.js | 0 install/ui/js/plugins | 1 + install/ui/src/freeipa/app.js | 14 ++++-- install/ui/src/freeipa/plugin_loader.js | 82 +++++++++++++++++++++++++++++++++ install/ui/src/freeipa/plugins.js | 1 + 10 files changed, 161 insertions(+), 22 deletions(-) create mode 100755 install/tools/ipa-webui-regen delete mode 100644 install/ui/ext/Makefile.am delete mode 100644 install/ui/ext/extension.js create mode 120000 install/ui/js/plugins create mode 100644 install/ui/src/freeipa/plugin_loader.js create mode 100644 install/ui/src/freeipa/plugins.js (limited to 'install') diff --git a/install/configure.ac b/install/configure.ac index 27e88beb4..c6940d10e 100644 --- a/install/configure.ac +++ b/install/configure.ac @@ -86,7 +86,6 @@ AC_CONFIG_FILES([ migration/Makefile share/Makefile ui/Makefile - ui/ext/Makefile ui/src/Makefile ui/src/libs/Makefile ui/images/Makefile diff --git a/install/tools/Makefile.am b/install/tools/Makefile.am index 76cd1196b..b10610810 100644 --- a/install/tools/Makefile.am +++ b/install/tools/Makefile.am @@ -14,7 +14,7 @@ sbin_SCRIPTS = \ ipa-replica-prepare \ ipa-replica-manage \ ipa-csreplica-manage \ - ipa-server-certinstall \ + ipa-server-certinstall \ ipactl \ ipa-compat-manage \ ipa-nis-manage \ @@ -24,6 +24,7 @@ sbin_SCRIPTS = \ ipa-compliance \ ipa-backup \ ipa-restore \ + ipa-webui-regen \ $(NULL) EXTRA_DIST = \ diff --git a/install/tools/ipa-webui-regen b/install/tools/ipa-webui-regen new file mode 100755 index 000000000..0e08c5430 --- /dev/null +++ b/install/tools/ipa-webui-regen @@ -0,0 +1,66 @@ +#!/usr/bin/python +# Authors: Petr Vobornik +# +# Copyright (C) 2013 Red Hat +# see file 'COPYING' for use and warranty information +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +import sys +import os +from optparse import OptionParser + +log_file_name = "/var/log/ipaserver-install.log" +plugins_dir = "/usr/share/ipa/ui/js/plugins" +index_file = "/usr/share/ipa/ui/js/freeipa/plugins.js" + +def parse_options(): + usage = "%prog" + parser = OptionParser(usage=usage) + + parser.add_option("-p", "--plugins-dir", action="store", dest="directory", + help="Plugin directory path.", default=plugins_dir) + + parser.add_option("-i", "--index-file", action="store", dest="index", + help="Plugin index path", default=index_file) + + options, args = parser.parse_args() + return options, args + +def main(): + retval = 0 + options, args = parse_options() + plugins_dir = options.directory + index_file = options.index + + if not os.path.isdir(plugins_dir): + sys.exit("Supplied plugin directory path is not a directory") + + dirs = os.listdir(plugins_dir) + index = u'define([],function(){return[' + index += u','.join("'"+x+"'" for x in dirs) + index += u'];});' + print 'Plugins: '+', '.join(dirs) + try: + with open(index_file,'w') as f: + f.write(index) + print 'Plugin index updated' + except IOError, e: + sys.exit("Plugin index update failed: %s" % (str(e))) + + return retval + +if __name__ == '__main__': + sys.exit(main()) diff --git a/install/ui/Makefile.am b/install/ui/Makefile.am index e3276741f..77aab17a6 100644 --- a/install/ui/Makefile.am +++ b/install/ui/Makefile.am @@ -4,7 +4,6 @@ NULL = SUBDIRS = \ build \ - ext \ images \ src \ $(NULL) diff --git a/install/ui/ext/Makefile.am b/install/ui/ext/Makefile.am deleted file mode 100644 index 29a6387c6..000000000 --- a/install/ui/ext/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -NULL = - -appdir = $(IPA_DATA_DIR)/ui/ext -app_DATA = \ - extension.js \ - $(NULL) - -EXTRA_DIST = \ - $(app_DATA) \ - $(NULL) - -MAINTAINERCLEANFILES = \ - *~ \ - Makefile.in diff --git a/install/ui/ext/extension.js b/install/ui/ext/extension.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/install/ui/js/plugins b/install/ui/js/plugins new file mode 120000 index 000000000..940b13ec0 --- /dev/null +++ b/install/ui/js/plugins @@ -0,0 +1 @@ +../src/plugins/ \ No newline at end of file diff --git a/install/ui/src/freeipa/app.js b/install/ui/src/freeipa/app.js index 72a41497b..37c4c08a8 100644 --- a/install/ui/src/freeipa/app.js +++ b/install/ui/src/freeipa/app.js @@ -25,6 +25,8 @@ define([ //core 'dojo/_base/lang', 'dojo/Deferred', + 'dojo/when', + './plugin_loader', './phases', './Application_controller', 'exports', // for circullar deps @@ -52,7 +54,7 @@ define([ './trust', './user', 'dojo/domReady!' -],function(lang, Deferred, phases, Application_controller, exports) { +],function(lang, Deferred, when, plugin_loader, phases, Application_controller, exports) { var app = { @@ -102,10 +104,12 @@ define([ })); }, - run: function() { - this.register_phases(); - phases.controller.run(); - } + run: function() { + when(plugin_loader.load_plugins(), lang.hitch(this, function() { + this.register_phases(); + phases.controller.run(); + })); + } }; lang.mixin(exports, app); diff --git a/install/ui/src/freeipa/plugin_loader.js b/install/ui/src/freeipa/plugin_loader.js new file mode 100644 index 000000000..ce545301b --- /dev/null +++ b/install/ui/src/freeipa/plugin_loader.js @@ -0,0 +1,82 @@ +/* Authors: + * Petr Vobornik + * + * Copyright (C) 2013 Red Hat + * see file 'COPYING'./for use and warranty information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +/** + * Plugin loader + */ +define([ + 'dojo/_base/array', + 'dojo/_base/lang', + 'dojo/Deferred', + 'dojo/promise/all' +],function(array, lang, Deferred, all) { + + var plugin_loader = { + + register_plugins: function(plugins) { + + var packages = []; + + array.forEach(plugins, function(name) { + packages.push({ + name: name, + location: 'plugins/'+name + }); + }); + + require({ packages: packages}); + }, + + load_plugin: function(name) { + var plugin_loaded = new Deferred(); + + var mid = name+'/'+name; + + require([mid], function(plugin) { + plugin_loaded.resolve(plugin); + }); + + return plugin_loaded.promise; + }, + + load_plugins: function() { + + var plugins_loaded = new Deferred(); + + require(['freeipa/plugins'], lang.hitch(this, function(plugins) { + var loading = []; + + this.register_plugins(plugins); + + array.forEach(plugins, lang.hitch(this, function(plugin) { + loading.push(this.load_plugin(plugin)); + })); + + all(loading).then(function(results) { + plugins_loaded.resolve(results); + }); + })); + + return plugins_loaded.promise; + } + }; + + return plugin_loader; +}); \ No newline at end of file diff --git a/install/ui/src/freeipa/plugins.js b/install/ui/src/freeipa/plugins.js new file mode 100644 index 000000000..67d3c34b4 --- /dev/null +++ b/install/ui/src/freeipa/plugins.js @@ -0,0 +1 @@ +define([],function(){return[];}); \ No newline at end of file -- cgit