1
0
Fork 0
knot-resolver/modules/etcd/etcd.lua
Daniel Baumann fbc604e215
Adding upstream version 5.7.5.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-21 13:56:17 +02:00

56 lines
1.2 KiB
Lua

--- @module etcd
-- SPDX-License-Identifier: GPL-3.0-or-later
local etcd = {}
-- @function update subtree configuration
local function update_subtree(tree)
if not tree then return end
for _, k in pairs(tree) do
if k.dir then
update_subtree(k.nodes)
else
local key,opt = k.key:gmatch('([^/]+)/([^/]+)$')()
if _G[key][opt] ~= k.value then
_G[key][opt] = k.value
end
end
end
end
-- @function reload whole configuration
function etcd.reload()
local res, err = etcd.cli:readdir('/', true)
if err then
error(err)
end
update_subtree(res.body.node.nodes)
end
function etcd.init()
etcd.Etcd = require('etcd.luasocket')
etcd.defaults = { prefix = '/knot-resolver' }
end
function etcd.deinit()
if etcd.ev then event.cancel(etcd.ev) end
end
function etcd.config(conf)
local options = etcd.defaults
if type(conf) == 'table' then
for k,v in pairs(conf) do options[k] = v end
end
-- create connection
local cli, err = etcd.Etcd.new(options)
if err then
error(err)
end
etcd.cli = cli
-- schedule recurrent polling
-- @todo: the etcd has watch() API, but this requires
-- coroutines on socket operations
if etcd.ev then event.cancel(etcd.ev) end
etcd.ev = event.recurrent(5 * sec, etcd.reload)
end
return etcd