summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Decavel2009-11-24 15:42:17 +0100
committerBenjamin Decavel2009-11-24 15:42:17 +0100
commit7141df9ce12bb2b00195cef140668cf0f177a161 (patch)
tree6745c2c16bb7179085f4ea893205101607d828d6
parent659a83b5cbf741d994826377f1d5e393066a8b8c (diff)
SNMP agent: initial log support (log format is incorrect for now) and some bug fixes in alarm
-rw-r--r--application/agent/Makefile1
-rw-r--r--application/agent/agent++/agentgen/agent/src/nscrtv_eponeoc_alarms_mib.cpp50
-rw-r--r--application/agent/agent++/agentgen/agent/src/nscrtv_eponeoc_property_mib.cpp12
-rw-r--r--application/agent/inc/LogManager.h41
-rwxr-xr-xapplication/agent/inc/systemmanager.h8
-rw-r--r--application/agent/src/LogManager.cpp83
-rw-r--r--application/agent/src/SystemManagerSarft.cpp34
-rw-r--r--application/agent/src/processManager.cpp3
8 files changed, 213 insertions, 19 deletions
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 <iostream>
+
+#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<MAX_INDEX?list.nextIndex++:list.nextIndex=0;
+
+ if (list.size<SIZE_LOG)
+ list.size++;
+ else
+ if (list.beginning>=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);