version 1.5, 2002/03/27 21:27:35
|
version 1.31, 2010/12/22 12:19:06
|
|
|
//%///////////////////////////////////////////////////////////////////////////// |
//%LICENSE//////////////////////////////////////////////////////////////// |
// | // |
// Copyright (c) 2000, 2001 BMC Software, Hewlett Packard, IBM, The Open Group, |
// Licensed to The Open Group (TOG) under one or more contributor license |
// Tivoli Systems |
// agreements. Refer to the OpenPegasusNOTICE.txt file distributed with |
|
// this work for additional information regarding copyright ownership. |
|
// Each contributor licenses this file to you under the OpenPegasus Open |
|
// Source License; you may not use this file except in compliance with the |
|
// License. |
// | // |
// Permission is hereby granted, free of charge, to any person obtaining a copy |
// Permission is hereby granted, free of charge, to any person obtaining a |
// of this software and associated documentation files (the "Software"), to |
// copy of this software and associated documentation files (the "Software"), |
// deal in the Software without restriction, including without limitation the |
// to deal in the Software without restriction, including without limitation |
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or |
// the rights to use, copy, modify, merge, publish, distribute, sublicense, |
// sell copies of the Software, and to permit persons to whom the Software is |
// and/or sell copies of the Software, and to permit persons to whom the |
// furnished to do so, subject to the following conditions: |
// Software is furnished to do so, subject to the following conditions: |
// |
|
// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN |
|
// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED |
|
// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT |
|
// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR |
|
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
|
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
|
// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
|
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
// | // |
//============================================================================== |
// The above copyright notice and this permission notice shall be included |
|
// in all copies or substantial portions of the Software. |
// | // |
// Author: Nitin Upasani, Hewlett-Packard Company (Nitin_Upasani@hp.com) |
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
|
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
|
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
|
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
|
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
// | // |
// Modified By: |
////////////////////////////////////////////////////////////////////////// |
// | // |
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
#include <Pegasus/Common/Config.h> |
|
#include <Pegasus/Common/System.h> | #include <Pegasus/Common/System.h> |
#include <fcntl.h> |
#include <Pegasus/Common/ArrayInternal.h> |
#include <unistd.h> |
#include <Pegasus/Common/InternalException.h> |
#include <ctype.h> |
|
#include <sys/stat.h> |
|
#include "snmpDeliverTrap_emanate.h" | #include "snmpDeliverTrap_emanate.h" |
#include "prnt_lib.h" |
|
| |
PEGASUS_NAMESPACE_BEGIN |
#include <Pegasus/Common/MessageLoader.h> |
| |
PEGASUS_USING_STD; |
// EMANATE specific declarations and entry points - MUST be in begining |
|
// and outside NAMESPACE. |
|
|
|
// master agent needs these two declarations for communication with sub-agent. |
|
// Following two declarations must be in the CODE. |
|
|
|
#include <prnt_lib.h> // MUST be at the end in include list. |
| |
static char *sr_filename = __FILE__; |
static const char* sr_filename = __FILE__; |
| |
IPCFunctionP IPCfp; /* IPC functions pointer */ | IPCFunctionP IPCfp; /* IPC functions pointer */ |
| |
// This code should be generated by Emanate |
// This code would normally be generated by Emanate from defined MIB objects. |
// Since we do not have MIB objects defined, |
// Since we do not have MIB objects defined, just defined here to load |
// just defined here to load subagent as library |
// subagent as library. OidList[] provides objects for entry point to master |
|
// agent. |
| |
// The objects internal to the agent | // The objects internal to the agent |
ObjectInfo OidList[] = | ObjectInfo OidList[] = |
{ | { |
{ { 0, NULL }, |
{ |
|
{ 0, NULL }, |
#ifndef LIGHT | #ifndef LIGHT |
NULL, | NULL, |
#endif /* LIGHT */ | #endif /* LIGHT */ |
0, 0, 0, 0, | 0, 0, 0, 0, |
NULL, NULL } |
NULL, NULL |
|
} |
}; | }; |
| |
// This code should be generated by Emanate in k_* routine |
// This code would normally be generated by Emanate in k_* routine from |
// Since we do not have MIB objects defined, |
// defined MIB objects. Since we do not have MIB objects defined, just |
// just defined here to pass compile |
// define here to pass compile and enable entry point for master agent to |
|
// start communication with library. |
| |
// Called by the master agent during initialization */ | // Called by the master agent during initialization */ |
int k_initialize() | int k_initialize() |
|
|
return 1; | return 1; |
} | } |
| |
|
// END EMANATE specific declarations. |
|
|
|
PEGASUS_NAMESPACE_BEGIN |
|
|
|
PEGASUS_USING_STD; |
|
|
snmpDeliverTrap_emanate::snmpDeliverTrap_emanate() | snmpDeliverTrap_emanate::snmpDeliverTrap_emanate() |
{ | { |
|
|
} | } |
| |
snmpDeliverTrap_emanate::~snmpDeliverTrap_emanate() | snmpDeliverTrap_emanate::~snmpDeliverTrap_emanate() |
{ | { |
|
|
} | } |
| |
|
|
|
// initialize sub-agent |
|
|
|
// This also defines the communication protocol to be used between master |
|
// and sub-agent. |
|
|
void snmpDeliverTrap_emanate::initialize() | void snmpDeliverTrap_emanate::initialize() |
{ | { |
#ifndef SR_UDS_IPC | #ifndef SR_UDS_IPC |
|
|
| |
if(InitSubagent() == -1) | if(InitSubagent() == -1) |
{ | { |
cout << "InitSubagent Failed to initialize" << endl; |
throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, MessageLoaderParms( |
exit(1); |
_MSG_INITSUBAGENT_FAILED_KEY, |
|
_MSG_INITSUBAGENT_FAILED)); |
|
|
} | } |
} | } |
| |
|
void snmpDeliverTrap_emanate::terminate() |
|
{ |
|
// |
|
// Close the connection to the Master Agent and shut down the |
|
// Subagent |
|
// |
|
EndSubagent(); |
|
} |
|
|
|
|
void snmpDeliverTrap_emanate::deliverTrap( | void snmpDeliverTrap_emanate::deliverTrap( |
const String& trapOid, | const String& trapOid, |
const String& community, |
const String& securityName, |
const String& destination, |
const String& targetHost, |
const String& trapType, |
const Uint16& targetHostFormat, |
Array<String>& vbOids, |
const String& otherTargetHostFormat, |
Array<String>& vbTypes, |
const Uint32& portNumber, |
Array<String>& vbValues) |
const Uint16& snmpVersion, |
|
const String& engineID, |
|
const Uint8& snmpSecLevel, |
|
const Uint8& snmpSecAuthProto, |
|
const Array<Uint8>& snmpSecAuthKey, |
|
const Uint8& snmpSecPrivProto, |
|
const Array<Uint8>& snmpSecPrivKey, |
|
const Array<String>& vbOids, |
|
const Array<String>& vbTypes, |
|
const Array<String>& vbValues) |
{ | { |
OctetString* newValue; |
VarBind* vbhead = NULL; |
|
|
VarBind *vb = NULL; | VarBind *vb = NULL; |
VarBind *vb2 = NULL; |
VarBind* vblast = NULL; |
VarBind *vb3 = NULL; |
|
| |
OID *object = NULL; | OID *object = NULL; |
| |
// Initializing with Master agent |
// Translate a string into an OID |
initialize(); |
OID* sendtrapOid = MakeOIDFromDot(trapOid.getCString()); |
| |
// TRAP OID: getting trapOid |
if (sendtrapOid == NULL) |
char* _trapOid = trapOid.allocateCString(); |
{ |
OID *sendtrapOid = MakeOIDFromDot(_trapOid); |
throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, MessageLoaderParms( |
|
_MSG_INVALID_KEY, |
|
_MSG_INVALID_TRAPOID)); |
|
} |
|
|
|
// Destination : convert targetHost into Transport |
|
|
|
CString trap_dest = targetHost.getCString(); |
| |
// Destination : converting destination into Transport |
|
char* trap_dest = destination.allocateCString(); |
|
TransportInfo global_ti; | TransportInfo global_ti; |
global_ti.type = SR_IP_TRANSPORT; | global_ti.type = SR_IP_TRANSPORT; |
|
|
|
switch (targetHostFormat) |
|
{ |
|
case _HOST_NAME: |
|
{ |
|
char* ipAddr = _getIPAddress(trap_dest); |
|
|
|
if (ipAddr == NULL) |
|
{ |
|
throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, |
|
MessageLoaderParms( |
|
_MSG_DESTINATION_NOT_FOUND_KEY, |
|
_MSG_DESTINATION_NOT_FOUND)); |
|
|
|
} |
|
global_ti.t_ipAddr = inet_addr(trap_dest); |
|
break; |
|
} |
|
case _IPV4_ADDRESS: |
|
{ |
global_ti.t_ipAddr = inet_addr(trap_dest); | global_ti.t_ipAddr = inet_addr(trap_dest); |
global_ti.t_ipPort = htons((unsigned short)GetSNMPTrapPort()); |
break; |
delete [] trap_dest; |
} |
|
default: |
|
{ |
|
throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_NOT_SUPPORTED, |
|
MessageLoaderParms( |
|
_MSG_TARGETHOSTFORMAT_NOT_SUPPORTED_KEY, |
|
_MSG_TARGETHOSTFORMAT_NOT_SUPPORTED)); |
|
break; |
|
} |
|
} |
|
|
|
global_ti.t_ipPort = htons((unsigned short)portNumber); |
|
|
|
// Community Name, default is public |
|
CString _community; |
|
if (securityName.size() == 0) |
|
{ |
|
String community; |
|
community.assign("public"); |
|
_community = community.getCString(); |
|
} |
|
else |
|
{ |
|
_community = securityName.getCString(); |
|
} |
| |
// Community Name |
|
char* _community = community.allocateCString(); |
|
OctetString* community_name = MakeOctetStringFromText(_community); | OctetString* community_name = MakeOctetStringFromText(_community); |
delete [] _community; |
|
|
if (community_name == NULL) |
|
{ |
|
throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, MessageLoaderParms( |
|
_MSG_INVALID_SECURITY_NAME_KEY, |
|
_MSG_INVALID_SECURITY_NAME)); |
|
} |
| |
// getting IP address of the host | // getting IP address of the host |
char* hostname = System::getHostName().allocateCString(); |
|
char **p; |
CString hostname = System::getHostName().getCString(); |
struct hostent *hp; |
char* IP_string = _getIPAddress(hostname); |
struct in_addr in; |
|
hp=gethostbyname(hostname); |
|
p = hp->h_addr_list; |
|
(void)memcpy(&in.s_addr, *p, sizeof(in.s_addr)); |
|
char* IP_string = inet_ntoa(in); |
|
delete [] hostname; |
|
| |
// formatting agent(host) address into OctetString format | // formatting agent(host) address into OctetString format |
|
|
OctetString* agent_addr; | OctetString* agent_addr; |
| |
SR_INT32 s1, s2, s3, s4; | SR_INT32 s1, s2, s3, s4; |
SR_UINT32 ipaddr; | SR_UINT32 ipaddr; |
| |
// pull out each of the 4 octet values from IP address | // pull out each of the 4 octet values from IP address |
|
|
sscanf(IP_string,"%d.%d.%d.%d", &s1, &s2, &s3, &s4); | sscanf(IP_string,"%d.%d.%d.%d", &s1, &s2, &s3, &s4); |
| |
// Probably should perform some checks on values for |
// validate the values for s1, s2, s3, and s4 to make sure values are |
// s1, s2, s3, and s4 here to make sure values are |
|
// between 0 and 255 | // between 0 and 255 |
|
if (!_isValidOctet(s1) || !_isValidOctet(s2) || |
|
!_isValidOctet(s3) || !_isValidOctet(s4)) |
|
{ |
|
throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, MessageLoaderParms( |
|
_MSG_INVALID_OCTET_VALUE_KEY, |
|
_MSG_INVALID_OCTET_VALUE)); |
|
} |
| |
// create an empty 4 length OctetString | // create an empty 4 length OctetString |
|
|
agent_addr = MakeOctetString(NULL,4); | agent_addr = MakeOctetString(NULL,4); |
| |
|
if (agent_addr == NULL) |
|
{ |
|
throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, MessageLoaderParms( |
|
_MSG_CREATE_OCTET_FAILED_KEY, |
|
_MSG_CREATE_OCTET_FAILED)); |
|
} |
|
|
// fill in values for OctetString | // fill in values for OctetString |
|
|
agent_addr->octet_ptr[0] = (unsigned char)s1; | agent_addr->octet_ptr[0] = (unsigned char)s1; |
agent_addr->octet_ptr[1] = (unsigned char)s2; | agent_addr->octet_ptr[1] = (unsigned char)s2; |
agent_addr->octet_ptr[2] = (unsigned char)s3; | agent_addr->octet_ptr[2] = (unsigned char)s3; |
agent_addr->octet_ptr[3] = (unsigned char)s4; | agent_addr->octet_ptr[3] = (unsigned char)s4; |
| |
// ATTN-NU-20020312 : Write code to get enterprise, genTrap and |
|
// specTrap from trapOid. | // specTrap from trapOid. |
| |
//NU_SNMP |
|
|
|
SR_INT32 genTrap = 0; | SR_INT32 genTrap = 0; |
SR_INT32 specTrap = 0; | SR_INT32 specTrap = 0; |
| |
|
|
oids.append(tmpoid.subString(0, tmpoid.find("."))); | oids.append(tmpoid.subString(0, tmpoid.find("."))); |
tmpoid = tmpoid.subString(tmpoid.find(".") + 1); | tmpoid = tmpoid.subString(tmpoid.find(".") + 1); |
} | } |
|
|
oids.append(tmpoid); | oids.append(tmpoid); |
| |
String ent; | String ent; |
if (oids[oids.size()-2] == "0") |
|
{ |
|
ent = oids[0]; |
|
for (Uint8 i = 1; i < oids.size()-2; i++) |
|
ent = ent + "." + oids[i]; |
|
} |
|
|
|
if (Contains(standard_traps, trapOid)) | if (Contains(standard_traps, trapOid)) |
{ | { |
ent = oids[0]; |
// |
for (Uint8 i = 1; i < oids.size()-1; i++) |
// if the trapOid is one of the standard traps, |
ent = ent + "." + oids[i]; |
// then the SNMPV1 enterprise parameter must be set |
|
// to the value of the trapOid, the generic-trap |
|
// parameter must be set to one of (0 - 5), and the |
|
// specific-trap parameter must be set to 0 |
|
// |
| |
char* gtrap = ent.allocateCString(); |
|
genTrap = atoi(gtrap) - 1; |
|
enterpriseOid = sendtrapOid; | enterpriseOid = sendtrapOid; |
delete [] gtrap; |
|
|
// the generic trap is last sub-identifier of the |
|
// trapOid minus 1 |
|
genTrap = atoi(oids[oids.size() - 1].getCString()) - 1; |
|
specTrap = 0; |
} | } |
else | else |
{ | { |
|
// |
|
// if the trapOid is not one of the standard traps: |
|
// then 1) the generic-trap parameter must be set to 6, |
|
// 2) if the next-to-last sub-identifier of the |
|
// trapOid is zero, then the SNMPV1 enterprise |
|
// parameter is the trapOid with the last 2 |
|
// sub-identifiers removed, otherwise, the |
|
// SNMPV1 enterprise parameter is the trapOid |
|
// with the last sub-identifier removed; |
|
// 3) the SNMPv1 specific-trap parameter is the last |
|
// sub-identifier of the trapOid; |
|
// |
|
|
genTrap = 6; | genTrap = 6; |
| |
ent = oids[0]; |
specTrap = atoi(oids[oids.size()-1].getCString()); |
for (Uint8 i = 1; i < oids.size()-1; i++) |
|
ent = ent + "." + oids[i]; |
|
char* strap = oids[oids.size()-1].allocateCString(); |
|
specTrap = atoi(strap); |
|
delete [] strap; |
|
| |
if (oids[oids.size()-2] == "0") |
|
{ |
|
ent = oids[0]; | ent = oids[0]; |
for (Uint8 i = 1; i < oids.size()-2; i++) | for (Uint8 i = 1; i < oids.size()-2; i++) |
|
{ |
ent = ent + "." + oids[i]; | ent = ent + "." + oids[i]; |
|
|
char* _ent = ent.allocateCString(); |
|
enterpriseOid = MakeOIDFromDot(_ent); |
|
delete [] _ent; |
|
} | } |
else |
|
|
if (oids[oids.size()-2] != "0") |
{ | { |
ent = oids[0]; |
ent = ent + "." + oids[oids.size()-2]; |
for (Uint8 i = 1; i < oids.size()-1; i++) |
} |
ent = ent + "." + oids[i]; |
|
| |
char* _ent = ent.allocateCString(); |
enterpriseOid = MakeOIDFromDot(ent.getCString()); |
enterpriseOid = MakeOIDFromDot(_ent); |
|
delete [] _ent; |
if (enterpriseOid == NULL) |
|
{ |
|
throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, MessageLoaderParms( |
|
_MSG_INVALID_ENTERPRISEOID_KEY, |
|
_MSG_INVALID_ENTERPRISEOID)); |
} | } |
} | } |
| |
char* _vbOid; |
// creates VarBind |
char* _vbType; |
|
char* _vbValue; |
|
|
|
for(Uint32 i = 0; i < vbOids.size(); i++) | for(Uint32 i = 0; i < vbOids.size(); i++) |
{ | { |
_vbOid = vbOids[i].allocateCString(); |
CString _vbOid = vbOids[i].getCString(); |
_vbType = vbTypes[i].allocateCString(); |
CString _vbValue = vbValues[i].getCString(); |
_vbValue = vbValues[i].allocateCString(); |
|
| |
if ((object = MakeOIDFromDot(_vbOid)) == NULL) | if ((object = MakeOIDFromDot(_vbOid)) == NULL) |
{ | { |
cout << "Invalid OID received: " << vbOids[i] << endl; |
throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, MessageLoaderParms( |
return; |
_MSG_INVALID_PROPERTYOID_KEY, |
|
_MSG_INVALID_PROPERTYOID)); |
} | } |
| |
if (strcmp(_vbType,"OctetString") == 0) |
if (String::equalNoCase(vbTypes[i], "OctetString")) |
{ | { |
newValue = CloneOctetString(MakeOctetStringFromText(_vbValue)); |
OctetString* value; |
if (newValue == NULL) |
|
|
value = CloneOctetString(MakeOctetStringFromText(_vbValue)); |
|
if (value == NULL) |
{ | { |
cout << "Invalid Value provided : " << vbValues[i] << endl; |
throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, |
return; |
MessageLoaderParms( |
|
_MSG_INVALID_PROPERTYVALUE_KEY, |
|
_MSG_INVALID_PROPERTYVALUE)); |
} | } |
if ((vb2 = MakeVarBindWithValue(object, |
|
|
if ((vb = MakeVarBindWithValue( |
|
object, |
(OID *) NULL, | (OID *) NULL, |
OCTET_PRIM_TYPE, | OCTET_PRIM_TYPE, |
newValue)) == NULL) |
value)) == NULL) |
|
{ |
|
throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, |
|
MessageLoaderParms( |
|
_MSG_MAKE_VARBIND_FAILED_FOR_OCTET_PRIM_TYPE_KEY, |
|
_MSG_MAKE_VARBIND_FAILED_FOR_OCTET_PRIM_TYPE)); |
|
} |
|
} |
|
else if (String::equalNoCase(vbTypes[i], "OID")) |
{ | { |
cout << "Invalid OctetString value: " << vbValues[i] << endl; |
void* value = MakeOIDFromDot(_vbValue); |
return; |
if (value == NULL) |
|
{ |
|
throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, |
|
MessageLoaderParms( |
|
_MSG_INVALID_PROPERTYVALUE_KEY, |
|
_MSG_INVALID_PROPERTYVALUE)); |
|
} |
|
|
|
if ((vb = MakeVarBindWithValue( |
|
object, |
|
(OID*) NULL, |
|
OBJECT_ID_TYPE, |
|
value)) == NULL) |
|
{ |
|
throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, |
|
MessageLoaderParms( |
|
_MSG_MAKE_VARBIND_FAILED_FOR_OBJECT_ID_TYPE_KEY, |
|
_MSG_MAKE_VARBIND_FAILED_FOR_OBJECT_ID_TYPE)); |
} | } |
} | } |
else | else |
{ | { |
newValue = CloneOctetString(MakeOctetString( |
int vbvalue = atoi(_vbValue); |
(unsigned char *) _vbValue, strlen(_vbValue))); |
void* value = &vbvalue; |
| |
if (newValue == NULL) |
if (value == NULL) |
{ | { |
cout << "Invalid Value provided : " << vbValues[i] << endl; |
throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, |
return; |
MessageLoaderParms( |
|
_MSG_INVALID_PROPERTYVALUE_KEY, |
|
_MSG_INVALID_PROPERTYVALUE)); |
} | } |
if ((vb2 = MakeVarBindWithValue(object, |
|
|
if ((vb = MakeVarBindWithValue( |
|
object, |
(OID *) NULL, | (OID *) NULL, |
INTEGER_TYPE, | INTEGER_TYPE, |
newValue)) == NULL) |
value)) == NULL) |
{ | { |
cout << "Invalid Integer Value: " << vbValues[i] << endl; |
throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, |
return; |
MessageLoaderParms( |
|
_MSG_MAKE_VARBIND_FAILED_FOR_INTEGER_TYPE_KEY, |
|
_MSG_MAKE_VARBIND_FAILED_FOR_INTEGER_TYPE)); |
} | } |
} | } |
|
|
if (i == 0) | if (i == 0) |
{ | { |
vb = vb2; |
vbhead = vb; |
vb3 = vb2; |
vblast = vb; |
} | } |
else | else |
{ | { |
vb3->next_var = vb2; |
vblast->next_var = vb; |
vb3 = vb3->next_var; |
vblast = vblast->next_var; |
} | } |
| |
FreeOID(object); |
|
} | } |
| |
delete [] _vbType; |
vblast->next_var = NULL; |
delete [] _vbValue; |
|
delete [] _vbOid; |
|
|
|
vb3->next_var = NULL; |
|
|
|
// Now sending the trap |
|
if (trapType == String("SNMPGeneric")) |
|
{ |
|
cout << genTrap << endl; |
|
cout << specTrap << endl; |
|
PrintVarBindList(vb); |
|
//PrintOID(enterpriseOid); |
|
cout << _trapOid << endl; |
|
cout << "Sending SNMP generic trap : " << trapOid << endl; |
|
|
|
do_trap(genTrap, specTrap, vb, enterpriseOid, _trapOid); |
|
| |
FreeVarBindList(vb); |
// Now send the trap |
FreeVarBindList(vb2); |
switch (snmpVersion) |
} |
{ |
else if (trapType == String("SNMPv1")) |
case _SNMPv1_TRAP: |
{ | { |
cout << "Sending SNMPv1 Trap : " << trapOid << endl; |
|
SendNotificationToDestSMIv1Params( | SendNotificationToDestSMIv1Params( |
1, // notifyType - TRAP | 1, // notifyType - TRAP |
genTrap, // genTrap | genTrap, // genTrap |
specTrap, // specTrap | specTrap, // specTrap |
enterpriseOid, // enterprise | enterpriseOid, // enterprise |
agent_addr, // agent_addr | agent_addr, // agent_addr |
vb, // vb |
vbhead, // vb |
NULL, // contextName | NULL, // contextName |
1, // retryCount | 1, // retryCount |
1, // timeout | 1, // timeout |
|
|
SR_SECURITY_MODEL_V1, // securityModel | SR_SECURITY_MODEL_V1, // securityModel |
&global_ti, // Transport Info | &global_ti, // Transport Info |
0); // cfg_chk | 0); // cfg_chk |
|
break; |
FreeVarBindList(vb); |
|
FreeVarBindList(vb2); |
|
} | } |
else if (trapType == String("SNMPv2")) |
case _SNMPv2C_TRAP: |
{ | { |
cout << "Sending SNMPv2 Trap : " << trapOid << endl; |
|
SendNotificationToDestSMIv2Params( | SendNotificationToDestSMIv2Params( |
2, // notifyType - NOTIFICATION |
(SR_INT32)SNMPv2_TRAP_TYPE, // notifyType - NOTIFICATION |
sendtrapOid, // snmpTrapOID | sendtrapOid, // snmpTrapOID |
agent_addr, // agent_addr | agent_addr, // agent_addr |
vb, // vb |
vbhead, // vb |
NULL, // contextName | NULL, // contextName |
1, // retryCount | 1, // retryCount |
100, // timeout | 100, // timeout |
community_name, // securityName or community | community_name, // securityName or community |
SR_SECURITY_LEVEL_NOAUTH, // securityLevel | SR_SECURITY_LEVEL_NOAUTH, // securityLevel |
SR_SECURITY_MODEL_V1, // securityModel |
SR_SECURITY_MODEL_V2C, // securityModel |
&global_ti, // TransportInfo | &global_ti, // TransportInfo |
0); // cfg_chk | 0); // cfg_chk |
|
break; |
|
} |
|
default: |
|
{ |
|
throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_NOT_SUPPORTED, |
|
MessageLoaderParms( |
|
_MSG_VERSION_NOT_SUPPORTED_KEY, |
|
_MSG_VERSION_NOT_SUPPORTED)); |
|
break; |
|
} |
|
} |
|
|
|
// Free OID built by calls MakeOIDFromDot() |
|
FreeOID(sendtrapOid); |
|
FreeOID(enterpriseOid); |
|
FreeOID(object); |
|
|
|
// Free the data structures allocated and built by calls |
|
// MakeOctetString() and MakeOctetStringFrom Text() |
|
FreeOctetString(community_name); |
|
FreeOctetString(agent_addr); |
|
|
|
// Free the VarBind data structures allocated and built |
|
// by calls MakeVarBindWithValue() |
|
FreeVarBindList(vbhead); |
FreeVarBindList(vb); | FreeVarBindList(vb); |
FreeVarBindList(vb2); |
FreeVarBindList(vblast); |
} | } |
else |
|
|
// get the IP address of a host |
|
char* snmpDeliverTrap_emanate::_getIPAddress(const CString& hostName) |
|
{ |
|
struct hostent* targetHostInfo; |
|
struct in_addr in; |
|
|
|
char hostEntryBuffer[8192]; |
|
struct hostent hostEntryStruct; |
|
targetHostInfo = System::getHostByName(hostName, |
|
&hostEntryStruct, hostEntryBuffer, sizeof (hostEntryBuffer)); |
|
|
|
if (targetHostInfo == NULL) |
{ | { |
cout << "Trap type not supported : " << trapType << endl; |
return NULL; |
delete [] _trapOid; |
} |
exit(2); |
|
|
char** networkAddr; |
|
networkAddr = targetHostInfo->h_addr_list; |
|
(void)memcpy(&in.s_addr, *networkAddr, sizeof(in.s_addr)); |
|
char* ipAddr = inet_ntoa(in); |
|
return(ipAddr); |
} | } |
| |
delete [] _trapOid; |
// check the value of each part of an IP address which should be |
|
// between 0 and 255 |
|
Boolean snmpDeliverTrap_emanate::_isValidOctet(const Uint32& octetValue) |
|
{ |
|
if (octetValue > 0 && octetValue < 255) |
|
{ |
|
return true; |
|
} |
|
else |
|
{ |
|
return false; |
|
} |
} | } |
| |
PEGASUS_NAMESPACE_END | PEGASUS_NAMESPACE_END |