99 lines
2.5 KiB
C++
99 lines
2.5 KiB
C++
#include <iostream>
|
|
#include <cstring>
|
|
#include <event2/thread.h>
|
|
#include "src/logger.h"
|
|
#include "src/server.h"
|
|
#include "src/handler.h"
|
|
|
|
using namespace ts::dns;
|
|
|
|
std::vector<sockaddr_storage> bindings(uint16_t port) {
|
|
std::vector<sockaddr_storage> result{};
|
|
|
|
{
|
|
sockaddr_in& any_v4{reinterpret_cast<sockaddr_in&>(result.emplace_back())};
|
|
memset(&any_v4, 0, sizeof(sockaddr_in));
|
|
|
|
any_v4.sin_family = AF_INET;
|
|
any_v4.sin_port = htons(port);
|
|
any_v4.sin_addr.s_addr = INADDR_ANY;
|
|
}
|
|
|
|
{
|
|
sockaddr_in& any_v4{reinterpret_cast<sockaddr_in&>(result.emplace_back())};
|
|
memset(&any_v4, 0, sizeof(sockaddr_in));
|
|
|
|
any_v4.sin_family = AF_INET;
|
|
any_v4.sin_port = htons(port);
|
|
any_v4.sin_addr.s_addr = (1UL << 24U) | 127U;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
extern std::vector<std::string> le_token;
|
|
int main(int argc, char** argv) {
|
|
evthread_use_pthreads();
|
|
std::string error{};
|
|
|
|
if(!logger::setup(error)) {
|
|
std::cerr << "Failed to setup log: " << error << "\n";
|
|
return 1;
|
|
}
|
|
|
|
if(argc < 2) {
|
|
log_general()->error("Missing port. Default DNS port is 53");
|
|
return 1;
|
|
}
|
|
|
|
uint16_t port{0};
|
|
try {
|
|
port = std::stoul(argv[1]);
|
|
} catch(std::exception& ex) {
|
|
log_general()->error("Failed to parse port ({})", argv[1]);
|
|
return 1;
|
|
}
|
|
|
|
auto handler = std::make_shared<WebDNSHandler>();
|
|
DNSServer server{handler};
|
|
|
|
log_general()->info("Starting server on port {}", port);
|
|
if(!server.start(bindings(port), error)) {
|
|
auto logger = log_general();
|
|
for(auto& binding : server.bindings())
|
|
logger->error(" - {}", error);
|
|
logger->error("Failed to start server: {}", error);
|
|
return 1;
|
|
}
|
|
|
|
std::string line;
|
|
while(true) {
|
|
std::getline(std::cin, line);
|
|
if(line.empty())
|
|
continue;
|
|
|
|
if(line == "end" || line == "stop") {
|
|
log_general()->info("Stopping server");
|
|
break;
|
|
} else if(line.length() > 13 && line.substr(0, 13) == "add-le-token ") {
|
|
le_token.push_back(line.substr(13));
|
|
log_general()->info("Added LetsEncrypt token {}", le_token.back());
|
|
} else if(line.length() >= 14 && line.substr(0, 14) == "clear-le-token") {
|
|
log_general()->info("Cleaning up {} le tokens", le_token.size());
|
|
le_token.clear();
|
|
} else if(line.length() >= 14 && line.substr(0, 14) == "list-le-token") {
|
|
log_general()->info("LetsEncrypt tokens ({}):", le_token.size());
|
|
for(auto& token : le_token)
|
|
log_general()->info(" - ", token);
|
|
} else {
|
|
log_general()->error("Unknown command \"{}\"", line);
|
|
}
|
|
}
|
|
|
|
server.stop();
|
|
|
|
log_general()->info("Server stopped");
|
|
logger::shutdown();
|
|
libevent_global_shutdown();
|
|
return 0;
|
|
} |