BastionGuard/thirdparty/bastionguard-secure-connection/daemon/include/bsc/net/SocketSnapshot.hpp
specialworld83 f0f913a209 Release 2.0
2026-07-15 10:52:22 +02:00

53 lines
1.8 KiB
C++

#pragma once
#include "bsc/model/Connection.hpp"
#include "bsc/ebpf/EBPFMon.hpp"
#include <chrono>
#include <mutex>
#include <optional>
#include <string>
#include <unordered_map>
#include <vector>
namespace bsc::net {
class SocketSnapshot {
public:
[[nodiscard]] std::vector<bsc::model::Connection> list_connections() const;
[[nodiscard]] std::optional<bsc::model::Connection> find_connection(const bsc::model::Connection& needle) const;
bool enrich_connection(bsc::model::Connection& conn) const;
void invalidate_cache();
// Scarta eventi eBPF accumulati senza fare snapshot /proc.
// Usato quando il desktop è idle/bloccato: non vogliamo mostrare
// connessioni vecchie quando l'utente torna attivo.
void discard_pending_events() const;
/*
* Abilita il monitor eBPF. Chiamato da DaemonService::run() se
* proc_monitor_method == "ebpf". Se libbpf non è disponibile o
* il kernel non supporta BTF, start_ebpf() ritorna false e il
* daemon continua a funzionare senza eBPF (fallback /proc/net/tcp).
* obj_path: percorso del programma BPF compilato (.o).
*/
bool start_ebpf(const std::string& obj_path =
"/usr/lib/bastionguard-sc/bsc_ebpf.o");
void stop_ebpf();
private:
struct SnapshotCache {
std::vector<bsc::model::Connection> connections;
std::chrono::steady_clock::time_point updated_at{};
};
[[nodiscard]] std::vector<bsc::model::Connection> collect_connections() const;
[[nodiscard]] bool cache_valid(std::chrono::steady_clock::time_point now) const;
mutable std::mutex cache_mutex_;
mutable SnapshotCache cache_;
// EBPFMon è mutable: drain() non è logicamente const ma non
// modifica lo stato osservabile di SocketSnapshot verso l'esterno.
mutable bsc::ebpf::EBPFMon ebpf_mon_;
};
} // namespace bsc::net