]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Add a PoolAvailableRule to easily add backup pools
authorRobin Geuze <robing@transip.nl>
Sat, 3 Nov 2018 14:08:13 +0000 (15:08 +0100)
committerRobin Geuze <robing@transip.nl>
Sat, 3 Nov 2018 14:08:13 +0000 (15:08 +0100)
pdns/dnsdist-lua-rules.cc
pdns/dnsdistdist/dnsdist-rules.hh

index 28630b1fe7c15be9f5a2281e98d1302dccf6cffc..8fc84d49407c5b7bb36a8d8d4c3be606cf9809fa 100644 (file)
@@ -440,6 +440,12 @@ void setupLuaRules()
       return std::shared_ptr<TimedIPSetRule>(new TimedIPSetRule());
     });
 
+  g_lua.writeFunction("PoolAvailableRule", [](std::string poolname) {
+    setLuaSideEffect();
+    auto localPools = g_pools.getCopy();
+    return std::shared_ptr<DNSRule>(new PoolAvailableRule(localPools, poolname));
+  });
+
   g_lua.registerFunction<void(std::shared_ptr<TimedIPSetRule>::*)()>("clear", [](std::shared_ptr<TimedIPSetRule> tisr) {
       tisr->clear();
     });
index 2321902d92ca3591cdd66fb1ee6c1712a721d8cd..10a40b6014d5b7688f8e40fd8ecb99edbf58e6c6 100644 (file)
@@ -991,3 +991,25 @@ private:
   boost::optional<std::string> d_value;
   std::string d_tag;
 };
+
+class PoolAvailableRule : public DNSRule
+{
+public:
+  PoolAvailableRule(pools_t& pools, const std::string& poolname) : d_poolname(poolname)
+  {
+    d_pool = getPool(pools, poolname);
+  }
+
+  bool matches(const DNSQuestion* dq) const override
+  {
+    return (d_pool->countServers(true) > 0);
+  }
+
+  string toString() const override
+  {
+    return "pool '" + d_poolname + "' is available";
+  }
+private:
+  std::string d_poolname;
+  std::shared_ptr<ServerPool> d_pool;
+};