From: Maxim Mamontov Date: Tue, 22 Mar 2011 11:55:39 +0000 (+0200) Subject: Split SETTINGS to interface and implementation X-Git-Tag: 2.407-rc3~122 X-Git-Url: https://git.stg.codes/stg.git/commitdiff_plain/321b5c0630ef3b27469a008be31c9fcc131c2c8d Split SETTINGS to interface and implementation --- diff --git a/projects/stargazer/settings.cpp b/projects/stargazer/settings.cpp deleted file mode 100644 index 8af7f7aa..00000000 --- a/projects/stargazer/settings.cpp +++ /dev/null @@ -1,507 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * 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 -#include -#include - -#include "settings.h" -#include "stg_logger.h" -#include "dotconfpp.h" - -using namespace std; - -//----------------------------------------------------------------------------- -SETTINGS::SETTINGS() - : confDir("/etc/stargazer"), - scriptsDir("/etc/stargazer"), - pidFile("/var/run/stargazer.pid"), - 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), - logger(GetStgLogger()) -{ -} -//----------------------------------------------------------------------------- -SETTINGS::SETTINGS(const std::string & cd) - : confDir(cd), - scriptsDir(cd), - 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), - logger(GetStgLogger()) -{ -} -//----------------------------------------------------------------------------- -SETTINGS::SETTINGS(const SETTINGS & rval) - : confDir(rval.confDir), - scriptsDir(rval.scriptsDir), - pidFile(rval.pidFile), - monitoring(rval.monitoring), - detailStatWritePeriod(dsPeriod_1_6), - statWritePeriod(10), - stgExecMsgKey(rval.stgExecMsgKey), - executersNum(rval.executersNum), - fullFee(rval.fullFee), - dayFee(0), - dayResetTraff(0), - spreadFee(rval.spreadFee), - freeMbAllowInet(false), - dayFeeIsLastDay(false), - writeFreeMbTraffCost(false), - showFeeInCash(rval.showFeeInCash), - messageTimeout(rval.messageTimeout), - 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(value, *val)) - { - strError = "Cannot convert \'" + value + "\' to integer."; - return -1; - } -return 0; -} -//----------------------------------------------------------------------------- -int SETTINGS::ParseUnsigned(const string & value, unsigned * val) -{ -if (str2x(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 * 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::ErrorCallback(void * data, const char * buf) -{ - printfd(__FILE__, buf); - SETTINGS * settings = static_cast(data); - settings->logger(buf); -} -//----------------------------------------------------------------------------- -int SETTINGS::ReadSettings() -{ -const char * requiredOptions[] = { - "ModulesPath", - "Modules", - "StoreModule", - "Rules", - "LogFile", - "DetailStatWritePeriod", - "DayFee", - "DayResetTraff", - "SpreadFee", - "FreeMbAllowInet", - "DayFeeIsLastDay", - "WriteFreeMbTraffCost", - NULL - }; -int storeModulesCount = 0; -modulesSettings.clear(); - -DOTCONFDocument conf(DOTCONFDocument::CASEINSENSITIVE); -conf.setErrorCallback(SETTINGS::ErrorCallback, this); -conf.setRequiredOptionNames(requiredOptions); -string confFile = confDir + "/stargazer.conf"; - -if(conf.setContent(confFile.c_str()) != 0) - { - strError = "Cannot read file " + confFile; - return -1; - } - -const DOTCONFDocumentNode * node = conf.getFirstNode(); - -while (node) - { - if (strcasecmp(node->getName(), "ScriptDir") == 0) - { - scriptsDir = node->getValue(0); - } - - if (strcasecmp(node->getName(), "LogFile") == 0) - { - logFile = node->getValue(0); - } - - if (strcasecmp(node->getName(), "PIDFile") == 0) - { - pidFile = node->getValue(0); - } - - if (strcasecmp(node->getName(), "ModulesPath") == 0) - { - modulesPath = node->getValue(0); - } - - if (strcasecmp(node->getName(), "Rules") == 0) - { - rules = node->getValue(0); - } - - if (strcasecmp(node->getName(), "DetailStatWritePeriod") == 0) - { - if (ParseDetailStatWritePeriod(node->getValue(0)) != 0) - { - strError = "Incorrect DetailStatWritePeriod value: \'" + string(node->getValue(0)) + "\'"; - 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)) + "\'"; - return -1; - } - } - - if (strcasecmp(node->getName(), "ExecMsgKey") == 0) - { - if (ParseInt(node->getValue(0), &stgExecMsgKey) != 0) - { - strError = "Incorrect ExecMsgKey value: \'" + string(node->getValue(0)) + "\'"; - return -1; - } - } - - if (strcasecmp(node->getName(), "ExecutersNum") == 0) - { - if (ParseUnsignedInRange(node->getValue(0), 1, 1024, &executersNum) != 0) - { - strError = "Incorrect ExecutersNum value: \'" + string(node->getValue(0)) + "\'"; - return -1; - } - } - - if (strcasecmp(node->getName(), "DayFee") == 0) - { - if (ParseUnsignedInRange(node->getValue(0), 0, 31, &dayFee) != 0) - { - strError = "Incorrect DayFee value: \'" + string(node->getValue(0)) + "\'"; - return -1; - } - } - - if (strcasecmp(node->getName(), "FullFee") == 0) - { - if (ParseYesNo(node->getValue(0), &fullFee) != 0) - { - strError = "Incorrect FullFee value: \'" + string(node->getValue(0)) + "\'"; - return -1; - } - } - - if (strcasecmp(node->getName(), "DayResetTraff") == 0) - { - if (ParseUnsignedInRange(node->getValue(0), 0, 31, &dayResetTraff) != 0) - { - strError = "Incorrect DayResetTraff value: \'" + string(node->getValue(0)) + "\'"; - return -1; - } - } - - if (strcasecmp(node->getName(), "SpreadFee") == 0) - { - if (ParseYesNo(node->getValue(0), &spreadFee) != 0) - { - strError = "Incorrect SpreadFee value: \'" + string(node->getValue(0)) + "\'"; - return -1; - } - } - - if (strcasecmp(node->getName(), "FreeMbAllowInet") == 0) - { - if (ParseYesNo(node->getValue(0), &freeMbAllowInet) != 0) - { - strError = "Incorrect FreeMbAllowInet value: \'" + string(node->getValue(0)) + "\'"; - return -1; - } - } - - if (strcasecmp(node->getName(), "DayFeeIsLastDay") == 0) - { - if (ParseYesNo(node->getValue(0), &dayFeeIsLastDay) != 0) - { - strError = "Incorrect DayFeeIsLastDay value: \'" + string(node->getValue(0)) + "\'"; - return -1; - } - } - - if (strcasecmp(node->getName(), "WriteFreeMbTraffCost") == 0) - { - if (ParseYesNo(node->getValue(0), &writeFreeMbTraffCost) != 0) - { - strError = "Incorrect WriteFreeMbTraffCost value: \'" + string(node->getValue(0)) + "\'"; - return -1; - } - } - - if (strcasecmp(node->getName(), "ShowFeeInCash") == 0) - { - if (ParseYesNo(node->getValue(0), &showFeeInCash) != 0) - { - strError = "Incorrect ShowFeeInCash value: \'" + string(node->getValue(0)) + "\'"; - return -1; - } - } - - if (strcasecmp(node->getName(), "MonitorDir") == 0) - { - monitorDir = node->getValue(0); - struct stat stat; - monitoring = false; - - if (!lstat(monitorDir.c_str(), &stat) && S_ISDIR(stat.st_mode)) - { - monitoring = true; - } - } - - if (strcasecmp(node->getName(), "MessageTimeout") == 0) - { - if (ParseUnsigned(node->getValue(0), &messageTimeout) != 0) - { - strError = "Incorrect MessageTimeout value: \'" + string(node->getValue(0)) + "\'"; - return -1; - } - } - - if (strcasecmp(node->getName(), "DirNames") == 0) - { - const DOTCONFDocumentNode * child = node->getChildNode(); - if (child) - { - const DOTCONFDocumentNode * dirNameNode; - for (int i = 0; i < DIR_NUM; i++) - { - char strDirName[12]; - sprintf(strDirName, "DirName%d", i); - dirNameNode = conf.findNode(strDirName, node); - if (dirNameNode && dirNameNode->getValue(0)) - { - dirName[i] = dirNameNode->getValue(0); - } - } - } - } - - if (strcasecmp(node->getName(), "StoreModule") == 0) - { - if (node->getValue(1)) - { - strError = "Unexpected \'" + string(node->getValue(1)) + "\'."; - return -1; - } - - if (storeModulesCount) - { - strError = "Should be only one StoreModule."; - return -1; - } - storeModulesCount++; - - storeModuleSettings.moduleName = node->getValue(0); - ParseModuleSettings(node, &storeModuleSettings.moduleParams); - } - - if (strcasecmp(node->getName(), "Modules") == 0) - { - if (node->getValue(0)) - { - strError = "Unexpected \'" + string(node->getValue(0)) + "\'."; - return -1; - } - const DOTCONFDocumentNode * child = node->getChildNode(); - while (child) - { - if (strcasecmp(child->getName(), "Module") != 0) - { - child = child->getNextNode(); - continue; - } - MODULE_SETTINGS modSettings; - modSettings.moduleParams.clear(); - modSettings.moduleName = child->getValue(); - - ParseModuleSettings(child, &modSettings.moduleParams); - - modulesSettings.push_back(modSettings); - - child = child->getNextNode(); - } - } - - node = node->getNextNode(); - } - -return 0; -} -//----------------------------------------------------------------------------- -int SETTINGS::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; -} -//----------------------------------------------------------------------------- diff --git a/projects/stargazer/settings.h b/projects/stargazer/settings.h deleted file mode 100644 index 86262808..00000000 --- a/projects/stargazer/settings.h +++ /dev/null @@ -1,145 +0,0 @@ - /* - $Revision: 1.27 $ - $Date: 2010/08/19 13:42:30 $ - $Author: faust $ - */ - -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * Date: 27.10.2002 - */ - -/* - * Author : Boris Mikhailenko - */ - - /* - $Revision: 1.27 $ - $Date: 2010/08/19 13:42:30 $ - */ - - -#ifndef SETTINGS_H -#define SETTINGS_H - -#include -#include - -#include "common.h" -#include "stg_logger.h" -#include "module_settings.h" - -//----------------------------------------------------------------------------- -enum DETAIL_STAT_PERIOD { -dsPeriod_1, -dsPeriod_1_2, -dsPeriod_1_4, -dsPeriod_1_6, -}; -//----------------------------------------------------------------------------- -class STG_LOGGER; -class DOTCONFDocumentNode; -//----------------------------------------------------------------------------- -class SETTINGS { -public: - SETTINGS(); - SETTINGS(const std::string &); - SETTINGS(const SETTINGS &); - virtual ~SETTINGS(); - int Reload() { return ReadSettings(); } - int ReadSettings(); - - std::string GetStrError() const { return strError; } - - int GetExecMsgKey() const { return stgExecMsgKey; } - unsigned GetExecutersNum() const { return executersNum; } - const std::string & GetDirName(int num) const { return dirName[num]; }; - const std::string & GetConfDir() const { return confDir; } - const std::string & GetScriptsDir() const { return scriptsDir; } - const std::string & GetRulesFileName() const { return rules; } - const std::string & GetLogFileName() const { return logFile; } - const std::string & GetPIDFileName() const { return pidFile; } - unsigned GetDetailStatWritePeriod() const - { return detailStatWritePeriod; }; - unsigned GetStatWritePeriod() const { return statWritePeriod * 60; } - unsigned GetDayFee() const { return dayFee; } - bool GetFullFee() const { return fullFee; } - unsigned GetDayResetTraff() const { return dayResetTraff; } - bool GetSpreadFee() const { return spreadFee; } - bool GetFreeMbAllowInet() const { return freeMbAllowInet; } - bool GetDayFeeIsLastDay() const { return dayFeeIsLastDay; } - bool GetWriteFreeMbTraffCost() const - { return writeFreeMbTraffCost; }; - bool GetShowFeeInCash() const { return showFeeInCash; } - const std::string & GetMonitorDir() const { return monitorDir; } - bool GetMonitoring() const { return monitoring; } - unsigned GetMessageTimeout() const { return messageTimeout * 3600 * 24; } - - const std::string & GetModulesPath() const { return modulesPath; } - const MODULE_SETTINGS & GetStoreModuleSettings() const - { return storeModuleSettings; } - const std::vector & GetModulesSettings() const - { return modulesSettings; } - -private: - - int ParseInt(const std::string & value, int * val); - int ParseUnsigned(const std::string & value, unsigned * val); - int ParseIntInRange(const std::string & value, int min, int max, int * val); - int ParseUnsignedInRange(const std::string & value, unsigned min, unsigned max, unsigned * val); - int ParseYesNo(const std::string & value, bool * val); - int ParseDetailStatWritePeriod(const std::string & detailStatPeriodStr); - - int ParseModuleSettings(const DOTCONFDocumentNode * dirNameNode, std::vector * params); - - static void ErrorCallback(void * data, const char * buf); - - std::string strError; - - //////////settings - std::string modulesPath; - std::string dirName[DIR_NUM]; - std::string confDir; - std::string scriptsDir; - std::string rules; - std::string logFile; - std::string pidFile; - std::string monitorDir; - bool monitoring; - unsigned detailStatWritePeriod; - unsigned statWritePeriod; - int stgExecMsgKey; - unsigned executersNum; - bool fullFee; - unsigned dayFee; - unsigned dayResetTraff; - bool spreadFee; - bool freeMbAllowInet; - bool dayFeeIsLastDay; - bool writeFreeMbTraffCost; - bool showFeeInCash; - unsigned messageTimeout; - - std::vector modulesSettings; - MODULE_SETTINGS storeModuleSettings; - - STG_LOGGER & logger; -}; -//----------------------------------------------------------------------------- - -#endif diff --git a/projects/stargazer/settings_impl.cpp b/projects/stargazer/settings_impl.cpp new file mode 100644 index 00000000..8af7f7aa --- /dev/null +++ b/projects/stargazer/settings_impl.cpp @@ -0,0 +1,507 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * 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 +#include +#include + +#include "settings.h" +#include "stg_logger.h" +#include "dotconfpp.h" + +using namespace std; + +//----------------------------------------------------------------------------- +SETTINGS::SETTINGS() + : confDir("/etc/stargazer"), + scriptsDir("/etc/stargazer"), + pidFile("/var/run/stargazer.pid"), + 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), + logger(GetStgLogger()) +{ +} +//----------------------------------------------------------------------------- +SETTINGS::SETTINGS(const std::string & cd) + : confDir(cd), + scriptsDir(cd), + 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), + logger(GetStgLogger()) +{ +} +//----------------------------------------------------------------------------- +SETTINGS::SETTINGS(const SETTINGS & rval) + : confDir(rval.confDir), + scriptsDir(rval.scriptsDir), + pidFile(rval.pidFile), + monitoring(rval.monitoring), + detailStatWritePeriod(dsPeriod_1_6), + statWritePeriod(10), + stgExecMsgKey(rval.stgExecMsgKey), + executersNum(rval.executersNum), + fullFee(rval.fullFee), + dayFee(0), + dayResetTraff(0), + spreadFee(rval.spreadFee), + freeMbAllowInet(false), + dayFeeIsLastDay(false), + writeFreeMbTraffCost(false), + showFeeInCash(rval.showFeeInCash), + messageTimeout(rval.messageTimeout), + 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(value, *val)) + { + strError = "Cannot convert \'" + value + "\' to integer."; + return -1; + } +return 0; +} +//----------------------------------------------------------------------------- +int SETTINGS::ParseUnsigned(const string & value, unsigned * val) +{ +if (str2x(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 * 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::ErrorCallback(void * data, const char * buf) +{ + printfd(__FILE__, buf); + SETTINGS * settings = static_cast(data); + settings->logger(buf); +} +//----------------------------------------------------------------------------- +int SETTINGS::ReadSettings() +{ +const char * requiredOptions[] = { + "ModulesPath", + "Modules", + "StoreModule", + "Rules", + "LogFile", + "DetailStatWritePeriod", + "DayFee", + "DayResetTraff", + "SpreadFee", + "FreeMbAllowInet", + "DayFeeIsLastDay", + "WriteFreeMbTraffCost", + NULL + }; +int storeModulesCount = 0; +modulesSettings.clear(); + +DOTCONFDocument conf(DOTCONFDocument::CASEINSENSITIVE); +conf.setErrorCallback(SETTINGS::ErrorCallback, this); +conf.setRequiredOptionNames(requiredOptions); +string confFile = confDir + "/stargazer.conf"; + +if(conf.setContent(confFile.c_str()) != 0) + { + strError = "Cannot read file " + confFile; + return -1; + } + +const DOTCONFDocumentNode * node = conf.getFirstNode(); + +while (node) + { + if (strcasecmp(node->getName(), "ScriptDir") == 0) + { + scriptsDir = node->getValue(0); + } + + if (strcasecmp(node->getName(), "LogFile") == 0) + { + logFile = node->getValue(0); + } + + if (strcasecmp(node->getName(), "PIDFile") == 0) + { + pidFile = node->getValue(0); + } + + if (strcasecmp(node->getName(), "ModulesPath") == 0) + { + modulesPath = node->getValue(0); + } + + if (strcasecmp(node->getName(), "Rules") == 0) + { + rules = node->getValue(0); + } + + if (strcasecmp(node->getName(), "DetailStatWritePeriod") == 0) + { + if (ParseDetailStatWritePeriod(node->getValue(0)) != 0) + { + strError = "Incorrect DetailStatWritePeriod value: \'" + string(node->getValue(0)) + "\'"; + 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)) + "\'"; + return -1; + } + } + + if (strcasecmp(node->getName(), "ExecMsgKey") == 0) + { + if (ParseInt(node->getValue(0), &stgExecMsgKey) != 0) + { + strError = "Incorrect ExecMsgKey value: \'" + string(node->getValue(0)) + "\'"; + return -1; + } + } + + if (strcasecmp(node->getName(), "ExecutersNum") == 0) + { + if (ParseUnsignedInRange(node->getValue(0), 1, 1024, &executersNum) != 0) + { + strError = "Incorrect ExecutersNum value: \'" + string(node->getValue(0)) + "\'"; + return -1; + } + } + + if (strcasecmp(node->getName(), "DayFee") == 0) + { + if (ParseUnsignedInRange(node->getValue(0), 0, 31, &dayFee) != 0) + { + strError = "Incorrect DayFee value: \'" + string(node->getValue(0)) + "\'"; + return -1; + } + } + + if (strcasecmp(node->getName(), "FullFee") == 0) + { + if (ParseYesNo(node->getValue(0), &fullFee) != 0) + { + strError = "Incorrect FullFee value: \'" + string(node->getValue(0)) + "\'"; + return -1; + } + } + + if (strcasecmp(node->getName(), "DayResetTraff") == 0) + { + if (ParseUnsignedInRange(node->getValue(0), 0, 31, &dayResetTraff) != 0) + { + strError = "Incorrect DayResetTraff value: \'" + string(node->getValue(0)) + "\'"; + return -1; + } + } + + if (strcasecmp(node->getName(), "SpreadFee") == 0) + { + if (ParseYesNo(node->getValue(0), &spreadFee) != 0) + { + strError = "Incorrect SpreadFee value: \'" + string(node->getValue(0)) + "\'"; + return -1; + } + } + + if (strcasecmp(node->getName(), "FreeMbAllowInet") == 0) + { + if (ParseYesNo(node->getValue(0), &freeMbAllowInet) != 0) + { + strError = "Incorrect FreeMbAllowInet value: \'" + string(node->getValue(0)) + "\'"; + return -1; + } + } + + if (strcasecmp(node->getName(), "DayFeeIsLastDay") == 0) + { + if (ParseYesNo(node->getValue(0), &dayFeeIsLastDay) != 0) + { + strError = "Incorrect DayFeeIsLastDay value: \'" + string(node->getValue(0)) + "\'"; + return -1; + } + } + + if (strcasecmp(node->getName(), "WriteFreeMbTraffCost") == 0) + { + if (ParseYesNo(node->getValue(0), &writeFreeMbTraffCost) != 0) + { + strError = "Incorrect WriteFreeMbTraffCost value: \'" + string(node->getValue(0)) + "\'"; + return -1; + } + } + + if (strcasecmp(node->getName(), "ShowFeeInCash") == 0) + { + if (ParseYesNo(node->getValue(0), &showFeeInCash) != 0) + { + strError = "Incorrect ShowFeeInCash value: \'" + string(node->getValue(0)) + "\'"; + return -1; + } + } + + if (strcasecmp(node->getName(), "MonitorDir") == 0) + { + monitorDir = node->getValue(0); + struct stat stat; + monitoring = false; + + if (!lstat(monitorDir.c_str(), &stat) && S_ISDIR(stat.st_mode)) + { + monitoring = true; + } + } + + if (strcasecmp(node->getName(), "MessageTimeout") == 0) + { + if (ParseUnsigned(node->getValue(0), &messageTimeout) != 0) + { + strError = "Incorrect MessageTimeout value: \'" + string(node->getValue(0)) + "\'"; + return -1; + } + } + + if (strcasecmp(node->getName(), "DirNames") == 0) + { + const DOTCONFDocumentNode * child = node->getChildNode(); + if (child) + { + const DOTCONFDocumentNode * dirNameNode; + for (int i = 0; i < DIR_NUM; i++) + { + char strDirName[12]; + sprintf(strDirName, "DirName%d", i); + dirNameNode = conf.findNode(strDirName, node); + if (dirNameNode && dirNameNode->getValue(0)) + { + dirName[i] = dirNameNode->getValue(0); + } + } + } + } + + if (strcasecmp(node->getName(), "StoreModule") == 0) + { + if (node->getValue(1)) + { + strError = "Unexpected \'" + string(node->getValue(1)) + "\'."; + return -1; + } + + if (storeModulesCount) + { + strError = "Should be only one StoreModule."; + return -1; + } + storeModulesCount++; + + storeModuleSettings.moduleName = node->getValue(0); + ParseModuleSettings(node, &storeModuleSettings.moduleParams); + } + + if (strcasecmp(node->getName(), "Modules") == 0) + { + if (node->getValue(0)) + { + strError = "Unexpected \'" + string(node->getValue(0)) + "\'."; + return -1; + } + const DOTCONFDocumentNode * child = node->getChildNode(); + while (child) + { + if (strcasecmp(child->getName(), "Module") != 0) + { + child = child->getNextNode(); + continue; + } + MODULE_SETTINGS modSettings; + modSettings.moduleParams.clear(); + modSettings.moduleName = child->getValue(); + + ParseModuleSettings(child, &modSettings.moduleParams); + + modulesSettings.push_back(modSettings); + + child = child->getNextNode(); + } + } + + node = node->getNextNode(); + } + +return 0; +} +//----------------------------------------------------------------------------- +int SETTINGS::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; +} +//----------------------------------------------------------------------------- diff --git a/projects/stargazer/settings_impl.h b/projects/stargazer/settings_impl.h new file mode 100644 index 00000000..86262808 --- /dev/null +++ b/projects/stargazer/settings_impl.h @@ -0,0 +1,145 @@ + /* + $Revision: 1.27 $ + $Date: 2010/08/19 13:42:30 $ + $Author: faust $ + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * Date: 27.10.2002 + */ + +/* + * Author : Boris Mikhailenko + */ + + /* + $Revision: 1.27 $ + $Date: 2010/08/19 13:42:30 $ + */ + + +#ifndef SETTINGS_H +#define SETTINGS_H + +#include +#include + +#include "common.h" +#include "stg_logger.h" +#include "module_settings.h" + +//----------------------------------------------------------------------------- +enum DETAIL_STAT_PERIOD { +dsPeriod_1, +dsPeriod_1_2, +dsPeriod_1_4, +dsPeriod_1_6, +}; +//----------------------------------------------------------------------------- +class STG_LOGGER; +class DOTCONFDocumentNode; +//----------------------------------------------------------------------------- +class SETTINGS { +public: + SETTINGS(); + SETTINGS(const std::string &); + SETTINGS(const SETTINGS &); + virtual ~SETTINGS(); + int Reload() { return ReadSettings(); } + int ReadSettings(); + + std::string GetStrError() const { return strError; } + + int GetExecMsgKey() const { return stgExecMsgKey; } + unsigned GetExecutersNum() const { return executersNum; } + const std::string & GetDirName(int num) const { return dirName[num]; }; + const std::string & GetConfDir() const { return confDir; } + const std::string & GetScriptsDir() const { return scriptsDir; } + const std::string & GetRulesFileName() const { return rules; } + const std::string & GetLogFileName() const { return logFile; } + const std::string & GetPIDFileName() const { return pidFile; } + unsigned GetDetailStatWritePeriod() const + { return detailStatWritePeriod; }; + unsigned GetStatWritePeriod() const { return statWritePeriod * 60; } + unsigned GetDayFee() const { return dayFee; } + bool GetFullFee() const { return fullFee; } + unsigned GetDayResetTraff() const { return dayResetTraff; } + bool GetSpreadFee() const { return spreadFee; } + bool GetFreeMbAllowInet() const { return freeMbAllowInet; } + bool GetDayFeeIsLastDay() const { return dayFeeIsLastDay; } + bool GetWriteFreeMbTraffCost() const + { return writeFreeMbTraffCost; }; + bool GetShowFeeInCash() const { return showFeeInCash; } + const std::string & GetMonitorDir() const { return monitorDir; } + bool GetMonitoring() const { return monitoring; } + unsigned GetMessageTimeout() const { return messageTimeout * 3600 * 24; } + + const std::string & GetModulesPath() const { return modulesPath; } + const MODULE_SETTINGS & GetStoreModuleSettings() const + { return storeModuleSettings; } + const std::vector & GetModulesSettings() const + { return modulesSettings; } + +private: + + int ParseInt(const std::string & value, int * val); + int ParseUnsigned(const std::string & value, unsigned * val); + int ParseIntInRange(const std::string & value, int min, int max, int * val); + int ParseUnsignedInRange(const std::string & value, unsigned min, unsigned max, unsigned * val); + int ParseYesNo(const std::string & value, bool * val); + int ParseDetailStatWritePeriod(const std::string & detailStatPeriodStr); + + int ParseModuleSettings(const DOTCONFDocumentNode * dirNameNode, std::vector * params); + + static void ErrorCallback(void * data, const char * buf); + + std::string strError; + + //////////settings + std::string modulesPath; + std::string dirName[DIR_NUM]; + std::string confDir; + std::string scriptsDir; + std::string rules; + std::string logFile; + std::string pidFile; + std::string monitorDir; + bool monitoring; + unsigned detailStatWritePeriod; + unsigned statWritePeriod; + int stgExecMsgKey; + unsigned executersNum; + bool fullFee; + unsigned dayFee; + unsigned dayResetTraff; + bool spreadFee; + bool freeMbAllowInet; + bool dayFeeIsLastDay; + bool writeFreeMbTraffCost; + bool showFeeInCash; + unsigned messageTimeout; + + std::vector modulesSettings; + MODULE_SETTINGS storeModuleSettings; + + STG_LOGGER & logger; +}; +//----------------------------------------------------------------------------- + +#endif