net/unbound.lua
author Matthew Wild <mwild1@gmail.com>
Mon, 28 Sep 2020 16:21:41 +0100
changeset 11100 dd1713862c20
parent 10972 23ae55cbbeaf
child 11252 a1aecd8cf7ee
permissions -rw-r--r--
net.http.server: Default to HTTP result code 500 when promise is rejected
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10966
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
-- libunbound based net.adns replacement for Prosody IM
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
-- Copyright (C) 2013-2015 Kim Alvefur
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
--
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
-- This file is MIT licensed.
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
--
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
-- luacheck: ignore prosody
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
local setmetatable = setmetatable;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
local tostring = tostring;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
local t_concat = table.concat;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
local s_format = string.format;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
local s_lower = string.lower;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
local s_upper = string.upper;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
local noop = function() end;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
local log = require "util.logger".init("unbound");
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
local net_server = require "net.server";
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    18
local libunbound = require"lunbound";
10972
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10971
diff changeset
    19
local promise = require"util.promise";
10966
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    21
local gettime = require"socket".gettime;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    22
local dns_utils = require"util.dns";
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
local classes, types, errors = dns_utils.classes, dns_utils.types, dns_utils.errors;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    24
local parsers = dns_utils.parsers;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
local function add_defaults(conf)
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    27
	if conf then
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    28
		for option, default in pairs(libunbound.config) do
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    29
			if conf[option] == nil then
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    30
				conf[option] = default;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
			end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
		end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
	end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    34
	return conf;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    35
end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    36
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
local unbound_config;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
if prosody then
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
	local config = require"core.configmanager";
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
	unbound_config = add_defaults(config.get("*", "unbound"));
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    41
	prosody.events.add_handler("config-reloaded", function()
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
		unbound_config = add_defaults(config.get("*", "unbound"));
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    43
	end);
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    45
-- Note: libunbound will default to using root hints if resolvconf is unset
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    46
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    47
local function connect_server(unbound, server)
10971
67aabf83230b net.unbound: Strip support for legacy net.server APIs
Kim Alvefur <zash@zash.se>
parents: 10966
diff changeset
    48
	return server.watchfd(unbound, function ()
67aabf83230b net.unbound: Strip support for legacy net.server APIs
Kim Alvefur <zash@zash.se>
parents: 10966
diff changeset
    49
		unbound:process()
67aabf83230b net.unbound: Strip support for legacy net.server APIs
Kim Alvefur <zash@zash.se>
parents: 10966
diff changeset
    50
	end);
10966
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    51
end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    52
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    53
local unbound = libunbound.new(unbound_config);
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    54
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
local server_conn = connect_server(unbound, net_server);
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    56
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    57
local answer_mt = {
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    58
	__tostring = function(self)
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    59
		if self._string then return self._string end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    60
		local h = s_format("Status: %s", errors[self.status]);
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    61
		if self.secure then
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    62
			h = h .. ", Secure";
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    63
		elseif self.bogus then
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    64
			h = h .. s_format(", Bogus: %s", self.bogus);
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    65
		end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    66
		local t = { h };
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    67
		for i = 1, #self do
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    68
			t[i+1]=self.qname.."\t"..classes[self.qclass].."\t"..types[self.qtype].."\t"..tostring(self[i]);
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    69
		end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    70
		local _string = t_concat(t, "\n");
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    71
		self._string = _string;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    72
		return _string;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    73
	end;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    74
};
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    75
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    76
local waiting_queries = {};
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    77
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    78
local function prep_answer(a)
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    79
	if not a then return end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    80
	local status = errors[a.rcode];
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    81
	local qclass = classes[a.qclass];
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    82
	local qtype = types[a.qtype];
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    83
	a.status, a.class, a.type = status, qclass, qtype;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    84
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    85
	local t = s_lower(qtype);
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    86
	local rr_mt = { __index = a, __tostring = function(self) return tostring(self[t]) end };
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    87
	local parser = parsers[qtype];
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    88
	for i = 1, #a do
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    89
		if a.bogus then
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    90
			-- Discard bogus data
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    91
			a[i] = nil;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    92
		else
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    93
			a[i] = setmetatable({[t] = parser(a[i])}, rr_mt);
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    94
		end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    95
	end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    96
	return setmetatable(a, answer_mt);
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    97
end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    98
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    99
local function lookup(callback, qname, qtype, qclass)
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   100
	qtype = qtype and s_upper(qtype) or "A";
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   101
	qclass = qclass and s_upper(qclass) or "IN";
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   102
	local ntype, nclass = types[qtype], classes[qclass];
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   103
	local startedat = gettime();
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   104
	local ret;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   105
	local function callback_wrapper(a, err)
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   106
		local gotdataat = gettime();
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   107
		waiting_queries[ret] = nil;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   108
		if a then
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   109
			prep_answer(a);
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   110
			log("debug", "Results for %s %s %s: %s (%s, %f sec)", qname, qclass, qtype, a.rcode == 0 and (#a .. " items") or a.status,
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   111
				a.secure and "Secure" or a.bogus or "Insecure", gotdataat - startedat); -- Insecure as in unsigned
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   112
		else
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   113
			log("error", "Results for %s %s %s: %s", qname, qclass, qtype, tostring(err));
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   114
		end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   115
		local ok, cerr = pcall(callback, a, err);
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   116
		if not ok then log("error", "Error in callback: %s", cerr); end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   117
	end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   118
	log("debug", "Resolve %s %s %s", qname, qclass, qtype);
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   119
	local err;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   120
	ret, err = unbound:resolve_async(callback_wrapper, qname, ntype, nclass);
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   121
	if ret then
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   122
		waiting_queries[ret] = callback;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   123
	else
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   124
		log("warn", err);
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   125
	end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   126
	return ret, err;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   127
end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   128
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   129
local function lookup_sync(qname, qtype, qclass)
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   130
	qtype = qtype and s_upper(qtype) or "A";
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   131
	qclass = qclass and s_upper(qclass) or "IN";
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   132
	local ntype, nclass = types[qtype], classes[qclass];
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   133
	local a, err = unbound:resolve(qname, ntype, nclass);
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   134
	if not a then return a, err; end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   135
	return prep_answer(a);
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   136
end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   137
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   138
local function cancel(id)
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   139
	local cb = waiting_queries[id];
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   140
	unbound:cancel(id);
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   141
	if cb then
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   142
		cb(nil, "canceled");
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   143
		waiting_queries[id] = nil;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   144
	end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   145
	return true;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   146
end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   147
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   148
-- Reinitiate libunbound context, drops cache
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   149
local function purge()
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   150
	for id in pairs(waiting_queries) do cancel(id); end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   151
	if server_conn then server_conn:close(); end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   152
	unbound = libunbound.new(unbound_config);
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   153
	server_conn = connect_server(unbound, net_server);
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   154
	return true;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   155
end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   156
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   157
local function not_implemented()
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   158
	error "not implemented";
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   159
end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   160
-- Public API
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   161
local _M = {
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   162
	lookup = lookup;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   163
	cancel = cancel;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   164
	new_async_socket = not_implemented;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   165
	dns = {
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   166
		lookup = lookup_sync;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   167
		cancel = cancel;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   168
		cache = noop;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   169
		socket_wrapper_set = noop;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   170
		settimeout = noop;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   171
		query = noop;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   172
		purge = purge;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   173
		random = noop;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   174
		peek = noop;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   175
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   176
		types = types;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   177
		classes = classes;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   178
	};
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   179
};
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   180
10972
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10971
diff changeset
   181
local function lookup_promise(_, qname, qtype, qclass)
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10971
diff changeset
   182
	return promise.new(function (resolve, reject)
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10971
diff changeset
   183
		local function callback(answer, err)
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10971
diff changeset
   184
			if err then
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10971
diff changeset
   185
				return reject(err);
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10971
diff changeset
   186
			else
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10971
diff changeset
   187
				return resolve(answer);
10966
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   188
			end
10972
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10971
diff changeset
   189
		end
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10971
diff changeset
   190
		local ret, err = lookup(callback, qname, qtype, qclass)
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10971
diff changeset
   191
		if not ret then reject(err); end
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10971
diff changeset
   192
	end);
10966
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   193
end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   194
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   195
local wrapper = {
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   196
	lookup = function (_, callback, qname, qtype, qclass)
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   197
		return lookup(callback, qname, qtype, qclass)
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   198
	end;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   199
	lookup_promise = lookup_promise;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   200
	_resolver = {
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   201
		settimeout = function () end;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   202
		closeall = function () end;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   203
	};
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   204
}
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   205
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   206
function _M.resolver() return wrapper; end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   207
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   208
return _M;