]> granicus.if.org Git - icinga2/blobdiff - lib/icinga/notification-apply.cpp
Move the VMFrame class to libbase
[icinga2] / lib / icinga / notification-apply.cpp
index 7af35260ce0f7bf4fe0a1fbf5d2c6e0f905b10e0..ed829f1e584507404d434fd6dddc29576e838b8c 100644 (file)
@@ -27,7 +27,7 @@
 #include "base/logger.hpp"
 #include "base/context.hpp"
 #include "base/workqueue.hpp"
-#include "base/configerror.hpp"
+#include "base/scripterror.hpp"
 #include <boost/foreach.hpp>
 
 using namespace icinga;
@@ -42,7 +42,7 @@ void Notification::RegisterApplyRuleHandler(void)
        ApplyRule::RegisterType("Notification", targets);
 }
 
-void Notification::EvaluateApplyRuleInstance(const Checkable::Ptr& checkable, const String& name, const Dictionary::Ptr& locals, const ApplyRule& rule)
+void Notification::EvaluateApplyRuleInstance(const Checkable::Ptr& checkable, const String& name, ScriptFrame& frame, const ApplyRule& rule)
 {
        DebugInfo di = rule.GetDebugInfo();
 
@@ -52,28 +52,26 @@ void Notification::EvaluateApplyRuleInstance(const Checkable::Ptr& checkable, co
        ConfigItemBuilder::Ptr builder = new ConfigItemBuilder(di);
        builder->SetType("Notification");
        builder->SetName(name);
-       builder->SetScope(locals);
+       builder->SetScope(frame.Locals);
 
        Host::Ptr host;
        Service::Ptr service;
        tie(host, service) = GetHostService(checkable);
 
-       builder->AddExpression(new SetExpression(MakeIndexer("host_name"), OpSetLiteral, MakeLiteral(host->GetName()), di));
+       builder->AddExpression(new SetExpression(MakeIndexer("host_name"), OpSetLiteral, MakeLiteral(host->GetName()), false, di));
 
        if (service)
-               builder->AddExpression(new SetExpression(MakeIndexer("service_name"), OpSetLiteral, MakeLiteral(service->GetShortName()), di));
+               builder->AddExpression(new SetExpression(MakeIndexer("service_name"), OpSetLiteral, MakeLiteral(service->GetShortName()), false, di));
 
        String zone = checkable->GetZone();
 
        if (!zone.IsEmpty())
-               builder->AddExpression(new SetExpression(MakeIndexer("zone"), OpSetLiteral, MakeLiteral(zone), di));
+               builder->AddExpression(new SetExpression(MakeIndexer("zone"), OpSetLiteral, MakeLiteral(zone), false, di));
 
        builder->AddExpression(new OwnedExpression(rule.GetExpression()));
 
        ConfigItem::Ptr notificationItem = builder->Compile();
-       DynamicObject::Ptr dobj = notificationItem->Commit();
-       dobj->OnConfigLoaded();
-       
+       notificationItem->Commit();
 }
 
 bool Notification::EvaluateApplyRule(const Checkable::Ptr& checkable, const ApplyRule& rule)
@@ -88,19 +86,20 @@ bool Notification::EvaluateApplyRule(const Checkable::Ptr& checkable, const Appl
        Service::Ptr service;
        tie(host, service) = GetHostService(checkable);
 
-       Dictionary::Ptr locals = new Dictionary();
-       locals->Set("__parent", rule.GetScope());
-       locals->Set("host", host);
+       ScriptFrame frame;
+       if (rule.GetScope())
+               rule.GetScope()->CopyTo(frame.Locals);
+       frame.Locals->Set("host", host);
        if (service)
-               locals->Set("service", service);
+               frame.Locals->Set("service", service);
 
-       if (!rule.EvaluateFilter(locals))
+       if (!rule.EvaluateFilter(frame))
                return false;
 
        Value vinstances;
 
        if (rule.GetFTerm()) {
-               vinstances = rule.GetFTerm()->Evaluate(locals);
+               vinstances = rule.GetFTerm()->Evaluate(frame);
        } else {
                Array::Ptr instances = new Array();
                instances->Add("");
@@ -109,7 +108,7 @@ bool Notification::EvaluateApplyRule(const Checkable::Ptr& checkable, const Appl
 
        if (vinstances.IsObjectType<Array>()) {
                if (!rule.GetFVVar().IsEmpty())
-                       BOOST_THROW_EXCEPTION(ConfigError("Array iterator requires value to be an array.") << errinfo_debuginfo(di));
+                       BOOST_THROW_EXCEPTION(ScriptError("Array iterator requires value to be an array.", di));
 
                Array::Ptr arr = vinstances;
 
@@ -118,24 +117,24 @@ bool Notification::EvaluateApplyRule(const Checkable::Ptr& checkable, const Appl
                        String name = rule.GetName();
 
                        if (!rule.GetFKVar().IsEmpty()) {
-                               locals->Set(rule.GetFKVar(), instance);
+                               frame.Locals->Set(rule.GetFKVar(), instance);
                                name += instance;
                        }
 
-                       EvaluateApplyRuleInstance(checkable, name, locals, rule);
+                       EvaluateApplyRuleInstance(checkable, name, frame, rule);
                }
        } else if (vinstances.IsObjectType<Dictionary>()) {
                if (rule.GetFVVar().IsEmpty())
-                       BOOST_THROW_EXCEPTION(ConfigError("Dictionary iterator requires value to be a dictionary.") << errinfo_debuginfo(di));
+                       BOOST_THROW_EXCEPTION(ScriptError("Dictionary iterator requires value to be a dictionary.", di));
        
                Dictionary::Ptr dict = vinstances;
 
                ObjectLock olock(dict);
                BOOST_FOREACH(const Dictionary::Pair& kv, dict) {
-                       locals->Set(rule.GetFKVar(), kv.first);
-                       locals->Set(rule.GetFVVar(), kv.second);
+                       frame.Locals->Set(rule.GetFKVar(), kv.first);
+                       frame.Locals->Set(rule.GetFVVar(), kv.second);
 
-                       EvaluateApplyRuleInstance(checkable, rule.GetName() + kv.first, locals, rule);
+                       EvaluateApplyRuleInstance(checkable, rule.GetName() + kv.first, frame, rule);
                }
        }
 
@@ -154,9 +153,8 @@ void Notification::EvaluateApplyRules(const Host::Ptr& host)
                try {
                        if (EvaluateApplyRule(host, rule))
                                rule.AddMatch();
-               } catch (const ConfigError& ex) {
-                       const DebugInfo *di = boost::get_error_info<errinfo_debuginfo>(ex);
-                       ConfigCompilerContext::GetInstance()->AddMessage(true, ex.what(), di ? *di : DebugInfo());
+               } catch (const ScriptError& ex) {
+                       ConfigCompilerContext::GetInstance()->AddMessage(true, ex.what(), ex.GetDebugInfo());
                }
        }
 }
@@ -165,17 +163,15 @@ void Notification::EvaluateApplyRules(const Service::Ptr& service)
 {
        CONTEXT("Evaluating 'apply' rules for service '" + service->GetName() + "'");
 
-       BOOST_FOREACH(ApplyRule& rule, ApplyRule::GetRules("Notification"))
-       {
+       BOOST_FOREACH(ApplyRule& rule, ApplyRule::GetRules("Notification")) {
                if (rule.GetTargetType() != "Service")
                        continue;
 
                try {
                        if (EvaluateApplyRule(service, rule))
                                rule.AddMatch();
-               } catch (const ConfigError& ex) {
-                       const DebugInfo *di = boost::get_error_info<errinfo_debuginfo>(ex);
-                       ConfigCompilerContext::GetInstance()->AddMessage(true, ex.what(), di ? *di : DebugInfo());
+               } catch (const ScriptError& ex) {
+                       ConfigCompilerContext::GetInstance()->AddMessage(true, ex.what(), ex.GetDebugInfo());
                }
        }
 }