X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/f7163d9c994af13f0f72f49f7203b7ac3e281a1e..6bc774ca2ed1cd30d44aced5b9092a587e5b44ae:/projects/stargazer/plugins/other/smux/smux.cpp?ds=sidebyside diff --git a/projects/stargazer/plugins/other/smux/smux.cpp b/projects/stargazer/plugins/other/smux/smux.cpp index 4629aeab..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" @@ -16,11 +19,17 @@ #include "smux.h" #include "utils.h" -PLUGIN_CREATOR sac; +PLUGIN_CREATOR smc; PLUGIN * GetPlugin() { -return sac.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() @@ -33,7 +42,7 @@ int SMUX_SETTINGS::ParseSettings(const MODULE_SETTINGS & s) PARAM_VALUE pv; std::vector::const_iterator pvi; int p; -/////////////////////////// + pv.param = "Port"; pvi = std::find(s.moduleParams.begin(), s.moduleParams.end(), pv); if (pvi == s.moduleParams.end()) @@ -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); } @@ -116,19 +132,35 @@ if (PrepareNet()) return -1; // Users -sensors[".1.3.6.1.4.1.38313.1.1.1"] = new TotalUsersSensor(*users); -sensors[".1.3.6.1.4.1.38313.1.1.2"] = new ConnectedUsersSensor(*users); -sensors[".1.3.6.1.4.1.38313.1.1.3"] = new AuthorizedUsersSensor(*users); -sensors[".1.3.6.1.4.1.38313.1.1.4"] = new AlwaysOnlineUsersSensor(*users); -sensors[".1.3.6.1.4.1.38313.1.1.5"] = new NoCashUsersSensor(*users); -sensors[".1.3.6.1.4.1.38313.1.1.7"] = new DisabledDetailStatsUsersSensor(*users); -sensors[".1.3.6.1.4.1.38313.1.1.8"] = new DisabledUsersSensor(*users); -sensors[".1.3.6.1.4.1.38313.1.1.9"] = new PassiveUsersSensor(*users); -sensors[".1.3.6.1.4.1.38313.1.1.10"] = new CreditUsersSensor(*users); -sensors[".1.3.6.1.4.1.38313.1.1.11"] = new FreeMbUsersSensor(*users); -sensors[".1.3.6.1.4.1.38313.1.1.12"] = new TariffChangeUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.1")] = new TotalUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.2")] = new ConnectedUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.3")] = new AuthorizedUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.4")] = new AlwaysOnlineUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.5")] = new NoCashUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.7")] = new DisabledDetailStatsUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.8")] = new DisabledUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.9")] = new PassiveUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.10")] = new CreditUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.11")] = new FreeMbUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.12")] = new TariffChangeUsersSensor(*users); // Tariffs -sensors[".1.3.6.1.4.1.38313.1.2.1"] = new TotalTariffsSensor(*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) { @@ -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; +}