Commit eac144ac authored by louiz’'s avatar louiz’

Configuration options can be overridden by setting env values

parent cf87cf08
......@@ -14,6 +14,7 @@ Version 5.0
- If the client doesn’t specify any limit, MAM results contain at most 100
messages, instead of the whole archive.
- Multiline topics are now properly handled
- Configuration options can be overridden by values found in the process env.
Version 4.1 - 2017-03-21
......@@ -35,15 +35,19 @@ details on its content.
The configuration file uses a simple format of the form
The configuration file uses a simple format of the form ``option=value``.
The values from the configuration file can be overridden by environment
variables, with the name all in upper case and prefixed with "BIBOUMI_".
For example, if the environment contains “BIBOUMI_PASSWORD=blah", this will
override the value of the “password” option in the configuration file.
Sending SIGUSR1 or SIGUSR2 (see kill(1)) to the process will force it to
re-read the configuration and make it close and re-open the log files. You
can use this to change any configuration option at runtime, or do a log
Here is a description of each possible option:
Here is a description of every possible option:
#include <config/config.hpp>
#include <utils/tolower.hpp>
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std::string_literals;
extern char** environ;
std::string Config::filename{};
std::map<std::string, std::string> Config::values{};
std::vector<t_config_changed_callback> Config::callbacks{};
......@@ -71,21 +76,40 @@ bool Config::read_conf(const std::string& name)
auto parse_line = [](const std::string& line, const bool env)
static const auto env_option_prefix = "BIBOUMI_"s;
if (line == "" || line[0] == '#')
size_t pos = line.find('=');
if (pos == std::string::npos)
std::string option = line.substr(0, pos);
std::string value = line.substr(pos+1);
if (env)
auto a = option.substr(0, env_option_prefix.size());
if (a == env_option_prefix)
option = utils::tolower(option.substr(env_option_prefix.size()));
Config::values[option] = value;
std::string line;
size_t pos;
std::string option;
std::string value;
while (file.good())
std::getline(file, line);
if (line == "" || line[0] == '#')
continue ;
pos = line.find('=');
if (pos == std::string::npos)
continue ;
option = line.substr(0, pos);
value = line.substr(pos+1);
Config::values[option] = value;
parse_line(line, false);
char** env_line = environ;
while (*env_line)
parse_line(*env_line, true);
return true;
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment