Software /
code /
prosody
Annotate
net/unbound.lua @ 11972:520ce76440ad
net.server_epoll: Prevent loop attempting to send last data after close
If the connection is closed by the peer, any buffered data is given a
last chance to be sent (see f27b9319e0da). If the connection is Really
closed, no attempt to write will occur, instead epoll will raise the
error flag and :onreadable() will be invoked again, where it will try to
:close() again for the same reason, thus looping until the connection
somehow gets destroyed.
By clearing the _connected flag, the second time it passes :onreadable()
it should go directly to :destroy(), breaking the loop.
Thanks Link Mauve for reporting
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Tue, 30 Nov 2021 18:19:40 +0100 |
parent | 11302:6bb2986783d0 |
child | 12110:b5b799a2a10c |
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 |
11250
d1351683dfe5
net.unbound: Allow tracing individual queries with a logger per query
Kim Alvefur <zash@zash.se>
parents:
11249
diff
changeset
|
16 local logger = require "util.logger"; |
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"); |
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 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
|
19 local libunbound = require"lunbound"; |
10968
23ae55cbbeaf
net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents:
10967
diff
changeset
|
20 local promise = require"util.promise"; |
11250
d1351683dfe5
net.unbound: Allow tracing individual queries with a logger per query
Kim Alvefur <zash@zash.se>
parents:
11249
diff
changeset
|
21 local new_id = require "util.id".medium; |
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 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
|
24 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
|
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 |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
28 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
|
29 if conf then |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 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
|
31 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
|
32 conf[option] = default; |
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 end |
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 return conf; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
37 end |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
38 |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
39 local unbound_config; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
40 if prosody then |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
41 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
|
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 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
|
44 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
|
45 end); |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
46 end |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
47 -- 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
|
48 |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 local function connect_server(unbound, server) |
11248
a1aecd8cf7ee
net.unbound: Log net.server interactions
Kim Alvefur <zash@zash.se>
parents:
10968
diff
changeset
|
50 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
|
51 return server.watchfd(unbound, function () |
11248
a1aecd8cf7ee
net.unbound: Log net.server interactions
Kim Alvefur <zash@zash.se>
parents:
10968
diff
changeset
|
52 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
|
53 unbound:process() |
67aabf83230b
net.unbound: Strip support for legacy net.server APIs
Kim Alvefur <zash@zash.se>
parents:
10962
diff
changeset
|
54 end); |
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
55 end |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
56 |
11252
ba335004ca60
net.unbound: Move libunbound initialization into a function
Kim Alvefur <zash@zash.se>
parents:
11250
diff
changeset
|
57 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
|
58 |
11252
ba335004ca60
net.unbound: Move libunbound initialization into a function
Kim Alvefur <zash@zash.se>
parents:
11250
diff
changeset
|
59 local function initialize() |
ba335004ca60
net.unbound: Move libunbound initialization into a function
Kim Alvefur <zash@zash.se>
parents:
11250
diff
changeset
|
60 unbound = libunbound.new(unbound_config); |
ba335004ca60
net.unbound: Move libunbound initialization into a function
Kim Alvefur <zash@zash.se>
parents:
11250
diff
changeset
|
61 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
|
62 end |
11253
919e7b962f0b
net.unbound: Delay loading until server has started or first query
Kim Alvefur <zash@zash.se>
parents:
11252
diff
changeset
|
63 if prosody then |
919e7b962f0b
net.unbound: Delay loading until server has started or first query
Kim Alvefur <zash@zash.se>
parents:
11252
diff
changeset
|
64 prosody.events.add_handler("server-started", initialize); |
919e7b962f0b
net.unbound: Delay loading until server has started or first query
Kim Alvefur <zash@zash.se>
parents:
11252
diff
changeset
|
65 end |
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
66 |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
67 local answer_mt = { |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
68 __tostring = function(self) |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
69 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
|
70 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
|
71 if self.secure then |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
72 h = h .. ", Secure"; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
73 elseif self.bogus then |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
74 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
|
75 end |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
76 local t = { h }; |
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 |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
78 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
|
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 waiting_queries = {}; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
87 |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
88 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
|
89 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
|
90 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
|
91 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
|
92 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
|
93 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
|
94 |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
95 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
|
96 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
|
97 local parser = parsers[qtype]; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
98 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
|
99 if a.bogus then |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
100 -- Discard bogus data |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
101 a[i] = nil; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
102 else |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
103 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
|
104 end |
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 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
|
107 end |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
108 |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
109 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
|
110 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
|
111 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
|
112 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
|
113 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
|
114 local startedat = gettime(); |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
115 local ret; |
11250
d1351683dfe5
net.unbound: Allow tracing individual queries with a logger per query
Kim Alvefur <zash@zash.se>
parents:
11249
diff
changeset
|
116 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
|
117 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
|
118 local gotdataat = gettime(); |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
119 waiting_queries[ret] = nil; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
120 if a then |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
121 prep_answer(a); |
11250
d1351683dfe5
net.unbound: Allow tracing individual queries with a logger per query
Kim Alvefur <zash@zash.se>
parents:
11249
diff
changeset
|
122 log_query("debug", "Results for %s %s %s: %s (%s, %f sec)", qname, qclass, qtype, a.rcode == 0 and (#a .. " items") or a.status, |
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
123 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
|
124 else |
11250
d1351683dfe5
net.unbound: Allow tracing individual queries with a logger per query
Kim Alvefur <zash@zash.se>
parents:
11249
diff
changeset
|
125 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
|
126 end |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
127 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
|
128 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
|
129 end |
11250
d1351683dfe5
net.unbound: Allow tracing individual queries with a logger per query
Kim Alvefur <zash@zash.se>
parents:
11249
diff
changeset
|
130 log_query("debug", "Resolve %s %s %s", qname, qclass, qtype); |
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
131 local err; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
132 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
|
133 if ret then |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
134 waiting_queries[ret] = callback; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
135 else |
11250
d1351683dfe5
net.unbound: Allow tracing individual queries with a logger per query
Kim Alvefur <zash@zash.se>
parents:
11249
diff
changeset
|
136 log_query("warn", "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
|
137 end |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
138 return ret, err; |
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 |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
141 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
|
142 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
|
143 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
|
144 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
|
145 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
|
146 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
|
147 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
|
148 return prep_answer(a); |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
149 end |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
150 |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
151 local function cancel(id) |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
152 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
|
153 unbound:cancel(id); |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
154 if cb then |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
155 cb(nil, "canceled"); |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
156 waiting_queries[id] = nil; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
157 end |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
158 return true; |
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 |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
161 -- 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
|
162 local function purge() |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
163 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
|
164 if server_conn then server_conn:close(); end |
11252
ba335004ca60
net.unbound: Move libunbound initialization into a function
Kim Alvefur <zash@zash.se>
parents:
11250
diff
changeset
|
165 initialize(); |
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
166 return true; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
167 end |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
168 |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
169 local function not_implemented() |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
170 error "not implemented"; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
171 end |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
172 -- Public API |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
173 local _M = { |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
174 lookup = lookup; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
175 cancel = cancel; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
176 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
|
177 dns = { |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
178 lookup = lookup_sync; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
179 cancel = cancel; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
180 cache = noop; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
181 socket_wrapper_set = noop; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
182 settimeout = noop; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
183 query = noop; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
184 purge = purge; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
185 random = noop; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
186 peek = noop; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
187 |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
188 types = types; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
189 classes = classes; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
190 }; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
191 }; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
192 |
10968
23ae55cbbeaf
net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents:
10967
diff
changeset
|
193 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
|
194 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
|
195 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
|
196 if err then |
23ae55cbbeaf
net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents:
10967
diff
changeset
|
197 return reject(err); |
23ae55cbbeaf
net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents:
10967
diff
changeset
|
198 else |
23ae55cbbeaf
net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents:
10967
diff
changeset
|
199 return resolve(answer); |
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
200 end |
10968
23ae55cbbeaf
net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents:
10967
diff
changeset
|
201 end |
23ae55cbbeaf
net.unbound: Remove compat for missing promises (pre-0.11)
Kim Alvefur <zash@zash.se>
parents:
10967
diff
changeset
|
202 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
|
203 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
|
204 end); |
10962
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
205 end |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
206 |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
207 local wrapper = { |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
208 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
|
209 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
|
210 end; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
211 lookup_promise = lookup_promise; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
212 _resolver = { |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
213 settimeout = function () end; |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
214 closeall = function () 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 } |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
217 |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
218 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
|
219 |
92f30e8ecdfc
net.unbound: Async DNS resolver library based on libunbound via luaunbound
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
220 return _M; |