int CSVBaseSNMP::GetBulkRequest(MonitorResult &ResultList) { WriteLog("\n\n*****************************"); WriteLog("GetBulkRequest!"); static const int BULK_BUFF = 10; int nResult = 0; char chPrvOID[MAX_BUFF_LEN] = {0}; bool bEnd = false; Pdu pdu; // construct a Pdu object Vb vb; // construct a Vb object vb.set_oid( oid); // set the Oid portion of the Vb pdu += vb; // add the vb to the Pdu SnmpTarget *target; if(version ==version3) {//If SNMP Version Is 3 nResult = InitUTarget(); //Init UTarget pdu.set_security_level( m_lSecurityLevel); //Set the Security Level portion of Pdu pdu.set_context_name (m_szContextName); //Set the Context Name portion of Pdu pdu.set_context_engine_id(m_szContextEngineID); //Set the Context Engine ID portion of Pdu target = &m_Utarget; //Set SNMP Target } else { target = &m_Ctarget; //Set SNMP Target } try { if(m_pSnmp) { int nIndex = 0, i = 0; while (( nResult = m_pSnmp->get_bulk(pdu, *target, 0, BULK_BUFF)) == SNMP_CLASS_SUCCESS) { if(bEnd) break; for (i = 0; i < pdu.get_vb_count(); i ++) { pdu.get_vb( vb, i); if (pdu.get_type() == REPORT_MSG) { Oid tmp; vb.get_oid(tmp); return -5; } // look for var bind exception, applies to v2 only if ( vb.get_syntax() != sNMP_SYNTAX_ENDOFMIBVIEW) { string szOID = vb.get_printable_oid(); WriteLog(szOID.c_str()); int nPosition = static_cast<int>(szOID.find(m_szStartID)); if(nPosition < 0) { bEnd = true; break; } if(static_cast<int>(strlen(chPrvOID)) > 0) {//如果上次OID不为空 if(strcmp(vb.get_printable_oid(), chPrvOID) == 0) {//比较OID名称是否相同,相同则退出循环 bEnd = true; break; } } //结果赋值 if(static_cast<int>(strlen(vb.get_printable_oid())) < MAX_BUFF_LEN) strcpy(chPrvOID, vb.get_printable_oid()); SNMP_Monitor_Result result; result.m_szOID = vb.get_printable_oid(); if(strcmp(result.m_szOID.substr(0,19).c_str(),"1.3.6.1.2.1.2.2.1.2")==0) { char str[100]; vb.get_value(str); result.m_szValue=str; WriteLog(str); } else result.m_szValue = vb.get_printable_value(); //nPosition = static_cast<int>(result.m_szOID.find(m_szStartID.c_str()) + m_szStartID.length()); //if(nPosition > 0) //{ result.m_szIndex = result.m_szOID.substr(m_szStartID.length() + 1); result.m_szOID = result.m_szOID.substr(0, m_szStartID.length()); //PrintDebugString("index is " + result.m_szIndex); //} WriteLog(result.m_szIndex.c_str()); WriteLog(result.m_szValue.c_str()); ResultList[nIndex] = result; nIndex ++; } else { m_szErrorMsg = "End of MIB Reached"; return -4; } } // last vb becomes seed of next rquest pdu.set_vblist(&vb, 1); } } } catch(...) { DWORD dwError = GetLastError(); char szMsg[512] = {0}; int nlen = sprintf(szMsg, "Error Number is %08X --*GetBulkRequest*---", dwError); DumpLog("snmpmonitor-bulk.log", szMsg, nlen); } if(nResult == SNMP_ERROR_NO_SUCH_NAME) { nResult = 0; } return nResult; }
///////////////////////////////////////////////////////////////////////////// // 函数:GetBulkRequest // // 说明:得到表格变量的结果 // // 参数:无 // // 返回值: // // 成功返回0,否则返回一个非0 值 // ///////////////////////////////////////////////////////////////////////////// int BasicSNMP::GetBulkRequest() { //puts("BasicSNMP::GetBulkRequest"); int nResult = 0; char chPrvOID[MAX_BUFF_LEN] = {0}; bool bEnd = false; Pdu pdu; // construct a Pdu object Vb vb; // construct a Vb object vb.set_oid( oid); // set the Oid portion of the Vb pdu += vb; // add the vb to the Pdu DestroyResultList(); SnmpTarget *target;// = &ctarget; if(version ==version3) {//If SNMP Version Is 3 nResult = InitUTarget();//Init UTarget pdu.set_security_level( m_nSecurityLevel);//Set the Security Level portion of Pdu pdu.set_context_name (contextName);//Set the Context Name portion of Pdu pdu.set_context_engine_id(contextEngineID);//Set the Context Engine ID portion of Pdu target = &utarget; //Set SNMP Target } else { target = &ctarget; //Set SNMP Target } OIDResult *pTemp = new OIDResult(); OIDResult *pPrevResult = pTemp; //pTemp->pNext = NULL; pResult = pTemp; try { //SnmpTarget *target = &ctarget; while (( nResult = pSnmp->get_next(pdu, *target))== SNMP_CLASS_SUCCESS) { if(bEnd) { break; } for ( int z=0;z<pdu.get_vb_count(); z++) { pdu.get_vb( vb,z); if (pdu.get_type() == REPORT_MSG) { Oid tmp; vb.get_oid(tmp); return -5; } // look for var bind exception, applies to v2 only if ( vb.get_syntax() != sNMP_SYNTAX_ENDOFMIBVIEW) { char chOID[MAX_BUFF_LEN] = {0}; sprintf(chOID, "%s", vb.get_printable_oid()); char *pDest = strstr(chOID, chOIDStart); if(pDest == NULL) {//OID名称是否包含开始OID bEnd = true; break; } if(strlen(chPrvOID)>0) {//如果上次OID不为空 if(strcmp(vb.get_printable_oid(), chPrvOID) == 0) {//比较OID名称是否相同,相同则退出循环 bEnd = true; break; } } //结果赋值 strcpy(chPrvOID, vb.get_printable_oid()); strcpy(pTemp->chOID, vb.get_printable_oid()); strcpy(pTemp->chValue,vb.get_printable_value()); char *pIndex; pIndex=pTemp->chOID+strlen(oid.get_printable())+1; //pTemp->nLen = static_cast<int>(strlen(pTemp->chValue)); //char *pdest = strrchr(pTemp->chOID, '.'); //int nLast = (int)(pdest - pTemp->chOID + 1); //memcpy(pTemp->chIndex, (pTemp->chOID)+nLast, strlen(pTemp->chOID) - nLast); strcpy(pTemp->chIndex,pIndex); //pTemp->chIndex[strlen(pTemp->chOID) - nLast] = '\0'; } else { memset(chErrMsg, 0 , MAX_BUFF_LEN); strcpy(chErrMsg, "End of MIB Reached"); return -4; } if(pTemp->pNext == NULL) { pPrevResult = pTemp; pTemp->pNext = new OIDResult(); if(pTemp->pNext) pTemp = pTemp->pNext; //pTemp->pNext = NULL; } } // last vb becomes seed of next rquest pdu.set_vblist(&vb, 1); } if(nResult == 0) { if(pTemp->pNext == NULL) { free(pTemp); pTemp = NULL; pPrevResult->pNext = NULL; } } } catch(...) { DWORD dwError = GetLastError(); char szMsg[512] = {0}; int nlen = sprintf(szMsg, "Error Number is %08X --*GetBulkRequest*---", dwError); DumpLog("snmpmonitor-bulk.log", szMsg, nlen); //cout << "Error Number is " << dwError << "---*GetRequest*---" << endl; } if(nResult == SNMP_ERROR_NO_SUCH_NAME) { nResult = 0; pPrevResult->pNext = NULL; } return nResult; }
int main(int argc, char **argv) { int status; char *req_str = (char*) "get"; // char *dflt_req_oid = (char*) sysDescr; char *dflt_trp_oid = (char*) coldStart; char *genAddrStr = (char*) "127.0.0.1" ; // localhost char *oid_str = (char*) NULL; if (argc > 1) genAddrStr = argv[1]; if (argc > 2) req_str = argv[2]; if (argc > 3) oid_str = argv[3]; Snmp::socket_startup(); // Initialize socket subsystem IpAddress ipAddr(genAddrStr); if (!ipAddr.valid()) { cout << "Invalid destination: " << genAddrStr << endl; return(1); } // bind to any port and use IPv6 if needed Snmp snmp(status, 0, (ipAddr.get_ip_version() == Address::version_ipv6)); if (status) { cout << "Failed to create SNMP Session: " << status << endl; return(1); } cout << "Created session successfully" << endl; CTarget target(ipAddr); if (! target.valid()) { cout << "Invalid target" << endl; return(1); } Pdu pdu; Vb vb; if ( strcmp(req_str, "get") == 0 ) { Vb vbl[NUM_SYS_VBS]; vbl[0].set_oid(sysDescr); vbl[1].set_oid(sysObjectID); vbl[2].set_oid(sysUpTime); vbl[3].set_oid(sysContact); vbl[4].set_oid(sysName); vbl[5].set_oid(sysLocation); // vbl[6].set_oid(sysServices); cout << "Send a GET-REQUEST to: " << ipAddr.get_printable() << endl; if ( ! oid_str ) { if ( strcmp(genAddrStr,"localhost" ) == 0 || strcmp(genAddrStr, "127.0.0.1") == 0 ) { pdu.set_vblist(vbl, NUM_SYS_VBS); } else { for (int i=0; i<NUM_SYS_VBS; i++) pdu += vbl[i]; } } else { Oid req_oid(oid_str); if ( ! req_oid.valid() ) { cout << "Request oid constructor failed for:" << oid_str << endl; return(1); } vb.set_oid(req_oid); pdu += vb; } status = snmp.get(pdu, target); if (status) { cout << "Failed to issue SNMP Get: (" << status << ") " << snmp.error_msg(status) << endl; return(1); } else { cout << "Issued get successfully" << endl; int vbcount = pdu.get_vb_count(); if ( vbcount == NUM_SYS_VBS ) { pdu.get_vblist(vbl, vbcount); for ( int i=0; i<vbcount ; i++ ) { cout << vbl[i].get_printable_oid() << " : " << vbl[i].get_printable_value() << endl; } } else { for ( int i=0; i<vbcount ; i++ ) { pdu.get_vb(vb, i); cout << vb.get_printable_oid() << " : " << vb.get_printable_value() << endl; } } } } else if ( strcmp(req_str, "trap") == 0 ) { cout << "Send a TRAP to: " << ipAddr.get_printable() << endl; if ( ! oid_str ) oid_str = dflt_trp_oid; Oid notify_oid(oid_str); if ( ! notify_oid.valid() ) { cout << "Notify oid constructor failed for:" << oid_str << endl; return(1); } pdu.set_notify_id(notify_oid); // Use a simple payload vb.set_oid(sysLocation); vb.set_value("This is a test"); pdu += vb; status = snmp.trap(pdu, target); if (status) { cout << "Failed to issue SNMP Trap: (" << status << ") " << snmp.error_msg(status) << endl; return(1); } else { cout << "Success" << endl; } } else { cout << "Invalid SNMP operation: " << req_str << endl ; cout << "Usage: " << argv[0] << " hostname [get | trap]" << endl; return(1); } Snmp::socket_cleanup(); // Shut down socket subsystem return(0); }
void* runable(void *data) { //--------[ build up SNMP++ object needed ]------------------------------- ssync.lock(); printf("HELLO:%s\n", community.get_printable()); int t = *((int*)data); Pdu pdu; // construct a Pdu object Vb vb; // construct a Vb object vb.set_oid("1"); // set the Oid portion of the Vb pdu += vb; // add the vb to the Pdu CTarget ctarget(address[t]); // make a target using the address #ifdef _SNMPv3 UTarget utarget(address[t]); if (version == version3) { utarget.set_version( version); // set the SNMP version SNMPV1 or V2 or V3 utarget.set_retry( retries); // set the number of auto retries utarget.set_timeout( timeout); // set timeout utarget.set_security_model( securityModel); utarget.set_security_name( securityName); pdu.set_security_level( securityLevel); pdu.set_context_name (contextName); pdu.set_context_engine_id(contextEngineID); } else { #endif ctarget.set_version( version); // set the SNMP version SNMPV1 or V2 or V3 ctarget.set_retry( retries); // set the number of auto retries ctarget.set_timeout( timeout); // set timeout ctarget.set_readcommunity( community); // set the read community to use ctarget.set_writecommunity( community); #ifdef _SNMPv3 } #endif //-------[ issue the request, blocked mode ]----------------------------- cout << "(" << t << "): " << "SNMP++ snmpWalk to " << address[t].get_printable() << " SNMPV" #ifdef _SNMPv3 << ((version==version3) ? (version) : (version+1)) #else << (version+1) #endif << " Retries=" << retries << " Timeout=" << timeout <<"ms"; #ifdef _SNMPv3 if (version == version3) cout << endl << "securityName= " << securityName.get_printable() << ", securityLevel= " << securityLevel << ", securityModel= " << securityModel << endl << "contextName= " << contextName.get_printable() << ", contextEngineID= " << contextEngineID.get_printable() << endl; else #endif cout << " Community=" << community.get_printable() << endl << flush; SnmpTarget *target; #ifdef _SNMPv3 if (version == version3) target = &utarget; else #endif target = &ctarget; int status = 0; int requests = 0; int objects = 0; ssync.unlock(); while (( status = snmp->get_bulk( pdu,*target,0,BULK_MAX)) == SNMP_CLASS_SUCCESS) { requests++; ssync.lock(); for ( int z=0;z<pdu.get_vb_count(); z++) { pdu.get_vb( vb,z); #ifdef _SNMPv3 if (pdu.get_type() == REPORT_MSG) { Oid tmp; vb.get_oid(tmp); cout << "(" << t << "): " << "Received a reportPdu: " << snmp->error_msg( tmp) << endl << vb.get_printable_oid() << " = " << vb.get_printable_value() << endl; ssync.unlock(); return 0; } #endif objects++; // look for var bind exception, applies to v2 only if ( vb.get_syntax() != sNMP_SYNTAX_ENDOFMIBVIEW) { cout << "(" << t << "): " << vb.get_printable_oid() << " = "; cout << vb.get_printable_value() << "\n"; } else { cout << "(" << t << "): " << "End of MIB Reached\n"; cout << "(" << t << "): " << "Total # of Requests = " << requests << "\n"; cout << "(" << t << "): " << "Total # of Objects = " << objects << "\n"; ssync.unlock(); return 0; } } ssync.unlock(); // last vb becomes seed of next rquest pdu.set_vblist(&vb, 1); } if ( status != SNMP_ERROR_NO_SUCH_NAME) cout << "(" << t << "): " << "SNMP++ snmpWalk Error, " << snmp->error_msg( status) << "\n"; cout << "(" << t << "): " << "Total # of Requests = " << requests << "\n"; cout << "(" << t << "): " << "Total # of Objects = " << objects << "\n"; return 0; } // end Walk