#pragma once #include "bsc/model/Connection.hpp" #include "bsc/ebpf/EBPFMon.hpp" #include #include #include #include #include #include namespace bsc::net { class SocketSnapshot { public: [[nodiscard]] std::vector list_connections() const; [[nodiscard]] std::optional 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 connections; std::chrono::steady_clock::time_point updated_at{}; }; [[nodiscard]] std::vector 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