X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/c8c881a0df9e718e364af741695f165d6bb3e529..5dfab5bea026e33031d041b233c73e196469b4ac:/projects/stargazer/settings_impl.cpp diff --git a/projects/stargazer/settings_impl.cpp b/projects/stargazer/settings_impl.cpp index ca343bd5..e85a0886 100644 --- a/projects/stargazer/settings_impl.cpp +++ b/projects/stargazer/settings_impl.cpp @@ -14,30 +14,93 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* - * Date: 27.10.2002 - */ - /* * Author : Boris Mikhailenko */ -/* -$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 #include #include -#include -#include "stg/logger.h" -#include "stg/dotconfpp.h" -#include "settings_impl.h" +using STG::SettingsImpl; +using STG::ParamValue; + +namespace +{ + +struct Error : public std::runtime_error +{ + explicit Error(const std::string& message) : runtime_error(message) {} +}; + +std::vector toValues(const DOTCONFDocumentNode& node) +{ + std::vector values; + + size_t i = 0; + const char* value = NULL; + while ((value = node.getValue(i++)) != NULL) + values.push_back(value); + + return values; +} + +std::vector toPVS(const DOTCONFDocumentNode& node) +{ + std::vector 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) +SettingsImpl::SettingsImpl(const std::string & cd) : modulesPath("/usr/lib/stg"), dirName(DIR_NUM), confDir(cd.empty() ? "/etc/stargazer" : cd), @@ -57,131 +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()) + disableSessionLog(false) { + filterParamsLog.push_back("*"); } //----------------------------------------------------------------------------- -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 & set) -{ - if (&set == this) - return *this; - - 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; - 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", @@ -202,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"; @@ -212,7 +162,7 @@ if(conf.setContent(confFile.c_str()) != 0) return -1; } -const DOTCONFDocumentNode * node = conf.getFirstNode(); +auto node = conf.getFirstNode(); while (node) { @@ -243,11 +193,15 @@ while (node) 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; - } + } } if (strcasecmp(node->getName(), "StatWritePeriod") == 0) @@ -331,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) @@ -388,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(); @@ -423,8 +402,13 @@ while (node) } 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) @@ -442,13 +426,14 @@ while (node) 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(); } @@ -457,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(); } @@ -467,29 +450,3 @@ while (node) 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; -} -//-----------------------------------------------------------------------------