]> git.stg.codes - stg.git/blobdiff - projects/stargazer/settings_impl.cpp
Merge branch 'stg-2.409' into stg-2.409-radius
[stg.git] / projects / stargazer / settings_impl.cpp
index a50a0a657ec708f37accbc0d5adfa7ab1d3ad218..c925177ffea8c37089d4adc9ee0f77fa378154dd 100644 (file)
  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-/*
- *    Date: 27.10.2002
- */
-
 /*
  *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
  */
 
 /*
  *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
  */
 
-/*
-$Revision: 1.45 $
-$Date: 2010/08/19 13:42:30 $
-$Author: faust $
-*/
+#include "settings_impl.h"
 
 
+#include "stg/logger.h"
+#include "stg/dotconfpp.h"
+#include "stg/common.h"
+
+#include <stdexcept>
 #include <cstring>
 #include <cerrno>
 #include <cstring>
 #include <cerrno>
-#include <string>
 
 
-#include "stg/logger.h"
-#include "stg/dotconfpp.h"
-#include "settings_impl.h"
+namespace
+{
+
+struct Error : public std::runtime_error
+{
+    Error(const std::string& message) : runtime_error(message) {}
+};
+
+std::vector<std::string> toValues(const DOTCONFDocumentNode& node)
+{
+    std::vector<std::string> values;
+
+    size_t i = 0;
+    const char* value = NULL;
+    while ((value = node.getValue(i++)) != NULL)
+        values.push_back(value);
+
+    return values;
+}
+
+std::vector<PARAM_VALUE> toPVS(const DOTCONFDocumentNode& node)
+{
+    std::vector<PARAM_VALUE> pvs;
+
+    const DOTCONFDocumentNode* child = node.getChildNode();
+    while (child != NULL)
+        {
+        if (child->getName() == NULL)
+            continue;
+
+        if (child->getChildNode() == NULL)
+            pvs.push_back(PARAM_VALUE(child->getName(), toValues(*child)));
+        else
+            pvs.push_back(PARAM_VALUE(child->getName(), toValues(*child), toPVS(*child)));
+
+        child = child->getNextNode();
+        }
+
+    return pvs;
+}
+
+unsigned toPeriod(const char* value)
+{
+    if (value == NULL)
+        throw Error("No detail stat period value.");
+
+    std::string period(value);
+    if (period == "1")
+        return dsPeriod_1;
+    else if (period == "1/2")
+        return dsPeriod_1_2;
+    else if (period == "1/4")
+        return dsPeriod_1_4;
+    else if (period == "1/6")
+        return dsPeriod_1_6;
+
+    throw Error("Invalid detail stat period value: '" + period + "'. Should be one of '1', '1/2', '1/4' or '1/6'.");
+}
+
+}
 
 //-----------------------------------------------------------------------------
 SETTINGS_IMPL::SETTINGS_IMPL(const std::string & cd)
 
 //-----------------------------------------------------------------------------
 SETTINGS_IMPL::SETTINGS_IMPL(const std::string & cd)
@@ -62,8 +115,10 @@ SETTINGS_IMPL::SETTINGS_IMPL(const std::string & cd)
       messageTimeout(0),
       feeChargeType(0),
       reconnectOnTariffChange(false),
       messageTimeout(0),
       feeChargeType(0),
       reconnectOnTariffChange(false),
+      disableSessionLog(false),
       logger(GetStgLogger())
 {
       logger(GetStgLogger())
 {
+    filterParamsLog.push_back("*");
 }
 //-----------------------------------------------------------------------------
 SETTINGS_IMPL::SETTINGS_IMPL(const SETTINGS_IMPL & rval)
 }
 //-----------------------------------------------------------------------------
 SETTINGS_IMPL::SETTINGS_IMPL(const SETTINGS_IMPL & rval)
@@ -93,84 +148,49 @@ SETTINGS_IMPL::SETTINGS_IMPL(const SETTINGS_IMPL & rval)
       messageTimeout(rval.messageTimeout),
       feeChargeType(rval.feeChargeType),
       reconnectOnTariffChange(rval.reconnectOnTariffChange),
       messageTimeout(rval.messageTimeout),
       feeChargeType(rval.feeChargeType),
       reconnectOnTariffChange(rval.reconnectOnTariffChange),
+      disableSessionLog(rval.disableSessionLog),
+      filterParamsLog(rval.filterParamsLog),
       modulesSettings(rval.modulesSettings),
       storeModuleSettings(rval.storeModuleSettings),
       logger(GetStgLogger())
 {
 }
 //-----------------------------------------------------------------------------
       modulesSettings(rval.modulesSettings),
       storeModuleSettings(rval.storeModuleSettings),
       logger(GetStgLogger())
 {
 }
 //-----------------------------------------------------------------------------
-SETTINGS_IMPL & SETTINGS_IMPL::operator=(const SETTINGS_IMPL & set)
+SETTINGS_IMPL & SETTINGS_IMPL::operator=(const SETTINGS_IMPL & rhs)
 {
 {
-    modulesPath = set.modulesPath;
-    dirName = set.dirName;
-    confDir = set.confDir;
-    scriptsDir = set.scriptsDir;
-    rules = set.rules;
-    logFile = set.logFile;
-    pidFile = set.pidFile;
-    monitorDir = set.monitorDir;
-    scriptParams = set.scriptParams;
-    monitoring = set.monitoring;
-    detailStatWritePeriod = set.detailStatWritePeriod;
-    statWritePeriod = set.statWritePeriod;
-    stgExecMsgKey = set.stgExecMsgKey;
-    executersNum = set.executersNum;
-    fullFee = set.fullFee;
-    dayFee = set.dayFee;
-    dayResetTraff = set.dayResetTraff;
-    spreadFee = set.spreadFee;
-    freeMbAllowInet = set.freeMbAllowInet;
-    dayFeeIsLastDay = set.dayFeeIsLastDay;
-    writeFreeMbTraffCost = set.writeFreeMbTraffCost;
-    showFeeInCash = set.showFeeInCash;
-    messageTimeout = set.messageTimeout;
-    feeChargeType = set.feeChargeType;
-    reconnectOnTariffChange = set.reconnectOnTariffChange;
-
-    modulesSettings = set.modulesSettings;
-    storeModuleSettings = set.storeModuleSettings;
+    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;
+    disableSessionLog = rhs.disableSessionLog;
+    filterParamsLog = rhs.filterParamsLog;
+
+    modulesSettings = rhs.modulesSettings;
+    storeModuleSettings = rhs.storeModuleSettings;
     return *this;
 }
 //-----------------------------------------------------------------------------
     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);
 void SETTINGS_IMPL::ErrorCallback(void * data, const char * buf)
 {
     printfd(__FILE__, "SETTINGS_IMPL::ErrorCallback() - %s\n", buf);
@@ -240,11 +260,15 @@ while (node)
 
     if (strcasecmp(node->getName(), "DetailStatWritePeriod") == 0)
         {
 
     if (strcasecmp(node->getName(), "DetailStatWritePeriod") == 0)
         {
-        if (ParseDetailStatWritePeriod(node->getValue(0)) != 0)
-            {
-            strError = "Incorrect DetailStatWritePeriod value: \'" + std::string(node->getValue(0)) + "\'";
+        try
+        {
+            detailStatWritePeriod = toPeriod(node->getValue(0));
+        }
+        catch (const Error& error)
+        {
+            strError = error.what();
             return -1;
             return -1;
-            }
+        }
         }
 
     if (strcasecmp(node->getName(), "StatWritePeriod") == 0)
         }
 
     if (strcasecmp(node->getName(), "StatWritePeriod") == 0)
@@ -385,6 +409,22 @@ while (node)
             }
         }
 
             }
         }
 
+    if (strcasecmp(node->getName(), "DisableSessionLog") == 0)
+        {
+        if (ParseYesNo(node->getValue(0), &disableSessionLog) != 0)
+            {
+            strError = "Incorrect DisableSessionLog value: \'" + std::string(node->getValue(0)) + "\'";
+            return -1;
+            }
+        }
+
+    if (strcasecmp(node->getName(), "FilterParamsLog") == 0)
+        {
+        filterParamsLog.clear();
+        for (int i = 0; node->getValue(i) != NULL; ++i)
+            filterParamsLog.push_back(node->getValue(i));
+        }
+
     if (strcasecmp(node->getName(), "DirNames") == 0)
         {
         const DOTCONFDocumentNode * child = node->getChildNode();
     if (strcasecmp(node->getName(), "DirNames") == 0)
         {
         const DOTCONFDocumentNode * child = node->getChildNode();
@@ -420,8 +460,13 @@ while (node)
             }
         storeModulesCount++;
 
             }
         storeModulesCount++;
 
+        if (node->getValue(0) == NULL)
+            {
+            strError = "No module name in the StoreModule section.";
+            return -1;
+            }
         storeModuleSettings.moduleName = node->getValue(0);
         storeModuleSettings.moduleName = node->getValue(0);
-        ParseModuleSettings(node, &storeModuleSettings.moduleParams);
+        storeModuleSettings.moduleParams = toPVS(*node);
         }
 
     if (strcasecmp(node->getName(), "Modules") == 0)
         }
 
     if (strcasecmp(node->getName(), "Modules") == 0)
@@ -439,13 +484,14 @@ while (node)
                 child = child->getNextNode();
                 continue;
                 }
                 child = child->getNextNode();
                 continue;
                 }
-            MODULE_SETTINGS modSettings;
-            modSettings.moduleParams.clear();
-            modSettings.moduleName = child->getValue();
 
 
-            ParseModuleSettings(child, &modSettings.moduleParams);
+            if (child->getValue(0) == NULL)
+                {
+                strError = "No module name in the Module section.";
+                return -1;
+                }
 
 
-            modulesSettings.push_back(modSettings);
+            modulesSettings.push_back(MODULE_SETTINGS(child->getValue(0), toPVS(*child)));
 
             child = child->getNextNode();
             }
 
             child = child->getNextNode();
             }
@@ -454,9 +500,7 @@ while (node)
     if (strcasecmp(node->getName(), "ScriptParams") == 0)
         {
         for (int i = 0; node->getValue(i) != NULL; ++i)
     if (strcasecmp(node->getName(), "ScriptParams") == 0)
         {
         for (int i = 0; node->getValue(i) != NULL; ++i)
-            {
             scriptParams.push_back(node->getValue(i));
             scriptParams.push_back(node->getValue(i));
-            }
         }
     node = node->getNextNode();
     }
         }
     node = node->getNextNode();
     }
@@ -464,29 +508,3 @@ while (node)
 return 0;
 }
 //-----------------------------------------------------------------------------
 return 0;
 }
 //-----------------------------------------------------------------------------
-int SETTINGS_IMPL::ParseDetailStatWritePeriod(const std::string & detailStatPeriodStr)
-{
-if (detailStatPeriodStr == "1")
-    {
-    detailStatWritePeriod = dsPeriod_1;
-    return 0;
-    }
-else if (detailStatPeriodStr == "1/2")
-    {
-    detailStatWritePeriod = dsPeriod_1_2;
-    return 0;
-    }
-else if (detailStatPeriodStr == "1/4")
-    {
-    detailStatWritePeriod = dsPeriod_1_4;
-    return 0;
-    }
-else if (detailStatPeriodStr == "1/6")
-    {
-    detailStatWritePeriod = dsPeriod_1_6;
-    return 0;
-    }
-
-return -1;
-}
-//-----------------------------------------------------------------------------