Generate plugin index dynamically

https://fedorahosted.org/freeipa/ticket/3235
This commit is contained in:
Petr Vobornik
2013-05-06 16:22:30 +02:00
parent c5e99d7cd6
commit c72d0f5075
9 changed files with 90 additions and 72 deletions
+1
View File
@@ -16,6 +16,7 @@ SUBDIRS = \
updates \
po \
restart_scripts \
wsgi \
$(NULL)
install-exec-local:
+4 -1
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]
+10 -2
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>
+1
View File
@@ -97,6 +97,7 @@ AC_CONFIG_FILES([
updates/Makefile
po/Makefile
restart_scripts/Makefile
wsgi/Makefile
])
AC_OUTPUT
-1
View File
@@ -24,7 +24,6 @@ sbin_SCRIPTS = \
ipa-compliance \
ipa-backup \
ipa-restore \
ipa-webui-regen \
$(NULL)
EXTRA_DIST = \
-66
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
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
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]