From: Maxim Mamontov Date: Mon, 8 Aug 2011 18:31:11 +0000 (+0300) Subject: Tables update implemented X-Git-Tag: 2.408-alpha~42 X-Git-Url: https://git.stg.codes/stg.git/commitdiff_plain/6bc774ca2ed1cd30d44aced5b9092a587e5b44ae?ds=inline Tables update implemented --- diff --git a/projects/stargazer/plugins/other/smux/Makefile b/projects/stargazer/plugins/other/smux/Makefile index dc807a3d..feaef9ee 100644 --- a/projects/stargazer/plugins/other/smux/Makefile +++ b/projects/stargazer/plugins/other/smux/Makefile @@ -6,6 +6,7 @@ PROG = mod_smux.so SRCS = smux.cpp \ sensors.cpp \ + tables.cpp \ handlers.cpp \ utils.cpp \ types.cpp diff --git a/projects/stargazer/plugins/other/smux/smux.cpp b/projects/stargazer/plugins/other/smux/smux.cpp index f6c1fade..79e9d208 100644 --- a/projects/stargazer/plugins/other/smux/smux.cpp +++ b/projects/stargazer/plugins/other/smux/smux.cpp @@ -9,6 +9,9 @@ #include #include +#include +#include +#include #include "stg/common.h" #include "stg/plugin_creator.h" @@ -23,6 +26,12 @@ PLUGIN * GetPlugin() return smc.GetPlugin(); } +bool SPrefixLess(const Sensors::value_type & a, + const Sensors::value_type & b) +{ +return a.first.PrefixLess(b.first); +} + SMUX_SETTINGS::SMUX_SETTINGS() : ip(0), port(0) @@ -98,9 +107,16 @@ pdusHandlers[PDUs_PR_set_request] = &SMUX::SetRequestHandler; SMUX::~SMUX() { -Sensors::iterator it; -for (it = sensors.begin(); it != sensors.end(); ++it) - delete it->second; + { + Sensors::iterator it; + for (it = sensors.begin(); it != sensors.end(); ++it) + delete it->second; + } + { + Tables::iterator it; + for (it = tables.begin(); it != tables.end(); ++it) + delete it->second; + } printfd(__FILE__, "SMUX::~SMUX()\n"); pthread_mutex_destroy(&mutex); } @@ -130,6 +146,22 @@ sensors[OID(".1.3.6.1.4.1.38313.1.1.12")] = new TariffChangeUsersSensor(*users); // Tariffs sensors[OID(".1.3.6.1.4.1.38313.1.2.1")] = new TotalTariffsSensor(*tariffs); +// Table data +tables[".1.3.6.1.4.1.38313.1.1.6"] = new TariffUsersTable(".1.3.6.1.4.1.38313.1.1.6", *users); + +UpdateTables(); + +#ifdef DEBUG +Sensors::const_iterator it(sensors.begin()); +while (it != sensors.end()) + { + printfd(__FILE__, "%s = %s\n", + it->first.ToString().c_str(), + it->second->ToString().c_str()); + ++it; + } +#endif + if (!running) { if (pthread_create(&thread, NULL, Runner, this)) @@ -264,3 +296,58 @@ else } return false; } + +bool SMUX::UpdateTables() +{ +Sensors newSensors; +bool done = true; +Tables::iterator it(tables.begin()); +while (it != tables.end()) + { + try + { + it->second->UpdateSensors(newSensors); + } + catch (const std::runtime_error & ex) + { + printfd(__FILE__, + "SMUX::UpdateTables - failed to update table '%s': '%s'\n", + it->first.c_str(), ex.what()); + done = false; + break; + } + ++it; + } +if (!done) + { + Sensors::iterator it(newSensors.begin()); + while (it != newSensors.end()) + { + delete it->second; + ++it; + } + return false; + } + +it = tables.begin(); +while (it != tables.end()) + { + std::pair res; + res = std::equal_range(sensors.begin(), + sensors.end(), + std::pair(OID(it->first), NULL), + SPrefixLess); + Sensors::iterator sit(res.first); + while (sit != res.second) + { + delete sit->second; + ++sit; + } + sensors.erase(res.first, res.second); + ++it; + } + +sensors.insert(newSensors.begin(), newSensors.end()); + +return true; +} diff --git a/projects/stargazer/plugins/other/smux/smux.h b/projects/stargazer/plugins/other/smux/smux.h index bbcada9d..08e23c38 100644 --- a/projects/stargazer/plugins/other/smux/smux.h +++ b/projects/stargazer/plugins/other/smux/smux.h @@ -16,6 +16,7 @@ #include "stg/tariffs.h" #include "sensors.h" +#include "tables.h" #include "types.h" extern "C" PLUGIN * GetPlugin(); @@ -88,6 +89,8 @@ private: bool GetNextRequestHandler(const PDUs_t * pdus); bool SetRequestHandler(const PDUs_t * pdus); + bool UpdateTables(); + USERS * users; TARIFFS * tariffs; @@ -105,6 +108,7 @@ private: SMUXHandlers smuxHandlers; PDUsHandlers pdusHandlers; Sensors sensors; + Tables tables; }; //-----------------------------------------------------------------------------