/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2008 Sun Microsystems, Inc. */ package org.opends.guitools.controlpanel.util; import static org.opends.messages.AdminToolMessages.*; import java.net.InetAddress; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import java.util.logging.Level; import java.util.logging.Logger; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; import javax.naming.ldap.InitialLdapContext; import javax.naming.ldap.LdapName; import org.opends.admin.ads.util.ConnectionUtils; import org.opends.guitools.controlpanel.datamodel.AbstractIndexDescriptor; import org.opends.guitools.controlpanel.datamodel.BackendDescriptor; import org.opends.guitools.controlpanel.datamodel.BaseDNDescriptor; import org.opends.guitools.controlpanel.datamodel.ConnectionHandlerDescriptor; import org.opends.guitools.controlpanel.datamodel.IndexDescriptor; import org.opends.guitools.controlpanel.datamodel.VLVIndexDescriptor; import org.opends.guitools.controlpanel.datamodel.VLVSortOrder; import org.opends.guitools.controlpanel.task.OnlineUpdateException; import org.opends.server.admin.client.ManagementContext; import org.opends.server.admin.client.ldap.JNDIDirContextAdaptor; import org.opends.server.admin.client.ldap.LDAPManagementContext; import org.opends.server.admin.std.client.*; import org.opends.server.admin.std.meta.LocalDBIndexCfgDefn.IndexType; import org.opends.server.types.DN; import org.opends.server.types.OpenDsException; /** * A class that reads the configuration and monitoring information using a * DirContext through LDAP. * */ public class ConfigFromDirContext extends ConfigReader { private static final Logger LOG = Logger.getLogger(ConfigFromDirContext.class.getName()); /** * Reads configuration and monitoring information using the provided * connection. * @param ctx the connection to be used to read the information. */ public void readConfiguration(InitialLdapContext ctx) { List ex = new ArrayList(); Set ls = new HashSet(); Set bs = new HashSet(); Set as = new HashSet(); try { // Get the Directory Server configuration handler and use it. ManagementContext mCtx = LDAPManagementContext.createFromContext( JNDIDirContextAdaptor.adapt(ctx)); RootCfgClient root = mCtx.getRootConfiguration(); try { AdministrationConnectorCfgClient adminConnector = root.getAdministrationConnector(); this.adminConnector = getConnectionHandler(adminConnector); } catch (OpenDsException oe) { ex.add(oe); } String[] connectionHandlers = root.listConnectionHandlers(); for (int i=0; i baseDNs = new TreeSet(); for (DN dn : backend.getBaseDN()) { BaseDNDescriptor baseDN = new BaseDNDescriptor(BaseDNDescriptor.Type.NOT_REPLICATED, dn, null, -1, -1, -1); baseDNs.add(baseDN); } SortedSet indexes = new TreeSet(); SortedSet vlvIndexes = new TreeSet(); BackendDescriptor.Type type; if (backend instanceof LocalDBBackendCfgClient) { type = BackendDescriptor.Type.LOCAL_DB; LocalDBBackendCfgClient db = (LocalDBBackendCfgClient)backend; String[] indexNames = db.listLocalDBIndexes(); try { for (int j=0; j(), -1)); indexes.add( new IndexDescriptor("id2children", null, null, new TreeSet(), -1)); indexes.add( new IndexDescriptor("id2subtree", null, null, new TreeSet(), -1)); String[] vlvIndexNames = db.listLocalDBVLVIndexes(); try { for (int j=0; j sortOrder = getVLVSortOrder(s); vlvIndexes.add(new VLVIndexDescriptor(index.getName(), null, index.getBaseDN(), index.getScope(), index.getFilter(), sortOrder, index.getMaxBlockSize())); } } catch (OpenDsException oe) { ex.add(oe); } } else if (backend instanceof LDIFBackendCfgClient) { type = BackendDescriptor.Type.LDIF; } else if (backend instanceof MemoryBackendCfgClient) { type = BackendDescriptor.Type.MEMORY; } else if (backend instanceof BackupBackendCfgClient) { type = BackendDescriptor.Type.BACKUP; } else if (backend instanceof MonitorBackendCfgClient) { type = BackendDescriptor.Type.MONITOR; } else if (backend instanceof TaskBackendCfgClient) { type = BackendDescriptor.Type.TASK; } else { type = BackendDescriptor.Type.OTHER; } BackendDescriptor desc = new BackendDescriptor(backend.getBackendId(), baseDNs, indexes, vlvIndexes, -1, backend.isEnabled(), type); for (AbstractIndexDescriptor index: indexes) { index.setBackend(desc); } for (AbstractIndexDescriptor index: vlvIndexes) { index.setBackend(desc); } for (BaseDNDescriptor baseDN : baseDNs) { baseDN.setBackend(desc); } bs.add(desc); } catch (OpenDsException oe) { ex.add(oe); } } boolean isReplicationSecure = false; try { CryptoManagerCfgClient cryptoManager = root.getCryptoManager(); isReplicationSecure = cryptoManager.isSSLEncryption(); } catch (OpenDsException oe) { ex.add(oe); } replicationPort = -1; ReplicationSynchronizationProviderCfgClient sync = null; try { sync = (ReplicationSynchronizationProviderCfgClient) root.getSynchronizationProvider("Multimaster Synchronization"); } catch (OpenDsException oe) { // Ignore this one } if (sync != null) { try { if (sync.isEnabled() && sync.hasReplicationServer()) { ReplicationServerCfgClient replicationServer = sync.getReplicationServer(); if (replicationServer != null) { replicationPort = replicationServer.getReplicationPort(); ConnectionHandlerDescriptor.Protocol protocol = isReplicationSecure ? ConnectionHandlerDescriptor.Protocol.REPLICATION_SECURE : ConnectionHandlerDescriptor.Protocol.REPLICATION; ConnectionHandlerDescriptor connHandler = new ConnectionHandlerDescriptor( new HashSet(), replicationPort, protocol, ConnectionHandlerDescriptor.State.ENABLED, "Multimaster Synchronization"); ls.add(connHandler); } } String[] domains = sync.listReplicationDomains(); if (domains != null) { for (int i=0; i bs, List ex) { // Read monitoring information: since it is computed, it is faster // to get everything in just one request. SearchControls ctls = new SearchControls(); ctls.setSearchScope(SearchControls.SUBTREE_SCOPE); ctls.setReturningAttributes( new String[] { "approx-older-change-not-synchronized-millis", "missing-changes", "base-dn", "server-id", "javaVersion", "currentConnections", "ds-backend-id", "ds-backend-entry-count", "ds-base-dn-entry-count" }); String filter = "(objectclass=*)"; try { LdapName jndiName = new LdapName("cn=monitor"); NamingEnumeration monitorEntries = ctx.search(jndiName, filter, ctls); javaVersion = null; numberConnections = -1; while (monitorEntries.hasMore()) { SearchResult sr = (SearchResult)monitorEntries.next(); if (javaVersion == null) { javaVersion = ConnectionUtils.getFirstValue(sr, "javaVersion"); } if (numberConnections == -1) { String v = ConnectionUtils.getFirstValue(sr, "currentConnections"); if (v != null) { numberConnections = Integer.parseInt(v); } } String dn = ConnectionUtils.getFirstValue(sr, "base-dn"); String replicaId = ConnectionUtils.getFirstValue(sr, "server-id"); if ((dn != null) && (replicaId != null)) { for (BackendDescriptor backend : bs) { for (BaseDNDescriptor baseDN : backend.getBaseDns()) { if (Utilities.areDnsEqual(baseDN.getDn().toString(), dn) && String.valueOf(baseDN.getReplicaID()).equals(replicaId)) { try { baseDN.setAgeOfOldestMissingChange( new Long(ConnectionUtils.getFirstValue(sr, "approx-older-change-not-synchronized-millis"))); } catch (Throwable t) { } try { baseDN.setMissingChanges(new Integer( ConnectionUtils.getFirstValue(sr, "missing-changes"))); } catch (Throwable t) { } } } } } else { String backendID = ConnectionUtils.getFirstValue(sr, "ds-backend-id"); String entryCount = ConnectionUtils.getFirstValue(sr, "ds-backend-entry-count"); Set baseDnEntries = ConnectionUtils.getValues(sr, "ds-base-dn-entry-count"); if ((backendID != null) && ((entryCount != null) || (baseDnEntries != null))) { for (BackendDescriptor backend : bs) { if (backend.getBackendID().equalsIgnoreCase(backendID)) { if (entryCount != null) { backend.setEntries(Integer.parseInt(entryCount)); } if (baseDnEntries != null) { for (String s : baseDnEntries) { int index = s.indexOf(" "); if (index != -1) { for (BaseDNDescriptor baseDN : backend.getBaseDns()) { dn = s.substring(index +1); if (Utilities.areDnsEqual(dn, baseDN.getDn().toString())) { try { baseDN.setEntries( Integer.parseInt(s.substring(0, index))); } catch (Throwable t) { /* Ignore */ } break; } } } } } } } } } } } catch (NamingException ne) { OnlineUpdateException oue = new OnlineUpdateException( ERR_READING_CONFIG_LDAP.get(ne.getMessage().toString()), ne); ex.add(oue); } } private ConnectionHandlerDescriptor getConnectionHandler( ConnectionHandlerCfgClient connHandler, String name) throws OpenDsException { SortedSet addresses = new TreeSet(); int port; ConnectionHandlerDescriptor.Protocol protocol; ConnectionHandlerDescriptor.State state = connHandler.isEnabled() ? ConnectionHandlerDescriptor.State.ENABLED : ConnectionHandlerDescriptor.State.DISABLED; if (connHandler instanceof LDAPConnectionHandlerCfgClient) { LDAPConnectionHandlerCfgClient ldap = (LDAPConnectionHandlerCfgClient)connHandler; if (ldap.isUseSSL()) { protocol = ConnectionHandlerDescriptor.Protocol.LDAPS; } else if (ldap.isAllowStartTLS()) { protocol = ConnectionHandlerDescriptor.Protocol.LDAP_STARTTLS; } else { protocol = ConnectionHandlerDescriptor.Protocol.LDAP; } SortedSet v = ldap.getListenAddress(); if (v == null) { addresses.addAll(v); } port = ldap.getListenPort(); } else if (connHandler instanceof JMXConnectionHandlerCfgClient) { JMXConnectionHandlerCfgClient jmx = (JMXConnectionHandlerCfgClient)connHandler; if (jmx.isUseSSL()) { protocol = ConnectionHandlerDescriptor.Protocol.JMXS; } else { protocol = ConnectionHandlerDescriptor.Protocol.JMX; } port = jmx.getListenPort(); } else if (connHandler instanceof LDIFConnectionHandlerCfgClient) { protocol = ConnectionHandlerDescriptor.Protocol.LDIF; port = -1; } else if (connHandler instanceof SNMPConnectionHandlerCfgClient) { protocol = ConnectionHandlerDescriptor.Protocol.SNMP; SNMPConnectionHandlerCfgClient snmp = (SNMPConnectionHandlerCfgClient)connHandler; port = snmp.getListenPort(); } else { protocol = ConnectionHandlerDescriptor.Protocol.OTHER; port = -1; } return new ConnectionHandlerDescriptor(addresses, port, protocol, state, name); } private ConnectionHandlerDescriptor getConnectionHandler( AdministrationConnectorCfgClient adminConnector) throws OpenDsException { SortedSet addresses = new TreeSet(); ConnectionHandlerDescriptor.Protocol protocol = ConnectionHandlerDescriptor.Protocol.ADMINISTRATION_CONNECTOR; ConnectionHandlerDescriptor.State state = ConnectionHandlerDescriptor.State.ENABLED; SortedSet v = adminConnector.getListenAddress(); if (v == null) { addresses.addAll(v); } int port = adminConnector.getListenPort(); return new ConnectionHandlerDescriptor(addresses, port, protocol, state, INFO_CTRL_PANEL_CONN_HANDLER_ADMINISTRATION.get().toString()); } }