]> granicus.if.org Git - icinga2/blobdiff - lib/icinga/checkable.cpp
Fix notify flag is ignored in ACKNOWLEDGE_*_PROBLEM commands
[icinga2] / lib / icinga / checkable.cpp
index eabce35e36a772752adc08605fd5d2e8dcf10360..d54aa8ec514b8b434cb37760438b014f70f1afae 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  * Icinga 2                                                                   *
- * Copyright (C) 2012-2014 Icinga Development Team (http://www.icinga.org)    *
+ * Copyright (C) 2012-2015 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                *
  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.             *
  ******************************************************************************/
 
-#include "icinga/service.h"
-#include "icinga/servicegroup.h"
-#include "icinga/checkcommand.h"
-#include "icinga/icingaapplication.h"
-#include "icinga/macroprocessor.h"
-#include "icinga/pluginutility.h"
-#include "icinga/dependency.h"
-#include "config/configitembuilder.h"
-#include "base/dynamictype.h"
-#include "base/objectlock.h"
-#include "base/convert.h"
-#include "base/utility.h"
-#include "base/initialize.h"
+#include "icinga/checkable.hpp"
+#include "base/objectlock.hpp"
+#include "base/utility.hpp"
+#include "base/function.hpp"
+#include "base/exception.hpp"
 #include <boost/foreach.hpp>
 #include <boost/bind/apply.hpp>
 
 using namespace icinga;
 
 REGISTER_TYPE(Checkable);
+REGISTER_SCRIPTFUNCTION(ValidateCheckableCheckInterval, &Checkable::ValidateCheckInterval);
 
-INITIALIZE_ONCE(&Checkable::StartDowntimesExpiredTimer);
-
-boost::signals2::signal<void (const Checkable::Ptr&, const String&, const String&, AcknowledgementType, double, const String&)> Checkable::OnAcknowledgementSet;
-boost::signals2::signal<void (const Checkable::Ptr&, const String&)> Checkable::OnAcknowledgementCleared;
+boost::signals2::signal<void (const Checkable::Ptr&, bool, const MessageOrigin&)> Checkable::OnEnablePerfdataChanged;
+boost::signals2::signal<void (const Checkable::Ptr&, const String&, const String&, AcknowledgementType, bool, double, const MessageOrigin&)> Checkable::OnAcknowledgementSet;
+boost::signals2::signal<void (const Checkable::Ptr&, const MessageOrigin&)> Checkable::OnAcknowledgementCleared;
 
 Checkable::Checkable(void)
        : m_CheckRunning(false)
@@ -84,6 +76,9 @@ void Checkable::OnStateLoaded(void)
        }
 
        BOOST_FOREACH(const String& id, ids) {
+               /* override config owner to clear downtimes once */
+               Downtime::Ptr downtime = GetDowntimeByID(id);
+               downtime->SetConfigOwner(Empty);
                RemoveDowntime(id, true);
        }
 }
@@ -94,8 +89,11 @@ void Checkable::AddGroup(const String& name)
 
        Array::Ptr groups = GetGroups();
 
+       if (groups && groups->Contains(name))
+               return;
+
        if (!groups)
-               groups = make_shared<Array>();
+               groups = new Array();
 
        groups->Add(name);
 }
@@ -123,7 +121,7 @@ bool Checkable::IsAcknowledged(void)
        return GetAcknowledgement() != AcknowledgementNone;
 }
 
-void Checkable::AcknowledgeProblem(const String& author, const String& comment, AcknowledgementType type, double expiry, const String& authority)
+void Checkable::AcknowledgeProblem(const String& author, const String& comment, AcknowledgementType type, bool notify, double expiry, const MessageOrigin& origin)
 {
        {
                ObjectLock olock(this);
@@ -132,19 +130,20 @@ void Checkable::AcknowledgeProblem(const String& author, const String& comment,
                SetAcknowledgementExpiry(expiry);
        }
 
-       OnNotificationsRequested(GetSelf(), NotificationAcknowledgement, GetLastCheckResult(), author, comment);
+       if (notify)
+               OnNotificationsRequested(this, NotificationAcknowledgement, GetLastCheckResult(), author, comment);
 
-       OnAcknowledgementSet(GetSelf(), author, comment, type, expiry, authority);
+       OnAcknowledgementSet(this, author, comment, type, notify, expiry, origin);
 }
 
-void Checkable::ClearAcknowledgement(const String& authority)
+void Checkable::ClearAcknowledgement(const MessageOrigin& origin)
 {
        ASSERT(OwnsLock());
 
        SetAcknowledgementRaw(AcknowledgementNone);
        SetAcknowledgementExpiry(0);
 
-       OnAcknowledgementCleared(GetSelf(), authority);
+       OnAcknowledgementCleared(this, origin);
 }
 
 bool Checkable::GetEnablePerfdata(void) const
@@ -155,9 +154,11 @@ bool Checkable::GetEnablePerfdata(void) const
                return GetEnablePerfdataRaw();
 }
 
-void Checkable::SetEnablePerfdata(bool enabled, const String& authority)
+void Checkable::SetEnablePerfdata(bool enabled, const MessageOrigin& origin)
 {
        SetOverrideEnablePerfdata(enabled);
+
+       OnEnablePerfdataChanged(this, enabled, origin);
 }
 
 int Checkable::GetModifiedAttributes(void) const
@@ -200,7 +201,7 @@ int Checkable::GetModifiedAttributes(void) const
        if (!GetOverrideCheckPeriod().IsEmpty())
                attrs |= ModAttrCheckTimeperiod;
 
-       if (!GetOverrideVars().IsEmpty())
+       if (GetOverrideVars())
                attrs |= ModAttrCustomVariable;
 
        // TODO: finish
@@ -208,25 +209,35 @@ int Checkable::GetModifiedAttributes(void) const
        return attrs;
 }
 
-void Checkable::SetModifiedAttributes(int flags)
+void Checkable::SetModifiedAttributes(int flags, const MessageOrigin& origin)
 {
-       if ((flags & ModAttrNotificationsEnabled) == 0)
+       if ((flags & ModAttrNotificationsEnabled) == 0) {
                SetOverrideEnableNotifications(Empty);
+               OnEnableNotificationsChanged(this, GetEnableNotifications(), origin);
+       }
 
-       if ((flags & ModAttrActiveChecksEnabled) == 0)
+       if ((flags & ModAttrActiveChecksEnabled) == 0) {
                SetOverrideEnableActiveChecks(Empty);
+               OnEnableActiveChecksChanged(this, GetEnableActiveChecks(), origin);
+       }
 
-       if ((flags & ModAttrPassiveChecksEnabled) == 0)
+       if ((flags & ModAttrPassiveChecksEnabled) == 0) {
                SetOverrideEnablePassiveChecks(Empty);
+               OnEnablePassiveChecksChanged(this, GetEnablePassiveChecks(), origin);
+       }
 
-       if ((flags & ModAttrFlapDetectionEnabled) == 0)
+       if ((flags & ModAttrFlapDetectionEnabled) == 0) {
                SetOverrideEnableFlapping(Empty);
+               OnEnableFlappingChanged(this, GetEnableFlapping(), origin);
+       }
 
        if ((flags & ModAttrEventHandlerEnabled) == 0)
                SetOverrideEnableEventHandler(Empty);
 
-       if ((flags & ModAttrPerformanceDataEnabled) == 0)
+       if ((flags & ModAttrPerformanceDataEnabled) == 0) {
                SetOverrideEnablePerfdata(Empty);
+               OnEnablePerfdataChanged(this, GetEnablePerfdata(), origin);
+       }
 
        if ((flags & ModAttrNormalCheckInterval) == 0)
                SetOverrideCheckInterval(Empty);
@@ -248,6 +259,19 @@ void Checkable::SetModifiedAttributes(int flags)
 
        if ((flags & ModAttrCustomVariable) == 0) {
                SetOverrideVars(Empty);
-               OnVarsChanged(GetSelf());
+               OnVarsChanged(this, GetVars(), origin);
+       }
+}
+
+Endpoint::Ptr Checkable::GetCommandEndpoint(void) const
+{
+       return Endpoint::GetByName(GetCommandEndpointRaw());
+}
+
+void Checkable::ValidateCheckInterval(const String& location, const Checkable::Ptr& object)
+{
+       if (object->GetCheckInterval() <= 0) {
+               BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
+                   location + ": check_interval must be greater than 0.", object->GetDebugInfo()));
        }
 }