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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*_############################################################################
  2.   _## 
  3.   _##  snmpSet.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. /*
  30.   snmpSet.cpp 
  31.   Copyright (c) 1996
  32.   Hewlett-Packard Company
  33.   ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.
  34.   Permission to use, copy, modify, distribute and/or sell this software
  35.   and/or its documentation is hereby granted without fee. User agrees
  36.   to display the above copyright notice and this license notice in all
  37.   copies of the software and any documentation of the software. User
  38.   agrees to assume all liability for the use of the software; Hewlett-Packard
  39.   makes no representations about the suitability of this software for any
  40.   purpose. It is provided "AS-IS" without warranty of any kind,either express
  41.   or implied. User hereby grants a royalty-free license to any and all
  42.   derivatives based upon this software code base.
  43.   Peter E. Mellquist
  44. */
  45. char snmpset_cpp_version[]="@(#) SNMP++ $Id: snmpSet.cpp,v 1.8 2005/10/11 18:08:05 katz Exp $";
  46. #include "snmp_pp/snmp_pp.h"
  47. #include <stdlib.h>
  48. #include <stdio.h>
  49. #ifdef WIN32
  50. #define strcasecmp stricmp
  51. #endif
  52. #ifdef SNMP_PP_NAMESPACE
  53. using namespace Snmp_pp;
  54. #endif
  55. #if (__GNUC__ > 2)
  56. #include <iostream>
  57. using std::cerr;
  58. using std::cout;
  59. using std::cin;
  60. using std::endl;
  61. using std::flush;
  62. #else
  63. #include <iostream.h>
  64. #endif
  65. // determine the smi type and get a value from the user
  66. int determine_vb( SmiUINT32 val, Vb &vb)
  67. {
  68.   char buffer[255];
  69.   if (val == sNMP_SYNTAX_NOSUCHINSTANCE)
  70.   {
  71.     cout << "Instance does not exists but can be created.n";
  72.     cout << "Please enter one of the following types:nn";
  73.     cout << "Integer:  " << sNMP_SYNTAX_INT << "n";
  74.     cout << "Bits:     " << sNMP_SYNTAX_BITS << "n";
  75.     cout << "STRING:   " << sNMP_SYNTAX_OCTETS << "n";
  76.     cout << "Oid:      " << sNMP_SYNTAX_OID << "n";
  77.     cout << "IpAddress:" << sNMP_SYNTAX_IPADDR << "nn";
  78.     cout << "Please choose value type: ";
  79.     cin >> val;
  80.     vb.set_syntax(val);
  81.   }
  82.   cout << "Value Type is ";
  83.   switch (val) {
  84.     // octet string
  85.     case sNMP_SYNTAX_OCTETS:
  86.     {
  87.       cout << "Octet Stringn";
  88.       cout << "Please enter new value: ";
  89.       cin >> buffer;
  90.       OctetStr octetstr( buffer);
  91.       if ( octetstr.valid()) {
  92. vb.set_value( octetstr);
  93. return TRUE;
  94.       }
  95.       else {
  96. cout << "Invalid OctetStrn";
  97. return FALSE;
  98.       }
  99.     }
  100.     // IP Address
  101.     case sNMP_SYNTAX_IPADDR:
  102.     {
  103.       cout << "IP Addressn";
  104.       cout << "Please enter new value: ";
  105.       cin >> buffer;
  106.       IpAddress ipaddress( buffer);
  107.       if ( ipaddress.valid()) {
  108. vb.set_value( ipaddress);
  109. return TRUE;
  110.       }
  111.       else {
  112. cout << "Invalid IP Addressn";
  113. return FALSE;
  114.       }
  115.     }
  116.     // Oid
  117.     case sNMP_SYNTAX_OID:
  118.     {
  119.       cout << "Oidn";
  120.       cout << "Please enter new value: ";
  121.       cin >> buffer;
  122.       Oid oid( buffer);
  123.       if ( oid.valid()) {
  124. vb.set_value( oid);
  125. return TRUE;
  126.       }
  127.       else {
  128. cout << "Invalid Oidn";
  129. return FALSE;
  130.       }
  131.     }
  132.     // TimeTicks
  133.     case sNMP_SYNTAX_TIMETICKS:
  134.     {
  135.       cout << "TimeTicksn";
  136.       cout << "Please enter new value: ";
  137.       cin >> buffer;
  138.       unsigned long i;
  139.       i = atol( buffer);
  140.       TimeTicks timeticks( i);
  141.       if ( timeticks.valid()) {
  142. vb.set_value( timeticks);
  143. return TRUE;
  144.       }
  145.       else {
  146. cout << "Invalid TimeTicksn";
  147. return FALSE;
  148.       }
  149.     }
  150.     // Gauge32
  151.     case sNMP_SYNTAX_GAUGE32:
  152.     {
  153.       cout << "Gauge32n";
  154.       cout << "Please enter new value: ";
  155.       cin >> buffer;
  156.       unsigned long i;
  157.       i = atol( buffer);
  158.       Gauge32 gauge32(i); 
  159.       if ( gauge32.valid()) {
  160. vb.set_value( gauge32);
  161. return TRUE;
  162.       }
  163.       else {
  164. cout << "Invalid Gauge32n";
  165. return FALSE;
  166.       }
  167.     }
  168.     case sNMP_SYNTAX_CNTR32:
  169.     {
  170.       cout << "Counter32n";
  171.       cout << "Please enter new value: ";
  172.       cin >> buffer;
  173.       unsigned long i;
  174.       i = atol( buffer);
  175.       Counter32 counter32(i);
  176.       if ( counter32.valid()) {
  177. vb.set_value( counter32);
  178. return TRUE;
  179.       }
  180.       else {
  181. cout << "Invalid Counter32n";
  182. return FALSE;
  183.       }
  184.     }
  185.     case sNMP_SYNTAX_CNTR64:
  186.     {
  187.       cout << "Counter64n";
  188.       cout << "Please enter value (low 32 bit): ";
  189.       cin >> buffer;
  190.       unsigned long i;
  191.       i = atol( buffer);
  192.       Counter64 counter64;
  193.       counter64.set_low(i);
  194.       cout << "Please enter value (high 32 bit): ";
  195.       cin >> buffer;
  196.       i = atol( buffer);
  197.       counter64.set_high(i);
  198.       if ( counter64.valid()) {
  199. vb.set_value( counter64);
  200. return TRUE;
  201.       }
  202.       else {
  203. cout << "Invalid Counter64n";
  204. return FALSE;
  205.       }
  206.     }
  207.     case sNMP_SYNTAX_INT:
  208.     {
  209.       cout << "Integern";
  210.       cout << "Please enter new value: ";
  211.       cin >> buffer;
  212.       unsigned long i;
  213.       i = atol( buffer);
  214.       long l ;
  215.       l = ( long) i;
  216.       vb.set_value( l);
  217.       return TRUE;
  218.     }
  219.     case sNMP_SYNTAX_NOSUCHOBJECT:
  220.     {
  221.       cout << "NO SUCH OBJECTn";
  222.       cout << "Object cannot be created.n";
  223.       return FALSE;
  224.     }
  225.     default:
  226.     cout << "Unknown Data Type " << val << "n";
  227.     return FALSE;
  228.   }
  229. }
  230. int main(int argc, char **argv)
  231. {
  232.    //---------[ check the arg count ]----------------------------------------
  233.    if ( argc < 2) {
  234.   cout << "Usage:n";
  235.   cout << argv[0] << " IpAddress | DNSName [Oid] [options]n";
  236.   cout << "Oid: sysDescr object is defaultn";
  237.   cout << "options: -vN , use SNMP version 1, 2 or 3, default is 1n";
  238.   cout << "         -PPort , remote port to usen";
  239.   cout << "         -CCommunity_name, specify SET community default is 'public' n";
  240.   cout << "         -GCommunity_name, specify GET community default is set community value n";
  241.   cout << "         -rN , retries default is N = 1 retryn";
  242.   cout << "         -tN , timeout in hundredths of seconds; default is N = 100n";
  243. #ifdef _SNMPv3
  244.           cout << "         -snSecurityName, " << endl;
  245.           cout << "         -slN , securityLevel to use, default N = 3 = authPriv" << endl;
  246.           cout << "         -smN , securityModel to use, only default N = 3 = USM possiblen";
  247.           cout << "         -cnContextName, default empty string" << endl;
  248.           cout << "         -ceContextEngineID, as hex e.g. 800007E580, default empty string" << endl;
  249.           cout << "         -authPROT, use authentication protocol NONE, SHA or MD5n";
  250.           cout << "         -privPROT, use privacy protocol NONE, DES, 3DESEDE, IDEA, AES128, AES192 or AES256n";
  251.           cout << "         -uaAuthPasswordn";
  252.           cout << "         -upPrivPasswordn";
  253. #endif
  254.   return 1;
  255.    }
  256.   Snmp::socket_startup();  // Initialize socket subsystem
  257.    //---------[ make a GenAddress and Oid object to retrieve ]---------------
  258.    UdpAddress address( argv[1]);      // make a SNMP++ Generic address
  259.    if ( !address.valid()) {           // check validity of address
  260.   cout << "Invalid Address or DNS Name, " << argv[1] << "n";
  261.   return 1;
  262.    }
  263.    Oid oid("1.3.6.1.2.1.1.4.0");      // default is sysName
  264.    if ( argc >= 3) {                  // if 3 args, then use the callers Oid
  265.   if ( strstr( argv[2],"-")==0) {
  266.      oid = argv[2];
  267.      if ( !oid.valid()) {            // check validity of user oid
  268.     cout << "Invalid Oid, " << argv[2] << "n";
  269.     return 1;
  270.          }
  271.       }
  272.    }
  273.    //---------[ determine options to use ]-----------------------------------
  274.    snmp_version version=version1;                  // default is v1
  275.    int retries=1;                                  // default retries is 1
  276.    int timeout=100;                                // default is 1 second
  277.    u_short port=161;                               // default snmp port is 161
  278.    OctetStr community("public");                   // community name
  279.    OctetStr get_community;
  280. #ifdef _SNMPv3
  281.    OctetStr privPassword("");
  282.    OctetStr authPassword("");
  283.    OctetStr securityName("");
  284.    int securityModel = SecurityModel_USM;
  285.    int securityLevel = SecurityLevel_authPriv;
  286.    OctetStr contextName("");
  287.    OctetStr contextEngineID("");
  288.    long authProtocol = SNMPv3_usmNoAuthProtocol;
  289.    long privProtocol = SNMPv3_usmNoPrivProtocol;
  290.    v3MP *v3_MP;
  291. #endif
  292.    char *ptr;
  293.    for(int x=1;x<argc;x++) {                           // parse for version
  294.      if ( strstr( argv[x],"-v2")!= 0) {
  295.        version = version2c;
  296.        continue;
  297.      }
  298.      if ( strstr( argv[x],"-r")!= 0) {                 // parse for retries
  299.        ptr = argv[x]; ptr++; ptr++;
  300.        retries = atoi(ptr);
  301.        if (( retries<0)|| (retries>5)) retries=1; 
  302.        continue;
  303.      }
  304.      if ( strstr( argv[x], "-t")!=0) {                 // parse for timeout
  305.        ptr = argv[x]; ptr++; ptr++;
  306.        timeout = atoi( ptr);
  307.        if (( timeout < 100)||( timeout>500)) timeout=100;
  308.        continue;
  309.      }
  310.      if ( strstr( argv[x],"-C")!=0) {
  311.        ptr = argv[x]; ptr++; ptr++;
  312.        community = ptr;
  313.        continue;
  314.      }
  315.      if ( strstr( argv[x],"-G")!=0) {
  316.        ptr = argv[x]; ptr++; ptr++;
  317.        get_community = ptr;
  318.        continue;
  319.      }
  320.      if ( strstr( argv[x],"-P")!=0) {
  321.        ptr = argv[x]; ptr++; ptr++;
  322.        sscanf(ptr, "%hu", &port);
  323.        continue;
  324.      }
  325. #ifdef _SNMPv3
  326.      if ( strstr( argv[x],"-v3")!= 0) {
  327.        version = version3;
  328.        continue;
  329.      }
  330.      if ( strstr( argv[x],"-auth") != 0) {
  331.        ptr = argv[x]; ptr+=5;
  332.        if (strcasecmp(ptr, "SHA") == 0)
  333.    authProtocol = SNMP_AUTHPROTOCOL_HMACSHA;
  334.        else if (strcasecmp(ptr, "MD5") == 0)
  335.    authProtocol = SNMP_AUTHPROTOCOL_HMACMD5;
  336.        else
  337.    authProtocol = SNMP_AUTHPROTOCOL_NONE;
  338.        continue;
  339.      }
  340.      if ( strstr( argv[x],"-priv") != 0) {
  341.        ptr = argv[x]; ptr+=5;
  342.        if (strcasecmp(ptr, "DES") == 0)
  343.    privProtocol = SNMP_PRIVPROTOCOL_DES;
  344.        else if (strcasecmp(ptr, "3DESEDE") == 0)
  345.    privProtocol = SNMP_PRIVPROTOCOL_3DESEDE;
  346.        else if (strcasecmp(ptr, "IDEA") == 0)
  347.    privProtocol = SNMP_PRIVPROTOCOL_IDEA;
  348.        else if (strcasecmp(ptr, "AES128") == 0)
  349.    privProtocol = SNMP_PRIVPROTOCOL_AES128;
  350.        else if (strcasecmp(ptr, "AES192") == 0)
  351.    privProtocol = SNMP_PRIVPROTOCOL_AES192;
  352.        else if (strcasecmp(ptr, "AES256") == 0)
  353.    privProtocol = SNMP_PRIVPROTOCOL_AES256;
  354.        else
  355.    privProtocol = SNMP_PRIVPROTOCOL_NONE;
  356.        printf("nnPrivProt : %ldn", privProtocol);
  357.        continue;
  358.      }
  359.      if ( strstr( argv[x],"-sn")!=0) {
  360.        ptr = argv[x]; ptr+=3;
  361.        securityName = ptr;
  362.        continue;
  363.       }
  364.      if ( strstr( argv[x], "-sl")!=0) {
  365.        ptr = argv[x]; ptr+=3;
  366.        securityLevel = atoi( ptr);
  367.        if (( securityLevel < SecurityLevel_noAuthNoPriv) ||
  368.            ( securityLevel > SecurityLevel_authPriv))
  369.          securityLevel = SecurityLevel_authPriv;
  370.        continue;
  371.      }
  372.      if ( strstr( argv[x], "-sm")!=0) {
  373.        ptr = argv[x]; ptr+=3;
  374.        securityModel = atoi( ptr);
  375.        if (( securityModel < SecurityModel_v1) ||
  376.            ( securityModel > SecurityModel_USM))
  377.          securityModel = SecurityModel_USM;
  378.        continue;
  379.      }
  380.      if ( strstr( argv[x],"-cn")!=0) {
  381.        ptr = argv[x]; ptr+=3;
  382.        contextName = ptr;
  383.        continue;
  384.      }
  385.      if ( strstr( argv[x],"-ce")!=0) {
  386.        ptr = argv[x]; ptr+=3;
  387.        contextEngineID = OctetStr::from_hex_string(ptr);
  388.        continue;
  389.      }
  390.      if ( strstr( argv[x],"-ua")!=0) {
  391.        ptr = argv[x]; ptr+=3;
  392.        authPassword = ptr;
  393.        continue;
  394.      }
  395.      if ( strstr( argv[x],"-up")!=0) {
  396.        ptr = argv[x]; ptr+=3;
  397.        privPassword = ptr;
  398.        continue;
  399.      }
  400. #endif
  401.   }
  402.    if (get_community.len() == 0)
  403.      get_community = community;
  404.    //----------[ create a SNMP++ session ]-----------------------------------
  405.    int status;
  406.    // bind to any port and use IPv6 if needed
  407.    Snmp snmp(status, 0, (address.get_ip_version() == Address::version_ipv6));
  408.    if ( status != SNMP_CLASS_SUCCESS) {
  409.       cout << "SNMP++ Session Create Fail, " << snmp.error_msg(status) << "n";
  410.       return 1;
  411.    }
  412.    //---------[ init SnmpV3 ]--------------------------------------------
  413. #ifdef _SNMPv3
  414.    if (version == version3) {
  415.      char *engineId = "snmpSet";
  416.      char *filename = "snmpv3_boot_counter";
  417.      unsigned int snmpEngineBoots = 0;
  418.      int status;
  419.      status = getBootCounter(filename, engineId, snmpEngineBoots);
  420.      if ((status != SNMPv3_OK) && (status < SNMPv3_FILEOPEN_ERROR))
  421.      {
  422.        cout << "Error loading snmpEngineBoots counter: " << status << endl;
  423.        return 1;
  424.      }
  425.      snmpEngineBoots++;
  426.      status = saveBootCounter(filename, engineId, snmpEngineBoots);
  427.      if (status != SNMPv3_OK)
  428.      {
  429.        cout << "Error saving snmpEngineBoots counter: " << status << endl;
  430.        return 1;
  431.      }
  432.      int construct_status;
  433.      v3_MP = new v3MP(engineId, snmpEngineBoots, construct_status);
  434.      USM *usm = v3_MP->get_usm();
  435.      usm->add_usm_user(securityName,
  436.        authProtocol, privProtocol,
  437.        authPassword, privPassword);
  438.    }
  439.    else
  440.    {
  441.      // MUST create a dummy v3MP object if _SNMPv3 is enabled!
  442.      int construct_status;
  443.      v3_MP = new v3MP("dummy", 0, construct_status);
  444.    }
  445. #endif
  446.    //--------[ build up SNMP++ object needed ]-------------------------------
  447.    Pdu pdu;                               // construct a Pdu object
  448.    Vb vb;                                 // construct a Vb object
  449.    vb.set_oid( oid);                      // set the Oid portion of the Vb
  450.    pdu += vb;                             // add the vb to the Pdu
  451.    address.set_port(port);
  452.    CTarget ctarget( address);             // make a target using the address
  453. #ifdef _SNMPv3
  454.    UTarget utarget( address);
  455.    if (version == version3) {
  456.      utarget.set_version( version);          // set the SNMP version SNMPV1 or V2 or V3
  457.      utarget.set_retry( retries);            // set the number of auto retries
  458.      utarget.set_timeout( timeout);          // set timeout
  459.      utarget.set_security_model( securityModel);
  460.      utarget.set_security_name( securityName);
  461.      pdu.set_security_level( securityLevel);
  462.      pdu.set_context_name (contextName);
  463.      pdu.set_context_engine_id(contextEngineID);
  464.    }
  465.    else {
  466. #endif
  467.      ctarget.set_version( version);         // set the SNMP version SNMPV1 or V2
  468.      ctarget.set_retry( retries);           // set the number of auto retries
  469.      ctarget.set_timeout( timeout);         // set timeout
  470.      ctarget.set_readcommunity( get_community); // set the read community name
  471.      ctarget.set_writecommunity( community);// set the write community name
  472. #ifdef _SNMPv3
  473.    }
  474. #endif
  475.   //-------[ issue the request, blocked mode ]-----------------------------
  476.   cout << "SNMP++ Set to " << argv[1] << " SNMPV" 
  477. #ifdef _SNMPv3
  478.         << ((version==version3) ? (version) : (version+1))
  479. #else
  480.         << (version+1)
  481. #endif
  482.         << " Retries=" << retries
  483.         << " Timeout=" << timeout * 10 <<"ms";
  484. #ifdef _SNMPv3
  485.    if (version == version3)
  486.      cout << endl
  487.           << "securityName= " << securityName.get_printable()
  488.           << ", securityLevel= " << securityLevel
  489.           << ", securityModel= " << securityModel << endl
  490.           << "contextName= " << contextName.get_printable()
  491.           << ", contextEngineID= " << contextEngineID.get_printable()
  492.           << endl;
  493.    else
  494. #endif
  495.      cout << " SET-community=" << community.get_printable()
  496.   << " GET-community=" << get_community.get_printable() << endl << flush;
  497.    SnmpTarget *target;
  498. #ifdef _SNMPv3
  499.    if (version == version3)
  500.      target = &utarget;
  501.    else
  502. #endif
  503.      target = &ctarget;
  504.   // first get the variabel to determine its type
  505.   if (( status = snmp.get( pdu,*target))== SNMP_CLASS_SUCCESS) {
  506.     pdu.get_vb( vb,0);
  507.     cout << "Oid = " << vb.get_printable_oid() << endl
  508.  << "Current Value = " << vb.get_printable_value() << endl;
  509. #ifdef _SNMPv3
  510.     if (pdu.get_type() == REPORT_MSG) {
  511.       cout << "Received a reportPdu: "
  512.            << snmp.error_msg( vb.get_printable_oid()) 
  513.            << endl
  514.            << vb.get_printable_oid() << " = "
  515.            << vb.get_printable_value() << endl;
  516.       return -5;
  517.     }
  518. #endif
  519.     if ( determine_vb(vb.get_syntax(), vb)) {
  520.       // do the Set
  521.       Pdu setpdu;
  522. #ifdef _SNMPv3
  523.       setpdu.set_security_level(securityLevel);
  524.       setpdu.set_context_name (contextName);
  525.       setpdu.set_context_engine_id(contextEngineID);
  526. #endif
  527.       vb.set_oid( oid);           // use the same oid as the inquire
  528.       setpdu += vb; 
  529.       status = snmp.set( setpdu, *target);
  530.       cout << "Set Status = " << snmp.error_msg( status) << "n";
  531.     }
  532.   }
  533.   else
  534.     cout << "SNMP++ Set Error, " << snmp.error_msg( status) << "n";
  535.   Snmp::socket_cleanup();  // Shut down socket subsystem
  536. }