aboutsummaryrefslogtreecommitdiff
path: root/src/common/Configuration/Config.cpp
diff options
context:
space:
mode:
authorСмердокрыл <smerdokryl@gmail.com>2023-06-09 21:36:03 +0300
committerGitHub <noreply@github.com>2023-06-09 20:36:03 +0200
commit74a4dc46b49e1902f44a36b5b3155ad103d8f3da (patch)
tree762c7f23d65608a2a26266b2e5c7b7a403e8e486 /src/common/Configuration/Config.cpp
parentc484530b0c4347821a4d62515576d1c8532bf9bb (diff)
Core/Config: Implement reading config overrides from subdirectory (#29068)
Co-authored-by: Shauren <shauren.trinity@gmail.com>
Diffstat (limited to 'src/common/Configuration/Config.cpp')
-rw-r--r--src/common/Configuration/Config.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/common/Configuration/Config.cpp b/src/common/Configuration/Config.cpp
index 93f7d367730..8af11fbf066 100644
--- a/src/common/Configuration/Config.cpp
+++ b/src/common/Configuration/Config.cpp
@@ -18,6 +18,7 @@
#include "Config.h"
#include "Log.h"
#include "StringConvert.h"
+#include <boost/filesystem/operations.hpp>
#include <boost/property_tree/ini_parser.hpp>
#include <algorithm>
#include <cstdlib>
@@ -25,6 +26,7 @@
#include <mutex>
namespace bpt = boost::property_tree;
+namespace fs = boost::filesystem;
namespace
{
@@ -158,6 +160,8 @@ bool ConfigMgr::LoadAdditionalFile(std::string file, bool keepOnReload, std::str
if (!LoadFile(file, fullTree, error))
return false;
+ std::lock_guard<std::mutex> lock(_configLock);
+
for (bpt::ptree::value_type const& child : fullTree.begin()->second)
_config.put_child(bpt::ptree::path_type(child.first, '/'), child.second);
@@ -167,6 +171,32 @@ bool ConfigMgr::LoadAdditionalFile(std::string file, bool keepOnReload, std::str
return true;
}
+bool ConfigMgr::LoadAdditionalDir(std::string const& dir, bool keepOnReload, std::vector<std::string>& loadedFiles, std::vector<std::string>& errors)
+{
+ fs::path dirPath = dir;
+ if (!fs::exists(dirPath) || !fs::is_directory(dirPath))
+ return true;
+
+ for (fs::directory_entry const& f : fs::recursive_directory_iterator(dirPath))
+ {
+ if (!fs::is_regular_file(f))
+ continue;
+
+ fs::path configFile = fs::absolute(f);
+ if (configFile.extension() != ".conf")
+ continue;
+
+ std::string fileName = configFile.generic_string();
+ std::string error;
+ if (LoadAdditionalFile(fileName, keepOnReload, error))
+ loadedFiles.push_back(std::move(fileName));
+ else
+ errors.push_back(std::move(error));
+ }
+
+ return errors.empty();
+}
+
std::vector<std::string> ConfigMgr::OverrideWithEnvVariablesIfAny()
{
std::lock_guard<std::mutex> lock(_configLock);