* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-/*
- * Date: 27.10.2002
- */
-
/*
* 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 "stg/const.h"
+
+#include <stdexcept>
#include <cstring>
#include <cerrno>
-#include <string>
-#include "stg/logger.h"
-#include "stg/dotconfpp.h"
-#include "settings_impl.h"
+using STG::SettingsImpl;
+using STG::ParamValue;
-using namespace std;
+namespace
+{
-//-----------------------------------------------------------------------------
-SETTINGS_IMPL::SETTINGS_IMPL()
- : strError(),
- modulesPath("/usr/lib/stg"),
- dirName(DIR_NUM),
- confDir("/etc/stargazer"),
- scriptsDir("/etc/stargazer"),
- rules("/etc/stargazer/rules"),
- logFile("/var/log/stargazer.log"),
- pidFile("/var/run/stargazer.pid"),
- monitorDir("/var/stargazer/monitoring"),
- monitoring(false),
- detailStatWritePeriod(dsPeriod_1_6),
- statWritePeriod(10),
- stgExecMsgKey(5555),
- executersNum(1),
- fullFee(false),
- dayFee(0),
- dayResetTraff(0),
- spreadFee(false),
- freeMbAllowInet(false),
- dayFeeIsLastDay(false),
- writeFreeMbTraffCost(false),
- showFeeInCash(true),
- messageTimeout(0),
- modulesSettings(),
- storeModuleSettings(),
- logger(GetStgLogger())
+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<ParamValue> toPVS(const DOTCONFDocumentNode& node)
+{
+ std::vector<ParamValue> pvs;
+
+ const DOTCONFDocumentNode* child = node.getChildNode();
+ while (child != NULL)
+ {
+ if (child->getName() == NULL)
+ continue;
+
+ if (child->getChildNode() == NULL)
+ pvs.push_back(ParamValue(child->getName(), toValues(*child)));
+ else
+ pvs.push_back(ParamValue(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 STG::dsPeriod_1;
+ else if (period == "1/2")
+ return STG::dsPeriod_1_2;
+ else if (period == "1/4")
+ return STG::dsPeriod_1_4;
+ else if (period == "1/6")
+ return STG::dsPeriod_1_6;
+
+ throw Error("Invalid detail stat period value: '" + period + "'. Should be one of '1', '1/2', '1/4' or '1/6'.");
+}
+
+void errorCallback(void* /*data*/, const char* buf)
+{
+ printfd(__FILE__, "SettingsImpl::errorCallback() - %s\n", buf);
+ STG::Logger::get()("%s", buf);
+}
+
+}
+
//-----------------------------------------------------------------------------
-SETTINGS_IMPL::SETTINGS_IMPL(const std::string & cd)
- : strError(),
- modulesPath("/usr/lib/stg"),
+SettingsImpl::SettingsImpl(const std::string & cd)
+ : modulesPath("/usr/lib/stg"),
dirName(DIR_NUM),
- confDir(cd),
- scriptsDir(cd),
- rules(cd + "/rules"),
+ confDir(cd.empty() ? "/etc/stargazer" : cd),
+ scriptsDir(confDir),
+ rules(confDir + "/rules"),
logFile("/var/log/stargazer.log"),
pidFile("/var/run/stargazer.pid"),
monitorDir("/var/stargazer/monitoring"),
spreadFee(false),
freeMbAllowInet(false),
dayFeeIsLastDay(false),
+ stopOnError(true),
writeFreeMbTraffCost(false),
showFeeInCash(true),
messageTimeout(0),
- modulesSettings(),
- storeModuleSettings(),
- logger(GetStgLogger())
-{
-}
-//-----------------------------------------------------------------------------
-SETTINGS_IMPL::SETTINGS_IMPL(const SETTINGS_IMPL & rval)
- : 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),
- modulesSettings(rval.modulesSettings),
- storeModuleSettings(rval.storeModuleSettings),
- logger(GetStgLogger())
+ feeChargeType(0),
+ reconnectOnTariffChange(false),
+ disableSessionLog(false)
{
+ filterParamsLog.push_back("*");
}
//-----------------------------------------------------------------------------
-int SETTINGS_IMPL::ParseYesNo(const string & value, bool * val)
-{
-if (0 == strcasecmp(value.c_str(), "yes"))
- {
- *val = true;
- return 0;
- }
-if (0 == strcasecmp(value.c_str(), "no"))
- {
- *val = false;
- return 0;
- }
-
-strError = "Incorrect value \'" + value + "\'.";
-return -1;
-}
-//-----------------------------------------------------------------------------
-int SETTINGS_IMPL::ParseInt(const string & value, int * val)
-{
-if (str2x<int>(value, *val))
- {
- strError = "Cannot convert \'" + value + "\' to integer.";
- return -1;
- }
-return 0;
-}
-//-----------------------------------------------------------------------------
-int SETTINGS_IMPL::ParseUnsigned(const string & value, unsigned * val)
-{
-if (str2x<unsigned>(value, *val))
- {
- strError = "Cannot convert \'" + value + "\' to unsigned integer.";
- return -1;
- }
-return 0;
-}
-//-----------------------------------------------------------------------------
-int SETTINGS_IMPL::ParseIntInRange(const string & value, int min, int max, int * val)
-{
-if (ParseInt(value, val) != 0)
- return -1;
-
-if (*val < min || *val > max)
- {
- strError = "Value \'" + value + "\' out of range.";
- return -1;
- }
-
-return 0;
-}
-//-----------------------------------------------------------------------------
-int SETTINGS_IMPL::ParseUnsignedInRange(const string & value, unsigned min, unsigned max, unsigned * val)
-{
-if (ParseUnsigned(value, val) != 0)
- return -1;
-
-if (*val < min || *val > max)
- {
- strError = "Value \'" + value + "\' out of range.";
- return -1;
- }
-
-return 0;
-}
-//-----------------------------------------------------------------------------
-int SETTINGS_IMPL::ParseModuleSettings(const DOTCONFDocumentNode * node, vector<PARAM_VALUE> * params)
-{
-const DOTCONFDocumentNode * childNode;
-PARAM_VALUE pv;
-const char * value;
-
-pv.param = node->getName();
-
-if (node->getValue(1))
- {
- strError = "Unexpected value \'" + 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);
- SETTINGS_IMPL * settings = static_cast<SETTINGS_IMPL *>(data);
- settings->logger("%s", buf);
-}
-//-----------------------------------------------------------------------------
-int SETTINGS_IMPL::ReadSettings()
+int SettingsImpl::ReadSettings()
{
const char * requiredOptions[] = {
"ModulesPath",
modulesSettings.clear();
DOTCONFDocument conf(DOTCONFDocument::CASEINSENSITIVE);
-conf.setErrorCallback(SETTINGS_IMPL::ErrorCallback, this);
+conf.setErrorCallback(errorCallback, nullptr);
conf.setRequiredOptionNames(requiredOptions);
-string confFile = confDir + "/stargazer.conf";
+std::string confFile = confDir + "/stargazer.conf";
if(conf.setContent(confFile.c_str()) != 0)
{
return -1;
}
-const DOTCONFDocumentNode * node = conf.getFirstNode();
+auto node = conf.getFirstNode();
while (node)
{
if (strcasecmp(node->getName(), "DetailStatWritePeriod") == 0)
{
- if (ParseDetailStatWritePeriod(node->getValue(0)) != 0)
- {
- strError = "Incorrect DetailStatWritePeriod value: \'" + string(node->getValue(0)) + "\'";
+ try
+ {
+ detailStatWritePeriod = toPeriod(node->getValue(0));
+ }
+ catch (const Error& error)
+ {
+ strError = error.what();
return -1;
- }
+ }
}
if (strcasecmp(node->getName(), "StatWritePeriod") == 0)
{
if (ParseUnsignedInRange(node->getValue(0), 1, 1440, &statWritePeriod) != 0)
{
- strError = "Incorrect StatWritePeriod value: \'" + string(node->getValue(0)) + "\'";
+ strError = "Incorrect StatWritePeriod value: \'" + std::string(node->getValue(0)) + "\'";
return -1;
}
}
{
if (ParseInt(node->getValue(0), &stgExecMsgKey) != 0)
{
- strError = "Incorrect ExecMsgKey value: \'" + string(node->getValue(0)) + "\'";
+ strError = "Incorrect ExecMsgKey value: \'" + std::string(node->getValue(0)) + "\'";
return -1;
}
}
{
if (ParseUnsignedInRange(node->getValue(0), 1, 1024, &executersNum) != 0)
{
- strError = "Incorrect ExecutersNum value: \'" + string(node->getValue(0)) + "\'";
+ strError = "Incorrect ExecutersNum value: \'" + std::string(node->getValue(0)) + "\'";
return -1;
}
}
{
if (ParseUnsignedInRange(node->getValue(0), 0, 31, &dayFee) != 0)
{
- strError = "Incorrect DayFee value: \'" + string(node->getValue(0)) + "\'";
+ strError = "Incorrect DayFee value: \'" + std::string(node->getValue(0)) + "\'";
return -1;
}
}
{
if (ParseYesNo(node->getValue(0), &fullFee) != 0)
{
- strError = "Incorrect FullFee value: \'" + string(node->getValue(0)) + "\'";
+ strError = "Incorrect FullFee value: \'" + std::string(node->getValue(0)) + "\'";
return -1;
}
}
{
if (ParseUnsignedInRange(node->getValue(0), 0, 31, &dayResetTraff) != 0)
{
- strError = "Incorrect DayResetTraff value: \'" + string(node->getValue(0)) + "\'";
+ strError = "Incorrect DayResetTraff value: \'" + std::string(node->getValue(0)) + "\'";
return -1;
}
}
{
if (ParseYesNo(node->getValue(0), &spreadFee) != 0)
{
- strError = "Incorrect SpreadFee value: \'" + string(node->getValue(0)) + "\'";
+ strError = "Incorrect SpreadFee value: \'" + std::string(node->getValue(0)) + "\'";
return -1;
}
}
{
if (ParseYesNo(node->getValue(0), &freeMbAllowInet) != 0)
{
- strError = "Incorrect FreeMbAllowInet value: \'" + string(node->getValue(0)) + "\'";
+ strError = "Incorrect FreeMbAllowInet value: \'" + std::string(node->getValue(0)) + "\'";
return -1;
}
}
{
if (ParseYesNo(node->getValue(0), &dayFeeIsLastDay) != 0)
{
- strError = "Incorrect DayFeeIsLastDay value: \'" + string(node->getValue(0)) + "\'";
+ strError = "Incorrect DayFeeIsLastDay value: \'" + std::string(node->getValue(0)) + "\'";
+ return -1;
+ }
+ }
+
+ if (strcasecmp(node->getName(), "StopOnError") == 0)
+ {
+ if (ParseYesNo(node->getValue(0), &stopOnError) != 0)
+ {
+ strError = "Incorrect StopOnError value: \'" + std::string(node->getValue(0)) + "\'";
return -1;
}
}
{
if (ParseYesNo(node->getValue(0), &writeFreeMbTraffCost) != 0)
{
- strError = "Incorrect WriteFreeMbTraffCost value: \'" + string(node->getValue(0)) + "\'";
+ strError = "Incorrect WriteFreeMbTraffCost value: \'" + std::string(node->getValue(0)) + "\'";
return -1;
}
}
{
if (ParseYesNo(node->getValue(0), &showFeeInCash) != 0)
{
- strError = "Incorrect ShowFeeInCash value: \'" + string(node->getValue(0)) + "\'";
+ strError = "Incorrect ShowFeeInCash value: \'" + std::string(node->getValue(0)) + "\'";
return -1;
}
}
{
if (ParseUnsigned(node->getValue(0), &messageTimeout) != 0)
{
- strError = "Incorrect MessageTimeout value: \'" + string(node->getValue(0)) + "\'";
+ strError = "Incorrect MessageTimeout value: \'" + std::string(node->getValue(0)) + "\'";
+ return -1;
+ }
+ }
+
+ if (strcasecmp(node->getName(), "FeeChargeType") == 0)
+ {
+ if (ParseUnsignedInRange(node->getValue(0), 0, 3, &feeChargeType) != 0)
+ {
+ strError = "Incorrect FeeChargeType value: \'" + std::string(node->getValue(0)) + "\'";
+ return -1;
+ }
+ }
+
+ if (strcasecmp(node->getName(), "ReconnectOnTariffChange") == 0)
+ {
+ if (ParseYesNo(node->getValue(0), &reconnectOnTariffChange) != 0)
+ {
+ strError = "Incorrect ReconnectOnTariffChange value: \'" + std::string(node->getValue(0)) + "\'";
return -1;
}
}
+ 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 (node->getValue(1))
{
- strError = "Unexpected \'" + string(node->getValue(1)) + "\'.";
+ strError = "Unexpected \'" + std::string(node->getValue(1)) + "\'.";
return -1;
}
}
storeModulesCount++;
+ if (node->getValue(0) == NULL)
+ {
+ strError = "No module name in the StoreModule section.";
+ return -1;
+ }
storeModuleSettings.moduleName = node->getValue(0);
- ParseModuleSettings(node, &storeModuleSettings.moduleParams);
+ storeModuleSettings.moduleParams = toPVS(*node);
}
if (strcasecmp(node->getName(), "Modules") == 0)
{
if (node->getValue(0))
{
- strError = "Unexpected \'" + string(node->getValue(0)) + "\'.";
+ strError = "Unexpected \'" + std::string(node->getValue(0)) + "\'.";
return -1;
}
const DOTCONFDocumentNode * child = node->getChildNode();
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(ModuleSettings(child->getValue(0), toPVS(*child)));
child = child->getNextNode();
}
}
+ if (strcasecmp(node->getName(), "ScriptParams") == 0)
+ {
+ for (int i = 0; node->getValue(i) != NULL; ++i)
+ scriptParams.push_back(node->getValue(i));
+ }
node = node->getNextNode();
}
return 0;
}
//-----------------------------------------------------------------------------
-int SETTINGS_IMPL::ParseDetailStatWritePeriod(const 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;
-}
-//-----------------------------------------------------------------------------