]> granicus.if.org Git - icinga2/commitdiff
Implemented extended service template format.
authorGunnar Beutner <gunnar@beutner.name>
Sun, 8 Jul 2012 08:20:54 +0000 (10:20 +0200)
committerGunnar Beutner <gunnar@beutner.name>
Sun, 8 Jul 2012 08:20:54 +0000 (10:20 +0200)
components/convenience/conveniencecomponent.cpp
components/convenience/conveniencecomponent.h

index a3893aea9eb750c455c5898d1ccb3aae82f2a7d6..18af2f0ce0b1b8ecf1106a93b562c7805644a279 100644 (file)
@@ -54,6 +54,29 @@ void ConvenienceComponent::HostAddedHandler(const ConfigItem::Ptr& item)
        HostCommittedHandler(item);
 }
 
+void ConvenienceComponent::CopyServiceAttributes(const Dictionary::Ptr& service, const ConfigItemBuilder::Ptr& builder)
+{
+       Dictionary::Ptr macros; 
+       if (service->GetProperty("macros", &macros))
+               builder->AddExpression("macros", OperatorPlus, macros);
+
+       long checkInterval;
+       if (service->GetProperty("check_interval", &checkInterval))
+               builder->AddExpression("check_interval", OperatorSet, checkInterval);
+
+       long retryInterval;
+       if (service->GetProperty("retry_interval", &retryInterval))
+               builder->AddExpression("retry_interval", OperatorSet, retryInterval);
+
+       Dictionary::Ptr sgroups;
+       if (service->GetProperty("servicegroups", &sgroups))
+               builder->AddExpression("servicegroups", OperatorPlus, sgroups);
+
+       Dictionary::Ptr checkers;
+       if (service->GetProperty("checkers", &checkers))
+               builder->AddExpression("checkers", OperatorSet, checkers);
+}
+
 void ConvenienceComponent::HostCommittedHandler(const ConfigItem::Ptr& item)
 {
        if (item->GetType() != "host")
@@ -77,51 +100,44 @@ void ConvenienceComponent::HostCommittedHandler(const ConfigItem::Ptr& item)
        if (serviceDescs) {
                Dictionary::Iterator it;
                for (it = serviceDescs->Begin(); it != serviceDescs->End(); it++) {
-                       Variant desc = it->second;
+                       string svcname = it->first;
+                       Variant svcdesc = it->second;
 
-                       ConfigItemBuilder::Ptr builder = boost::make_shared<ConfigItemBuilder>(item->GetDebugInfo());
+                       stringstream namebuf;
+                       namebuf << item->GetName() << "-" << svcname;
+                       string name = namebuf.str();
 
-                       string name;
-
-                       if (desc.GetType() == VariantString) {
-                               stringstream namebuf;
-                               namebuf << item->GetName() << "-" << string(desc);
-                               name = namebuf.str();
-
-                               builder->SetType("service");
-                               builder->SetName(name);
-
-                               builder->AddParent(desc);
-                               builder->AddExpression("host_name", OperatorSet, item->GetName());
-                               builder->AddExpression("alias", OperatorSet, string(desc));
-
-                               Dictionary::Ptr macros;
-                               if (host->GetProperty("macros", &macros))
-                                       builder->AddExpression("macros", OperatorPlus, macros);
+                       ConfigItemBuilder::Ptr builder = boost::make_shared<ConfigItemBuilder>(item->GetDebugInfo());
+                       builder->SetType("service");
+                       builder->SetName(name);
+                       builder->AddExpression("host_name", OperatorSet, item->GetName());
+                       builder->AddExpression("alias", OperatorSet, svcname);
 
-                               long checkInterval;
-                               if (host->GetProperty("check_interval", &checkInterval))
-                                       builder->AddExpression("check_interval", OperatorSet, checkInterval);
+                       CopyServiceAttributes(host->GetProperties(), builder);
 
-                               long retryInterval;
-                               if (host->GetProperty("retry_interval", &retryInterval))
-                                       builder->AddExpression("retry_interval", OperatorSet, retryInterval);
+                       if (svcdesc.GetType() == VariantString) {
+                               builder->AddParent(svcdesc);
+                       } else if (svcdesc.GetType() == VariantObject) {
+                               Dictionary::Ptr service = dynamic_pointer_cast<Dictionary>(svcdesc.GetObject());
 
-                               Dictionary::Ptr sgroups;
-                               if (host->GetProperty("servicegroups", &sgroups))
-                                       builder->AddExpression("servicegroups", OperatorPlus, sgroups);
+                               if (!service)
+                                       throw invalid_argument("Service description invalid.");
 
-                               Dictionary::Ptr checkers;
-                               if (host->GetProperty("checkers", &checkers))
-                                       builder->AddExpression("checkers", OperatorSet, checkers);
+                               string parent;
+                               if (!service->GetProperty("service", &parent))
+                                       parent = string(svcdesc);
 
-                               ConfigItem::Ptr serviceItem = builder->Compile();
-                               ConfigObject::Ptr service = serviceItem->Commit();
+                               builder->AddParent(parent);
 
-                               newServices->SetProperty(name, serviceItem);
+                               CopyServiceAttributes(service, builder);
                        } else {
-                               throw runtime_error("Not supported.");
+                               throw invalid_argument("Service description must be either a string or a dictionary.");
                        }
+
+                       ConfigItem::Ptr serviceItem = builder->Compile();
+                       serviceItem->Commit();
+
+                       newServices->SetProperty(name, serviceItem);
                }
        }
 
index 8eb73e4ea48b0d8654f33ea0eedfdb7e5c96f912..45684e19f6b8d662cb590366ca4f7e73afe2d8e2 100644 (file)
@@ -34,6 +34,7 @@ public:
        virtual void Stop(void);
 
 private:
+       void CopyServiceAttributes(const Dictionary::Ptr& service, const ConfigItemBuilder::Ptr& builder);
        void HostAddedHandler(const ConfigItem::Ptr& item);
        void HostCommittedHandler(const ConfigItem::Ptr& item);
        void HostRemovedHandler(const ConfigItem::Ptr& item);