static vector<std::function<void(void)>>* g_launchWork;
-vector<std::function<void(void)>> setupLua(bool client)
+vector<std::function<void(void)>> setupLua(bool client, const std::string& config)
{
g_launchWork= new vector<std::function<void(void)>>();
+ typedef std::unordered_map<std::string, boost::variant<std::string, vector<pair<int, std::string> > > > newserver_t;
g_lua.writeFunction("newServer",
- [client](boost::variant<string,std::unordered_map<std::string, std::string>> pvars, boost::optional<int> qps)
+ [client](boost::variant<string,newserver_t> pvars, boost::optional<int> qps)
{
if(client) {
return std::make_shared<DownstreamState>(ComboAddress());
return ret;
}
- auto vars=boost::get<std::unordered_map<std::string, std::string>>(pvars);
- auto ret=std::make_shared<DownstreamState>(ComboAddress(vars["address"], 53));
+ auto vars=boost::get<newserver_t>(pvars);
+ auto ret=std::make_shared<DownstreamState>(ComboAddress(boost::get<string>(vars["address"]), 53));
if(vars.count("qps")) {
- ret->qps=QPSLimiter(boost::lexical_cast<int>(vars["qps"]),boost::lexical_cast<int>(vars["qps"]));
+ int qps=boost::lexical_cast<int>(boost::get<string>(vars["qps"]));
+ ret->qps=QPSLimiter(qps, qps);
}
if(vars.count("pool")) {
- ret->pools.insert(vars["pool"]);
+ if(auto* pool = boost::get<string>(&vars["pool"]))
+ ret->pools.insert(*pool);
+ else {
+ auto* pools = boost::get<vector<pair<int, string> > >(&vars["pool"]);
+ for(auto& p : *pools)
+ ret->pools.insert(p.second);
+ }
}
if(vars.count("order")) {
- ret->order=boost::lexical_cast<int>(vars["order"]);
+ ret->order=boost::lexical_cast<int>(boost::get<string>(vars["order"]));
}
if(vars.count("weight")) {
- ret->weight=boost::lexical_cast<int>(vars["weight"]);
+ ret->weight=boost::lexical_cast<int>(boost::get<string>(vars["weight"]));
}
if(g_launchWork) {
}});
- std::ifstream ifs(g_vm["config"].as<string>());
+ std::ifstream ifs(config);
if(!ifs)
- warnlog("Unable to read configuration from '%s'", g_vm["config"].as<string>());
+ warnlog("Unable to read configuration from '%s'", config);
else
- infolog("Read configuration from '%s'", g_vm["config"].as<string>());
+ infolog("Read configuration from '%s'", config);
g_lua.executeCode(ifs);
auto ret=*g_launchWork;
#include <fstream>
#include "sodcrypto.hh"
#include "dnsrulactions.hh"
+#include <boost/program_options.hpp>
#undef L
+namespace po = boost::program_options;
/* Known sins:
No centralized statistics
Round-robin with basic uptime checks
Send to least loaded server (least outstanding)
Send it to the first server that is not overloaded
+ Hashed weighted random
*/
/* Idea:
g_policy.setState(leastOutstandingPol);
if(g_vm.count("client") || g_vm.count("command")) {
- setupLua(true);
+ setupLua(true, g_vm["config"].as<string>());
doClient(g_serverControl);
exit(EXIT_SUCCESS);
}
- auto todo=setupLua(false);
+ auto todo=setupLua(false, g_vm["config"].as<string>());
if(g_vm.count("local")) {
g_locals.clear();
#include "dnsname.hh"
#include <atomic>
#include <boost/circular_buffer.hpp>
-#include <boost/program_options.hpp>
#include <mutex>
#include <thread>
#include "sholder.hh"
struct dnsheader;
void controlThread(int fd, ComboAddress local);
-vector<std::function<void(void)>> setupLua(bool client);
-
-
-namespace po = boost::program_options;
-extern po::variables_map g_vm;
+vector<std::function<void(void)>> setupLua(bool client, const std::string& config);
NumberedServerVector getDownstreamCandidates(const servers_t& servers, const std::string& pool);
std::shared_ptr<DownstreamState> firstAvailable(const NumberedServerVector& servers, const ComboAddress& remote, const DNSName& qname, uint16_t qtype, dnsheader* dh);
-- setServerPolicyLua("luaroundrobin", luaroundrobin)
-xs=newServer{address="2001:888:2000:1d::2", pool="auth"}
-newServer{address="2a01:4f8:110:4389::2", pool="auth"}
-xs:addPool("dnssec")
+newServer{address="2001:888:2000:1d::2", pool={"auth", "dnssec"}}
+newServer{address="2a01:4f8:110:4389::2", pool={"auth", "dnssec"}}
setDNSSECPool("dnssec")
topRule()