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