]> granicus.if.org Git - icinga2/commitdiff
Implement get_services(host {name,object}) and add host object support for get_service() 5534/head
authorMichael Friedrich <michael.friedrich@icinga.com>
Wed, 23 Aug 2017 12:18:28 +0000 (14:18 +0200)
committerMichael Friedrich <michael.friedrich@icinga.com>
Mon, 28 Aug 2017 17:54:26 +0000 (19:54 +0200)
This includes some debug console examples too which involve advanced
map() and filter examples for better readability.

refs #4912

doc/18-library-reference.md
lib/icinga/objectutils.cpp
lib/icinga/objectutils.hpp

index 62e2124079942521f4b260bf15babc1e2e8890d6..7caa64613558e82d11f960720f11c97c82e55d74 100644 (file)
@@ -547,9 +547,57 @@ Returns the Host object with the specified name, or `null` if no such Host objec
 Signature:
 
     function get_service(host_name, service_name);
+    function get_service(host, service_name);
 
-Returns the Service object with the specified name, or `null` if no such Service object exists.
+Returns the Service object with the specified host name or object and service name pair,
+or `null` if no such Service object exists.
 
+Example in the [debug console](11-cli-commands.md#cli-command-console)
+which fetches the `disk` service object from the current Icinga 2 node:
+
+```
+$ ICINGA2_API_PASSWORD=icinga icinga2 console --connect 'https://root@localhost:5665/'
+Icinga 2 (version: v2.7.0)
+
+<1> => get_service(NodeName, "disk")
+<2> => get_service(NodeName, "disk").__name
+"icinga2-master1.localdomain!disk"
+
+<3> => get_service(get_host(NodeName), "disk").__name
+"icinga2-master1.localdomain!disk"
+```
+
+### get_services <a id="objref-get_services"></a>
+
+Signature:
+
+    function get_services(host_name);
+    function get_services(host);
+
+Returns an [array](17-language-reference.md#array) of service objects for the specified host name or object,
+or `null` if no such host object exists.
+
+Example in the [debug console](11-cli-commands.md#cli-command-console)
+which fetches all service objects from the current Icinga 2 node:
+
+```
+$ ICINGA2_API_PASSWORD=icinga icinga2 console --connect 'https://root@localhost:5665/'
+Icinga 2 (version: v2.7.0)
+
+<1> => get_services(NodeName).map(s => s.name)
+[ "disk", "disk /", "http", "icinga", "load", "ping4", "ping6", "procs", "ssh", "users" ]
+```
+
+Note: [map](18-library-reference.md#array-map) takes a [lambda function](17-language-reference.md#lambdas) as argument. In this example
+we only want to collect and print the `name` attribute with `s => s.name`.
+
+This works in a similar fashion for a host object where you can extract all service states
+in using the [map](18-library-reference.md#array-map) functionality:
+
+```
+<2> => get_services(get_host(NodeName)).map(s => s.state)
+[ 2.000000, 2.000000, 2.000000, 0.000000, 0.000000, 0.000000, 2.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000 ]
+```
 
 ### get_user <a id="objref-get_user"></a>
 
index be58508ba9738f4bf3766bc2323424c26091fc56..bde6cfd9ab1647833897828f12035ed86c6ad0a4 100644 (file)
@@ -31,6 +31,7 @@ using namespace icinga;
 
 REGISTER_SCRIPTFUNCTION_NS(System, get_host, &Host::GetByName, "name");
 REGISTER_SCRIPTFUNCTION_NS(System, get_service, &ObjectUtils::GetService, "host:name");
+REGISTER_SCRIPTFUNCTION_NS(System, get_services, &ObjectUtils::GetServices, "host");
 REGISTER_SCRIPTFUNCTION_NS(System, get_user, &User::GetByName, "name");
 REGISTER_SCRIPTFUNCTION_NS(System, get_check_command, &CheckCommand::GetByName, "name");
 REGISTER_SCRIPTFUNCTION_NS(System, get_event_command, &EventCommand::GetByName, "name");
@@ -40,13 +41,32 @@ REGISTER_SCRIPTFUNCTION_NS(System, get_service_group, &ServiceGroup::GetByName,
 REGISTER_SCRIPTFUNCTION_NS(System, get_user_group, &UserGroup::GetByName, "name");
 REGISTER_SCRIPTFUNCTION_NS(System, get_time_period, &TimePeriod::GetByName, "name");
 
-Service::Ptr ObjectUtils::GetService(const String& host, const String& name)
+Service::Ptr ObjectUtils::GetService(const Value& host, const String& name)
 {
-       Host::Ptr host_obj = Host::GetByName(host);
+       Host::Ptr hostObj;
 
-       if (!host_obj)
+       if (host.IsObjectType<Host>())
+               hostObj = host;
+       else
+               hostObj = Host::GetByName(host);
+
+       if (!hostObj)
                return Service::Ptr();
 
-       return host_obj->GetServiceByShortName(name);
+       return hostObj->GetServiceByShortName(name);
 }
 
+Array::Ptr ObjectUtils::GetServices(const Value& host)
+{
+       Host::Ptr hostObj;
+
+       if (host.IsObjectType<Host>())
+               hostObj = host;
+       else
+               hostObj = Host::GetByName(host);
+
+       if (!hostObj)
+               return Array::Ptr();
+
+       return Array::FromVector(hostObj->GetServices());
+}
index cb783e828444bc9af84773712cc5298108f6c710..e1997c65cd8140bf3491a33d33732a3fc4f2f6f5 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "base/i2-base.hpp"
 #include "base/string.hpp"
+#include "base/array.hpp"
 #include "icinga/service.hpp"
 
 namespace icinga
@@ -33,7 +34,8 @@ namespace icinga
 class I2_ICINGA_API ObjectUtils
 {
 public:
-       static Service::Ptr GetService(const String& host, const String& name);
+       static Service::Ptr GetService(const Value& host, const String& name);
+       static Array::Ptr GetServices(const Value& host);
 
 private:
        ObjectUtils(void);