diff --git a/lib/icinga/checkable.cpp b/lib/icinga/checkable.cpp index 73bf6afa3..9e13c17fd 100644 --- a/lib/icinga/checkable.cpp +++ b/lib/icinga/checkable.cpp @@ -51,6 +51,27 @@ Checkable::Checkable(void) SetSchedulingOffset(Utility::Random()); } +void Checkable::OnAllConfigLoaded(void) +{ + ObjectImpl<Checkable>::OnAllConfigLoaded(); + + Endpoint::Ptr endpoint = GetCommandEndpoint(); + + if (endpoint) { + Zone::Ptr checkableZone = static_pointer_cast<Zone>(GetZone()); + + if (!checkableZone) + checkableZone = Zone::GetLocalZone(); + + Zone::Ptr cmdZone = endpoint->GetZone(); + + if (cmdZone != checkableZone && cmdZone->GetParent() != checkableZone) { + BOOST_THROW_EXCEPTION(ValidationError(this, boost::assign::list_of("command_endpoint"), + "Command endpoint must be in zone '" + checkableZone->GetName() + "' or in a direct child zone thereof.")); + } + } +} + void Checkable::Start(bool runtimeCreated) { double now = Utility::GetTime(); diff --git a/lib/icinga/checkable.hpp b/lib/icinga/checkable.hpp index d40e1b76e..db15fcae9 100644 --- a/lib/icinga/checkable.hpp +++ b/lib/icinga/checkable.hpp @@ -185,6 +185,7 @@ public: protected: virtual void Start(bool runtimeCreated) override; + virtual void OnAllConfigLoaded(void) override; private: mutable boost::mutex m_CheckableMutex; diff --git a/lib/icinga/checkable.ti b/lib/icinga/checkable.ti index 27a158da4..81571f924 100644 --- a/lib/icinga/checkable.ti +++ b/lib/icinga/checkable.ti @@ -44,6 +44,10 @@ enum AcknowledgementType abstract class Checkable : CustomVarObject { + load_after ApiListener; + load_after Endpoint; + load_after Zone; + [config, required, navigation] name(CheckCommand) check_command (CheckCommandRaw) { navigate {{{ return CheckCommand::GetByName(GetCheckCommandRaw()); diff --git a/lib/remote/endpoint.cpp b/lib/remote/endpoint.cpp index 4430308ee..1cfe9ed59 100644 --- a/lib/remote/endpoint.cpp +++ b/lib/remote/endpoint.cpp @@ -37,7 +37,7 @@ boost::signals2::signal<void(const Endpoint::Ptr&, const JsonRpcConnection::Ptr& void Endpoint::OnAllConfigLoaded(void) { - ConfigObject::OnConfigLoaded(); + ObjectImpl<Endpoint>::OnAllConfigLoaded(); BOOST_FOREACH(const Zone::Ptr& zone, ConfigType::GetObjectsByType<Zone>()) { const std::set<Endpoint::Ptr> members = zone->GetEndpoints(); diff --git a/lib/remote/zone.cpp b/lib/remote/zone.cpp index 31286b859..594fc6c3f 100644 --- a/lib/remote/zone.cpp +++ b/lib/remote/zone.cpp @@ -30,6 +30,8 @@ REGISTER_TYPE(Zone); void Zone::OnAllConfigLoaded(void) { + ObjectImpl<Zone>::OnAllConfigLoaded(); + m_Parent = Zone::GetByName(GetParentRaw()); Zone::Ptr zone = m_Parent;