]> granicus.if.org Git - icinga2/commitdiff
Fix object resync issues
authorGunnar Beutner <gunnar.beutner@icinga.com>
Tue, 11 Oct 2016 08:53:51 +0000 (10:53 +0200)
committerGunnar Beutner <gunnar.beutner@icinga.com>
Tue, 11 Oct 2016 08:55:13 +0000 (10:55 +0200)
refs #11684

lib/remote/apilistener-configsync.cpp
lib/remote/apilistener.cpp
lib/remote/apilistener.hpp

index d72fd715b688e399be1993eb3d926a971bdca766..beeedb8d58369bebb9b36587cf45bf930926627e 100644 (file)
@@ -107,7 +107,11 @@ Value ApiListener::ConfigUpdateObjectAPIHandler(const MessageOrigin::Ptr& origin
 
        String config = params->Get("config");
 
+       bool newObject = false;
+
        if (!object && !config.IsEmpty()) {
+               newObject = true;
+
                /* object does not exist, create it through the API */
                Array::Ptr errors = new Array();
 
@@ -136,8 +140,8 @@ Value ApiListener::ConfigUpdateObjectAPIHandler(const MessageOrigin::Ptr& origin
        if (!object)
                return Empty;
 
-       /* update object attributes if version was changed */
-       if (objVersion <= object->GetVersion()) {
+       /* update object attributes if version was changed or if this is a new object */
+       if (newObject || objVersion <= object->GetVersion()) {
                Log(LogNotice, "ApiListener")
                    << "Discarding config update for object '" << object->GetName()
                    << "': Object version " << std::fixed << object->GetVersion()
@@ -337,8 +341,14 @@ void ApiListener::UpdateConfigObject(const ConfigObject::Ptr& object, const Mess
 
        if (client)
                JsonRpc::SendMessage(client->GetStream(), message);
-       else
+       else {
+               Zone::Ptr target = static_pointer_cast<Zone>(object->GetZone());
+
+               if (!target)
+                       target = Zone::GetLocalZone();
+
                RelayMessage(origin, object, message, false);
+       }
 }
 
 
@@ -379,8 +389,14 @@ void ApiListener::DeleteConfigObject(const ConfigObject::Ptr& object, const Mess
 
        if (client)
                JsonRpc::SendMessage(client->GetStream(), message);
-       else
-               RelayMessage(origin, object, message, false);
+       else {
+               Zone::Ptr target = static_pointer_cast<Zone>(object->GetZone());
+
+               if (!target)
+                       target = Zone::GetLocalZone();
+
+               RelayMessage(origin, target, message, false);
+       }
 }
 
 /* Initial sync on connect for new endpoints */
index 8ade19fff1bedac6a766f4bc30fe92e8d623f97f..c76f63ec960eefb2c7a3e663ddb15d701aca568d 100644 (file)
@@ -164,6 +164,12 @@ void ApiListener::Start(bool runtimeCreated)
        OnMasterChanged(true);
 }
 
+void ApiListener::Stop(bool runtimeDeleted)
+{
+       boost::mutex::scoped_lock lock(m_LogLock);
+       CloseLogFile();
+}
+
 ApiListener::Ptr ApiListener::GetInstance(void)
 {
        return m_Instance;
index cbfbbd15016caf3e529227ca1073c7599fe0e178..2b2df11784afefb00b3e2ef6ada09f8cae265cfa 100644 (file)
@@ -104,6 +104,7 @@ protected:
        virtual void OnConfigLoaded(void) override;
        virtual void OnAllConfigLoaded(void) override;
        virtual void Start(bool runtimeCreated) override;
+       virtual void Stop(bool runtimeDeleted) override;
 
        virtual void ValidateTlsProtocolmin(const String& value, const ValidationUtils& utils) override;