Software /
code /
prosody
Annotate
net/adns.lua @ 2646:064efb684aff
mod_saslauth: Correct syntax for gracefully handling a missing cyrussasl library
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Mon, 15 Feb 2010 22:56:15 +0000 |
parent | 2578:61e5eff54415 |
child | 2652:cbc58fc170ad |
rev | line source |
---|---|
1522
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1208
diff
changeset
|
1 -- Prosody IM |
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1208
diff
changeset
|
2 -- Copyright (C) 2008-2009 Matthew Wild |
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1208
diff
changeset
|
3 -- Copyright (C) 2008-2009 Waqas Hussain |
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1208
diff
changeset
|
4 -- |
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1208
diff
changeset
|
5 -- This project is MIT/X11 licensed. Please see the |
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1208
diff
changeset
|
6 -- COPYING file in the source package for more information. |
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1208
diff
changeset
|
7 -- |
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1208
diff
changeset
|
8 |
870
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 local server = require "net.server"; |
871
642af1bdf74e
net.adns: Load the correct dns lib
Matthew Wild <mwild1@gmail.com>
parents:
870
diff
changeset
|
10 local dns = require "net.dns"; |
870
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 |
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 local log = require "util.logger".init("adns"); |
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 |
1787
c4dff34f3d32
net.adns: Utilise new net.dns API to handle DNS network errors
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
14 local t_insert, t_remove = table.insert, table.remove; |
973
b091a1a7273b
net.adns: Catch errors in DNS response callbacks
Matthew Wild <mwild1@gmail.com>
parents:
886
diff
changeset
|
15 local coroutine, tostring, pcall = coroutine, tostring, pcall; |
870
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 |
2558
0a65fc0c7bee
net.adns: Use different flavour of voodoo to make UDP sockets work smoothly with libevent (no packet merging)
Matthew Wild <mwild1@gmail.com>
parents:
2556
diff
changeset
|
17 local function dummy_send(sock, data, i, j) return (j-i)+1; end |
0a65fc0c7bee
net.adns: Use different flavour of voodoo to make UDP sockets work smoothly with libevent (no packet merging)
Matthew Wild <mwild1@gmail.com>
parents:
2556
diff
changeset
|
18 |
870
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 module "adns" |
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 |
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 function lookup(handler, qname, qtype, qclass) |
1005
0eed5db7758d
net.adns: Call handler for records already cached
Matthew Wild <mwild1@gmail.com>
parents:
980
diff
changeset
|
22 return coroutine.wrap(function (peek) |
0eed5db7758d
net.adns: Call handler for records already cached
Matthew Wild <mwild1@gmail.com>
parents:
980
diff
changeset
|
23 if peek then |
0eed5db7758d
net.adns: Call handler for records already cached
Matthew Wild <mwild1@gmail.com>
parents:
980
diff
changeset
|
24 log("debug", "Records for %s already cached, using those...", qname); |
0eed5db7758d
net.adns: Call handler for records already cached
Matthew Wild <mwild1@gmail.com>
parents:
980
diff
changeset
|
25 handler(peek); |
0eed5db7758d
net.adns: Call handler for records already cached
Matthew Wild <mwild1@gmail.com>
parents:
980
diff
changeset
|
26 return; |
0eed5db7758d
net.adns: Call handler for records already cached
Matthew Wild <mwild1@gmail.com>
parents:
980
diff
changeset
|
27 end |
0eed5db7758d
net.adns: Call handler for records already cached
Matthew Wild <mwild1@gmail.com>
parents:
980
diff
changeset
|
28 log("debug", "Records for %s not in cache, sending query (%s)...", qname, tostring(coroutine.running())); |
870
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 dns.query(qname, qtype, qclass); |
1203
23725bfdeed5
net.adns: Add support for cancelling a non-blocking lookup, optionally calling the handler
Matthew Wild <mwild1@gmail.com>
parents:
1005
diff
changeset
|
30 coroutine.yield({ qclass or "IN", qtype or "A", qname, coroutine.running()}); -- Wait for reply |
1005
0eed5db7758d
net.adns: Call handler for records already cached
Matthew Wild <mwild1@gmail.com>
parents:
980
diff
changeset
|
31 log("debug", "Reply for %s (%s)", qname, tostring(coroutine.running())); |
973
b091a1a7273b
net.adns: Catch errors in DNS response callbacks
Matthew Wild <mwild1@gmail.com>
parents:
886
diff
changeset
|
32 local ok, err = pcall(handler, dns.peek(qname, qtype, qclass)); |
b091a1a7273b
net.adns: Catch errors in DNS response callbacks
Matthew Wild <mwild1@gmail.com>
parents:
886
diff
changeset
|
33 if not ok then |
1901
3c52b949e472
net.adns: Bump log-level of DNS handler errors to, er, 'error'
Matthew Wild <mwild1@gmail.com>
parents:
1788
diff
changeset
|
34 log("error", "Error in DNS response handler: %s", tostring(err)); |
973
b091a1a7273b
net.adns: Catch errors in DNS response callbacks
Matthew Wild <mwild1@gmail.com>
parents:
886
diff
changeset
|
35 end |
1005
0eed5db7758d
net.adns: Call handler for records already cached
Matthew Wild <mwild1@gmail.com>
parents:
980
diff
changeset
|
36 end)(dns.peek(qname, qtype, qclass)); |
870
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 end |
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 |
1203
23725bfdeed5
net.adns: Add support for cancelling a non-blocking lookup, optionally calling the handler
Matthew Wild <mwild1@gmail.com>
parents:
1005
diff
changeset
|
39 function cancel(handle, call_handler) |
1208
5f992ddc9685
Add log message when DNS lookup is cancelled
Matthew Wild <mwild1@gmail.com>
parents:
1207
diff
changeset
|
40 log("warn", "Cancelling DNS lookup for %s", tostring(handle[3])); |
1203
23725bfdeed5
net.adns: Add support for cancelling a non-blocking lookup, optionally calling the handler
Matthew Wild <mwild1@gmail.com>
parents:
1005
diff
changeset
|
41 dns.cancel(handle); |
23725bfdeed5
net.adns: Add support for cancelling a non-blocking lookup, optionally calling the handler
Matthew Wild <mwild1@gmail.com>
parents:
1005
diff
changeset
|
42 if call_handler then |
1207
6842bacddfcb
net.adns: Fix for calling handler when cancelling DNS lookup
Matthew Wild <mwild1@gmail.com>
parents:
1203
diff
changeset
|
43 coroutine.resume(handle[4]); |
1203
23725bfdeed5
net.adns: Add support for cancelling a non-blocking lookup, optionally calling the handler
Matthew Wild <mwild1@gmail.com>
parents:
1005
diff
changeset
|
44 end |
23725bfdeed5
net.adns: Add support for cancelling a non-blocking lookup, optionally calling the handler
Matthew Wild <mwild1@gmail.com>
parents:
1005
diff
changeset
|
45 end |
23725bfdeed5
net.adns: Add support for cancelling a non-blocking lookup, optionally calling the handler
Matthew Wild <mwild1@gmail.com>
parents:
1005
diff
changeset
|
46 |
1787
c4dff34f3d32
net.adns: Utilise new net.dns API to handle DNS network errors
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
47 function new_async_socket(sock, resolver) |
2232
aa8db84ae69d
net.adns: Some cleanup, happens to also make it compatible with libevent
Matthew Wild <mwild1@gmail.com>
parents:
2128
diff
changeset
|
48 local peername = "<unknown>"; |
870
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 local listener = {}; |
2232
aa8db84ae69d
net.adns: Some cleanup, happens to also make it compatible with libevent
Matthew Wild <mwild1@gmail.com>
parents:
2128
diff
changeset
|
50 local handler = {}; |
2128
f107f0205793
net.adns: Update for new net.server API (doesn't work with libevent yet)
Matthew Wild <mwild1@gmail.com>
parents:
1901
diff
changeset
|
51 function listener.onincoming(conn, data) |
2232
aa8db84ae69d
net.adns: Some cleanup, happens to also make it compatible with libevent
Matthew Wild <mwild1@gmail.com>
parents:
2128
diff
changeset
|
52 dns.feed(handler, data); |
870
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 end |
2128
f107f0205793
net.adns: Update for new net.server API (doesn't work with libevent yet)
Matthew Wild <mwild1@gmail.com>
parents:
1901
diff
changeset
|
54 function listener.ondisconnect(conn, err) |
1787
c4dff34f3d32
net.adns: Utilise new net.dns API to handle DNS network errors
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
55 log("warn", "DNS socket for %s disconnected: %s", peername, err); |
c4dff34f3d32
net.adns: Utilise new net.dns API to handle DNS network errors
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
56 local servers = resolver.server; |
2232
aa8db84ae69d
net.adns: Some cleanup, happens to also make it compatible with libevent
Matthew Wild <mwild1@gmail.com>
parents:
2128
diff
changeset
|
57 if resolver.socketset[conn] == resolver.best_server and resolver.best_server == #servers then |
1787
c4dff34f3d32
net.adns: Utilise new net.dns API to handle DNS network errors
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
58 log("error", "Exhausted all %d configured DNS servers, next lookup will try %s again", #servers, servers[1]); |
c4dff34f3d32
net.adns: Utilise new net.dns API to handle DNS network errors
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
59 end |
c4dff34f3d32
net.adns: Utilise new net.dns API to handle DNS network errors
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
60 |
c4dff34f3d32
net.adns: Utilise new net.dns API to handle DNS network errors
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
61 resolver:servfail(conn); -- Let the magic commence |
870
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 end |
2232
aa8db84ae69d
net.adns: Some cleanup, happens to also make it compatible with libevent
Matthew Wild <mwild1@gmail.com>
parents:
2128
diff
changeset
|
63 handler = server.wrapclient(sock, "dns", 53, listener); |
aa8db84ae69d
net.adns: Some cleanup, happens to also make it compatible with libevent
Matthew Wild <mwild1@gmail.com>
parents:
2128
diff
changeset
|
64 if not handler then |
1787
c4dff34f3d32
net.adns: Utilise new net.dns API to handle DNS network errors
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
65 log("warn", "handler is nil"); |
c4dff34f3d32
net.adns: Utilise new net.dns API to handle DNS network errors
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
66 end |
2232
aa8db84ae69d
net.adns: Some cleanup, happens to also make it compatible with libevent
Matthew Wild <mwild1@gmail.com>
parents:
2128
diff
changeset
|
67 |
aa8db84ae69d
net.adns: Some cleanup, happens to also make it compatible with libevent
Matthew Wild <mwild1@gmail.com>
parents:
2128
diff
changeset
|
68 handler.settimeout = function () end |
aa8db84ae69d
net.adns: Some cleanup, happens to also make it compatible with libevent
Matthew Wild <mwild1@gmail.com>
parents:
2128
diff
changeset
|
69 handler.setsockname = function (_, ...) return sock:setsockname(...); end |
2558
0a65fc0c7bee
net.adns: Use different flavour of voodoo to make UDP sockets work smoothly with libevent (no packet merging)
Matthew Wild <mwild1@gmail.com>
parents:
2556
diff
changeset
|
70 handler.setpeername = function (_, ...) peername = (...); local ret = sock:setpeername(...); _:set_send(dummy_send); return ret; end |
2556
50d1ba86a959
net.adns: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents:
2232
diff
changeset
|
71 handler.connect = function (_, ...) return sock:connect(...) end |
2558
0a65fc0c7bee
net.adns: Use different flavour of voodoo to make UDP sockets work smoothly with libevent (no packet merging)
Matthew Wild <mwild1@gmail.com>
parents:
2556
diff
changeset
|
72 --handler.send = function (_, data) _:write(data); return _.sendbuffer and _.sendbuffer(); end |
0a65fc0c7bee
net.adns: Use different flavour of voodoo to make UDP sockets work smoothly with libevent (no packet merging)
Matthew Wild <mwild1@gmail.com>
parents:
2556
diff
changeset
|
73 handler.send = function (_, data) return sock:send(data); end |
2232
aa8db84ae69d
net.adns: Some cleanup, happens to also make it compatible with libevent
Matthew Wild <mwild1@gmail.com>
parents:
2128
diff
changeset
|
74 return handler; |
870
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
75 end |
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
76 |
2578
61e5eff54415
net.dns, net.adns: Changed dns:socket_wrapper_set to dns.socket_wrapper_set for consistency.
Waqas Hussain <waqas20@gmail.com>
parents:
2558
diff
changeset
|
77 dns.socket_wrapper_set(new_async_socket); |
872 | 78 |
79 return _M; |