#undef L
#include "dnsdist.hh"
-GlobalStateHolder<CarbonConfig> g_carbon;
+GlobalStateHolder<vector<CarbonConfig> > g_carbon;
static time_t s_start=time(0);
uint64_t uptimeOfProcess(const std::string& str)
{
{
auto localCarbon = g_carbon.getLocal();
for(int numloops=0;;++numloops) {
- if(localCarbon->servers.empty()) {
+ if(localCarbon->empty()) {
sleep(1);
continue;
}
- if(numloops)
- sleep(localCarbon->interval);
-
- string hostname=localCarbon->ourname;
- if(hostname.empty()) {
- char tmp[80];
- memset(tmp, 0, sizeof(tmp));
- gethostname(tmp, sizeof(tmp));
- char *p = strchr(tmp, '.');
- if(p) *p=0;
- hostname=tmp;
- boost::replace_all(hostname, ".", "_");
+ /* this is wrong, we use the interval of the first server
+ for every single one of them */
+ if(numloops) {
+ const unsigned int interval = localCarbon->at(0).interval;
+ sleep(interval);
}
- for (auto server : localCarbon->servers) {
+
+ for (const auto& conf : *localCarbon) {
+ const auto& server = conf.server;
+ std::string hostname = conf.ourname;
+ if(hostname.empty()) {
+ char tmp[80];
+ memset(tmp, 0, sizeof(tmp));
+ gethostname(tmp, sizeof(tmp));
+ char *p = strchr(tmp, '.');
+ if(p) *p=0;
+ hostname=tmp;
+ boost::replace_all(hostname, ".", "_");
+ }
+
try {
Socket s(server.sin4.sin_family, SOCK_STREAM);
s.setNonBlocking();
g_lua.registerFunction("check",(bool (SuffixMatchNode::*)(const DNSName&) const) &SuffixMatchNode::check);
g_lua.writeFunction("carbonServer", [](const std::string& address, boost::optional<string> ourName,
- boost::optional<int> interval) {
+ boost::optional<unsigned int> interval) {
setLuaSideEffect();
auto ours = g_carbon.getCopy();
- ours.servers.push_back(ComboAddress(address, 2003));
- if(ourName)
- ours.ourname=*ourName;
- if(interval)
- ours.interval=*interval;
- if(!ours.interval)
- ours.interval=1;
+ ours.push_back({ComboAddress(address, 2003), ourName ? *ourName : "", interval ? *interval : 30});
g_carbon.setState(ours);
});
struct CarbonConfig
{
- vector<ComboAddress> servers;
+ ComboAddress server;
std::string ourname;
- unsigned int interval{30};
+ unsigned int interval;
};
enum ednsHeaderFlags {
EDNS_HEADER_FLAG_DO = 32768
};
-extern GlobalStateHolder<CarbonConfig> g_carbon;
+extern GlobalStateHolder<vector<CarbonConfig> > g_carbon;
extern GlobalStateHolder<ServerPolicy> g_policy;
extern GlobalStateHolder<servers_t> g_dstates;
extern GlobalStateHolder<pools_t> g_pools;