]> granicus.if.org Git - icinga2/commitdiff
Implement support for limiting output attributes
authorGunnar Beutner <gunnar@beutner.name>
Tue, 28 Jul 2015 15:12:00 +0000 (17:12 +0200)
committerGunnar Beutner <gunnar@beutner.name>
Tue, 28 Jul 2015 15:12:51 +0000 (17:12 +0200)
refs #9077
fixes #9614

lib/icinga/checkresult.cpp
lib/icinga/checkresult.hpp
lib/remote/statusqueryhandler.cpp

index d1f2933d9e1ddec751099c78d9e15652655fc47e..eb28c58aa56f3640b2dbc89cf301edaec417627a 100644 (file)
 
 #include "icinga/checkresult.hpp"
 #include "icinga/checkresult.tcpp"
+#include "base/scriptglobal.hpp"
 
 using namespace icinga;
 
 REGISTER_TYPE(CheckResult);
+INITIALIZE_ONCE(&CheckResult::StaticInitialize);
+
+void CheckResult::StaticInitialize(void)
+{
+       ScriptGlobal::Set("ServiceOK", ServiceOK);
+       ScriptGlobal::Set("ServiceWarning", ServiceWarning);
+       ScriptGlobal::Set("ServiceCritical", ServiceCritical);
+       ScriptGlobal::Set("ServiceUnknown", ServiceUnknown);
+
+       ScriptGlobal::Set("HostUp", HostUp);
+       ScriptGlobal::Set("HostDown", HostDown);
+}
index a415e920672e381bf91128b5302b7e59ac6d8a44..5ea4a3d9c8633ade273423fb18f2a9bcf3a7e7b9 100644 (file)
@@ -35,6 +35,8 @@ class I2_ICINGA_API CheckResult : public ObjectImpl<CheckResult>
 {
 public:
        DECLARE_OBJECT(CheckResult);
+
+       static void StaticInitialize(void);
 };
 
 }
index 0651b93aa52d4e8370763dfce8c31d2061a1b10d..d78dac78f6392950b6cd5452231de26175ce38b9 100644 (file)
@@ -22,6 +22,7 @@
 #include "remote/filterutility.hpp"
 #include "base/serializer.hpp"
 #include <boost/algorithm/string.hpp>
+#include <set>
 
 using namespace icinga;
 
@@ -40,6 +41,9 @@ bool StatusQueryHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& re
        QueryDescription qd;
        qd.Types.insert(type);
 
+       std::vector<String> joinTypes;
+       joinTypes.push_back(type->GetName());
+
        Dictionary::Ptr params = HttpUtility::FetchRequestParameters(request);
 
        params->Set("type", type->GetName());
@@ -56,9 +60,38 @@ bool StatusQueryHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& re
 
        Array::Ptr results = new Array();
 
+       std::set<String> attrs;
+       Array::Ptr uattrs = params->Get("attrs");
+
+       if (uattrs) {
+               ObjectLock olock(uattrs);
+               BOOST_FOREACH(const String& uattr, uattrs) {
+                       attrs.insert(uattr);
+               }
+       }
+
        BOOST_FOREACH(const DynamicObject::Ptr& obj, objs) {
-               Value result1 = Serialize(obj, FAConfig | FAState);
-               results->Add(result1);
+               BOOST_FOREACH(const String& joinType, joinTypes) {
+                       String prefix = joinType;
+                       boost::algorithm::to_lower(prefix);
+
+                       Dictionary::Ptr result1 = new Dictionary();
+                       for (int fid = 0; fid < type->GetFieldCount(); fid++) {
+                               Field field = type->GetFieldInfo(fid);
+
+                               if ((field.Attributes & (FAConfig|FAState)) == 0)
+                                       continue;
+
+                               String aname = prefix + "." + field.Name;
+                               if (!attrs.empty() && attrs.find(aname) == attrs.end())
+                                       continue;
+
+                               Value val = static_cast<Object::Ptr>(obj)->GetField(fid);
+                               Value sval = Serialize(val, FAConfig | FAState);
+                               result1->Set(aname, sval);
+                       }
+                       results->Add(result1);
+               }
        }
 
        Dictionary::Ptr result = new Dictionary();