kea-custom-hooks
FeM custom hooks libraries for Kea DHCP
Exporter.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <chrono>
4#include <condition_variable>
5#include <mutex>
6#include <queue>
7#include <thread>
8#include <tuple>
9
10#include <asiolink/io_address.h>
11#include <dhcp/hwaddr.h>
12#include <dhcpsrv/lease.h>
13#include <log/logger.h>
14
15class HiredisAdapter;
16class ArpwatchRPC;
17
18namespace arpwatch
19{
36{
37public:
38 using mac_addr_t = isc::dhcp::HWAddr;
39 using ip4_addr_t = isc::asiolink::IOAddress;
40 using subnet_id_t = isc::dhcp::SubnetID;
41 using lease4_t = std::tuple<mac_addr_t, ip4_addr_t, subnet_id_t, std::chrono::seconds>;
42
43 constexpr static std::chrono::seconds REDIS_RECONNECT_WAIT{5};
44 constexpr static std::chrono::seconds DEFAULT_VALID_LFT{600};
45 constexpr static double REDIS_EXPIRE_FACT = 1.5F;
46 constexpr static std::chrono::milliseconds LEASE_QUEUE_FLUSH_WAIT{10};
47
48 explicit inline Exporter(HiredisAdapter& redis_adapter, ArpwatchRPC& arpwatch_rpc)
49 : redis_adapter(redis_adapter), arpwatch_rpc(arpwatch_rpc){};
50 Exporter(const Exporter&) = delete;
51 Exporter& operator=(const Exporter&) = delete;
52 Exporter(Exporter&&) = delete;
54 ~Exporter();
55
59 void start_worker();
60 void stop_worker();
62
66 void push_lease(const mac_addr_t& mac, const ip4_addr_t& ip4, subnet_id_t subnet_id = 0,
67 std::chrono::seconds valid_lft = DEFAULT_VALID_LFT);
68 void flush_lease_queue();
70
71private:
73 void run_worker();
74
78 void worker_send_lease_to_redis(const lease4_t& lease);
79 void worker_send_lease_to_arpwatch(const lease4_t& lease);
81
82 std::unique_ptr<std::thread> worker;
83 volatile bool worker_keep_running{false};
84
85 std::condition_variable worker_notify_cv;
86 std::mutex lease_queue_mtx;
87 std::queue<lease4_t> lease_queue;
88
89 HiredisAdapter& redis_adapter;
90 ArpwatchRPC& arpwatch_rpc;
91
92 isc::log::Logger logger{"arpwatch-exporter.Exporter"};
93};
94} // namespace arpwatch
An adapter to the RPC interface of ARPwatch.
Definition: ArpwatchRPC.hpp:19
A wrapper for the hiredis C interface with multi-client support.
Main lease-to-Redis/ARPwatch exporter.
Definition: Exporter.hpp:36
static constexpr double REDIS_EXPIRE_FACT
Definition: Exporter.hpp:45
isc::dhcp::HWAddr mac_addr_t
Definition: Exporter.hpp:38
static constexpr std::chrono::seconds REDIS_RECONNECT_WAIT
Definition: Exporter.hpp:43
std::tuple< mac_addr_t, ip4_addr_t, subnet_id_t, std::chrono::seconds > lease4_t
Definition: Exporter.hpp:41
static constexpr std::chrono::milliseconds LEASE_QUEUE_FLUSH_WAIT
Definition: Exporter.hpp:46
Exporter(Exporter &&)=delete
Exporter & operator=(Exporter &&)=delete
void flush_lease_queue()
Definition: Exporter.cpp:74
isc::dhcp::SubnetID subnet_id_t
Definition: Exporter.hpp:40
Exporter & operator=(const Exporter &)=delete
static constexpr std::chrono::seconds DEFAULT_VALID_LFT
Definition: Exporter.hpp:44
void push_lease(const mac_addr_t &mac, const ip4_addr_t &ip4, subnet_id_t subnet_id=0, std::chrono::seconds valid_lft=DEFAULT_VALID_LFT)
Definition: Exporter.cpp:61
isc::asiolink::IOAddress ip4_addr_t
Definition: Exporter.hpp:39
Exporter(const Exporter &)=delete
Exporter(HiredisAdapter &redis_adapter, ArpwatchRPC &arpwatch_rpc)
Definition: Exporter.hpp:48
std::unique_ptr< ArpwatchRPC > arpwatch_rpc
Definition: init.cpp:29