53 lines
1.8 KiB
C++
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
|