ebpf-blocker 1.0.0
XDP-based packet blocker using eBPF
Loading...
Searching...
No Matches
db.h
Go to the documentation of this file.
1/// \file db.h
2/// \brief Обёртка SQLite-базы данных и утилиты парсинга CIDR.
3/// \details Предоставляет RAII-обёртку над SQLite3 (BlockerDB),
4/// парсер CIDR-нотации и конвертер IP-адресов.
5
6#ifndef DB_H
7#define DB_H
8
9#include <cstdint>
10#include <sqlite3.h>
11#include <string>
12#include <vector>
13
14/// Одна запись (IP/CIDR + комментарий) для whitelist или blacklist.
15struct BlockEntry {
16 std::string ip; ///< IP-адрес или CIDR-нотация, например "10.0.0.0/8".
17 std::string comment; ///< Человекочитаемый комментарий.
18};
19
20/// Распарсенное представление CIDR-подсети.
21struct CIDR {
22 uint32_t ip; ///< IP-адрес в network byte order с применённой маской.
23 uint32_t prefixlen; ///< Длина префикса (0-32). 32 означает одиночный хост.
24};
25
26/// Парсит CIDR-строку (например "192.168.1.0/24") в структуру \ref CIDR.
27/// @param[in] str Входная строка в формате "IP" или "IP/длина_префикса".
28/// @return Распарсенный CIDR (ip в network byte order, с маской).
29/// @throws std::invalid_argument при некорректном IP или длине префикса.
30CIDR ParseCIDR(const std::string &str);
31
32/// Конвертирует 32-битный IP (network byte order) в dotted-decimal строку.
33/// @param[in] ip IP-адрес в network byte order.
34/// @return Строка вида "192.168.1.1".
35std::string IPToString(uint32_t ip);
36
37/// RAII-обёртка над SQLite3 для хранения белого и чёрного списков.
38///
39/// Управляет подключением к базе данных, создаёт таблицы при первом запуске
40/// и предоставляет методы для чтения и обновления записей.
41class BlockerDB {
42public:
43 /// Открывает (или создаёт) базу данных по указанному пути.
44 /// @param[in] path Путь к файлу SQLite-базы данных.
45 /// @throws std::runtime_error если не удалось открыть БД.
46 explicit BlockerDB(const std::string &path);
47 ~BlockerDB();
48
49 BlockerDB(const BlockerDB &) = delete;
50 BlockerDB &operator=(const BlockerDB &) = delete;
51 BlockerDB(BlockerDB &&) = delete;
53
54 /// Создаёт таблицы, если они не существуют; применяет миграции схемы.
55 ///
56 /// Включает WAL-режим журнала. Идемпотентна.
57 /// @throws std::runtime_error если SQL миграции завершился ошибкой.
58 void Migrate();
59
60 /// Возвращает все записи белого списка из базы данных.
61 /// @return Вектор записей BlockEntry.
62 std::vector<BlockEntry> GetWhitelist();
63 /// Возвращает все записи чёрного списка из базы данных.
64 /// @return Вектор записей BlockEntry.
65 std::vector<BlockEntry> GetBlacklist();
66
67 /// Обновляет last_blocked_at текущим временем для указанного IP.
68 ///
69 /// Также обновляет любую CIDR-запись, покрывающую этот IP.
70 /// @param[in] ip IP-адрес источника в network byte order.
71 void UpdateLastBlockedAt(uint32_t ip);
72
73private:
74 sqlite3 *db_; ///< Указатель на дескриптор SQLite3.
75 /// Обобщённый SELECT ip, comment из указанной таблицы.
76 /// @param[in] table Имя таблицы ("whitelist_ips" или "blocked_ips").
77 /// @return Вектор записей BlockEntry.
78 std::vector<BlockEntry> GetEntries(const std::string &table);
79};
80
81#endif
Definition db.h:41
std::vector< BlockEntry > GetBlacklist()
Definition db.cpp:198
BlockerDB & operator=(const BlockerDB &)=delete
void Migrate()
Definition db.cpp:89
BlockerDB(const std::string &path)
Definition db.cpp:71
sqlite3 * db_
Definition db.h:74
void UpdateLastBlockedAt(uint32_t ip)
Definition db.cpp:146
BlockerDB(const BlockerDB &)=delete
BlockerDB & operator=(BlockerDB &&)=delete
std::vector< BlockEntry > GetWhitelist()
Definition db.cpp:194
BlockerDB(BlockerDB &&)=delete
std::vector< BlockEntry > GetEntries(const std::string &table)
Definition db.cpp:202
~BlockerDB()
Definition db.cpp:80
std::string IPToString(uint32_t ip)
Definition db.cpp:45
CIDR ParseCIDR(const std::string &str)
Definition db.cpp:18
Одна запись (IP/CIDR + комментарий) для whitelist или blacklist.
Definition db.h:15
std::string comment
Человекочитаемый комментарий.
Definition db.h:17
std::string ip
IP-адрес или CIDR-нотация, например "10.0.0.0/8".
Definition db.h:16
Распарсенное представление CIDR-подсети.
Definition db.h:21
uint32_t prefixlen
Длина префикса (0-32). 32 означает одиночный хост.
Definition db.h:23
uint32_t ip
IP-адрес в network byte order с применённой маской.
Definition db.h:22