kea-custom-hooks
FeM custom hooks libraries for Kea DHCP
Config.cpp
Go to the documentation of this file.
1#include <boost/program_options.hpp>
2
3#include "Config.hpp"
4
5namespace ahri
6{
8{
9 ConfigPrivate(std::istream& config_stream)
10 {
11 read_config(config_stream);
13 }
14
15 void read_config(std::istream& config_stream)
16 {
17 namespace bpo = boost::program_options;
18 bpo::options_description config_options{"File"};
19 // clang-format off
20 config_options.add_options()
21 ("admindb.user",
22 bpo::value<std::string>()->default_value("dhcp"))
23 ("admindb.password",
24 bpo::value<std::string>())
25 ("admindb.server",
26 bpo::value<std::vector<std::string>>())
27 ("admindb.database",
28 bpo::value<std::string>()->default_value("admindb"))
29 ("localdb.user",
30 bpo::value<std::string>()->default_value("kea"))
31 ("localdb.password",
32 bpo::value<std::string>())
33 ("localdb.server",
34 bpo::value<std::string>())
35 ("localdb.database",
36 bpo::value<std::string>()->default_value("kea"))
37 ("ahri.api-url",
38 bpo::value<std::string>())
39 ("ahri.kea-service",
40 bpo::value<std::string>())
41 ("ahri.icinga2-reporting-enabled",
42 bpo::value<bool>())
43 ("icinga2.api-url",
44 bpo::value<std::string>())
45 ("icinga2.api-user",
46 bpo::value<std::string>())
47 ("icinga2.api-password",
48 bpo::value<std::string>())
49 ("icinga2.host",
50 bpo::value<std::string>())
51 ("icinga2.service-full-sync",
52 bpo::value<std::string>())
53 ;
54 // clang-format on
55
56 bpo::store(bpo::parse_config_file(config_stream, config_options), vm);
57 bpo::notify(vm);
58 }
59
61 {
62 localdb.user = vm["localdb.user"].as<std::string>();
63 if (vm.count("localdb.password"))
64 localdb.password = vm["localdb.password"].as<std::string>();
65 else
66 throw Config::ParseError("Missing localdb.password");
67 localdb.database = vm["localdb.database"].as<std::string>();
68
69 if (vm.count("localdb.server")) {
70 std::string localdb_server = vm["localdb.server"].as<std::string>();
71 std::string_view localdb_server_view{localdb_server};
72 auto colon_pos = localdb_server_view.find_first_of(':');
73 localdb.server.host = localdb_server_view.substr(0, colon_pos);
74 localdb.server.port = localdb_server_view.substr(colon_pos + 1);
75 } else {
76 throw Config::ParseError("Missing localdb.server");
77 }
78
79 admindb.user = vm["admindb.user"].as<std::string>();
80 if (vm.count("admindb.password"))
81 admindb.password = vm["admindb.password"].as<std::string>();
82 else
83 throw Config::ParseError("Missing admindb.password");
84 admindb.database = vm["admindb.database"].as<std::string>();
85
86 if (vm.count("admindb.server")) {
87 for (const std::string& server : vm["admindb.server"].as<std::vector<std::string>>()) {
88 std::string_view server_view{server};
89 auto colon_pos = server_view.find_first_of(':');
90 std::string_view host = server_view.substr(0, colon_pos);
91 std::string_view port = server_view.substr(colon_pos + 1);
92
93 Config::DBHost db_host = {.host = std::string{host}, .port = std::string{port}};
94 admindb.servers.push_back(std::move(db_host));
95 }
96 }
97 if (admindb.servers.empty())
98 throw Config::ParseError("Missing admindb.server");
99
100 if (vm.count("ahri.api-url"))
101 ahri_node.api_url = vm["ahri.api-url"].as<std::string>();
102 if (vm.count("ahri.kea-service"))
103 ahri_node.kea_service = vm["ahri.kea-service"].as<std::string>();
104 if (vm.count("ahri.icinga2-reporting-enabled"))
105 ahri_node.icinga2_reporting_enabled = vm["ahri.icinga2-reporting-enabled"].as<bool>();
106
107 if (vm.count("icinga2.api-url"))
108 icinga2.api_url = vm["icinga2.api-url"].as<std::string>();
109 if (vm.count("icinga2.api-user"))
110 icinga2.api_user = vm["icinga2.api-user"].as<std::string>();
111 if (vm.count("icinga2.api-password"))
112 icinga2.api_password = vm["icinga2.api-password"].as<std::string>();
113 if (vm.count("icinga2.host"))
114 icinga2.host = vm["icinga2.host"].as<std::string>();
115 if (vm.count("icinga2.service-full-sync"))
116 icinga2.services.at("full-sync") = vm["icinga2.service-full-sync"].as<std::string>();
117 }
118
119 boost::program_options::variables_map vm;
120
125};
126
127Config::Config(std::istream& config_stream) : p_impl(new ConfigPrivate(config_stream))
128{}
129
131{
132 if (p_impl)
133 delete p_impl;
134}
135
137{
138 return p_impl->localdb;
139}
140
142{
143 return p_impl->admindb;
144}
145
147{
148 return p_impl->ahri_node;
149}
150
152{
153 return p_impl->icinga2;
154}
155} // namespace ahri
Exception for errors during configuration parsing.
Definition: Config.hpp:83
const AdminDB & admindb() const
Return parsed AdminDB-specific configuration.
Definition: Config.cpp:141
const Icinga2 & icinga2() const
Return parsed Icinga2 API information.
Definition: Config.cpp:151
const AhriNode & ahri_node() const
Return parsed AHRI node information.
Definition: Config.cpp:146
Config(std::istream &config)
Create an instance and parse the given std::istream as configuration file.
Definition: Config.cpp:127
const LocalDB & localdb() const
Return parsed DHCP local DB specific configuration options.
Definition: Config.cpp:136
Config::LocalDB localdb
Definition: Config.cpp:122
Config::AdminDB admindb
Definition: Config.cpp:121
boost::program_options::variables_map vm
Definition: Config.cpp:119
Config::AhriNode ahri_node
Definition: Config.cpp:123
Config::Icinga2 icinga2
Definition: Config.cpp:124
void parse_config()
Definition: Config.cpp:60
void read_config(std::istream &config_stream)
Definition: Config.cpp:15
ConfigPrivate(std::istream &config_stream)
Definition: Config.cpp:9
AdminDB-specific configuration options.
Definition: Config.hpp:66
std::vector< DBHost > servers
Definition: Config.hpp:67
Configuration for a Kea node running ahri.
Definition: Config.hpp:47
bool icinga2_reporting_enabled
Definition: Config.hpp:51
std::string kea_service
Definition: Config.hpp:50
std::string api_url
Definition: Config.hpp:49
std::string database
Definition: Config.hpp:35
std::string user
Definition: Config.hpp:33
std::string password
Definition: Config.hpp:34
Host configuration options for a database connection.
Definition: Config.hpp:40
std::string port
Definition: Config.hpp:42
std::string host
Definition: Config.hpp:41
Configuration for a Icinga2 daemon monitoring this node.
Definition: Config.hpp:56
std::string api_password
Definition: Config.hpp:59
std::string host
Definition: Config.hpp:60
std::string api_url
Definition: Config.hpp:57
std::string api_user
Definition: Config.hpp:58
std::map< std::string, std::string > services
Definition: Config.hpp:61
DHCP local DB specific configuration options.
Definition: Config.hpp:72