]> granicus.if.org Git - icinga2/commitdiff
Delete removed config objects after SIGHUP
authorGunnar Beutner <gunnar.beutner@netways.de>
Sun, 3 Feb 2013 11:26:22 +0000 (12:26 +0100)
committerGunnar Beutner <gunnar.beutner@netways.de>
Sun, 3 Feb 2013 11:26:22 +0000 (12:26 +0100)
Fixes #3620

icinga-app/icinga.cpp

index dc4c860473566a0f77d2e996319f2963257aba30..23ebe0168a8e39ffebf973c35a2d0f4efd9d520d 100644 (file)
@@ -31,9 +31,12 @@ using namespace icinga;
 namespace po = boost::program_options;
 
 static po::variables_map g_AppParams;
+static vector<ConfigItem::WeakPtr> g_ConfigItems;
 
 static bool LoadConfigFiles(void)
 {
+       set<ConfigItem::Ptr> allItems;
+
        try {
                BOOST_FOREACH(const String& configPath, g_AppParams["config"].as<vector<String> >()) {
                        vector<ConfigItem::Ptr> items;
@@ -67,8 +70,25 @@ static bool LoadConfigFiles(void)
                                        ctype->ValidateObject(object);
                                }
                        }
+
+                       std::copy(items.begin(), items.end(), std::inserter(allItems, allItems.begin()));
                }
 
+               BOOST_FOREACH(const ConfigItem::WeakPtr& witem, g_ConfigItems) {
+                       ConfigItem::Ptr item = witem.lock();
+
+                       /* Ignore this item if it's not active anymore */
+                       if (!item || ConfigItem::GetObject(item->GetType(), item->GetName()) != item)
+                               continue;
+
+                       /* Remove the object if it's not in the list of current items */
+                       if (allItems.find(item) == allItems.end())
+                               item->Unregister();
+               }
+
+               g_ConfigItems.clear();
+               std::copy(allItems.begin(), allItems.end(), std::back_inserter(g_ConfigItems));
+
                return true;
        } catch (const exception& ex) {
                Logger::Write(LogCritical, "icinga-app", "Configuration error: " + String(ex.what()));