ebpf-blocker 1.0.0
XDP-based packet blocker using eBPF
Loading...
Searching...
No Matches
main.cpp File Reference

Точка входа: event loop, обработка сигналов, метрики Prometheus. More...

#include "main.h"
#include "db.h"
#include "xdp_loader.h"
#include <arpa/inet.h>
#include <csignal>
#include <cstring>
#include <ctime>
#include <fstream>
#include <getopt.h>
#include <iostream>
#include <map>
#include <shared_mutex>
#include <sstream>
#include <thread>
#include <unistd.h>
#include "httplib.h"
#include <algorithm>

Go to the source code of this file.

Data Structures

struct  MetricsStore
 Потокобезопасный аккумулятор метрик Prometheus. More...
 

Typedefs

using DropMap = std::map<uint32_t, uint64_t>
 Удобный алиас для карты соответствия IP (uint32) количеству дропов.
 

Functions

static void HandleSignal (int sig)
 
static Config ParseArgs (int argc, char *argv[])
 
static std::vector< BlockEntryReadWhitelistFile (const std::string &path)
 
static void PrintStats (const std::vector< BlockEntry > &whitelist, const std::vector< BlockEntry > &blacklist)
 
static void PrintIntervalDrops (const std::vector< std::pair< uint32_t, uint64_t > > &drops)
 
static void PrintTopDrops (const std::string &label, const DropMap &drops, const char *timestamp)
 
int main (int argc, char *argv[])
 

Variables

std::atomic< bool > g_running {true}
 Глобальный флаг: false запускает graceful shutdown.
 
std::atomic< bool > g_xdp_attached {false}
 Глобальный флаг: true когда XDP-программа прикреплена к интерфейсу.
 
std::atomic< bool > g_detach_requested {false}
 Глобальный флаг: true когда SIGUSR1 запросил detach XDP.
 
static XdpBlockerg_blocker = nullptr
 

Detailed Description

Точка входа: event loop, обработка сигналов, метрики Prometheus.

Содержит главный цикл приложения: загрузка конфигурации, инициализация БД и XDP, периодический опрос списков и обслуживание HTTP-эндпоинта /metrics.

Definition in file main.cpp.

Typedef Documentation

◆ DropMap

using DropMap = std::map<uint32_t, uint64_t>

Удобный алиас для карты соответствия IP (uint32) количеству дропов.

Definition at line 179 of file main.cpp.

Function Documentation

◆ HandleSignal()

static void HandleSignal ( int sig)
static

Обрабатывает сигналы ОС для управления жизненным циклом.

  • SIGINT / SIGTERM: запрос плавного завершения.
  • SIGUSR1: запрос открепления XDP (аварийное отключение).
    Parameters
    [in]sigНомер сигнала.

Definition at line 59 of file main.cpp.

References g_detach_requested, and g_running.

Referenced by main().

◆ main()

int main ( int argc,
char * argv[] )

Точка входа.

Инициализирует БД, загружает XDP-программу, запускает event loop с периодическим опросом списков и HTTP-сервером метрик Prometheus.

Returns
0 при успешном завершении.

Definition at line 246 of file main.cpp.

References Config::db_path, g_blocker, g_detach_requested, g_running, g_xdp_attached, BlockerDB::GetBlacklist(), BlockerDB::GetWhitelist(), HandleSignal(), Config::iface, Config::interval_sec, XdpBlocker::Load(), Config::metrics_listen, BlockerDB::Migrate(), ParseArgs(), PrintIntervalDrops(), PrintStats(), PrintTopDrops(), XdpBlocker::ReadAndClearDropCounters(), ReadWhitelistFile(), XdpBlocker::Unload(), XdpBlocker::UpdateBlacklist(), BlockerDB::UpdateLastBlockedAt(), XdpBlocker::UpdateWhitelist(), and Config::whitelist_conf.

◆ ParseArgs()

static Config ParseArgs ( int argc,
char * argv[] )
static

Парсит аргументы командной строки через getopt_long.

Parameters
[in]argcКоличество аргументов из main().
[in]argvМассив аргументов из main().
Returns
Заполненная структура Config (для пропущенных флагов — значения по умолчанию).

Definition at line 80 of file main.cpp.

References Config::db_path, Config::iface, Config::interval_sec, Config::metrics_listen, and Config::whitelist_conf.

Referenced by main().

◆ PrintIntervalDrops()

static void PrintIntervalDrops ( const std::vector< std::pair< uint32_t, uint64_t > > & drops)
static

Логирует статистику дропов за последний интервал опроса (всего + топ).

Parameters
[in]dropsВектор пар (source_ip, количество_дропов).

Definition at line 184 of file main.cpp.

Referenced by main().

◆ PrintStats()

static void PrintStats ( const std::vector< BlockEntry > & whitelist,
const std::vector< BlockEntry > & blacklist )
static

Логирует текущее количество записей в whitelist и blacklist (heartbeat).

Parameters
[in]whitelistСписок записей белого списка.
[in]blacklistСписок записей чёрного списка.

Definition at line 172 of file main.cpp.

Referenced by main().

◆ PrintTopDrops()

static void PrintTopDrops ( const std::string & label,
const DropMap & drops,
const char * timestamp )
static

Логирует периодическую статистику дропов (почасовую/ежедневную) с топ-5 нарушителями.

Parameters
[in]labelМетка периода ("почасовая" или "ежедневная").
[in]dropsКарта дропов (IP -> количество).
[in]timestampВременная метка для лога.

Definition at line 209 of file main.cpp.

Referenced by main().

◆ ReadWhitelistFile()

static std::vector< BlockEntry > ReadWhitelistFile ( const std::string & path)
static

Читает записи белого списка из конфигурационного файла.

Формат: одна IP/CIDR на строку, опционально '# комментарий' в конце. Пустые строки и строки, начинающиеся с '#', игнорируются.

Parameters
[in]pathПуть к файлу конфигурации белого списка.
Returns
Список распарсенных записей.

Definition at line 136 of file main.cpp.

Referenced by main().

Variable Documentation

◆ g_blocker

XdpBlocker* g_blocker = nullptr
static

Definition at line 48 of file main.cpp.

Referenced by main().

◆ g_detach_requested

std::atomic<bool> g_detach_requested {false}

Глобальный флаг: true когда SIGUSR1 запросил detach XDP.

Definition at line 32 of file main.cpp.

Referenced by HandleSignal(), and main().

◆ g_running

std::atomic<bool> g_running {true}

Глобальный флаг: false запускает graceful shutdown.

Definition at line 30 of file main.cpp.

Referenced by HandleSignal(), and main().

◆ g_xdp_attached

std::atomic<bool> g_xdp_attached {false}

Глобальный флаг: true когда XDP-программа прикреплена к интерфейсу.

Definition at line 31 of file main.cpp.

Referenced by main().