Generate plugin index dynamically

https://fedorahosted.org/freeipa/ticket/3235
This commit is contained in:
Petr Vobornik
2013-04-23 19:54:21 +02:00
parent c5e99d7cd6
commit c72d0f5075
9 changed files with 90 additions and 72 deletions

View File

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

View File

@@ -16,6 +16,7 @@ SUBDIRS = \
updates \
po \
restart_scripts \
wsgi \
$(NULL)
install-exec-local:

View File

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

View File

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

View File

@@ -97,6 +97,7 @@ AC_CONFIG_FILES([
updates/Makefile
po/Makefile
restart_scripts/Makefile
wsgi/Makefile
])
AC_OUTPUT

View File

@@ -24,7 +24,6 @@ sbin_SCRIPTS = \
ipa-compliance \
ipa-backup \
ipa-restore \
ipa-webui-regen \
$(NULL)
EXTRA_DIST = \

View File

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

14
install/wsgi/Makefile.am Normal file
View File

@@ -0,0 +1,14 @@
NULL =
appdir = $(IPA_DATA_DIR)/wsgi
app_DATA = \
plugins.py \
$(NULL)
EXTRA_DIST = \
$(app_DATA) \
$(NULL)
MAINTAINERCLEANFILES = \
*~ \
Makefile.in

54
install/wsgi/plugins.py Normal file
View File

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