From db34e6c37a78a74bf6092ea08ec15879dc82920f Mon Sep 17 00:00:00 2001 From: Selim Mustafaev Date: Wed, 3 Jan 2024 22:42:04 +0300 Subject: [PATCH] Fixed parsing dhcp leases --- CMakeLists.txt | 2 +- DataSources/DnsmasqSource.cpp | 23 ++++++++++++----------- DataSources/DnsmasqSource.h | 9 +++++++++ main.cpp | 1 + 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 316c290..c5559ee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.27) project(aliencat_exporter) -set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD 23) find_package(prometheus-cpp CONFIG REQUIRED) diff --git a/DataSources/DnsmasqSource.cpp b/DataSources/DnsmasqSource.cpp index 8bbab75..561e6c4 100644 --- a/DataSources/DnsmasqSource.cpp +++ b/DataSources/DnsmasqSource.cpp @@ -6,6 +6,11 @@ #include #include #include +#include +#include +#include + +namespace views = std::ranges::views; DnsmasqSource::DnsmasqSource() { _leases.open("/var/lib/misc/dnsmasq.leases"); @@ -18,20 +23,16 @@ std::vector DnsmasqSource::readLeases() { _leases.clear(); _leases.seekg(0); - std::string line, time, mac, ip, host, id; - std::stringstream ss; + std::string line; std::vector result; + auto labels = std::array{ "time", "mac", "ip", "host", "id" }; 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} - }); + prometheus::Labels lineMap; + for(const auto [index, item]: std::views::split(line, ' ') | views::enumerate) { + lineMap[labels[index]] = std::string_view(item); + } + result.push_back(lineMap); } return result; diff --git a/DataSources/DnsmasqSource.h b/DataSources/DnsmasqSource.h index 9117114..d2fc87e 100644 --- a/DataSources/DnsmasqSource.h +++ b/DataSources/DnsmasqSource.h @@ -10,6 +10,15 @@ #include class DnsmasqSource { +public: + enum LeaseField: int { + EXPIRY_TIME = 0, + MAC = 1, + IP = 2, + HOST = 3, + ID = 4 + }; + private: std::ifstream _leases; diff --git a/main.cpp b/main.cpp index 80d5450..9db103d 100644 --- a/main.cpp +++ b/main.cpp @@ -24,6 +24,7 @@ int main() { std::this_thread::sleep_for(std::chrono::seconds(1)); for(const auto& leaseLabels: dnsmasq.readLeases()) { gouge.Add(leaseLabels).Set(1); + std::cout << "mac: " << leaseLabels.at("mac") << std::endl; } }