From 1f0ebfaad729a6d79ed7824b8be7aabc1b43f224 Mon Sep 17 00:00:00 2001 From: Selim Mustafaev Date: Tue, 2 Jan 2024 01:21:28 +0300 Subject: [PATCH] Adding dnsmasq leases file parser --- CMakeLists.txt | 4 +++- DataSources/DnsmasqSource.cpp | 38 +++++++++++++++++++++++++++++++++++ DataSources/DnsmasqSource.h | 22 ++++++++++++++++++++ main.cpp | 18 ++++++++++------- 4 files changed, 74 insertions(+), 8 deletions(-) create mode 100644 DataSources/DnsmasqSource.cpp create mode 100644 DataSources/DnsmasqSource.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 508e39d..5f4785e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,5 +5,7 @@ set(CMAKE_CXX_STANDARD 20) find_package(prometheus-cpp CONFIG REQUIRED) -add_executable(aliencat_exporter main.cpp) +add_executable(aliencat_exporter main.cpp + DataSources/DnsmasqSource.cpp + DataSources/DnsmasqSource.h) target_link_libraries(aliencat_exporter PRIVATE prometheus-cpp::pull) diff --git a/DataSources/DnsmasqSource.cpp b/DataSources/DnsmasqSource.cpp new file mode 100644 index 0000000..8bbab75 --- /dev/null +++ b/DataSources/DnsmasqSource.cpp @@ -0,0 +1,38 @@ +// +// Created by Мустафаев Селим Мустафаевич on 01.01.2024. +// + +#include "DnsmasqSource.h" +#include +#include +#include + +DnsmasqSource::DnsmasqSource() { + _leases.open("/var/lib/misc/dnsmasq.leases"); + if(_leases.fail()) { + throw std::runtime_error("failed to open leases file"); + } +} + +std::vector DnsmasqSource::readLeases() { + _leases.clear(); + _leases.seekg(0); + + std::string line, time, mac, ip, host, id; + std::stringstream ss; + std::vector result; + + while(std::getline(_leases, line)) { + ss << line; + ss >> time >> mac >> ip >> host >> id; + result.push_back({ + {"time", time}, + {"mac", mac}, + {"ip", ip}, + {"host", host}, + {"id", id} + }); + } + + return result; +} diff --git a/DataSources/DnsmasqSource.h b/DataSources/DnsmasqSource.h new file mode 100644 index 0000000..9117114 --- /dev/null +++ b/DataSources/DnsmasqSource.h @@ -0,0 +1,22 @@ +// +// Created by Мустафаев Селим Мустафаевич on 01.01.2024. +// + +#ifndef ALIENCAT_EXPORTER_DNSMASQSOURCE_H +#define ALIENCAT_EXPORTER_DNSMASQSOURCE_H + +#include +#include +#include + +class DnsmasqSource { +private: + std::ifstream _leases; + +public: + DnsmasqSource(); + std::vector readLeases(); +}; + + +#endif //ALIENCAT_EXPORTER_DNSMASQSOURCE_H diff --git a/main.cpp b/main.cpp index 63fb10e..80d5450 100644 --- a/main.cpp +++ b/main.cpp @@ -1,3 +1,5 @@ +#include "DataSources/DnsmasqSource.h" + #include #include #include @@ -7,20 +9,22 @@ #include int main() { - prometheus::Exposer exposer{"127.0.0.1:9000"}; - prometheus::Registry registry; + prometheus::Exposer exposer{"0.0.0.0:9000"}; + auto registry = std::make_shared(); + DnsmasqSource dnsmasq; auto& gouge = prometheus::BuildGauge() .Name("aliencat_dnsmasq_leases") - .Register(registry); + .Help("Dnsmasq leases detail info") + .Register(*registry); - auto& counter = prometheus::BuildCounter() - .Name("aliencat_dnsmasq_leases") - .Register(registry); + exposer.RegisterCollectable(registry); for (;;) { std::this_thread::sleep_for(std::chrono::seconds(1)); - gouge.Add({"mac", ""}).Set(0); + for(const auto& leaseLabels: dnsmasq.readLeases()) { + gouge.Add(leaseLabels).Set(1); + } } return 0;