annotate net/unbound.lua @ 14223:37612a03220d

net.unbound: Inherit trust anchors from luaunbound defaults If luaunbound ships with trust anchors set then that's probably good defaults.
author Kim Alvefur <zash@zash.se>
date Thu, 11 Jun 2026 22:19:08 +0200
parents 2ec517d8d43e
children 36aac3343563
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10962
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
12974
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12557
diff changeset
16 local logger = require "prosody.util.logger";
11250
d1351683dfe5 net.unbound: Allow tracing individual queries with a logger per query
Kim Alvefur <zash@zash.se>
parents: 11249
diff changeset
17 local log = logger.init("unbound");
12974
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12557
diff changeset
18 local net_server = require "prosody.net.server";
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 local libunbound = require"lunbound";
12974
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12557
diff changeset
20 local promise = require"prosody.util.promise";
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12557
diff changeset
21 local new_id = require "prosody.util.id".short;
14208
9c062f243d3a net.unbound: Let in-flight queries complete after re-initialization
Kim Alvefur <zash@zash.se>
parents: 14207
diff changeset
22 local timer = require "prosody.util.timer";
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23
12974
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12557
diff changeset
24 local dns_utils = require"prosody.util.dns";
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 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
26 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
27
14215
2719dbb358c8 net.unbound: Briefly explain default override settings
Kim Alvefur <zash@zash.se>
parents: 14210
diff changeset
28 local builtin_defaults = {
2719dbb358c8 net.unbound: Briefly explain default override settings
Kim Alvefur <zash@zash.se>
parents: 14210
diff changeset
29 -- Continue net.dns tradition of not reading /etc/hosts which does not fit well with SRV records anyway
2719dbb358c8 net.unbound: Briefly explain default override settings
Kim Alvefur <zash@zash.se>
parents: 14210
diff changeset
30 hoststxt = false;
2719dbb358c8 net.unbound: Briefly explain default override settings
Kim Alvefur <zash@zash.se>
parents: 14210
diff changeset
31 -- net.dns did read /etc/resolv.conf and we want libunbound to instead of operating in recursive mode
2719dbb358c8 net.unbound: Briefly explain default override settings
Kim Alvefur <zash@zash.se>
parents: 14210
diff changeset
32 resolvconf = true;
2719dbb358c8 net.unbound: Briefly explain default override settings
Kim Alvefur <zash@zash.se>
parents: 14210
diff changeset
33 }
12509
a92e1de62c9e net.unbound: Disable use of hosts file by default (fixes #1737)
Kim Alvefur <zash@zash.se>
parents: 12110
diff changeset
34
14216
2ec517d8d43e net.unbound: Enable DNSSEC by default with option for turning off
Kim Alvefur <zash@zash.se>
parents: 14215
diff changeset
35 -- Path to file containing current DNSSEC trust anchors, needed to enable DNSSEC.
2ec517d8d43e net.unbound: Enable DNSSEC by default with option for turning off
Kim Alvefur <zash@zash.se>
parents: 14215
diff changeset
36 -- Packagers: Adjust this path if it is different on your distribution
2ec517d8d43e net.unbound: Enable DNSSEC by default with option for turning off
Kim Alvefur <zash@zash.se>
parents: 14215
diff changeset
37 local trustfile = "/usr/share/dns/root.ds";
2ec517d8d43e net.unbound: Enable DNSSEC by default with option for turning off
Kim Alvefur <zash@zash.se>
parents: 14215
diff changeset
38
2ec517d8d43e net.unbound: Enable DNSSEC by default with option for turning off
Kim Alvefur <zash@zash.se>
parents: 14215
diff changeset
39 local function add_defaults(conf, use_dnssec)
12557
ee5b061588ea net.unbound: Merge luaunbound and prosody defaults in absence of user config (fixes #1763) (thanks rgd)
Kim Alvefur <zash@zash.se>
parents: 12510
diff changeset
40 conf = conf or {};
ee5b061588ea net.unbound: Merge luaunbound and prosody defaults in absence of user config (fixes #1763) (thanks rgd)
Kim Alvefur <zash@zash.se>
parents: 12510
diff changeset
41 for option, default in pairs(builtin_defaults) do
ee5b061588ea net.unbound: Merge luaunbound and prosody defaults in absence of user config (fixes #1763) (thanks rgd)
Kim Alvefur <zash@zash.se>
parents: 12510
diff changeset
42 if conf[option] == nil then
ee5b061588ea net.unbound: Merge luaunbound and prosody defaults in absence of user config (fixes #1763) (thanks rgd)
Kim Alvefur <zash@zash.se>
parents: 12510
diff changeset
43 conf[option] = default;
12509
a92e1de62c9e net.unbound: Disable use of hosts file by default (fixes #1737)
Kim Alvefur <zash@zash.se>
parents: 12110
diff changeset
44 end
12557
ee5b061588ea net.unbound: Merge luaunbound and prosody defaults in absence of user config (fixes #1763) (thanks rgd)
Kim Alvefur <zash@zash.se>
parents: 12510
diff changeset
45 end
14223
37612a03220d net.unbound: Inherit trust anchors from luaunbound defaults
Kim Alvefur <zash@zash.se>
parents: 14216
diff changeset
46 for option, default in pairs(libunbound.config) do
37612a03220d net.unbound: Inherit trust anchors from luaunbound defaults
Kim Alvefur <zash@zash.se>
parents: 14216
diff changeset
47 if conf[option] == nil then
37612a03220d net.unbound: Inherit trust anchors from luaunbound defaults
Kim Alvefur <zash@zash.se>
parents: 14216
diff changeset
48 conf[option] = default;
37612a03220d net.unbound: Inherit trust anchors from luaunbound defaults
Kim Alvefur <zash@zash.se>
parents: 14216
diff changeset
49 end
37612a03220d net.unbound: Inherit trust anchors from luaunbound defaults
Kim Alvefur <zash@zash.se>
parents: 14216
diff changeset
50 end
14216
2ec517d8d43e net.unbound: Enable DNSSEC by default with option for turning off
Kim Alvefur <zash@zash.se>
parents: 14215
diff changeset
51 if use_dnssec ~= false then
2ec517d8d43e net.unbound: Enable DNSSEC by default with option for turning off
Kim Alvefur <zash@zash.se>
parents: 14215
diff changeset
52 if conf["trustfile"] == nil and conf["trusted"] == nil then
2ec517d8d43e net.unbound: Enable DNSSEC by default with option for turning off
Kim Alvefur <zash@zash.se>
parents: 14215
diff changeset
53 conf["trustfile"] = trustfile;
2ec517d8d43e net.unbound: Enable DNSSEC by default with option for turning off
Kim Alvefur <zash@zash.se>
parents: 14215
diff changeset
54 end
2ec517d8d43e net.unbound: Enable DNSSEC by default with option for turning off
Kim Alvefur <zash@zash.se>
parents: 14215
diff changeset
55 end
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56 return conf;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57 end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
59 local unbound_config;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
60
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
61 local function connect_server(unbound, server)
11248
a1aecd8cf7ee net.unbound: Log net.server interactions
Kim Alvefur <zash@zash.se>
parents: 10968
diff changeset
62 log("debug", "Setting up net.server event handling for %s", unbound);
10967
67aabf83230b net.unbound: Strip support for legacy net.server APIs
Kim Alvefur <zash@zash.se>
parents: 10962
diff changeset
63 return server.watchfd(unbound, function ()
11248
a1aecd8cf7ee net.unbound: Log net.server interactions
Kim Alvefur <zash@zash.se>
parents: 10968
diff changeset
64 log("debug", "Processing queries for %s", unbound);
10967
67aabf83230b net.unbound: Strip support for legacy net.server APIs
Kim Alvefur <zash@zash.se>
parents: 10962
diff changeset
65 unbound:process()
67aabf83230b net.unbound: Strip support for legacy net.server APIs
Kim Alvefur <zash@zash.se>
parents: 10962
diff changeset
66 end);
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
67 end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
68
11252
ba335004ca60 net.unbound: Move libunbound initialization into a function
Kim Alvefur <zash@zash.se>
parents: 11250
diff changeset
69 local unbound, server_conn;
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70
11252
ba335004ca60 net.unbound: Move libunbound initialization into a function
Kim Alvefur <zash@zash.se>
parents: 11250
diff changeset
71 local function initialize()
ba335004ca60 net.unbound: Move libunbound initialization into a function
Kim Alvefur <zash@zash.se>
parents: 11250
diff changeset
72 unbound = libunbound.new(unbound_config);
ba335004ca60 net.unbound: Move libunbound initialization into a function
Kim Alvefur <zash@zash.se>
parents: 11250
diff changeset
73 server_conn = connect_server(unbound, net_server);
ba335004ca60 net.unbound: Move libunbound initialization into a function
Kim Alvefur <zash@zash.se>
parents: 11250
diff changeset
74 end
10962
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 answer_mt = {
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
77 __tostring = function(self)
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
78 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
79 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
80 if self.secure then
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
81 h = h .. ", Secure";
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
82 elseif self.bogus then
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
83 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
84 end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
85 local t = { h };
13479
d1b7edf4e2de net.unbound: Show canonical name in textual format (e.g. in shell)
Kim Alvefur <zash@zash.se>
parents: 12974
diff changeset
86 local qname = self.canonname or self.qname;
d1b7edf4e2de net.unbound: Show canonical name in textual format (e.g. in shell)
Kim Alvefur <zash@zash.se>
parents: 12974
diff changeset
87 if self.canonname then
d1b7edf4e2de net.unbound: Show canonical name in textual format (e.g. in shell)
Kim Alvefur <zash@zash.se>
parents: 12974
diff changeset
88 table.insert(t, self.qname .. "\t" .. classes[self.qclass] .. "\tCNAME\t" .. self.canonname);
d1b7edf4e2de net.unbound: Show canonical name in textual format (e.g. in shell)
Kim Alvefur <zash@zash.se>
parents: 12974
diff changeset
89 end
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
90 for i = 1, #self do
13479
d1b7edf4e2de net.unbound: Show canonical name in textual format (e.g. in shell)
Kim Alvefur <zash@zash.se>
parents: 12974
diff changeset
91 table.insert(t, qname .. "\t" .. classes[self.qclass] .. "\t" .. types[self.qtype] .. "\t" .. tostring(self[i]));
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
92 end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
93 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
94 self._string = _string;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
95 return _string;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
96 end;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
97 };
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 prep_answer(a)
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
100 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
101 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
102 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
103 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
104 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
105
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
106 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
107 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
108 local parser = parsers[qtype];
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
109 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
110 if a.bogus then
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
111 -- Discard bogus data
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
112 a[i] = nil;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
113 else
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
114 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
115 end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
116 end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
117 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
118 end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
119
13659
5abdcad8c2e0 net.adns: Collect DNS lookup timing metrics
Kim Alvefur <zash@zash.se>
parents: 13479
diff changeset
120 local function measure(_qclass, _qtype)
5abdcad8c2e0 net.adns: Collect DNS lookup timing metrics
Kim Alvefur <zash@zash.se>
parents: 13479
diff changeset
121 return measure;
5abdcad8c2e0 net.adns: Collect DNS lookup timing metrics
Kim Alvefur <zash@zash.se>
parents: 13479
diff changeset
122 end
5abdcad8c2e0 net.adns: Collect DNS lookup timing metrics
Kim Alvefur <zash@zash.se>
parents: 13479
diff changeset
123
13981
350e16e5f9aa net.unbound: Count number of DNS response records
Kim Alvefur <zash@zash.se>
parents: 13659
diff changeset
124 local count = measure;
350e16e5f9aa net.unbound: Count number of DNS response records
Kim Alvefur <zash@zash.se>
parents: 13659
diff changeset
125
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
126 local function lookup(callback, qname, qtype, qclass)
11253
919e7b962f0b net.unbound: Delay loading until server has started or first query
Kim Alvefur <zash@zash.se>
parents: 11252
diff changeset
127 if not unbound then initialize(); end
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
128 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
129 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
130 local ntype, nclass = types[qtype], classes[qclass];
13659
5abdcad8c2e0 net.adns: Collect DNS lookup timing metrics
Kim Alvefur <zash@zash.se>
parents: 13479
diff changeset
131
5abdcad8c2e0 net.adns: Collect DNS lookup timing metrics
Kim Alvefur <zash@zash.se>
parents: 13479
diff changeset
132 local m;
11250
d1351683dfe5 net.unbound: Allow tracing individual queries with a logger per query
Kim Alvefur <zash@zash.se>
parents: 11249
diff changeset
133 local log_query = logger.init("unbound.query"..new_id());
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
134 local function callback_wrapper(a, err)
13659
5abdcad8c2e0 net.adns: Collect DNS lookup timing metrics
Kim Alvefur <zash@zash.se>
parents: 13479
diff changeset
135 m();
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
136 if a then
13981
350e16e5f9aa net.unbound: Count number of DNS response records
Kim Alvefur <zash@zash.se>
parents: 13659
diff changeset
137 count(qclass, qtype, #a);
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
138 prep_answer(a);
13659
5abdcad8c2e0 net.adns: Collect DNS lookup timing metrics
Kim Alvefur <zash@zash.se>
parents: 13479
diff changeset
139 log_query("debug", "Results for %s %s %s: %s (%s)", qname, qclass, qtype, a.rcode == 0 and (#a .. " items") or a.status,
5abdcad8c2e0 net.adns: Collect DNS lookup timing metrics
Kim Alvefur <zash@zash.se>
parents: 13479
diff changeset
140 a.secure and "Secure" or a.bogus or "Insecure"); -- Insecure as in unsigned
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
141 else
11250
d1351683dfe5 net.unbound: Allow tracing individual queries with a logger per query
Kim Alvefur <zash@zash.se>
parents: 11249
diff changeset
142 log_query("error", "Results for %s %s %s: %s", qname, qclass, qtype, tostring(err));
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
143 end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
144 local ok, cerr = pcall(callback, a, err);
11250
d1351683dfe5 net.unbound: Allow tracing individual queries with a logger per query
Kim Alvefur <zash@zash.se>
parents: 11249
diff changeset
145 if not ok then log_query("error", "Error in callback: %s", cerr); end
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
146 end
11250
d1351683dfe5 net.unbound: Allow tracing individual queries with a logger per query
Kim Alvefur <zash@zash.se>
parents: 11249
diff changeset
147 log_query("debug", "Resolve %s %s %s", qname, qclass, qtype);
13659
5abdcad8c2e0 net.adns: Collect DNS lookup timing metrics
Kim Alvefur <zash@zash.se>
parents: 13479
diff changeset
148 m = measure(qclass, qtype);
14209
c4aa9b2b4787 net.unbound: Simplify by removing cancel()
Kim Alvefur <zash@zash.se>
parents: 14208
diff changeset
149 local ret, err = unbound:resolve_async(callback_wrapper, qname, ntype, nclass);
c4aa9b2b4787 net.unbound: Simplify by removing cancel()
Kim Alvefur <zash@zash.se>
parents: 14208
diff changeset
150 if not ret then
12510
cd3b5912c9a3 net.unbound: Adjust log level of error to error to error
Kim Alvefur <zash@zash.se>
parents: 12509
diff changeset
151 log_query("error", "Resolver error: %s", err);
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
152 end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
153 return ret, err;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
154 end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
155
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
156 local function lookup_sync(qname, qtype, qclass)
11302
6bb2986783d0 net.unbound: Fix to initialize under prosodyctl
Kim Alvefur <zash@zash.se>
parents: 11253
diff changeset
157 if not unbound then initialize(); end
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
158 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
159 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
160 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
161 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
162 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
163 return prep_answer(a);
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
164 end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
165
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
166 -- 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
167 local function purge()
14208
9c062f243d3a net.unbound: Let in-flight queries complete after re-initialization
Kim Alvefur <zash@zash.se>
parents: 14207
diff changeset
168 if server_conn then
9c062f243d3a net.unbound: Let in-flight queries complete after re-initialization
Kim Alvefur <zash@zash.se>
parents: 14207
diff changeset
169 local old_unbound, old_server_conn = unbound, server_conn;
9c062f243d3a net.unbound: Let in-flight queries complete after re-initialization
Kim Alvefur <zash@zash.se>
parents: 14207
diff changeset
170 timer.add_task(30, function()
9c062f243d3a net.unbound: Let in-flight queries complete after re-initialization
Kim Alvefur <zash@zash.se>
parents: 14207
diff changeset
171 old_server_conn:close();
14209
c4aa9b2b4787 net.unbound: Simplify by removing cancel()
Kim Alvefur <zash@zash.se>
parents: 14208
diff changeset
172 if old_unbound.cancelall then
c4aa9b2b4787 net.unbound: Simplify by removing cancel()
Kim Alvefur <zash@zash.se>
parents: 14208
diff changeset
173 old_unbound:cancelall();
c4aa9b2b4787 net.unbound: Simplify by removing cancel()
Kim Alvefur <zash@zash.se>
parents: 14208
diff changeset
174 end
14208
9c062f243d3a net.unbound: Let in-flight queries complete after re-initialization
Kim Alvefur <zash@zash.se>
parents: 14207
diff changeset
175 end)
9c062f243d3a net.unbound: Let in-flight queries complete after re-initialization
Kim Alvefur <zash@zash.se>
parents: 14207
diff changeset
176 end
11252
ba335004ca60 net.unbound: Move libunbound initialization into a function
Kim Alvefur <zash@zash.se>
parents: 11250
diff changeset
177 initialize();
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
178 return true;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
179 end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
180
14207
23f1c71b3d56 net.unbound: Reset and apply new config on reload
Kim Alvefur <zash@zash.se>
parents: 13659
diff changeset
181 if prosody then
14216
2ec517d8d43e net.unbound: Enable DNSSEC by default with option for turning off
Kim Alvefur <zash@zash.se>
parents: 14215
diff changeset
182 -- TODO move this glue logic into util.startup?
2ec517d8d43e net.unbound: Enable DNSSEC by default with option for turning off
Kim Alvefur <zash@zash.se>
parents: 14215
diff changeset
183 local config = require "prosody.core.configmanager";
2ec517d8d43e net.unbound: Enable DNSSEC by default with option for turning off
Kim Alvefur <zash@zash.se>
parents: 14215
diff changeset
184 unbound_config = add_defaults(config.get("*", "unbound"), config.get("*", "use_dnssec"));
14207
23f1c71b3d56 net.unbound: Reset and apply new config on reload
Kim Alvefur <zash@zash.se>
parents: 13659
diff changeset
185 prosody.events.add_handler("config-reloaded", function()
14216
2ec517d8d43e net.unbound: Enable DNSSEC by default with option for turning off
Kim Alvefur <zash@zash.se>
parents: 14215
diff changeset
186 unbound_config = add_defaults(config.get("*", "unbound"), config.get("*", "use_dnssec"));
14207
23f1c71b3d56 net.unbound: Reset and apply new config on reload
Kim Alvefur <zash@zash.se>
parents: 13659
diff changeset
187 purge();
23f1c71b3d56 net.unbound: Reset and apply new config on reload
Kim Alvefur <zash@zash.se>
parents: 13659
diff changeset
188 end);
23f1c71b3d56 net.unbound: Reset and apply new config on reload
Kim Alvefur <zash@zash.se>
parents: 13659
diff changeset
189 prosody.events.add_handler("server-started", initialize);
23f1c71b3d56 net.unbound: Reset and apply new config on reload
Kim Alvefur <zash@zash.se>
parents: 13659
diff changeset
190 end
23f1c71b3d56 net.unbound: Reset and apply new config on reload
Kim Alvefur <zash@zash.se>
parents: 13659
diff changeset
191
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
192 local function not_implemented()
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
193 error "not implemented";
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
194 end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
195 -- Public API
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
196 local _M = {
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
197 lookup = lookup;
14209
c4aa9b2b4787 net.unbound: Simplify by removing cancel()
Kim Alvefur <zash@zash.se>
parents: 14208
diff changeset
198 cancel = not_implemented;
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
199 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
200 dns = {
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
201 lookup = lookup_sync;
14209
c4aa9b2b4787 net.unbound: Simplify by removing cancel()
Kim Alvefur <zash@zash.se>
parents: 14208
diff changeset
202 cancel = not_implemented;
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
203 cache = noop;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
204 socket_wrapper_set = noop;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
205 settimeout = noop;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
206 query = noop;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
207 purge = purge;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
208 random = noop;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
209 peek = noop;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
210
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
211 types = types;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
212 classes = classes;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
213 };
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
214 };
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
215
10968
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10967
diff changeset
216 local function lookup_promise(_, qname, qtype, qclass)
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10967
diff changeset
217 return promise.new(function (resolve, reject)
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10967
diff changeset
218 local function callback(answer, err)
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10967
diff changeset
219 if err then
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10967
diff changeset
220 return reject(err);
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10967
diff changeset
221 else
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10967
diff changeset
222 return resolve(answer);
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
223 end
10968
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10967
diff changeset
224 end
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10967
diff changeset
225 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: 10967
diff changeset
226 if not ret then reject(err); end
23ae55cbbeaf net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents: 10967
diff changeset
227 end);
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
228 end
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
229
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
230 local wrapper = {
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
231 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
232 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
233 end;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
234 lookup_promise = lookup_promise;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
235 _resolver = {
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
236 settimeout = function () end;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
237 closeall = function () end;
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
238 };
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
239 }
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
240
13981
350e16e5f9aa net.unbound: Count number of DNS response records
Kim Alvefur <zash@zash.se>
parents: 13659
diff changeset
241 _M.instrument = function(measure_, count_) measure, count = measure_, count_; end;
13659
5abdcad8c2e0 net.adns: Collect DNS lookup timing metrics
Kim Alvefur <zash@zash.se>
parents: 13479
diff changeset
242
10962
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
243 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
244
92f30e8ecdfc net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff changeset
245 return _M;