| | |
| | | package org.opends.server.admin; |
| | | |
| | | |
| | | |
| | | import java.util.LinkedHashSet; |
| | | import java.util.LinkedList; |
| | | import java.util.List; |
| | | |
| | | import org.opends.server.core.DirectoryServer; |
| | | import org.opends.server.protocols.asn1.ASN1OctetString; |
| | | import org.opends.server.protocols.internal.InternalClientConnection; |
| | | import org.opends.server.protocols.internal.InternalSearchOperation; |
| | | import org.opends.server.protocols.ldap.LDAPFilter; |
| | |
| | | import org.opends.server.types.Attribute; |
| | | import org.opends.server.types.AttributeType; |
| | | import org.opends.server.types.Attributes; |
| | | import org.opends.server.types.ByteString; |
| | | import org.opends.server.types.DN; |
| | | import org.opends.server.types.DereferencePolicy; |
| | | import org.opends.server.types.DirectoryException; |
| | |
| | | import org.opends.server.types.SearchScope; |
| | | |
| | | |
| | | |
| | | /** |
| | | * Check if information found in "cn=admin data" is coherent with |
| | | * cn=config. If and inconsistancy is detected, we log a warning message |
| | | * and update "cn=admin data" |
| | | * cn=config. If and inconsistency is detected, we log a warning |
| | | * message and update "cn=admin data" |
| | | */ |
| | | public final class AdministrationDataSync |
| | | { |
| | |
| | | private InternalClientConnection internalConnection; |
| | | |
| | | /** |
| | | * The attribute name used to store the port. |
| | | * TODO Use the default one. |
| | | * The attribute name used to store the port. TODO Use the default |
| | | * one. |
| | | */ |
| | | private static final String LDAP_PORT = "ds-cfg-listen-port"; |
| | | |
| | | |
| | | |
| | | /** |
| | | * Create an object that will syncrhonize configuration and the admin data. |
| | | * Create an object that will syncrhonize configuration and the |
| | | * admin data. |
| | | * |
| | | * @param internalConnection The root connection. |
| | | * @param internalConnection |
| | | * The root connection. |
| | | */ |
| | | public AdministrationDataSync(InternalClientConnection internalConnection) |
| | | { |
| | | this.internalConnection = internalConnection ; |
| | | this.internalConnection = internalConnection; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Check if information found in "cn=admin data" is coherent with |
| | | * cn=config. If and inconsistancy is detected, we log a warning message |
| | | * and update "cn=admin data" |
| | | * cn=config. If and inconsistancy is detected, we log a warning |
| | | * message and update "cn=admin data" |
| | | */ |
| | | public void synchronize() |
| | | { |
| | |
| | | checkAdminConnector(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Check if the admin connector is in sync. The desynchronization could |
| | | * occurs after the upgrade from 1.0. |
| | | * Check if the admin connector is in sync. The desynchronization |
| | | * could occurs after the upgrade from 1.0. |
| | | */ |
| | | private void checkAdminConnector() |
| | | { |
| | |
| | | } |
| | | |
| | | // Get the admin port |
| | | String adminPort = |
| | | getAttr("cn=Administration Connector,cn=config", LDAP_PORT); |
| | | String adminPort = getAttr("cn=Administration Connector,cn=config", |
| | | LDAP_PORT); |
| | | if (adminPort == null) |
| | | { |
| | | // best effort. |
| | | return ; |
| | | return; |
| | | } |
| | | |
| | | LinkedList<Modification> mods = new LinkedList<Modification>(); |
| | | // adminport |
| | | String attName = "adminport"; |
| | | AttributeType attrType = |
| | | DirectoryServer.getAttributeType(attName.toLowerCase()); |
| | | AttributeType attrType = DirectoryServer.getAttributeType(attName |
| | | .toLowerCase()); |
| | | if (attrType == null) |
| | | { |
| | | attrType = DirectoryServer.getDefaultAttributeType(attName.toLowerCase()); |
| | | } |
| | | mods.add(new Modification(ModificationType.REPLACE, Attributes |
| | | .create(attrType, adminPort))); |
| | | mods.add(new Modification(ModificationType.REPLACE, Attributes.create( |
| | | attrType, adminPort))); |
| | | |
| | | // adminEnabled |
| | | attName = "adminEnabled"; |
| | |
| | | { |
| | | attrType = DirectoryServer.getDefaultAttributeType(attName.toLowerCase()); |
| | | } |
| | | mods.add(new Modification(ModificationType.REPLACE, Attributes |
| | | .create(attrType, "true"))); |
| | | mods.add(new Modification(ModificationType.REPLACE, Attributes.create( |
| | | attrType, "true"))); |
| | | |
| | | // Process modification |
| | | internalConnection.processModify(serverEntryDN,mods); |
| | | internalConnection.processModify(serverEntryDN, mods); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Look for the DN of the local register server. |
| | | * Assumption: default Connection Handler naming is used. |
| | | * Look for the DN of the local register server. Assumption: default |
| | | * Connection Handler naming is used. |
| | | * |
| | | * @return The DN of the local register server or null. |
| | | */ |
| | |
| | | DN returnDN = null; |
| | | |
| | | // Get the LDAP and LDAPS port |
| | | String ldapPort = |
| | | getAttr("cn=LDAP Connection Handler,cn=Connection Handlers,cn=config", |
| | | LDAP_PORT); |
| | | String ldapsPort = |
| | | getAttr("cn=LDAPS Connection Handler,cn=Connection Handlers,cn=config", |
| | | LDAP_PORT); |
| | | String ldapPort = getAttr( |
| | | "cn=LDAP Connection Handler,cn=Connection Handlers,cn=config", |
| | | LDAP_PORT); |
| | | String ldapsPort = getAttr( |
| | | "cn=LDAPS Connection Handler,cn=Connection Handlers,cn=config", |
| | | LDAP_PORT); |
| | | boolean ldapsPortEnable = false; |
| | | String val = |
| | | getAttr("cn=LDAPS Connection Handler,cn=Connection Handlers,cn=config", |
| | | "ds-cfg-enabled"); |
| | | String val = getAttr( |
| | | "cn=LDAPS Connection Handler,cn=Connection Handlers,cn=config", |
| | | "ds-cfg-enabled"); |
| | | if (val != null) |
| | | { |
| | | ldapsPortEnable = val.toLowerCase().equals("true"); |
| | |
| | | if ((ldapPort == null) && (ldapsPort == null)) |
| | | { |
| | | // best effort (see assumption) |
| | | return null ; |
| | | return null; |
| | | } |
| | | |
| | | // Get the IP address of the local host. |
| | |
| | | } |
| | | catch (Throwable t) |
| | | { |
| | | // best effort. |
| | | // best effort. |
| | | return null; |
| | | } |
| | | |
| | |
| | | SearchScope.SINGLE_LEVEL, "objectclass=*"); |
| | | if (op.getResultCode() == ResultCode.SUCCESS) |
| | | { |
| | | Entry entry = null; |
| | | Entry entry = null; |
| | | for (Entry currentEntry : op.getSearchEntries()) |
| | | { |
| | | String currentHostname = currentEntry.getAttributeValue(hostnameType, |
| | |
| | | { |
| | | // Check if one of the port match |
| | | attrName = "ldapport"; |
| | | AttributeType portType = |
| | | DirectoryServer.getAttributeType(attrName); |
| | | AttributeType portType = DirectoryServer |
| | | .getAttributeType(attrName); |
| | | if (portType == null) |
| | | { |
| | | portType = DirectoryServer.getDefaultAttributeType(attrName); |
| | |
| | | DirectoryStringSyntax.DECODER); |
| | | if (currentport.equals(ldapPort)) |
| | | { |
| | | entry = currentEntry ; |
| | | break ; |
| | | entry = currentEntry; |
| | | break; |
| | | } |
| | | if (ldapsPortEnable) |
| | | { |
| | |
| | | } |
| | | } |
| | | } |
| | | catch(Exception e) |
| | | catch (Exception e) |
| | | { |
| | | // best effort. |
| | | continue; |
| | |
| | | } |
| | | } |
| | | |
| | | } catch (DirectoryException e) |
| | | } |
| | | catch (DirectoryException e) |
| | | { |
| | | // never happens because the filter is always valid. |
| | | return null; |
| | |
| | | return returnDN; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * get an attribute from and entry. |
| | | * @param DN the DN of the entry. |
| | | * @param attrName the attribute name. |
| | | * @return The Administration connector port. |
| | | * Gets an attribute value from an entry. |
| | | * |
| | | * @param DN |
| | | * The DN of the entry. |
| | | * @param attrName |
| | | * The attribute name. |
| | | * @return The attribute value or {@code null} if the value could |
| | | * not be retrieved. |
| | | */ |
| | | private String getAttr(String baseDN, String attrName) |
| | | { |
| | | String value = null ; |
| | | // |
| | | // prepare the ldap search |
| | | // Prepare the ldap search |
| | | LDAPFilter filter; |
| | | try |
| | | { |
| | |
| | | return null; |
| | | } |
| | | |
| | | ASN1OctetString asn1BaseDn = new ASN1OctetString(baseDN); |
| | | LinkedHashSet<String> attributes = new LinkedHashSet<String>(1); |
| | | attributes.add(attrName); |
| | | InternalSearchOperation search = internalConnection.processSearch( |
| | | asn1BaseDn, |
| | | SearchScope.BASE_OBJECT, |
| | | DereferencePolicy.DEREF_ALWAYS, 0, 0, false, |
| | | filter,attributes); |
| | | ByteString.valueOf(baseDN), SearchScope.BASE_OBJECT, |
| | | DereferencePolicy.DEREF_ALWAYS, 0, 0, false, filter, attributes); |
| | | |
| | | if ((search.getResultCode() != ResultCode.SUCCESS)) |
| | | { |
| | |
| | | } |
| | | |
| | | SearchResultEntry adminConnectorEntry = null; |
| | | |
| | | /* |
| | | * Read the port from the PORT attribute |
| | | */ |
| | |
| | | } |
| | | |
| | | // Get the attribute value |
| | | value = attrs.get(0).iterator().next().getStringValue(); |
| | | return value; |
| | | return attrs.get(0).iterator().next().toString(); |
| | | } |
| | | |
| | | } |