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