snmpUSMRemoteConfigure.java.txt
上传用户:aonuowh
上传日期:2021-05-23
资源大小:35390k
文件大小:29k
源码类别:

SNMP编程

开发平台:

C/C++

  1. /* $Id: snmpUSMRemoteConfigure.src,v 1.4 2002/09/09 05:55:22 parasuraman Exp $ */
  2. /*
  3.  * @(#)snmpUSMRemoteConfigure.java
  4.  * Copyright (c) 1996-2003 AdventNet, Inc. All Rights Reserved.
  5.  * Please read the associated COPYRIGHTS file for more details.
  6.  */
  7. /**
  8.  * This is an example program to explain how remotely configure users
  9.  * on the agent. The procedure followed is a five step procedure.
  10.  * Step 1. GET(usmUserSpinLock.0) Value 
  11.  * Step 2. SET(usmUserSpinLock.0=spinlockValue
  12.  * usmUserCloneFrom=templateUser,
  13.  * usmUserStatus=createAndWait)
  14.  * Strp 3. GET(usmUserSpinLock.0) value
  15.  *  SET(usmUserSpinLock.0=spinLockValue,
  16.  * usmUserKeyChange=keyChangeValue
  17.  * usmUserPublic=randomValue)
  18.  * Strp 4. GET(usmUserPulic) and check it has randomValue
  19.  * Step 5. Activate the new user by setting the usmUserStatus=active
  20.  *
  21.  * The application sends request with version v3. 
  22.  * The user could run this application by giving any of the following usage.
  23.  *  
  24.  * java snmpUSMRemoteConfigure [options] userName newUserName hostname 
  25.  *
  26.  * iava snmpUSMRemoteConfigure [-d] [-p port] [-r retries] [-t timeout] [-a auth_protocol] [-w auth_password] [-s priv_password] [-n contextName] [-i contextID] [-y new_auth_password] [-z new_priv_password] userName newUserName host
  27.  *
  28.  * e.g.
  29.  * java snmpUSMRemoteConfigure -a MD5 -w initial2Pass -y initial2NewPass initial2 newInitial 10.3.2.120
  30.  * Where, initial2 user already configured on the agent whose authProtocol is
  31.  * MD5 and authPassword is initial2Pass. newInitial is the name of the new
  32.  * user who will be configured with authProtocol=MD5 and 
  33.  * authPassword=initial2NewPass.
  34.  * Here the clone-from user is initial2, the user on whose behalf all the
  35.  * requests will be sent.
  36.  * 
  37.  * Options:
  38.  * [-d]                   - Debug output. By default off.
  39.  * [-p] <port>            - remote port no. By default 161.
  40.  * [-t] <Timeout>         - Timeout. By default 5000ms.
  41.  * [-r] <Retries>         - Retries. By default 0.      
  42.  * [-a] <autProtocol>     - The authProtocol(MD5/SHA) of the template user. Mandatory if authPassword is specified
  43.  * [-w] <authPassword>    - The authentication password of the template user.
  44.  * [-s] <privPassword>    - The privacy protocol password of the template user. Must be accompanied with auth password and authProtocol fields.
  45.  * [-n] <contextName>     - The contextName to be used for the v3 pdu.
  46.  * [-i] <contextID>       - The contextID to be used for the v3 pdu.
  47.  * [-w] <newAuthPassword> - The authentication password for the new user.
  48.  * [-s] <newPrivPassword> - The privacy protocol password of the new user. Must be accompanied with auth password and authProtocol fields.
  49.  * username Mandatory     - The user who is already configured on the agent.
  50.  *                          (template user)
  51.  * newusername Mandatory  - The user name of the new user who will be 
  52.                             Remotely configured on the agent.
  53.  * host Mandatory         - The RemoteHost (agent).Format (string without double qoutes/IpAddress).
  54.  */
  55. import java.lang.*;
  56. import java.util.*;
  57. import java.net.*;
  58. import com.adventnet.snmp.snmp2.*;
  59. import com.adventnet.snmp.snmp2.usm.*;
  60. import com.adventnet.utils.*;
  61. public class snmpUSMRemoteConfigure {
  62. private static final int USM_SECURITY_MODEL = 3;
  63. private static final String ENC = "ISO8859_1";
  64. private static final int DEBUG = 0;
  65. private static final int PORT = 1;
  66. private static final int RETRIES = 2;
  67. private static final int TIMEOUT = 3;
  68. private static final int AUTH_PROTOCOL = 4;
  69. private static final int AUTH_PASSWORD = 5;
  70. private static final int PRIV_PASSWORD = 6;
  71. private static final int CONTEXT_NAME = 7;
  72. private static final int CONTEXT_ID = 8;
  73. private static final int NEW_AUTH_PASSWORD = 9;
  74. private static final int NEW_PRIV_PASSWORD = 10;
  75. private static final String SPIN_LOCK_OID = ".1.3.6.1.6.3.15.1.2.1.0";
  76. private static final String USM_TABLE = ".1.3.6.1.6.3.15.1.2.2";
  77. private static final String USM_ENTRY = ".1.3.6.1.6.3.15.1.2.2.1";
  78. private static final String CLONE_COL = "4";
  79. private static final String KEY_CHANGE_COL = "6";
  80. private static final String PRIV_KEY_CHANGE_COL = "9";
  81. private static final String USM_PUBLIC_COL = "11";
  82. private static final String ROW_STATUS_COL = "13";
  83. private static final int AUTH_MD5_LEN = 16;
  84. private static final int AUTH_SHA_LEN = 20;
  85. boolean debug = false;
  86.     public static void main(String args[]) {
  87.         
  88. snmpUSMRemoteConfigure surg = new snmpUSMRemoteConfigure();
  89.         // Take care of getting options
  90.         String usage = "snmpUSMRemoteConfigure [-d] [-p port] [-r retries] [-t timeout] [-a auth_protocol] [-w auth_password] [-s priv_password] [-n contextName] [-i contextID] [-y new_auth_password] [-z new_priv_password] userName newUserName host ";
  91.         String options[] = { "-d", "-p", "-r", "-t", "-a", "-w", "-s", "-n", "-i", "-y", "-z" };
  92.         String values[] = { "None", null, null, null, null, null, null, null, null, null, null };       
  93. String userName = new String("");
  94. int authProtocol = USMUserEntry.NO_AUTH;
  95. String authPassword = new String ("");
  96. String privPassword = new String ("");
  97. String contextName = new String ("");
  98. String contextID = new String ("");
  99. String newUser = new String("");
  100. //int newAuthProtocol = USMUserEntry.NO_AUTH;
  101. String newAuthPassword = new String ("");
  102. String newPrivPassword = new String ("");
  103.          ParseOptions opt = new ParseOptions(args,options,values, usage);
  104.         if (opt.remArgs.length<3) opt.usage_error();
  105.         // Start SNMP API
  106.         SnmpAPI api;
  107.         api = new SnmpAPI();
  108.         if (values[DEBUG].equals("Set")){
  109. api.setDebug( true );
  110. surg.debug = true;
  111. }
  112.     
  113. userName = opt.remArgs[0];
  114. newUser = opt.remArgs[1];
  115.         // Open session
  116.         SnmpSession session = new SnmpSession(api);        
  117.         // set remote Host 
  118.         session.setPeername( opt.remArgs[2] );
  119. // Set the values accepted from the command line
  120. //boolean usage_error = false;
  121.         //set remote Port, timeout,retries if needed.
  122.     try {
  123.         if (values[PORT] != null)
  124.                 session.setRemotePort( Integer.parseInt(values[PORT]) );
  125.         if (values[RETRIES] != null)
  126.                 session.setRetries( Integer.parseInt(values[RETRIES]) );
  127.         if (values[TIMEOUT] != null)
  128.                 session.setTimeout( Integer.parseInt(values[TIMEOUT]) );
  129.     }
  130.     catch (NumberFormatException ex) {
  131.         System.err.println("Invalid Integer Arg");
  132.     }
  133. session.setVersion( SnmpAPI.SNMP_VERSION_3 );
  134. if ((values[AUTH_PROTOCOL] != null) 
  135. && (values[AUTH_PASSWORD] != null) 
  136. && (values[NEW_AUTH_PASSWORD] != null)) {
  137. if(values[AUTH_PROTOCOL].equals("SHA"))
  138. authProtocol = USMUserEntry.SHA_AUTH;
  139. else 
  140. authProtocol = USMUserEntry.MD5_AUTH;
  141. if(authProtocol==USMUserEntry.NO_AUTH){
  142. System.err.println("Enter authentication protocol");
  143.          opt.usage_error();
  144. }
  145. authPassword = values[AUTH_PASSWORD];
  146. newAuthPassword = values[NEW_AUTH_PASSWORD];
  147. if (values[PRIV_PASSWORD] != null) {
  148. if (values[NEW_PRIV_PASSWORD] != null) { 
  149. privPassword = values[PRIV_PASSWORD];
  150. newPrivPassword = values[NEW_PRIV_PASSWORD];
  151. }
  152. else
  153.          opt.usage_error();
  154. }
  155. }
  156. else if ((values[AUTH_PROTOCOL] != null) 
  157. || (values[AUTH_PASSWORD] != null) 
  158. || (values[PRIV_PASSWORD] != null)) {
  159.       opt.usage_error();
  160. }
  161. if (values[CONTEXT_NAME] != null)
  162. contextName = values[CONTEXT_NAME];
  163. if (values[CONTEXT_ID] != null)
  164. contextID = values[CONTEXT_ID];
  165.         // Build Get request PDU
  166.         SnmpPDU pdu = new SnmpPDU();
  167.         try {
  168.             //Open session
  169.             session.open();
  170.         } catch (SnmpException e) {
  171.             System.err.println("Error opening session:"+e.getMessage());
  172.             System.exit(1);
  173.         }
  174. // inititialize the manager by adding the user. All requests will
  175. // sent with this username 
  176. pdu.setUserName(userName.getBytes());
  177.         USMUtils.init_v3_params(userName, authProtocol, authPassword, 
  178. privPassword, session.getPeername(),
  179. session.getRemotePort(),session);
  180.         pdu.setContextName(contextName.getBytes());
  181.         pdu.setContextID(contextID.getBytes());
  182. // A valid user is now configured.on the manager. 
  183. System.out.println("A new user " + userName + " is now " +
  184.  "configured on the manager"); 
  185. // Let's start the remote configuration.
  186. // Step 1. Retrive the USMUserSpinLock
  187. int spinLock = surg.sendSpinLockRequest(pdu,session);
  188. if(spinLock < 0){
  189. System.out.println("Error in retriving SnmpLock");
  190. System.exit(1);
  191. }
  192. System.out.println("Spin lock value retrived successfullyn");
  193. // Since we are reusing the PDU, we will remove the varbinds
  194. // and set the reqid to 0.
  195. surg.removeAllVarBinds(pdu);
  196. //pdu.setReqid(0);
  197. // Step 2. Send a multiVarBind SET request with the retrived
  198. // spinlock value, USMUserCloneFrom=templateuser and 
  199. // usmUserStatus=createAndWait.
  200. // Here the templateuser will be user on whose behalf the requests
  201. // are made.
  202. // Create the ConeFrom OID for the creating new instance.
  203. // i.e for newUserName and engineID
  204. byte[] engineID = ((Snmp3Message)pdu.getMsg()).
  205. getSecurity().getEngineID();
  206. String engID;
  207. try{
  208. engID = new String(engineID, ENC);
  209. }
  210. catch(Exception e){
  211. engID = new String(engineID);
  212. }
  213. int[] firstindex = surg.stringToIntegerArray(engID);
  214. int[] secondIndex = surg.stringToIntegerArray(newUser);
  215. String engIDOID = surg.intArrayToString(firstindex);
  216. String newUserOID = surg.intArrayToString(secondIndex);
  217. String cloneFromOID = USM_ENTRY + "." + CLONE_COL + "." 
  218. + firstindex.length + engIDOID + "." 
  219. + secondIndex.length + newUserOID;
  220. if(surg.debug)
  221. System.out.println("cloneFrom OID = " + cloneFromOID);
  222. // Create the CloneFrom OID value. This will point
  223. // to the existing template entry.i.e userName and engineID
  224. int[] cloneFromIndex = surg.stringToIntegerArray(userName);
  225. String userNameOID = surg.intArrayToString(cloneFromIndex);
  226. String cloneFromOIDValue = USM_ENTRY + "." + CLONE_COL + "." 
  227. + firstindex.length + engIDOID + "."
  228. + cloneFromIndex.length + userNameOID;
  229. if(surg.debug)
  230. System.out.println("cloneFrom OID value = " + cloneFromOIDValue);
  231. String rowStatusOID = USM_ENTRY + "." + ROW_STATUS_COL + "." +
  232. + firstindex.length + engIDOID + "." + 
  233. secondIndex.length + newUserOID;
  234. if(surg.debug)
  235. System.out.println("Row status  OID = " + rowStatusOID);
  236. // Create the multivarbind. 
  237. SnmpOID setOID1 = new SnmpOID(SPIN_LOCK_OID);
  238. surg.addvarbind(pdu, setOID1,"INTEGER",
  239. new Integer(spinLock).toString());
  240. SnmpOID setOID2 = new SnmpOID(cloneFromOID); 
  241. surg.addvarbind(pdu, setOID2,"OID",cloneFromOIDValue);
  242. SnmpOID setOID3 = new SnmpOID(rowStatusOID);
  243. surg.addvarbind(pdu, setOID3,"INTEGER","5");
  244. System.out.println("nSending a multivarbind cloneFrom requestn");
  245. pdu.setCommand(SnmpAPI.SET_REQ_MSG);
  246.         try {
  247.             // Send PDU and receive response PDU
  248.             pdu = session.syncSend(pdu);
  249.         } catch (SnmpException e) {
  250.             System.err.println("Sending PDU"+e.getMessage());
  251.             System.exit(1);
  252.         }    
  253.         if (pdu == null) {
  254.             // timeout
  255.             System.out.println("Request timed out to: " + opt.remArgs[0] );
  256.             System.exit(1);
  257.         }
  258.         System.out.println("Response PDU for clonefrom  received from " +
  259. (pdu.getAddress()).getHostAddress());
  260.         if (pdu.getErrstat() != 0){
  261.          System.out.println("Clonefrom request returned error "
  262. + "User NOT Successfully cloned");
  263.             System.err.println(pdu.getError());
  264.             System.exit(1);
  265. }
  266.         else 
  267.             // print the response pdu varbinds
  268.             System.out.println(pdu.printVarBinds());
  269. // Since we are reusing the PDU, we will remove the varbinds
  270. // and set the reqid to 0.
  271. surg.removeAllVarBinds(pdu);
  272. //pdu.setReqid(0);
  273. if(authPassword.length() > 0 && newAuthPassword.length() > 0) {
  274. // Get the SpinLock to use in the next SET request.
  275. spinLock = surg.sendSpinLockRequest(pdu,session);
  276. if(spinLock < 0){
  277. System.out.println("Error in retriving SnmpLock");
  278. System.exit(1);
  279. }
  280. // Since we are reusing the PDU, we will remove the varbinds
  281. // and set the reqid to 0.
  282. surg.removeAllVarBinds(pdu);
  283. //pdu.setReqid(0);
  284. // Step 3. Send a multiVarBind SET request with the retrived
  285. // spinlock value, USMUserKeyChange=keyChangeValue and 
  286. // usmUserPublic=randomValue.
  287. // Initialize the random value based on the protocol used.
  288. byte[] random;
  289. if(authProtocol == USMUserEntry.MD5_AUTH)
  290. random = new byte[AUTH_MD5_LEN];
  291. else
  292. random = new byte[AUTH_SHA_LEN];
  293. USMUserTable userTable = (USMUserTable)api.getSecurityProvider().
  294. getTable(USM_SECURITY_MODEL);
  295. USMUserEntry entry = null;
  296. try{
  297.  entry = userTable.getEntry(userName.getBytes(),
  298. engID.getBytes(ENC));
  299. }catch(Exception e){
  300.  entry = userTable.getEntry(userName.getBytes(),
  301. engID.getBytes());
  302. }
  303. byte[] oldKey = entry.getAuthKey();
  304. // Generate the keyChange value based on the secret
  305. // authKey of the clone-from user and the secret key
  306. // to be used for the new user. Let us call this akcValue.
  307. String akcValue = surg.getKeyChangeValue(newUser,engID,authProtocol,
  308. newAuthPassword,oldKey,random,false);
  309. // This is just ot verify the keyChange. This will give
  310. // the original key taking the keyChange. (This is what is 
  311. // done on the agent side.
  312. if(authProtocol == USMUserEntry.MD5_AUTH){
  313. try{
  314. random = akcValue.substring(0,AUTH_MD5_LEN).getBytes(ENC);
  315. }catch(Exception e){
  316. random = akcValue.substring(0,AUTH_MD5_LEN).getBytes();
  317. }
  318. }
  319. else{
  320. try{
  321. random = akcValue.substring(0,AUTH_SHA_LEN).getBytes(ENC);
  322. }catch(Exception e){
  323. random = akcValue.substring(0,AUTH_SHA_LEN).getBytes();
  324. }
  325. }
  326. String keyChangeOID = USM_ENTRY + "." + KEY_CHANGE_COL + "." 
  327. + firstindex.length + engIDOID + "." 
  328. + secondIndex.length + newUserOID;
  329. String randomOID = USM_ENTRY + "." + USM_PUBLIC_COL + "." +
  330. + firstindex.length + engIDOID + "." + 
  331. secondIndex.length + newUserOID;
  332. setOID1 = new SnmpOID(SPIN_LOCK_OID);
  333. surg.addvarbind(pdu, setOID1,"INTEGER",
  334. new Integer(spinLock).toString());
  335. setOID2 = new SnmpOID(keyChangeOID); //check this up
  336. surg.addvarbind(pdu, setOID2,"STRING",akcValue);
  337. setOID3 = new SnmpOID(randomOID);
  338. String randomString;
  339. try{
  340. randomString = new String(random,ENC);
  341. }catch(Exception e){
  342. randomString = new String(random);
  343. }
  344. surg.addvarbind(pdu, setOID3,"STRING", randomString);
  345. System.out.println("Sending a request to set the authKeyChangen");
  346.         pdu.setCommand( SnmpAPI.SET_REQ_MSG );
  347.         try {
  348.             // Send PDU and receive response PDU
  349.             pdu = session.syncSend(pdu);
  350.         } catch (SnmpException e) {
  351.             System.err.println("Sending PDU"+e.getMessage());
  352.             System.exit(1);
  353.         }    
  354.         if (pdu == null) {
  355.             // timeout
  356.             System.out.println("Request timed out to: " + opt.remArgs[0] );
  357.             System.exit(1);
  358.         }
  359.         System.out.println("Response PDU for keyChange  received from " +
  360. (pdu.getAddress()).getHostAddress());
  361.         if (pdu.getErrstat() != 0){
  362.          System.out.println("KeyChange SET request returned error "
  363. + "User NOT Successfully cloned");
  364.             System.err.println(pdu.getError());
  365. System.exit(1);
  366. }
  367.         else 
  368.             // print the response pdu varbinds
  369.             System.out.println(pdu.printVarBinds());
  370. // Since we are reusing the PDU, we will remove the varbinds
  371. // and set the reqid to 0.
  372. surg.removeAllVarBinds(pdu);
  373. //pdu.setReqid(0);
  374. // Step 4. GET usmUserPulic and check it has randomValue
  375. // Get the usmUserPublic value
  376.         pdu.setCommand( SnmpAPI.GET_REQ_MSG );
  377.         SnmpOID oid = new SnmpOID(randomOID);
  378.         if (oid.toValue() == null) 
  379.             System.err.println("Invalid OID argument: " + randomOID);
  380.         else pdu.addNull(oid);
  381.  
  382.         try {
  383.             // Send PDU and receive response PDU
  384.             pdu = session.syncSend(pdu);
  385.         } catch (SnmpException e) {
  386.             System.err.println("Sending PDU "+e.getMessage());
  387.             System.exit(1);
  388.         }    
  389.         if (pdu == null) {
  390.             // timeout
  391.             System.out.println("Request timed out to: " + opt.remArgs[0] );
  392.             System.exit(1);
  393.         }
  394.         // print and exit
  395.         System.out.println("Response PDU for usmUserPublic  received from " +
  396. (pdu.getAddress()).getHostAddress());
  397.             
  398.         // Check for error in response
  399.         if (pdu.getErrstat() != 0){
  400.          System.out.println("usmUserPublic GET request returned error "
  401. + "User NOT Successfully cloned");
  402.             System.err.println(pdu.getError());
  403. System.exit(1);
  404. }
  405.         else 
  406.             // print the response pdu varbinds
  407.             System.out.println(pdu.printVarBinds());
  408. String userPublic = (pdu.getVariable(0)).toString();
  409. String tempRandom;
  410. try{
  411. tempRandom = new String(random,ENC);
  412. }catch(Exception e){
  413. tempRandom = new String(random);
  414. }
  415. if(userPublic.equals(tempRandom))
  416. System.out.println("usmUserPulic value is set appropriatelyn");
  417. else{
  418. System.out.println("usmUserPulic value is NOT set appropriately");
  419. System.out.println("User NOT Successfully cloned");
  420. System.exit(1);
  421. }
  422. // Since we are reusing the PDU, we will remove the varbinds
  423. // and set the reqid to 0.
  424. surg.removeAllVarBinds(pdu);
  425. //pdu.setReqid(0);
  426. // Start the privKeyChange
  427. if(privPassword.length()>0 && newPrivPassword.length()>0)
  428. {
  429. newPrivPassword = values[NEW_PRIV_PASSWORD];
  430. SnmpPDU pdu1 = new SnmpPDU();
  431. pdu1.setUserName(userName.getBytes());
  432.          pdu1.setContextName(contextName.getBytes());
  433.          pdu1.setContextID(contextID.getBytes());
  434. // Step 1. Retrive the USMUserSpinLock
  435. spinLock = surg.sendSpinLockRequest(pdu1,session);
  436. if(spinLock < 0){
  437. System.out.println("Error in retriving SnmpLock");
  438. System.exit(1);
  439. }
  440. System.out.println("Spin lock value retrived successfullyn");
  441. // Since we are reusing the PDU, we will remove the varbinds
  442. // and set the reqid to 0.
  443. surg.removeAllVarBinds(pdu1);
  444. // Step 3. Send a multiVarBind SET request with the retrived
  445. // spinlock value, USMUserKeyChange=keyChangeValue and 
  446. // usmUserPublic=randomValue.
  447. // Initialize the random value based on the protocol used.
  448. byte[] priv_random = new byte[16]; // always 16 for Priv
  449. byte[] oldPrivKey = entry.getPrivKey();
  450. // Generate the keyChange value based on the secret
  451. // privKey of the clone-from user and the secret key
  452. // to be used for the new user. Let us call this pkcValue.
  453. String pkcValue = surg.getKeyChangeValue(newUser,engID,USMUserEntry.MD5_AUTH,newPrivPassword,oldPrivKey,random,true);
  454. // This is just to verify the keyChange. This will give
  455. // the original key taking the keyChange. (This is what is 
  456. // done on the agent side.
  457. try{
  458. priv_random = pkcValue.substring(0,16).getBytes(ENC);
  459. }catch(Exception e){
  460. priv_random = pkcValue.substring(0,16).getBytes();
  461. }
  462. keyChangeOID = USM_ENTRY + "." + PRIV_KEY_CHANGE_COL + "." 
  463. + firstindex.length + engIDOID + "." 
  464. + secondIndex.length + newUserOID;
  465. randomOID = USM_ENTRY + "." + USM_PUBLIC_COL + "." +
  466. + firstindex.length + engIDOID + "." + 
  467. secondIndex.length + newUserOID;
  468. setOID1 = new SnmpOID(SPIN_LOCK_OID);
  469. surg.addvarbind(pdu1, setOID1,"INTEGER",
  470. new Integer(spinLock).toString());
  471. setOID2 = new SnmpOID(keyChangeOID); //check this up
  472. surg.addvarbind(pdu1, setOID2,"STRING",pkcValue);
  473. setOID3 = new SnmpOID(randomOID);
  474. try{
  475. randomString = new String(priv_random,ENC);
  476. }catch(Exception e){
  477. randomString = new String(priv_random);
  478. }
  479. surg.addvarbind(pdu1, setOID3,"STRING", randomString);
  480. System.out.println("Sending a request to set the privKeyChangen");
  481.          pdu1.setCommand( SnmpAPI.SET_REQ_MSG );
  482.          try {
  483.              // Send PDU and receive response PDU
  484.              pdu1 = session.syncSend(pdu1);
  485.          } catch (SnmpException e) {
  486.              System.err.println("Sending PDU"+e.getMessage());
  487.              System.exit(1);
  488.          }    
  489.          if (pdu1 == null) {
  490.             // timeout
  491.              System.out.println("Request timed out to: " + opt.remArgs[0] );
  492.              System.exit(1);
  493.          }
  494.          System.out.println("Response PDU for keyChange  received from " +
  495. (pdu1.getAddress()).getHostAddress());
  496.          if (pdu1.getErrstat() != 0){
  497.          System.out.println("KeyChange SET request returned error "
  498. + "User NOT Successfully cloned");
  499.              System.err.println(pdu1.getError());
  500. System.exit(1);
  501. }
  502.         else 
  503.             // print the response pdu varbinds
  504.             System.out.println(pdu1.printVarBinds());
  505. // Since we are reusing the PDU, we will remove the varbinds
  506. // and set the reqid to 0.
  507. surg.removeAllVarBinds(pdu1);
  508. //pdu.setReqid(0);
  509. // Step 4. GET usmUserPulic and check it has randomValue
  510. // Get the usmUserPublic value
  511.          pdu1.setCommand( SnmpAPI.GET_REQ_MSG );
  512.          oid = new SnmpOID(randomOID);
  513.          if (oid.toValue() == null) 
  514.              System.err.println("Invalid OID argument: " + randomOID);
  515.          else pdu1.addNull(oid);
  516.  
  517.          try {
  518.             // Send PDU and receive response PDU
  519.              pdu1 = session.syncSend(pdu1);
  520.          } catch (SnmpException e) {
  521.              System.err.println("Sending PDU "+e.getMessage());
  522.              System.exit(1);
  523.          }    
  524.          if (pdu1 == null) {
  525.             // timeout
  526.              System.out.println("Request timed out to: " + opt.remArgs[0] );
  527.              System.exit(1);
  528.          }
  529.         // print and exit
  530.          System.out.println("Response PDU for usmUserPublic  received from "  +
  531. (pdu1.getAddress()).getHostAddress());
  532.             
  533.         // Check for error in response
  534.         if (pdu1.getErrstat() != 0){
  535.          System.out.println("usmUserPublic GET request returned error "
  536. + "User NOT Successfully cloned");
  537.             System.err.println(pdu1.getError());
  538. System.exit(1);
  539. }
  540.         else 
  541.             // print the response pdu varbinds
  542.             System.out.println(pdu1.printVarBinds());
  543. userPublic = (pdu1.getVariable(0)).toString();
  544. try{
  545. tempRandom = new String(priv_random,ENC);
  546. }catch(Exception e){
  547. tempRandom = new String(priv_random);
  548. }
  549. if(userPublic.equals(tempRandom))
  550. System.out.println("usmUserPulic value is set appropriatelyn");
  551. else{
  552. System.out.println("usmUserPulic value is NOT set appropriately");
  553. System.out.println("User NOT Successfully cloned");
  554. System.exit(1);
  555. }
  556. }
  557. }  // end of if(authPassword.length() > 0 .....) 
  558. // Step 5. Activate the new user by setting the usmUserStatus=active 
  559. setOID3 = new SnmpOID(rowStatusOID);
  560. surg.addvarbind(pdu, setOID3,"INTEGER","1");
  561. System.out.println("Sending a request to set  rowStatus value to activen");
  562.         pdu.setCommand( SnmpAPI.SET_REQ_MSG );
  563.         try {
  564.             // Send PDU and receive response PDU
  565.             pdu = session.syncSend(pdu);
  566.         } catch (SnmpException e) {
  567.             System.err.println("Sending PDU"+e.getMessage());
  568.             System.exit(1);
  569.         }    
  570.         if (pdu == null) {
  571.             // timeout
  572.             System.out.println("Request timed out to: " + opt.remArgs[2] );
  573.             System.exit(1);
  574.         }
  575.         System.out.println("Response PDU for set row status active " +
  576. " received from " + (pdu.getAddress()).getHostAddress());
  577.         if (pdu.getErrstat() != 0){
  578.          System.out.println("Row Status SET request returned error "
  579. + "User NOT Successfully cloned");
  580.             System.err.println(pdu.getError());
  581. System.exit(1);
  582. }
  583.         else{ 
  584.             // print the response pdu varbinds
  585.             System.out.println(pdu.printVarBinds());
  586. System.out.println("User  S u c c e s s f u l l y  cloned !!!");
  587. }
  588.         // close session
  589.         session.close();
  590.         // stop api thread
  591.         api.close();
  592.     
  593.         System.exit(0);
  594.     }
  595. int sendSpinLockRequest(SnmpPDU pdu,SnmpSession session)
  596. {
  597. // Get the usmUserSpinLock value. 
  598. System.out.println("nSending a request for retriving the " +
  599. " usmUserSpinLock valuen");
  600.         pdu.setCommand( SnmpAPI.GET_REQ_MSG );
  601.         SnmpOID oid = new SnmpOID(SPIN_LOCK_OID);
  602.         if (oid.toValue() == null) 
  603.             System.err.println("Invalid OID argument: " + SPIN_LOCK_OID);
  604.         else 
  605. pdu.addNull(oid);
  606.  
  607.         try {
  608.             // Send PDU and receive response PDU
  609.             pdu = session.syncSend(pdu);
  610.         } catch (SnmpException e) {
  611.             System.err.println("Sending PDU "+e.getMessage());
  612.             // System.exit(1);
  613. return -1;
  614.         }    
  615.         if (pdu == null) {
  616.             // timeout
  617.             System.out.println("Request timed out to: remote host ");
  618.             // System.exit(1);
  619. return -1;
  620.         }
  621.         // print and exit
  622.         System.out.println("Response PDU for usmUserSpinLock received from " +
  623. (pdu.getAddress()).getHostAddress());
  624.             
  625.         // Check for error in response
  626.         if (pdu.getErrstat() != 0){
  627.             System.err.println(pdu.getError());
  628. //System.exit(1);
  629. return -1;
  630. }
  631.         else 
  632.             // print the response pdu varbinds
  633.             System.out.println(pdu.printVarBinds());
  634. SnmpVarBind vb = pdu.getVariableBinding(0);
  635. SnmpVar var = vb.getVariable();
  636. int spinLock = Integer.parseInt(var.toString()); 
  637. return spinLock;
  638. }
  639. String getKeyChangeValue(String user,String engID,
  640. int protocol,String password,
  641. byte[] keyOld,byte[] random,boolean isPriv)
  642. {
  643. byte[] engineID = null;
  644. try {
  645. engineID = engID.getBytes(ENC);
  646. }catch(Exception ex) {
  647. engineID = engID.getBytes();
  648. }
  649. byte[] localizedKey = USMUtils.password_to_key(protocol,
  650. password.getBytes(),
  651. password.getBytes().length, 
  652. engineID);
  653. int keyLength = AUTH_MD5_LEN;
  654. int hashLength = AUTH_MD5_LEN;
  655. if(protocol == USMUserEntry.SHA_AUTH && !isPriv)
  656. {
  657. keyLength = AUTH_SHA_LEN;
  658. hashLength = AUTH_SHA_LEN;
  659. }
  660. if(debug){
  661. System.out.println("The old localized key is " + 
  662. USMUtils.printOctets(keyOld, keyOld.length) + "n");
  663. System.out.println("The new localized key is " + 
  664. USMUtils.printOctets(localizedKey, localizedKey.length) 
  665. + "n"); 
  666. }
  667. byte[] keyChange = USMUtils.getKeyChange(protocol,true,keyLength,
  668. hashLength,localizedKey,keyOld,random);
  669. if(debug){
  670. System.out.println("The keyChange is " + 
  671. USMUtils.printOctets(keyChange, keyChange.length) + "n");
  672. System.out.println("The random is " + 
  673. USMUtils.printOctets(random, random.length) + "n");
  674. }
  675. String kChange;
  676. try{
  677. kChange =  new String(keyChange,ENC);
  678. }
  679. catch(Exception e){
  680. kChange =  new String(keyChange);
  681. }
  682. return kChange;
  683. }
  684. void removeAllVarBinds(SnmpPDU pdu)
  685. {
  686. int size = pdu.getVariableBindings().size();
  687. for(int i = 0; i < size; i++)
  688. {
  689. pdu.removeVariableBinding(0);
  690. }
  691. }
  692. static public int[] stringToIntegerArray(String str){
  693. int[] instanceOID = new int[str.length()];
  694. byte[] temp = new byte[str.length()];
  695. str.getBytes(0, str.length() , temp, 0);
  696. for (int i=0;i<temp.length;i++)
  697. instanceOID[i] = (int)(temp[i] & 0xff);
  698. return instanceOID;
  699. }
  700. static String intArrayToString(int[] intArray) {
  701. StringBuffer s = new StringBuffer();
  702. for (int i=0;i<intArray.length;i++) 
  703. s.append("."+Integer.toString(intArray[i]));
  704.     return s.toString();
  705. }
  706.  /** <img SRC="images/v3only.jpg" ALT="v3 only"> <img SRC="images/v3only.jpg" ALT="v3 only"> adds the varbind with specified oid, type and value to the pdu */
  707.     static void addvarbind(SnmpPDU pdu, SnmpOID oid, String type, String value)
  708.     {        
  709.         byte dataType ;
  710.         if (type.equals("INTEGER")) {
  711.             dataType = SnmpAPI.INTEGER;
  712.         } else if (type.equals("STRING")) {
  713.             dataType = SnmpAPI.STRING;
  714.         } else if (type.equals("GAUGE")) {
  715.             dataType = SnmpAPI.GAUGE;
  716.         } else if (type.equals("TIMETICKS")) {
  717.             dataType = SnmpAPI.TIMETICKS;
  718.         } else if (type.equals("OPAQUE")) {
  719.             dataType = SnmpAPI.OPAQUE;
  720.         } else if (type.equals("IPADDRESS")) {
  721.             dataType = SnmpAPI.IPADDRESS;
  722.         } else if (type.equals("COUNTER")) {
  723.             dataType = SnmpAPI.COUNTER;
  724.         } else if (type.equals("OID")) { 
  725.             dataType = SnmpAPI.OBJID;
  726.         } else if (type.equals("BITS")) { 
  727.             dataType = SnmpAPI.BITSTRING;
  728.         } else { 
  729.             System.err.println("Invalid variable type: " + type);
  730.             return;
  731.         }
  732.         SnmpVar var = null;
  733.         try {
  734.             // create SnmpVar instance for the value and the type
  735.             var = SnmpVar.createVariable( value, dataType );
  736.         }
  737.         catch(SnmpException e){
  738.             System.err.println("Cannot create variable: " + 
  739. oid + " with value: " + value);
  740.             return;
  741.         }
  742.         //create varbind
  743.         SnmpVarBind varbind = new SnmpVarBind(oid, var);
  744.         // add variable binding
  745.         pdu.addVariableBinding(varbind);
  746.     }
  747. }