X-Git-Url: https://granicus.if.org/sourcecode?a=blobdiff_plain;f=lib%2Ficinga%2Fcheckable.cpp;h=d54aa8ec514b8b434cb37760438b014f70f1afae;hb=a1f04992f322835211b13a4444c0f1b9f5f5fbe6;hp=eabce35e36a772752adc08605fd5d2e8dcf10360;hpb=01a0496988fdfa76ee53c0bfa4bb26066a0c24c8;p=icinga2 diff --git a/lib/icinga/checkable.cpp b/lib/icinga/checkable.cpp index eabce35e3..d54aa8ec5 100644 --- a/lib/icinga/checkable.cpp +++ b/lib/icinga/checkable.cpp @@ -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 * @@ -17,30 +17,22 @@ * 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 #include using namespace icinga; REGISTER_TYPE(Checkable); +REGISTER_SCRIPTFUNCTION(ValidateCheckableCheckInterval, &Checkable::ValidateCheckInterval); -INITIALIZE_ONCE(&Checkable::StartDowntimesExpiredTimer); - -boost::signals2::signal Checkable::OnAcknowledgementSet; -boost::signals2::signal Checkable::OnAcknowledgementCleared; +boost::signals2::signal Checkable::OnEnablePerfdataChanged; +boost::signals2::signal Checkable::OnAcknowledgementSet; +boost::signals2::signal 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(); + 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())); } }