wgcl/wireguard/wgcpp.hpp
2025-06-29 23:23:15 +08:00

62 lines
1.3 KiB
C++

#pragma once
#include <cstdint>
#include <map>
#include <set>
#include <string_view>
#include <vector>
extern "C" {
#include "./wireguard.h"
}
typedef std::string_view strv;
class User {
public:
std::string_view username;
std::uint32_t ipv4;
wg_peer node;
std::set<std::string_view> acl_member;
wg_key privkey;
User(strv name, uint32_t ipv4, wg_key pubkey, wg_key privkey);
};
class Users {
public:
std::vector<User> users;
std::map<std::string_view, std::vector<User>> acl_aggr();
void sort_with_ip();
};
struct WGPeerStat {
bool active;
wg_key_b64_string pubkey;
u_int32_t ipv4;
};
class WG {
private:
wg_device wg_dev;
std::set<uint32_t> ipv4_pool;
uint32_t ipv4_alloc() {
uint32_t pick = *this->ipv4_pool.begin();
this->ipv4_pool.erase(pick);
return pick;
}
wg_key_b64_string b64_private_key, b64_public_key;
public:
Users &users;
uint32_t network_ipv4;
uint8_t cidr;
uint32_t persistent_time = 0;
WG(Users &wg_users, const char name[16], std::uint16_t port, uint32_t network,
uint8_t cidr);
WG(Users &wg_users, const char name[16], std::uint16_t port, uint32_t network,
uint8_t cidr, std::string_view srv_priv_key, std::string_view srv_pub_key);
User &add_cfg(strv name);
User &add_cfg(strv name, uint32_t ipv4);
void merge();
std::vector<WGPeerStat> *peer_state();
};