Refactor how Application objects work.

This commit is contained in:
Gunnar Beutner 2013-09-10 16:03:36 +02:00
parent dc0f2e2fa9
commit 15fae2bf2a
9 changed files with 161 additions and 119 deletions

View File

@ -19,6 +19,7 @@
#include "config/configcompilercontext.h" #include "config/configcompilercontext.h"
#include "config/configcompiler.h" #include "config/configcompiler.h"
#include "config/configitembuilder.h"
#include "base/application.h" #include "base/application.h"
#include "base/logger_fwd.h" #include "base/logger_fwd.h"
#include "base/timer.h" #include "base/timer.h"
@ -200,6 +201,9 @@ int main(int argc, char **argv)
#endif /* ICINGA_PKGDATADIR */ #endif /* ICINGA_PKGDATADIR */
Application::SetStatePath(Application::GetLocalStateDir() + "/lib/icinga2/icinga2.state"); Application::SetStatePath(Application::GetLocalStateDir() + "/lib/icinga2/icinga2.state");
Application::SetPidPath(Application::GetLocalStateDir() + "/run/icinga2/icinga2.pid");
Application::SetApplicationType("IcingaApplication");
po::options_description desc("Supported options"); po::options_description desc("Supported options");
desc.add_options() desc.add_options()
@ -319,8 +323,20 @@ int main(int argc, char **argv)
Application::Ptr app = Application::GetInstance(); Application::Ptr app = Application::GetInstance();
if (!app) if (app) {
BOOST_THROW_EXCEPTION(std::runtime_error("Configuration must create an Application object.")); Log(LogCritical, "icinga-app", "You must not manually create an Application object.");
return EXIT_FAILURE;
}
ConfigItemBuilder::Ptr builder = boost::make_shared<ConfigItemBuilder>();
builder->SetType(Application::GetApplicationType());
builder->SetName("application");
ConfigItem::Ptr item = builder->Compile();
item->Register();
DynamicObject::Ptr dobj = item->Commit();
dobj->OnConfigLoaded();
dobj->Start();
app = static_pointer_cast<Application>(dobj);
#ifndef _WIN32 #ifndef _WIN32
struct sigaction sa; struct sigaction sa;

View File

@ -472,6 +472,8 @@ int Application::Run(void)
SetConsoleCtrlHandler(&Application::CtrlHandler, TRUE); SetConsoleCtrlHandler(&Application::CtrlHandler, TRUE);
#endif /* _WIN32 */ #endif /* _WIN32 */
UpdatePidFile(GetPidPath());
result = Main(); result = Main();
if (m_Restarting) { if (m_Restarting) {
@ -646,7 +648,7 @@ String Application::GetStatePath(void)
} }
/** /**
* Sets the path for the package data dir. * Sets the path for the state file.
* *
* @param path The new path. * @param path The new path.
*/ */
@ -655,6 +657,46 @@ void Application::SetStatePath(const String& path)
ScriptVariable::Set("IcingaStatePath", path); ScriptVariable::Set("IcingaStatePath", path);
} }
/**
* Retrieves the path for the PID file.
*
* @returns The path.
*/
String Application::GetPidPath(void)
{
return ScriptVariable::Get("IcingaPidPath");
}
/**
* Sets the path for the PID file.
*
* @param path The new path.
*/
void Application::SetPidPath(const String& path)
{
ScriptVariable::Set("IcingaPidPath", path);
}
/**
* Retrieves the name of the Application type.
*
* @returns The name.
*/
String Application::GetApplicationType(void)
{
return ScriptVariable::Get("ApplicationType");
}
/**
* Sets the name of the Application type.
*
* @param path The new type name.
*/
void Application::SetApplicationType(const String& type)
{
ScriptVariable::Set("ApplicationType", type);
}
/** /**
* Returns the global thread pool. * Returns the global thread pool.
* *

View File

@ -84,6 +84,12 @@ public:
static String GetStatePath(void); static String GetStatePath(void);
static void SetStatePath(const String& path); static void SetStatePath(const String& path);
static String GetPidPath(void);
static void SetPidPath(const String& path);
static String GetApplicationType(void);
static void SetApplicationType(const String& type);
static ThreadPool& GetTP(void); static ThreadPool& GetTP(void);
protected: protected:

View File

@ -22,7 +22,7 @@
using namespace icinga; using namespace icinga;
Registry<String> ScriptVariable::m_Registry; Registry<Value> ScriptVariable::m_Registry;
Value ScriptVariable::Get(const String& name) Value ScriptVariable::Get(const String& name)
{ {

View File

@ -39,7 +39,7 @@ public:
static void Set(const String& name, const Value& value); static void Set(const String& name, const Value& value);
private: private:
static Registry<String> m_Registry; static Registry<Value> m_Registry;
}; };
} }

View File

@ -616,15 +616,15 @@ static const yytype_int8 yyrhs[] =
static const yytype_uint16 yyrline[] = static const yytype_uint16 yyrline[] =
{ {
0, 152, 152, 153, 156, 156, 156, 156, 156, 159, 0, 152, 152, 153, 156, 156, 156, 156, 156, 159,
164, 170, 176, 183, 184, 191, 190, 220, 223, 230, 164, 170, 176, 192, 193, 200, 199, 229, 232, 239,
229, 241, 242, 244, 245, 246, 249, 254, 259, 266, 238, 250, 251, 253, 254, 255, 258, 263, 268, 275,
274, 283, 284, 291, 292, 293, 294, 295, 296, 297, 283, 292, 293, 300, 301, 302, 303, 304, 305, 306,
304, 304, 345, 346, 351, 352, 355, 362, 365, 371, 313, 313, 354, 355, 360, 361, 364, 371, 374, 380,
384, 387, 393, 399, 403, 409, 412, 418, 430, 436, 393, 396, 402, 408, 412, 418, 421, 427, 439, 445,
450, 451, 452, 453, 454, 460, 466, 470, 476, 479, 459, 460, 461, 462, 463, 469, 475, 479, 485, 488,
494, 514, 519, 523, 527, 537, 542, 547, 551, 556, 503, 523, 528, 532, 536, 546, 551, 556, 560, 565,
563, 567, 571, 575, 579, 583, 587, 591, 597, 598, 572, 576, 580, 584, 588, 592, 596, 600, 606, 607,
603 612
}; };
#endif #endif
@ -1747,16 +1747,25 @@ yyreduce:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 177 "config_parser.yy" #line 177 "config_parser.yy"
{ {
ScriptVariable::Set((yyvsp[(2) - (4)].text), *(yyvsp[(4) - (4)].variant)); Value *value = (yyvsp[(4) - (4)].variant);
if (value->IsObjectType<ExpressionList>()) {
Dictionary::Ptr dict = boost::make_shared<Dictionary>();
ExpressionList::Ptr exprl = *value;
exprl->Execute(dict);
delete value;
value = new Value(dict);
}
ScriptVariable::Set((yyvsp[(2) - (4)].text), *value);
free((yyvsp[(2) - (4)].text)); free((yyvsp[(2) - (4)].text));
delete (yyvsp[(4) - (4)].variant); delete value;
} }
break; break;
case 14: case 14:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 185 "config_parser.yy" #line 194 "config_parser.yy"
{ {
(yyval.text) = (yyvsp[(1) - (1)].text); (yyval.text) = (yyvsp[(1) - (1)].text);
} }
@ -1765,7 +1774,7 @@ yyreduce:
case 15: case 15:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 191 "config_parser.yy" #line 200 "config_parser.yy"
{ {
String name = String((yyvsp[(3) - (3)].text)); String name = String((yyvsp[(3) - (3)].text));
free((yyvsp[(3) - (3)].text)); free((yyvsp[(3) - (3)].text));
@ -1785,7 +1794,7 @@ yyreduce:
case 16: case 16:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 206 "config_parser.yy" #line 215 "config_parser.yy"
{ {
TypeRuleList::Ptr ruleList = *(yyvsp[(6) - (6)].variant); TypeRuleList::Ptr ruleList = *(yyvsp[(6) - (6)].variant);
m_Type->GetRuleList()->AddRules(ruleList); m_Type->GetRuleList()->AddRules(ruleList);
@ -1802,7 +1811,7 @@ yyreduce:
case 17: case 17:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 220 "config_parser.yy" #line 229 "config_parser.yy"
{ {
(yyval.num) = 0; (yyval.num) = 0;
} }
@ -1811,7 +1820,7 @@ yyreduce:
case 18: case 18:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 224 "config_parser.yy" #line 233 "config_parser.yy"
{ {
(yyval.num) = 1; (yyval.num) = 1;
} }
@ -1820,7 +1829,7 @@ yyreduce:
case 19: case 19:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 230 "config_parser.yy" #line 239 "config_parser.yy"
{ {
m_RuleLists.push(boost::make_shared<TypeRuleList>()); m_RuleLists.push(boost::make_shared<TypeRuleList>());
} }
@ -1829,7 +1838,7 @@ yyreduce:
case 20: case 20:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 235 "config_parser.yy" #line 244 "config_parser.yy"
{ {
(yyval.variant) = new Value(m_RuleLists.top()); (yyval.variant) = new Value(m_RuleLists.top());
m_RuleLists.pop(); m_RuleLists.pop();
@ -1839,7 +1848,7 @@ yyreduce:
case 26: case 26:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 250 "config_parser.yy" #line 259 "config_parser.yy"
{ {
m_RuleLists.top()->AddRequire((yyvsp[(2) - (2)].text)); m_RuleLists.top()->AddRequire((yyvsp[(2) - (2)].text));
free((yyvsp[(2) - (2)].text)); free((yyvsp[(2) - (2)].text));
@ -1849,7 +1858,7 @@ yyreduce:
case 27: case 27:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 255 "config_parser.yy" #line 264 "config_parser.yy"
{ {
m_RuleLists.top()->SetValidator((yyvsp[(2) - (2)].text)); m_RuleLists.top()->SetValidator((yyvsp[(2) - (2)].text));
free((yyvsp[(2) - (2)].text)); free((yyvsp[(2) - (2)].text));
@ -1859,7 +1868,7 @@ yyreduce:
case 28: case 28:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 260 "config_parser.yy" #line 269 "config_parser.yy"
{ {
TypeRule rule((yyvsp[(2) - (3)].type), String(), (yyvsp[(3) - (3)].text), TypeRuleList::Ptr(), yylloc); TypeRule rule((yyvsp[(2) - (3)].type), String(), (yyvsp[(3) - (3)].text), TypeRuleList::Ptr(), yylloc);
free((yyvsp[(3) - (3)].text)); free((yyvsp[(3) - (3)].text));
@ -1871,7 +1880,7 @@ yyreduce:
case 29: case 29:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 267 "config_parser.yy" #line 276 "config_parser.yy"
{ {
TypeRule rule((yyvsp[(2) - (6)].type), (yyvsp[(4) - (6)].text), (yyvsp[(6) - (6)].text), TypeRuleList::Ptr(), yylloc); TypeRule rule((yyvsp[(2) - (6)].type), (yyvsp[(4) - (6)].text), (yyvsp[(6) - (6)].text), TypeRuleList::Ptr(), yylloc);
free((yyvsp[(4) - (6)].text)); free((yyvsp[(4) - (6)].text));
@ -1884,7 +1893,7 @@ yyreduce:
case 30: case 30:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 275 "config_parser.yy" #line 284 "config_parser.yy"
{ {
TypeRule rule((yyvsp[(2) - (4)].type), String(), (yyvsp[(3) - (4)].text), *(yyvsp[(4) - (4)].variant), yylloc); TypeRule rule((yyvsp[(2) - (4)].type), String(), (yyvsp[(3) - (4)].text), *(yyvsp[(4) - (4)].variant), yylloc);
free((yyvsp[(3) - (4)].text)); free((yyvsp[(3) - (4)].text));
@ -1896,7 +1905,7 @@ yyreduce:
case 32: case 32:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 285 "config_parser.yy" #line 294 "config_parser.yy"
{ {
m_Type->SetParent((yyvsp[(2) - (2)].text)); m_Type->SetParent((yyvsp[(2) - (2)].text));
free((yyvsp[(2) - (2)].text)); free((yyvsp[(2) - (2)].text));
@ -1906,7 +1915,7 @@ yyreduce:
case 39: case 39:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 298 "config_parser.yy" #line 307 "config_parser.yy"
{ {
(yyval.type) = (yyvsp[(1) - (1)].type); (yyval.type) = (yyvsp[(1) - (1)].type);
} }
@ -1915,7 +1924,7 @@ yyreduce:
case 40: case 40:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 304 "config_parser.yy" #line 313 "config_parser.yy"
{ {
m_Abstract = false; m_Abstract = false;
} }
@ -1924,7 +1933,7 @@ yyreduce:
case 41: case 41:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 308 "config_parser.yy" #line 317 "config_parser.yy"
{ {
ConfigItemBuilder::Ptr item = boost::make_shared<ConfigItemBuilder>(yylloc); ConfigItemBuilder::Ptr item = boost::make_shared<ConfigItemBuilder>(yylloc);
@ -1965,7 +1974,7 @@ yyreduce:
case 43: case 43:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 347 "config_parser.yy" #line 356 "config_parser.yy"
{ {
m_Abstract = true; m_Abstract = true;
} }
@ -1974,7 +1983,7 @@ yyreduce:
case 46: case 46:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 356 "config_parser.yy" #line 365 "config_parser.yy"
{ {
m_Abstract = true; m_Abstract = true;
} }
@ -1983,7 +1992,7 @@ yyreduce:
case 47: case 47:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 362 "config_parser.yy" #line 371 "config_parser.yy"
{ {
(yyval.slist) = NULL; (yyval.slist) = NULL;
} }
@ -1992,7 +2001,7 @@ yyreduce:
case 48: case 48:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 366 "config_parser.yy" #line 375 "config_parser.yy"
{ {
(yyval.slist) = new std::vector<String>(); (yyval.slist) = new std::vector<String>();
(yyval.slist)->push_back((yyvsp[(1) - (1)].text)); (yyval.slist)->push_back((yyvsp[(1) - (1)].text));
@ -2003,7 +2012,7 @@ yyreduce:
case 49: case 49:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 372 "config_parser.yy" #line 381 "config_parser.yy"
{ {
if ((yyvsp[(1) - (3)].slist)) if ((yyvsp[(1) - (3)].slist))
(yyval.slist) = (yyvsp[(1) - (3)].slist); (yyval.slist) = (yyvsp[(1) - (3)].slist);
@ -2018,7 +2027,7 @@ yyreduce:
case 50: case 50:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 384 "config_parser.yy" #line 393 "config_parser.yy"
{ {
(yyval.slist) = NULL; (yyval.slist) = NULL;
} }
@ -2027,7 +2036,7 @@ yyreduce:
case 51: case 51:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 388 "config_parser.yy" #line 397 "config_parser.yy"
{ {
(yyval.slist) = (yyvsp[(2) - (2)].slist); (yyval.slist) = (yyvsp[(2) - (2)].slist);
} }
@ -2036,7 +2045,7 @@ yyreduce:
case 52: case 52:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 394 "config_parser.yy" #line 403 "config_parser.yy"
{ {
(yyval.exprl) = (yyvsp[(2) - (3)].exprl); (yyval.exprl) = (yyvsp[(2) - (3)].exprl);
} }
@ -2045,7 +2054,7 @@ yyreduce:
case 53: case 53:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 400 "config_parser.yy" #line 409 "config_parser.yy"
{ {
(yyval.exprl) = (yyvsp[(1) - (1)].exprl); (yyval.exprl) = (yyvsp[(1) - (1)].exprl);
} }
@ -2054,7 +2063,7 @@ yyreduce:
case 54: case 54:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 404 "config_parser.yy" #line 413 "config_parser.yy"
{ {
(yyval.exprl) = (yyvsp[(1) - (2)].exprl); (yyval.exprl) = (yyvsp[(1) - (2)].exprl);
} }
@ -2063,7 +2072,7 @@ yyreduce:
case 55: case 55:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 409 "config_parser.yy" #line 418 "config_parser.yy"
{ {
(yyval.exprl) = NULL; (yyval.exprl) = NULL;
} }
@ -2072,7 +2081,7 @@ yyreduce:
case 56: case 56:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 413 "config_parser.yy" #line 422 "config_parser.yy"
{ {
(yyval.exprl) = new ExpressionList(); (yyval.exprl) = new ExpressionList();
(yyval.exprl)->AddExpression(*(yyvsp[(1) - (1)].expr)); (yyval.exprl)->AddExpression(*(yyvsp[(1) - (1)].expr));
@ -2083,7 +2092,7 @@ yyreduce:
case 57: case 57:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 419 "config_parser.yy" #line 428 "config_parser.yy"
{ {
if ((yyvsp[(1) - (3)].exprl)) if ((yyvsp[(1) - (3)].exprl))
(yyval.exprl) = (yyvsp[(1) - (3)].exprl); (yyval.exprl) = (yyvsp[(1) - (3)].exprl);
@ -2098,7 +2107,7 @@ yyreduce:
case 58: case 58:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 431 "config_parser.yy" #line 440 "config_parser.yy"
{ {
(yyval.expr) = new Expression((yyvsp[(1) - (3)].text), (yyvsp[(2) - (3)].op), *(yyvsp[(3) - (3)].variant), yylloc); (yyval.expr) = new Expression((yyvsp[(1) - (3)].text), (yyvsp[(2) - (3)].op), *(yyvsp[(3) - (3)].variant), yylloc);
free((yyvsp[(1) - (3)].text)); free((yyvsp[(1) - (3)].text));
@ -2109,7 +2118,7 @@ yyreduce:
case 59: case 59:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 437 "config_parser.yy" #line 446 "config_parser.yy"
{ {
Expression subexpr((yyvsp[(3) - (6)].text), (yyvsp[(5) - (6)].op), *(yyvsp[(6) - (6)].variant), yylloc); Expression subexpr((yyvsp[(3) - (6)].text), (yyvsp[(5) - (6)].op), *(yyvsp[(6) - (6)].variant), yylloc);
free((yyvsp[(3) - (6)].text)); free((yyvsp[(3) - (6)].text));
@ -2126,7 +2135,7 @@ yyreduce:
case 64: case 64:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 455 "config_parser.yy" #line 464 "config_parser.yy"
{ {
(yyval.op) = (yyvsp[(1) - (1)].op); (yyval.op) = (yyvsp[(1) - (1)].op);
} }
@ -2135,7 +2144,7 @@ yyreduce:
case 65: case 65:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 461 "config_parser.yy" #line 470 "config_parser.yy"
{ {
(yyval.array) = (yyvsp[(2) - (3)].array); (yyval.array) = (yyvsp[(2) - (3)].array);
} }
@ -2144,7 +2153,7 @@ yyreduce:
case 66: case 66:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 467 "config_parser.yy" #line 476 "config_parser.yy"
{ {
(yyval.array) = (yyvsp[(1) - (1)].array); (yyval.array) = (yyvsp[(1) - (1)].array);
} }
@ -2153,7 +2162,7 @@ yyreduce:
case 67: case 67:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 471 "config_parser.yy" #line 480 "config_parser.yy"
{ {
(yyval.array) = (yyvsp[(1) - (2)].array); (yyval.array) = (yyvsp[(1) - (2)].array);
} }
@ -2162,7 +2171,7 @@ yyreduce:
case 68: case 68:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 476 "config_parser.yy" #line 485 "config_parser.yy"
{ {
(yyval.array) = NULL; (yyval.array) = NULL;
} }
@ -2171,7 +2180,7 @@ yyreduce:
case 69: case 69:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 480 "config_parser.yy" #line 489 "config_parser.yy"
{ {
(yyval.array) = new Array(); (yyval.array) = new Array();
@ -2191,7 +2200,7 @@ yyreduce:
case 70: case 70:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 495 "config_parser.yy" #line 504 "config_parser.yy"
{ {
if ((yyvsp[(1) - (3)].array)) if ((yyvsp[(1) - (3)].array))
(yyval.array) = (yyvsp[(1) - (3)].array); (yyval.array) = (yyvsp[(1) - (3)].array);
@ -2214,7 +2223,7 @@ yyreduce:
case 71: case 71:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 515 "config_parser.yy" #line 524 "config_parser.yy"
{ {
(yyval.variant) = new Value((yyvsp[(1) - (1)].text)); (yyval.variant) = new Value((yyvsp[(1) - (1)].text));
free((yyvsp[(1) - (1)].text)); free((yyvsp[(1) - (1)].text));
@ -2224,7 +2233,7 @@ yyreduce:
case 72: case 72:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 520 "config_parser.yy" #line 529 "config_parser.yy"
{ {
(yyval.variant) = new Value((yyvsp[(1) - (1)].num)); (yyval.variant) = new Value((yyvsp[(1) - (1)].num));
} }
@ -2233,7 +2242,7 @@ yyreduce:
case 73: case 73:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 524 "config_parser.yy" #line 533 "config_parser.yy"
{ {
(yyval.variant) = new Value(); (yyval.variant) = new Value();
} }
@ -2242,7 +2251,7 @@ yyreduce:
case 74: case 74:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 528 "config_parser.yy" #line 537 "config_parser.yy"
{ {
if ((yyvsp[(1) - (1)].array) == NULL) if ((yyvsp[(1) - (1)].array) == NULL)
(yyvsp[(1) - (1)].array) = new Array(); (yyvsp[(1) - (1)].array) = new Array();
@ -2255,7 +2264,7 @@ yyreduce:
case 75: case 75:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 538 "config_parser.yy" #line 547 "config_parser.yy"
{ {
(yyval.variant) = (yyvsp[(2) - (3)].variant); (yyval.variant) = (yyvsp[(2) - (3)].variant);
} }
@ -2264,7 +2273,7 @@ yyreduce:
case 76: case 76:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 543 "config_parser.yy" #line 552 "config_parser.yy"
{ {
(yyval.variant) = new Value((yyvsp[(1) - (1)].text)); (yyval.variant) = new Value((yyvsp[(1) - (1)].text));
free((yyvsp[(1) - (1)].text)); free((yyvsp[(1) - (1)].text));
@ -2274,7 +2283,7 @@ yyreduce:
case 77: case 77:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 548 "config_parser.yy" #line 557 "config_parser.yy"
{ {
(yyval.variant) = new Value((yyvsp[(1) - (1)].num)); (yyval.variant) = new Value((yyvsp[(1) - (1)].num));
} }
@ -2283,7 +2292,7 @@ yyreduce:
case 78: case 78:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 552 "config_parser.yy" #line 561 "config_parser.yy"
{ {
(yyval.variant) = new Value(ScriptVariable::Get((yyvsp[(1) - (1)].text))); (yyval.variant) = new Value(ScriptVariable::Get((yyvsp[(1) - (1)].text)));
free((yyvsp[(1) - (1)].text)); free((yyvsp[(1) - (1)].text));
@ -2293,7 +2302,7 @@ yyreduce:
case 79: case 79:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 557 "config_parser.yy" #line 566 "config_parser.yy"
{ {
if ((yyvsp[(1) - (3)].variant)->GetType() == ValueString || (yyvsp[(3) - (3)].variant)->GetType() == ValueString) if ((yyvsp[(1) - (3)].variant)->GetType() == ValueString || (yyvsp[(3) - (3)].variant)->GetType() == ValueString)
(yyval.variant) = new Value((String)*(yyvsp[(1) - (3)].variant) + (String)*(yyvsp[(3) - (3)].variant)); (yyval.variant) = new Value((String)*(yyvsp[(1) - (3)].variant) + (String)*(yyvsp[(3) - (3)].variant));
@ -2305,7 +2314,7 @@ yyreduce:
case 80: case 80:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 564 "config_parser.yy" #line 573 "config_parser.yy"
{ {
(yyval.variant) = new Value((double)*(yyvsp[(1) - (3)].variant) - (double)*(yyvsp[(3) - (3)].variant)); (yyval.variant) = new Value((double)*(yyvsp[(1) - (3)].variant) - (double)*(yyvsp[(3) - (3)].variant));
} }
@ -2314,7 +2323,7 @@ yyreduce:
case 81: case 81:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 568 "config_parser.yy" #line 577 "config_parser.yy"
{ {
(yyval.variant) = new Value((double)*(yyvsp[(1) - (3)].variant) * (double)*(yyvsp[(3) - (3)].variant)); (yyval.variant) = new Value((double)*(yyvsp[(1) - (3)].variant) * (double)*(yyvsp[(3) - (3)].variant));
} }
@ -2323,7 +2332,7 @@ yyreduce:
case 82: case 82:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 572 "config_parser.yy" #line 581 "config_parser.yy"
{ {
(yyval.variant) = new Value((double)*(yyvsp[(1) - (3)].variant) / (double)*(yyvsp[(3) - (3)].variant)); (yyval.variant) = new Value((double)*(yyvsp[(1) - (3)].variant) / (double)*(yyvsp[(3) - (3)].variant));
} }
@ -2332,7 +2341,7 @@ yyreduce:
case 83: case 83:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 576 "config_parser.yy" #line 585 "config_parser.yy"
{ {
(yyval.variant) = new Value((long)*(yyvsp[(1) - (3)].variant) & (long)*(yyvsp[(3) - (3)].variant)); (yyval.variant) = new Value((long)*(yyvsp[(1) - (3)].variant) & (long)*(yyvsp[(3) - (3)].variant));
} }
@ -2341,7 +2350,7 @@ yyreduce:
case 84: case 84:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 580 "config_parser.yy" #line 589 "config_parser.yy"
{ {
(yyval.variant) = new Value((long)*(yyvsp[(1) - (3)].variant) | (long)*(yyvsp[(3) - (3)].variant)); (yyval.variant) = new Value((long)*(yyvsp[(1) - (3)].variant) | (long)*(yyvsp[(3) - (3)].variant));
} }
@ -2350,7 +2359,7 @@ yyreduce:
case 85: case 85:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 584 "config_parser.yy" #line 593 "config_parser.yy"
{ {
(yyval.variant) = new Value((long)*(yyvsp[(1) - (3)].variant) << (long)*(yyvsp[(3) - (3)].variant)); (yyval.variant) = new Value((long)*(yyvsp[(1) - (3)].variant) << (long)*(yyvsp[(3) - (3)].variant));
} }
@ -2359,7 +2368,7 @@ yyreduce:
case 86: case 86:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 588 "config_parser.yy" #line 597 "config_parser.yy"
{ {
(yyval.variant) = new Value((long)*(yyvsp[(1) - (3)].variant) >> (long)*(yyvsp[(3) - (3)].variant)); (yyval.variant) = new Value((long)*(yyvsp[(1) - (3)].variant) >> (long)*(yyvsp[(3) - (3)].variant));
} }
@ -2368,7 +2377,7 @@ yyreduce:
case 87: case 87:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 592 "config_parser.yy" #line 601 "config_parser.yy"
{ {
(yyval.variant) = (yyvsp[(2) - (3)].variant); (yyval.variant) = (yyvsp[(2) - (3)].variant);
} }
@ -2377,7 +2386,7 @@ yyreduce:
case 89: case 89:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 599 "config_parser.yy" #line 608 "config_parser.yy"
{ {
ExpressionList::Ptr exprl = ExpressionList::Ptr((yyvsp[(1) - (1)].exprl)); ExpressionList::Ptr exprl = ExpressionList::Ptr((yyvsp[(1) - (1)].exprl));
(yyval.variant) = new Value(exprl); (yyval.variant) = new Value(exprl);
@ -2387,7 +2396,7 @@ yyreduce:
case 90: case 90:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 604 "config_parser.yy" #line 613 "config_parser.yy"
{ {
(yyval.variant) = (yyvsp[(1) - (1)].variant); (yyval.variant) = (yyvsp[(1) - (1)].variant);
} }
@ -2396,7 +2405,7 @@ yyreduce:
/* Line 1806 of yacc.c */ /* Line 1806 of yacc.c */
#line 2400 "../../../lib/config/config_parser.cc" #line 2409 "../../../lib/config/config_parser.cc"
default: break; default: break;
} }
/* User semantic actions sometimes alter yychar, and that requires /* User semantic actions sometimes alter yychar, and that requires
@ -2634,6 +2643,6 @@ yyreturn:
/* Line 2067 of yacc.c */ /* Line 2067 of yacc.c */
#line 608 "config_parser.yy" #line 617 "config_parser.yy"

View File

@ -175,9 +175,18 @@ library: T_LIBRARY T_STRING
variable: T_SET identifier T_EQUAL value variable: T_SET identifier T_EQUAL value
{ {
ScriptVariable::Set($2, *$4); Value *value = $4;
if (value->IsObjectType<ExpressionList>()) {
Dictionary::Ptr dict = boost::make_shared<Dictionary>();
ExpressionList::Ptr exprl = *value;
exprl->Execute(dict);
delete value;
value = new Value(dict);
}
ScriptVariable::Set($2, *value);
free($2); free($2);
delete $4; delete value;
} }
identifier: T_IDENTIFIER identifier: T_IDENTIFIER

View File

@ -25,6 +25,7 @@
#include "base/debug.h" #include "base/debug.h"
#include "base/utility.h" #include "base/utility.h"
#include "base/timer.h" #include "base/timer.h"
#include "base/scriptvariable.h"
#include <boost/smart_ptr/make_shared.hpp> #include <boost/smart_ptr/make_shared.hpp>
using namespace icinga; using namespace icinga;
@ -49,8 +50,6 @@ int IcingaApplication::Main(void)
m_StartTime = Utility::GetTime(); m_StartTime = Utility::GetTime();
UpdatePidFile(GetPidPath());
/* periodically dump the program state */ /* periodically dump the program state */
l_RetentionTimer = boost::make_shared<Timer>(); l_RetentionTimer = boost::make_shared<Timer>();
l_RetentionTimer->SetInterval(300); l_RetentionTimer->SetInterval(300);
@ -86,21 +85,9 @@ IcingaApplication::Ptr IcingaApplication::GetInstance(void)
return static_pointer_cast<IcingaApplication>(Application::GetInstance()); return static_pointer_cast<IcingaApplication>(Application::GetInstance());
} }
String IcingaApplication::GetPidPath(void) const
{
ObjectLock olock(this);
if (m_PidPath.IsEmpty())
return Application::GetLocalStateDir() + "/run/icinga2/icinga2.pid";
else
return m_PidPath;
}
Dictionary::Ptr IcingaApplication::GetMacros(void) const Dictionary::Ptr IcingaApplication::GetMacros(void) const
{ {
ObjectLock olock(this); return ScriptVariable::Get("IcingaMacros");
return m_Macros;
} }
double IcingaApplication::GetStartTime(void) const double IcingaApplication::GetStartTime(void) const
@ -140,23 +127,3 @@ bool IcingaApplication::ResolveMacro(const String& macro, const Dictionary::Ptr&
return false; return false;
} }
void IcingaApplication::InternalSerialize(const Dictionary::Ptr& bag, int attributeTypes) const
{
DynamicObject::InternalSerialize(bag, attributeTypes);
if (attributeTypes & Attribute_Config) {
bag->Set("pid_path", m_PidPath);
bag->Set("macros", m_Macros);
}
}
void IcingaApplication::InternalDeserialize(const Dictionary::Ptr& bag, int attributeTypes)
{
DynamicObject::InternalDeserialize(bag, attributeTypes);
if (attributeTypes & Attribute_Config) {
m_PidPath = bag->Get("pid_path");
m_Macros = bag->Get("macros");
}
}

View File

@ -49,14 +49,7 @@ public:
virtual bool ResolveMacro(const String& macro, const Dictionary::Ptr& cr, String *result) const; virtual bool ResolveMacro(const String& macro, const Dictionary::Ptr& cr, String *result) const;
protected:
virtual void InternalSerialize(const Dictionary::Ptr& bag, int attributeTypes) const;
virtual void InternalDeserialize(const Dictionary::Ptr& bag, int attributeTypes);
private: private:
String m_PidPath;
Dictionary::Ptr m_Macros;
double m_StartTime; double m_StartTime;
void DumpProgramState(void); void DumpProgramState(void);