From 7141df9ce12bb2b00195cef140668cf0f177a161 Mon Sep 17 00:00:00 2001 From: Benjamin Decavel Date: Tue, 24 Nov 2009 15:42:17 +0100 Subject: SNMP agent: initial log support (log format is incorrect for now) and some bug fixes in alarm --- application/agent/Makefile | 1 + .../agent/src/nscrtv_eponeoc_alarms_mib.cpp | 50 +++++++++++-- .../agent/src/nscrtv_eponeoc_property_mib.cpp | 12 ++-- application/agent/inc/LogManager.h | 41 +++++++++++ application/agent/inc/systemmanager.h | 8 ++- application/agent/src/LogManager.cpp | 83 ++++++++++++++++++++++ application/agent/src/SystemManagerSarft.cpp | 34 ++++++--- application/agent/src/processManager.cpp | 3 + 8 files changed, 213 insertions(+), 19 deletions(-) create mode 100644 application/agent/inc/LogManager.h create mode 100644 application/agent/src/LogManager.cpp diff --git a/application/agent/Makefile b/application/agent/Makefile index cb84e0591f..e31554b6f6 100644 --- a/application/agent/Makefile +++ b/application/agent/Makefile @@ -36,6 +36,7 @@ OBJ += systemmanager.o OBJ += SystemManagerSarft.o OBJ += underlayer.o OBJ += UnderlayerSarft.o +OBJ += LogManager.o OBJS=$(addprefix $(OBJDIR)/,$(OBJ)) diff --git a/application/agent/agent++/agentgen/agent/src/nscrtv_eponeoc_alarms_mib.cpp b/application/agent/agent++/agentgen/agent/src/nscrtv_eponeoc_alarms_mib.cpp index 8209956885..44c88a04d0 100644 --- a/application/agent/agent++/agentgen/agent/src/nscrtv_eponeoc_alarms_mib.cpp +++ b/application/agent/agent++/agentgen/agent/src/nscrtv_eponeoc_alarms_mib.cpp @@ -257,7 +257,49 @@ void alarmLogEntry::update(Request* req) { // This table needs to be updated. //--AgentGen BEGIN=alarmLogEntry::update - // TODO + static unsigned long last = 0; + + unsigned long val=SystemManager::getInc()-last; + + if(val>_DEFAULT_DATA_REFRESH_PERIOD) + { + logContainer* container_pointers[SIZE_LOG]; + int counter = SIZE_LOG; + + if (SystemManager::instance()->retrieveLog(container_pointers, &counter) != 0) + { + syslog(LOG_DEBUG, "SNMP agent: error retrieving logs"); + return; + } + + //clear the previous list + alarmLogEntry::instance->clear(); + + /* Build what's retrieved from whitelist */ + for (int i = 0; i < counter; i++) + { + char index[_DEFAULT_OID_BUFFER_SIZE]; + sprintf(index, "%lu", (unsigned long)i); + Oidx *pIndex = new Oidx(index); + + MibTableRow* entry = alarmLogEntry::instance->find_index(*pIndex); + if (NULL == entry) + { + entry = alarmLogEntry::instance->add_row(*pIndex); + } + + syslog(LOG_DEBUG, "displaying index %u, info %s", container_pointers[i]->index, container_pointers[i]->information); + + // set the row with the good values + alarmLogEntry::instance->set_row(entry, + container_pointers[i]->index, + container_pointers[i]->information); + + delete pIndex; + } + } + + last+=SystemManager::getInc()-last; //--AgentGen END } @@ -273,10 +315,10 @@ int alarmLogEntry::is_transition_ok(MibTable* table, MibTableRow* row, const Oid -void alarmLogEntry::set_row(MibTableRow* r, long p1, const OctetStr& p2) +void alarmLogEntry::set_row(MibTableRow* r, long p1, const NS_SNMP OctetStr& p2) { - r->get_nth(0)->replace_value(new SnmpInt32(p1)); - r->get_nth(1)->replace_value(new OctetStr(p2)); + r->get_nth(0)->replace_value(new NS_SNMP SnmpInt32(p1)); + r->get_nth(1)->replace_value(new NS_SNMP OctetStr(p2)); } //--AgentGen BEGIN=alarmLogEntry diff --git a/application/agent/agent++/agentgen/agent/src/nscrtv_eponeoc_property_mib.cpp b/application/agent/agent++/agentgen/agent/src/nscrtv_eponeoc_property_mib.cpp index 16ef9b9a9d..9bd1afd522 100644 --- a/application/agent/agent++/agentgen/agent/src/nscrtv_eponeoc_property_mib.cpp +++ b/application/agent/agent++/agentgen/agent/src/nscrtv_eponeoc_property_mib.cpp @@ -1116,7 +1116,7 @@ void analogPropertyEntry::update(Request* req) MibTableRow* entry = analogPropertyEntry::instance->find_index(*pIndex); if (NULL == entry) { - analogPropertyEntry::instance->add_row(*pIndex); + entry = analogPropertyEntry::instance->add_row(*pIndex); } // set the row with the good values @@ -1130,7 +1130,7 @@ void analogPropertyEntry::update(Request* req) container[i].lolo, container[i].deadband); - //delete pIndex; + delete pIndex; } } @@ -1303,7 +1303,7 @@ void discretePropertyEntry::update(Request* req) MibTableRow* entry = discretePropertyEntry::instance->find_index(*pIndex); if (NULL == entry) { - discretePropertyEntry::instance->add_row(*pIndex); + entry = discretePropertyEntry::instance->add_row(*pIndex); } // set the row with the good values @@ -1313,7 +1313,7 @@ void discretePropertyEntry::update(Request* req) container[i].enable, container[i].state); - //delete pIndex; + delete pIndex; } } @@ -1479,7 +1479,7 @@ void currentAlarmEntry::update(Request* req) MibTableRow* entry = currentAlarmEntry::instance->find_index(*pIndex); if (NULL == entry) { - currentAlarmEntry::instance->add_row(*pIndex); + entry = currentAlarmEntry::instance->add_row(*pIndex); } // set the row with the good values @@ -1491,7 +1491,7 @@ void currentAlarmEntry::update(Request* req) container[i].state, temp_value); - //delete pIndex; + delete pIndex; } } diff --git a/application/agent/inc/LogManager.h b/application/agent/inc/LogManager.h new file mode 100644 index 0000000000..9f37097914 --- /dev/null +++ b/application/agent/inc/LogManager.h @@ -0,0 +1,41 @@ +#ifndef __LOG_MANAGER__ +#define __LOG_MANAGER__ + +#define SIZE_LOG 64 +#define MAX_INDEX 32767 + +typedef struct +{ + unsigned int index; + char information[256]; +} logContainer; + + +typedef struct +{ + unsigned int size; + unsigned int beginning; + unsigned int nextIndex; + logContainer containers[SIZE_LOG]; +} logList; + + +class LogManager +{ +public: + static LogManager* instance(); + int storeLog(const char* info); + int getLogs(logContainer* fill_me[SIZE_LOG], int* size); + int emptyLog(); + int retrieveLog(logContainer* fill_me[SIZE_LOG], int* size); + +protected: + LogManager(); + ~LogManager(); + +private: + static LogManager* singleton; + logList list; +}; + +#endif diff --git a/application/agent/inc/systemmanager.h b/application/agent/inc/systemmanager.h index f475775a4e..a9e481490d 100755 --- a/application/agent/inc/systemmanager.h +++ b/application/agent/inc/systemmanager.h @@ -21,6 +21,8 @@ #include "underlayer.h" +#include "LogManager.h" + #include "syslog.h" #ifdef STUB_TEST @@ -435,8 +437,12 @@ public: int checkAlarm(char * alarmOID, int value); int checkAnalogAlarm(spidlib_analog_alarm_entry_t* alarm, int value); int checkDiscreteAlarm(spidlib_discrete_alarm_entry_t* alarm, int value); + + int alarmDetected(const char* oid); int issueTrap(const char* oid); - int issueLog(); + int issueLog(const char* information); + int emptyLog(); + int retrieveLog(logContainer* fill_me[SIZE_LOG], int* size); //---- FD01: SNMP community /** diff --git a/application/agent/src/LogManager.cpp b/application/agent/src/LogManager.cpp new file mode 100644 index 0000000000..ad53c0a06f --- /dev/null +++ b/application/agent/src/LogManager.cpp @@ -0,0 +1,83 @@ +#ifndef _LogManager_cpp +#define _LogManager_cpp + +#include "LogManager.h" +#include + +#include "syslog.h" + +using namespace std; + +LogManager* LogManager::singleton = 0; + +LogManager::LogManager() +{ + list.size = 0; + list.beginning = 0; + list.nextIndex = 0; +} + +LogManager* LogManager::instance() +{ + if (singleton == 0) + singleton = new LogManager(); + + return singleton; +} + +LogManager::~LogManager() +{ + if (!singleton) { + delete singleton; + } +} + +int LogManager::storeLog(const char* info) +{ + unsigned int position; + + (list.beginning + list.size)>=SIZE_LOG?(position = list.beginning + list.size - SIZE_LOG):(position = list.beginning + list.size); + + strcpy(list.containers[position].information, info); + list.containers[position].index = list.nextIndex; + + list.nextIndex=SIZE_LOG-1) + list.beginning = 0; + else + list.beginning++; + + return 0; +} + +int LogManager::getLogs(logContainer* fill_me[SIZE_LOG], int* size) +{ + *size = list.size; + + unsigned int position = list.beginning; + + for (int i = 0; i < list.size; i++) + { + if (position + i >= SIZE_LOG) + fill_me[i] = &list.containers[position + i - SIZE_LOG]; + else + fill_me[i] = &list.containers[position + i]; + } + + return 0; +} + +int LogManager::emptyLog() +{ + list.size = 0; + list.beginning = 0; + list.nextIndex = 0; + + return 0; +} + +#endif diff --git a/application/agent/src/SystemManagerSarft.cpp b/application/agent/src/SystemManagerSarft.cpp index 7075e1af88..2de0a00b75 100644 --- a/application/agent/src/SystemManagerSarft.cpp +++ b/application/agent/src/SystemManagerSarft.cpp @@ -1448,16 +1448,16 @@ int SystemManager::checkAlarm(char * alarmOID, int value) int SystemManager::checkAnalogAlarm(spidlib_analog_alarm_entry_t* alarm, int value) { if (alarm->enable.LOLO_alarm_enable == 1 && value < (alarm->lolo + alarm->deadband)) - issueTrap(alarm->oid); + alarmDetected(alarm->oid); if (alarm->enable.LO_alarm_enable == 1 && value < (alarm->lo + alarm->deadband)) - issueTrap(alarm->oid); + alarmDetected(alarm->oid); if (alarm->enable.HI_alarm_enable == 1 && value > (alarm->hi - alarm->deadband)) - issueTrap(alarm->oid); + alarmDetected(alarm->oid); if (alarm->enable.HIHI_alarm_enable == 1 && value > (alarm->hihi - alarm->deadband)) - issueTrap(alarm->oid); + alarmDetected(alarm->oid); return 0; } @@ -1469,12 +1469,12 @@ int SystemManager::checkDiscreteAlarm(spidlib_discrete_alarm_entry_t* alarm, int case SPIDLIB_DAE_ENABLE_MAJOR: { if (value > alarm->trigger) - issueTrap(alarm->oid); + alarmDetected(alarm->oid); } case SPIDLIB_DAE_ENABLE_MINOR: { if (value < alarm->trigger) - issueTrap(alarm->oid); + alarmDetected(alarm->oid); } case SPIDLIB_DAE_DISABLE: default: @@ -1484,6 +1484,14 @@ int SystemManager::checkDiscreteAlarm(spidlib_discrete_alarm_entry_t* alarm, int return 0; } +int SystemManager::alarmDetected(const char* oid) +{ + issueTrap(oid); + issueLog(oid); + + return 0; +} + int SystemManager::issueTrap(const char* oid) { unsigned char mac_admin[6]; @@ -1495,9 +1503,19 @@ int SystemManager::issueTrap(const char* oid) return 0; } -int SystemManager::issueLog() +int SystemManager::issueLog(const char* information) +{ + return LogManager::instance()->storeLog(information); +} + +int SystemManager::emptyLog() +{ + return LogManager::instance()->emptyLog(); +} + +int SystemManager::retrieveLog(logContainer* fill_me[SIZE_LOG], int* size) { - //leave empty for now + LogManager::instance()->getLogs(fill_me, size); return 0; } diff --git a/application/agent/src/processManager.cpp b/application/agent/src/processManager.cpp index 965e7b260a..9b0aa98d5e 100644 --- a/application/agent/src/processManager.cpp +++ b/application/agent/src/processManager.cpp @@ -192,6 +192,9 @@ void processManager::startEventListener() void processManager::startAlarmManager() { + int i = 0; + char temp[32]; + while (true) { sleep(15); -- cgit v1.2.3