diff --git a/lib/cli/daemonutility.cpp b/lib/cli/daemonutility.cpp index 5e250d22c..6067e1ec8 100644 --- a/lib/cli/daemonutility.cpp +++ b/lib/cli/daemonutility.cpp @@ -254,7 +254,7 @@ bool DaemonUtility::LoadConfigFiles(const std::vector& configs, WorkQueue upq(25000, Configuration::Concurrency); upq.SetName("DaemonUtility::LoadConfigFiles"); - bool result = ConfigItem::CommitItems(ascope.GetContext(), upq, newItems); + bool result = ConfigItem::CommitItems(ascope.GetContext(), upq, newItems, false, true); if (!result) { ConfigCompilerContext::GetInstance()->CancelObjectsFile(); diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index 5dce19eda..43eb44816 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -592,11 +592,28 @@ bool ConfigItem::CommitNewItems(const ActivationContext::Ptr& context, WorkQueue return true; } -bool ConfigItem::CommitItems(const ActivationContext::Ptr& context, WorkQueue& upq, std::vector& newItems, bool silent) +bool ConfigItem::CommitItems(const ActivationContext::Ptr& context, WorkQueue& upq, std::vector& newItems, + bool silent, bool withModAttrs) { if (!silent) Log(LogInformation, "ConfigItem", "Committing config item(s)."); + if (withModAttrs) { + /* restore modified attributes */ + if (Utility::PathExists(Configuration::ModAttrPath)) { + std::unique_ptr expression = ConfigCompiler::CompileFile(Configuration::ModAttrPath); + + if (expression) { + try { + ScriptFrame frame(true); + expression->Evaluate(frame); + } catch (const std::exception& ex) { + Log(LogCritical, "config", DiagnosticInformation(ex)); + } + } + } + } + if (!CommitNewItems(context, upq, newItems)) { upq.ReportExceptions("config"); diff --git a/lib/config/configitem.hpp b/lib/config/configitem.hpp index 007a3c08a..f075bc980 100644 --- a/lib/config/configitem.hpp +++ b/lib/config/configitem.hpp @@ -52,7 +52,8 @@ public: static ConfigItem::Ptr GetByTypeAndName(const Type::Ptr& type, const String& name); - static bool CommitItems(const ActivationContext::Ptr& context, WorkQueue& upq, std::vector& newItems, bool silent = false); + static bool CommitItems(const ActivationContext::Ptr& context, WorkQueue& upq, std::vector& newItems, + bool silent = false, bool withModAttrs = false); static bool ActivateItems(const std::vector& newItems, bool runtimeCreated = false, bool mainConfigActivation = false, bool withModAttrs = false, const Value& cookie = Empty);