]> git.stg.codes - stg.git/commitdiff
Merge branch 'stg-2.409' into stg-2.409-radius
authorMaxim Mamontov <faust.madf@gmail.com>
Sat, 20 Aug 2016 10:24:56 +0000 (13:24 +0300)
committerMaxim Mamontov <faust.madf@gmail.com>
Sat, 20 Aug 2016 10:24:56 +0000 (13:24 +0300)
30 files changed:
include/stg/plugin.h
projects/stargazer/main.cpp
projects/stargazer/plugin_mgr.cpp
projects/stargazer/plugin_mgr.h
projects/stargazer/plugin_runner.cpp
projects/stargazer/plugin_runner.h
projects/stargazer/plugins/authorization/ao/ao.h
projects/stargazer/plugins/authorization/inetaccess/inetaccess.cpp
projects/stargazer/plugins/authorization/inetaccess/inetaccess.h
projects/stargazer/plugins/authorization/stress/stress.h
projects/stargazer/plugins/capture/cap_debug/debug_cap.h
projects/stargazer/plugins/capture/cap_nf/cap_nf.h
projects/stargazer/plugins/capture/divert_freebsd/divert_cap.h
projects/stargazer/plugins/capture/ether_freebsd/ether_cap.h
projects/stargazer/plugins/capture/ether_linux/ether_cap.h
projects/stargazer/plugins/capture/ipq_linux/ipq_cap.h
projects/stargazer/plugins/capture/nfqueue/nfqueue.h
projects/stargazer/plugins/configuration/rpcconfig/rpcconfig.h
projects/stargazer/plugins/configuration/sgconfig/stgconfig.h
projects/stargazer/plugins/other/ping/ping.h
projects/stargazer/plugins/other/radius/radius.h
projects/stargazer/plugins/other/rscript/rscript.cpp
projects/stargazer/plugins/other/rscript/rscript.h
projects/stargazer/plugins/other/smux/smux.cpp
projects/stargazer/plugins/other/smux/smux.h
projects/stargazer/settings_impl.cpp
projects/stargazer/settings_impl.h
projects/stargazer/user_impl.cpp
stglibs/logger.lib/include/stg/logger.h
stglibs/logger.lib/logger.cpp

index 114ffc8bc61e58f67ed0e1fb05868007df6f1b0e..2deabcc3c853b7fab16d52808cd8973be056fbcc 100644 (file)
@@ -59,7 +59,7 @@ public:
 
     virtual int                 Start() = 0;
     virtual int                 Stop() = 0;
-    virtual int                 Reload() = 0;
+    virtual int                 Reload(const MODULE_SETTINGS &) = 0;
     virtual bool                IsRunning() = 0;
     virtual const std::string & GetStrError() const = 0;
     virtual std::string         GetVersion() const = 0;
index 3c216977b8725adc961712688157125481e3f0f1..702bfb8663930c2aca4efb82a4b85cf5a6e6507e 100644 (file)
@@ -266,6 +266,11 @@ for (size_t i = 0; i < settings.GetExecutersNum(); i++)
 
 PIDFile pidFile(settings.GetPIDFileName());
 
+struct sigaction sa;
+memset(&sa, 0, sizeof(sa));
+sa.sa_handler = SIG_DFL;
+sigaction(SIGHUP, &sa, NULL); // Apparently FreeBSD ignores SIGHUP by default when launched from rc.d at bot time.
+
 sigset_t signalSet;
 sigfillset(&signalSet);
 pthread_sigmask(SIG_BLOCK, &signalSet, NULL);
@@ -338,8 +343,16 @@ while (running)
     switch (sig)
         {
         case SIGHUP:
+            {
+            SETTINGS_IMPL newSettings(settings);
+            if (newSettings.ReadSettings())
+                WriteServLog("ReadSettings error. %s", newSettings.GetStrError().c_str());
+            else
+                settings = newSettings;
+            WriteServLog.SetLogFileName(settings.GetLogFileName());
             traffCnt.Reload();
-            manager.reload();
+            manager.reload(settings);
+            }
             break;
         case SIGTERM:
             running = false;
index b87ab2770828f46affa73638954e2858dcb3a5a0..85215c7bae0f8fa43dd7371401e2adb28656eafc 100644 (file)
@@ -59,12 +59,13 @@ PluginManager::PluginManager(const SETTINGS_IMPL& settings,
     const std::vector<MODULE_SETTINGS> & modSettings(settings.GetModulesSettings());
     for (size_t i = 0; i < modSettings.size(); i++)
     {
-        std::string modulePath = basePath + "/mod_" + modSettings[i].moduleName + ".so";
+        std::string moduleName = modSettings[i].moduleName;
+        std::string modulePath = basePath + "/mod_" + moduleName + ".so";
         printfd(__FILE__, "Module: %s\n", modulePath.c_str());
         try
         {
             m_modules.push_back(
-                new PLUGIN_RUNNER(modulePath, modSettings[i], admins, tariffs,
+                new PLUGIN_RUNNER(modulePath, moduleName, modSettings[i], admins, tariffs,
                                   users, services, corporations, traffcounter,
                                   store, settings)
             );
@@ -102,17 +103,25 @@ PluginManager::~PluginManager()
         delete m_modules[i];
 }
 
-void PluginManager::reload()
+void PluginManager::reload(const SETTINGS_IMPL& settings)
 {
+    const std::vector<MODULE_SETTINGS> & modSettings(settings.GetModulesSettings());
     for (size_t i = 0; i < m_modules.size(); ++i)
     {
-        PLUGIN & plugin = m_modules[i]->GetPlugin();
-        if (m_modules[i]->Reload())
+        for (size_t j = 0; j < modSettings.size(); j++)
         {
-            m_log("Error reloading module '%s': '%s'", plugin.GetVersion().c_str(),
-                                                       plugin.GetStrError().c_str());
-            printfd(__FILE__, "Error reloading module '%s': '%s'\n", plugin.GetVersion().c_str(),
-                                                                     plugin.GetStrError().c_str());
+            if (modSettings[j].moduleName == m_modules[i]->GetName())
+            {
+                PLUGIN & plugin = m_modules[i]->GetPlugin();
+                if (m_modules[i]->Reload(modSettings[j]))
+                {
+                    m_log("Error reloading module '%s': '%s'", plugin.GetVersion().c_str(),
+                                                               plugin.GetStrError().c_str());
+                    printfd(__FILE__, "Error reloading module '%s': '%s'\n", plugin.GetVersion().c_str(),
+                                                                             plugin.GetStrError().c_str());
+                }
+                break;
+            }
         }
     }
 }
index c9ec8dff3c63412e805677c22d232bbab947b197..a37052d5d1ab8397dde03d2fb043159b10b9fe88 100644 (file)
@@ -48,7 +48,7 @@ class PluginManager
                       USERS_IMPL& users, TRAFFCOUNTER_IMPL& traffcounter);
         ~PluginManager();
 
-        void reload();
+        void reload(const SETTINGS_IMPL& settings);
         void stop();
 
     private:
index eaf51058ccedc97a0999c8fee211142632edc8c1..e57a421ef245d955d6c0dfbd9945cf9e404d6cae 100644 (file)
@@ -28,6 +28,7 @@
 
 //-----------------------------------------------------------------------------
 PLUGIN_RUNNER::PLUGIN_RUNNER(const std::string & fileName,
+                             const std::string & name,
                              const MODULE_SETTINGS & ms,
                              ADMINS & admins,
                              TARIFFS & tariffs,
@@ -38,6 +39,7 @@ PLUGIN_RUNNER::PLUGIN_RUNNER(const std::string & fileName,
                              STORE & store,
                              const SETTINGS & settings)
     : pluginFileName(fileName),
+      pluginName(name),
       libHandle(NULL),
       m_plugin(Load(ms, admins, tariffs, users, services, corporations,
                     traffcounter, store, settings))
@@ -67,9 +69,9 @@ errorStr = m_plugin.GetStrError();
 return res;
 }
 //-----------------------------------------------------------------------------
-int PLUGIN_RUNNER::Reload()
+int PLUGIN_RUNNER::Reload(const MODULE_SETTINGS & ms)
 {
-int res = m_plugin.Reload();
+int res = m_plugin.Reload(ms);
 errorStr = m_plugin.GetStrError();
 return res;
 }
index 1402d2ef48a63fa2b97c6360363f513cd62274ed..2d0c22c4e069145cbc0f6adf35be40aa4b8c1eea 100644 (file)
@@ -46,6 +46,7 @@ public:
     };
 
     PLUGIN_RUNNER(const std::string & pluginFileName,
+                  const std::string & pluginName,
                   const MODULE_SETTINGS & ms,
                   ADMINS & admins,
                   TARIFFS & tariffs,
@@ -59,13 +60,14 @@ public:
 
     int             Start();
     int             Stop();
-    int             Reload();
+    int             Reload(const MODULE_SETTINGS & ms);
     int             Restart();
     bool            IsRunning() { return m_plugin.IsRunning(); }
 
     const std::string & GetStrError() const { return errorStr; }
     PLUGIN &        GetPlugin() { return m_plugin; }
     const std::string & GetFileName() const { return pluginFileName; }
+    const std::string & GetName() const { return pluginName; }
 
     uint16_t        GetStartPosition() const { return m_plugin.GetStartPosition(); }
     uint16_t        GetStopPosition() const { return m_plugin.GetStopPosition(); }
@@ -85,6 +87,7 @@ private:
                   const SETTINGS & settings);
 
     std::string     pluginFileName;
+    std::string     pluginName;
     void *          libHandle;
 
     PLUGIN &        m_plugin;
index d8b6dc88bf48719a7504a9f08328bdfb08c25973..9ed7ffcf2226b3a6cd76cc1aa773b1602eb16770 100644 (file)
@@ -89,7 +89,7 @@ public:
 
     int                 Start();
     int                 Stop();
-    int                 Reload() { return 0; }
+    int                 Reload(const MODULE_SETTINGS & /*ms*/) { return 0; }
     bool                IsRunning() { return isRunning; }
     void                SetSettings(const MODULE_SETTINGS &) {}
     int                 ParseSettings() { return 0; }
index 8be662e913457bf32b982f8dd578b380aa960fb4..99e0a091819ff873a52708b096c9534c343ef9a9 100644 (file)
@@ -524,6 +524,22 @@ if (ret)
 return ret;
 }
 //-----------------------------------------------------------------------------
+int AUTH_IA::Reload(const MODULE_SETTINGS & ms)
+{
+AUTH_IA_SETTINGS newIaSettings;
+if (newIaSettings.ParseSettings(ms))
+    {
+    printfd(__FILE__, "AUTH_IA::Reload() - Failed to reload InetAccess.\n");
+    logger("AUTH_IA: Cannot reload InetAccess. Errors found.");
+    return -1;
+    }
+
+printfd(__FILE__, "AUTH_IA::Reload() -  Reloaded InetAccess successfully.\n");
+logger("AUTH_IA: Reloaded InetAccess successfully.");
+iaSettings = newIaSettings;
+return 0;
+}
+//-----------------------------------------------------------------------------
 int AUTH_IA::PrepareNet()
 {
 struct sockaddr_in listenAddr;
index 5e454124227d3fe113f137a04db6d9551d86c49a..2b527076edbf607d1bb78272d7a9cdc04673da07 100644 (file)
@@ -247,7 +247,7 @@ public:
 
     int                 Start();
     int                 Stop();
-    int                 Reload() { return 0; }
+    int                 Reload(const MODULE_SETTINGS & ms);
     bool                IsRunning() { return isRunningRunTimeouter || isRunningRun; }
 
     const std::string & GetStrError() const { return errorStr; }
index 83ab3231d5c75fc9b2a5e0fb1d823bdda6d2680d..6ead8f3359f9254c31dc1632f02b71ddaeee967b 100644 (file)
@@ -93,7 +93,7 @@ public:
 
     int                 Start();
     int                 Stop();
-    int                 Reload() { return 0; }
+    int                 Reload(const MODULE_SETTINGS & /*ms*/) { return 0; }
     bool                IsRunning();
     void                SetSettings(const MODULE_SETTINGS & s);
     int                 ParseSettings();
index 6bea457fbe79d4d4a41944aba10b5e933bda02ff..8b1ccb9274341756eae07b516b1bc19d37afbc7f 100644 (file)
@@ -69,7 +69,7 @@ public:
 
     int                 Start();
     int                 Stop();
-    int                 Reload() { return 0; }
+    int                 Reload(const MODULE_SETTINGS & /*ms*/) { return 0; }
     int                 ParseSettings() { return 0; }
     bool                IsRunning();
     const std::string & GetStrError() const;
index bcb8b743619ac4658a49bb130a6b50bd5909a188..7d24403b30b1143aa30ce175df4c2eaaece908cf 100644 (file)
@@ -99,7 +99,7 @@ public:
 
     int             Start();
     int             Stop();
-    int             Reload() { return 0; }
+    int             Reload(const MODULE_SETTINGS & /*ms*/) { return 0; }
     bool            IsRunning() { return runningTCP || runningUDP; }
     const std::string & GetStrError() const { return errorStr; }
     std::string     GetVersion() const { return VERSION; }
index b34f832e5ea5b7706a762edb7ba92b38aeb3b84c..d8f4d6f82428db536a72503e1d45401587b9a538 100644 (file)
@@ -51,7 +51,7 @@ public:
 
     int                 Start();
     int                 Stop();
-    int                 Reload() { return 0; }
+    int                 Reload(const MODULE_SETTINGS & /*ms*/) { return 0; }
     bool                IsRunning() { return isRunning; }
 
     void                SetSettings(const MODULE_SETTINGS & s) { settings = s; }
index 76785ed293ebb55f2116cf2549920371cc21ed39..b9150b8d231281b686017e761399b6ce56e9580c 100644 (file)
@@ -98,7 +98,7 @@ public:
 
     int                 Start();
     int                 Stop();
-    int                 Reload() { return 0; }
+    int                 Reload(const MODULE_SETTINGS & /*ms*/) { return 0; }
     bool                IsRunning() { return isRunning; }
 
     void                SetSettings(const MODULE_SETTINGS & s) { settings = s; }
index 8dfb6c043e741dd7dbbb80ee2ff661becbfdce1c..5bb938feb507a5f10b540cd7aa8355c1d8e0dc6d 100644 (file)
@@ -52,7 +52,7 @@ public:
 
     int                 Start();
     int                 Stop();
-    int                 Reload() { return 0; }
+    int                 Reload(const MODULE_SETTINGS & /*ms*/) { return 0; }
     bool                IsRunning() { return isRunning; }
 
     int                 ParseSettings() { return 0; }
index 39ed5766401bac4228c48dea191f096f4082100a..b7f76b054fa30c6641721ce4d5559c4673ebfbc9 100644 (file)
@@ -47,7 +47,7 @@ public:
 
     int Start();
     int Stop();
-    int Reload() { return 0; }
+    int Reload(const MODULE_SETTINGS & /*ms*/) { return 0; }
     bool IsRunning() { return isRunning; }
 
     int  ParseSettings() { return 0; }
index 871247848e0c1fef4c762493b925c50744f79438..27198073cfc255951df2b920f852e55481d8f6ac 100644 (file)
@@ -51,7 +51,7 @@ public:
 
     int                 Start();
     int                 Stop();
-    int                 Reload() { return 0; }
+    int                 Reload(const MODULE_SETTINGS & /*ms*/) { return 0; }
     bool                IsRunning() { return isRunning; }
 
     void                SetSettings(const MODULE_SETTINGS & s) { settings = s; }
index 72a14f21e028238c558657b2e70c8932aa81e4fc..ce295818d482cdd01986bf944b3e8cd2b699fb0f 100644 (file)
@@ -70,7 +70,7 @@ public:
 
     int                 Start();
     int                 Stop();
-    int                 Reload() { return 0; }
+    int                 Reload(const MODULE_SETTINGS & /*ms*/) { return 0; }
     bool                IsRunning() { return running && !stopped; }
 
     const std::string & GetStrError() const { return errorStr; }
index 287c3813a87a109473aa7c21565eb4888b7d6906..d1fbf24c36a271a93d69bdd035c430722f7ea07b 100644 (file)
@@ -60,7 +60,7 @@ class STG_CONFIG : public PLUGIN
 
         int                 Start();
         int                 Stop();
-        int                 Reload() { return 0; }
+        int                 Reload(const MODULE_SETTINGS & /*ms*/) { return 0; }
         bool                IsRunning() { return isRunning; }
 
         const std::string & GetStrError() const { return errorStr; }
index 29e4974ef4be2779c286ff36dfd82dcc2661e328..cfab1e550b70375ca5bd2edbac624093ab254558 100644 (file)
@@ -112,7 +112,7 @@ public:
 
     int Start();
     int Stop();
-    int Reload() { return 0; }
+    int Reload(const MODULE_SETTINGS & /*ms*/) { return 0; }
     bool IsRunning();
 
     const std::string & GetStrError() const { return errorStr; }
index 742923f0f4fa86840be797a04a16b55a5e3cbac2..52da138ec6eeab1a21c25e71e3e2eed31d14740a 100644 (file)
@@ -56,7 +56,7 @@ public:
 
     int Start();
     int Stop();
-    int Reload() { return 0; }
+    int Reload(const MODULE_SETTINGS & /*ms*/) { return 0; }
     bool IsRunning() { return m_running; }
 
     const std::string& GetStrError() const { return m_error; }
index 928629ad8b007f48bde0e7b4644cb46208e9fc7a..4433dafda702d019ff7da1d405cd330a6ddea92f 100644 (file)
@@ -296,7 +296,7 @@ if (isRunning)
 return 0;
 }
 //-----------------------------------------------------------------------------
-int REMOTE_SCRIPT::Reload()
+int REMOTE_SCRIPT::Reload(const MODULE_SETTINGS & /*ms*/)
 {
 NRMapParser nrMapParser;
 
index e0412fb07501cdc2d2e70da2b269100f41a49ee3..0de1ea2e201a8702bd386aca651bf008da72cb84 100644 (file)
@@ -185,7 +185,7 @@ public:
 
     int                 Start();
     int                 Stop();
-    int                 Reload();
+    int                 Reload(const MODULE_SETTINGS & ms);
     bool                IsRunning() { return isRunning; }
 
     const std::string & GetStrError() const { return errorStr; }
index 9ff739cb0fa43468f8268fb238d0016ecccc29fe..4586807c9c4c6c581fa38466a2e2522573eefe3f 100644 (file)
@@ -269,7 +269,7 @@ printfd(__FILE__, "SMUX::Stop() - After\n");
 return 0;
 }
 
-int SMUX::Reload()
+int SMUX::Reload(const MODULE_SETTINGS & /*ms*/)
 {
 if (Stop())
     return -1;
index e379ea7f7f06261e4cfe64bc2612b83796c2c94b..3b217eb72878cafba22aa532bb129c7e8bbb75e0 100644 (file)
@@ -116,7 +116,7 @@ public:
 
     int Start();
     int Stop();
-    int Reload();
+    int Reload(const MODULE_SETTINGS & ms);
     bool IsRunning() { return running && !stopped; }
 
     const std::string & GetStrError() const { return errorStr; }
index 67b4272f127baffb30e45df902c8e95e9ea956a5..8c728fdc9f4d9938dcd68cb77c4861d8a9afb225 100644 (file)
@@ -119,6 +119,111 @@ SETTINGS_IMPL::SETTINGS_IMPL(const std::string & cd)
 {
 }
 //-----------------------------------------------------------------------------
+SETTINGS_IMPL::SETTINGS_IMPL(const SETTINGS_IMPL & rval)
+    : SETTINGS(),
+      strError(),
+      modulesPath(rval.modulesPath),
+      dirName(rval.dirName),
+      confDir(rval.confDir),
+      scriptsDir(rval.scriptsDir),
+      rules(rval.rules),
+      logFile(rval.logFile),
+      pidFile(rval.pidFile),
+      monitorDir(rval.monitorDir),
+      monitoring(rval.monitoring),
+      detailStatWritePeriod(rval.detailStatWritePeriod),
+      statWritePeriod(rval.statWritePeriod),
+      stgExecMsgKey(rval.stgExecMsgKey),
+      executersNum(rval.executersNum),
+      fullFee(rval.fullFee),
+      dayFee(rval.dayFee),
+      dayResetTraff(rval.dayResetTraff),
+      spreadFee(rval.spreadFee),
+      freeMbAllowInet(rval.freeMbAllowInet),
+      dayFeeIsLastDay(rval.dayFeeIsLastDay),
+      writeFreeMbTraffCost(rval.writeFreeMbTraffCost),
+      showFeeInCash(rval.showFeeInCash),
+      messageTimeout(rval.messageTimeout),
+      feeChargeType(rval.feeChargeType),
+      reconnectOnTariffChange(rval.reconnectOnTariffChange),
+      modulesSettings(rval.modulesSettings),
+      storeModuleSettings(rval.storeModuleSettings),
+      logger(GetStgLogger())
+{
+}
+//-----------------------------------------------------------------------------
+SETTINGS_IMPL & SETTINGS_IMPL::operator=(const SETTINGS_IMPL & rhs)
+{
+    modulesPath = rhs.modulesPath;
+    dirName = rhs.dirName;
+    confDir = rhs.confDir;
+    scriptsDir = rhs.scriptsDir;
+    rules = rhs.rules;
+    logFile = rhs.logFile;
+    pidFile = rhs.pidFile;
+    monitorDir = rhs.monitorDir;
+    scriptParams = rhs.scriptParams;
+    monitoring = rhs.monitoring;
+    detailStatWritePeriod = rhs.detailStatWritePeriod;
+    statWritePeriod = rhs.statWritePeriod;
+    stgExecMsgKey = rhs.stgExecMsgKey;
+    executersNum = rhs.executersNum;
+    fullFee = rhs.fullFee;
+    dayFee = rhs.dayFee;
+    dayResetTraff = rhs.dayResetTraff;
+    spreadFee = rhs.spreadFee;
+    freeMbAllowInet = rhs.freeMbAllowInet;
+    dayFeeIsLastDay = rhs.dayFeeIsLastDay;
+    writeFreeMbTraffCost = rhs.writeFreeMbTraffCost;
+    showFeeInCash = rhs.showFeeInCash;
+    messageTimeout = rhs.messageTimeout;
+    feeChargeType = rhs.feeChargeType;
+    reconnectOnTariffChange = rhs.reconnectOnTariffChange;
+
+    modulesSettings = rhs.modulesSettings;
+    storeModuleSettings = rhs.storeModuleSettings;
+    return *this;
+}
+//-----------------------------------------------------------------------------
+int SETTINGS_IMPL::ParseModuleSettings(const DOTCONFDocumentNode * node, std::vector<PARAM_VALUE> * params)
+{
+const DOTCONFDocumentNode * childNode;
+PARAM_VALUE pv;
+const char * value;
+
+pv.param = node->getName();
+
+if (node->getValue(1))
+    {
+    strError = "Unexpected value \'" + std::string(node->getValue(1)) + "\'.";
+    return -1;
+    }
+
+value = node->getValue(0);
+
+if (!value)
+    {
+    strError = "Module name expected.";
+    return -1;
+    }
+
+childNode = node->getChildNode();
+while (childNode)
+    {
+    pv.param = childNode->getName();
+    int i = 0;
+    while ((value = childNode->getValue(i++)) != NULL)
+        {
+        pv.value.push_back(value);
+        }
+    params->push_back(pv);
+    pv.value.clear();
+    childNode = childNode->getNextNode();
+    }
+
+return 0;
+}
+//-----------------------------------------------------------------------------
 void SETTINGS_IMPL::ErrorCallback(void * data, const char * buf)
 {
     printfd(__FILE__, "SETTINGS_IMPL::ErrorCallback() - %s\n", buf);
index bab818c6ed473d3ce544eb879184481d1a8a696d..68fb9b0de7defa2491da639a429f8384e8d0d0aa 100644 (file)
@@ -25,6 +25,7 @@
 #include <vector>
 
 #include "stg/settings.h"
+#include "stg/common.h"
 #include "stg/module_settings.h"
 #include "stg/ref.h"
 
@@ -42,7 +43,10 @@ class DOTCONFDocumentNode;
 class SETTINGS_IMPL : public SETTINGS {
 public:
     SETTINGS_IMPL(const std::string &);
+    SETTINGS_IMPL(const SETTINGS_IMPL & rhs);
     virtual ~SETTINGS_IMPL() {}
+    SETTINGS_IMPL & operator=(const SETTINGS_IMPL &);
+
     int Reload() { return ReadSettings(); }
     int ReadSettings();
 
@@ -81,6 +85,8 @@ public:
         { return modulesSettings; }
     const std::vector<std::string> & GetScriptParams() const { return scriptParams; }
 
+    int ParseModuleSettings(const DOTCONFDocumentNode * node, std::vector<PARAM_VALUE> * params);
+
 private:
 
     static void ErrorCallback(void * data, const char * buf);
index 5d505307a72302bbddccbe92be280aefdea592a7..d7bc8ea254bd37a6308b6f26a897d1a5a9259193 100644 (file)
@@ -1494,13 +1494,18 @@ else if (!oldValue && newValue && user->IsInetable())
 //-----------------------------------------------------------------------------
 void CHG_TARIFF_NOTIFIER::Notify(const std::string &, const std::string & newTariff)
 {
+STG_LOCKER lock(&user->mutex);
 if (user->settings->GetReconnectOnTariffChange() && user->connected)
     user->Disconnect(false, "Change tariff");
 user->tariff = user->tariffs->FindByName(newTariff);
 if (user->settings->GetReconnectOnTariffChange() &&
     !user->authorizedBy.empty() &&
     user->IsInetable())
+    {
+    // This notifier gets called *before* changing the tariff, and in Connect we want to see new tariff name.
+    user->property.Conf().tariffName = newTariff;
     user->Connect(false);
+    }
 }
 //-----------------------------------------------------------------------------
 void CHG_CASH_NOTIFIER::Notify(const double & oldCash, const double & newCash)
index 115d1fb3907a71e63e2c798cf3f1d18d3cd60a08..e8d625a0f105b1f137c9a64514431e8f7b758c2f 100644 (file)
@@ -44,18 +44,19 @@ private:
     mutable pthread_mutex_t mutex;
 };
 //-----------------------------------------------------------------------------
-class PLUGIN_LOGGER : private STG_LOGGER
+class PLUGIN_LOGGER
 {
-friend PLUGIN_LOGGER GetPluginLogger(const STG_LOGGER & logger, const std::string & pluginName);
+friend PLUGIN_LOGGER GetPluginLogger(const STG_LOGGER& logger, const std::string& pluginName);
 
 public:
-    PLUGIN_LOGGER(const PLUGIN_LOGGER & rhs);
-    void operator()(const char * fmt, ...) const;
-    void operator()(const std::string & line) const;
+    PLUGIN_LOGGER(const PLUGIN_LOGGER& rhs) : m_parent(rhs.m_parent), m_pluginName(rhs.m_pluginName) {}
+    void operator()(const char* fmt, ...) const;
+    void operator()(const std::string& line) const;
 
 private:
     PLUGIN_LOGGER(const STG_LOGGER & logger, const std::string & pn);
-    std::string pluginName;
+    const STG_LOGGER& m_parent;
+    std::string m_pluginName;
 };
 
 PLUGIN_LOGGER GetPluginLogger(const STG_LOGGER & logger, const std::string & pluginName);
index 6289618e9b1895cf662c5c0381151e8bb0e2c1f5..4a4552576da1df7b1536eb55baeef62acb0898af 100644 (file)
@@ -97,18 +97,10 @@ else
     }
 }
 //-----------------------------------------------------------------------------
-PLUGIN_LOGGER::PLUGIN_LOGGER(const STG_LOGGER & logger, const std::string & pn)
-    : STG_LOGGER(),
-      pluginName(pn)
+PLUGIN_LOGGER::PLUGIN_LOGGER(const STG_LOGGER& logger, const std::string& pn)
+    : m_parent(logger),
+      m_pluginName(pn)
 {
-    SetLogFileName(logger.fileName);
-}
-//-----------------------------------------------------------------------------
-PLUGIN_LOGGER::PLUGIN_LOGGER(const PLUGIN_LOGGER & rhs)
-    : STG_LOGGER(),
-      pluginName(rhs.pluginName)
-{
-    SetLogFileName(fileName);
 }
 //-----------------------------------------------------------------------------
 void PLUGIN_LOGGER::operator()(const char * fmt, ...) const
@@ -120,12 +112,12 @@ va_start(vl, fmt);
 vsnprintf(buff, sizeof(buff), fmt, vl);
 va_end(vl);
 
-STG_LOGGER::operator()("[%s] %s", pluginName.c_str(), buff);
+m_parent("[%s] %s", m_pluginName.c_str(), buff);
 }
 //-----------------------------------------------------------------------------
 void PLUGIN_LOGGER::operator()(const std::string & line) const
 {
-STG_LOGGER::operator()("[%s] %s", pluginName.c_str(), line.c_str());
+m_parent("[%s] %s", m_pluginName.c_str(), line.c_str());
 }
 //-----------------------------------------------------------------------------
 PLUGIN_LOGGER GetPluginLogger(const STG_LOGGER & logger, const std::string & pluginName)