snmpSet.cpp
上传用户:czjinwang
上传日期:2007-01-12
资源大小:2484k
文件大小:8k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. /*
  2.   snmpSet.cpp 
  3.   version 2.8
  4.   Copyright (c) 1996
  5.   Hewlett-Packard Company
  6.   ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.
  7.   Permission to use, copy, modify, distribute and/or sell this software
  8.   and/or its documentation is hereby granted without fee. User agrees
  9.   to display the above copyright notice and this license notice in all
  10.   copies of the software and any documentation of the software. User
  11.   agrees to assume all liability for the use of the software; Hewlett-Packard
  12.   makes no representations about the suitability of this software for any
  13.   purpose. It is provided "AS-IS" without warranty of any kind,either express
  14.   or implied. User hereby grants a royalty-free license to any and all
  15.   derivatives based upon this software code base.
  16.   Peter E. Mellquist
  17. */
  18. #include "snmp_pp.h"
  19. #include <iostream.h>
  20. #include <stdlib.h>
  21. // detrmine the smi type and get a value from
  22. // the user
  23. int determine_vb( SmiUINT32 val, Vb &vb) {
  24.    char buffer[255];
  25.    cout << "Value Type is ";
  26.    switch (val) {
  27.   // octet string
  28.       case sNMP_SYNTAX_OCTETS:
  29.   {
  30.      cout << "Octet Stringn";
  31.  cout << "Value ?";
  32.  cin >> buffer;
  33.  OctetStr octetstr( buffer);
  34.  if ( octetstr.valid()) {
  35.     vb.set_value( octetstr);
  36. return TRUE;
  37.          }
  38.  else {
  39.    cout << "Invalid OctetStrn";
  40.    return FALSE;
  41.          }
  42.       }
  43.   break;
  44.   // IP Address
  45.   case sNMP_SYNTAX_IPADDR:
  46.   {
  47.      cout << "IP Addressn";
  48.      cout << "Value ?";
  49.      cin >> buffer;
  50.      IpAddress ipaddress( buffer);
  51.      if ( ipaddress.valid()) {
  52.     vb.set_value( ipaddress);
  53.     return TRUE;
  54.          }
  55.      else {
  56.     cout << "Invalid IP Addressn";
  57.     return FALSE;
  58.          }
  59.   }
  60.   break;
  61.   // Oid
  62.   case sNMP_SYNTAX_OID:
  63.   {
  64.      cout << "Oidn";
  65.      cout << "Value ?";
  66.      cin >> buffer;
  67.      Oid oid( buffer);
  68.      if ( oid.valid()) {
  69.     vb.set_value( oid);
  70.     return TRUE;
  71.          }
  72.      else {
  73.     cout << "Invalid Oidn";
  74.     return FALSE;
  75.          }
  76.       }
  77.   break;
  78.   // TimeTicks
  79.   case sNMP_SYNTAX_TIMETICKS:
  80.   {
  81.      cout << "TimeTicksn";
  82.  cout << "Value ?";
  83.  cin >> buffer;
  84.          unsigned long i;
  85.  i = atol( buffer);
  86.  TimeTicks timeticks( i);
  87.  if ( timeticks.valid()) {
  88.     vb.set_value( timeticks);
  89. return TRUE;
  90.          }
  91.  else {
  92. cout << "Invalid TimeTicksn";
  93. return FALSE;
  94.          }
  95.       }
  96.   break;
  97.   // Gauge32
  98.       case sNMP_SYNTAX_GAUGE32:
  99.   {
  100.          cout << "Gauge32n";
  101.          cout << "Value ?";
  102.          cin >> buffer;
  103.          unsigned long i;
  104.          i = atol( buffer);
  105.          Gauge32 gauge32(i); 
  106.          if ( gauge32.valid()) {
  107.             vb.set_value( gauge32);
  108.             return TRUE;
  109.          }
  110.          else {
  111.             cout << "Invalid Gauge32n";
  112.             return FALSE;
  113.          }
  114.       }
  115.   break;
  116.   case sNMP_SYNTAX_CNTR32:
  117.       {
  118.          cout << "Counter32n";
  119.          cout << "Value ?";
  120.          cin >> buffer;
  121.          unsigned long i;
  122.          i = atol( buffer);
  123.          Counter32 counter32(i);
  124.          if ( counter32.valid()) {
  125.             vb.set_value( counter32);
  126.             return TRUE;
  127.          }
  128.          else {
  129.             cout << "Invalid Counter32n";
  130.             return FALSE;
  131.          }
  132.       }
  133.   break;
  134.   case sNMP_SYNTAX_INT:
  135.       {
  136.          cout << "Integern";
  137.          cout << "Value ?";
  138.          cin >> buffer;
  139.          unsigned long i;
  140.          i = atol( buffer);
  141.          long l ;
  142.  l = ( long) i;
  143.          vb.set_value( l);
  144.          return TRUE;
  145.       }
  146.   break;
  147.   case sNMP_SYNTAX_UINT32:
  148.       {
  149.          cout << "Integern";
  150.          cout << "Value ?";
  151.          cin >> buffer;
  152.          unsigned long i;
  153.          i = atol( buffer);
  154.          vb.set_value( i);
  155.          return TRUE;
  156.       }
  157.   break;
  158.   default:
  159.  cout << "Unknown Data Typen";
  160.  return FALSE;
  161.    }
  162. }
  163. int main( int argc, char **argv)  {
  164.    //---------[ check the arg count ]----------------------------------------
  165.    if ( argc < 2) {
  166.   cout << "Usage:n";
  167.   cout << "snmpSet Address | DNSName [Oid] [options]n";
  168.   cout << "Oid: sysDescr object is defaultn";
  169.   cout << "options: -v1 , use SNMPV1, defaultn";
  170.   cout << "         -v2 , use SNMPV2n";
  171.   cout << "         -cCommunity_name, specify community default is 'public' n";
  172.   cout << "         -rN , retries default is N = 1 retryn";
  173.   cout << "         -tN , timeout in hundredths-seconds default is N = 100 = 1 secondn";
  174.   return 0;
  175.    }
  176.    //---------[ make a GenAddress and Oid object to retrieve ]---------------
  177.    GenAddress address( argv[1]);      // make a SNMP++ Generic address
  178.    if ( !address.valid()) {           // check validity of address
  179.   cout << "Invalid Address or DNS Name, " << argv[1] << "n";
  180.   return 0;
  181.    }
  182.    Oid oid("1.3.6.1.2.1.1.4.0");      // defualt is sysName
  183.    if ( argc >= 3) {                  // if 3 args, then use the callers Oid
  184.   if ( strstr( argv[2],"-")==0) {
  185.      oid = argv[2];
  186.      if ( !oid.valid()) {         // check validity of user oid
  187.     cout << "Invalid Oid, " << argv[2] << "n";
  188.     return 0;
  189.          }
  190.       }
  191.    }
  192.    //---------[ determine options to use ]-----------------------------------
  193.    snmp_version version=version1;                       // default is v1
  194.    int retries=1;                                       // default retries is 1
  195.    int timeout=100;                                     // default is 1 second
  196.    OctetStr community("public");                        // community name
  197.    char *ptr;
  198.    for(int x=1;x<argc;x++) {                           // parse for version
  199.       if ( strstr( argv[x],"-v2")!= 0)   
  200.          version = version2c;
  201.       if ( strstr( argv[x],"-r")!= 0) {                 // parse for retries
  202.          ptr = argv[x]; ptr++; ptr++;
  203.  retries = atoi(ptr);
  204.  if (( retries<1)|| (retries>5)) retries=1; 
  205.       }
  206.   if ( strstr( argv[x], "-t")!=0) {                 // parse for timeout
  207.  ptr = argv[x]; ptr++; ptr++; 
  208.  timeout = atoi( ptr);
  209.  if (( timeout < 100)||( timeout>500)) timeout=100;
  210.       }
  211.   if ( strstr( argv[x],"-c")!=0) {
  212.  ptr = argv[x]; ptr++; ptr++;
  213.  community = ptr;
  214.       }
  215.    }
  216.    //----------[ create a SNMP++ session ]-----------------------------------
  217.    int status; 
  218.    Snmp snmp( status);                // check construction status
  219.    if ( status != SNMP_CLASS_SUCCESS) {
  220.       cout << "SNMP++ Session Create Fail, " << snmp.error_msg(status) << "n";
  221.       return 0;
  222.    }
  223.    //--------[ build up SNMP++ object needed ]-------------------------------
  224.    Pdu pdu;                                // construct a Pdu object
  225.    Vb vb;                                  // construct a Vb object
  226.    vb.set_oid( oid);                       // set the Oid portion of the Vb
  227.    pdu += vb;                              // add the vb to the Pdu
  228.    CTarget target( address);               // make a target using the address
  229.    target.set_version( version);           // set the SNMP version SNMPV1 or V2
  230.    target.set_retry( retries);             // set the number of auto retries
  231.    target.set_timeout( timeout);           // set timeout
  232.    target.set_readcommunity( community);   // set read community
  233.  
  234.    //-------[ issue the request, blocked mode ]-----------------------------
  235.    cout << "SNMP++ Set to " << argv[1] << " SNMPV" << (version+1) << " Retries=" << retries;
  236.    cout << " Timeout=" << timeout <<"msn";
  237.    // first get the variabel to determine its type
  238.    if (( status = snmp.get( pdu,target))== SNMP_CLASS_SUCCESS) {
  239.   pdu.get_vb( vb,0);
  240.   cout << "Oid = " << vb.get_printable_oid() << "n";
  241.   cout << "Current Value = " << vb.get_printable_value() << "n";
  242.   if ( determine_vb(vb.get_syntax(), vb)) {
  243.       // do the Set
  244.   Pdu setpdu;
  245.   vb.set_oid( oid);           // use the same oid as the inquire
  246.   setpdu += vb; 
  247.           status = snmp.set( setpdu, target);
  248.   cout << "Set Status = ";
  249.   if ( status == SNMP_CLASS_ERR_STATUS_SET)
  250.   status = setpdu.get_error_status();
  251.   cout << snmp.error_msg( status) << "n";
  252.   }
  253.    }
  254.    else {
  255.   if ( status == SNMP_CLASS_ERR_STATUS_SET)
  256.   status = pdu.get_error_status();
  257.   cout << "SNMP++ Set Error, " << snmp.error_msg( status) << "n";
  258.    }
  259.    return 0;
  260. }  // end snmpSet