X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/f3300c448f21eb61c08284f1e210bd7766da784e..e3e2d6326db86d7ca22d2cba1193aa64a8e33b2d:/projects/stargazer/settings_impl.cpp diff --git a/projects/stargazer/settings_impl.cpp b/projects/stargazer/settings_impl.cpp index 8c728fdc..e85a0886 100644 --- a/projects/stargazer/settings_impl.cpp +++ b/projects/stargazer/settings_impl.cpp @@ -23,17 +23,21 @@ #include "stg/logger.h" #include "stg/dotconfpp.h" #include "stg/common.h" +#include "stg/const.h" #include #include #include +using STG::SettingsImpl; +using STG::ParamValue; + namespace { struct Error : public std::runtime_error { - Error(const std::string& message) : runtime_error(message) {} + explicit Error(const std::string& message) : runtime_error(message) {} }; std::vector toValues(const DOTCONFDocumentNode& node) @@ -48,9 +52,9 @@ std::vector toValues(const DOTCONFDocumentNode& node) return values; } -std::vector toPVS(const DOTCONFDocumentNode& node) +std::vector toPVS(const DOTCONFDocumentNode& node) { - std::vector pvs; + std::vector pvs; const DOTCONFDocumentNode* child = node.getChildNode(); while (child != NULL) @@ -59,9 +63,9 @@ std::vector toPVS(const DOTCONFDocumentNode& node) continue; if (child->getChildNode() == NULL) - pvs.push_back(PARAM_VALUE(child->getName(), toValues(*child))); + pvs.push_back(ParamValue(child->getName(), toValues(*child))); else - pvs.push_back(PARAM_VALUE(child->getName(), toValues(*child), toPVS(*child))); + pvs.push_back(ParamValue(child->getName(), toValues(*child), toPVS(*child))); child = child->getNextNode(); } @@ -76,21 +80,27 @@ unsigned toPeriod(const char* value) std::string period(value); if (period == "1") - return dsPeriod_1; + return STG::dsPeriod_1; else if (period == "1/2") - return dsPeriod_1_2; + return STG::dsPeriod_1_2; else if (period == "1/4") - return dsPeriod_1_4; + return STG::dsPeriod_1_4; else if (period == "1/6") - return dsPeriod_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) +SettingsImpl::SettingsImpl(const std::string & cd) : modulesPath("/usr/lib/stg"), dirName(DIR_NUM), confDir(cd.empty() ? "/etc/stargazer" : cd), @@ -110,128 +120,18 @@ SETTINGS_IMPL::SETTINGS_IMPL(const std::string & cd) spreadFee(false), freeMbAllowInet(false), dayFeeIsLastDay(false), + stopOnError(true), writeFreeMbTraffCost(false), showFeeInCash(true), messageTimeout(0), feeChargeType(0), reconnectOnTariffChange(false), - logger(GetStgLogger()) -{ -} -//----------------------------------------------------------------------------- -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()) + disableSessionLog(false) { + filterParamsLog.push_back("*"); } //----------------------------------------------------------------------------- -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 * 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); - SETTINGS_IMPL * settings = static_cast(data); - settings->logger("%s", buf); -} -//----------------------------------------------------------------------------- -int SETTINGS_IMPL::ReadSettings() +int SettingsImpl::ReadSettings() { const char * requiredOptions[] = { "ModulesPath", @@ -252,7 +152,7 @@ int storeModulesCount = 0; modulesSettings.clear(); DOTCONFDocument conf(DOTCONFDocument::CASEINSENSITIVE); -conf.setErrorCallback(SETTINGS_IMPL::ErrorCallback, this); +conf.setErrorCallback(errorCallback, nullptr); conf.setRequiredOptionNames(requiredOptions); std::string confFile = confDir + "/stargazer.conf"; @@ -262,7 +162,7 @@ if(conf.setContent(confFile.c_str()) != 0) return -1; } -const DOTCONFDocumentNode * node = conf.getFirstNode(); +auto node = conf.getFirstNode(); while (node) { @@ -385,6 +285,15 @@ while (node) } } + 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 (strcasecmp(node->getName(), "WriteFreeMbTraffCost") == 0) { if (ParseYesNo(node->getValue(0), &writeFreeMbTraffCost) != 0) @@ -442,6 +351,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(); @@ -508,7 +433,7 @@ while (node) return -1; } - modulesSettings.push_back(MODULE_SETTINGS(child->getValue(0), toPVS(*child))); + modulesSettings.push_back(ModuleSettings(child->getValue(0), toPVS(*child))); child = child->getNextNode(); } @@ -517,9 +442,7 @@ while (node) if (strcasecmp(node->getName(), "ScriptParams") == 0) { for (int i = 0; node->getValue(i) != NULL; ++i) - { scriptParams.push_back(node->getValue(i)); - } } node = node->getNextNode(); }