/* * 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. */ // OpenDS imports import org.opends.server.snmp.DIRECTORY_SERVER_MIBOidTable; // OpenDMK imports // import com.sun.management.snmp.SnmpDefinitions; import com.sun.management.snmp.SnmpVarBindList; import com.sun.management.snmp.SnmpEngine; import com.sun.management.snmp.SnmpEngineParameters; import com.sun.management.snmp.SnmpOid; import com.sun.management.snmp.SnmpOidTableSupport; import com.sun.management.snmp.SnmpStatusException; import com.sun.management.snmp.SnmpString; import com.sun.management.snmp.SnmpVarBind; import com.sun.management.snmp.manager.SnmpRequest; import com.sun.management.snmp.manager.SnmpSession; import com.sun.management.snmp.manager.SnmpPeer; import com.sun.management.snmp.manager.SnmpParameters; import com.sun.management.snmp.manager.usm.SnmpUsmPeer; import com.sun.management.snmp.manager.usm.SnmpUsmParameters; /** * This class perform a SNMP set operation. */ public class SNMPSet { /** * Gets the calling arguments. * * @param args SNMP agent version + SNMP agent host + SNMP agent port * @return 0 if the init succeeded or 1 if the init failed */ public int init(String[] args) { int rc = 0; System.out.println("\n"); if (args.length < 5) { // Missing arguments System.out.println( "usage: " + " -v <SNMP version>" + " -h <remoteHost>" + " -p <port>" + " -o <oids>" + " -c <community>" + " -u <user>" + " -l <securityLevel>" + " -f <securityFile>" + " -s <connectionStatus>" + " -n <checkOIDs>"); rc = 1; } else { for (int i = 0; i < args.length; i++) { String opt = args[i]; String val = args[i + 1]; switch (opt.charAt(1)) { case 'v': version = new Integer(val).intValue(); break; case 'h': remoteHost = val; break; case 'p': port = new Integer(val).intValue(); break; case 'o': oids = val; break; case 'c': community = val; break; case 'u': user = val; break; case 'l': if (val.compareTo("noauthnopriv") == 0) { securityLevel = SnmpDefinitions.noAuthNoPriv; } else if (val.compareTo("authnopriv") == 0) { securityLevel = SnmpDefinitions.authNoPriv; } else if (val.compareTo("authpriv") == 0) { securityLevel = SnmpDefinitions.authPriv; } else { System.out.println( "Unknown security level " + opt.charAt(1) + "."); rc = 1; } break; case 'f': securityFile = val; break; case 's': connectStatus = val; break; case 'n': validOIDs = new Boolean(val).booleanValue(); break; default: System.out.println("Unknown option -" + opt.charAt(1) + "."); rc = 1; } if (rc == 1) { break; } i = i + 1; } } if (rc == 0) { System.out.println("init() of SNMPSet succeeded"); } else { System.out.println("init() of SNMPSet failed"); } return rc; } /** * Open SNMP connection with SNMP agent. * * @return 0 if the connect succeeded or 1 if the connect failed */ public int connect() { int rc = 0; try { // The OidTable generated by mibgen when compiling DIRECTORY_SERVER_MIB // final SnmpOidTableSupport oidTable = new DIRECTORY_SERVER_MIBOidTable(); // Specify the OidTable containing all the DIRECTORY_SERVER_MIB knowledge // SnmpOid.setSnmpOidTable(oidTable); switch (version) { case 1: case 2: // Create the session // session = new SnmpSession("Set V" + version + " session"); // Create an SnmpPeer object for representing the entity // to communicate with. // final SnmpPeer agent = new SnmpPeer(remoteHost, port); // Specify the read and write community to be used // final SnmpParameters params = new SnmpParameters( community, community); // Specify the protocol version // switch (version) { case 1: params.setProtocolVersion(SnmpDefinitions.snmpVersionOne); break; case 2: params.setProtocolVersion(SnmpDefinitions.snmpVersionTwo); break; default: break; } // Associate the parameters with the agent // agent.setTimeout(timeOut); agent.setMaxTries(maxRetries); agent.setParams(params); // Set the default peer (agent) to a SnmpSession // session.setDefaultPeer(agent); break; case 3: // Custom engine parameters final SnmpEngineParameters engineParameters = new SnmpEngineParameters(); // Activate encryption engineParameters.activateEncryption(); // Set the security file engineParameters.setSecurityFile(securityFile); // Create the session // session = new SnmpSession( engineParameters, null, "Set V3 session", null); // SNMP V3 introduces the notion of SnmpEngine. An engine is // associated to the session. Other objects might need // the engine. You can access it using getEngine method. // final SnmpEngine engine = session.getEngine(); // Create an SnmpUsmPeer object for representing the entity // to communicate with // final SnmpUsmPeer agentV3 = new SnmpUsmPeer(engine, remoteHost, port); // Create USM parameters for the principal defaultuser (user used when // requests are sent: the defaultuser is a template and for this // reason we cannot find it under the user mib (not created as a user) // final SnmpUsmParameters paramsV3 = new SnmpUsmParameters( engine, user); // Set the security level authentication but without privacy // paramsV3.setSecurityLevel(securityLevel); // Set the context name // if (community.compareTo("null") != 0) { paramsV3.setContextName(community.getBytes()); } // Set the contextEngineId discovered by the peer upon // its creation // paramsV3.setContextEngineId(agentV3.getEngineId().getBytes()); // Associate the parameters with the agent // agentV3.setTimeout(timeOut); agentV3.setMaxTries(maxRetries); agentV3.setParams(paramsV3); // Discover timeliness of creation and boot // try { agentV3.processUsmTimelinessDiscovery(); } catch (SnmpStatusException e) { if (connectStatus.compareTo("SnmpStatusException") == 0) { System.out.println( "connect() of SNMPSet catched as expected a " + "SNMP status exception: " + e.getMessage() + "\""); } else { System.out.println( "connect() of SNMPSet should not catch a " + "SNMP status exception: " + e.getMessage() + "\""); rc = 1; } } catch (Exception e) { System.out.println( "connect() of SNMPSet catched an unexpected exception: " + e.getMessage() + "\""); rc = 1; } if (rc == 0) { // Set the default peer (agent) to a SnmpSession // session.setDefaultPeer(agentV3); } break; default: System.out.println( "connect() of SNMPSet: Unknown SNMP version: " + version + " ."); rc = 1; } } catch (Exception e) { System.out.println( "connect() of SNMPSet catched an unexpected exception: " + e.getMessage() + "\""); rc = 1; } if (rc == 0) { System.out.println("connect() of SNMPSet succeeded"); } else { System.out.println("connect() of SNMPSet succeeded"); } return rc; } /** * Perform an SNMP set request on SNMP agent. * * @return 0 if the setRequest succeeded or 1 if the setRequest failed */ public int setRequest() { int rc = 0; try { // Build the list of variables you want to query // final SnmpVarBindList list = new SnmpVarBindList("Get varbind list"); // Write one specific OID // SnmpVarBind oid = new SnmpVarBind(oids); oid.setSnmpValue(new SnmpString("myValue")); list.addVarBind(oid); // Make the SNMP set request // System.out.println( "setRequest() of SNMPSet: Start SNMP V" + version + " GET request for SNMP agent on \"" + remoteHost + "\" at port \"" + port + "\"."); // Set request // SnmpRequest request = session.snmpSetRequest(null, list); // Check for a timeout of the request // boolean completed = request.waitForCompletion((maxRetries + 1) * timeOut); if (completed == false) { System.out.println( "setRequest() of SNMPSet: Request timed out, " + "check reachability of agent."); // Print request // System.out.println( "setRequest() of SNMPSet: Request= " + request.toString() + "."); rc = 1; } if (rc == 0) { System.out.println( "getRequest() of SNMPGet: Finish SNMP V" + version + " GET request."); // Now we have a response. Check if the response contains an error // String errorStatus = SnmpRequest.snmpErrorToString( request.getErrorStatus()); if (errorStatus.compareTo("noError") != 0) { System.out.println( "getRequest() of SNMPGet: Error status= " + errorStatus + "."); System.out.println( "getRequest() of SNMPGet: Error index= " + request.getErrorIndex() + "."); if (errorStatus.compareTo(connectStatus) == 0) { System.out.println( "getRequest() of SNMPGet: Get request failed as " + "expected with " + connectStatus + " status."); } else { System.out.println( "getRequest() of SNMPGet: Get request should " + "fail with " + connectStatus + " status."); rc = 1; } } else { // Now we shall display the content of the result // SnmpVarBindList resp = request.getResponseVarBindList(); System.out.println("getRequest() of SNMPGet: Result="); for (int i = 0; i < resp.getVarBindCount(); i++) { System.out.println(resp.getVarBindAt(i)); } if (connectStatus.compareTo("noError") != 0) { // Request should failed // System.out.println( "getRequest() of SNMPGet: Get request should " + "fail with " + connectStatus + " status."); rc = 1; } else { if (validOIDs) { // Check that we obtain correct values for the OIDs // if (resp.checkForValidValues()) { System.out.println( "getRequest() of SNMPGet: Returned values for" + " OIDs are correct."); } else { System.out.println( "getRequest() of SNMPGet: Returned values for" + " OIDs are not correct."); rc = 1; } } else { // Check that we obtain incorrect values for the OIDs // if (resp.checkForValidValues()) { System.out.println( "getRequest() of SNMPGet: Returned values for" + " OIDs should not be correct."); rc = 1; } else { System.out.println( "getRequest() of SNMPGet: Returned values for" + " OIDs are not correct as expected."); } } } } } } catch (Exception e) { System.out.println( "setRequest() of SNMPSet catched an unexpected exception: " + e.getMessage() + "\""); rc = 1; } if (rc == 0) { System.out.println("setRequest() of SNMPSet succeeded"); } else { System.out.println("setRequest() of SNMPSet failed"); } return rc; } /** * Close SNMP connection with SNMP agent. */ public void disconnect() { // Stop and destroy the SnmpSession if still there try { session.destroySession(); session = null; } catch (Exception e) { // possible session already ended } System.out.println("disconnect() of SNMPSet succeeded"); } /** * Main. * * @param args arguments */ public static void main(String[] args) { SNMPSet client = new SNMPSet(); int rc = 0; // Retrieve parameters rc = client.init(args); // If init() succeeded then open connection if (rc == 0) { rc = client.connect(); } // If connect() succeeded then perform set request if (rc == 0 && connectStatus.compareTo("SnmpStatusException") != 0) { rc = client.setRequest(); } // Close connection client.disconnect(); System.exit(rc); } // Arguments int version = 0; String remoteHost = null; int port = 0; String oids = null; String community = null; String user = null; int securityLevel = SnmpDefinitions.authNoPriv; String securityFile = null; static String connectStatus = null; boolean validOIDs = true; // SnmpSession SnmpSession session = null; int timeOut = 30000; // default value int maxRetries = 1; }