11 local s_format = string.format; |
11 local s_format = string.format; |
12 local s_lower = string.lower; |
12 local s_lower = string.lower; |
13 local s_upper = string.upper; |
13 local s_upper = string.upper; |
14 local noop = function() end; |
14 local noop = function() end; |
15 |
15 |
16 local log = require "util.logger".init("unbound"); |
16 local logger = require "util.logger"; |
|
17 local log = logger.init("unbound"); |
17 local net_server = require "net.server"; |
18 local net_server = require "net.server"; |
18 local libunbound = require"lunbound"; |
19 local libunbound = require"lunbound"; |
19 local promise = require"util.promise"; |
20 local promise = require"util.promise"; |
|
21 local new_id = require "util.id".medium; |
20 |
22 |
21 local gettime = require"socket".gettime; |
23 local gettime = require"socket".gettime; |
22 local dns_utils = require"util.dns"; |
24 local dns_utils = require"util.dns"; |
23 local classes, types, errors = dns_utils.classes, dns_utils.types, dns_utils.errors; |
25 local classes, types, errors = dns_utils.classes, dns_utils.types, dns_utils.errors; |
24 local parsers = dns_utils.parsers; |
26 local parsers = dns_utils.parsers; |
102 qtype = qtype and s_upper(qtype) or "A"; |
104 qtype = qtype and s_upper(qtype) or "A"; |
103 qclass = qclass and s_upper(qclass) or "IN"; |
105 qclass = qclass and s_upper(qclass) or "IN"; |
104 local ntype, nclass = types[qtype], classes[qclass]; |
106 local ntype, nclass = types[qtype], classes[qclass]; |
105 local startedat = gettime(); |
107 local startedat = gettime(); |
106 local ret; |
108 local ret; |
|
109 local log_query = logger.init("unbound.query"..new_id()); |
107 local function callback_wrapper(a, err) |
110 local function callback_wrapper(a, err) |
108 local gotdataat = gettime(); |
111 local gotdataat = gettime(); |
109 waiting_queries[ret] = nil; |
112 waiting_queries[ret] = nil; |
110 if a then |
113 if a then |
111 prep_answer(a); |
114 prep_answer(a); |
112 log("debug", "Results for %s %s %s: %s (%s, %f sec)", qname, qclass, qtype, a.rcode == 0 and (#a .. " items") or a.status, |
115 log_query("debug", "Results for %s %s %s: %s (%s, %f sec)", qname, qclass, qtype, a.rcode == 0 and (#a .. " items") or a.status, |
113 a.secure and "Secure" or a.bogus or "Insecure", gotdataat - startedat); -- Insecure as in unsigned |
116 a.secure and "Secure" or a.bogus or "Insecure", gotdataat - startedat); -- Insecure as in unsigned |
114 else |
117 else |
115 log("error", "Results for %s %s %s: %s", qname, qclass, qtype, tostring(err)); |
118 log_query("error", "Results for %s %s %s: %s", qname, qclass, qtype, tostring(err)); |
116 end |
119 end |
117 local ok, cerr = pcall(callback, a, err); |
120 local ok, cerr = pcall(callback, a, err); |
118 if not ok then log("error", "Error in callback: %s", cerr); end |
121 if not ok then log_query("error", "Error in callback: %s", cerr); end |
119 end |
122 end |
120 log("debug", "Resolve %s %s %s", qname, qclass, qtype); |
123 log_query("debug", "Resolve %s %s %s", qname, qclass, qtype); |
121 local err; |
124 local err; |
122 ret, err = unbound:resolve_async(callback_wrapper, qname, ntype, nclass); |
125 ret, err = unbound:resolve_async(callback_wrapper, qname, ntype, nclass); |
123 if ret then |
126 if ret then |
124 waiting_queries[ret] = callback; |
127 waiting_queries[ret] = callback; |
125 else |
128 else |
126 log("warn", "Resolver error: %s", err); |
129 log_query("warn", "Resolver error: %s", err); |
127 end |
130 end |
128 return ret, err; |
131 return ret, err; |
129 end |
132 end |
130 |
133 |
131 local function lookup_sync(qname, qtype, qclass) |
134 local function lookup_sync(qname, qtype, qclass) |