snmpPasswd.cpp
上传用户:cnryan
上传日期:2008-12-15
资源大小:260k
文件大小:13k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*_############################################################################
  2.   _## 
  3.   _##  snmpPasswd.cpp  
  4.   _##
  5.   _##  SNMP++v3.2.21
  6.   _##  -----------------------------------------------
  7.   _##  Copyright (c) 2001-2006 Jochen Katz, Frank Fock
  8.   _##
  9.   _##  This software is based on SNMP++2.6 from Hewlett Packard:
  10.   _##  
  11.   _##    Copyright (c) 1996
  12.   _##    Hewlett-Packard Company
  13.   _##  
  14.   _##  ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.
  15.   _##  Permission to use, copy, modify, distribute and/or sell this software 
  16.   _##  and/or its documentation is hereby granted without fee. User agrees 
  17.   _##  to display the above copyright notice and this license notice in all 
  18.   _##  copies of the software and any documentation of the software. User 
  19.   _##  agrees to assume all liability for the use of the software; 
  20.   _##  Hewlett-Packard and Jochen Katz make no representations about the 
  21.   _##  suitability of this software for any purpose. It is provided 
  22.   _##  "AS-IS" without warranty of any kind, either express or implied. User 
  23.   _##  hereby grants a royalty-free license to any and all derivatives based
  24.   _##  upon this software code base. 
  25.   _##  
  26.   _##  Stuttgart, Germany, Fri Jun 16 17:48:57 CEST 2006 
  27.   _##  
  28.   _##########################################################################*/
  29. char snmppasswd_cpp_version[]="@(#) SNMP++ $Id: snmpPasswd.cpp,v 1.8 2005/10/11 18:08:05 katz Exp $";
  30. #include "snmp_pp/snmp_pp.h"
  31. #include <stdlib.h>
  32. #include <stdio.h>
  33. #ifdef WIN32
  34. #define strcasecmp stricmp
  35. #endif
  36. #ifdef SNMP_PP_NAMESPACE
  37. using namespace Snmp_pp;
  38. #endif
  39. #if (__GNUC__ > 2)
  40. #include <iostream>
  41. using std::cerr;
  42. using std::cout;
  43. using std::endl;
  44. using std::flush;
  45. #else
  46. #include <iostream.h>
  47. #endif
  48. #ifdef _SNMPv3
  49. USM *usm;
  50. void KeyChange(Snmp* snmp, Pdu& myPdu, 
  51.        const OctetStr& user, const OctetStr& newpass, 
  52.        SnmpTarget& target, int type)
  53. {
  54.   struct UsmKeyUpdate *uku = NULL;
  55.   int stat;
  56.   int status;
  57.   uku = usm->key_update_prepare(user, target, newpass,
  58. myPdu, type, stat);
  59.   if (uku == NULL)
  60.     cout << "Key update preparation failed *************" << endl
  61.          << "with " << snmp->error_msg(stat) << endl <<endl;
  62.   if (( status = snmp->set( myPdu,target)) == SNMP_CLASS_SUCCESS) {
  63.     Vb vb3;
  64.     Oid oid3;
  65.     myPdu.get_vb( vb3,0);
  66.     vb3.get_oid(oid3);
  67.     Vb vb4;
  68.     Oid oid4;
  69.     myPdu.get_vb( vb4,1);
  70.     vb4.get_oid(oid4);
  71.     if (myPdu.get_type() == REPORT_MSG) {
  72.       cout << "Received a reportPDU! with Oid " 
  73.            << oid3.get_printable() << endl
  74.            << snmp->error_msg(oid3) << endl;
  75.       usm->key_update_abort(uku);
  76.     } 
  77.     else {
  78.       cout << flush << endl
  79.            << "Oid = " << vb3.get_printable_oid() << endl
  80.            << "Value = " << vb3.get_printable_value() << endl;
  81.       cout << flush << endl 
  82.            << "Oid = " << vb4.get_printable_oid() << endl
  83.            << "Value = " << vb4.get_printable_value() << endl;
  84.       int resul = usm->key_update_commit(uku, USM_PasswordAllKeyUpdate);
  85.       cout << endl  << "result of local key update: " 
  86.            << resul << endl;
  87.     }
  88.   }
  89.   else {
  90.     cout << "SNMP++ KeyChange Error, " << snmp->error_msg( status)
  91.  << " (" << status <<")"<< endl;
  92.     usm->key_update_abort(uku);
  93.   }
  94.   
  95.   cout << "******************************** END" 
  96.        << endl << endl << flush;
  97. }
  98. int main(int argc, char **argv)
  99. {
  100.    //---------[ check the arg count ]----------------------------------------
  101.    if ( argc < 4) {
  102.   cout << "Usage:n";
  103.   cout << "snmpPasswd IpAddress | DNSName user newpassword [options]n";
  104.   cout << "Oid: sysDescr object is defaultn";
  105.   cout << "options: -vN , use SNMP version 1, 2 or 3, default is 1n";
  106.   cout << "         -PPort , remote port to usen";
  107.   cout << "         -CCommunity_name, specify community default is 'public' n";
  108.   cout << "         -rN , retries default is N = 1 retryn";
  109.   cout << "         -tN , timeout in hundredths of seconds; default is N = 100n";
  110.           cout << "         -snSecurityName, " << endl;
  111.           cout << "         -slN , securityLevel to use, default N = 3 = authPriv" << endl;
  112.           cout << "         -smN , securityModel to use, only default N = 3 = USM possiblen";
  113.           cout << "         -cnContextName, default empty string" << endl;
  114.           cout << "         -ceContextEngineID, as hex e.g. 800007E580, default empty string" << endl;
  115.           cout << "         -authPROT, use authentication protocol NONE, SHA or MD5n";
  116.           cout << "         -privPROT, use privacy protocol NONE, DES, 3DESEDE, IDEA, AES128, AES192 or AES256n";
  117.           cout << "         -uaAuthPasswordn";
  118.           cout << "         -upPrivPasswordn";
  119.   cout << "         -eEngineID, as hexn";
  120.   return 1;
  121.    }
  122.    Snmp::socket_startup();  // Initialize socket subsystem
  123.    //---------[ make a GenAddress and Oid object to retrieve ]---------------
  124.    UdpAddress address( argv[1]);      // make a SNMP++ Generic address
  125.    if ( !address.valid()) {           // check validity of address
  126.   cout << "Invalid Address or DNS Name, " << argv[1] << "n";
  127.   return 1;
  128.    }
  129.    OctetStr newUser, newPassword;
  130.    if (((strstr( argv[2],"-")==0) && (strstr( argv[3],"-")==0))) {
  131. newUser = argv[2];
  132. newPassword = argv[3];
  133.    }
  134.    else
  135.    {
  136.      cout << "wrong parameters..." << endl;
  137.      return 1;
  138.    }
  139.    //---------[ determine options to use ]-----------------------------------
  140.    snmp_version version=version1;                  // default is v1
  141.    int retries=1;                                  // default retries is 1
  142.    int timeout=100;                                // default is 1 second
  143.    u_short port=161;                               // default snmp port is 161
  144.    OctetStr community("public");                   // community name
  145.    OctetStr privPassword("");
  146.    OctetStr authPassword("");
  147.    OctetStr securityName("");
  148.    int securityModel = SecurityModel_USM;
  149.    int securityLevel = SecurityLevel_authPriv;
  150.    OctetStr contextName("");
  151.    OctetStr contextEngineID("");
  152.    long authProtocol = SNMPv3_usmNoAuthProtocol;
  153.    long privProtocol = SNMPv3_usmNoPrivProtocol;
  154.    OctetStr engineID;
  155.    v3MP *v3_MP;
  156.    char *ptr;
  157.    for(int x=1;x<argc;x++) {                           // parse for version
  158.      if ( strstr( argv[x],"-v2")!= 0) {
  159.        version = version2c;
  160.        continue;
  161.      }
  162.      if ( strstr( argv[x],"-r")!= 0) {                 // parse for retries
  163.        ptr = argv[x]; ptr++; ptr++;
  164.        retries = atoi(ptr);
  165.        if (( retries<0)|| (retries>5)) retries=1; 
  166.        continue;
  167.      }
  168.      if ( strstr( argv[x], "-t")!=0) {                 // parse for timeout
  169.        ptr = argv[x]; ptr++; ptr++;
  170.        timeout = atoi( ptr);
  171.        if (( timeout < 100)||( timeout>500)) timeout=100;
  172.        continue;
  173.      }
  174.      if ( strstr( argv[x],"-C")!=0) {
  175.        ptr = argv[x]; ptr++; ptr++;
  176.        community = ptr;
  177.        continue;
  178.      }
  179.      if ( strstr( argv[x],"-P")!=0) {
  180.        ptr = argv[x]; ptr++; ptr++;
  181.        sscanf(ptr, "%hu", &port);
  182.        continue;
  183.      }
  184.      if ( strstr( argv[x],"-v3")!= 0) {
  185.        version = version3;
  186.        continue;
  187.      }
  188.      if ( strstr( argv[x],"-auth") != 0) {
  189.        ptr = argv[x]; ptr+=5;
  190.        if (strcasecmp(ptr, "SHA") == 0)
  191.    authProtocol = SNMP_AUTHPROTOCOL_HMACSHA;
  192.        else if (strcasecmp(ptr, "MD5") == 0)
  193.    authProtocol = SNMP_AUTHPROTOCOL_HMACMD5;
  194.        else
  195.    authProtocol = SNMP_AUTHPROTOCOL_NONE;
  196.        continue;
  197.      }
  198.      if ( strstr( argv[x],"-priv") != 0) {
  199.        ptr = argv[x]; ptr+=5;
  200.        if (strcasecmp(ptr, "DES") == 0)
  201.    privProtocol = SNMP_PRIVPROTOCOL_DES;
  202.        else if (strcasecmp(ptr, "3DESEDE") == 0)
  203.    privProtocol = SNMP_PRIVPROTOCOL_3DESEDE;
  204.        else if (strcasecmp(ptr, "IDEA") == 0)
  205.    privProtocol = SNMP_PRIVPROTOCOL_IDEA;
  206.        else if (strcasecmp(ptr, "AES128") == 0)
  207.    privProtocol = SNMP_PRIVPROTOCOL_AES128;
  208.        else if (strcasecmp(ptr, "AES192") == 0)
  209.    privProtocol = SNMP_PRIVPROTOCOL_AES192;
  210.        else if (strcasecmp(ptr, "AES256") == 0)
  211.    privProtocol = SNMP_PRIVPROTOCOL_AES256;
  212.        else
  213.    privProtocol = SNMP_PRIVPROTOCOL_NONE;
  214.        printf("nnPrivProt : %ldn", privProtocol);
  215.        continue;
  216.      }
  217.      if ( strstr( argv[x],"-sn")!=0) {
  218.        ptr = argv[x]; ptr+=3;
  219.        securityName = ptr;
  220.        continue;
  221.       }
  222.      if ( strstr( argv[x], "-sl")!=0) {
  223.        ptr = argv[x]; ptr+=3;
  224.        securityLevel = atoi( ptr);
  225.        if (( securityLevel < SecurityLevel_noAuthNoPriv) ||
  226.            ( securityLevel > SecurityLevel_authPriv))
  227.          securityLevel = SecurityLevel_authPriv;
  228.        continue;
  229.      }
  230.      if ( strstr( argv[x], "-sm")!=0) {
  231.        ptr = argv[x]; ptr+=3;
  232.        securityModel = atoi( ptr);
  233.        if (( securityModel < SecurityModel_v1) ||
  234.            ( securityModel > SecurityModel_USM))
  235.          securityModel = SecurityModel_USM;
  236.        continue;
  237.      }
  238.      if ( strstr( argv[x],"-cn")!=0) {
  239.        ptr = argv[x]; ptr+=3;
  240.        contextName = ptr;
  241.        continue;
  242.      }
  243.      if ( strstr( argv[x],"-ce")!=0) {
  244.        ptr = argv[x]; ptr+=3;
  245.        contextEngineID = OctetStr::from_hex_string(ptr);
  246.        continue;
  247.      }
  248.      if ( strstr( argv[x],"-ua")!=0) {
  249.        ptr = argv[x]; ptr+=3;
  250.        authPassword = ptr;
  251.        continue;
  252.      }
  253.      if ( strstr( argv[x],"-up")!=0) {
  254.        ptr = argv[x]; ptr+=3;
  255.        privPassword = ptr;
  256.        continue;
  257.      }
  258.      if ( strstr( argv[x],"-e")!=0) {
  259.        ptr = argv[x]; ptr+=2;
  260.        engineID = OctetStr::from_hex_string(ptr);
  261.        continue;
  262.      }
  263.    }
  264.    //----------[ create a SNMP++ session ]-----------------------------------
  265.    int status;
  266.    // bind to any port and use IPv6 if needed
  267.    Snmp snmp(status, 0, (address.get_ip_version() == Address::version_ipv6));
  268.    if ( status != SNMP_CLASS_SUCCESS) {
  269.       cout << "SNMP++ Session Create Fail, " << snmp.error_msg(status) << "n";
  270.       return 1;
  271.    }
  272.    //---------[ init SnmpV3 ]--------------------------------------------
  273.    if (version == version3) {
  274.      OctetStr engineId = "snmpPasswd";
  275.      char *filename = "snmpv3_boot_counter";
  276.      unsigned int snmpEngineBoots = 0;
  277.      int status;
  278.      status = getBootCounter(filename, engineId, snmpEngineBoots);
  279.      if ((status != SNMPv3_OK) && (status < SNMPv3_FILEOPEN_ERROR))
  280.      {
  281.        cout << "Error loading snmpEngineBoots counter: " << status << endl;
  282.        return 1;
  283.      }
  284.      snmpEngineBoots++;
  285.      status = saveBootCounter(filename, engineId, snmpEngineBoots);
  286.      if (status != SNMPv3_OK)
  287.      {
  288.        cout << "Error saving snmpEngineBoots counter: " << status << endl;
  289.        return 1;
  290.      }
  291.      int construct_status;
  292.      v3_MP = new v3MP(engineId, snmpEngineBoots, construct_status);
  293.      usm = v3_MP->get_usm();
  294.      usm->add_usm_user(securityName,
  295.        authProtocol, privProtocol,
  296.        authPassword, privPassword);
  297.    }
  298.    else
  299.    {
  300.      // MUST create a dummy v3MP object if _SNMPv3 is enabled!
  301.      int construct_status;
  302.      v3_MP = new v3MP("dummy", 0, construct_status);
  303.    }
  304.    //--------[ build up SNMP++ object needed ]-------------------------------
  305.    Pdu pdu;                               // construct a Pdu object
  306.    Vb vb;                                 // construct a Vb object
  307.    vb.set_oid(Oid("1.3.6.1.2.1.1.1.0"));  // set the Oid portion of the Vb
  308.    pdu += vb;                             // add the vb to the Pdu
  309.    address.set_port(port);
  310.    CTarget ctarget( address);             // make a target using the address
  311.    UTarget utarget( address);
  312.    if (version == version3) {
  313.      utarget.set_version( version);          // set the SNMP version SNMPV1 or V2 or V3
  314.      utarget.set_retry( retries);            // set the number of auto retries
  315.      utarget.set_timeout( timeout);          // set timeout
  316.      utarget.set_security_model( securityModel);
  317.      utarget.set_security_name( securityName);
  318.      pdu.set_security_level( securityLevel);
  319.      pdu.set_context_name (contextName);
  320.      pdu.set_context_engine_id(contextEngineID);
  321.    }
  322.    else {
  323.      ctarget.set_version( version);         // set the SNMP version SNMPV1 or V2
  324.      ctarget.set_retry( retries);           // set the number of auto retries
  325.      ctarget.set_timeout( timeout);         // set timeout
  326.      ctarget.set_readcommunity( community); // set the read community name
  327.    }
  328.    //-------[ issue the request, blocked mode ]-----------------------------
  329.    cout << "SNMP++ Get to " << argv[1] << " SNMPV" 
  330.         << ((version==version3) ? (version) : (version+1)) 
  331.         << " Retries=" << retries
  332.         << " Timeout=" << timeout * 10 <<"ms"; 
  333.    if (version == version3)
  334.      cout << endl
  335.           << "securityName= " << securityName.get_printable()
  336.           << ", securityLevel= " << securityLevel
  337.           << ", securityModel= " << securityModel << endl
  338.           << "contextName= " << contextName.get_printable()
  339.           << ", contextEngineID= " << contextEngineID.get_printable()
  340.           << endl;
  341.    else
  342.      cout << " Community=" << community.get_printable() << endl << flush;
  343.    SnmpTarget *target;
  344.    if (version == version3)
  345.      target = &utarget;
  346.    else
  347.      target = &ctarget;
  348.    Pdu pduKeyChange;
  349.    if (version == version3) {
  350.      pduKeyChange.set_security_level( securityLevel);
  351.      pduKeyChange.set_context_name (contextName);
  352.      pduKeyChange.set_context_engine_id(contextEngineID);
  353.    }
  354.    
  355.    snmp.get( pdu, *target);
  356.    KeyChange(&snmp, pduKeyChange, newUser, newPassword, *target, AUTHKEY);
  357.    Snmp::socket_cleanup();  // Shut down socket subsystem
  358. #else
  359. #include <stdio.h>
  360. int main()
  361. {
  362.   printf("This example needs _SNMPv3 defined.n");
  363. }
  364. #endif