Skip to content
API Documentation
BastionGuard™
BastionGuard::DnsmasqBackend Class Reference

#include <dnsmasq_backend.hpp>

Public Member Functions

 DnsmasqBackend (const std::string &blacklist_path="/etc/dnsmasq.d/BastionGuard-blacklist.conf", const std::string &whitelist_path="/etc/dnsmasq.d/BastionGuard-whitelist.conf", const std::string &dnsmasq_user="dnsmasq")
bool add_to_blacklist (const std::string &domain)
bool remove_from_blacklist (const std::string &domain)
bool add_to_whitelist (const std::string &domain)
bool remove_from_whitelist (const std::string &domain)
bool write_blacklist (const std::vector< std::string > &domains)
bool write_whitelist (const std::vector< std::string > &domains)
bool reload_dnsmasq ()

Private Member Functions

bool atomic_write (const std::string &path, const std::string &content)
std::string make_dnsmasq_entries (const std::vector< std::string > &domains)

Private Attributes

std::string blacklist_path_
std::string whitelist_path_
std::string dnsmasq_user_

Detailed Description

Definition at line 26 of file dnsmasq_backend.hpp.

Constructor & Destructor Documentation

◆ DnsmasqBackend()

BastionGuard::DnsmasqBackend::DnsmasqBackend ( const std::string & blacklist_path = "/etc/dnsmasq.d/BastionGuard-blacklist.conf",
const std::string & whitelist_path = "/etc/dnsmasq.d/BastionGuard-whitelist.conf",
const std::string & dnsmasq_user = "dnsmasq" )

Definition at line 41 of file dnsmasq_backend.cpp.

References blacklist_path_, dnsmasq_user_, and whitelist_path_.

Member Function Documentation

◆ add_to_blacklist()

bool BastionGuard::DnsmasqBackend::add_to_blacklist ( const std::string & domain)

Definition at line 123 of file dnsmasq_backend.cpp.

124{
125 std::thread([this, domain] {
127
128 std::lock_guard<std::mutex> lock(g_mutex);
129 if (std::find(g_blacklist.begin(), g_blacklist.end(), domain)
130 != g_blacklist.end())
131 return;
132
133 g_blacklist.push_back(domain);
134
137 }).detach();
138
139 return true;
140}
bool write_blacklist(const std::vector< std::string > &domains)
static std::mutex g_mutex
static void ensure_loaded(const std::string &bl, const std::string &wl)
static std::vector< std::string > g_blacklist

References blacklist_path_, BastionGuard::ensure_loaded(), BastionGuard::g_blacklist, BastionGuard::g_mutex, reload_dnsmasq(), whitelist_path_, and write_blacklist().

◆ add_to_whitelist()

bool BastionGuard::DnsmasqBackend::add_to_whitelist ( const std::string & domain)

Definition at line 160 of file dnsmasq_backend.cpp.

161{
162 std::thread([this, domain] {
164
165 std::lock_guard<std::mutex> lock(g_mutex);
166 if (std::find(g_whitelist.begin(), g_whitelist.end(), domain)
167 != g_whitelist.end())
168 return;
169
170 g_whitelist.push_back(domain);
171
173 }).detach();
174
175 return true;
176}
bool write_whitelist(const std::vector< std::string > &domains)
static std::vector< std::string > g_whitelist

References blacklist_path_, BastionGuard::ensure_loaded(), BastionGuard::g_mutex, BastionGuard::g_whitelist, whitelist_path_, and write_whitelist().

◆ atomic_write()

bool BastionGuard::DnsmasqBackend::atomic_write ( const std::string & path,
const std::string & content )
private

Definition at line 93 of file dnsmasq_backend.cpp.

95{
96 try {
97 fs::path p(path);
98 fs::path tmp = p.string() + ".tmp";
99
100 {
101 std::ofstream o(tmp);
102 if (!o) return false;
103 o << content;
104 }
105 fs::rename(tmp, p);
106 return true;
107 } catch (...) {
108 return false;
109 }
110}

Referenced by write_blacklist(), and write_whitelist().

◆ make_dnsmasq_entries()

std::string BastionGuard::DnsmasqBackend::make_dnsmasq_entries ( const std::vector< std::string > & domains)
private

Definition at line 113 of file dnsmasq_backend.cpp.

115{
116 std::ostringstream oss;
117 for (auto& d : domains)
118 oss << "address=/" << d << "/127.0.0.1\n";
119 return oss.str();
120}

Referenced by write_blacklist().

◆ reload_dnsmasq()

bool BastionGuard::DnsmasqBackend::reload_dnsmasq ( )

Definition at line 212 of file dnsmasq_backend.cpp.

213{
214 int st = (bg_process::run({"/usr/libexec/bastionguard/bastionguard-service", "--system", "try-reload-or-restart", "dnsmasq.service"}).exit_code);
215 return WIFEXITED(st) && WEXITSTATUS(st) == 0;
216}
Result run(const std::vector< std::string > &args, bool merge_stderr=false, std::size_t limit=8U *1024U *1024U, const std::map< std::string, std::string > &environment={}, const std::function< bool(const std::string &)> &on_line={})

References bg_process::run().

Referenced by add_to_blacklist(), and remove_from_blacklist().

◆ remove_from_blacklist()

bool BastionGuard::DnsmasqBackend::remove_from_blacklist ( const std::string & domain)

Definition at line 142 of file dnsmasq_backend.cpp.

143{
144 std::thread([this, domain] {
146
147 std::lock_guard<std::mutex> lock(g_mutex);
148
149 g_blacklist.erase(
150 std::remove(g_blacklist.begin(), g_blacklist.end(), domain),
151 g_blacklist.end());
152
155 }).detach();
156
157 return true;
158}

References blacklist_path_, BastionGuard::ensure_loaded(), BastionGuard::g_blacklist, BastionGuard::g_mutex, reload_dnsmasq(), whitelist_path_, and write_blacklist().

◆ remove_from_whitelist()

bool BastionGuard::DnsmasqBackend::remove_from_whitelist ( const std::string & domain)

Definition at line 178 of file dnsmasq_backend.cpp.

179{
180 std::thread([this, domain] {
182
183 std::lock_guard<std::mutex> lock(g_mutex);
184
185 g_whitelist.erase(
186 std::remove(g_whitelist.begin(), g_whitelist.end(), domain),
187 g_whitelist.end());
188
190 }).detach();
191
192 return true;
193}

References blacklist_path_, BastionGuard::ensure_loaded(), BastionGuard::g_mutex, BastionGuard::g_whitelist, whitelist_path_, and write_whitelist().

◆ write_blacklist()

bool BastionGuard::DnsmasqBackend::write_blacklist ( const std::vector< std::string > & domains)

Definition at line 196 of file dnsmasq_backend.cpp.

198{
200}
std::string make_dnsmasq_entries(const std::vector< std::string > &domains)
bool atomic_write(const std::string &path, const std::string &content)

References atomic_write(), blacklist_path_, and make_dnsmasq_entries().

Referenced by add_to_blacklist(), and remove_from_blacklist().

◆ write_whitelist()

bool BastionGuard::DnsmasqBackend::write_whitelist ( const std::vector< std::string > & domains)

Definition at line 202 of file dnsmasq_backend.cpp.

204{
205 std::ostringstream oss;
206 for (auto& d : domains)
207 oss << d << "\n";
208 return atomic_write(whitelist_path_, oss.str());
209}

References atomic_write(), and whitelist_path_.

Referenced by add_to_whitelist(), and remove_from_whitelist().

Member Data Documentation

◆ blacklist_path_

std::string BastionGuard::DnsmasqBackend::blacklist_path_
private

◆ dnsmasq_user_

std::string BastionGuard::DnsmasqBackend::dnsmasq_user_
private

Definition at line 47 of file dnsmasq_backend.hpp.

Referenced by DnsmasqBackend().

◆ whitelist_path_

std::string BastionGuard::DnsmasqBackend::whitelist_path_
private

The documentation for this class was generated from the following files: