opendj-sdk/opends/src/guitools/org/opends/guitools/replicationcli/ReplicationCliMain.java
@@ -84,6 +84,7 @@ import org.opends.quicksetup.ReturnCode; import org.opends.quicksetup.event.ProgressUpdateEvent; import org.opends.quicksetup.event.ProgressUpdateListener; import org.opends.quicksetup.installer.Installer; import org.opends.quicksetup.installer.InstallerHelper; import org.opends.quicksetup.installer.PeerNotFoundException; import org.opends.quicksetup.installer.offline.OfflineInstaller; @@ -2738,6 +2739,21 @@ printErrorMessage(msg); } long time1 = Utils.getServerClock(ctx1); long time2 = Utils.getServerClock(ctx2); if ((time1 != -1) && (time2 != -1)) { if (Math.abs(time1 - time2) > (Installer.WARNING_CLOCK_DIFFERENCE_THRESOLD_MINUTES * 60 * 1000)) { printWarningMessage(INFO_WARNING_SERVERS_CLOCK_DIFFERENCE.get( ConnectionUtils.getHostPort(ctx1), ConnectionUtils.getHostPort(ctx2), String.valueOf( Installer.WARNING_CLOCK_DIFFERENCE_THRESOLD_MINUTES))); } } if (ctx1 != null) { try opendj-sdk/opends/src/messages/messages/quicksetup.properties
@@ -651,6 +651,10 @@ INFO_PROGRESS_CONFIGURING=Configuring Directory Server INFO_PROGRESS_CONFIGURING_REPLICATION=Configuring Replication INFO_PROGRESS_CONFIGURING_REPLICATION_REMOTE=Configuring Replication on %s INFO_WARNING_SERVERS_CLOCK_DIFFERENCE=The clocks of servers %s and %s have a \ difference superior to %s minutes. Replication does not require clocks to \ be synchronized but monitoring of replication updates between servers can be \ difficult. INFO_PROGRESS_COPYING_FILE=Copying file %s to %s INFO_PROGRESS_CREATING_ADMINISTRATOR=Creating Global Administrator INFO_PROGRESS_CREATING_ADS=Creating Registration Configuration opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java
@@ -60,6 +60,7 @@ import org.opends.admin.ads.TopologyCache; import org.opends.admin.ads.TopologyCacheException; import org.opends.admin.ads.util.ApplicationTrustManager; import org.opends.admin.ads.util.ConnectionUtils; import org.opends.quicksetup.ui.*; import org.opends.quicksetup.util.Utils; @@ -164,6 +165,11 @@ /** Alias of a self-signed certificate. */ protected static final String SELF_SIGNED_CERT_ALIAS = "server-cert"; /** The thresold in minutes used to know whether we must display a warning * informing that there is a server clock difference between two servers * whose contents are being replicated. */ public static final int WARNING_CLOCK_DIFFERENCE_THRESOLD_MINUTES = 5; /** * Creates a default instance. */ @@ -1483,6 +1489,9 @@ replicationServers.put(Constants.SCHEMA_DN, adsServers); InitialLdapContext ctx = null; long localTime = -1; long localTimeMeasureTime = -1; String localServerDisplay = null; try { ctx = createLocalContext(); @@ -1491,6 +1500,9 @@ getUserData().getReplicationOptions().useSecureReplication(), getLocalHostPort(), knownReplicationServerIds, knownServerIds); localTimeMeasureTime = System.currentTimeMillis(); localTime = Utils.getServerClock(ctx); localServerDisplay = ConnectionUtils.getHostPort(ctx); } catch (ApplicationException ae) { @@ -1583,6 +1595,22 @@ replicationPort, enableSecureReplication, server.getHostPort(true), knownReplicationServerIds, knownServerIds); long remoteTimeMeasureTime = System.currentTimeMillis(); long remoteTime = Utils.getServerClock(ctx); if ((localTime != -1) && (remoteTime != -1)) { if (Math.abs(localTime - remoteTime - localTimeMeasureTime + remoteTimeMeasureTime) > (WARNING_CLOCK_DIFFERENCE_THRESOLD_MINUTES * 60 * 1000)) { notifyListeners(getFormattedWarning( INFO_WARNING_SERVERS_CLOCK_DIFFERENCE.get( localServerDisplay, ConnectionUtils.getHostPort(ctx), String.valueOf( WARNING_CLOCK_DIFFERENCE_THRESOLD_MINUTES)))); } } hmConfiguredRemoteReplication.put(server, repl); try opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/Utils.java
@@ -39,11 +39,14 @@ import java.io.PrintStream; import java.io.PrintWriter; import java.io.RandomAccessFile; import java.text.SimpleDateFormat; import java.util.*; 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; @@ -1388,6 +1391,50 @@ } return emptyStream; } /** * Returns the current time of a server in milliseconds. * @param ctx the connection to the server. * @return the current time of a server in milliseconds. */ public static long getServerClock(InitialLdapContext ctx) { long time = -1; String v = null; SearchControls ctls = new SearchControls(); ctls.setSearchScope(SearchControls.OBJECT_SCOPE); ctls.setReturningAttributes( new String[] { "currentTime" }); String filter = "(objectclass=*)"; try { LdapName jndiName = new LdapName("cn=monitor"); NamingEnumeration listeners = ctx.search(jndiName, filter, ctls); while(listeners.hasMore()) { SearchResult sr = (SearchResult)listeners.next(); v = getFirstValue(sr, "currentTime"); TimeZone utcTimeZone = TimeZone.getTimeZone("UTC"); SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss'Z'"); formatter.setTimeZone(utcTimeZone); time = formatter.parse(v).getTime(); } } catch (Throwable t) { LOG.log(Level.WARNING, "Error retrieving server current time: "+t, t); } return time; } } /**