X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/1147628fd6aa3e78322a596880c1d46f8e6468df..0fc9896e27b94093ccde0b8566e2b8109ae8f657:/projects/stargazer/plugins/other/smux/smux.cpp diff --git a/projects/stargazer/plugins/other/smux/smux.cpp b/projects/stargazer/plugins/other/smux/smux.cpp index 23d5f05f..bef6e462 100644 --- a/projects/stargazer/plugins/other/smux/smux.cpp +++ b/projects/stargazer/plugins/other/smux/smux.cpp @@ -16,12 +16,6 @@ #include "stg/common.h" #include "stg/plugin_creator.h" -/*#include "stg/users.h" -#include "stg/tariffs.h" -#include "stg/admins.h" -#include "stg/services.h" -#include "stg/corporations.h" -#include "stg/traffcounter.h"*/ #include "smux.h" #include "utils.h" @@ -40,8 +34,10 @@ return a.first.PrefixLess(b.first); } SMUX_SETTINGS::SMUX_SETTINGS() - : ip(0), - port(0) + : errorStr(), + ip(0), + port(0), + password() {} int SMUX_SETTINGS::ParseSettings(const MODULE_SETTINGS & s) @@ -100,6 +96,11 @@ SMUX::SMUX() services(NULL), corporations(NULL), traffcounter(NULL), + errorStr(), + smuxSettings(), + settings(), + thread(), + mutex(), running(false), stopped(true), sock(-1), @@ -108,7 +109,10 @@ SMUX::SMUX() sensors(), tables(), notifiers(), - addDelNotifier(*this) + addUserNotifier(*this), + delUserNotifier(*this), + addDelTariffNotifier(*this), + logger(GetPluginLogger(GetStgLogger(), "smux")) { pthread_mutex_init(&mutex, NULL); @@ -161,12 +165,13 @@ 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); +sensors[OID(".1.3.6.1.4.1.38313.1.1.6")] = new DisabledDetailStatsUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.7")] = new DisabledUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.8")] = new PassiveUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.9")] = new CreditUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.10")] = new FreeMbUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.11")] = new TariffChangeUsersSensor(*users); +sensors[OID(".1.3.6.1.4.1.38313.1.1.12")] = new ActiveUsersSensor(*users); // Tariffs sensors[OID(".1.3.6.1.4.1.38313.1.2.1")] = new TotalTariffsSensor(*tariffs); // Admins @@ -179,14 +184,12 @@ sensors[OID(".1.3.6.1.4.1.38313.1.5.1")] = new TotalCorporationsSensor(*corporat sensors[OID(".1.3.6.1.4.1.38313.1.6.1")] = new TotalRulesSensor(*traffcounter); // 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", *tariffs, *users); +tables[".1.3.6.1.4.1.38313.1.2.2"] = new TariffUsersTable(".1.3.6.1.4.1.38313.1.2.2", *tariffs, *users); UpdateTables(); SetNotifiers(); -users->AddNotifierUserAdd(&addDelNotifier); -users->AddNotifierUserDel(&addDelNotifier); -#ifdef DEBUG +#ifdef SMUX_DEBUG Sensors::const_iterator it(sensors.begin()); while (it != sensors.end()) { @@ -202,6 +205,7 @@ if (!running) if (pthread_create(&thread, NULL, Runner, this)) { errorStr = "Cannot create thread."; + logger("Cannot create thread."); printfd(__FILE__, "Cannot create thread\n"); return -1; } @@ -215,10 +219,6 @@ int SMUX::Stop() printfd(__FILE__, "SMUX::Stop() - Before\n"); running = false; -users->DelNotifierUserDel(&addDelNotifier); -users->DelNotifierUserAdd(&addDelNotifier); -ResetNotifiers(); - if (!stopped) { //5 seconds to thread stops itself @@ -227,31 +227,54 @@ if (!stopped) struct timespec ts = {0, 200000000}; nanosleep(&ts, NULL); } + } - //after 5 seconds waiting thread still running. now killing it - if (!stopped) - { - printfd(__FILE__, "SMUX::Stop() - failed to stop thread, killing it\n"); - if (pthread_kill(thread, SIGINT)) - { - errorStr = "Cannot kill thread."; - printfd(__FILE__, "SMUX::Stop() - Cannot kill thread\n"); - return -1; - } - printfd(__FILE__, "SMUX::Stop() - killed Run\n"); - } +if (stopped) + pthread_join(thread, NULL); + +ResetNotifiers(); + + { + Tables::iterator it; + for (it = tables.begin(); it != tables.end(); ++it) + delete it->second; + } + { + Sensors::iterator it; + for (it = sensors.begin(); it != sensors.end(); ++it) + delete it->second; } -pthread_join(thread, NULL); +tables.erase(tables.begin(), tables.end()); +sensors.erase(sensors.begin(), sensors.end()); close(sock); +if (!stopped) + { + running = true; + return -1; + } + printfd(__FILE__, "SMUX::Stop() - After\n"); return 0; } +int SMUX::Reload() +{ +if (Stop()) + return -1; +if (Start()) + return -1; +return 0; +} + void * SMUX::Runner(void * d) { +sigset_t signalSet; +sigfillset(&signalSet); +pthread_sigmask(SIG_BLOCK, &signalSet, NULL); + SMUX * smux = static_cast(d); smux->Run(); @@ -261,8 +284,11 @@ return NULL; void SMUX::Run() { -SendOpenPDU(sock); -SendRReqPDU(sock); +stopped = true; +if (!SendOpenPDU(sock)) + return; +if (!SendRReqPDU(sock)) + return; running = true; stopped = false; @@ -291,6 +317,7 @@ sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { errorStr = "Cannot create socket."; + logger("Cannot create a socket: %s", strerror(errno)); printfd(__FILE__, "Cannot create socket\n"); return true; } @@ -304,6 +331,7 @@ addr.sin_addr.s_addr = smuxSettings.GetIP(); if (connect(sock, reinterpret_cast(&addr), sizeof(addr))) { errorStr = "Cannot connect."; + logger("Cannot connect the socket: %s", strerror(errno)); printfd(__FILE__, "Cannot connect. Message: '%s'\n", strerror(errno)); return true; } @@ -313,12 +341,12 @@ return false; bool SMUX::DispatchPDUs(const SMUX_PDUs_t * pdus) { -SMUXHandlers::iterator it; -it = smuxHandlers.find(pdus->present); +SMUXHandlers::iterator it(smuxHandlers.find(pdus->present)); if (it != smuxHandlers.end()) { return (this->*(it->second))(pdus); } +#ifdef SMUX_DEBUG else { switch (pdus->present) @@ -337,6 +365,7 @@ else } asn_fprint(stderr, &asn_DEF_SMUX_PDUs, pdus); } +#endif return false; } @@ -395,37 +424,58 @@ sensors.insert(newSensors.begin(), newSensors.end()); return true; } +void SMUX::SetNotifier(USER_PTR userPtr) +{ +notifiers.push_back(CHG_AFTER_NOTIFIER(*this, userPtr)); +userPtr->GetProperty().tariffName.AddAfterNotifier(¬ifiers.back()); +} + +void SMUX::UnsetNotifier(USER_PTR userPtr) +{ +std::list::iterator it = notifiers.begin(); +while (it != notifiers.end()) + { + if (it->GetUserPtr() == userPtr) + { + userPtr->GetProperty().tariffName.DelAfterNotifier(&(*it)); + notifiers.erase(it); + break; + } + ++it; + } +} + void SMUX::SetNotifiers() { -USER_PTR u; int h = users->OpenSearch(); assert(h && "USERS::OpenSearch is always correct"); +USER_PTR u; while (!users->SearchNext(h, &u)) - { - notifiers.push_back(CHG_AFTER_NOTIFIER(*this, u)); - u->GetProperty().tariffName.AddAfterNotifier(¬ifiers.back()); - } + SetNotifier(u); users->CloseSearch(h); + +users->AddNotifierUserAdd(&addUserNotifier); +users->AddNotifierUserDel(&delUserNotifier); + +tariffs->AddNotifierAdd(&addDelTariffNotifier); +tariffs->AddNotifierDel(&addDelTariffNotifier); } void SMUX::ResetNotifiers() { -std::list::iterator it = notifiers.begin(); +tariffs->DelNotifierDel(&addDelTariffNotifier); +tariffs->DelNotifierAdd(&addDelTariffNotifier); + +users->DelNotifierUserDel(&delUserNotifier); +users->DelNotifierUserAdd(&addUserNotifier); + +std::list::iterator it(notifiers.begin()); while (it != notifiers.end()) { it->GetUserPtr()->GetProperty().tariffName.DelAfterNotifier(&(*it)); ++it; } -} - -void CHG_AFTER_NOTIFIER::Notify(const std::string &, const std::string &) -{ -smux.UpdateTables(); -} - -void ADD_DEL_USER_NOTIFIER::Notify(const USER_PTR &) -{ -smux.UpdateTables(); +notifiers.clear(); }