Fixed parsing dhcp leases

This commit is contained in:
Selim Mustafaev 2024-01-03 22:42:04 +03:00
parent 2c9466aea9
commit db34e6c37a
4 changed files with 23 additions and 12 deletions

View File

@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.27) cmake_minimum_required(VERSION 3.27)
project(aliencat_exporter) project(aliencat_exporter)
set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD 23)
find_package(prometheus-cpp CONFIG REQUIRED) find_package(prometheus-cpp CONFIG REQUIRED)

View File

@ -6,6 +6,11 @@
#include <exception> #include <exception>
#include <sstream> #include <sstream>
#include <iostream> #include <iostream>
#include <ranges>
#include <array>
#include <algorithm>
namespace views = std::ranges::views;
DnsmasqSource::DnsmasqSource() { DnsmasqSource::DnsmasqSource() {
_leases.open("/var/lib/misc/dnsmasq.leases"); _leases.open("/var/lib/misc/dnsmasq.leases");
@ -18,20 +23,16 @@ std::vector<prometheus::Labels> DnsmasqSource::readLeases() {
_leases.clear(); _leases.clear();
_leases.seekg(0); _leases.seekg(0);
std::string line, time, mac, ip, host, id; std::string line;
std::stringstream ss;
std::vector<prometheus::Labels> result; std::vector<prometheus::Labels> result;
auto labels = std::array{ "time", "mac", "ip", "host", "id" };
while(std::getline(_leases, line)) { while(std::getline(_leases, line)) {
ss << line; prometheus::Labels lineMap;
ss >> time >> mac >> ip >> host >> id; for(const auto [index, item]: std::views::split(line, ' ') | views::enumerate) {
result.push_back({ lineMap[labels[index]] = std::string_view(item);
{"time", time}, }
{"mac", mac}, result.push_back(lineMap);
{"ip", ip},
{"host", host},
{"id", id}
});
} }
return result; return result;

View File

@ -10,6 +10,15 @@
#include <vector> #include <vector>
class DnsmasqSource { class DnsmasqSource {
public:
enum LeaseField: int {
EXPIRY_TIME = 0,
MAC = 1,
IP = 2,
HOST = 3,
ID = 4
};
private: private:
std::ifstream _leases; std::ifstream _leases;

View File

@ -24,6 +24,7 @@ int main() {
std::this_thread::sleep_for(std::chrono::seconds(1)); std::this_thread::sleep_for(std::chrono::seconds(1));
for(const auto& leaseLabels: dnsmasq.readLeases()) { for(const auto& leaseLabels: dnsmasq.readLeases()) {
gouge.Add(leaseLabels).Set(1); gouge.Add(leaseLabels).Set(1);
std::cout << "mac: " << leaseLabels.at("mac") << std::endl;
} }
} }