10#include <hooks/hooks.h>
11#include <log/logger.h>
12#include <log/macros.h>
21#include "log_admindb_arpwatch_exporter.h"
35void create_redis_adapters_from_config(isc::hooks::LibraryHandle& handle);
36void create_arpwatch_rpc_from_config(isc::hooks::LibraryHandle& handle);
37void assert_config_exists(
const isc::data::ConstElementPtr& config_element,
const std::string& key);
39void try_add_server(T& raw_server);
40void create_exporter();
48int load(isc::hooks::LibraryHandle& handle)
50 isc::log::Logger
logger(
"arpwatch-exporter");
52 create_redis_adapters_from_config(handle);
53 create_arpwatch_rpc_from_config(handle);
83void create_redis_adapters_from_config(isc::hooks::LibraryHandle& handle)
85 isc::log::Logger
logger(
"arpwatch-exporter");
86 auto raw_server_list = handle.getParameter(
"servers");
88 if (!raw_server_list) {
89 LOG_WARN(
logger, arpwatch::CONFIG_NO_REDIS_SERVERS);
93 auto server_list = [&raw_server_list]() {
95 return raw_server_list->listValue();
97 catch (isc::data::TypeError& e) {
98 throw InvalidConfig(
"servers",
"List", raw_server_list->str());
102 for (
auto& raw_server : server_list) {
103 try_add_server(raw_server);
108 std::vector<HiredisMultiAdapter::adapter_refw_t> adapter_ref_list;
111 adapter_ref_list.emplace_back(a);
117void create_arpwatch_rpc_from_config(isc::hooks::LibraryHandle& handle)
119 const auto rpc_url_raw{handle.getParameter(
"arpwatch-rpc-url")};
120 assert_config_exists(rpc_url_raw,
"arpwatch-rpc-url");
121 const auto rpc_url = [&rpc_url_raw]() {
123 return rpc_url_raw->stringValue();
125 catch (isc::data::TypeError& e) {
126 throw InvalidConfig(
"arpwatc-rpc-url",
"String", rpc_url_raw->str());
133void assert_config_exists(
const isc::data::ConstElementPtr& config_element,
const std::string& key)
135 if (!config_element) {
141void try_add_server(T& raw_server)
143 assert_config_exists(raw_server,
"servers.{}");
144 auto server = [&raw_server]() {
146 return raw_server->mapValue();
148 catch (isc::data::TypeError& e) {
153 auto raw_server_ip = [&server]() {
155 return server.at(
"ip");
157 catch (std::out_of_range&) {
161 assert_config_exists(raw_server_ip,
"servers.{}.ip");
162 auto raw_server_port = [&server]() {
164 return server.at(
"port");
166 catch (std::out_of_range&) {
167 return isc::data::ConstElementPtr(
171 assert_config_exists(raw_server_port,
"servers.{}.port");
173 auto server_ip = [&raw_server_ip]() {
175 return raw_server_ip->stringValue();
177 catch (isc::data::TypeError& e) {
178 throw InvalidConfig(
"server.{}.ip",
"IP-Adress", raw_server_ip->str());
181 auto server_port = [&raw_server_port]() {
183 return raw_server_port->intValue();
185 catch (isc::data::TypeError& e) {
186 throw InvalidConfig(
"server.{}.port",
"Port number", raw_server_port->str());
190 isc::log::Logger
logger(
"arpwatch-exporter");
191 LOG_INFO(
logger, arpwatch::CONFIG_REDIS_SERVER_ADD).arg(server_ip).arg(server_port);
195void create_exporter()
int unload()
Unitialization/cleanup point for admindb-arpwatch-exporter.
int load(isc::hooks::LibraryHandle &handle)
Initialization/starting point for admindb-arpwatch-exporter.
static constexpr int REDIS_DEFAULT_PORT
A failure during initialization has happened.
virtual void log(isc::log::Logger &logger) const
Parts of the hook configuration are invalid.
Common forward declaration for classes and variables.
Collection of exceptions which are thrown by admindb-arpwatch-exporter.
std::unique_ptr< ArpwatchRPC > arpwatch_rpc
std::unique_ptr< arpwatch::Exporter > exporter
std::vector< HiredisAdapter > redis_adapters
std::unique_ptr< HiredisMultiAdapter > redis_multi_adapter