From c91131158b817731bc4249bfe31b0ec554852fd0 Mon Sep 17 00:00:00 2001
From: fguigues <fguigues@localhost>
Date: Wed, 04 Jun 2008 16:26:47 +0000
Subject: [PATCH] 

---
 opendj-sdk/opends/src/snmp/src/org/opends/server/snmp/SNMPClassLoaderProvider.java |   91 ++++++++++++++++++++++++++++++++++++---------
 1 files changed, 72 insertions(+), 19 deletions(-)

diff --git a/opendj-sdk/opends/src/snmp/src/org/opends/server/snmp/SNMPClassLoaderProvider.java b/opendj-sdk/opends/src/snmp/src/org/opends/server/snmp/SNMPClassLoaderProvider.java
index c70e5d0..8f90136 100644
--- a/opendj-sdk/opends/src/snmp/src/org/opends/server/snmp/SNMPClassLoaderProvider.java
+++ b/opendj-sdk/opends/src/snmp/src/org/opends/server/snmp/SNMPClassLoaderProvider.java
@@ -26,6 +26,7 @@
  */
 package org.opends.server.snmp;
 
+import com.sun.management.comm.CommunicatorServer;
 import java.io.File;
 
 import org.opends.server.loggers.debug.DebugLogger;
@@ -39,10 +40,14 @@
 import com.sun.management.snmp.SnmpEngineParameters;
 import com.sun.management.snmp.UserAcl;
 
+import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.util.Iterator;
 import java.util.Set;
+import java.util.SortedSet;
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
+import org.opends.messages.Message;
 import org.opends.server.admin.std.server.SNMPConnectionHandlerCfg;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.ConfigChangeResult;
@@ -51,6 +56,7 @@
 import org.opends.server.util.Validator;
 
 import static org.opends.messages.ProtocolMessages.*;
+import static org.opends.server.loggers.ErrorLogger.*;
 
 /**
  * The SNMPClassLoaderProvider.
@@ -103,6 +109,7 @@
     private ObjectName UsmObjName;
     private SnmpV3AdaptorServer snmpAdaptor;
     private String contextName;
+    private boolean sentTraps = true;
 
     /**
      * Default constructor.
@@ -226,8 +233,7 @@
             this.snmpAdaptor = this.getSnmpAdaptor(this.currentConfig);
 
             if (this.snmpAdaptor == null) {
-                throw new Exception(
-                      ERR_SNMP_CONNHANDLER_BAD_CONFIGURATION.get().toString());
+                throw new Exception();
             }
 
             // Create the Usm MIB to allow user management
@@ -241,21 +247,42 @@
                     this.snmpAdaptor.registerUsmMib(server, this.UsmObjName);
                 } catch (Exception ex) {
                     throw new Exception(
-                       ERR_SNMP_CONNHANDLER_BAD_CONFIGURATION.get().toString());
+                      ERR_SNMP_CONNHANDLER_BAD_CONFIGURATION.get().toString());
                 }
             }
 
             this.snmpAdaptor.start();
 
-            // Send a coldStart SNMP Trap.
-            this.snmpAdaptor.setTrapPort(snmpTrapPort);
-            this.snmpAdaptor.snmpV1Trap(
-                    null,
-                    this.currentConfig.getTrapsCommunity(),
-                    0,
-                    0,
-                    null);
+            // Test  the snmpAdaptor State
+            while (this.snmpAdaptor.getState() == CommunicatorServer.STARTING) {
+                Thread.sleep(1000);
+            }
 
+            // Check if the snmpAdaptor is online
+            if (this.snmpAdaptor.getState() != CommunicatorServer.ONLINE) {
+                throw new Exception(
+                      ERR_SNMP_CONNHANDLER_BAD_CONFIGURATION.get().toString());
+            }
+
+            // Check the trap destinations before trying to sent traps
+            this.sentTraps =
+                    checkTrapsDestinations(
+                    this.currentConfig.getTrapsDestination());
+
+            if (this.sentTraps == false) {
+                Message message =
+                        ERR_SNMP_CONNHANDLER_NO_VALID_TRAP_DESTINATIONS.get();
+                logError(message);
+            } else {
+                // Send a coldStart SNMP Trap.
+                this.snmpAdaptor.setTrapPort(snmpTrapPort);
+                this.snmpAdaptor.snmpV1Trap(
+                        null,
+                        this.currentConfig.getTrapsCommunity(),
+                        0,
+                        0,
+                        null);
+            }
             // Create an instance of the customized MIB
             this.mibObjName = new ObjectName(
                     SNMPConnectionHandlerDefinitions.SNMP_DOMAIN +
@@ -286,14 +313,15 @@
 
         try {
 
-            // Send a trap when stop
-            this.snmpAdaptor.snmpV1Trap(
-                    null,
-                    this.currentConfig.getTrapsCommunity(),
-                    0,
-                    0,
-                    null);
-
+            if (this.sentTraps == true) {
+                // Send a trap when stop
+                this.snmpAdaptor.snmpV1Trap(
+                        null,
+                        this.currentConfig.getTrapsCommunity(),
+                        0,
+                        0,
+                        null);
+            }
             String[] names = this.snmpAdaptor.getMibs();
 
             // Stop the SNMP Adaptor
@@ -373,5 +401,30 @@
             return null;
         }
     }
+
+    private boolean checkTrapsDestinations(SortedSet destinations) {
+
+        // If the traps destinations is empty, the traps have to be sent
+        // to localhosts
+        if ((destinations == null) || (destinations.isEmpty())) {
+            return true;
+        }
+
+        boolean found = false;
+        for (Iterator iter = destinations.iterator(); iter.hasNext();) {
+            String dest = null;
+            try {
+                dest = (String) iter.next();
+                InetAddress addr = InetAddress.getByName(dest);
+                found = true;
+            } catch (UnknownHostException ex) {
+                Message message = ERR_SNMP_CONNHANDLER_TRAPS_DESTINATION.get(
+                        dest);
+                logError(message);
+            }
+        }
+        return found;
+
+    }
 }
 

--
Gitblit v1.10.0