WebDNS/server/main.cpp

85 lines
2.2 KiB
C++

#include <iostream>
#include <cstring>
#include <event2/thread.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); //htons(53);
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); //htons(53);
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();
if(argc < 2) {
std::cerr << "Missing port. Default DNS port is 53\n";
return 1;
}
uint16_t port{0};
try {
port = std::stoul(argv[1]);
} catch(std::exception& ex) {
std::cerr << "Failed to parse port\n";
return 1;
}
std::string error{};
auto handler = std::make_shared<WebDNSHandler>();
DNSServer server{handler};
if(!server.start(bindings(port), error)) {
for(auto& binding : server.bindings())
std::cout << " - " << binding->error << "\n";
std::cerr << "Failed to start server: " << error << "\n";
return 1;
}
std::string line;
while(true) {
std::getline(std::cin, line);
if(line.empty())
continue;
if(line == "end" || line == "stop") {
std::cout << "Stopping server\n";
break;
} else if(line.length() > 13 && line.substr(0, 13) == "add-le-token ") {
le_token.push_back(line.substr(13));
std::cout << "Added letsencrypt token: " << le_token.back() << "\n";
} else if(line.length() > 14 && line.substr(0, 14) == "clear-le-token ") {
std::cout << "Cleaning up LE tokens\n";
le_token.clear();
} else if(line.length() > 14 && line.substr(0, 14) == "list-le-token ") {
std::cout << "Letsencrypt tokens (" << le_token.size() << "):\n";
for(auto& token : le_token)
std::cout << " - " << token << "\n";
} else {
std::cerr << "Unknown command \"" << line << "\"\n";
}
}
return 0;
}