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

  1 karl  1.3 //%2006////////////////////////////////////////////////////////////////////////
  2 yi.zhou 1.1 //
  3             // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
  4             // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
  5             // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
  6             // IBM Corp.; EMC Corporation, The Open Group.
  7             // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
  8             // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
  9             // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 10             // EMC Corporation; VERITAS Software Corporation; The Open Group.
 11 karl    1.3 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 12             // EMC Corporation; Symantec Corporation; The Open Group.
 13 yi.zhou 1.1 //
 14             // Permission is hereby granted, free of charge, to any person obtaining a copy
 15             // of this software and associated documentation files (the "Software"), to
 16             // deal in the Software without restriction, including without limitation the
 17             // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 18             // sell copies of the Software, and to permit persons to whom the Software is
 19             // furnished to do so, subject to the following conditions:
 20             // 
 21             // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 22             // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 23             // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 24             // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 25             // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 26             // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 27             // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 28             // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 29             //
 30             //==============================================================================
 31             //
 32             //%/////////////////////////////////////////////////////////////////////////////
 33             
 34 yi.zhou 1.1 #include <Pegasus/Common/Packer.h>
 35             #include <Pegasus/Common/Tracer.h>
 36             #include "snmpDeliverTrap_netsnmp.h"
 37             
 38             PEGASUS_NAMESPACE_BEGIN
 39             
 40 yi.zhou 1.4 void snmpDeliverTrap_netsnmp::initialize()
 41             {
 42             
 43                 PEG_METHOD_ENTER (TRC_IND_HANDLER, 
 44                     "snmpDeliverTrap_netsnmp::initialize"); 
 45             
 46                 // Defined default MIB modules (in net-snmp-config.h) do not need to be 
 47                 // loaded and loading them can cause some stderr;
 48                 // use environment variable MIBS to override the default MIB modules.
 49                 // If there is no MIBS environment variable, add it in. 
 50                 char *envVar;
 51                 envVar = getenv("MIBS");
 52             
 53                 if (envVar == NULL)
 54                 {
 55                     putenv("MIBS=");
 56                 }
 57             
 58                 // Initialize the mib reader
 59                 netsnmp_set_mib_directory("");
 60                 init_mib();
 61 yi.zhou 1.4     
 62                 // Initializes the SNMP library
 63                 init_snmp("snmpIndicationHandler");
 64             
 65                 // windows32 specific initialization (is a NOOP on unix)
 66                 SOCK_STARTUP;
 67             
 68                 PEG_METHOD_EXIT ();
 69                 
 70             }
 71             
 72             void snmpDeliverTrap_netsnmp::terminate()
 73             {
 74             
 75                 PEG_METHOD_ENTER (TRC_IND_HANDLER, 
 76                     "snmpDeliverTrap_netsnmp::terminate"); 
 77             
 78                 SOCK_CLEANUP;
 79             
 80                 PEG_METHOD_EXIT ();
 81             }
 82 yi.zhou 1.4 
 83 yi.zhou 1.1 void snmpDeliverTrap_netsnmp::deliverTrap(
 84                     const String& trapOid,
 85                     const String& securityName, 
 86                     const String& targetHost, 
 87                     const Uint16& targetHostFormat, 
 88                     const String& otherTargetHostFormat, 
 89                     const Uint32& portNumber,
 90                     const Uint16& snmpVersion, 
 91                     const String& engineID,
 92                     const Array<String>& vbOids,
 93                     const Array<String>& vbTypes,
 94                     const Array<String>& vbValues)
 95             {
 96             
 97                 PEG_METHOD_ENTER (TRC_IND_HANDLER, 
 98                     "snmpDeliverTrap_netsnmp::deliverTrap"); 
 99             
100                 void *sessionHandle;
101 yi.zhou 1.4     struct snmp_session *sessionPtr;
102 yi.zhou 1.1 
103                 struct snmp_pdu *snmpPdu;
104             
105                 // Creates a SNMP session
106 yi.zhou 1.4     _createSession(targetHost, portNumber, securityName,
107 yi.zhou 1.1                    sessionHandle, sessionPtr);
108             
109                 try
110                 {
111                     _createPdu(snmpVersion, trapOid, sessionPtr, snmpPdu);
112                 }
113                 catch (...)
114                 {
115                     _destroySession(sessionHandle);
116             
117                     PEG_METHOD_EXIT ();
118             
119                     throw;
120                 }
121             
122                 // Pack OIDs into the PDU
123                 try
124                 {
125                     _packOidsIntoPdu(vbOids, vbTypes, vbValues, snmpPdu);
126                 }
127                 catch (Exception& e)
128 yi.zhou 1.1     {
129                     PEG_TRACE_STRING (TRC_DISCARDED_DATA, Tracer::LEVEL2, 
130                                       e.getMessage ());
131                                 
132                     Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
133                                   Logger::WARNING,
134                                   _MSG_PACK_CIM_PROPERTY_TO_PDU_FAILED_KEY,
135                                   _MSG_PACK_CIM_PROPERTY_TO_PDU_FAILED, 
136                                   e.getMessage()); 
137                 }
138                 catch (...)
139                 {
140                     PEG_TRACE_STRING (TRC_DISCARDED_DATA, Tracer::LEVEL2, 
141                                       "Snmp Indication Handler failed to pack a CIM "
142                                       "Property into the SNMP PDU: Unknown exception.");
143                 }
144             
145                 // Send the trap to the destination
146                 if (snmp_sess_send(sessionHandle, snmpPdu) == 0)
147                 {
148                     Sint32 libErr, sysErr;
149 yi.zhou 1.1         char *errStr;
150             
151                     // snmp_sess_send failed
152                     // get library, system errno
153                     snmp_sess_error(sessionHandle, &libErr, &sysErr, &errStr);
154             
155                     String exceptionStr = _MSG_SESSION_SEND_FAILED;
156                     exceptionStr.append (errStr);
157             
158                     free(errStr);
159             
160                     _destroySession(sessionHandle);
161             
162                     PEG_METHOD_EXIT ();
163             
164                     throw PEGASUS_CIM_EXCEPTION_L (CIM_ERR_FAILED,
165                         MessageLoaderParms(_MSG_SESSION_SEND_FAILED_KEY,
166                                            exceptionStr));
167                 }
168             
169                 _destroySession(sessionHandle);
170 yi.zhou 1.1 
171                 PEG_METHOD_EXIT ();
172                 
173             }
174             
175             // Creates a SNMP session
176             void snmpDeliverTrap_netsnmp::_createSession(
177                 const String & targetHost,
178                 Uint32 portNumber,
179                 const String & securityName,
180                 void *&sessionHandle,
181                 snmp_session *&sessionPtr)
182             {
183                 PEG_METHOD_ENTER (TRC_IND_HANDLER,
184                     "snmpDeliverTrap_netsnmp::_createSession");
185             
186                 Sint32 libErr, sysErr;
187                 char *errStr;
188                 String exceptionStr;
189 yi.zhou 1.4     
190                 struct snmp_session snmpSession;
191 yi.zhou 1.1 
192 yi.zhou 1.2     {
193 yi.zhou 1.4     AutoMutex autoMut(_sessionInitMutex);
194 yi.zhou 1.1     snmp_sess_init(&snmpSession);
195             
196                 CString targetHostCStr = targetHost.getCString();
197             
198                 // peername has format: targetHost:portNumber
199                 snmpSession.peername = (char *)malloc((size_t)(strlen(targetHostCStr)+
200                                                       1+32));
201                 sprintf(snmpSession.peername, "%s:%u", (const char*)targetHostCStr, 
202                         portNumber);
203 yi.zhou 1.4 
204 yi.zhou 1.1     sessionHandle = snmp_sess_open(&snmpSession);
205 yi.zhou 1.4     }
206 yi.zhou 1.1 
207                 if (sessionHandle == NULL)
208                 {
209                     exceptionStr = _MSG_SESSION_OPEN_FAILED;
210             
211                     // Get library, system errno
212 yi.zhou 1.5         snmp_error(&snmpSession, &libErr, &sysErr, &errStr);
213 yi.zhou 1.1 
214                     exceptionStr.append(errStr);
215             
216                     free(errStr);
217             
218                     PEG_METHOD_EXIT ();
219                     
220                     throw PEGASUS_CIM_EXCEPTION_L (CIM_ERR_FAILED,
221                         MessageLoaderParms(_MSG_SESSION_OPEN_FAILED_KEY,
222                                            exceptionStr));
223             
224                 }
225             
226                 try
227                 {
228                     // get the snmp_session pointer
229                     sessionPtr = snmp_sess_session(sessionHandle);
230                     if (sessionPtr == NULL)
231                     {
232                         exceptionStr = _MSG_GET_SESSION_POINT_FAILED;
233             
234 yi.zhou 1.1             // Get library, system errno
235                         snmp_sess_error(&snmpSession, &libErr, &sysErr, &errStr);
236             
237                         exceptionStr.append(errStr);
238             
239                         free(errStr);
240             
241                         throw PEGASUS_CIM_EXCEPTION_L (CIM_ERR_FAILED,
242                             MessageLoaderParms(_MSG_GET_SESSION_POINTER_FAILED_KEY,
243                                                exceptionStr));
244                     }
245             
246                     // Community Name, default is public
247                     String communityName;
248                     if (securityName.size() == 0)
249                     {
250                         communityName.assign("public");
251                     }
252                     else
253                     {
254                         communityName = securityName;
255 yi.zhou 1.1         }
256             
257 yi.zhou 1.7         free(snmpSession.peername);
258 yi.zhou 1.1 
259 yi.zhou 1.7         free(sessionPtr->community);
260 yi.zhou 1.1 
261                     CString communityNameCStr = communityName.getCString();
262                     size_t communityNameLen = strlen(communityNameCStr);
263             
264                     sessionPtr->community = (u_char*)malloc(communityNameLen);
265             
266                     memcpy(sessionPtr->community, (const char *)communityNameCStr, 
267                            communityNameLen);
268                     sessionPtr->community_len = communityNameLen;
269                 }
270                 catch (...)
271                 {
272                     _destroySession(sessionHandle);
273             
274                     PEG_METHOD_EXIT ();
275                     throw;
276                 }
277             
278                 PEG_METHOD_EXIT ();
279             }
280             
281 yi.zhou 1.1 // Creates a SNMP session
282             void snmpDeliverTrap_netsnmp::_destroySession(
283                 void *sessionHandle)
284             {
285                 PEG_METHOD_ENTER (TRC_IND_HANDLER,
286                     "snmpDeliverTrap_netsnmp::_destroySession");
287             
288                 snmp_sess_close(sessionHandle);
289             
290                 PEG_METHOD_EXIT ();
291             }
292             
293             // Creates a SNMP TRAP PDU 
294             void snmpDeliverTrap_netsnmp::_createPdu(
295                 Uint16 snmpVersion,
296                 const String& trapOid,
297                 snmp_session *&sessionPtr,
298                 snmp_pdu *& snmpPdu)
299             {
300             
301                 PEG_METHOD_ENTER (TRC_IND_HANDLER,
302 yi.zhou 1.1         "snmpDeliverTrap_netsnmp::_createPdu");
303             
304                 oid _SYSTEM_UP_TIME_OID [] = {1,3,6,1,2,1,1,3,0};
305                 oid _SNMPTRAP_OID [] = {1,3,6,1,6,3,1,1,4,1,0};
306             
307                 in_addr_t *pduInAddr;
308             
309                 switch (snmpVersion)
310                 {
311                     case _SNMPv1_TRAP:
312                     {
313             
314                         sessionPtr->version = SNMP_VERSION_1;
315             
316                         // Create the PDU
317                         snmpPdu = snmp_pdu_create(SNMP_MSG_TRAP); 
318                 
319                         // Failed to create pdu
320                         if (!snmpPdu)
321                         {
322                             PEG_METHOD_EXIT ();
323 yi.zhou 1.1 
324                             throw PEGASUS_CIM_EXCEPTION_L (CIM_ERR_FAILED,
325                                 MessageLoaderParms(_MSG_PDU_CREATE_FAILED_KEY,
326                                                    _MSG_PDU_CREATE_FAILED));
327                         }
328             
329                         // Make sure that the v1 trap PDU includes the local IP address
330                         pduInAddr = (in_addr_t*) snmpPdu->agent_addr;
331                         *pduInAddr = get_myaddr();
332             
333                         // get system up time
334                         snmpPdu->time = get_uptime();
335             
336                         // Pack trap information into the PDU
337                         try
338                         {
339                             _packTrapInfoIntoPdu(trapOid, snmpPdu);
340                         }
341                         catch (CIMException& e)
342                         {
343                             PEG_TRACE_STRING (TRC_DISCARDED_DATA, Tracer::LEVEL2, 
344 yi.zhou 1.1                                   e.getMessage ());
345                             Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
346                                           Logger::WARNING,
347                                           _MSG_PACK_TRAP_INFO_INTO_PDU_FAILED_KEY,
348                                           _MSG_PACK_TRAP_INFO_INTO_PDU_FAILED,
349                                           e.getMessage()); 
350                         }
351             
352                         break;
353                     }
354                     case _SNMPv2C_TRAP:
355                     {
356                         sessionPtr->version = SNMP_VERSION_2c;
357             
358                         // Create the PDU
359                         snmpPdu = snmp_pdu_create(SNMP_MSG_TRAP2); 
360                 
361                         // Failed to create pdu
362                         if (!snmpPdu)
363                         {
364                             PEG_METHOD_EXIT ();
365 yi.zhou 1.1 
366                             throw PEGASUS_CIM_EXCEPTION_L (CIM_ERR_FAILED,
367                                 MessageLoaderParms(_MSG_PDU_CREATE_FAILED_KEY,
368                                                    _MSG_PDU_CREATE_FAILED));
369                         }
370             
371                         // Add sysUpTime to the PDU
372                         char sysUpTime[32];
373                         sprintf(sysUpTime, "%ld", get_uptime());
374                         
375                         Sint32 retCode;
376                         retCode = snmp_add_var(snmpPdu, _SYSTEM_UP_TIME_OID, 
377                                                OID_LENGTH(_SYSTEM_UP_TIME_OID), 't', 
378                                                sysUpTime); 
379             
380             
381                         // Failed to add sysUpTime to the pdu
382                         if (retCode != 0)
383                         {
384                             String errMsg = snmp_api_errstring(retCode);
385             
386 yi.zhou 1.1                 PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
387                                              "Failed to add sysUpTime to pdu: " + 
388                                              errMsg); 
389                             Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
390                                           Logger::WARNING,
391                                           _MSG_ADD_SYSUPTIME_TO_PDU_FAILED_KEY,
392                                           _MSG_ADD_SYSUPTIME_TO_PDU_FAILED,
393                                           errMsg); 
394                         }
395             
396                         // Add snmp trap to the PDU
397                         retCode = snmp_add_var(snmpPdu, _SNMPTRAP_OID, OID_LENGTH(
398                                                _SNMPTRAP_OID), 'o', trapOid.getCString());
399             
400                         // Failed to add snmp trap to the pdu
401                         if (retCode != 0)
402                         {
403                             String errMsg = snmp_api_errstring(retCode);
404             
405                             PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
406                                              "Failed to add snmp trap to pdu: " + 
407 yi.zhou 1.1                                  errMsg); 
408                             Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
409                                           Logger::WARNING,
410                                           _MSG_ADD_SNMP_TRAP_TO_PDU_FAILED_KEY,
411                                           _MSG_ADD_SNMP_TRAP_TO_PDU_FAILED,
412                                           errMsg); 
413                         }
414             
415                         break;
416                     }
417                     default:
418                     {
419                         PEG_METHOD_EXIT ();
420             
421                         throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_NOT_SUPPORTED,
422                             MessageLoaderParms(_MSG_VERSION_NOT_SUPPORTED_KEY,
423                                                _MSG_VERSION_NOT_SUPPORTED));
424                     }
425                 }
426             
427                 PEG_METHOD_EXIT ();
428 yi.zhou 1.1 }
429             
430             
431             // Pack trap information into the PDU
432             void snmpDeliverTrap_netsnmp::_packTrapInfoIntoPdu(
433                 const String & trapOid,
434                 snmp_pdu * snmpPdu)
435             {
436                 PEG_METHOD_ENTER (TRC_IND_HANDLER, 
437                     "snmpDeliverTrap_netsnmp::_packTrapInfoIntoPdu");
438             
439                 oid enterpriseOid[MAX_OID_LEN];
440                 size_t enterpriseOidLength; 
441             
442                 Array<String> standard_traps;
443             
444                 standard_traps.append(String("1.3.6.1.6.3.1.1.5.1"));
445                 standard_traps.append(String("1.3.6.1.6.3.1.1.5.2"));
446                 standard_traps.append(String("1.3.6.1.6.3.1.1.5.3"));
447                 standard_traps.append(String("1.3.6.1.6.3.1.1.5.4"));
448                 standard_traps.append(String("1.3.6.1.6.3.1.1.5.5"));
449 yi.zhou 1.1     standard_traps.append(String("1.3.6.1.6.3.1.1.5.6"));
450             
451                 Array<const char *> oidSubIdentifiers;
452             
453                 CString trapOidCStr = trapOid.getCString();
454             
455                 char * trapOidCopy = strdup(trapOidCStr);
456 yi.zhou 1.9     char * numericEntOid = (char *) malloc(strlen(trapOidCStr));
457             
458                 try
459                 {
460 yi.zhou 1.1 
461             #if !defined(PEGASUS_PLATFORM_WIN32_IX86_MSVC)
462 yi.zhou 1.9         char *last;
463                     for (const char* p = strtok_r(trapOidCopy, ".", &last); p; 
464                         p=strtok_r(NULL, ".", &last))
465 yi.zhou 1.1 #else
466 yi.zhou 1.9         for (const char* p = strtok(trapOidCopy, "."); p; p=strtok(NULL, "."))
467 yi.zhou 1.1 #endif
468 yi.zhou 1.9         {
469                         oidSubIdentifiers.append(p);
470                     }
471 yi.zhou 1.1 
472 yi.zhou 1.9         long genTrap = 0;
473                     long specTrap = 0;
474 yi.zhou 1.1 
475 yi.zhou 1.9         enterpriseOidLength = MAX_OID_LEN;
476 yi.zhou 1.1 
477 yi.zhou 1.9         if (Contains(standard_traps, trapOid))
478                     {
479                         //
480                         // if the trapOid is one of the standard traps,
481                         // then the SNMPV1 enterprise parameter must be set
482                         // to the value of the trapOid, the generic-trap
483                         // parameter must be set to one of (0 - 5), and the
484                         // specific-trap parameter must be set to 0
485                         //
486             
487                         // Convert trapOid from numeric form to a list of subidentifiers
488                         if (read_objid((const char*)trapOidCStr, enterpriseOid, 
489                             &enterpriseOidLength) == 0)
490                         {
491                             // Failed to parse trapOid 
492             
493                             PEG_METHOD_EXIT ();
494                             throw PEGASUS_CIM_EXCEPTION_L (CIM_ERR_FAILED,
495                                 MessageLoaderParms(_MSG_READ_OBJID_FAILED_KEY,
496                                                    _MSG_READ_OBJID_FAILED,
497                                                    trapOid));
498 yi.zhou 1.9             }
499             
500                         // the generic trap is last sub-identifier of the
501                         // trapOid minus 1
502                         snmpPdu->trap_type = 
503                             atoi(oidSubIdentifiers[oidSubIdentifiers.size() - 1]) - 1;
504                         snmpPdu->specific_type = 0;
505 yi.zhou 1.1         }
506 yi.zhou 1.9         else
507 yi.zhou 1.1         {
508 yi.zhou 1.9             //
509                         // if the trapOid is not one of the standard traps:
510                         // then 1) the generic-trap parameter must be set to 6,
511                         // 2) if the next-to-last sub-identifier of the
512                         // trapOid is zero, then the SNMPV1 enterprise
513                         // parameter is the trapOid with the last 2
514                         // sub-identifiers removed, otherwise, the
515                         // SNMPV1 enterprise parameter is the trapOid
516                         // with the last sub-identifier removed;
517                         // 3) the SNMPv1 specific-trap parameter is the last
518                         // sub-identifier of the trapOid;
519                         //
520             
521                         snmpPdu->trap_type = 6;
522             
523                         snmpPdu->specific_type = 
524                             atoi(oidSubIdentifiers[oidSubIdentifiers.size()-1]);
525             
526                         strcpy(numericEntOid, oidSubIdentifiers[0]);
527                         for (Uint32 i = 1; i < oidSubIdentifiers.size()-2; i++)
528                         {
529 yi.zhou 1.9                 strcat(numericEntOid, ".");
530                             strcat(numericEntOid, oidSubIdentifiers[i]);
531                         }
532             
533                         if (strcmp(oidSubIdentifiers[oidSubIdentifiers.size()-2], "0") != 0)
534                         {
535                             strcat(numericEntOid, ".");
536                             strcat(numericEntOid, 
537                                oidSubIdentifiers[oidSubIdentifiers.size()-2]);
538                         }
539 yi.zhou 1.1 
540 yi.zhou 1.9             // Convert ent from numeric form to a list of subidentifiers 
541                         if (read_objid(numericEntOid, enterpriseOid, 
542                             &enterpriseOidLength) == 0)
543                         {
544                             // Failed to parse numericEntOid
545 yi.zhou 1.1 
546 yi.zhou 1.9                 PEG_METHOD_EXIT ();
547 yi.zhou 1.1 
548 yi.zhou 1.9                 throw PEGASUS_CIM_EXCEPTION_L (CIM_ERR_FAILED,
549                                 MessageLoaderParms(_MSG_READ_ENTOID_FAILED_KEY,
550                                                    _MSG_READ_ENTOID_FAILED,
551                                                    String(numericEntOid)));
552                         }
553 yi.zhou 1.1 
554                     }
555             
556 yi.zhou 1.9         snmpPdu->enterprise = (oid*) malloc(enterpriseOidLength * sizeof(oid));
557                     memcpy(snmpPdu->enterprise, enterpriseOid, 
558                            enterpriseOidLength * sizeof(oid));
559             
560                     snmpPdu->enterprise_length = enterpriseOidLength;
561 yi.zhou 1.1     }
562 yi.zhou 1.9     catch (...)
563                 {
564                     free(trapOidCopy);
565                     free(numericEntOid);
566 yi.zhou 1.1 
567 yi.zhou 1.9         PEG_METHOD_EXIT();
568                     throw;
569                 }
570 yi.zhou 1.1 
571                 free(trapOidCopy);
572                 free(numericEntOid);
573             
574                 PEG_METHOD_EXIT ();
575             }
576             
577             // Pack oids into the PDU
578             void snmpDeliverTrap_netsnmp::_packOidsIntoPdu(
579                 const Array<String>& vbOids,
580                 const Array<String>& vbTypes,
581                 const Array<String>& vbValues,
582                 snmp_pdu * snmpPdu)
583             {
584             
585                 PEG_METHOD_ENTER (TRC_IND_HANDLER, 
586                     "snmpDeliverTrap_netsnmp::_packOidsIntoPdu");
587             
588                 char dataType;
589                 oid vbOid[MAX_OID_LEN];
590                 size_t vbOidLength = MAX_OID_LEN;
591 yi.zhou 1.1 
592                 for (Uint32 i=0; i < vbOids.size(); i++)
593                 {
594                     if (vbTypes[i] == "OctetString")
595                     {
596                         dataType = 's';
597                     }
598                     else if (vbTypes[i] == "Integer")
599                     {
600                         dataType = 'i';
601                     } 
602                     else if (vbTypes[i] == "OID")
603                     {
604                         dataType = 'o';
605                     }
606                     else
607                     {
608                         // Integer, OctetString, and OID are supported SNMP Data Types 
609                         // for the CIM Property
610             
611                         PEG_METHOD_EXIT ();
612 yi.zhou 1.1 
613                         throw PEGASUS_CIM_EXCEPTION_L (CIM_ERR_FAILED,
614                             MessageLoaderParms(_MSG_UNSUPPORTED_SNMP_DATA_TYPE_KEY,
615                                                _MSG_UNSUPPORTED_SNMP_DATA_TYPE,
616                                                vbTypes[i]));
617             
618                     }
619             
620                     // Convert oid of a CIM property from numeric form to a list of 
621                     // subidentifiers 
622                     if (read_objid((const char*)vbOids[i].getCString(), vbOid, 
623                         &vbOidLength) == 0)
624                     {
625                         // Failed to parse vbOids
626             
627                         PEG_METHOD_EXIT ();
628             
629                         throw PEGASUS_CIM_EXCEPTION_L (CIM_ERR_FAILED,
630                             MessageLoaderParms(_MSG_PARSE_CIM_PROPERTY_OID_FAILED_KEY,
631                                                _MSG_PARSE_CIM_PROPERTY_OID_FAILED,
632                                                vbOids[i]));
633 yi.zhou 1.1         }
634             
635                     Sint32 retCode;
636                     retCode = snmp_add_var(snmpPdu, vbOid, vbOidLength, dataType, 
637                                            vbValues[i].getCString());
638             
639                     // Failed to add vbOid to the pdu
640                     if (retCode != 0)
641                     {
642                         PEG_METHOD_EXIT ();
643             
644                         throw PEGASUS_CIM_EXCEPTION_L (CIM_ERR_FAILED,
645                             MessageLoaderParms(_MSG_ADD_VAR_TO_PDU_FAILED_KEY,
646                                                _MSG_ADD_VAR_TO_PDU_FAILED,
647                                                vbOids[i],
648                                                String(snmp_api_errstring(retCode)))); 
649             
650                     }
651                 }
652             
653                 PEG_METHOD_EXIT ();
654 yi.zhou 1.1 }
655             
656             PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2