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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*_############################################################################
  2.   _## 
  3.   _##  snmpTraps.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.   snmpTraps.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 snmptraps_cpp_version[]="@(#) SNMP++ $Id: snmpTraps.cpp,v 1.6 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::endl;
  60. using std::flush;
  61. #else
  62. #include <iostream.h>
  63. #endif
  64. #define COLDSTART "1.3.6.1.6.3.1.1.5.1"
  65. #define PAYLOADID "1.3.6.1.4.1.11.2.16.2"
  66. #define PAYLOAD "SNMP++ Trap Send Test"
  67. #define ENTERPRISE "1.3.6.1.2.1.1.1.2.0.1"
  68. int main(int argc, char **argv)
  69. {
  70.    //---------[ check the arg count ]----------------------------------------
  71.    if ( argc < 2) {
  72.   cout << "Usage:n";
  73.   cout << "snmpTraps IpAddress | DNSName [Id] [options]n";
  74.   cout << "Id = default is 1.3.6.1.6.3.1.1.5.1 = ColdStart";
  75.   cout << "options: -vN , use SNMP version 1, 2 or 3, default is 1n";
  76.   cout << "         -PPort , remote port to usen";
  77.   cout << "         -CCommunity_name, specify community default is 'public' n";
  78. #ifdef _SNMPv3
  79.           cout << "         -snSecurityName, " << endl;
  80.           cout << "         -slN , securityLevel to use, default N = 3 = authPriv" << endl;
  81.           cout << "         -smN , securityModel to use, only default N = 3 = USM possiblen";
  82.           cout << "         -cnContextName, default empty string" << endl;
  83.           cout << "         -ceContextEngineID, as hex e.g. 800007E580, default empty string" << endl;
  84.           cout << "         -authPROT, use authentication protocol NONE, SHA or MD5n";
  85.           cout << "         -privPROT, use privacy protocol NONE, DES, 3DESEDE, IDEA, AES128, AES192 or AES256n";
  86.           cout << "         -uaAuthPasswordn";
  87.           cout << "         -upPrivPasswordn";
  88. #endif
  89.   return 1;
  90.    }
  91.    Snmp::socket_startup();  // Initialize socket subsystem
  92.    //---------[ make a GenAddress and Oid object to retrieve ]---------------
  93.    UdpAddress address( argv[1]);      // make a SNMP++ Generic address
  94.    if ( !address.valid()) {           // check validity of address
  95.   cout << "Invalid Address or DNS Name, " << argv[1] << "n";
  96.   return 1;
  97.    }
  98.    Oid oid( COLDSTART);    // default is ColdStart 
  99.    if ( argc >= 3) {                  // if 3 args, then use the callers Oid
  100.   if ( strstr( argv[2],"-")==0) {
  101.      oid = argv[2];
  102.      if ( !oid.valid()) {            // check validity of user oid
  103.     cout << "Invalid Oid, " << argv[2] << "n";
  104.     return 1;
  105.          }
  106.       }
  107.    }
  108.    //---------[ determine options to use ]-----------------------------------
  109.    snmp_version version=version1;                  // default is v1
  110.    u_short port=161;                               // default snmp port is 161
  111.    OctetStr community("public");                   // community name
  112.    Oid ent(ENTERPRISE);                            // default enterprise
  113. #ifdef _SNMPv3
  114.    OctetStr privPassword("");
  115.    OctetStr authPassword("");
  116.    OctetStr securityName("");
  117.    int securityModel = SecurityModel_USM;
  118.    int securityLevel = SecurityLevel_authPriv;
  119.    OctetStr contextName("");
  120.    OctetStr contextEngineID("");
  121.    long authProtocol = SNMPv3_usmNoAuthProtocol;
  122.    long privProtocol = SNMPv3_usmNoPrivProtocol;
  123.    v3MP *v3_MP;
  124. #endif
  125.    char *ptr;
  126.    for(int x=1;x<argc;x++) {                           // parse for version
  127.      if ( strstr( argv[x],"-v2")!= 0) {
  128.        version = version2c;
  129.        continue;
  130.      }
  131.      if ( strstr( argv[x],"-C")!=0) {
  132.        ptr = argv[x]; ptr++; ptr++;
  133.        community = ptr;
  134.        continue;
  135.      }
  136.      if ( strstr( argv[x],"-P")!=0) {
  137.        ptr = argv[x]; ptr++; ptr++;
  138.        sscanf(ptr, "%hu", &port);
  139.        continue;
  140.      }
  141. #ifdef _SNMPv3
  142.      if ( strstr( argv[x],"-v3")!= 0) {
  143.        version = version3;
  144.        continue;
  145.      }
  146.      if ( strstr( argv[x],"-auth") != 0) {
  147.        ptr = argv[x]; ptr+=5;
  148.        if (strcasecmp(ptr, "SHA") == 0)
  149.    authProtocol = SNMP_AUTHPROTOCOL_HMACSHA;
  150.        else if (strcasecmp(ptr, "MD5") == 0)
  151.    authProtocol = SNMP_AUTHPROTOCOL_HMACMD5;
  152.        else
  153.    authProtocol = SNMP_AUTHPROTOCOL_NONE;
  154.        continue;
  155.      }
  156.      if ( strstr( argv[x],"-priv") != 0) {
  157.        ptr = argv[x]; ptr+=5;
  158.        if (strcasecmp(ptr, "DES") == 0)
  159.    privProtocol = SNMP_PRIVPROTOCOL_DES;
  160.        else if (strcasecmp(ptr, "3DESEDE") == 0)
  161.    privProtocol = SNMP_PRIVPROTOCOL_3DESEDE;
  162.        else if (strcasecmp(ptr, "IDEA") == 0)
  163.    privProtocol = SNMP_PRIVPROTOCOL_IDEA;
  164.        else if (strcasecmp(ptr, "AES128") == 0)
  165.    privProtocol = SNMP_PRIVPROTOCOL_AES128;
  166.        else if (strcasecmp(ptr, "AES192") == 0)
  167.    privProtocol = SNMP_PRIVPROTOCOL_AES192;
  168.        else if (strcasecmp(ptr, "AES256") == 0)
  169.    privProtocol = SNMP_PRIVPROTOCOL_AES256;
  170.        else
  171.    privProtocol = SNMP_PRIVPROTOCOL_NONE;
  172.        printf("nnPrivProt : %ldn", privProtocol);
  173.        continue;
  174.      }
  175.      if ( strstr( argv[x],"-sn")!=0) {
  176.        ptr = argv[x]; ptr+=3;
  177.        securityName = ptr;
  178.        continue;
  179.       }
  180.      if ( strstr( argv[x], "-sl")!=0) {
  181.        ptr = argv[x]; ptr+=3;
  182.        securityLevel = atoi( ptr);
  183.        if (( securityLevel < SecurityLevel_noAuthNoPriv) ||
  184.            ( securityLevel > SecurityLevel_authPriv))
  185.          securityLevel = SecurityLevel_authPriv;
  186.        continue;
  187.      }
  188.      if ( strstr( argv[x], "-sm")!=0) {
  189.        ptr = argv[x]; ptr+=3;
  190.        securityModel = atoi( ptr);
  191.        if (( securityModel < SecurityModel_v1) ||
  192.            ( securityModel > SecurityModel_USM))
  193.          securityModel = SecurityModel_USM;
  194.        continue;
  195.      }
  196.      if ( strstr( argv[x],"-cn")!=0) {
  197.        ptr = argv[x]; ptr+=3;
  198.        contextName = ptr;
  199.        continue;
  200.      }
  201.      if ( strstr( argv[x],"-ce")!=0) {
  202.        ptr = argv[x]; ptr+=3;
  203.        contextEngineID = OctetStr::from_hex_string(ptr);
  204.        continue;
  205.      }
  206.      if ( strstr( argv[x],"-ua")!=0) {
  207.        ptr = argv[x]; ptr+=3;
  208.        authPassword = ptr;
  209.        continue;
  210.      }
  211.      if ( strstr( argv[x],"-up")!=0) {
  212.        ptr = argv[x]; ptr+=3;
  213.        privPassword = ptr;
  214.        continue;
  215.      }
  216. #endif
  217.   }
  218.    //----------[ create a SNMP++ session ]-----------------------------------
  219.    int status;
  220.    Snmp *snmp;
  221.    if (address.get_ip_version() == Address::version_ipv4)
  222.      snmp = new Snmp(status, "0.0.0.0");
  223.    else
  224.      snmp = new Snmp(status, "::");
  225.    if ( status != SNMP_CLASS_SUCCESS) {
  226.       cout << "SNMP++ Session Create Fail, " << snmp->error_msg(status) << "n";
  227.       return 1;
  228.    }
  229.    //---------[ init SnmpV3 ]--------------------------------------------
  230. #ifdef _SNMPv3
  231.    if (version == version3) {
  232.      char *engineId = "TrapSender";
  233.      char *filename = "snmpv3_boot_counter";
  234.      unsigned int snmpEngineBoots = 0;
  235.      int status;
  236.      status = getBootCounter(filename, engineId, snmpEngineBoots);
  237.      if ((status != SNMPv3_OK) && (status < SNMPv3_FILEOPEN_ERROR))
  238.      {
  239.        cout << "Error loading snmpEngineBoots counter: " << status << endl;
  240.        return 1;
  241.      }
  242.      snmpEngineBoots++;
  243.      status = saveBootCounter(filename, engineId, snmpEngineBoots);
  244.      if (status != SNMPv3_OK)
  245.      {
  246.        cout << "Error saving snmpEngineBoots counter: " << status << endl;
  247.        return 1;
  248.      }
  249.      int construct_status;
  250.      v3_MP = new v3MP(engineId, snmpEngineBoots, construct_status);
  251.      USM *usm = v3_MP->get_usm();
  252.      usm->add_usm_user(securityName,
  253.        authProtocol, privProtocol,
  254.        authPassword, privPassword);
  255.    }
  256.    else
  257.    {
  258.      // MUST create a dummy v3MP object if _SNMPv3 is enabled!
  259.      int construct_status;
  260.      v3_MP = new v3MP("dummy", 0, construct_status);
  261.    }
  262. #endif
  263.    //--------[ build up SNMP++ object needed ]-------------------------------
  264.    Pdu pdu;                               // construct a Pdu object
  265.    Vb vb;                                 // variable binding object to use
  266.    vb.set_oid(PAYLOADID);                 // example oid for trap payload
  267.    vb.set_value(PAYLOAD);                 // example string for payload
  268.    pdu += vb;                             // append the vb to the pdu
  269.    pdu.set_notify_id( oid);               // set the id of the trap
  270.    pdu.set_notify_enterprise( ent);       // set up the enterprise of the trap
  271.    address.set_port(port);
  272.    CTarget ctarget( address);             // make a target using the address
  273. #ifdef _SNMPv3
  274.    UTarget utarget( address);
  275.    if (version == version3) {
  276.      utarget.set_version( version);          // set the SNMP version SNMPV1 or V2 or V3
  277.      utarget.set_security_model( securityModel);
  278.      utarget.set_security_name( securityName);
  279.      pdu.set_security_level( securityLevel);
  280.      pdu.set_context_name (contextName);
  281.      pdu.set_context_engine_id(contextEngineID);
  282.    }
  283.    else {
  284. #endif
  285.      ctarget.set_version( version);         // set the SNMP version SNMPV1 or V2
  286.      ctarget.set_readcommunity( community); // set the read community name
  287. #ifdef _SNMPv3
  288.    }
  289. #endif
  290.    //-------[ Send the trap  ]------------------------------------------------
  291.    cout << "SNMP++ Trap to " << argv[1] << " SNMPV"
  292. #ifdef _SNMPv3
  293.         << ((version==version3) ? (version) : (version+1));
  294. #else
  295.         << (version+1);
  296. #endif
  297. #ifdef _SNMPv3
  298.    if (version == version3)
  299.      cout << endl
  300.           << "securityName= " << securityName.get_printable()
  301.           << ", securityLevel= " << securityLevel
  302.           << ", securityModel= " << securityModel << endl
  303.           << "contextName= " << contextName.get_printable()
  304.           << ", contextEngineID= " << contextEngineID.get_printable()
  305.           << endl;
  306.    else
  307. #endif
  308.      cout << " Community=" << community.get_printable() << endl << flush;
  309.    SnmpTarget *target;
  310. #ifdef _SNMPv3
  311.    if (version == version3)
  312.      target = &utarget;
  313.    else
  314. #endif
  315.      target = &ctarget;
  316.    status = snmp->trap( pdu,*target);
  317.    cout << "SNMP++ Trap Send Status = " << snmp->error_msg( status) << "n";
  318.   Snmp::socket_cleanup();  // Shut down socket subsystem
  319. }