Runtime-modifiable IP address sets

From within maintenance() or other places, we may find that certain IP addresses must be treated differently for a certain time.

This may be used to temporarily shunt traffic to another pool for example.

TimedIPSetRule() creates an object to which native IP addresses can be added in ComboAddress form.

TimedIPSetRule() → TimedIPSetRule

Returns a TimedIPSetRule.

class TimedIPSetRule

Can be used to handle IP addresses differently for a certain time.

:add(address, seconds)

Add an IP address to the set for the next second seconds.

Parameters:
  • address (ComboAddress) – The address to add
  • seconds (int) – Time to keep the address in the Rule
:cleanup()

Purge the set from expired IP addresses

:clear()

Clear the entire set

:slice()

Convert the TimedIPSetRule into a DNSRule that can be passed to addAction()

A working example:

tisrElGoog=TimedIPSetRule()
tisrRest=TimedIPSetRule()
addAction(tisrElGoog:slice(), PoolAction("elgoog"))
addAction(tisrRest:slice(), PoolAction(""))

elgoogPeople=newNMG()
elgoogPeople:addMask("192.168.5.0/28")

function pickPool(dq)
        if(elgoogPeople:match(dq.remoteaddr)) -- in real life, this would be external
        then
                print("Lua caught query for a googlePerson")
                tisrElGoog:add(dq.remoteaddr, 10)
                return DNSAction.Pool, "elgoog"
        else
                print("Lua caught query for restPerson")
                tisrRest:add(dq.remoteaddr, 60)
                return DNSAction.None, ""
        end
end

addAction(AllRule(), LuaAction(pickPool))