#include #include #include #include "src/logger.h" #include "src/server.h" #include "src/handler.h" using namespace ts::dns; std::vector bindings(uint16_t port) { std::vector result{}; { sockaddr_in& any_v4{reinterpret_cast(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(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 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(); 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); } } logger::shutdown(); return 0; }