]> granicus.if.org Git - icinga2/commitdiff
Use a temporary file for modified-attributes.conf updates
authorMichael Friedrich <michael.friedrich@netways.de>
Tue, 29 Sep 2015 16:40:04 +0000 (18:40 +0200)
committerMichael Friedrich <michael.friedrich@netways.de>
Tue, 29 Sep 2015 16:40:04 +0000 (18:40 +0200)
fixes #10238

lib/icinga/icingaapplication.cpp
lib/icinga/icingaapplication.hpp

index 6f531e1017b58ac1909da01f216559c1ef787223..a240b6944da5d129d44da876ac393c08cbf472f6 100644 (file)
@@ -169,9 +169,17 @@ static void PersistModAttrHelper(std::ofstream& fp, ConfigObject::Ptr& previousO
 void IcingaApplication::DumpProgramState(void)
 {
        ConfigObject::DumpObjects(GetStatePath());
+       DumpModifiedAttributes();
+}
 
+void IcingaApplication::DumpModifiedAttributes(void)
+{
        String path = GetModAttrPath();
-       std::ofstream fp(path.CStr(), std::ofstream::out | std::ostream::trunc);
+       String pathtmp = path + ".tmp";
+
+       std::ofstream fp;
+       fp.open(pathtmp.CStr(), std::ofstream::out | std::ofstream::trunc);
+
        ConfigObject::Ptr previousObject;
        ConfigObject::DumpModifiedAttributes(boost::bind(&PersistModAttrHelper, boost::ref(fp), boost::ref(previousObject), _1, _2, _3));
 
@@ -180,6 +188,19 @@ void IcingaApplication::DumpProgramState(void)
                ConfigWriter::EmitValue(fp, 0, previousObject->GetVersion());
                ConfigWriter::EmitRaw(fp, "\n}\n");
        }
+
+       fp.close();
+
+#ifdef _WIN32
+       _unlink(path.CStr());
+#endif /* _WIN32 */
+
+       if (rename(pathtmp.CStr(), path.CStr()) < 0) {
+               BOOST_THROW_EXCEPTION(posix_error()
+                   << boost::errinfo_api_function("rename")
+                   << boost::errinfo_errno(errno)
+                   << boost::errinfo_file_name(pathtmp));
+       }
 }
 
 IcingaApplication::Ptr IcingaApplication::GetInstance(void)
index 4e66ff86d51892a884cc97fd89a25da162026e87..0458cd2dacd83f7859c33fd3ff7ae4350633769b 100644 (file)
@@ -56,6 +56,7 @@ public:
 
 private:
        void DumpProgramState(void);
+       void DumpModifiedAttributes(void);
 
        virtual void OnShutdown(void) override;
 };