(file) Return to snmpDeliverTrap_emanate.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Handler / snmpIndicationHandler

  1 mike  1.2 //%/////////////////////////////////////////////////////////////////////////////
  2           //
  3 kumpf 1.10 // Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Company, IBM,
  4            // The Open Group, Tivoli Systems
  5 mike  1.2  //
  6            // Permission is hereby granted, free of charge, to any person obtaining a copy
  7 kumpf 1.10 // of this software and associated documentation files (the "Software"), to
  8            // deal in the Software without restriction, including without limitation the
  9            // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 10 mike  1.2  // sell copies of the Software, and to permit persons to whom the Software is
 11            // furnished to do so, subject to the following conditions:
 12            // 
 13 kumpf 1.10 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 14 mike  1.2  // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 15            // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 16 kumpf 1.10 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 17            // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 18            // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 19 mike  1.2  // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 20            // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 21            //
 22            //==============================================================================
 23            //
 24            // Author: Nitin Upasani, Hewlett-Packard Company (Nitin_Upasani@hp.com)
 25            //
 26 mday  1.11.12.1 // Modified By: Yi Zhou, Hewlett-Packard Company (yi_zhou@hp.com)
 27 mike  1.2       //
 28                 //%/////////////////////////////////////////////////////////////////////////////
 29                 
 30 kumpf 1.3       #include <Pegasus/Common/System.h>
 31 mday  1.11.12.1 #include <Pegasus/Common/ArrayInternal.h>
 32 kumpf 1.8       #include <Pegasus/Common/Destroyer.h>
 33 mday  1.11.12.1 #include <Pegasus/Common/InternalException.h>
 34 mike  1.2       #include "snmpDeliverTrap_emanate.h"
 35 mday  1.11.12.1 
 36                 // EMANATE specific declarations and entry points - MUST be in begining
 37                 // and outside NAMESPACE.
 38                 
 39                 // master agent needs these two declarations for communication with sub-agent.
 40                 // Following two declarations must be in the CODE. 
 41                 
 42                 #include <prnt_lib.h>  // MUST be at the end in include list.
 43 mike  1.2       
 44 kumpf 1.3       static char *sr_filename = __FILE__;
 45                 
 46                 IPCFunctionP IPCfp;  /* IPC functions pointer  */
 47                 
 48 mday  1.11.12.1 // This code would normally be generated by Emanate from defined MIB objects. 
 49                 // Since we do not have MIB objects defined, just defined here to load 
 50                 // subagent as library. OidList[] provides objects for entry point to master agent.
 51 kumpf 1.3       
 52                 // The objects internal to the agent 
 53                 ObjectInfo OidList[] = 
 54                 {
 55                 { { 0, NULL },
 56                 #ifndef LIGHT
 57                     NULL,
 58                 #endif /* LIGHT */
 59                     0, 0, 0, 0,
 60                     NULL, NULL }
 61                 };
 62                 
 63 mday  1.11.12.1 // This code would normally be generated by Emanate in k_* routine from defined MIB objects.
 64                 // Since we do not have MIB objects defined, just define here to pass compile and
 65                 // enable entry point for master agent to start communication with library.
 66 kumpf 1.3       
 67                 // Called by the master agent during initialization */
 68                 int k_initialize()
 69                 {
 70                    return 1;
 71                 }
 72 kumpf 1.9       
 73 mday  1.11.12.1 // END EMANATE specific declarations.
 74                 
 75 kumpf 1.9       PEGASUS_NAMESPACE_BEGIN
 76                 
 77                 PEGASUS_USING_STD;
 78 kumpf 1.3       
 79                 snmpDeliverTrap_emanate::snmpDeliverTrap_emanate()
 80                 {
 81                 
 82                 }
 83                 
 84                 snmpDeliverTrap_emanate::~snmpDeliverTrap_emanate()
 85                 {
 86                 
 87                 }
 88                 
 89 mday  1.11.12.1 
 90                 // initialize sub-agent
 91                 
 92                 // This also defines the communication protocol to be used between master
 93                 // and sub-agent.
 94                 
 95 kumpf 1.3       void snmpDeliverTrap_emanate::initialize()
 96                 {
 97                 #ifndef SR_UDS_IPC
 98                     InitIPCArrayTCP(&IPCfp);
 99                 #else /* SR_UDS_IPC */
100                     InitIPCArrayUDS(&IPCfp);
101                 #endif /* SR_UDS_IPC */
102                 
103                     if(InitSubagent() == -1) 
104                     {
105 mday  1.11.12.1 	throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
106                 	    _MSG_INITSUBAGENT_FAILED);
107 kumpf 1.3           }
108                 }
109                 
110                 void snmpDeliverTrap_emanate::deliverTrap(
111 mday  1.11.12.1         const String& trapOid,
112                         const String& securityName, 
113                         const String& targetHost, 
114                         const Uint16& targetHostFormat, 
115                         const String& otherTargetHostFormat, 
116                         const Uint32& portNumber,
117                         const Uint16& snmpVersion, 
118                         const String& engineID,
119                         Array<String>& vbOids,
120                         Array<String>& vbTypes,
121                         Array<String>& vbValues)
122 mike  1.2       {
123 mday  1.11.12.1     VarBind *vbhead = NULL;
124 kumpf 1.3           VarBind *vb = NULL;
125 mday  1.11.12.1     VarBind *vblast = NULL;
126 kumpf 1.3           
127                     OID	    *object = NULL;
128                 
129 mday  1.11.12.1     // Initialize with Master agent
130                 
131                     	initialize();
132                 
133                     // Translate a string into an OID
134                     OID *sendtrapOid = MakeOIDFromDot(trapOid.getCString());
135                 
136                     if (sendtrapOid == NULL)
137                     {
138                 	throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
139                 		_MSG_INVALID_TRAPOID);
140                     }
141                 
142                     // Destination : convert targetHost into Transport
143 kumpf 1.5       
144 mday  1.11.12.1     CString trap_dest = targetHost.getCString();
145 kumpf 1.5       
146                     TransportInfo   global_ti;
147                     global_ti.type = SR_IP_TRANSPORT;
148                 
149 mday  1.11.12.1     switch (targetHostFormat)
150                     {
151                 	case _HOST_NAME:
152                 	{
153                 	    char * ipAddr = _getIPAddress(trap_dest); 
154                 
155                 	    if (ipAddr == NULL)
156                 	    {
157                 		throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
158                 		    _MSG_DESTINATION_NOT_FOUND);
159                  	    }
160                     	    global_ti.t_ipAddr = inet_addr(trap_dest);
161                 	    break;	    
162                 	}
163                 	case _IPV4_ADDRESS:
164                 	{
165                     	    global_ti.t_ipAddr = inet_addr(trap_dest);
166                 	    break;	    
167                 	}
168                 	default:
169                 	{
170 mday  1.11.12.1 	    throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
171                 		_MSG_TARGETHOSTFORMAT_NOT_SUPPORTED);
172                 	    break;	    
173                 	}
174                     } 
175                 
176                     global_ti.t_ipPort = htons((unsigned short)portNumber);
177                 
178                     // Community Name, default is public
179                     CString _community;
180                     if (securityName.size() == 0)
181                     {
182                 	String community;
183                 	community.assign("public");
184                 	_community = community.getCString();
185                     }
186                     else
187                     {
188                 	_community = securityName.getCString();
189                     }
190                 
191 mday  1.11.12.1     OctetString* community_name = MakeOctetStringFromText(_community);
192                 
193                     if (community_name == NULL)
194                     {
195                        	throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
196                 	    _MSG_INVALID_SECURITY_NAME);
197                     }
198 kumpf 1.5       
199 kumpf 1.3           // getting IP address of the host
200 mday  1.11.12.1 
201                     CString hostname = System::getHostName().getCString();
202                     char* IP_string = _getIPAddress(hostname);
203                 
204 kumpf 1.3           // formatting agent(host) address into OctetString format
205 mday  1.11.12.1 
206 kumpf 1.3           OctetString* agent_addr;
207                 
208                     SR_INT32 s1, s2, s3, s4;
209                     SR_UINT32 ipaddr;
210                 
211                     // pull out each of the 4 octet values from IP address
212 mday  1.11.12.1 
213 kumpf 1.3           sscanf(IP_string,"%d.%d.%d.%d", &s1, &s2, &s3, &s4);
214                  
215 mday  1.11.12.1     // validate the values for s1, s2, s3, and s4 to make sure values are
216 kumpf 1.3           // between 0 and 255
217 mday  1.11.12.1     if (!_isValidOctet(s1) || !_isValidOctet(s2) ||
218                 	!_isValidOctet(s3) || !_isValidOctet(s4))
219                     {
220                        	throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
221                 	    _MSG_INVALID_OCTET_VALUE);
222                     }
223 kumpf 1.3        
224                     // create an empty 4 length OctetString
225 mday  1.11.12.1 
226 kumpf 1.3           agent_addr = MakeOctetString(NULL,4);
227 mday  1.11.12.1 
228                     if (agent_addr == NULL)
229                     {
230                        	throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
231                 	    _MSG_CREATE_OCTET_FAILED);
232                     }
233 kumpf 1.3        
234                     // fill in values for OctetString
235 mday  1.11.12.1 
236 kumpf 1.3           agent_addr->octet_ptr[0] = (unsigned char)s1;
237                     agent_addr->octet_ptr[1] = (unsigned char)s2;
238                     agent_addr->octet_ptr[2] = (unsigned char)s3;
239                     agent_addr->octet_ptr[3] = (unsigned char)s4;
240                 
241 kumpf 1.4           // specTrap from trapOid. 
242 mday  1.11.12.1 
243 kumpf 1.5           SR_INT32 genTrap = 0;
244                     SR_INT32 specTrap = 0;
245 kumpf 1.3           
246 kumpf 1.5           OID* enterpriseOid ;
247                 
248                     Array<String> standard_traps;
249                 
250                     standard_traps.append(String("1.3.6.1.6.3.1.1.5.1"));
251                     standard_traps.append(String("1.3.6.1.6.3.1.1.5.2"));
252                     standard_traps.append(String("1.3.6.1.6.3.1.1.5.3"));
253                     standard_traps.append(String("1.3.6.1.6.3.1.1.5.4"));
254                     standard_traps.append(String("1.3.6.1.6.3.1.1.5.5"));
255                     standard_traps.append(String("1.3.6.1.6.3.1.1.5.6"));
256                 
257                     Array<String> oids;
258                     String tmpoid = trapOid;
259                 
260                     while(tmpoid.find(".") != PEG_NOT_FOUND)
261                     {
262                         oids.append(tmpoid.subString(0, tmpoid.find(".")));
263                         tmpoid = tmpoid.subString(tmpoid.find(".") + 1);
264                     }
265 mday  1.11.12.1 
266 kumpf 1.5           oids.append(tmpoid);
267                 
268                     String ent;
269                     if (Contains(standard_traps, trapOid))
270                     {
271 mday  1.11.12.1     	//
272                     	// if the trapOid is one of the standard traps,
273                     	// then the SNMPV1 enterprise parameter must be set 
274                     	// to the value of the trapOid, the generic-trap
275                     	// parameter must be set to one of (0 - 5), and the 
276                     	// specific-trap parameter must be set to 0
277                     	//
278 kumpf 1.5       
279                         enterpriseOid = sendtrapOid;
280 mday  1.11.12.1 
281                 	// the generic trap is last sub-identifier of the 
282                 	// trapOid minus 1
283                 	genTrap = atoi(oids[oids.size() - 1].getCString()) - 1;
284                 	specTrap = 0;
285 kumpf 1.5           }
286                     else
287                     {
288 mday  1.11.12.1 	// 
289                 	// if the trapOid is not one of the standard traps:
290                 	// then 1) the generic-trap parameter must be set to 6, 
291                 	// 2) if the next-to-last sub-identifier of the 
292                 	// trapOid is zero, then the SNMPV1 enterprise 
293                  	// parameter is the trapOid with the last 2 
294                 	// sub-identifiers removed, otherwise, the 
295                 	// SNMPV1 enterprise parameter is the trapOid 
296                 	// with the last sub-identifier removed;
297                 	// 3) the SNMPv1 specific-trap parameter is the last
298                 	// sub-identifier of the trapOid;
299                 	//
300                 
301 kumpf 1.5       	genTrap = 6;
302 mike  1.2       
303 kumpf 1.11              specTrap = atoi(oids[oids.size()-1].getCString());
304 mike  1.2       
305 mday  1.11.12.1 	ent = oids[0];
306                 	for (Uint8 i = 1; i < oids.size()-2; i++)
307                 	{
308                 	    ent = ent + "." + oids[i];
309                 	}
310                 
311                 	if (oids[oids.size()-2] != "0")
312                 	{
313                 	    ent = ent + "." + oids[oids.size()-2];
314                    	}
315                 
316                 	enterpriseOid = MakeOIDFromDot(ent.getCString());
317                 	
318                 	if (enterpriseOid == NULL)
319                 	{
320                        	    throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
321                 	        _MSG_INVALID_ENTERPRISEOID);
322                 	}
323 kumpf 1.5           }
324                 
325 mday  1.11.12.1     // creates VarBind
326 kumpf 1.4           for(Uint32 i = 0; i < vbOids.size(); i++)
327 mike  1.2           {
328 mday  1.11.12.1 	CString _vbOid = vbOids[i].getCString();
329                 	CString _vbValue = vbValues[i].getCString();
330                 
331                 	if ((object = MakeOIDFromDot(_vbOid)) == NULL)
332 kumpf 1.3               {
333 mday  1.11.12.1        	    throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
334                 	        _MSG_INVALID_PROPERTYOID);
335 kumpf 1.3               } 
336                 
337 mday  1.11.12.1 	if (String::equalNoCase(vbTypes[i], "OctetString"))
338                 	{
339                     	     OctetString*    value;
340                 
341                              value = CloneOctetString(MakeOctetStringFromText(_vbValue));
342                              if (value == NULL)
343                              {
344                        	         throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
345                 	             _MSG_INVALID_PROPERTYVALUE);
346                              }
347                 
348                              if ((vb = MakeVarBindWithValue(object, 
349                 				  	(OID *) NULL, 
350                 					OCTET_PRIM_TYPE, 
351                 					value)) == NULL)
352 kumpf 1.4                   {
353 mday  1.11.12.1        	         throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
354                 	             _MSG_MAKE_VARBIND_FAILED_FOR_OCTET_PRIM_TYPE);
355 kumpf 1.4                   }
356 mday  1.11.12.1     	}
357                 	else if (String::equalNoCase(vbTypes[i], "OID"))
358                 	{
359                             void* value = MakeOIDFromDot(_vbValue);
360                             if (value == NULL)
361 kumpf 1.3                   {
362 mday  1.11.12.1        	         throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
363                 	             _MSG_INVALID_PROPERTYVALUE);
364 kumpf 1.3                   }
365 mday  1.11.12.1 
366                             if ((vb = MakeVarBindWithValue(object, 
367                 				  	(OID *) NULL, 
368                 					OBJECT_ID_TYPE, 
369                 					value)) == NULL)
370                             {
371                        	         throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
372                 	             _MSG_MAKE_VARBIND_FAILED_FOR_OBJECT_ID_TYPE);
373                             }
374                 	}
375                 	else
376                 	{
377                             int vbvalue = atoi(_vbValue);
378 kumpf 1.6                   void* value = &vbvalue;
379 kumpf 1.3       
380 mday  1.11.12.1             if (value == NULL)
381 kumpf 1.4                   {
382 mday  1.11.12.1        	         throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
383                 	             _MSG_INVALID_PROPERTYVALUE);
384 kumpf 1.4                   }
385 mday  1.11.12.1 
386                             if ((vb = MakeVarBindWithValue(object, 
387                 				  	(OID *) NULL, 
388                 					INTEGER_TYPE, 
389                 					value)) == NULL)
390 mike  1.2                   {
391 mday  1.11.12.1        	         throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
392                 	             _MSG_MAKE_VARBIND_FAILED_FOR_INTEGER_TYPE);
393 mike  1.2                   }
394 mday  1.11.12.1 	}
395                 
396 kumpf 1.4               if (i == 0)
397                         {
398 mday  1.11.12.1             vbhead = vb;
399                             vblast = vb;
400 kumpf 1.4               }
401                         else
402                         {
403 mday  1.11.12.1             vblast->next_var = vb;
404                             vblast = vblast->next_var;
405 kumpf 1.4               }
406                 
407 kumpf 1.3           }
408 kumpf 1.5       
409 mday  1.11.12.1     vblast->next_var = NULL;
410 kumpf 1.3       
411 mday  1.11.12.1     // Now send the trap
412                     switch (snmpVersion)
413 kumpf 1.3           {
414 mday  1.11.12.1 	case _SNMPv1_TRAP:
415                 	{
416                             SendNotificationToDestSMIv1Params(
417                 	    1,					// notifyType - TRAP
418 kumpf 1.5                   genTrap,				// genTrap
419                             specTrap,				// specTrap
420 kumpf 1.3                   enterpriseOid,			// enterprise
421                             agent_addr,				// agent_addr
422 mday  1.11.12.1             vbhead,				// vb
423 kumpf 1.3                   NULL,				// contextName
424                             1,					// retryCount
425                             1,					// timeout
426 kumpf 1.5                   community_name,			// securityName,
427 kumpf 1.3                   SR_SECURITY_LEVEL_NOAUTH,		// securityLevel
428                             SR_SECURITY_MODEL_V1,		// securityModel
429                             &global_ti,				// Transport Info
430 mday  1.11.12.1             0);          			// cfg_chk
431                 	    break;
432                 	}
433                 	case _SNMPv2C_TRAP:
434                 	{
435                             SendNotificationToDestSMIv2Params(
436                 	    (SR_INT32)SNMPv2_TRAP_TYPE,		// notifyType - NOTIFICATION
437 kumpf 1.3                   sendtrapOid,			// snmpTrapOID
438                             agent_addr,				// agent_addr
439 mday  1.11.12.1             vbhead,				// vb
440 kumpf 1.3                   NULL,				// contextName
441                             1,					// retryCount
442                             100,				// timeout
443 kumpf 1.5                   community_name,			// securityName or community
444 kumpf 1.3                   SR_SECURITY_LEVEL_NOAUTH,		// securityLevel
445 mday  1.11.12.1             SR_SECURITY_MODEL_V2C,		// securityModel
446 kumpf 1.3                   &global_ti,				// TransportInfo
447                             0);					// cfg_chk
448 mday  1.11.12.1 	    break;
449                 	}
450                 	default:
451                 	{
452                 	    throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
453                 		_MSG_VERSION_NOT_SUPPORTED);
454                 	    break;
455                 	}
456 kumpf 1.3           }
457 mday  1.11.12.1 
458                     // Free OID built by calls MakeOIDFromDot()
459                     FreeOID(sendtrapOid);
460                     FreeOID(enterpriseOid);
461                     FreeOID(object);
462                 
463                     // Free the data structures allocated and built by calls
464                     // MakeOctetString() and MakeOctetStringFrom Text()
465                     FreeOctetString(community_name);
466                     FreeOctetString(agent_addr);
467                 
468                     // Free the VarBind data structures allocated and built 
469                     // by calls MakeVarBindWithValue()
470                     FreeVarBindList(vbhead);
471                     FreeVarBindList(vb);
472                     FreeVarBindList(vblast);
473                 }
474                 
475                 // get the IP address of a host
476                 char * snmpDeliverTrap_emanate::_getIPAddress(const CString& hostName)
477                 {
478 mday  1.11.12.1     struct hostent *targetHostInfo;
479                     struct in_addr in;
480                 
481                     targetHostInfo = gethostbyname(hostName);
482                 
483                     if (targetHostInfo == NULL)
484 kumpf 1.3           {
485 mday  1.11.12.1 	return(NULL);
486 mike  1.2           }
487 mday  1.11.12.1 	    
488                     char ** networkAddr;
489                     networkAddr = targetHostInfo->h_addr_list;
490                     (void)memcpy(&in.s_addr, *networkAddr, sizeof(in.s_addr));
491                     char * ipAddr = inet_ntoa(in);
492                     return(ipAddr);
493                 }
494 kumpf 1.6       
495 mday  1.11.12.1 // check the value of each part of an IP address which should be 
496                 // between 0 and 255
497                 Boolean snmpDeliverTrap_emanate::_isValidOctet(const Uint32& octetValue)
498                 {
499                     if (octetValue > 0 && octetValue < 255)
500                     {
501                 	return true;
502                     }
503                     else
504                     {
505                 	return false;
506                     }
507 mike  1.2       }
508                 
509                 PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2