2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; either version 2 of the License, or
5 * (at your option) any later version.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 * Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
27 $Date: 2010/08/19 13:42:30 $
35 #include "stg/logger.h"
36 #include "stg/dotconfpp.h"
37 #include "settings_impl.h"
39 //-----------------------------------------------------------------------------
40 SETTINGS_IMPL::SETTINGS_IMPL(const std::string & cd)
41 : modulesPath("/usr/lib/stg"),
43 confDir(cd.empty() ? "/etc/stargazer" : cd),
45 rules(confDir + "/rules"),
46 logFile("/var/log/stargazer.log"),
47 pidFile("/var/run/stargazer.pid"),
48 monitorDir("/var/stargazer/monitoring"),
50 detailStatWritePeriod(dsPeriod_1_6),
58 freeMbAllowInet(false),
59 dayFeeIsLastDay(false),
60 writeFreeMbTraffCost(false),
64 reconnectOnTariffChange(false),
65 logger(GetStgLogger())
68 //-----------------------------------------------------------------------------
69 SETTINGS_IMPL::SETTINGS_IMPL(const SETTINGS_IMPL & rval)
72 modulesPath(rval.modulesPath),
73 dirName(rval.dirName),
74 confDir(rval.confDir),
75 scriptsDir(rval.scriptsDir),
77 logFile(rval.logFile),
78 pidFile(rval.pidFile),
79 monitorDir(rval.monitorDir),
80 monitoring(rval.monitoring),
81 detailStatWritePeriod(rval.detailStatWritePeriod),
82 statWritePeriod(rval.statWritePeriod),
83 stgExecMsgKey(rval.stgExecMsgKey),
84 executersNum(rval.executersNum),
85 fullFee(rval.fullFee),
87 dayResetTraff(rval.dayResetTraff),
88 spreadFee(rval.spreadFee),
89 freeMbAllowInet(rval.freeMbAllowInet),
90 dayFeeIsLastDay(rval.dayFeeIsLastDay),
91 writeFreeMbTraffCost(rval.writeFreeMbTraffCost),
92 showFeeInCash(rval.showFeeInCash),
93 messageTimeout(rval.messageTimeout),
94 feeChargeType(rval.feeChargeType),
95 reconnectOnTariffChange(rval.reconnectOnTariffChange),
96 modulesSettings(rval.modulesSettings),
97 storeModuleSettings(rval.storeModuleSettings),
98 logger(GetStgLogger())
101 //-----------------------------------------------------------------------------
102 SETTINGS_IMPL & SETTINGS_IMPL::operator=(const SETTINGS_IMPL & set)
107 modulesPath = set.modulesPath;
108 dirName = set.dirName;
109 confDir = set.confDir;
110 scriptsDir = set.scriptsDir;
112 logFile = set.logFile;
113 pidFile = set.pidFile;
114 monitorDir = set.monitorDir;
115 scriptParams = set.scriptParams;
116 monitoring = set.monitoring;
117 detailStatWritePeriod = set.detailStatWritePeriod;
118 statWritePeriod = set.statWritePeriod;
119 stgExecMsgKey = set.stgExecMsgKey;
120 executersNum = set.executersNum;
121 fullFee = set.fullFee;
123 dayResetTraff = set.dayResetTraff;
124 spreadFee = set.spreadFee;
125 freeMbAllowInet = set.freeMbAllowInet;
126 dayFeeIsLastDay = set.dayFeeIsLastDay;
127 writeFreeMbTraffCost = set.writeFreeMbTraffCost;
128 showFeeInCash = set.showFeeInCash;
129 messageTimeout = set.messageTimeout;
130 feeChargeType = set.feeChargeType;
131 reconnectOnTariffChange = set.reconnectOnTariffChange;
133 modulesSettings = set.modulesSettings;
134 storeModuleSettings = set.storeModuleSettings;
137 //-----------------------------------------------------------------------------
138 int SETTINGS_IMPL::ParseModuleSettings(const DOTCONFDocumentNode * node, std::vector<PARAM_VALUE> * params)
140 const DOTCONFDocumentNode * childNode;
144 pv.param = node->getName();
146 if (node->getValue(1))
148 strError = "Unexpected value \'" + std::string(node->getValue(1)) + "\'.";
152 value = node->getValue(0);
156 strError = "Module name expected.";
160 childNode = node->getChildNode();
163 pv.param = childNode->getName();
165 while ((value = childNode->getValue(i++)) != NULL)
167 pv.value.push_back(value);
169 params->push_back(pv);
171 childNode = childNode->getNextNode();
176 //-----------------------------------------------------------------------------
177 void SETTINGS_IMPL::ErrorCallback(void * data, const char * buf)
179 printfd(__FILE__, "SETTINGS_IMPL::ErrorCallback() - %s\n", buf);
180 SETTINGS_IMPL * settings = static_cast<SETTINGS_IMPL *>(data);
181 settings->logger("%s", buf);
183 //-----------------------------------------------------------------------------
184 int SETTINGS_IMPL::ReadSettings()
186 const char * requiredOptions[] = {
192 "DetailStatWritePeriod",
198 "WriteFreeMbTraffCost",
201 int storeModulesCount = 0;
202 modulesSettings.clear();
204 DOTCONFDocument conf(DOTCONFDocument::CASEINSENSITIVE);
205 conf.setErrorCallback(SETTINGS_IMPL::ErrorCallback, this);
206 conf.setRequiredOptionNames(requiredOptions);
207 std::string confFile = confDir + "/stargazer.conf";
209 if(conf.setContent(confFile.c_str()) != 0)
211 strError = "Cannot read file " + confFile;
215 const DOTCONFDocumentNode * node = conf.getFirstNode();
219 if (strcasecmp(node->getName(), "ScriptDir") == 0)
221 scriptsDir = node->getValue(0);
224 if (strcasecmp(node->getName(), "LogFile") == 0)
226 logFile = node->getValue(0);
229 if (strcasecmp(node->getName(), "PIDFile") == 0)
231 pidFile = node->getValue(0);
234 if (strcasecmp(node->getName(), "ModulesPath") == 0)
236 modulesPath = node->getValue(0);
239 if (strcasecmp(node->getName(), "Rules") == 0)
241 rules = node->getValue(0);
244 if (strcasecmp(node->getName(), "DetailStatWritePeriod") == 0)
246 if (ParseDetailStatWritePeriod(node->getValue(0)) != 0)
248 strError = "Incorrect DetailStatWritePeriod value: \'" + std::string(node->getValue(0)) + "\'";
253 if (strcasecmp(node->getName(), "StatWritePeriod") == 0)
255 if (ParseUnsignedInRange(node->getValue(0), 1, 1440, &statWritePeriod) != 0)
257 strError = "Incorrect StatWritePeriod value: \'" + std::string(node->getValue(0)) + "\'";
262 if (strcasecmp(node->getName(), "ExecMsgKey") == 0)
264 if (ParseInt(node->getValue(0), &stgExecMsgKey) != 0)
266 strError = "Incorrect ExecMsgKey value: \'" + std::string(node->getValue(0)) + "\'";
271 if (strcasecmp(node->getName(), "ExecutersNum") == 0)
273 if (ParseUnsignedInRange(node->getValue(0), 1, 1024, &executersNum) != 0)
275 strError = "Incorrect ExecutersNum value: \'" + std::string(node->getValue(0)) + "\'";
280 if (strcasecmp(node->getName(), "DayFee") == 0)
282 if (ParseUnsignedInRange(node->getValue(0), 0, 31, &dayFee) != 0)
284 strError = "Incorrect DayFee value: \'" + std::string(node->getValue(0)) + "\'";
289 if (strcasecmp(node->getName(), "FullFee") == 0)
291 if (ParseYesNo(node->getValue(0), &fullFee) != 0)
293 strError = "Incorrect FullFee value: \'" + std::string(node->getValue(0)) + "\'";
298 if (strcasecmp(node->getName(), "DayResetTraff") == 0)
300 if (ParseUnsignedInRange(node->getValue(0), 0, 31, &dayResetTraff) != 0)
302 strError = "Incorrect DayResetTraff value: \'" + std::string(node->getValue(0)) + "\'";
307 if (strcasecmp(node->getName(), "SpreadFee") == 0)
309 if (ParseYesNo(node->getValue(0), &spreadFee) != 0)
311 strError = "Incorrect SpreadFee value: \'" + std::string(node->getValue(0)) + "\'";
316 if (strcasecmp(node->getName(), "FreeMbAllowInet") == 0)
318 if (ParseYesNo(node->getValue(0), &freeMbAllowInet) != 0)
320 strError = "Incorrect FreeMbAllowInet value: \'" + std::string(node->getValue(0)) + "\'";
325 if (strcasecmp(node->getName(), "DayFeeIsLastDay") == 0)
327 if (ParseYesNo(node->getValue(0), &dayFeeIsLastDay) != 0)
329 strError = "Incorrect DayFeeIsLastDay value: \'" + std::string(node->getValue(0)) + "\'";
334 if (strcasecmp(node->getName(), "WriteFreeMbTraffCost") == 0)
336 if (ParseYesNo(node->getValue(0), &writeFreeMbTraffCost) != 0)
338 strError = "Incorrect WriteFreeMbTraffCost value: \'" + std::string(node->getValue(0)) + "\'";
343 if (strcasecmp(node->getName(), "ShowFeeInCash") == 0)
345 if (ParseYesNo(node->getValue(0), &showFeeInCash) != 0)
347 strError = "Incorrect ShowFeeInCash value: \'" + std::string(node->getValue(0)) + "\'";
352 if (strcasecmp(node->getName(), "MonitorDir") == 0)
354 monitorDir = node->getValue(0);
358 if (!lstat(monitorDir.c_str(), &stat) && S_ISDIR(stat.st_mode))
364 if (strcasecmp(node->getName(), "MessageTimeout") == 0)
366 if (ParseUnsigned(node->getValue(0), &messageTimeout) != 0)
368 strError = "Incorrect MessageTimeout value: \'" + std::string(node->getValue(0)) + "\'";
373 if (strcasecmp(node->getName(), "FeeChargeType") == 0)
375 if (ParseUnsignedInRange(node->getValue(0), 0, 3, &feeChargeType) != 0)
377 strError = "Incorrect FeeChargeType value: \'" + std::string(node->getValue(0)) + "\'";
382 if (strcasecmp(node->getName(), "ReconnectOnTariffChange") == 0)
384 if (ParseYesNo(node->getValue(0), &reconnectOnTariffChange) != 0)
386 strError = "Incorrect ReconnectOnTariffChange value: \'" + std::string(node->getValue(0)) + "\'";
391 if (strcasecmp(node->getName(), "DirNames") == 0)
393 const DOTCONFDocumentNode * child = node->getChildNode();
396 const DOTCONFDocumentNode * dirNameNode;
397 dirName.reserve(DIR_NUM);
398 for (int i = 0; i < DIR_NUM; i++)
401 sprintf(strDirName, "DirName%d", i);
402 dirNameNode = conf.findNode(strDirName, node);
403 if (dirNameNode && dirNameNode->getValue(0))
405 dirName[i] = dirNameNode->getValue(0);
411 if (strcasecmp(node->getName(), "StoreModule") == 0)
413 if (node->getValue(1))
415 strError = "Unexpected \'" + std::string(node->getValue(1)) + "\'.";
419 if (storeModulesCount)
421 strError = "Should be only one StoreModule.";
426 storeModuleSettings.moduleName = node->getValue(0);
427 ParseModuleSettings(node, &storeModuleSettings.moduleParams);
430 if (strcasecmp(node->getName(), "Modules") == 0)
432 if (node->getValue(0))
434 strError = "Unexpected \'" + std::string(node->getValue(0)) + "\'.";
437 const DOTCONFDocumentNode * child = node->getChildNode();
440 if (strcasecmp(child->getName(), "Module") != 0)
442 child = child->getNextNode();
445 MODULE_SETTINGS modSettings;
446 modSettings.moduleParams.clear();
447 modSettings.moduleName = child->getValue();
449 ParseModuleSettings(child, &modSettings.moduleParams);
451 modulesSettings.push_back(modSettings);
453 child = child->getNextNode();
457 if (strcasecmp(node->getName(), "ScriptParams") == 0)
459 for (int i = 0; node->getValue(i) != NULL; ++i)
461 scriptParams.push_back(node->getValue(i));
464 node = node->getNextNode();
469 //-----------------------------------------------------------------------------
470 int SETTINGS_IMPL::ParseDetailStatWritePeriod(const std::string & detailStatPeriodStr)
472 if (detailStatPeriodStr == "1")
474 detailStatWritePeriod = dsPeriod_1;
477 else if (detailStatPeriodStr == "1/2")
479 detailStatWritePeriod = dsPeriod_1_2;
482 else if (detailStatPeriodStr == "1/4")
484 detailStatWritePeriod = dsPeriod_1_4;
487 else if (detailStatPeriodStr == "1/6")
489 detailStatWritePeriod = dsPeriod_1_6;
495 //-----------------------------------------------------------------------------