summaryrefslogtreecommitdiffstats
path: root/base/common/src/com/netscape/cms/servlet/csadmin/DatabasePanel.java
diff options
context:
space:
mode:
authorAde Lee <alee@redhat.com>2012-04-26 23:48:43 -0400
committerAde Lee <alee@redhat.com>2012-05-02 16:47:27 -0400
commit9aea1e939f6357eadf777c72ae3ef43275829427 (patch)
tree07cfa655fcfd462c5217df8c8fe19cccc7e2e97f /base/common/src/com/netscape/cms/servlet/csadmin/DatabasePanel.java
parentfbf472de7a4eb3d141c32821a417ec5331b53c97 (diff)
downloadpki-9aea1e939f6357eadf777c72ae3ef43275829427.tar.gz
pki-9aea1e939f6357eadf777c72ae3ef43275829427.tar.xz
pki-9aea1e939f6357eadf777c72ae3ef43275829427.zip
Refactor installation servlets to use common code in ConfigurationUtils
Ticket #156
Diffstat (limited to 'base/common/src/com/netscape/cms/servlet/csadmin/DatabasePanel.java')
-rw-r--r--base/common/src/com/netscape/cms/servlet/csadmin/DatabasePanel.java1137
1 files changed, 35 insertions, 1102 deletions
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<String> errors = new ArrayList<String>();
- 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<String> 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<LDAPAttribute> attrsInSet = entryAttrs.getAttributes();
- while (attrsInSet.hasMoreElements()) {
- LDAPAttribute nextAttr = attrsInSet.nextElement();
- String attrName = nextAttr.getName();
- CMS.debug("DatabasePanel getInstanceDir: attribute name: " + attrName);
- @SuppressWarnings("unchecked")
- Enumeration<String> 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;
- }
}