From 9aea1e939f6357eadf777c72ae3ef43275829427 Mon Sep 17 00:00:00 2001 From: Ade Lee Date: Thu, 26 Apr 2012 23:48:43 -0400 Subject: Refactor installation servlets to use common code in ConfigurationUtils Ticket #156 --- .../cms/servlet/csadmin/DatabasePanel.java | 1137 +------------------- 1 file changed, 35 insertions(+), 1102 deletions(-) (limited to 'base/common/src/com/netscape/cms/servlet/csadmin/DatabasePanel.java') diff --git a/base/common/src/com/netscape/cms/servlet/csadmin/DatabasePanel.java b/base/common/src/com/netscape/cms/servlet/csadmin/DatabasePanel.java index ed2e4a22c..89f01e01c 100644 --- a/base/common/src/com/netscape/cms/servlet/csadmin/DatabasePanel.java +++ b/base/common/src/com/netscape/cms/servlet/csadmin/DatabasePanel.java @@ -17,50 +17,24 @@ // --- END COPYRIGHT BLOCK --- package com.netscape.cms.servlet.csadmin; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileOutputStream; -import java.io.FileReader; import java.io.IOException; -import java.io.PrintStream; -import java.util.ArrayList; -import java.util.Enumeration; import java.util.Random; -import java.util.StringTokenizer; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import netscape.ldap.LDAPAttribute; -import netscape.ldap.LDAPAttributeSet; -import netscape.ldap.LDAPConnection; -import netscape.ldap.LDAPDN; -import netscape.ldap.LDAPEntry; -import netscape.ldap.LDAPException; -import netscape.ldap.LDAPModification; -import netscape.ldap.LDAPSearchConstraints; -import netscape.ldap.LDAPSearchResults; -import netscape.ldap.LDAPv3; - import org.apache.velocity.context.Context; import com.netscape.certsrv.apps.CMS; -import com.netscape.certsrv.authentication.IAuthSubsystem; -import com.netscape.certsrv.authorization.IAuthzSubsystem; import com.netscape.certsrv.base.EBaseException; import com.netscape.certsrv.base.IConfigStore; -import com.netscape.certsrv.ca.ICertificateAuthority; -import com.netscape.certsrv.dbs.IDBSubsystem; -import com.netscape.certsrv.ldap.ILdapConnFactory; import com.netscape.certsrv.property.Descriptor; import com.netscape.certsrv.property.IDescriptor; import com.netscape.certsrv.property.PropertySet; -import com.netscape.certsrv.usrgrp.IUGSubsystem; import com.netscape.certsrv.util.HttpInput; import com.netscape.cms.servlet.wizard.WizardServlet; -import com.netscape.cmsutil.ldap.LDAPUtil; public class DatabasePanel extends WizardPanelBase { @@ -115,34 +89,22 @@ public class DatabasePanel extends WizardPanelBase { public PropertySet getUsage() { PropertySet set = new PropertySet(); - Descriptor hostDesc = new Descriptor(IDescriptor.STRING, null, null, - "Host name"); - + Descriptor hostDesc = new Descriptor(IDescriptor.STRING, null, null, "Host name"); set.add("hostname", hostDesc); - Descriptor portDesc = new Descriptor(IDescriptor.INTEGER, null, null, - "Port"); - + Descriptor portDesc = new Descriptor(IDescriptor.INTEGER, null, null, "Port"); set.add("portStr", portDesc); - Descriptor basednDesc = new Descriptor(IDescriptor.STRING, null, null, - "Base DN"); - + Descriptor basednDesc = new Descriptor(IDescriptor.STRING, null, null, "Base DN"); set.add("basedn", basednDesc); - Descriptor binddnDesc = new Descriptor(IDescriptor.STRING, null, null, - "Bind DN"); - + Descriptor binddnDesc = new Descriptor(IDescriptor.STRING, null, null, "Bind DN"); set.add("binddn", binddnDesc); - Descriptor bindpwdDesc = new Descriptor(IDescriptor.PASSWORD, null, null, - "Bind Password"); - + Descriptor bindpwdDesc = new Descriptor(IDescriptor.PASSWORD, null, null, "Bind Password"); set.add("bindpwd", bindpwdDesc); - Descriptor databaseDesc = new Descriptor(IDescriptor.STRING, null, null, - "Database"); - + Descriptor databaseDesc = new Descriptor(IDescriptor.STRING, null, null, "Database"); set.add("database", databaseDesc); return set; @@ -408,495 +370,6 @@ public class DatabasePanel extends WizardPanelBase { cs.putString("preop.database.errorString", ""); } - private LDAPConnection getLocalLDAPConn(Context context, String secure) - throws IOException { - IConfigStore cs = CMS.getConfigStore(); - - String host = ""; - String port = ""; - String pwd = ""; - String binddn = ""; - String security = ""; - - try { - host = cs.getString("internaldb.ldapconn.host"); - port = cs.getString("internaldb.ldapconn.port"); - binddn = cs.getString("internaldb.ldapauth.bindDN"); - pwd = (String) context.get("bindpwd"); - security = cs.getString("internaldb.ldapconn.secureConn"); - } catch (Exception e) { - CMS.debug("DatabasePanel populateDB: " + e.toString()); - throw new IOException( - "Failed to retrieve LDAP information from CS.cfg."); - } - - int p = -1; - - try { - p = Integer.parseInt(port); - } catch (Exception e) { - CMS.debug("DatabasePanel populateDB: " + e.toString()); - throw new IOException("Port is not valid"); - } - - LDAPConnection conn = null; - if (security.equals("true")) { - CMS.debug("DatabasePanel populateDB: creating secure (SSL) connection for internal ldap"); - conn = new LDAPConnection(CMS.getLdapJssSSLSocketFactory()); - } else { - CMS.debug("DatabasePanel populateDB: creating non-secure (non-SSL) connection for internal ldap"); - conn = new LDAPConnection(); - } - - CMS.debug("DatabasePanel connecting to " + host + ":" + p); - try { - conn.connect(host, p, binddn, pwd); - } catch (LDAPException e) { - CMS.debug("DatabasePanel populateDB: " + e.toString()); - throw new IOException("Failed to connect to the internal database."); - } - - return conn; - } - - private boolean deleteDir(File dir) { - if (dir.isDirectory()) { - String[] children = dir.list(); - for (int i = 0; i < children.length; i++) { - boolean success = deleteDir(new File(dir, children[i])); - if (!success) { - return false; - } - } - } - - // The directory is now empty so delete it - return dir.delete(); - } - - private void cleanupDB(LDAPConnection conn, String baseDN, String database) { - String[] entries = {}; - String filter = "objectclass=*"; - LDAPSearchConstraints cons = null; - String[] attrs = null; - String dn = ""; - try { - CMS.debug("Deleting baseDN: " + baseDN); - LDAPSearchResults res = conn.search(baseDN, LDAPConnection.SCOPE_BASE, filter, - attrs, true, cons); - if (res != null) - deleteEntries(res, conn, baseDN, entries); - } catch (LDAPException e) { - } - - try { - dn = "cn=mapping tree, cn=config"; - filter = "nsslapd-backend=" + database; - LDAPSearchResults res = conn.search(dn, LDAPConnection.SCOPE_ONE, filter, - attrs, true, cons); - if (res != null) { - while (res.hasMoreElements()) { - dn = res.next().getDN(); - filter = "objectclass=*"; - LDAPSearchResults res2 = conn.search(dn, LDAPConnection.SCOPE_BASE, filter, - attrs, true, cons); - if (res2 != null) - deleteEntries(res2, conn, dn, entries); - } - } - } catch (LDAPException e) { - } - - try { - dn = "cn=" + database + ",cn=ldbm database, cn=plugins, cn=config"; - LDAPSearchResults res = conn.search(dn, LDAPConnection.SCOPE_BASE, filter, - attrs, true, cons); - if (res != null) { - deleteEntries(res, conn, dn, entries); - String dbdir = getInstanceDir(conn) + "/db/" + database; - if (dbdir != null) { - CMS.debug(" Deleting dbdir " + dbdir); - boolean success = deleteDir(new File(dbdir)); - if (!success) { - CMS.debug("Unable to delete database directory " + dbdir); - } - } - } - } catch (LDAPException e) { - } - } - - private void populateDB(HttpServletRequest request, Context context, String secure) - throws IOException { - IConfigStore cs = CMS.getConfigStore(); - - String baseDN = ""; - String database = ""; - String dn = ""; - - try { - baseDN = cs.getString("internaldb.basedn"); - database = cs.getString("internaldb.database", ""); - } catch (Exception e) { - CMS.debug("DatabasePanel populateDB: " + e.toString()); - throw new IOException( - "Failed to retrieve LDAP information from CS.cfg."); - } - - String remove = HttpInput.getID(request, "removeData"); - LDAPConnection conn = getLocalLDAPConn(context, secure); - - // check that the database and baseDN do not exist - - boolean foundBaseDN = false; - boolean foundDatabase = false; - try { - LDAPEntry entry = conn.read(baseDN); - if (entry != null) - foundBaseDN = true; - } catch (LDAPException e) { - switch (e.getLDAPResultCode()) { - case LDAPException.NO_SUCH_OBJECT: - break; - default: - CMS.debug("DatabasePanel update: LDAPException " + e.toString()); - throw new IOException("Failed to create the database"); - } - } - - try { - dn = "cn=" + database + ",cn=ldbm database, cn=plugins, cn=config"; - LDAPEntry entry = conn.read(dn); - if (entry != null) - foundDatabase = true; - } catch (LDAPException e) { - switch (e.getLDAPResultCode()) { - case LDAPException.NO_SUCH_OBJECT: - break; - default: - CMS.debug("DatabasePanel update: LDAPException " + e.toString()); - throw new IOException("Failed to create the database"); - } - } - try { - dn = "cn=\"" + baseDN + "\",cn=mapping tree, cn=config"; - LDAPEntry entry = conn.read(dn); - if (entry != null) - foundDatabase = true; - } catch (LDAPException e) { - switch (e.getLDAPResultCode()) { - case LDAPException.NO_SUCH_OBJECT: - break; - default: - CMS.debug("DatabasePanel update: LDAPException " + e.toString()); - throw new IOException("Failed to create the database"); - } - } - - if (foundDatabase) { - CMS.debug("DatabasePanel update: This database has already been used."); - if (remove == null) { - throw new IOException( - "This database has already been used. Select the checkbox below to remove all data and reuse this database"); - } else { - CMS.debug("DatabasePanel update: Deleting existing DB and reusing base DN"); - cleanupDB(conn, baseDN, database); - foundBaseDN = false; - foundDatabase = false; - } - } - - if (foundBaseDN) { - CMS.debug("DatabasePanel update: This base DN has already been used."); - if (remove == null) { - throw new IOException( - "This base DN (" - + baseDN - + ") has already been used. Select the checkbox below to remove all data and reuse this base DN"); - } else { - CMS.debug("DatabasePanel update: Deleting existing DB and reusing base DN"); - cleanupDB(conn, baseDN, database); - foundBaseDN = false; - foundDatabase = false; - } - } - - // create database - try { - LDAPAttributeSet attrs = new LDAPAttributeSet(); - String oc[] = { "top", "extensibleObject", "nsBackendInstance" }; - attrs.add(new LDAPAttribute("objectClass", oc)); - attrs.add(new LDAPAttribute("cn", database)); - attrs.add(new LDAPAttribute("nsslapd-suffix", baseDN)); - dn = "cn=" + database + ",cn=ldbm database, cn=plugins, cn=config"; - LDAPEntry entry = new LDAPEntry(dn, attrs); - conn.add(entry); - } catch (Exception e) { - CMS.debug("Warning: database creation error - " + e.toString()); - throw new IOException("Failed to create the database."); - } - - try { - LDAPAttributeSet attrs = new LDAPAttributeSet(); - String oc2[] = { "top", "extensibleObject", "nsMappingTree" }; - attrs.add(new LDAPAttribute("objectClass", oc2)); - attrs.add(new LDAPAttribute("cn", baseDN)); - attrs.add(new LDAPAttribute("nsslapd-backend", database)); - attrs.add(new LDAPAttribute("nsslapd-state", "Backend")); - dn = "cn=\"" + baseDN + "\",cn=mapping tree, cn=config"; - LDAPEntry entry = new LDAPEntry(dn, attrs); - conn.add(entry); - } catch (Exception e) { - CMS.debug("Warning: database mapping tree creation error - " + e.toString()); - throw new IOException("Failed to create the database."); - } - - try { - // create base dn - CMS.debug("Creating base DN: " + baseDN); - String dns3[] = LDAPDN.explodeDN(baseDN, false); - StringTokenizer st = new StringTokenizer(dns3[0], "="); - String n = st.nextToken(); - String v = st.nextToken(); - LDAPAttributeSet attrs = new LDAPAttributeSet(); - String oc3[] = { "top", "domain" }; - if (n.equals("o")) { - oc3[1] = "organization"; - } else if (n.equals("ou")) { - oc3[1] = "organizationalUnit"; - } - attrs.add(new LDAPAttribute("objectClass", oc3)); - attrs.add(new LDAPAttribute(n, v)); - - LDAPEntry entry = new LDAPEntry(baseDN, attrs); - conn.add(entry); - } catch (Exception e) { - CMS.debug("Warning: suffix creation error - " + e.toString()); - throw new IOException("Failed to create the base DN: " + baseDN); - } - - // check to see if the base dn exists - CMS.debug("DatabasePanel checking existing " + baseDN); - - try { - LDAPEntry entry = conn.read(baseDN); - - if (entry != null) { - foundBaseDN = true; - } - } catch (LDAPException e) { - } - boolean createBaseDN = true; - - boolean testing = false; - try { - testing = cs.getBoolean("internaldb.multipleSuffix.enable", false); - } catch (Exception e) { - } - - if (!foundBaseDN) { - if (!testing) { - context.put("errorString", - "Base DN was not found. Please make sure to create the suffix in the internal database."); - throw new IOException("Base DN not found"); - } - - if (createBaseDN) { - // only auto create if it is an ou entry - String dns1[] = LDAPDN.explodeDN(baseDN, false); - - if (dns1 == null) { - throw new IOException("Invalid base DN"); - } - if (!dns1[0].startsWith("ou")) { - throw new IOException( - "Failed to find base DN, and failed to create non ou entry."); - } - String dns2[] = LDAPDN.explodeDN(baseDN, true); - // support only one level creation - create new entry - // right under the suffix - LDAPAttributeSet attrs = new LDAPAttributeSet(); - String oc[] = { "top", "organizationalUnit" }; - - attrs.add(new LDAPAttribute("objectClass", oc)); - attrs.add(new LDAPAttribute("ou", dns2[0])); - LDAPEntry entry = new LDAPEntry(baseDN, attrs); - - try { - conn.add(entry); - foundBaseDN = true; - CMS.debug("DatabasePanel added " + baseDN); - } catch (LDAPException e) { - throw new IOException("Failed to create " + baseDN); - } - } - } - if (!foundBaseDN) { - throw new IOException("Failed to find base DN"); - } - - String select = ""; - try { - select = cs.getString("preop.subsystem.select", ""); - } catch (Exception e) { - } - - if (select.equals("clone")) { - // if this is clone, add index before replication - // don't put in the schema or bad things will happen - importLDIFS("preop.internaldb.ldif", conn); - importLDIFS("preop.internaldb.index_ldif", conn); - importLDIFS("preop.internaldb.manager_ldif", conn); - } else { - // data will be replicated from the master to the clone - // so clone does not need the data - importLDIFS("preop.internaldb.schema.ldif", conn); - importLDIFS("preop.internaldb.ldif", conn); - importLDIFS("preop.internaldb.data_ldif", conn); - importLDIFS("preop.internaldb.index_ldif", conn); - importLDIFS("preop.internaldb.manager_ldif", conn); - } - - try { - conn.disconnect(); - } catch (LDAPException e) { - } - } - - private void importLDIFS(String param, LDAPConnection conn) throws IOException { - IConfigStore cs = CMS.getConfigStore(); - String v = null; - - CMS.debug("DatabasePanel populateDB param=" + param); - try { - v = cs.getString(param); - } catch (EBaseException e) { - CMS.debug("DatabasePanel populateDB: " + e.toString()); - throw new IOException("Cant find ldif files."); - } - - StringTokenizer tokenizer = new StringTokenizer(v, ","); - String baseDN = null; - String database = null; - - try { - baseDN = cs.getString("internaldb.basedn"); - } catch (EBaseException e) { - throw new IOException("internaldb.basedn is missing."); - } - - try { - database = cs.getString("internaldb.database"); - CMS.debug("DatabasePanel update: database=" + database); - } catch (EBaseException e) { - CMS.debug( - "DatabasePanel update: Failed to get database name. Exception: " - + e.toString()); - database = "userRoot"; - } - - String instancePath = null; - - try { - instancePath = cs.getString("instanceRoot"); - } catch (EBaseException e) { - throw new IOException("instanceRoot is missing"); - } - - String instanceId = null; - - try { - instanceId = cs.getString("instanceId"); - } catch (EBaseException e) { - throw new IOException("instanceId is missing"); - } - - String dbuser = null; - try { - dbuser = "uid=" + cs.getString("cs.type") + "-" + cs.getString("machineName") + "-" - + cs.getString("service.securePort") + ",ou=people," + baseDN; - } catch (EBaseException e) { - CMS.debug("Unable to construct dbuser" + e.toString()); - e.printStackTrace(); - throw new IOException("unable to construct dbuser"); - } - - String configDir = instancePath + File.separator + "conf"; - - while (tokenizer.hasMoreTokens()) { - String token = tokenizer.nextToken().trim(); - int index = token.lastIndexOf("/"); - String name = token; - - if (index != -1) { - name = token.substring(index + 1); - } - - CMS.debug("DatabasePanel importLDIFS: ldif file = " + token); - String filename = configDir + File.separator + name; - - CMS.debug("DatabasePanel importLDIFS: ldif file copy to " + filename); - PrintStream ps = null; - BufferedReader in = null; - - try { - in = new BufferedReader(new FileReader(token)); - ps = new PrintStream(new FileOutputStream(filename, false)); - while (in.ready()) { - String s = in.readLine(); - int n = s.indexOf("{"); - - if (n == -1) { - ps.println(s); - } else { - boolean endOfline = false; - - while (n != -1) { - ps.print(s.substring(0, n)); - int n1 = s.indexOf("}"); - String tok = s.substring(n + 1, n1); - - if (tok.equals("instanceId")) { - ps.print(instanceId); - } else if (tok.equals("rootSuffix")) { - ps.print(baseDN); - } else if (tok.equals("database")) { - ps.print(database); - } else if (tok.equals("dbuser")) { - ps.print(dbuser); - } - if ((s.length() + 1) == n1) { - endOfline = true; - break; - } - s = s.substring(n1 + 1); - n = s.indexOf("{"); - } - - if (!endOfline) { - ps.println(s); - } - } - } - in.close(); - ps.close(); - } catch (Exception e) { - CMS.debug("DBSubsystem popuateDB: " + e.toString()); - throw new IOException( - "Problem of copying ldif file: " + filename); - } - ArrayList errors = new ArrayList(); - LDAPUtil.importLDIF(conn, filename, errors); - if (! errors.isEmpty()) { - CMS.debug("DatabasePanel: importLDIFS: LDAP Errors in importing " + filename); - for (String error: errors) { - CMS.debug(error); - } - } - } - } - - /** * Commit parameter changes */ @@ -904,7 +377,6 @@ public class DatabasePanel extends WizardPanelBase { HttpServletResponse response, Context context) throws IOException { IConfigStore cs = CMS.getConfigStore(); - boolean hasErr = false; context.put("firsttime", "false"); try { @@ -918,12 +390,16 @@ public class DatabasePanel extends WizardPanelBase { String portStr1 = ""; String database1 = ""; String masterPortStr = ""; + String csType = ""; + String select = ""; try { hostname1 = cs.getString("internaldb.ldapconn.host", ""); portStr1 = cs.getString("internaldb.ldapconn.port", ""); database1 = cs.getString("internaldb.database", ""); masterPortStr = cs.getString("preop.internaldb.master.ldapconn.port", "0"); + csType = cs.getString("cs.type"); + select = cs.getString("preop.subsystem.select", ""); } catch (Exception e) { } @@ -952,11 +428,9 @@ public class DatabasePanel extends WizardPanelBase { cs.putString("internaldb.ldapauth.bindDN", binddn); cs.putString("internaldb.ldapconn.secureConn", (secure.equals("on") ? "true" : "false")); - int masterReplicationPort = 0; if ((masterReplicationPortStr == null) || (masterReplicationPortStr.length() == 0)) { masterReplicationPortStr = masterPortStr; } - masterReplicationPort = Integer.parseInt(masterReplicationPortStr); cs.putString("internaldb.ldapconn.masterReplicationPort", masterReplicationPortStr); int cloneReplicationPort = 0; @@ -976,6 +450,9 @@ public class DatabasePanel extends WizardPanelBase { cs.putString("internaldb.ldapconn.replicationSecurity", replicationSecurity); String remove = HttpInput.getID(request, "removeData"); + cs.putString("preop.database.removeData", ((remove != null) && (!remove.equals(""))) ? + "true" : "false"); + if (isPanelDone() && (remove == null || remove.equals(""))) { /* if user submits the same data, they just want to skip to the next panel, no database population is required. */ @@ -990,283 +467,47 @@ public class DatabasePanel extends WizardPanelBase { mServlet.cleanUpFromPanel(mServlet.getPanelNo(request)); try { - populateDB(request, context, (secure.equals("on") ? "true" : "false")); - } catch (IOException e) { - CMS.debug("DatabasePanel update: populateDB Exception: " + e.toString()); - context.put("updateStatus", "failure"); - throw e; - } catch (Exception e) { - CMS.debug("DatabasePanel update: populateDB Exception: " + e.toString()); - context.put("errorString", e.toString()); - cs.putString("preop.database.errorString", e.toString()); - context.put("updateStatus", "failure"); - throw new IOException(e.toString()); - } - - String bindpwd = HttpInput.getPassword(request, "__bindpwd"); - - /* BZ 430745 create password for replication manager */ - String replicationpwd = Integer.toString(new Random().nextInt()); + /* BZ 430745 create password for replication manager */ + String replicationpwd = Integer.toString(new Random().nextInt()); - IConfigStore psStore = null; - String passwordFile = null; - - try { + IConfigStore psStore = null; + String passwordFile = null; passwordFile = cs.getString("passwordFile"); psStore = CMS.createFileConfigStore(passwordFile); - } catch (Exception e) { - CMS.debug("ConfigDatabaseServlet update: " + e.toString()); - context.put("updateStatus", "failure"); - throw new IOException(e.toString()); - } - psStore.putString("internaldb", bindpwd); - psStore.putString("replicationdb", replicationpwd); - cs.putString("preop.internaldb.replicationpwd", replicationpwd); - cs.putString("preop.database.removeData", "false"); - - try { - cs.commit(false); + psStore.putString("internaldb", HttpInput.getPassword(request, "__bindpwd")); + psStore.putString("replicationdb", replicationpwd); psStore.commit(false); - CMS.reinit(IDBSubsystem.SUB_ID); - String type = cs.getString("cs.type", ""); - if (type.equals("CA")) - CMS.reinit(ICertificateAuthority.ID); - CMS.reinit(IAuthSubsystem.ID); - CMS.reinit(IAuthzSubsystem.ID); - CMS.reinit(IUGSubsystem.ID); - } catch (Exception e) { - CMS.debug("DatabasePanel update: " + e.toString()); - context.put("errorString", e.toString()); - cs.putString("preop.database.errorString", e.toString()); - context.put("updateStatus", "failure"); - throw new IOException(e.toString()); - } - String select = ""; - try { - select = cs.getString("preop.subsystem.select", ""); - } catch (Exception e) { - } + ConfigurationUtils.populateDB(); - // always populate the index the last - try { - CMS.debug("Populating local indexes"); - LDAPConnection conn = getLocalLDAPConn(context, - (secure.equals("on") ? "true" : "false")); - importLDIFS("preop.internaldb.post_ldif", conn); - - /* For vlvtask, we need to check if the task has - been completed or not. Presence of nsTaskExitCode means task is complete - */ - String wait_dn = cs.getString("preop.internaldb.wait_dn", ""); - if (!wait_dn.equals("")) { - int i = 0; - LDAPEntry task = null; - boolean taskComplete = false; - CMS.debug("Checking wait_dn " + wait_dn); - do { - Thread.sleep(1000); - try { - task = conn.read(wait_dn, (String[]) null); - if (task != null) { - LDAPAttribute attr = task.getAttribute("nsTaskExitCode"); - if (attr != null) { - taskComplete = true; - String val = (String) attr.getStringValues().nextElement(); - if (val.compareTo("0") != 0) { - CMS.debug("Error in populating local indexes: nsTaskExitCode=" + val); - } - } - } - } catch (LDAPException le) { - CMS.debug("Still checking wait_dn '" + wait_dn + "' (" + le.toString() + ")"); - } catch (Exception e) { - CMS.debug("Still checking wait_dn '" + wait_dn + "' (" + e.toString() + ")."); - } - } while ((!taskComplete) && (i < 20)); - if (i < 20) { - CMS.debug("Done checking wait_dn " + wait_dn); - } else { - CMS.debug("Done checking wait_dn " + wait_dn + " due to timeout."); - } - } + cs.putString("preop.internaldb.replicationpwd", replicationpwd); + cs.putString("preop.database.removeData", "false"); - conn.disconnect(); - CMS.debug("Done populating local indexes"); - } catch (Exception e) { - CMS.debug("Populating index failure - " + e); - } - - // setup replication after indexes have been created - if (select.equals("clone")) { - CMS.debug("Start setting up replication."); - setupReplication(request, context, (secure.equals("on") ? "true" : "false"), - replicationSecurity, masterReplicationPort, cloneReplicationPort); - CMS.debug("Finish setting up replication."); + ConfigurationUtils.reInitSubsystem(csType); + ConfigurationUtils.populateIndexes(); - try { - CMS.reinit(IDBSubsystem.SUB_ID); - String type = cs.getString("cs.type", ""); - if (type.equals("CA")) - CMS.reinit(ICertificateAuthority.ID); - CMS.reinit(IAuthSubsystem.ID); - CMS.reinit(IAuthzSubsystem.ID); - CMS.reinit(IUGSubsystem.ID); - } catch (Exception e) { + if (select.equals("clone")) { + CMS.debug("Start setting up replication."); + ConfigurationUtils.setupReplication(); + ConfigurationUtils.reInitSubsystem(csType); } - } - if (hasErr == false) { cs.putBoolean("preop.Database.done", true); - try { - cs.commit(false); - } catch (EBaseException e) { - CMS.debug( - "DatabasePanel: update() Exception caught at config commit: " - + e.toString()); - } - } - context.put("updateStatus", "success"); - } - - private void setupReplication(HttpServletRequest request, - Context context, String secure, String replicationSecurity, - int masterReplicationPort, int cloneReplicationPort) - throws IOException { - IConfigStore cs = CMS.getConfigStore(); - - String cstype = ""; - String machinename = ""; - String instanceId = ""; - try { - cstype = cs.getString("cs.type"); - cstype = toLowerCaseSubsystemType(cstype); - machinename = cs.getString("machineName", ""); - instanceId = cs.getString("instanceId", ""); - } catch (Exception e) { - } - - //setup replication agreement - String masterAgreementName = "masterAgreement1-" + machinename + "-" + instanceId; - cs.putString("internaldb.replication.master", masterAgreementName); - String cloneAgreementName = "cloneAgreement1-" + machinename + "-" + instanceId; - cs.putString("internaldb.replication.consumer", cloneAgreementName); - - try { cs.commit(false); } catch (Exception e) { - } - - // get connection to master - LDAPConnection masterConn = null; - ILdapConnFactory masterFactory = null; - try { - IConfigStore masterCfg = cs.getSubStore("preop.internaldb.master"); - masterFactory = CMS.getLdapBoundConnFactory(); - masterFactory.init(masterCfg); - masterConn = masterFactory.getConn(); - } catch (Exception e) { - CMS.debug("Failed to set up connection to master:" + e.toString()); - e.printStackTrace(); - throw new IOException("Failed to set up replication: No connection to master"); - } - - // get connection to replica - LDAPConnection replicaConn = null; - ILdapConnFactory replicaFactory = null; - try { - IConfigStore replicaCfg = cs.getSubStore("internaldb"); - replicaFactory = CMS.getLdapBoundConnFactory(); - replicaFactory.init(replicaCfg); - replicaConn = replicaFactory.getConn(); - } catch (Exception e) { - CMS.debug("Failed to set up connection to replica:" + e.toString()); e.printStackTrace(); - throw new IOException("Failed to set up replication: No connection to replica"); - } - - String master_hostname = ""; - String master_replicationpwd = ""; - String replica_hostname = ""; - String replica_replicationpwd = ""; - - try { - master_hostname = cs.getString("preop.internaldb.master.ldapconn.host", ""); - master_replicationpwd = cs.getString("preop.internaldb.master.replication.password", ""); - replica_hostname = cs.getString("internaldb.ldapconn.host", ""); - replica_replicationpwd = cs.getString("preop.internaldb.replicationpwd", ""); - } catch (Exception e) { - } - - String basedn = ""; - try { - basedn = cs.getString("internaldb.basedn"); - } catch (Exception e) { + CMS.debug("DatabasePanel update: error in populating database " + e.toString()); + context.put("errorString", e.toString()); + cs.putString("preop.database.errorString", e.toString()); + context.put("updateStatus", "failure"); + throw new IOException(e.toString()); } - try { - String suffix = cs.getString("internaldb.basedn", ""); - - String replicadn = "cn=replica,cn=\"" + suffix + "\",cn=mapping tree,cn=config"; - CMS.debug("DatabasePanel setupReplication: replicadn=" + replicadn); - - String masterBindUser = "Replication Manager " + masterAgreementName; - String cloneBindUser = "Replication Manager " + cloneAgreementName; - - createReplicationManager(masterConn, masterBindUser, master_replicationpwd); - createReplicationManager(replicaConn, cloneBindUser, replica_replicationpwd); - - String dir1 = getInstanceDir(masterConn); - createChangeLog(masterConn, dir1 + "/changelogs"); - - String dir2 = getInstanceDir(replicaConn); - createChangeLog(replicaConn, dir2 + "/changelogs"); - - int replicaId = cs.getInteger("dbs.beginReplicaNumber", 1); - - replicaId = enableReplication(replicadn, masterConn, masterBindUser, basedn, replicaId); - replicaId = enableReplication(replicadn, replicaConn, cloneBindUser, basedn, replicaId); - cs.putString("dbs.beginReplicaNumber", Integer.toString(replicaId)); - - CMS.debug("DatabasePanel setupReplication: Finished enabling replication"); - - createReplicationAgreement(replicadn, masterConn, masterAgreementName, - replica_hostname, cloneReplicationPort, replica_replicationpwd, basedn, - cloneBindUser, secure, replicationSecurity); - - createReplicationAgreement(replicadn, replicaConn, cloneAgreementName, - master_hostname, masterReplicationPort, master_replicationpwd, basedn, - masterBindUser, secure, replicationSecurity); - - // initialize consumer - initializeConsumer(replicadn, masterConn, masterAgreementName); - - while (!replicationDone(replicadn, masterConn, masterAgreementName)) { - CMS.debug("DatabasePanel setupReplication: Waiting for replication to complete"); - Thread.sleep(1000); - } - - String status = replicationStatus(replicadn, masterConn, masterAgreementName); - if (!status.startsWith("0 ")) { - CMS.debug("DatabasePanel setupReplication: consumer initialization failed. " + - status); - throw new IOException("consumer initialization failed. " + status); - } - - // remove master ldap password from password.conf (if present) - String passwordFile = cs.getString("passwordFile"); - IConfigStore psStore = CMS.createFileConfigStore(passwordFile); - psStore.remove("master_internaldb"); - psStore.commit(false); - - } catch (Exception e) { - CMS.debug("DatabasePanel setupReplication: " + e.toString()); - throw new IOException("Failed to setup the replication for cloning."); - } + context.put("updateStatus", "success"); } /** - * If validiate() returns false, this method will be called. + * If validate() returns false, this method will be called. */ public void displayError(HttpServletRequest request, HttpServletResponse response, @@ -1280,312 +521,4 @@ public class DatabasePanel extends WizardPanelBase { context.put("panel", "admin/console/config/databasepanel.vm"); } - private void createReplicationManager(LDAPConnection conn, String bindUser, String pwd) - throws LDAPException { - LDAPAttributeSet attrs = null; - LDAPEntry entry = null; - String dn = "cn=" + bindUser + ",ou=csusers,cn=config"; - try { - attrs = new LDAPAttributeSet(); - attrs.add(new LDAPAttribute("objectclass", "top")); - attrs.add(new LDAPAttribute("objectclass", "person")); - attrs.add(new LDAPAttribute("userpassword", pwd)); - attrs.add(new LDAPAttribute("cn", bindUser)); - attrs.add(new LDAPAttribute("sn", "manager")); - entry = new LDAPEntry(dn, attrs); - conn.add(entry); - } catch (LDAPException e) { - if (e.getLDAPResultCode() == LDAPException.ENTRY_ALREADY_EXISTS) { - CMS.debug("DatabasePanel createReplicationManager: Replication Manager has already used"); - try { - conn.delete(dn); - conn.add(entry); - } catch (LDAPException ee) { - CMS.debug("DatabasePanel createReplicationManager: " + ee.toString()); - } - return; - } else { - CMS.debug("DatabasePanel createReplicationManager: Failed to create replication manager. Exception: " - + e.toString()); - throw e; - } - } - - CMS.debug("DatabasePanel createReplicationManager: Successfully created Replication Manager"); - } - - private void createChangeLog(LDAPConnection conn, String dir) - throws LDAPException { - LDAPAttributeSet attrs = null; - LDAPEntry entry = null; - String dn = "cn=changelog5,cn=config"; - try { - attrs = new LDAPAttributeSet(); - attrs.add(new LDAPAttribute("objectclass", "top")); - attrs.add(new LDAPAttribute("objectclass", "extensibleObject")); - attrs.add(new LDAPAttribute("cn", "changelog5")); - attrs.add(new LDAPAttribute("nsslapd-changelogdir", dir)); - entry = new LDAPEntry(dn, attrs); - conn.add(entry); - } catch (LDAPException e) { - if (e.getLDAPResultCode() == LDAPException.ENTRY_ALREADY_EXISTS) { - CMS.debug("DatabasePanel createChangeLog: Changelog entry has already used"); - /* leave it, dont delete it because it will have operation error - try { - conn.delete(dn); - conn.add(entry); - } catch (LDAPException ee) { - CMS.debug("DatabasePanel createChangeLog: "+ee.toString()); - } - */ - return; - } else { - CMS.debug("DatabasePanel createChangeLog: Failed to create changelog entry. Exception: " + e.toString()); - throw e; - } - } - - CMS.debug("DatabasePanel createChangeLog: Successfully create change log entry"); - } - - private int enableReplication(String replicadn, LDAPConnection conn, String bindUser, String basedn, int id) - throws LDAPException { - CMS.debug("DatabasePanel enableReplication: replicadn: " + replicadn); - LDAPAttributeSet attrs = null; - LDAPEntry entry = null; - try { - attrs = new LDAPAttributeSet(); - attrs.add(new LDAPAttribute("objectclass", "top")); - attrs.add(new LDAPAttribute("objectclass", "nsDS5Replica")); - attrs.add(new LDAPAttribute("objectclass", "extensibleobject")); - attrs.add(new LDAPAttribute("nsDS5ReplicaRoot", basedn)); - attrs.add(new LDAPAttribute("nsDS5ReplicaType", "3")); - attrs.add(new LDAPAttribute("nsDS5ReplicaBindDN", - "cn=" + bindUser + ",ou=csusers,cn=config")); - attrs.add(new LDAPAttribute("cn", "replica")); - attrs.add(new LDAPAttribute("nsDS5ReplicaId", Integer.toString(id))); - attrs.add(new LDAPAttribute("nsds5flags", "1")); - entry = new LDAPEntry(replicadn, attrs); - conn.add(entry); - } catch (LDAPException e) { - if (e.getLDAPResultCode() == LDAPException.ENTRY_ALREADY_EXISTS) { - /* BZ 470918 -we cant just add the new dn. We need to do a replace instead - * until the DS code is fixed */ - CMS.debug("DatabasePanel enableReplication: " + replicadn + " has already been used"); - - try { - entry = conn.read(replicadn); - LDAPAttribute attr = entry.getAttribute("nsDS5ReplicaBindDN"); - attr.addValue("cn=" + bindUser + ",ou=csusers,cn=config"); - LDAPModification mod = new LDAPModification(LDAPModification.REPLACE, attr); - conn.modify(replicadn, mod); - } catch (LDAPException ee) { - CMS.debug("DatabasePanel enableReplication: Failed to modify " - + replicadn + " entry. Exception: " + e.toString()); - } - return id; - } else { - CMS.debug("DatabasePanel enableReplication: Failed to create " - + replicadn + " entry. Exception: " + e.toString()); - return id; - } - } - - CMS.debug("DatabasePanel enableReplication: Successfully create " + replicadn + " entry."); - return id + 1; - } - - private void createReplicationAgreement(String replicadn, - LDAPConnection conn, String name, String replicahost, int replicaport, - String replicapwd, String basedn, String bindUser, String secure, String replicationSecurity) - throws LDAPException { - String dn = "cn=" + name + "," + replicadn; - CMS.debug("DatabasePanel createReplicationAgreement: dn: " + dn); - LDAPEntry entry = null; - LDAPAttributeSet attrs = null; - try { - attrs = new LDAPAttributeSet(); - attrs.add(new LDAPAttribute("objectclass", "top")); - attrs.add(new LDAPAttribute("objectclass", - "nsds5replicationagreement")); - attrs.add(new LDAPAttribute("cn", name)); - attrs.add(new LDAPAttribute("nsDS5ReplicaRoot", basedn)); - attrs.add(new LDAPAttribute("nsDS5ReplicaHost", replicahost)); - - attrs.add(new LDAPAttribute("nsDS5ReplicaPort", "" + replicaport)); - attrs.add(new LDAPAttribute("nsDS5ReplicaBindDN", - "cn=" + bindUser + ",ou=csusers,cn=config")); - attrs.add(new LDAPAttribute("nsDS5ReplicaBindMethod", "Simple")); - attrs.add(new LDAPAttribute("nsds5replicacredentials", replicapwd)); - - if (replicationSecurity.equals("SSL")) { - attrs.add(new LDAPAttribute("nsDS5ReplicaTransportInfo", "SSL")); - } else if (replicationSecurity.equals("TLS")) { - attrs.add(new LDAPAttribute("nsDS5ReplicaTransportInfo", "TLS")); - } - - CMS.debug("About to set description attr to " + name); - attrs.add(new LDAPAttribute("description", name)); - - entry = new LDAPEntry(dn, attrs); - conn.add(entry); - } catch (LDAPException e) { - if (e.getLDAPResultCode() == LDAPException.ENTRY_ALREADY_EXISTS) { - CMS.debug("DatabasePanel createReplicationAgreement: " + dn + " has already used"); - try { - conn.delete(dn); - } catch (LDAPException ee) { - CMS.debug("DatabasePanel createReplicationAgreement: " + ee.toString()); - throw ee; - } - - try { - conn.add(entry); - } catch (LDAPException ee) { - CMS.debug("DatabasePanel createReplicationAgreement: " + ee.toString()); - throw ee; - } - } else { - CMS.debug("DatabasePanel createReplicationAgreement: Failed to create " - + dn + " entry. Exception: " + e.toString()); - throw e; - } - } - - CMS.debug("DatabasePanel createReplicationAgreement: Successfully create replication agreement " + name); - } - - private void initializeConsumer(String replicadn, LDAPConnection conn, - String name) { - String dn = "cn=" + name + "," + replicadn; - CMS.debug("DatabasePanel initializeConsumer: initializeConsumer dn: " + dn); - CMS.debug("DatabasePanel initializeConsumer: initializeConsumer host: " - + conn.getHost() + " port: " + conn.getPort()); - try { - LDAPAttribute attr = new LDAPAttribute("nsds5beginreplicarefresh", - "start"); - LDAPModification mod = new LDAPModification( - LDAPModification.REPLACE, attr); - CMS.debug("DatabasePanel initializeConsumer: start modifying"); - conn.modify(dn, mod); - CMS.debug("DatabasePanel initializeConsumer: Finish modification."); - } catch (LDAPException e) { - CMS.debug("DatabasePanel initializeConsumer: Failed to modify " + dn + " entry. Exception: " + e.toString()); - return; - } catch (Exception e) { - CMS.debug("DatabasePanel initializeConsumer: exception " + e); - } - - try { - CMS.debug("DatabasePanel initializeConsumer: thread sleeping for 5 seconds."); - Thread.sleep(5000); - CMS.debug("DatabasePanel initializeConsumer: finish sleeping."); - } catch (InterruptedException ee) { - CMS.debug("DatabasePanel initializeConsumer: exception: " + ee.toString()); - } - - CMS.debug("DatabasePanel initializeConsumer: Successfully initialize consumer"); - } - - private boolean replicationDone(String replicadn, LDAPConnection conn, String name) - throws IOException { - String dn = "cn=" + name + "," + replicadn; - String filter = "(objectclass=*)"; - String[] attrs = { "nsds5beginreplicarefresh" }; - - CMS.debug("DatabasePanel replicationDone: dn: " + dn); - try { - LDAPSearchResults results = conn.search(dn, LDAPConnection.SCOPE_BASE, filter, - attrs, true); - - int count = results.getCount(); - if (count < 1) { - throw new IOException("Replication entry not found"); - } - - LDAPEntry entry = results.next(); - LDAPAttribute refresh = entry.getAttribute("nsds5beginreplicarefresh"); - if (refresh == null) { - return true; - } - return false; - } catch (Exception e) { - CMS.debug("DatabasePanel replicationDone: exception " + e); - throw new IOException("Exception in replicationDone: " + e); - } - } - - private String replicationStatus(String replicadn, LDAPConnection conn, String name) - throws IOException { - String dn = "cn=" + name + "," + replicadn; - String filter = "(objectclass=*)"; - String[] attrs = { "nsds5replicalastinitstatus" }; - - CMS.debug("DatabasePanel replicationStatus: dn: " + dn); - try { - LDAPSearchResults results = conn.search(dn, LDAPConnection.SCOPE_BASE, filter, - attrs, false); - - int count = results.getCount(); - if (count < 1) { - throw new IOException("Replication entry not found"); - } - - LDAPEntry entry = results.next(); - LDAPAttribute attr = entry.getAttribute("nsds5replicalastinitstatus"); - if (attr != null) { - @SuppressWarnings("unchecked") - Enumeration valsInAttr = attr.getStringValues(); - if (valsInAttr.hasMoreElements()) { - return valsInAttr.nextElement(); - } else { - throw new IOException("No value returned for nsds5replicalastinitstatus"); - } - } else { - throw new IOException("nsDS5ReplicaLastInitStatus is null."); - } - } catch (Exception e) { - CMS.debug("DatabasePanel replicationStatus: exception " + e); - throw new IOException("Exception in replicationStatus: " + e); - } - } - - private String getInstanceDir(LDAPConnection conn) { - String instancedir = ""; - try { - String filter = "(objectclass=*)"; - String[] attrs = { "nsslapd-directory" }; - LDAPSearchResults results = - conn.search("cn=config,cn=ldbm database,cn=plugins,cn=config", LDAPv3.SCOPE_SUB, - filter, attrs, false); - - while (results.hasMoreElements()) { - LDAPEntry entry = results.next(); - String dn = entry.getDN(); - CMS.debug("DatabasePanel getInstanceDir: DN for storing nsslapd-directory: " + dn); - LDAPAttributeSet entryAttrs = entry.getAttributeSet(); - @SuppressWarnings("unchecked") - Enumeration attrsInSet = entryAttrs.getAttributes(); - while (attrsInSet.hasMoreElements()) { - LDAPAttribute nextAttr = attrsInSet.nextElement(); - String attrName = nextAttr.getName(); - CMS.debug("DatabasePanel getInstanceDir: attribute name: " + attrName); - @SuppressWarnings("unchecked") - Enumeration valsInAttr = nextAttr.getStringValues(); - while (valsInAttr.hasMoreElements()) { - String nextValue = valsInAttr.nextElement(); - if (attrName.equalsIgnoreCase("nsslapd-directory")) { - CMS.debug("DatabasePanel getInstanceDir: instanceDir=" + nextValue); - return nextValue.substring(0, nextValue.lastIndexOf("/db")); - } - } - } - } - } catch (LDAPException e) { - CMS.debug("DatabasePanel getInstanceDir: Error in retrieving the instance directory. Exception: " - + e.toString()); - } - - return instancedir; - } } -- cgit