From 06ec8c88556b02782c7b91a233de91eaf4a1439d Mon Sep 17 00:00:00 2001
From: jvergara <jvergara@localhost>
Date: Tue, 09 Jun 2009 12:28:05 +0000
Subject: [PATCH] Fix for issue 3550 (Consider making the control panel able to manage remote servers)
---
opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java | 393 +++++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 301 insertions(+), 92 deletions(-)
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java b/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java
index d76e9b5..8e037ee 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java
@@ -27,6 +27,7 @@
package org.opends.guitools.controlpanel.datamodel;
+import java.io.File;
import java.net.InetAddress;
import java.util.Collection;
import java.util.Collections;
@@ -58,7 +59,7 @@
import org.opends.guitools.controlpanel.util.ConfigReader;
import org.opends.guitools.controlpanel.util.Utilities;
import org.opends.quicksetup.util.UIKeyStore;
-import org.opends.server.core.DirectoryServer;
+import org.opends.quicksetup.util.Utils;
import org.opends.server.tools.ConfigureWindowsService;
/**
@@ -88,11 +89,16 @@
private String startTLSURL;
private String ldapsURL;
private String adminConnectorURL;
+ private String localAdminConnectorURL;
private String lastWorkingBindDN;
private String lastWorkingBindPwd;
+ private String lastRemoteHostName;
+ private String lastRemoteAdministrationURL;
private static boolean mustDeregisterConfig;
+ private boolean isLocal = true;
+
private Set<AbstractIndexDescriptor> modifiedIndexes =
new HashSet<AbstractIndexDescriptor>();
@@ -296,6 +302,8 @@
{
lastWorkingBindDN = ConnectionUtils.getBindDN(ctx);
lastWorkingBindPwd = ConnectionUtils.getBindPassword(ctx);
+ lastRemoteHostName = ConnectionUtils.getHostName(ctx);
+ lastRemoteAdministrationURL = ConnectionUtils.getLdapUrl(ctx);
}
}
@@ -420,7 +428,9 @@
*/
protected ConfigFromDirContext createNewConfigFromDirContextReader()
{
- return new ConfigFromDirContext();
+ ConfigFromDirContext configFromDirContext = new ConfigFromDirContext();
+ configFromDirContext.setIsLocal(isLocal());
+ return configFromDirContext;
}
/**
@@ -439,39 +449,55 @@
desc.setSchema(reader.getSchema());
desc.setSchemaEnabled(reader.isSchemaEnabled());
}
+ private int i=0;
/**
* Regenerates the last found ServerDescriptor object.
*
*/
public synchronized void regenerateDescriptor()
{
+ boolean isLocal = isLocal();
+
ServerDescriptor desc = createNewServerDescriptorInstance();
+ desc.setIsLocal(isLocal);
InitialLdapContext ctx = getDirContext();
- desc.setInstallPath(Utilities.getServerRootDirectory());
- desc.setInstancePath(Utilities.getInstanceRootDirectory(
- Utilities.getServerRootDirectory().getAbsolutePath()));
- boolean windowsServiceEnabled = false;
- if (Utilities.isWindows())
+ if (isLocal)
{
- int result = ConfigureWindowsService.serviceState(null, null);
- windowsServiceEnabled =
- result == ConfigureWindowsService.SERVICE_STATE_ENABLED;
- }
- desc.setWindowsServiceEnabled(windowsServiceEnabled);
- desc.setOpenDSVersion(
+ desc.setOpenDSVersion(
org.opends.server.util.DynamicConstants.FULL_VERSION_STRING);
+ desc.setInstallPath(Utilities.getServerRootDirectory());
+ desc.setInstancePath(Utilities.getInstanceRootDirectory(
+ Utilities.getServerRootDirectory().getAbsolutePath()));
+ boolean windowsServiceEnabled = false;
+ if (Utilities.isWindows())
+ {
+ int result = ConfigureWindowsService.serviceState(null, null);
+ windowsServiceEnabled =
+ result == ConfigureWindowsService.SERVICE_STATE_ENABLED;
+ }
+ desc.setWindowsServiceEnabled(windowsServiceEnabled);
+ }
+ else
+ {
+ if (lastRemoteHostName != null)
+ {
+ desc.setHostname(lastRemoteHostName);
+ }
+ }
ConfigReader reader;
ServerDescriptor.ServerStatus status = null;
for (Task task : getTasks())
{
if ((task.getType() == Task.Type.START_SERVER) &&
- task.getState() == Task.State.RUNNING)
+ (task.getState() == Task.State.RUNNING) &&
+ isRunningOnServer(desc, task))
{
status = ServerDescriptor.ServerStatus.STARTING;
}
else if ((task.getType() == Task.Type.STOP_SERVER) &&
- task.getState() == Task.State.RUNNING)
+ (task.getState() == Task.State.RUNNING) &&
+ isRunningOnServer(desc, task))
{
status = ServerDescriptor.ServerStatus.STOPPING;
}
@@ -514,11 +540,19 @@
userDataCtx = null;
}
}
- reader = createNewConfigFromFileReader();
- ((ConfigFromFile)reader).readConfiguration();
+ if (isLocal)
+ {
+ reader = createNewConfigFromFileReader();
+ ((ConfigFromFile)reader).readConfiguration();
+ }
+ else
+ {
+ reader = null;
+ }
desc.setAuthenticated(false);
}
- else if (Utilities.isServerRunning(
+ else if (!isLocal ||
+ Utilities.isServerRunning(
Utilities.getInstanceRootDirectory(
desc.getInstallPath().getAbsolutePath())))
{
@@ -529,8 +563,19 @@
// Try with previous credentials.
try
{
- ctx = Utilities.getAdminDirContext(this, lastWorkingBindDN,
+ if (isLocal)
+ {
+ ctx = Utilities.getAdminDirContext(this, lastWorkingBindDN,
lastWorkingBindPwd);
+ }
+ else if (lastRemoteAdministrationURL != null)
+ {
+ ctx = Utils.createLdapsContext(lastRemoteAdministrationURL,
+ lastWorkingBindDN,
+ lastWorkingBindPwd,
+ Utils.getDefaultLDAPTimeout(), null,
+ getTrustManager());
+ }
}
catch (ConfigReadException cre)
{
@@ -546,83 +591,117 @@
}
}
- if (ctx == null)
+ if (isLocal && (ctx == null))
{
reader = createNewConfigFromFileReader();
((ConfigFromFile)reader).readConfiguration();
}
else
{
- reader = createNewConfigFromDirContextReader();
- ((ConfigFromDirContext)reader).readConfiguration(ctx);
- if (reader.getExceptions().size() > 0)
+ if (!isLocal && (ctx == null))
{
- // Check the connection
- boolean connectionWorks = false;
- int nMaxErrors = 5;
- for (int i=0; i< nMaxErrors && !connectionWorks; i++)
+ desc.setStatus(ServerDescriptor.ServerStatus.NOT_CONNECTED_TO_REMOTE);
+ reader = null;
+ }
+ else
+ {
+ reader = createNewConfigFromDirContextReader();
+ ((ConfigFromDirContext)reader).readConfiguration(ctx);
+ if (reader.getExceptions().size() > 0)
{
- try
- {
- Utilities.pingDirContext(ctx);
- connectionWorks = true;
- }
- catch (NamingException ne)
+ // Check the connection
+ boolean connectionWorks = false;
+ int nMaxErrors = 5;
+ for (int i=0; i< nMaxErrors && !connectionWorks; i++)
{
try
{
- Thread.sleep(400);
+ Utilities.pingDirContext(ctx);
+ connectionWorks = true;
+ }
+ catch (NamingException ne)
+ {
+ try
+ {
+ Thread.sleep(400);
+ }
+ catch (Throwable t)
+ {
+ }
+ }
+ }
+ if (!connectionWorks)
+ {
+ if (isLocal)
+ {
+ // Try with offline info
+ reader = createNewConfigFromFileReader();
+ ((ConfigFromFile)reader).readConfiguration();
+ }
+ else
+ {
+ desc.setStatus(
+ ServerDescriptor.ServerStatus.NOT_CONNECTED_TO_REMOTE);
+ reader = null;
+ }
+ try
+ {
+ ctx.close();
}
catch (Throwable t)
{
}
- }
- }
- if (!connectionWorks)
- {
- // Try with offline info
- reader = createNewConfigFromFileReader();
- ((ConfigFromFile)reader).readConfiguration();
- try
- {
- ctx.close();
- }
- catch (Throwable t)
- {
- }
- this.ctx = null;
- if (connectionPool.isConnectionRegistered(userDataCtx))
- {
+ this.ctx = null;
+ if (connectionPool.isConnectionRegistered(userDataCtx))
+ {
+ try
+ {
+ connectionPool.unregisterConnection(userDataCtx);
+ }
+ catch (Throwable t)
+ {
+ }
+ }
try
{
- connectionPool.unregisterConnection(userDataCtx);
+ userDataCtx.close();
}
catch (Throwable t)
{
}
+ userDataCtx = null;
}
- try
- {
- userDataCtx.close();
- }
- catch (Throwable t)
- {
- }
- userDataCtx = null;
}
}
}
- desc.setAuthenticated(reader instanceof ConfigFromDirContext);
- desc.setJavaVersion(reader.getJavaVersion());
- desc.setOpenConnections(reader.getOpenConnections());
- if (reader instanceof ConfigFromDirContext)
+ if (reader != null)
{
- ConfigFromDirContext rCtx = (ConfigFromDirContext)reader;
- desc.setRootMonitor(rCtx.getRootMonitor());
- desc.setEntryCachesMonitor(rCtx.getEntryCaches());
- desc.setJvmMemoryUsageMonitor(rCtx.getJvmMemoryUsage());
- desc.setSystemInformationMonitor(rCtx.getSystemInformation());
- desc.setWorkQueueMonitor(rCtx.getWorkQueue());
+ desc.setAuthenticated(reader instanceof ConfigFromDirContext);
+ desc.setJavaVersion(reader.getJavaVersion());
+ desc.setOpenConnections(reader.getOpenConnections());
+ if (reader instanceof ConfigFromDirContext)
+ {
+ ConfigFromDirContext rCtx = (ConfigFromDirContext)reader;
+ desc.setRootMonitor(rCtx.getRootMonitor());
+ desc.setEntryCachesMonitor(rCtx.getEntryCaches());
+ desc.setJvmMemoryUsageMonitor(rCtx.getJvmMemoryUsage());
+ desc.setSystemInformationMonitor(rCtx.getSystemInformation());
+ desc.setWorkQueueMonitor(rCtx.getWorkQueue());
+ desc.setOpenDSVersion((String)Utilities.getFirstMonitoringValue(
+ rCtx.getVersionMonitor(), "fullVersion"));
+ String installPath = (String)Utilities.getFirstMonitoringValue(
+ rCtx.getSystemInformation(), "installPath");
+ if (installPath != null)
+ {
+ desc.setInstallPath(new File(installPath));
+ }
+ String instancePath = (String)Utilities.getFirstMonitoringValue(
+ rCtx.getSystemInformation(), "instancePath");
+ if (instancePath != null)
+ {
+ desc.setInstancePath(new File(instancePath));
+ }
+ }
}
}
else
@@ -632,24 +711,21 @@
reader = createNewConfigFromFileReader();
((ConfigFromFile)reader).readConfiguration();
}
- updateServerDescriptor(reader, desc);
+ if (reader != null)
+ {
+ updateServerDescriptor(reader, desc);
+ }
if ((serverDesc == null) || !serverDesc.equals(desc))
{
serverDesc = desc;
- // Update the schema: so that when we call the server code the latest
- // schema read is used.
- if (serverDesc.getSchema() != null)
- {
- if (!ServerDescriptor.areSchemasEqual(serverDesc.getSchema(),
- DirectoryServer.getSchema()))
- {
- DirectoryServer.setSchema(desc.getSchema());
- }
- }
ldapURL = getURL(serverDesc, ConnectionHandlerDescriptor.Protocol.LDAP);
ldapsURL = getURL(serverDesc, ConnectionHandlerDescriptor.Protocol.LDAPS);
adminConnectorURL = getAdminConnectorURL(serverDesc);
+ if (serverDesc.isLocal())
+ {
+ localAdminConnectorURL = adminConnectorURL;
+ }
startTLSURL = getURL(serverDesc,
ConnectionHandlerDescriptor.Protocol.LDAP_STARTTLS);
ConfigurationChangeEvent ev = new ConfigurationChangeEvent(this, desc);
@@ -766,6 +842,7 @@
regenerateDescriptor();
Thread.sleep(poolingPeriod);
}
+
}
catch (Throwable t)
{
@@ -861,7 +938,29 @@
*/
public String getAdminConnectorURL()
{
- return adminConnectorURL;
+ if (isLocal)
+ {
+ // If the user set isLocal to true, we want to return the
+ // localAdminConnectorURL (in particular if regenerateDescriptor has not
+ // been called).
+ return localAdminConnectorURL;
+ }
+ else
+ {
+ return adminConnectorURL;
+ }
+ }
+
+ /**
+ * Gets the Administration Connector URL based in what is read in the local
+ * configuration. It returns <CODE>null</CODE> if no Administration
+ * Connector URL was found.
+ * @return the Administration Connector URL to be used to connect
+ * to the local server.
+ */
+ public String getLocalAdminConnectorURL()
+ {
+ return localAdminConnectorURL;
}
/**
@@ -958,20 +1057,27 @@
String url = null;
ConnectionHandlerDescriptor desc = server.getAdminConnector();
- int port = desc.getPort();
- SortedSet<InetAddress> addresses = desc.getAddresses();
- if (addresses.size() == 0) {
- if (port > 0) {
- url = "ldaps://localhost:" + port;
- }
- } else {
- if (port > 0) {
- InetAddress address = addresses.first();
- url = "ldaps://" +
+ if (desc != null)
+ {
+ int port = desc.getPort();
+ SortedSet<InetAddress> addresses = desc.getAddresses();
+ if (addresses.size() == 0) {
+ if (port > 0) {
+ url = "ldaps://localhost:" + port;
+ }
+ } else {
+ if (port > 0) {
+ InetAddress address = addresses.first();
+ url = "ldaps://" +
ConnectionUtils.getHostNameForLdapUrl(address.getHostAddress()) + ":"
+ port;
+ }
}
}
+ else
+ {
+ url = null;
+ }
return url;
}
@@ -1081,6 +1187,26 @@
}
/**
+ * Sets whether the server is local or not.
+ * @param isLocal whether the server is local or not.
+ */
+ public void setIsLocal(boolean isLocal)
+ {
+ this.isLocal = isLocal;
+ }
+
+ /**
+ * Returns <CODE>true</CODE> if we are trying to manage the local host and
+ * <CODE>false</CODE> otherwise.
+ * @return <CODE>true</CODE> if we are trying to manage the local host and
+ * <CODE>false</CODE> otherwise.
+ */
+ public boolean isLocal()
+ {
+ return isLocal;
+ }
+
+ /**
* Returns the connection pool to be used by the LDAP entry browsers.
* @return the connection pool to be used by the LDAP entry browsers.
*/
@@ -1115,4 +1241,87 @@
{
this.poolingPeriod = poolingPeriod;
}
+
+ /**
+ * Returns whether the provided task is running on the provided server or not.
+ * The code takes into account that the server object might not be fully
+ * initialized (but at least it contains the host name and the instance
+ * path if it is local).
+ * @param server the server.
+ * @param task the task to be analyzed.
+ * @return <CODE>true</CODE> if the provided task is running on the provided
+ * server and <CODE>false</CODE> otherwise.
+ */
+ private boolean isRunningOnServer(ServerDescriptor server, Task task)
+ {
+ boolean isRunningOnServer;
+ if (!server.isLocal() || !task.getServer().isLocal())
+ {
+ if (!server.isLocal())
+ {
+ // At this point we only have connection information about the new
+ // server. Use the dir context which corresponds to the server to
+ // compare things.
+ String host1 = server.getHostname();
+ String host2 = task.getServer().getHostname();
+ if (host1 == null)
+ {
+ isRunningOnServer = host2 == null;
+ }
+ else
+ {
+ isRunningOnServer = host1.equalsIgnoreCase(host2);
+ }
+ if (isRunningOnServer)
+ {
+ // Compare administration port;
+ int adminPort1 = -1;
+ int adminPort2 = -1;
+ if (server.getAdminConnector() != null)
+ {
+ adminPort1 = server.getAdminConnector().getPort();
+ }
+
+ if (getDirContext() != null)
+ {
+ adminPort2 = ConnectionUtils.getPort(getDirContext());
+ }
+ isRunningOnServer = adminPort1 == adminPort2;
+ }
+ }
+ else
+ {
+ // Compare host names and paths
+ File f1 = server.getInstancePath();
+ File f2 = task.getServer().getInstancePath();
+
+ String host1 = server.getHostname();
+ String host2 = task.getServer().getHostname();
+ if (host1 == null)
+ {
+ isRunningOnServer = host2 == null;
+ }
+ else
+ {
+ isRunningOnServer = host1.equalsIgnoreCase(host2);
+ }
+ if (isRunningOnServer)
+ {
+ if (f1 == null)
+ {
+ isRunningOnServer = f2 == null;
+ }
+ else
+ {
+ isRunningOnServer = f1.equals(f2);
+ }
+ }
+ }
+ }
+ else
+ {
+ isRunningOnServer = true;
+ }
+ return isRunningOnServer;
+ }
}
--
Gitblit v1.10.0