#include <cerrno>
#include <string>
-#include "settings.h"
-#include "stg_logger.h"
-#include "dotconfpp.h"
-
-using namespace std;
+#include "stg/logger.h"
+#include "stg/dotconfpp.h"
+#include "settings_impl.h"
//-----------------------------------------------------------------------------
-SETTINGS::SETTINGS()
- : confDir("/etc/stargazer"),
+SETTINGS_IMPL::SETTINGS_IMPL()
+ : SETTINGS(),
+ 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),
writeFreeMbTraffCost(false),
showFeeInCash(true),
messageTimeout(0),
+ feeChargeType(0),
+ reconnectOnTariffChange(false),
+ modulesSettings(),
+ storeModuleSettings(),
logger(GetStgLogger())
{
}
//-----------------------------------------------------------------------------
-SETTINGS::SETTINGS(const std::string & cd)
- : confDir(cd),
+SETTINGS_IMPL::SETTINGS_IMPL(const std::string & cd)
+ : SETTINGS(),
+ strError(),
+ modulesPath("/usr/lib/stg"),
+ dirName(DIR_NUM),
+ confDir(cd),
scriptsDir(cd),
+ rules(cd + "/rules"),
+ logFile("/var/log/stargazer.log"),
+ pidFile("/var/run/stargazer.pid"),
+ monitorDir("/var/stargazer/monitoring"),
monitoring(false),
detailStatWritePeriod(dsPeriod_1_6),
statWritePeriod(10),
writeFreeMbTraffCost(false),
showFeeInCash(true),
messageTimeout(0),
+ feeChargeType(0),
+ reconnectOnTariffChange(false),
+ modulesSettings(),
+ storeModuleSettings(),
logger(GetStgLogger())
{
}
//-----------------------------------------------------------------------------
-SETTINGS::SETTINGS(const SETTINGS & rval)
- : confDir(rval.confDir),
+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(dsPeriod_1_6),
- statWritePeriod(10),
+ detailStatWritePeriod(rval.detailStatWritePeriod),
+ statWritePeriod(rval.statWritePeriod),
stgExecMsgKey(rval.stgExecMsgKey),
executersNum(rval.executersNum),
fullFee(rval.fullFee),
- dayFee(0),
- dayResetTraff(0),
+ dayFee(rval.dayFee),
+ dayResetTraff(rval.dayResetTraff),
spreadFee(rval.spreadFee),
- freeMbAllowInet(false),
- dayFeeIsLastDay(false),
- writeFreeMbTraffCost(false),
+ 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::~SETTINGS()
-{
-}
-//-----------------------------------------------------------------------------
-int SETTINGS::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::ParseInt(const string & value, int * val)
-{
-if (str2x<int>(value, *val))
- {
- strError = "Cannot convert \'" + value + "\' to integer.";
- return -1;
- }
-return 0;
-}
-//-----------------------------------------------------------------------------
-int SETTINGS::ParseUnsigned(const string & value, unsigned * val)
-{
-if (str2x<unsigned>(value, *val))
- {
- strError = "Cannot convert \'" + value + "\' to unsigned integer.";
- return -1;
- }
-return 0;
-}
-//-----------------------------------------------------------------------------
-int SETTINGS::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::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::ParseModuleSettings(const DOTCONFDocumentNode * node, vector<PARAM_VALUE> * params)
+int SETTINGS_IMPL::ParseModuleSettings(const DOTCONFDocumentNode * node, std::vector<PARAM_VALUE> * params)
{
const DOTCONFDocumentNode * childNode;
PARAM_VALUE pv;
if (node->getValue(1))
{
- strError = "Unexpected value \'" + string(node->getValue(1)) + "\'.";
+ strError = "Unexpected value \'" + std::string(node->getValue(1)) + "\'.";
return -1;
}
return 0;
}
//-----------------------------------------------------------------------------
-void SETTINGS::ErrorCallback(void * data, const char * buf)
+void SETTINGS_IMPL::ErrorCallback(void * data, const char * buf)
{
- printfd(__FILE__, buf);
- SETTINGS * settings = static_cast<SETTINGS *>(data);
- settings->logger(buf);
+ printfd(__FILE__, "SETTINGS_IMPL::ErrorCallback() - %s\n", buf);
+ SETTINGS_IMPL * settings = static_cast<SETTINGS_IMPL *>(data);
+ settings->logger("%s", buf);
}
//-----------------------------------------------------------------------------
-int SETTINGS::ReadSettings()
+int SETTINGS_IMPL::ReadSettings()
{
const char * requiredOptions[] = {
"ModulesPath",
modulesSettings.clear();
DOTCONFDocument conf(DOTCONFDocument::CASEINSENSITIVE);
-conf.setErrorCallback(SETTINGS::ErrorCallback, this);
+conf.setErrorCallback(SETTINGS_IMPL::ErrorCallback, this);
conf.setRequiredOptionNames(requiredOptions);
-string confFile = confDir + "/stargazer.conf";
+std::string confFile = confDir + "/stargazer.conf";
if(conf.setContent(confFile.c_str()) != 0)
{
{
if (ParseDetailStatWritePeriod(node->getValue(0)) != 0)
{
- strError = "Incorrect DetailStatWritePeriod value: \'" + string(node->getValue(0)) + "\'";
+ strError = "Incorrect DetailStatWritePeriod value: \'" + std::string(node->getValue(0)) + "\'";
return -1;
}
}
{
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 (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 (child)
{
const DOTCONFDocumentNode * dirNameNode;
+ dirName.reserve(DIR_NUM);
for (int i = 0; i < DIR_NUM; i++)
{
char strDirName[12];
{
if (node->getValue(1))
{
- strError = "Unexpected \'" + string(node->getValue(1)) + "\'.";
+ strError = "Unexpected \'" + std::string(node->getValue(1)) + "\'.";
return -1;
}
{
if (node->getValue(0))
{
- strError = "Unexpected \'" + string(node->getValue(0)) + "\'.";
+ strError = "Unexpected \'" + std::string(node->getValue(0)) + "\'.";
return -1;
}
const DOTCONFDocumentNode * child = node->getChildNode();
}
}
+ 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::ParseDetailStatWritePeriod(const string & detailStatPeriodStr)
+int SETTINGS_IMPL::ParseDetailStatWritePeriod(const std::string & detailStatPeriodStr)
{
if (detailStatPeriodStr == "1")
{