Configure the SAML2 session database during installation
[cascardo/ipsilon.git] / ipsilon / install / ipsilon-server-install
index 471fe9a..5c1ef70 100755 (executable)
@@ -10,6 +10,7 @@ from ipsilon.tools import files
 import ConfigParser
 import argparse
 import cherrypy
+import json
 import logging
 import os
 import pwd
@@ -107,6 +108,9 @@ def install(plugins, args):
                     'datadir': args['data_dir'], 'dbname': 'userprefs'},
                 'transdb': args['transaction_dburi'] or args['database_url'] %
                 {'datadir': args['data_dir'], 'dbname': 'transactions'},
+                'samlsessionsdb': args['samlsessions_dburi'] or args[
+                    'database_url'] % {'datadir': args['data_dir'],
+                                       'dbname': 'saml2sessions'},
                 'secure': "False" if args['secure'] == "no" else "True",
                 'debugging': "True" if args['server_debugging'] else "False"}
     # Testing database sessions
@@ -154,6 +158,12 @@ def install(plugins, args):
     # components
     cherrypy.config.update(ipsilon_conf)
 
+    # Prepare to allow plugins to save things changed during install
+    changes = {'env_helper': {},
+               'login_manager': {},
+               'info_provider': {},
+               'auth_provider': {}}
+
     # Move pre-existing admin db away
     admin_db = cherrypy.config['admin.config.db']
     if os.path.exists(admin_db):
@@ -169,8 +179,10 @@ def install(plugins, args):
     logger.info('Configuring environment helpers')
     for plugin_name in plugins['Environment Helpers']:
         plugin = plugins['Environment Helpers'][plugin_name]
-        if plugin.configure_server(args) == False:
+        plugin_changes = {}
+        if plugin.configure_server(args, plugin_changes) == False:
             logger.info('Configuration of environment helper %s failed' % plugin_name)
+        changes['env_helper'][plugin_name] = plugin_changes
 
     logger.info('Configuring login managers')
     for plugin_name in args['lm_order']:
@@ -178,20 +190,32 @@ def install(plugins, args):
             plugin = plugins['Login Managers'][plugin_name]
         except KeyError:
             sys.exit('Login provider %s not installed' % plugin_name)
-        if plugin.configure(args) == False:
+        plugin_changes = {}
+        if plugin.configure(args, plugin_changes) == False:
             logger.info('Configuration of login manager %s failed' % plugin_name)
+        changes['login_manager'][plugin_name] = plugin_changes
 
     logger.info('Configuring Info provider')
     for plugin_name in plugins['Info Provider']:
         plugin = plugins['Info Provider'][plugin_name]
-        if plugin.configure(args) == False:
+        plugin_changes = {}
+        if plugin.configure(args, plugin_changes) == False:
             logger.info('Configuration of info provider %s failed' % plugin_name)
+        changes['info_provider'][plugin_name] = plugin_changes
 
     logger.info('Configuring Authentication Providers')
     for plugin_name in plugins['Auth Providers']:
         plugin = plugins['Auth Providers'][plugin_name]
-        if plugin.configure(args) == False:
+        plugin_changes = {}
+        if plugin.configure(args, plugin_changes) == False:
             logger.info('Configuration of auth provider %s failed' % plugin_name)
+        changes['auth_provider'][plugin_name] = plugin_changes
+
+    # Save any changes that were made
+    install_changes = os.path.join(instance_conf, 'install_changes')
+    changes = json.dumps(changes)
+    with open(install_changes, 'w+') as f:
+        f.write(changes)
 
     # Fixup permissions so only the ipsilon user can read these files
     files.fix_user_dirs(instance_conf, opts['system_user'])
@@ -223,28 +247,37 @@ def uninstall(plugins, args):
         if sure != 'yes':
             raise Exception('Aborting')
 
+    # Get the details of what we changed during installation
+    install_changes = os.path.join(instance_conf, 'install_changes')
+    with open(install_changes, 'r') as f:
+        changes = json.loads(f.read())
+
     logger.info('Removing environment helpers')
     for plugin_name in plugins['Environment Helpers']:
         plugin = plugins['Environment Helpers'][plugin_name]
-        if plugin.unconfigure(args) == False:
+        plugin_changes = changes['env_helper'].get(plugin_name, {})
+        if plugin.unconfigure(args, plugin_changes) == False:
             logger.info('Removal of environment helper %s failed' % plugin_name)
 
     logger.info('Removing login managers')
     for plugin_name in plugins['Login Managers']:
         plugin = plugins['Login Managers'][plugin_name]
-        if plugin.unconfigure(args) == False:
+        plugin_changes = changes['login_manager'].get(plugin_name, {})
+        if plugin.unconfigure(args, plugin_changes) == False:
             logger.info('Removal of login manager %s failed' % plugin_name)
 
     logger.info('Removing Info providers')
     for plugin_name in plugins['Info Provider']:
         plugin = plugins['Info Provider'][plugin_name]
-        if plugin.unconfigure(args) == False:
+        plugin_changes = changes['info_provider'].get(plugin_name, {})
+        if plugin.unconfigure(args, plugin_changes) == False:
             logger.info('Removal of info provider %s failed' % plugin_name)
 
     logger.info('Removing Authentication Providers')
     for plugin_name in plugins['Auth Providers']:
         plugin = plugins['Auth Providers'][plugin_name]
-        if plugin.unconfigure(args) == False:
+        plugin_changes = changes['auth_provider'].get(plugin_name, {})
+        if plugin.unconfigure(args, plugin_changes) == False:
             logger.info('Removal of auth provider %s failed' % plugin_name)
 
     logger.info('Removing httpd configuration')
@@ -327,6 +360,8 @@ def parse_args(plugins):
                              'template)')
     parser.add_argument('--transaction-dburi',
                         help='Transaction database URI (override template)')
+    parser.add_argument('--samlsessions-dburi',
+                        help='SAML 2 sessions database URI (override template)')
 
     lms = []