From 851135d3a1643dd978453198b3f2523ccf6356e9 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Wed, 9 Nov 2016 09:11:40 +0100 Subject: [PATCH] Implement the 'evaluate-macros' API action fixes #13091 --- doc/12-icinga2-api.md | 25 +++++++++++++++++++++++++ lib/icinga/apiactions.cpp | 37 +++++++++++++++++++++++++++++++++++++ lib/icinga/apiactions.hpp | 1 + 3 files changed, 63 insertions(+) diff --git a/doc/12-icinga2-api.md b/doc/12-icinga2-api.md index 730eea177..94a65eced 100644 --- a/doc/12-icinga2-api.md +++ b/doc/12-icinga2-api.md @@ -1134,6 +1134,31 @@ Example: ] } +### 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", + } + ] + } + + ## Event Streams diff --git a/lib/icinga/apiactions.cpp b/lib/icinga/apiactions.cpp index 2f71dfb51..880dcc1e2 100644 --- a/lib/icinga/apiactions.cpp +++ b/lib/icinga/apiactions.cpp @@ -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(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); +} diff --git a/lib/icinga/apiactions.hpp b/lib/icinga/apiactions.hpp index 34694641f..66c8df535 100644 --- a/lib/icinga/apiactions.hpp +++ b/lib/icinga/apiactions.hpp @@ -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()); -- 2.40.0