]> granicus.if.org Git - icinga2/commitdiff
Implement support for time periods.
authorGunnar Beutner <gunnar@beutner.name>
Mon, 21 Jan 2013 12:47:36 +0000 (13:47 +0100)
committerGunnar Beutner <gunnar@beutner.name>
Mon, 21 Jan 2013 12:47:36 +0000 (13:47 +0100)
lib/base/asynctask.h
lib/base/dynamicobject.h
lib/icinga/Makefile.am
lib/icinga/i2-icinga.h
lib/icinga/icinga.vcxproj
lib/icinga/icinga.vcxproj.filters
lib/icinga/timeperiod.cpp [new file with mode: 0644]
lib/icinga/timeperiod.h [new file with mode: 0644]

index e05c1c343911e48a658cd4227f8d7acef60bbe0e..f195a1830ebcdedff2118418142ed8caee3898ce 100644 (file)
@@ -74,6 +74,14 @@ public:
                }
        }
 
+       /**
+        * Checks whether the task is finished.
+        */
+       bool IsFinished(void) const
+       {
+               return m_Finished;
+       }
+
        /**
         * Retrieves the result of the task. Throws an exception if one is stored in
         * the AsyncTask object.
index 828622da99bdd394bc40be3739d873a3d4713f15..f809f846d963ea733221493a6d7f5cb075a3ce3d 100644 (file)
@@ -97,6 +97,20 @@ public:
        static boost::signal<void (const DynamicObject::Ptr&)> OnUnregistered;
        static boost::signal<void (const set<DynamicObject::Ptr>&)> OnTransactionClosing;
 
+       /**
+        * Synchronously invokes a method. The method must not return before it's finished.
+        *
+        * @param method The name of the method.
+        * @param arguments Arguments for the method.
+        */
+       template<typename T>
+       T InvokeMethodSync(const String& method, const vector<Value>& arguments)
+       {
+               ScriptTask::Ptr task = InvokeMethod(method, arguments, ScriptTask::CompletionCallback());
+               assert(task->IsFinished());
+               return task->GetResult();
+       }
+
        ScriptTask::Ptr InvokeMethod(const String& method,
            const vector<Value>& arguments, ScriptTask::CompletionCallback callback);
 
index 9e003acec9b9cfc174fcdc6c3078287ffa0c3882..5e40953198aed0e06c98752bdfb8f93e69314caf 100644 (file)
@@ -25,7 +25,9 @@ libicinga_la_SOURCES =  \
        servicegroup.h \
        service.h \
        servicestatechangemessage.cpp \
-       servicestatechangemessage.h
+       servicestatechangemessage.h \
+       timeperiod.cpp \
+       timeperiod.h
 
 libicinga_la_CPPFLAGS = \
        -DI2_ICINGA_BUILD \
index cc924f458def8555e0812df4e90835e4f0fe1e78..f221e68f6001b22f3271a5ac6a0c7ed766dc4ab9 100644 (file)
@@ -44,6 +44,8 @@ using boost::algorithm::is_any_of;
 #include "endpointmanager.h"
 #include "icingaapplication.h"
 
+#include "timeperiod.h"
+
 #include "host.h"
 #include "hostgroup.h"
 #include "service.h"
index b8d5727e4af25dba2e41f35159c36e80cceb40c5..7f073559d096037837e97a6e9586a08c720a56f6 100644 (file)
@@ -35,6 +35,7 @@
     <ClCompile Include="service.cpp" />
     <ClCompile Include="servicegroup.cpp" />
     <ClCompile Include="servicestatechangemessage.cpp" />
+    <ClCompile Include="timeperiod.cpp" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="cib.h" />
@@ -48,6 +49,7 @@
     <ClInclude Include="service.h" />
     <ClInclude Include="servicegroup.h" />
     <ClInclude Include="servicestatechangemessage.h" />
+    <ClInclude Include="timeperiod.h" />
   </ItemGroup>
   <PropertyGroup Label="Globals">
     <ProjectGuid>{C1FC77E1-04A4-481B-A78B-2F7AF489C2F8}</ProjectGuid>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
index 10cb4bb57c4cc9e1bec0d1ff129fe4b0451c68f0..73df5d7d5cf9d8ae1f30e40d42d6678f54849a05 100644 (file)
@@ -34,6 +34,9 @@
     <ClCompile Include="pluginchecktask.cpp">
       <Filter>Quelldateien</Filter>
     </ClCompile>
+    <ClCompile Include="timeperiod.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="i2-icinga.h">
@@ -69,6 +72,9 @@
     <ClInclude Include="pluginchecktask.h">
       <Filter>Headerdateien</Filter>
     </ClInclude>
+    <ClInclude Include="timeperiod.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <Filter Include="Headerdateien">
diff --git a/lib/icinga/timeperiod.cpp b/lib/icinga/timeperiod.cpp
new file mode 100644 (file)
index 0000000..7e35ef2
--- /dev/null
@@ -0,0 +1,80 @@
+/******************************************************************************
+ * Icinga 2                                                                   *
+ * Copyright (C) 2012 Icinga Development Team (http://www.icinga.org/)        *
+ *                                                                            *
+ * This program is free software; you can redistribute it and/or              *
+ * modify it under the terms of the GNU General Public License                *
+ * as published by the Free Software Foundation; either version 2             *
+ * of the License, or (at your option) any later version.                     *
+ *                                                                            *
+ * This program is distributed in the hope that it will be useful,            *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
+ * GNU General Public License for more details.                               *
+ *                                                                            *
+ * You should have received a copy of the GNU General Public License          *
+ * along with this program; if not, write to the Free Software Foundation     *
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.             *
+ ******************************************************************************/
+
+#include "i2-icinga.h"
+
+using namespace icinga;
+
+static AttributeDescription timePeriodAttributes[] = {
+       { "alias", Attribute_Config },
+       { "cached_state", Attribute_Transient },
+       { "cached_next_change", Attribute_Transient }
+};
+
+REGISTER_TYPE(TimePeriod, timePeriodAttributes);
+
+String TimePeriod::GetAlias(void) const
+{
+       String value = Get("alias");
+
+       if (!value.IsEmpty())
+               return value;
+       else
+               return GetName();
+}
+
+bool TimePeriod::Exists(const String& name)
+{
+       return (DynamicObject::GetObject("TimePeriod", name));
+}
+
+TimePeriod::Ptr TimePeriod::GetByName(const String& name)
+{
+       DynamicObject::Ptr configObject = DynamicObject::GetObject("TimePeriod", name);
+
+       if (!configObject)
+               throw_exception(invalid_argument("TimePeriod '" + name + "' does not exist."));
+
+       return dynamic_pointer_cast<TimePeriod>(configObject);
+}
+
+bool TimePeriod::IsActive(void) {
+       if (GetNextChange() > Utility::GetTime()) {
+               vector<Value> args;
+               args.push_back(static_cast<TimePeriod::Ptr>(GetSelf()));
+               return InvokeMethodSync<bool>("is_active", args);
+       } else {
+               return Get("cached_state");
+       }
+}
+
+double TimePeriod::GetNextChange(void) {
+       double next_change = Get("cached_next_change");
+
+       if (next_change < Utility::GetTime()) {
+               vector<Value> args;
+               args.push_back(static_cast<TimePeriod::Ptr>(GetSelf()));
+               next_change = InvokeMethodSync<bool>("is_active", args);
+               // TODO: figure out next_change by calling method
+
+               Set("cached_next_change", next_change);
+       }
+
+       return next_change;
+}
diff --git a/lib/icinga/timeperiod.h b/lib/icinga/timeperiod.h
new file mode 100644 (file)
index 0000000..fbf2184
--- /dev/null
@@ -0,0 +1,46 @@
+/******************************************************************************
+ * Icinga 2                                                                   *
+ * Copyright (C) 2012 Icinga Development Team (http://www.icinga.org/)        *
+ *                                                                            *
+ * This program is free software; you can redistribute it and/or              *
+ * modify it under the terms of the GNU General Public License                *
+ * as published by the Free Software Foundation; either version 2             *
+ * of the License, or (at your option) any later version.                     *
+ *                                                                            *
+ * This program is distributed in the hope that it will be useful,            *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
+ * GNU General Public License for more details.                               *
+ *                                                                            *
+ * You should have received a copy of the GNU General Public License          *
+ * along with this program; if not, write to the Free Software Foundation     *
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.             *
+ ******************************************************************************/
+
+#ifndef TIMEPERIOD_H
+#define TIMEPERIOD_H
+
+namespace icinga
+{
+       
+class TimePeriod : public DynamicObject {
+public:
+       typedef shared_ptr<TimePeriod> Ptr;
+       typedef weak_ptr<TimePeriod> WeakPtr;
+
+       TimePeriod(const Dictionary::Ptr& properties)
+               : DynamicObject(properties)
+       { }
+
+       static bool Exists(const String& name);
+       static TimePeriod::Ptr GetByName(const String& name);
+
+       String GetAlias(void) const;
+
+       bool IsActive(void);
+       double GetNextChange(void);
+};
+
+}
+
+#endif /* TIMEPERIOD_H */
\ No newline at end of file