]> granicus.if.org Git - icinga2/commitdiff
Implement the 'evaluate-macros' API action
authorGunnar Beutner <gunnar.beutner@icinga.com>
Wed, 9 Nov 2016 08:11:40 +0000 (09:11 +0100)
committerGunnar Beutner <gunnar.beutner@icinga.com>
Wed, 9 Nov 2016 08:13:42 +0000 (09:13 +0100)
fixes #13091

doc/12-icinga2-api.md
lib/icinga/apiactions.cpp
lib/icinga/apiactions.hpp

index 730eea177c2c04bf9138c3ebd943d8e222597e35..94a65ecede0596ca53e9e9873c00256c59cc7b9b 100644 (file)
@@ -1134,6 +1134,31 @@ Example:
         ]
     }
 
+### <a id="icinga2-api-actions-evaluate-macros"></a> evaluate-macros
+
+Evaluates a macro string in the context of a specific host or service.
+
+Send a `POST` request to the URL endpoint `/v1/actions/evaluate-macros`.
+
+  Parameter     | Type      | Description
+  --------------|-----------|--------------
+  query         | string    | **Required.** The macro string that should be evaluated.
+
+Example:
+
+    $ curl -k -s -u root:icinga -H 'Accept: application/json' -X POST 'https://localhost:5665/v1/actions/evaluate-macros' \
+    -d '{ "host": "icinga2-client1.localdomain", "query": "$host.name$" }' | python -m json.tool
+    {
+        "results": [
+            {
+                "code": 200.0,
+                "status": "Evaluated macros.",
+                "result": "icinga2-client1.localdomain",
+            }
+        ]
+    }
+
+
 
 ## <a id="icinga2-api-event-streams"></a> Event Streams
 
index 2f71dfb51738ecb4c075ee379536a9c84e39f4d0..880dcc1e2db5a2e8edeec8b15b40f3ffb60bc89d 100644 (file)
@@ -47,6 +47,7 @@ REGISTER_APIACTION(remove_downtime, "Service;Host;Downtime", &ApiActions::Remove
 REGISTER_APIACTION(shutdown_process, "", &ApiActions::ShutdownProcess);
 REGISTER_APIACTION(restart_process, "", &ApiActions::RestartProcess);
 REGISTER_APIACTION(generate_ticket, "", &ApiActions::GenerateTicket);
+REGISTER_APIACTION(evaluate_macros, "Service;Host", &ApiActions::EvaluateMacros);
 
 Dictionary::Ptr ApiActions::CreateResult(int code, const String& status,
     const Dictionary::Ptr& additional)
@@ -444,3 +445,39 @@ Dictionary::Ptr ApiActions::GenerateTicket(const ConfigObject::Ptr&,
        return ApiActions::CreateResult(200, "Generated PKI ticket '" + ticket + "' for common name '"
            + cn + "'.", additional);
 }
+
+Dictionary::Ptr ApiActions::EvaluateMacros(const ConfigObject::Ptr& object,
+    const Dictionary::Ptr& params)
+{
+       Checkable::Ptr checkable = static_pointer_cast<Checkable>(object);
+
+       if (!checkable)
+               return ApiActions::CreateResult(404, "Cannot evaluate macros without a host/service object.");
+
+       if (!params->Contains("query"))
+               return ApiActions::CreateResult(403, "A macro string must be specified.");
+
+       String query = HttpUtility::GetLastParameter(params, "query");
+
+       CheckCommand::Ptr commandObj = checkable->GetCheckCommand();
+
+       Host::Ptr host;
+       Service::Ptr service;
+       tie(host, service) = GetHostService(checkable);
+
+       MacroProcessor::ResolverList resolvers;
+       if (service)
+               resolvers.push_back(std::make_pair("service", service));
+       resolvers.push_back(std::make_pair("host", host));
+       resolvers.push_back(std::make_pair("command", commandObj));
+       resolvers.push_back(std::make_pair("icinga", IcingaApplication::GetInstance()));
+
+       Dictionary::Ptr additional = new Dictionary();
+
+       CheckResult::Ptr cr = checkable->GetLastCheckResult();
+
+       additional->Set("result", MacroProcessor::ResolveMacros(query,
+           resolvers, cr));
+
+       return ApiActions::CreateResult(200, "Evaluated macros.", additional);
+}
index 34694641f3bcd5b099434c30b2c7b48d8ab7030c..66c8df535ea444fca13189ccbb31ec5941e7f237 100644 (file)
@@ -46,6 +46,7 @@ public:
        static Dictionary::Ptr ShutdownProcess(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
        static Dictionary::Ptr RestartProcess(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
        static Dictionary::Ptr GenerateTicket(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
+       static Dictionary::Ptr EvaluateMacros(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
 
 private:
        static Dictionary::Ptr CreateResult(int code, const String& status, const Dictionary::Ptr& additional = Dictionary::Ptr());