#include "monit.h" //#include "time.h" #define CincoMinutos (CLK_TCK * 60 * 5) //------------------------------------------------------------------------- extern HSNMP_SESSION snmpSession; //------------------------------------------------------------------------- cMonitorInterface::cMonitorInterface(const string &nome, const string &ip) { Arquivo.InformarInterface(ip); Ip.s_addr = inet_addr(ip.c_str()); NomeInterface = nome; UltConsulta = 0; QualVar = 0; UltIfInOctets = 0; UltIfOutOctets = 0; UltIfInErrors = 0; UltIfOutErrors = 0; Trafego = 0; Erros = 0; EsperarResposta= 0; } //------------------------------------------------------------------------- cMonitorInterface::~cMonitorInterface() { } //------------------------------------------------------------------------- string ValueToString(SMI_VALUE &value) { SMI_UINT32 offset; char strString[128]; strString[0]= 0; // Limpa a string caso alguém não o faça switch (value.type) { case SMI_TYPE_INT: wsprintf(strString, "%ld", (long)value.value.sNumber); break; case SMI_TYPE_UINT32: case SMI_TYPE_CNTR32: case SMI_TYPE_GAUGE32: case SMI_TYPE_TIMETICKS: wsprintf(strString, "%lu", (unsigned long)value.value.uNumber); break; case SMI_TYPE_CNTR64: wsprintf(strString, "0x%08lX%08lX", (unsigned long)value.value.hNumber.hipart, (unsigned long)value.value.hNumber.lopart); break; case SMI_TYPE_OCTETS: case SMI_TYPE_BITS: case SMI_TYPE_OPAQUE: { int binary; binary = FALSE; for (offset=0; offset 0 || // ou porque estamos no meio de um pedido (clock() - UltConsulta) >= CincoMinutos ) { // ou porque ja se passaram 5 minutos do // ultimo pedido EsperarResposta= 1; switch( QualVar ) { case 0 : UltConsulta= clock(); getdate(&DataAtual); gettime(&HoraAtual); Trafego= 0; Erros = 0; SendRequest("ifInOctets[0]"); break; case 1 : SendRequest("ifOutOctets[0]"); break; case 2 : SendRequest("ifInErrors[0]"); break; case 3 : SendRequest("ifOutErrors[0]"); break; } } } } //------------------------------------------------------------------------- HSNMP_VBL cMonitorInterface::CreateSingleVbl(const string &strMibVarname) { SMI_POID name; SMI_PVALUE value; HSNMP_VBL vbl; SNMPAPI_STATUS nStatus; /* TODO: this works for string only */ /* fill varbind */ name = SmiCreateOid(MAXOBJIDSIZE); value = SmiCreateNumberValue(SMI_TYPE_NULL, 0); /* convert strName to name OID struct */ if (isdigit(strMibVarname[0])) { nStatus = SnmpStrToOid((char *) strMibVarname.c_str(), name); if (nStatus==SNMPAPI_FAILURE) { SmiDestroyValue(value); SmiDestroyOid(name); return SNMPAPI_FAILURE; } name->len = nStatus; } else { nStatus = MibStrToOid(name, (char *) strMibVarname.c_str()); if (nStatus==MIB_FAILURE) { SmiDestroyValue(value); SmiDestroyOid(name); return SNMPAPI_FAILURE; } name->len = nStatus; SnmpOidToStr(name, 256, (char *) strMibVarname.c_str()); } /* create VBL with one varbind */ vbl = SnmpCreateVbl(snmpSession, name, value); nStatus = (SNMPAPI_STATUS)vbl; if (nStatus==SNMPAPI_FAILURE) { SmiDestroyValue(value); SmiDestroyOid(name); return SNMPAPI_FAILURE; } SmiDestroyValue(value); SmiDestroyOid(name); return vbl; } //------------------------------------------------------------------------- SNMPAPI_STATUS cMonitorInterface::SendRequest(const string &strMibVarname) { SNMPAPI_STATUS nStatus; HSNMP_VBL vbl; HSNMP_PDU pdu; SMI_INT pdu_type= SNMP_PDU_GET; dstEntity= SnmpStrToEntity(snmpSession,(char*) Arquivo.RetIp().c_str()); Status = (SNMPAPI_STATUS)dstEntity; if(Status==SNMPAPI_FAILURE) return SNMPAPI_FAILURE; context = SnmpStrToContext(snmpSession, dstEntity, "public"); Status = (SNMPAPI_STATUS) context; if(Status==SNMPAPI_FAILURE) { SnmpFreeEntity(dstEntity); return SNMPAPI_FAILURE; } vbl= CreateSingleVbl(strMibVarname); nStatus= (SNMPAPI_STATUS)vbl; if(nStatus==SNMPAPI_FAILURE) { SnmpFreeContext(context); SnmpFreeEntity(dstEntity); return SNMPAPI_FAILURE; } pdu = SnmpCreatePdu(snmpSession, pdu_type, // request type NULL, // request id (NULL=generate) SNMP_ERROR_NOERROR, // error status 0, // error_index vbl); // varbindlist nStatus = (SNMPAPI_STATUS)pdu; if (nStatus==SNMPAPI_FAILURE) { SnmpFreeVbl(vbl); SnmpFreeContext(context); SnmpFreeEntity(dstEntity); return SNMPAPI_FAILURE; } nStatus = SnmpSendMsg(snmpSession, NULL, // source (NULL in SNMPv1) dstEntity, // dest context, // community pdu); // pdu if (nStatus==SNMPAPI_FAILURE) { SnmpFreePdu(pdu); SnmpFreeVbl(vbl); SnmpFreeContext(context); SnmpFreeEntity(dstEntity); return SNMPAPI_FAILURE; } SnmpFreePdu(pdu); SnmpFreeVbl(vbl); SnmpFreeContext(context); SnmpFreeEntity(dstEntity); return SNMPAPI_SUCCESS; } //-------------------------------------------------------------------------