]> granicus.if.org Git - icinga2/commitdiff
Implement acknowledgements.
authorGunnar Beutner <gunnar.beutner@netways.de>
Wed, 23 Jan 2013 12:21:07 +0000 (13:21 +0100)
committerGunnar Beutner <gunnar.beutner@netways.de>
Wed, 23 Jan 2013 12:21:07 +0000 (13:21 +0100)
Fixes #3557

components/compat/compatcomponent.cpp
lib/icinga/externalcommand.cpp
lib/icinga/externalcommand.h
lib/icinga/service.cpp
lib/icinga/service.h

index 7d00e3888b0240574ba03347732b30b337fbc56a..a461818b6ac2fec6d5f433f344ded88dab2e7543 100644 (file)
@@ -296,6 +296,9 @@ void CompatComponent::DumpServiceStatus(ofstream& fp, const Service::Ptr& servic
           << "\t" << "last_update=" << time(NULL) << "\n"
           << "\t" << "active_checks_enabled=" << (service->GetEnableChecks() ? 1 : 0) <<"\n"
           << "\t" << "passive_checks_enabled=1" << "\n"
+          << "\t" << "problem_has_been_acknowledged=" << (service->GetAcknowledgement() != AcknowledgementNone ? 1 : 0) << "\n"
+          << "\t" << "acknowledgement_type=" << static_cast<int>(service->GetAcknowledgement()) << "\n"
+          << "\t" << "acknowledgement_end_time=" << service->GetAcknowledgementExpiry() << "\n"
           << "\t" << "}" << "\n"
           << "\n";
 }
index 8c4764d34f243f8e2773c597f2c0e80639648212..d7f7496fc0610dc77574fc9997156813de26b8bc 100644 (file)
@@ -38,6 +38,10 @@ void ExternalCommand::Execute(double time, const String& command, const vector<S
                RegisterCommand("SCHEDULE_HOST_SVC_CHECKS", &ExternalCommand::ScheduleHostSvcChecks);
                RegisterCommand("ENABLE_HOST_SVC_CHECKS", &ExternalCommand::EnableHostSvcChecks);
                RegisterCommand("DISABLE_HOST_SVC_CHECKS", &ExternalCommand::DisableHostSvcChecks);
+               RegisterCommand("ACKNOWLEDGE_SVC_PROBLEM", &ExternalCommand::AcknowledgeSvcProblem);
+               RegisterCommand("ACKNOWLEDGE_SVC_PROBLEM_EXPIRE", &ExternalCommand::AcknowledgeSvcProblemExpire);
+               RegisterCommand("REMOVE_SVC_ACKNOWLEDGEMENT", &ExternalCommand::RemoveSvcAcknowledgement);
+
 
                m_Initialized = true;
        }
@@ -255,3 +259,50 @@ void ExternalCommand::DisableHostSvcChecks(double time, const vector<String>& ar
        }
 }
 
+void ExternalCommand::AcknowledgeSvcProblem(double time, const vector<String>& arguments)
+{
+       if (arguments.size() < 7)
+               throw_exception(invalid_argument("Expected 7 arguments."));
+
+       if (!Service::Exists(arguments[1]))
+               throw_exception(invalid_argument("The service '" + arguments[1] + "' does not exist."));
+
+       int sticky = arguments[2].ToDouble();
+
+       Service::Ptr service = Service::GetByName(arguments[1]);
+
+       service->SetAcknowledgement(sticky ? AcknowledgementSticky : AcknowledgementNormal);
+       service->SetAcknowledgementExpiry(0);
+}
+
+void ExternalCommand::AcknowledgeSvcProblemExpire(double time, const vector<String>& arguments)
+{
+       if (arguments.size() < 8)
+               throw_exception(invalid_argument("Expected 8 arguments."));
+
+       if (!Service::Exists(arguments[1]))
+               throw_exception(invalid_argument("The service '" + arguments[1] + "' does not exist."));
+
+       int sticky = arguments[2].ToDouble();
+       double timestamp = arguments[4].ToDouble();
+
+       Service::Ptr service = Service::GetByName(arguments[1]);
+
+       service->SetAcknowledgement(sticky ? AcknowledgementSticky : AcknowledgementNormal);
+       service->SetAcknowledgementExpiry(timestamp);
+}
+
+void ExternalCommand::RemoveSvcAcknowledgement(double time, const vector<String>& arguments)
+{
+       if (arguments.size() < 2)
+               throw_exception(invalid_argument("Expected 2 arguments."));
+
+       if (!Service::Exists(arguments[1]))
+               throw_exception(invalid_argument("The service '" + arguments[1] + "' does not exist."));
+
+       Service::Ptr service = Service::GetByName(arguments[1]);
+
+       service->SetAcknowledgement(AcknowledgementNone);
+       service->SetAcknowledgementExpiry(0);
+}
+
index adb7eb5557b1b0d00046b0f3c59c03c09dad181f..346c6041bad87357716a343bd6e7f7ded4b02760 100644 (file)
@@ -39,6 +39,9 @@ public:
        static void ScheduleHostSvcChecks(double time, const vector<String>& arguments);
        static void EnableHostSvcChecks(double time, const vector<String>& arguments);
        static void DisableHostSvcChecks(double time, const vector<String>& arguments);
+       static void AcknowledgeSvcProblem(double time, const vector<String>& arguments);
+       static void AcknowledgeSvcProblemExpire(double time, const vector<String>& arguments);
+       static void RemoveSvcAcknowledgement(double time, const vector<String>& arguments);
 
 private:
        typedef function<void (double time, const vector<String>& arguments)> Callback;
index ef9b94dbdf724fe2356a73b5c6cf8800c687c491..d9d49ec5c1eb75b277ae2097eb0fab70f9baa65f 100644 (file)
@@ -43,7 +43,9 @@ static AttributeDescription serviceAttributes[] = {
        { "last_state_change", Attribute_Replicated },
        { "last_hard_state_change", Attribute_Replicated },
        { "enable_checks", Attribute_Replicated },
-       { "force_next_check", Attribute_Replicated }
+       { "force_next_check", Attribute_Replicated },
+       { "acknowledgement", Attribute_Replicated },
+       { "acknowledgement_expiry", Attribute_Replicated }
 };
 
 REGISTER_TYPE(Service, serviceAttributes);
@@ -385,6 +387,48 @@ void Service::SetForceNextCheck(bool forced)
        Set("force_next_check", forced ? 1 : 0);
 }
 
+AcknowledgementType Service::GetAcknowledgement(void)
+{
+       Value value = Get("acknowledgement");
+
+       if (value.IsEmpty())
+               return AcknowledgementNone;
+
+       int ivalue = static_cast<int>(value);
+       AcknowledgementType avalue = static_cast<AcknowledgementType>(ivalue);
+
+       if (avalue != AcknowledgementNone) {
+               double expiry = GetAcknowledgementExpiry();
+
+               if (expiry != 0 && expiry < Utility::GetTime()) {
+                       avalue = AcknowledgementNone;
+                       SetAcknowledgementExpiry(avalue);
+               }
+       }
+
+       return avalue;
+}
+
+void Service::SetAcknowledgement(AcknowledgementType acknowledgement)
+{
+       Set("acknowledgement", static_cast<long>(acknowledgement));
+}
+
+double Service::GetAcknowledgementExpiry(void) const
+{
+       Value value = Get("acknowledgement_expiry");
+
+       if (value.IsEmpty())
+               return 0;
+
+       return static_cast<double>(value);
+}
+
+void Service::SetAcknowledgementExpiry(double timestamp)
+{
+       Set("acknowledgement_expiry", timestamp);
+}
+
 void Service::ApplyCheckResult(const Dictionary::Ptr& cr)
 {
        ServiceState old_state = GetState();
@@ -421,6 +465,13 @@ void Service::ApplyCheckResult(const Dictionary::Ptr& cr)
 
                if (old_stateType != GetStateType())
                        SetLastHardStateChange(now);
+
+               /* remove acknowledgements */
+               if (GetAcknowledgement() == AcknowledgementNormal ||
+                   (GetAcknowledgement() == AcknowledgementSticky && GetStateType() == StateTypeHard && GetState() == StateOK)) {
+                       SetAcknowledgement(AcknowledgementNone);
+                       SetAcknowledgementExpiry(0);
+               }
        }
 }
 
index 99b14395040448715f8a7f6c7ad303fbfb91a607..91bbc92b08b771fcc2ffed3f1456a31eedcbbbfb 100644 (file)
@@ -48,6 +48,18 @@ enum ServiceStateType
        StateTypeHard
 };
 
+/**
+ * The acknowledgement type of a service.
+ *
+ * @ingroup icinga
+ */
+enum AcknowledgementType
+{
+       AcknowledgementNone = 0,
+       AcknowledgementNormal = 1,
+       AcknowledgementSticky = 2
+};
+
 class CheckResultMessage;
 class ServiceStatusMessage;
 
@@ -122,6 +134,12 @@ public:
        bool GetForceNextCheck(void) const;
        void SetForceNextCheck(bool forced);
 
+       AcknowledgementType GetAcknowledgement(void);
+       void SetAcknowledgement(AcknowledgementType acknowledgement);
+
+       double GetAcknowledgementExpiry(void) const;
+       void SetAcknowledgementExpiry(double timestamp);
+
        void ApplyCheckResult(const Dictionary::Ptr& cr);
 
        void BeginExecuteCheck(const function<void (void)>& callback);