#pragma once #include #include #include #include #include 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 acl_member; wg_key privkey; User(strv name, uint32_t ipv4, wg_key pubkey, wg_key privkey); }; class Users { public: std::vector users; std::map> 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 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 *peer_state(); };