summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetr Vobornik <pvoborni@redhat.com>2013-04-23 19:54:21 +0200
committerPetr Vobornik <pvoborni@redhat.com>2013-05-06 16:22:30 +0200
commitc72d0f5075c63df0d75331d5afd0da2dc752ec14 (patch)
tree18562fc01a13f9cac2f4bea1e41719d96fdd7c5a
parentc5e99d7cd6545174fd677452ac9051acd9a5ef68 (diff)
downloadfreeipa-c72d0f5075c63df0d75331d5afd0da2dc752ec14.tar.gz
freeipa-c72d0f5075c63df0d75331d5afd0da2dc752ec14.tar.xz
freeipa-c72d0f5075c63df0d75331d5afd0da2dc752ec14.zip
Generate plugin index dynamically
https://fedorahosted.org/freeipa/ticket/3235
-rw-r--r--freeipa.spec.in8
-rw-r--r--install/Makefile.am1
-rw-r--r--install/conf/ipa-rewrite.conf5
-rw-r--r--install/conf/ipa.conf12
-rw-r--r--install/configure.ac1
-rw-r--r--install/tools/Makefile.am1
-rwxr-xr-xinstall/tools/ipa-webui-regen66
-rw-r--r--install/wsgi/Makefile.am14
-rw-r--r--install/wsgi/plugins.py54
9 files changed, 90 insertions, 72 deletions
diff --git a/freeipa.spec.in b/freeipa.spec.in
index 50f8bb095..5ce7f3b37 100644
--- a/freeipa.spec.in
+++ b/freeipa.spec.in
@@ -465,7 +465,6 @@ if [ $1 -gt 1 ] ; then
/bin/systemctl condrestart certmonger.service 2>&1 || :
/usr/sbin/ipa-upgradeconfig --quiet >/dev/null || :
fi
-/usr/sbin/ipa-webui-regen >/dev/null || :
%posttrans server
# This must be run in posttrans so that updates from previous
@@ -636,7 +635,6 @@ fi
%{_sbindir}/ipactl
%{_sbindir}/ipa-upgradeconfig
%{_sbindir}/ipa-compliance
-%{_sbindir}/ipa-webui-regen
%{_libexecdir}/certmonger/dogtag-ipa-retrieve-agent-submit
%{_sysconfdir}/cron.d/ipa-compliance
%config(noreplace) %{_sysconfdir}/sysconfig/ipa_memcached
@@ -704,6 +702,9 @@ fi
%dir %{_usr}/share/ipa/ui/images
%{_usr}/share/ipa/ui/images/*.png
%{_usr}/share/ipa/ui/images/*.gif
+%dir %{_usr}/share/ipa/wsgi
+%{_usr}/share/ipa/wsgi/plugins.py*
+%dir %{_sysconfdir}/ipa
%dir %{_sysconfdir}/ipa/html
%config(noreplace) %{_sysconfdir}/ipa/html/ffconfig.js
%config(noreplace) %{_sysconfdir}/ipa/html/ffconfig_page.js
@@ -843,6 +844,9 @@ fi
%ghost %attr(0644,root,apache) %config(noreplace) %{_sysconfdir}/ipa/ca.crt
%changelog
+* Mon May 6 2013 Petr Vobornik <pvoborni@redhat.com> - 3.1.99-11
+- Web UI plugins
+
* Fri May 3 2013 Rob Crittenden <rcritten@redhat.com> - 3.1.99-10
- Require pki-ca 10.0.2 for 501 response code on find for d9 -> d10 upgrades
diff --git a/install/Makefile.am b/install/Makefile.am
index 361318526..30a439fcd 100644
--- a/install/Makefile.am
+++ b/install/Makefile.am
@@ -16,6 +16,7 @@ SUBDIRS = \
updates \
po \
restart_scripts \
+ wsgi \
$(NULL)
install-exec-local:
diff --git a/install/conf/ipa-rewrite.conf b/install/conf/ipa-rewrite.conf
index 8da210d0a..b22caa1df 100644
--- a/install/conf/ipa-rewrite.conf
+++ b/install/conf/ipa-rewrite.conf
@@ -1,4 +1,4 @@
-# VERSION 3 - DO NOT REMOVE THIS LINE
+# VERSION 4 - DO NOT REMOVE THIS LINE
RewriteEngine on
@@ -16,3 +16,6 @@ RewriteRule ^/ipa/(.*) http://$FQDN/ipa/$$1 [L,R=301]
RewriteCond %{SERVER_PORT} !^443$$
RewriteCond %{REQUEST_URI} !^/ipa/(errors|config)
RewriteRule ^/ipa/(.*) https://$FQDN/ipa/$$1 [L,R=301,NC]
+
+# Rewrite for plugin index, make it like it's a static file
+RewriteRule ^/ipa/ui/js/freeipa/plugins.js$$ /ipa/wsgi/plugins.py [PT]
diff --git a/install/conf/ipa.conf b/install/conf/ipa.conf
index f3384d056..1a33f6287 100644
--- a/install/conf/ipa.conf
+++ b/install/conf/ipa.conf
@@ -1,5 +1,5 @@
#
-# VERSION 12 - DO NOT REMOVE THIS LINE
+# VERSION 13 - DO NOT REMOVE THIS LINE
#
# This file may be overwritten on upgrades.
#
@@ -137,7 +137,15 @@ Alias /ipa/ui "/usr/share/ipa/ui"
Allow from all
</Directory>
-
+# Simple wsgi scripts required by ui
+Alias /ipa/wsgi "/usr/share/ipa/wsgi"
+<Directory "/usr/share/ipa/wsgi">
+ AllowOverride None
+ Satisfy Any
+ Allow from all
+ Options ExecCGI
+ AddHandler wsgi-script .py
+</Directory>
# Protect our CGIs
<Directory /var/www/cgi-bin>
diff --git a/install/configure.ac b/install/configure.ac
index c6940d10e..fca4c6991 100644
--- a/install/configure.ac
+++ b/install/configure.ac
@@ -97,6 +97,7 @@ AC_CONFIG_FILES([
updates/Makefile
po/Makefile
restart_scripts/Makefile
+ wsgi/Makefile
])
AC_OUTPUT
diff --git a/install/tools/Makefile.am b/install/tools/Makefile.am
index b10610810..7c553116c 100644
--- a/install/tools/Makefile.am
+++ b/install/tools/Makefile.am
@@ -24,7 +24,6 @@ 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
deleted file mode 100755
index 0e08c5430..000000000
--- a/install/tools/ipa-webui-regen
+++ /dev/null
@@ -1,66 +0,0 @@
-#!/usr/bin/python
-# Authors: Petr Vobornik <pvoborni@redhat.com>
-#
-# 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 <http://www.gnu.org/licenses/>.
-#
-
-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/wsgi/Makefile.am b/install/wsgi/Makefile.am
new file mode 100644
index 000000000..a6211d6d1
--- /dev/null
+++ b/install/wsgi/Makefile.am
@@ -0,0 +1,14 @@
+NULL =
+
+appdir = $(IPA_DATA_DIR)/wsgi
+app_DATA = \
+ plugins.py \
+ $(NULL)
+
+EXTRA_DIST = \
+ $(app_DATA) \
+ $(NULL)
+
+MAINTAINERCLEANFILES = \
+ *~ \
+ Makefile.in
diff --git a/install/wsgi/plugins.py b/install/wsgi/plugins.py
new file mode 100644
index 000000000..3c5354838
--- /dev/null
+++ b/install/wsgi/plugins.py
@@ -0,0 +1,54 @@
+# Authors: Petr Vobornik <pvoborni@redhat.com>
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+
+"""
+Plugin index generation script
+"""
+
+import os
+from ipapython.ipa_log_manager import root_logger
+
+PLUGINS_DIR = "/usr/share/ipa/ui/js/plugins"
+
+def get_plugin_index():
+
+ if not os.path.isdir(PLUGINS_DIR):
+ raise Exception("Supplied plugin directory path is not a directory")
+
+ dirs = os.listdir(PLUGINS_DIR)
+ index = 'define([],function(){return['
+ index += ','.join("'"+x+"'" for x in dirs)
+ index += '];});'
+ return index
+
+def get_failed():
+ return 'define([],function(){return[];});/*error occured: serving default */'
+
+def application(environ, start_response):
+ try:
+ index = get_plugin_index()
+ status = '200 OK'
+ except Exception, e:
+ root_logger.error('plugin index generation failed: %s' % e)
+ status = '200 OK'
+ index = get_failed()
+ headers = [('Content-type', 'application/javascript'),
+ ('Content-Length', str(len(index)))]
+ start_response(status, headers)
+ return [index]