Mercurial > prosody-hg
annotate net/unbound.lua @ 14210:41fa97090264
Merge 13.0->trunk
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 30 May 2026 19:22:51 +0200 |
| parents | 350e16e5f9aa c4aa9b2b4787 |
| children | 2719dbb358c8 |
| 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 |
|
12509
a92e1de62c9e
net.unbound: Disable use of hosts file by default (fixes #1737)
Kim Alvefur <zash@zash.se>
parents:
12110
diff
changeset
|
28 local builtin_defaults = { hoststxt = false } |
|
a92e1de62c9e
net.unbound: Disable use of hosts file by default (fixes #1737)
Kim Alvefur <zash@zash.se>
parents:
12110
diff
changeset
|
29 |
|
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 local function add_defaults(conf) |
|
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
|
31 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
|
32 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
|
33 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
|
34 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
|
35 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
|
36 end |
|
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
|
37 for option, default in pairs(libunbound.config) 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
|
38 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
|
39 conf[option] = default; |
|
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
40 end |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
41 end |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
42 return conf; |
|
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 |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
45 local unbound_config; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
46 -- 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
|
47 |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
48 local function connect_server(unbound, server) |
|
11248
a1aecd8cf7ee
net.unbound: Log net.server interactions
Kim Alvefur <zash@zash.se>
parents:
10968
diff
changeset
|
49 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
|
50 return server.watchfd(unbound, function () |
|
11248
a1aecd8cf7ee
net.unbound: Log net.server interactions
Kim Alvefur <zash@zash.se>
parents:
10968
diff
changeset
|
51 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
|
52 unbound:process() |
|
67aabf83230b
net.unbound: Strip support for legacy net.server APIs
Kim Alvefur <zash@zash.se>
parents:
10962
diff
changeset
|
53 end); |
|
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
54 end |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
55 |
|
11252
ba335004ca60
net.unbound: Move libunbound initialization into a function
Kim Alvefur <zash@zash.se>
parents:
11250
diff
changeset
|
56 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
|
57 |
|
11252
ba335004ca60
net.unbound: Move libunbound initialization into a function
Kim Alvefur <zash@zash.se>
parents:
11250
diff
changeset
|
58 local function initialize() |
|
ba335004ca60
net.unbound: Move libunbound initialization into a function
Kim Alvefur <zash@zash.se>
parents:
11250
diff
changeset
|
59 unbound = libunbound.new(unbound_config); |
|
ba335004ca60
net.unbound: Move libunbound initialization into a function
Kim Alvefur <zash@zash.se>
parents:
11250
diff
changeset
|
60 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
|
61 end |
|
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
62 |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
63 local answer_mt = { |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
64 __tostring = function(self) |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
65 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
|
66 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
|
67 if self.secure then |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
68 h = h .. ", Secure"; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
69 elseif self.bogus then |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
70 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
|
71 end |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
72 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
|
73 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
|
74 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
|
75 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
|
76 end |
|
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
77 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
|
78 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
|
79 end |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
80 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
|
81 self._string = _string; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
82 return _string; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
83 end; |
|
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 |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
86 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
|
87 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
|
88 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
|
89 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
|
90 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
|
91 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
|
92 |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
93 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
|
94 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
|
95 local parser = parsers[qtype]; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
96 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
|
97 if a.bogus then |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
98 -- Discard bogus data |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
99 a[i] = nil; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
100 else |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
101 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
|
102 end |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
103 end |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
104 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
|
105 end |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
106 |
|
13659
5abdcad8c2e0
net.adns: Collect DNS lookup timing metrics
Kim Alvefur <zash@zash.se>
parents:
13479
diff
changeset
|
107 local function measure(_qclass, _qtype) |
|
5abdcad8c2e0
net.adns: Collect DNS lookup timing metrics
Kim Alvefur <zash@zash.se>
parents:
13479
diff
changeset
|
108 return measure; |
|
5abdcad8c2e0
net.adns: Collect DNS lookup timing metrics
Kim Alvefur <zash@zash.se>
parents:
13479
diff
changeset
|
109 end |
|
5abdcad8c2e0
net.adns: Collect DNS lookup timing metrics
Kim Alvefur <zash@zash.se>
parents:
13479
diff
changeset
|
110 |
|
13981
350e16e5f9aa
net.unbound: Count number of DNS response records
Kim Alvefur <zash@zash.se>
parents:
13659
diff
changeset
|
111 local count = measure; |
|
350e16e5f9aa
net.unbound: Count number of DNS response records
Kim Alvefur <zash@zash.se>
parents:
13659
diff
changeset
|
112 |
|
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
113 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
|
114 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
|
115 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
|
116 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
|
117 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
|
118 |
|
5abdcad8c2e0
net.adns: Collect DNS lookup timing metrics
Kim Alvefur <zash@zash.se>
parents:
13479
diff
changeset
|
119 local m; |
|
11250
d1351683dfe5
net.unbound: Allow tracing individual queries with a logger per query
Kim Alvefur <zash@zash.se>
parents:
11249
diff
changeset
|
120 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
|
121 local function callback_wrapper(a, err) |
|
13659
5abdcad8c2e0
net.adns: Collect DNS lookup timing metrics
Kim Alvefur <zash@zash.se>
parents:
13479
diff
changeset
|
122 m(); |
|
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
123 if a then |
|
13981
350e16e5f9aa
net.unbound: Count number of DNS response records
Kim Alvefur <zash@zash.se>
parents:
13659
diff
changeset
|
124 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
|
125 prep_answer(a); |
|
13659
5abdcad8c2e0
net.adns: Collect DNS lookup timing metrics
Kim Alvefur <zash@zash.se>
parents:
13479
diff
changeset
|
126 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
|
127 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
|
128 else |
|
11250
d1351683dfe5
net.unbound: Allow tracing individual queries with a logger per query
Kim Alvefur <zash@zash.se>
parents:
11249
diff
changeset
|
129 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
|
130 end |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
131 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
|
132 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
|
133 end |
|
11250
d1351683dfe5
net.unbound: Allow tracing individual queries with a logger per query
Kim Alvefur <zash@zash.se>
parents:
11249
diff
changeset
|
134 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
|
135 m = measure(qclass, qtype); |
|
14209
c4aa9b2b4787
net.unbound: Simplify by removing cancel()
Kim Alvefur <zash@zash.se>
parents:
14208
diff
changeset
|
136 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
|
137 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
|
138 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
|
139 end |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
140 return ret, err; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
141 end |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
142 |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
143 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
|
144 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
|
145 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
|
146 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
|
147 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
|
148 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
|
149 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
|
150 return prep_answer(a); |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
151 end |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
152 |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
153 -- 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
|
154 local function purge() |
|
14208
9c062f243d3a
net.unbound: Let in-flight queries complete after re-initialization
Kim Alvefur <zash@zash.se>
parents:
14207
diff
changeset
|
155 if server_conn then |
|
9c062f243d3a
net.unbound: Let in-flight queries complete after re-initialization
Kim Alvefur <zash@zash.se>
parents:
14207
diff
changeset
|
156 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
|
157 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
|
158 old_server_conn:close(); |
|
14209
c4aa9b2b4787
net.unbound: Simplify by removing cancel()
Kim Alvefur <zash@zash.se>
parents:
14208
diff
changeset
|
159 if old_unbound.cancelall then |
|
c4aa9b2b4787
net.unbound: Simplify by removing cancel()
Kim Alvefur <zash@zash.se>
parents:
14208
diff
changeset
|
160 old_unbound:cancelall(); |
|
c4aa9b2b4787
net.unbound: Simplify by removing cancel()
Kim Alvefur <zash@zash.se>
parents:
14208
diff
changeset
|
161 end |
|
14208
9c062f243d3a
net.unbound: Let in-flight queries complete after re-initialization
Kim Alvefur <zash@zash.se>
parents:
14207
diff
changeset
|
162 end) |
|
9c062f243d3a
net.unbound: Let in-flight queries complete after re-initialization
Kim Alvefur <zash@zash.se>
parents:
14207
diff
changeset
|
163 end |
|
11252
ba335004ca60
net.unbound: Move libunbound initialization into a function
Kim Alvefur <zash@zash.se>
parents:
11250
diff
changeset
|
164 initialize(); |
|
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
165 return true; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
166 end |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
167 |
|
14207
23f1c71b3d56
net.unbound: Reset and apply new config on reload
Kim Alvefur <zash@zash.se>
parents:
13659
diff
changeset
|
168 if prosody then |
|
23f1c71b3d56
net.unbound: Reset and apply new config on reload
Kim Alvefur <zash@zash.se>
parents:
13659
diff
changeset
|
169 local config = require"prosody.core.configmanager"; |
|
23f1c71b3d56
net.unbound: Reset and apply new config on reload
Kim Alvefur <zash@zash.se>
parents:
13659
diff
changeset
|
170 unbound_config = add_defaults(config.get("*", "unbound")); |
|
23f1c71b3d56
net.unbound: Reset and apply new config on reload
Kim Alvefur <zash@zash.se>
parents:
13659
diff
changeset
|
171 prosody.events.add_handler("config-reloaded", function() |
|
23f1c71b3d56
net.unbound: Reset and apply new config on reload
Kim Alvefur <zash@zash.se>
parents:
13659
diff
changeset
|
172 unbound_config = add_defaults(config.get("*", "unbound")); |
|
23f1c71b3d56
net.unbound: Reset and apply new config on reload
Kim Alvefur <zash@zash.se>
parents:
13659
diff
changeset
|
173 purge(); |
|
23f1c71b3d56
net.unbound: Reset and apply new config on reload
Kim Alvefur <zash@zash.se>
parents:
13659
diff
changeset
|
174 end); |
|
23f1c71b3d56
net.unbound: Reset and apply new config on reload
Kim Alvefur <zash@zash.se>
parents:
13659
diff
changeset
|
175 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
|
176 end |
|
23f1c71b3d56
net.unbound: Reset and apply new config on reload
Kim Alvefur <zash@zash.se>
parents:
13659
diff
changeset
|
177 |
|
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
178 local function not_implemented() |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
179 error "not implemented"; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
180 end |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
181 -- Public API |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
182 local _M = { |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
183 lookup = lookup; |
|
14209
c4aa9b2b4787
net.unbound: Simplify by removing cancel()
Kim Alvefur <zash@zash.se>
parents:
14208
diff
changeset
|
184 cancel = not_implemented; |
|
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
185 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
|
186 dns = { |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
187 lookup = lookup_sync; |
|
14209
c4aa9b2b4787
net.unbound: Simplify by removing cancel()
Kim Alvefur <zash@zash.se>
parents:
14208
diff
changeset
|
188 cancel = not_implemented; |
|
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
189 cache = noop; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
190 socket_wrapper_set = noop; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
191 settimeout = noop; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
192 query = noop; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
193 purge = purge; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
194 random = noop; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
195 peek = noop; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
196 |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
197 types = types; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
198 classes = classes; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
199 }; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
200 }; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
201 |
|
10968
23ae55cbbeaf
net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents:
10967
diff
changeset
|
202 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
|
203 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
|
204 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
|
205 if err then |
|
23ae55cbbeaf
net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents:
10967
diff
changeset
|
206 return reject(err); |
|
23ae55cbbeaf
net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents:
10967
diff
changeset
|
207 else |
|
23ae55cbbeaf
net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents:
10967
diff
changeset
|
208 return resolve(answer); |
|
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
209 end |
|
10968
23ae55cbbeaf
net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents:
10967
diff
changeset
|
210 end |
|
23ae55cbbeaf
net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents:
10967
diff
changeset
|
211 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
|
212 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
|
213 end); |
|
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
214 end |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
215 |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
216 local wrapper = { |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
217 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
|
218 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
|
219 end; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
220 lookup_promise = lookup_promise; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
221 _resolver = { |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
222 settimeout = function () end; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
223 closeall = function () end; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
224 }; |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
225 } |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
226 |
|
13981
350e16e5f9aa
net.unbound: Count number of DNS response records
Kim Alvefur <zash@zash.se>
parents:
13659
diff
changeset
|
227 _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
|
228 |
|
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
229 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
|
230 |
|
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
231 return _M; |
