⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snmpdelivertrap_netsnmp.cpp

📁 Pegasus is an open-source implementationof the DMTF CIM and WBEM standards. It is designed to be por
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                _packTrapInfoIntoPdu(trapOid, snmpPdu);            }            catch (CIMException& e)            {                PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,                    e.getMessage());                Logger::put_l(                    Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,                    _MSG_PACK_TRAP_INFO_INTO_PDU_FAILED_KEY,                    _MSG_PACK_TRAP_INFO_INTO_PDU_FAILED,                    e.getMessage());            }            break;        }        case _SNMPv2C_TRAP:        {            sessionPtr->version = SNMP_VERSION_2c;            // Create the PDU            snmpPdu = snmp_pdu_create(SNMP_MSG_TRAP2);            // Failed to create pdu            if (!snmpPdu)            {                PEG_METHOD_EXIT();                throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,                    MessageLoaderParms(                        _MSG_PDU_CREATE_FAILED_KEY,                        _MSG_PDU_CREATE_FAILED));            }            // Add sysUpTime to the PDU            char sysUpTime[32];            sprintf(sysUpTime, "%ld", get_uptime());            Sint32 retCode;            retCode = snmp_add_var(                snmpPdu,                _SYSTEM_UP_TIME_OID,                OID_LENGTH(_SYSTEM_UP_TIME_OID),                't',                sysUpTime);            // Failed to add sysUpTime to the pdu            if (retCode != 0)            {                String errMsg = snmp_api_errstring(retCode);                PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,                    "Failed to add sysUpTime to pdu: " + errMsg);                Logger::put_l(                    Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,                    _MSG_ADD_SYSUPTIME_TO_PDU_FAILED_KEY,                    _MSG_ADD_SYSUPTIME_TO_PDU_FAILED,                    errMsg);            }            // Add snmp trap to the PDU            retCode = snmp_add_var(                snmpPdu,                _SNMPTRAP_OID,                OID_LENGTH(_SNMPTRAP_OID),                'o',                trapOid.getCString());            // Failed to add snmp trap to the pdu            if (retCode != 0)            {                String errMsg = snmp_api_errstring(retCode);                PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,                    "Failed to add snmp trap to pdu: " + errMsg);                Logger::put_l(                    Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,                    _MSG_ADD_SNMP_TRAP_TO_PDU_FAILED_KEY,                    _MSG_ADD_SNMP_TRAP_TO_PDU_FAILED,                    errMsg);            }            break;        }        default:        {            PEG_METHOD_EXIT();            throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_NOT_SUPPORTED,                MessageLoaderParms(                    _MSG_VERSION_NOT_SUPPORTED_KEY,                    _MSG_VERSION_NOT_SUPPORTED));        }    }    PEG_METHOD_EXIT();}// Pack trap information into the PDUvoid snmpDeliverTrap_netsnmp::_packTrapInfoIntoPdu(    const String& trapOid,    snmp_pdu* snmpPdu){    PEG_METHOD_ENTER(TRC_IND_HANDLER,        "snmpDeliverTrap_netsnmp::_packTrapInfoIntoPdu");    oid enterpriseOid[MAX_OID_LEN];    size_t enterpriseOidLength;    Array<String> standard_traps;    standard_traps.append(String("1.3.6.1.6.3.1.1.5.1"));    standard_traps.append(String("1.3.6.1.6.3.1.1.5.2"));    standard_traps.append(String("1.3.6.1.6.3.1.1.5.3"));    standard_traps.append(String("1.3.6.1.6.3.1.1.5.4"));    standard_traps.append(String("1.3.6.1.6.3.1.1.5.5"));    standard_traps.append(String("1.3.6.1.6.3.1.1.5.6"));    Array<const char*> oidSubIdentifiers;    CString trapOidCStr = trapOid.getCString();    char* trapOidCopy = strdup(trapOidCStr);    char* numericEntOid = (char*) malloc(strlen(trapOidCStr));    try    {#if !defined(PEGASUS_PLATFORM_WIN32_IX86_MSVC) && !defined(PEGASUS_OS_ZOS)        char* last;        for (const char* p = strtok_r(trapOidCopy, ".", &last); p;            p=strtok_r(NULL, ".", &last))#else        for (const char* p = strtok(trapOidCopy, "."); p; p=strtok(NULL, "."))#endif        {            oidSubIdentifiers.append(p);        }        long genTrap = 0;        long specTrap = 0;        enterpriseOidLength = MAX_OID_LEN;        if (Contains(standard_traps, trapOid))        {            //            // if the trapOid is one of the standard traps,            // 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            //            // Convert trapOid from numeric form to a list of subidentifiers            if (read_objid((const char*)trapOidCStr, enterpriseOid,                &enterpriseOidLength) == 0)            {                // Failed to parse trapOid                PEG_METHOD_EXIT();                throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,                    MessageLoaderParms(_MSG_READ_OBJID_FAILED_KEY,                                       _MSG_READ_OBJID_FAILED,                                       trapOid));            }            // the generic trap is last sub-identifier of the            // trapOid minus 1            snmpPdu->trap_type =                atoi(oidSubIdentifiers[oidSubIdentifiers.size() - 1]) - 1;            snmpPdu->specific_type = 0;        }        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;            //            snmpPdu->trap_type = 6;            snmpPdu->specific_type =                atoi(oidSubIdentifiers[oidSubIdentifiers.size()-1]);            strcpy(numericEntOid, oidSubIdentifiers[0]);            for (Uint32 i = 1; i < oidSubIdentifiers.size()-2; i++)            {                strcat(numericEntOid, ".");                strcat(numericEntOid, oidSubIdentifiers[i]);            }            if (strcmp(oidSubIdentifiers[oidSubIdentifiers.size()-2], "0") != 0)            {                strcat(numericEntOid, ".");                strcat(numericEntOid,                   oidSubIdentifiers[oidSubIdentifiers.size()-2]);            }            // Convert ent from numeric form to a list of subidentifiers            if (read_objid(numericEntOid, enterpriseOid,                &enterpriseOidLength) == 0)            {                // Failed to parse numericEntOid                PEG_METHOD_EXIT();                throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,                    MessageLoaderParms(_MSG_READ_ENTOID_FAILED_KEY,                                       _MSG_READ_ENTOID_FAILED,                                       String(numericEntOid)));            }        }        snmpPdu->enterprise = (oid*) malloc(enterpriseOidLength * sizeof(oid));        memcpy(snmpPdu->enterprise, enterpriseOid,            enterpriseOidLength * sizeof(oid));        snmpPdu->enterprise_length = enterpriseOidLength;    }    catch (...)    {        free(trapOidCopy);        free(numericEntOid);        PEG_METHOD_EXIT();        throw;    }    free(trapOidCopy);    free(numericEntOid);    PEG_METHOD_EXIT();}// Pack oids into the PDUvoid snmpDeliverTrap_netsnmp::_packOidsIntoPdu(    const Array<String>& vbOids,    const Array<String>& vbTypes,    const Array<String>& vbValues,    snmp_pdu* snmpPdu){    PEG_METHOD_ENTER(TRC_IND_HANDLER,        "snmpDeliverTrap_netsnmp::_packOidsIntoPdu");    char dataType;    oid vbOid[MAX_OID_LEN];    size_t vbOidLength = MAX_OID_LEN;    for (Uint32 i=0; i < vbOids.size(); i++)    {        if (vbTypes[i] == "OctetString")        {            dataType = 's';        }        else if (vbTypes[i] == "Integer")        {            dataType = 'i';        }        else if (vbTypes[i] == "OID")        {            dataType = 'o';        }        else        {            // Integer, OctetString, and OID are supported SNMP Data Types            // for the CIM Property            PEG_METHOD_EXIT();            throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,                MessageLoaderParms(_MSG_UNSUPPORTED_SNMP_DATA_TYPE_KEY,                                   _MSG_UNSUPPORTED_SNMP_DATA_TYPE,                                   vbTypes[i]));        }        // Convert oid of a CIM property from numeric form to a list of        // subidentifiers        if (read_objid((const char*)vbOids[i].getCString(), vbOid,            &vbOidLength) == 0)        {            // Failed to parse vbOids            PEG_METHOD_EXIT();            throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,                MessageLoaderParms(_MSG_PARSE_CIM_PROPERTY_OID_FAILED_KEY,                                   _MSG_PARSE_CIM_PROPERTY_OID_FAILED,                                   vbOids[i]));        }        Sint32 retCode;        retCode = snmp_add_var(snmpPdu, vbOid, vbOidLength, dataType,                               vbValues[i].getCString());        // Failed to add vbOid to the pdu        if (retCode != 0)        {            PEG_METHOD_EXIT();            throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,                MessageLoaderParms(_MSG_ADD_VAR_TO_PDU_FAILED_KEY,                                   _MSG_ADD_VAR_TO_PDU_FAILED,                                   vbOids[i],                                   String(snmp_api_errstring(retCode))));        }    }    PEG_METHOD_EXIT();}PEGASUS_NAMESPACE_END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -