author | aidan@jmad.org |
Wed, 03 Apr 2024 21:56:03 -0700 | |
changeset 13477 | 9eb081616842 |
parent 12978 | ba409c67353b |
permissions | -rw-r--r-- |
1523
841d61be198f
Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents:
1202
diff
changeset
|
1 |
-- Prosody IM |
615 | 2 |
-- This file is included with Prosody IM. It has modifications, |
3 |
-- which are hereby placed in the public domain. |
|
337 | 4 |
|
5 |
||
6 |
-- todo: quick (default) header generation |
|
7 |
-- todo: nxdomain, error handling |
|
8 |
-- todo: cache results of encodeName |
|
9 |
||
10 |
||
12608
bd9e006a7a74
various: Update IETF RFC URLs for tools.ietf.org transition
Kim Alvefur <zash@zash.se>
parents:
12391
diff
changeset
|
11 |
-- reference: https://www.rfc-editor.org/rfc/rfc1035.html |
bd9e006a7a74
various: Update IETF RFC URLs for tools.ietf.org transition
Kim Alvefur <zash@zash.se>
parents:
12391
diff
changeset
|
12 |
-- reference: https://www.rfc-editor.org/rfc/rfc1876.html (LOC) |
337 | 13 |
|
14 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
15 |
local socket = require "socket"; |
12978
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12608
diff
changeset
|
16 |
local have_timer, timer = pcall(require, "prosody.util.timer"); |
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12608
diff
changeset
|
17 |
local new_ip = require "prosody.util.ip".new_ip; |
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12608
diff
changeset
|
18 |
local have_util_net, util_net = pcall(require, "prosody.util.net"); |
3324
070c8ba71b76
net.dns: Handle our own timeouts, including falling onto other servers in resolv.conf if necessary
Matthew Wild <mwild1@gmail.com>
parents:
3057
diff
changeset
|
19 |
|
12978
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12608
diff
changeset
|
20 |
local log = require "prosody.util.logger".init("dns"); |
10959
7bcfac630b65
net.dns: Add some debug logging
Matthew Wild <mwild1@gmail.com>
parents:
10668
diff
changeset
|
21 |
|
12978
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12608
diff
changeset
|
22 |
local _, windows = pcall(require, "prosody.util.windows"); |
2067
0ed6369605bf
net.dns: Updated to use util.windows.get_nameservers for enumerating nameservers on Windows.
Waqas Hussain <waqas20@gmail.com>
parents:
2027
diff
changeset
|
23 |
local is_windows = (_ and windows) or os.getenv("WINDIR"); |
337 | 24 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
25 |
local coroutine, io, math, string, table = |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
26 |
coroutine, io, math, string, table; |
337 | 27 |
|
7530
936b78e9f399
net.dns: remove unused variable unpack [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents:
7503
diff
changeset
|
28 |
local ipairs, next, pairs, print, setmetatable, tostring, assert, error, select, type = |
936b78e9f399
net.dns: remove unused variable unpack [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents:
7503
diff
changeset
|
29 |
ipairs, next, pairs, print, setmetatable, tostring, assert, error, select, type; |
3719
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
30 |
|
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
31 |
local ztact = { -- public domain 20080404 lua@ztact.com |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
32 |
get = function(parent, ...) |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
33 |
local len = select('#', ...); |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
34 |
for i=1,len do |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
35 |
parent = parent[select(i, ...)]; |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
36 |
if parent == nil then break; end |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
37 |
end |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
38 |
return parent; |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
39 |
end; |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
40 |
set = function(parent, ...) |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
41 |
local len = select('#', ...); |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
42 |
local key, value = select(len-1, ...); |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
43 |
local cutpoint, cutkey; |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
44 |
|
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
45 |
for i=1,len-2 do |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
46 |
local key = select (i, ...) |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
47 |
local child = parent[key] |
337 | 48 |
|
3719
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
49 |
if value == nil then |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
50 |
if child == nil then |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
51 |
return; |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
52 |
elseif next(child, next(child)) then |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
53 |
cutpoint = nil; cutkey = nil; |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
54 |
elseif cutpoint == nil then |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
55 |
cutpoint = parent; cutkey = key; |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
56 |
end |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
57 |
elseif child == nil then |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
58 |
child = {}; |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
59 |
parent[key] = child; |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
60 |
end |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
61 |
parent = child |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
62 |
end |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
63 |
|
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
64 |
if value == nil and cutpoint then |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
65 |
cutpoint[cutkey] = nil; |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
66 |
else |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
67 |
parent[key] = value; |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
68 |
return value; |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
69 |
end |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
70 |
end; |
0f87632b87e9
net.dns: Removed dependency on util.ztact by moving ztact.get/set in.
Waqas Hussain <waqas20@gmail.com>
parents:
3544
diff
changeset
|
71 |
}; |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
72 |
local get, set = ztact.get, ztact.set; |
337 | 73 |
|
10963
877ceb4feb6d
net.dns: Reduce default timeout to 5s
Matthew Wild <mwild1@gmail.com>
parents:
10962
diff
changeset
|
74 |
local default_timeout = 5; |
10961
8902cecbdd39
net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents:
10960
diff
changeset
|
75 |
local default_jitter = 1; |
8902cecbdd39
net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents:
10960
diff
changeset
|
76 |
local default_retry_jitter = 2; |
337 | 77 |
|
78 |
-------------------------------------------------- module dns |
|
6783
647adfd8f738
net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6756
diff
changeset
|
79 |
local _ENV = nil; |
8558
4f0f5b49bb03
vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents:
8443
diff
changeset
|
80 |
-- luacheck: std none |
6783
647adfd8f738
net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6756
diff
changeset
|
81 |
local dns = {}; |
337 | 82 |
|
83 |
||
84 |
-- dns type & class codes ------------------------------ dns type & class codes |
|
85 |
||
86 |
||
87 |
local append = table.insert |
|
88 |
||
89 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
90 |
local function highbyte(i) -- - - - - - - - - - - - - - - - - - - highbyte |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
91 |
return (i-(i%0x100))/0x100; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
92 |
end |
337 | 93 |
|
94 |
||
8911
144666d0ad2f
net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents:
8910
diff
changeset
|
95 |
local function augment (t, prefix) -- - - - - - - - - - - - - - - - - augment |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
96 |
local a = {}; |
8910
b7b960d30eef
Backed out changeset eae606b9266c: Used a lot of memory
Kim Alvefur <zash@zash.se>
parents:
8904
diff
changeset
|
97 |
for i,s in pairs(t) do |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
98 |
a[i] = s; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
99 |
a[s] = s; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
100 |
a[string.lower(s)] = s; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
101 |
end |
8911
144666d0ad2f
net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents:
8910
diff
changeset
|
102 |
setmetatable(a, { |
144666d0ad2f
net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents:
8910
diff
changeset
|
103 |
__index = function (_, i) |
144666d0ad2f
net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents:
8910
diff
changeset
|
104 |
if type(i) == "number" then |
144666d0ad2f
net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents:
8910
diff
changeset
|
105 |
return ("%s%d"):format(prefix, i); |
144666d0ad2f
net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents:
8910
diff
changeset
|
106 |
elseif type(i) == "string" then |
144666d0ad2f
net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents:
8910
diff
changeset
|
107 |
return i:upper(); |
144666d0ad2f
net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents:
8910
diff
changeset
|
108 |
end |
144666d0ad2f
net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents:
8910
diff
changeset
|
109 |
end; |
144666d0ad2f
net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents:
8910
diff
changeset
|
110 |
}) |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
111 |
return a; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
112 |
end |
337 | 113 |
|
114 |
||
115 |
local function encode (t) -- - - - - - - - - - - - - - - - - - - - - encode |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
116 |
local code = {}; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
117 |
for i,s in pairs(t) do |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
118 |
local word = string.char(highbyte(i), i%0x100); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
119 |
code[i] = word; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
120 |
code[s] = word; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
121 |
code[string.lower(s)] = word; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
122 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
123 |
return code; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
124 |
end |
337 | 125 |
|
126 |
||
127 |
dns.types = { |
|
8906
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
128 |
[1] = "A", -- a host address,[RFC1035],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
129 |
[2] = "NS", -- an authoritative name server,[RFC1035],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
130 |
[3] = "MD", -- a mail destination (OBSOLETE - use MX),[RFC1035],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
131 |
[4] = "MF", -- a mail forwarder (OBSOLETE - use MX),[RFC1035],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
132 |
[5] = "CNAME", -- the canonical name for an alias,[RFC1035],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
133 |
[6] = "SOA", -- marks the start of a zone of authority,[RFC1035],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
134 |
[7] = "MB", -- a mailbox domain name (EXPERIMENTAL),[RFC1035],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
135 |
[8] = "MG", -- a mail group member (EXPERIMENTAL),[RFC1035],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
136 |
[9] = "MR", -- a mail rename domain name (EXPERIMENTAL),[RFC1035],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
137 |
[10] = "NULL", -- a null RR (EXPERIMENTAL),[RFC1035],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
138 |
[11] = "WKS", -- a well known service description,[RFC1035],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
139 |
[12] = "PTR", -- a domain name pointer,[RFC1035],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
140 |
[13] = "HINFO", -- host information,[RFC1035],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
141 |
[14] = "MINFO", -- mailbox or mail list information,[RFC1035],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
142 |
[15] = "MX", -- mail exchange,[RFC1035],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
143 |
[16] = "TXT", -- text strings,[RFC1035],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
144 |
[17] = "RP", -- for Responsible Person,[RFC1183],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
145 |
[18] = "AFSDB", -- for AFS Data Base location,[RFC1183][RFC5864],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
146 |
[19] = "X25", -- for X.25 PSDN address,[RFC1183],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
147 |
[20] = "ISDN", -- for ISDN address,[RFC1183],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
148 |
[21] = "RT", -- for Route Through,[RFC1183],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
149 |
[22] = "NSAP", -- "for NSAP address, NSAP style A record",[RFC1706],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
150 |
[23] = "NSAP-PTR", -- "for domain name pointer, NSAP style",[RFC1348][RFC1637][RFC1706],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
151 |
[24] = "SIG", -- for security signature,[RFC4034][RFC3755][RFC2535][RFC2536][RFC2537][RFC2931][RFC3110][RFC3008],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
152 |
[25] = "KEY", -- for security key,[RFC4034][RFC3755][RFC2535][RFC2536][RFC2537][RFC2539][RFC3008][RFC3110],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
153 |
[26] = "PX", -- X.400 mail mapping information,[RFC2163],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
154 |
[27] = "GPOS", -- Geographical Position,[RFC1712],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
155 |
[28] = "AAAA", -- IP6 Address,[RFC3596],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
156 |
[29] = "LOC", -- Location Information,[RFC1876],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
157 |
[30] = "NXT", -- Next Domain (OBSOLETE),[RFC3755][RFC2535],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
158 |
[31] = "EID", -- Endpoint Identifier,[Michael_Patton][http://ana-3.lcs.mit.edu/~jnc/nimrod/dns.txt],,1995-06 |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
159 |
[32] = "NIMLOC", -- Nimrod Locator,[1][Michael_Patton][http://ana-3.lcs.mit.edu/~jnc/nimrod/dns.txt],,1995-06 |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
160 |
[33] = "SRV", -- Server Selection,[1][RFC2782],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
161 |
[34] = "ATMA", -- ATM Address,"[ ATM Forum Technical Committee, ""ATM Name System, V2.0"", Doc ID: AF-DANS-0152.000, July 2000. Available from and held in escrow by IANA.]",, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
162 |
[35] = "NAPTR", -- Naming Authority Pointer,[RFC2915][RFC2168][RFC3403],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
163 |
[36] = "KX", -- Key Exchanger,[RFC2230],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
164 |
[37] = "CERT", -- CERT,[RFC4398],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
165 |
[38] = "A6", -- A6 (OBSOLETE - use AAAA),[RFC3226][RFC2874][RFC6563],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
166 |
[39] = "DNAME", -- DNAME,[RFC6672],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
167 |
[40] = "SINK", -- SINK,[Donald_E_Eastlake][http://tools.ietf.org/html/draft-eastlake-kitchen-sink],,1997-11 |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
168 |
[41] = "OPT", -- OPT,[RFC6891][RFC3225],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
169 |
[42] = "APL", -- APL,[RFC3123],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
170 |
[43] = "DS", -- Delegation Signer,[RFC4034][RFC3658],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
171 |
[44] = "SSHFP", -- SSH Key Fingerprint,[RFC4255],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
172 |
[45] = "IPSECKEY", -- IPSECKEY,[RFC4025],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
173 |
[46] = "RRSIG", -- RRSIG,[RFC4034][RFC3755],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
174 |
[47] = "NSEC", -- NSEC,[RFC4034][RFC3755],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
175 |
[48] = "DNSKEY", -- DNSKEY,[RFC4034][RFC3755],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
176 |
[49] = "DHCID", -- DHCID,[RFC4701],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
177 |
[50] = "NSEC3", -- NSEC3,[RFC5155],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
178 |
[51] = "NSEC3PARAM", -- NSEC3PARAM,[RFC5155],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
179 |
[52] = "TLSA", -- TLSA,[RFC6698],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
180 |
[53] = "SMIMEA", -- S/MIME cert association,[RFC8162],SMIMEA/smimea-completed-template,2015-12-01 |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
181 |
-- [54] = "Unassigned", -- ,,, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
182 |
[55] = "HIP", -- Host Identity Protocol,[RFC8005],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
183 |
[56] = "NINFO", -- NINFO,[Jim_Reid],NINFO/ninfo-completed-template,2008-01-21 |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
184 |
[57] = "RKEY", -- RKEY,[Jim_Reid],RKEY/rkey-completed-template,2008-01-21 |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
185 |
[58] = "TALINK", -- Trust Anchor LINK,[Wouter_Wijngaards],TALINK/talink-completed-template,2010-02-17 |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
186 |
[59] = "CDS", -- Child DS,[RFC7344],CDS/cds-completed-template,2011-06-06 |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
187 |
[60] = "CDNSKEY", -- DNSKEY(s) the Child wants reflected in DS,[RFC7344],,2014-06-16 |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
188 |
[61] = "OPENPGPKEY", -- OpenPGP Key,[RFC7929],OPENPGPKEY/openpgpkey-completed-template,2014-08-12 |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
189 |
[62] = "CSYNC", -- Child-To-Parent Synchronization,[RFC7477],,2015-01-27 |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
190 |
-- [63 .. 98] = "Unassigned", -- ,,, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
191 |
[99] = "SPF", -- ,[RFC7208],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
192 |
[100] = "UINFO", -- ,[IANA-Reserved],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
193 |
[101] = "UID", -- ,[IANA-Reserved],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
194 |
[102] = "GID", -- ,[IANA-Reserved],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
195 |
[103] = "UNSPEC", -- ,[IANA-Reserved],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
196 |
[104] = "NID", -- ,[RFC6742],ILNP/nid-completed-template, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
197 |
[105] = "L32", -- ,[RFC6742],ILNP/l32-completed-template, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
198 |
[106] = "L64", -- ,[RFC6742],ILNP/l64-completed-template, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
199 |
[107] = "LP", -- ,[RFC6742],ILNP/lp-completed-template, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
200 |
[108] = "EUI48", -- an EUI-48 address,[RFC7043],EUI48/eui48-completed-template,2013-03-27 |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
201 |
[109] = "EUI64", -- an EUI-64 address,[RFC7043],EUI64/eui64-completed-template,2013-03-27 |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
202 |
-- [110 .. 248] = "Unassigned", -- ,,, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
203 |
[249] = "TKEY", -- Transaction Key,[RFC2930],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
204 |
[250] = "TSIG", -- Transaction Signature,[RFC2845],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
205 |
[251] = "IXFR", -- incremental transfer,[RFC1995],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
206 |
[252] = "AXFR", -- transfer of an entire zone,[RFC1035][RFC5936],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
207 |
[253] = "MAILB", -- "mailbox-related RRs (MB, MG or MR)",[RFC1035],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
208 |
[254] = "MAILA", -- mail agent RRs (OBSOLETE - see MX),[RFC1035],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
209 |
[255] = "*", -- A request for all records the server/cache has available,[RFC1035][RFC6895],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
210 |
[256] = "URI", -- URI,[RFC7553],URI/uri-completed-template,2011-02-22 |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
211 |
[257] = "CAA", -- Certification Authority Restriction,[RFC6844],CAA/caa-completed-template,2011-04-07 |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
212 |
[258] = "AVC", -- Application Visibility and Control,[Wolfgang_Riedel],AVC/avc-completed-template,2016-02-26 |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
213 |
[259] = "DOA", -- Digital Object Architecture,[draft-durand-doa-over-dns],DOA/doa-completed-template,2017-08-30 |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
214 |
-- [260 .. 32767] = "Unassigned", -- ,,, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
215 |
[32768] = "TA", -- DNSSEC Trust Authorities,"[Sam_Weiler][http://cameo.library.cmu.edu/][ Deploying DNSSEC Without a Signed Root. Technical Report 1999-19, Information Networking Institute, Carnegie Mellon University, April 2004.]",,2005-12-13 |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
216 |
[32769] = "DLV", -- DNSSEC Lookaside Validation,[RFC4431],, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
217 |
-- [32770 .. 65279] = "Unassigned", -- ,,, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
218 |
-- [65280 .. 65534] = "Private use", -- ,,, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
219 |
-- [65535] = "Reserved", -- ,,, |
c5d5dfaa8d38
net.dns: Expand table of known RR types from IANA registry
Kim Alvefur <zash@zash.se>
parents:
8905
diff
changeset
|
220 |
} |
337 | 221 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
222 |
dns.classes = { 'IN', 'CS', 'CH', 'HS', [255] = '*' }; |
337 | 223 |
|
224 |
||
8911
144666d0ad2f
net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents:
8910
diff
changeset
|
225 |
dns.type = augment (dns.types, "TYPE"); |
144666d0ad2f
net.dns: Lazily generate unknown RR type names
Kim Alvefur <zash@zash.se>
parents:
8910
diff
changeset
|
226 |
dns.class = augment (dns.classes, "CLASS"); |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
227 |
dns.typecode = encode (dns.types); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
228 |
dns.classcode = encode (dns.classes); |
337 | 229 |
|
230 |
||
231 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
232 |
local function standardize(qname, qtype, qclass) -- - - - - - - standardize |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
233 |
if string.byte(qname, -1) ~= 0x2E then qname = qname..'.'; end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
234 |
qname = string.lower(qname); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
235 |
return qname, dns.type[qtype or 'A'], dns.class[qclass or 'IN']; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
236 |
end |
337 | 237 |
|
238 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
239 |
local function prune(rrs, time, soft) -- - - - - - - - - - - - - - - prune |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
240 |
time = time or socket.gettime(); |
6466
460584257cc9
net.dns: Avoid duplicate cache entries
Florian Zeitz <florob@babelmonkeys.de>
parents:
6310
diff
changeset
|
241 |
for i,rr in ipairs(rrs) do |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
242 |
if rr.tod then |
8154
2c65f8be38aa
net.dns: Simplify expiry calculation (fixes #919)
Kim Alvefur <zash@zash.se>
parents:
7096
diff
changeset
|
243 |
if rr.tod < time then |
6466
460584257cc9
net.dns: Avoid duplicate cache entries
Florian Zeitz <florob@babelmonkeys.de>
parents:
6310
diff
changeset
|
244 |
rrs[rr[rr.type:lower()]] = nil; |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
245 |
table.remove(rrs, i); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
246 |
return prune(rrs, time, soft); -- Re-iterate |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
247 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
248 |
elseif soft == 'soft' then -- What is this? I forget! |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
249 |
assert(rr.ttl == 0); |
6466
460584257cc9
net.dns: Avoid duplicate cache entries
Florian Zeitz <florob@babelmonkeys.de>
parents:
6310
diff
changeset
|
250 |
rrs[rr[rr.type:lower()]] = nil; |
460584257cc9
net.dns: Avoid duplicate cache entries
Florian Zeitz <florob@babelmonkeys.de>
parents:
6310
diff
changeset
|
251 |
table.remove(rrs, i); |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
252 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
253 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
254 |
end |
337 | 255 |
|
256 |
||
257 |
-- metatables & co. ------------------------------------------ metatables & co. |
|
258 |
||
259 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
260 |
local resolver = {}; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
261 |
resolver.__index = resolver; |
337 | 262 |
|
3327
b447682f2a8d
net.dns: Make timeout configurable (default 15s)
Matthew Wild <mwild1@gmail.com>
parents:
3326
diff
changeset
|
263 |
resolver.timeout = default_timeout; |
337 | 264 |
|
3747
7d5b135bf268
net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents:
3746
diff
changeset
|
265 |
local function default_rr_tostring(rr) |
7d5b135bf268
net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents:
3746
diff
changeset
|
266 |
local rr_val = rr.type and rr[rr.type:lower()]; |
7d5b135bf268
net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents:
3746
diff
changeset
|
267 |
if type(rr_val) ~= "string" then |
7d5b135bf268
net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents:
3746
diff
changeset
|
268 |
return "<UNKNOWN RDATA TYPE>"; |
7d5b135bf268
net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents:
3746
diff
changeset
|
269 |
end |
7d5b135bf268
net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents:
3746
diff
changeset
|
270 |
return rr_val; |
7d5b135bf268
net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents:
3746
diff
changeset
|
271 |
end |
7d5b135bf268
net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents:
3746
diff
changeset
|
272 |
|
7d5b135bf268
net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents:
3746
diff
changeset
|
273 |
local special_tostrings = { |
7d5b135bf268
net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents:
3746
diff
changeset
|
274 |
LOC = resolver.LOC_tostring; |
4125
5cf13260edec
net.dns: Fix tostring() for SRV records
Matthew Wild <mwild1@gmail.com>
parents:
3955
diff
changeset
|
275 |
MX = function (rr) |
5cf13260edec
net.dns: Fix tostring() for SRV records
Matthew Wild <mwild1@gmail.com>
parents:
3955
diff
changeset
|
276 |
return string.format('%2i %s', rr.pref, rr.mx); |
5cf13260edec
net.dns: Fix tostring() for SRV records
Matthew Wild <mwild1@gmail.com>
parents:
3955
diff
changeset
|
277 |
end; |
5cf13260edec
net.dns: Fix tostring() for SRV records
Matthew Wild <mwild1@gmail.com>
parents:
3955
diff
changeset
|
278 |
SRV = function (rr) |
5cf13260edec
net.dns: Fix tostring() for SRV records
Matthew Wild <mwild1@gmail.com>
parents:
3955
diff
changeset
|
279 |
local s = rr.srv; |
5cf13260edec
net.dns: Fix tostring() for SRV records
Matthew Wild <mwild1@gmail.com>
parents:
3955
diff
changeset
|
280 |
return string.format('%5d %5d %5d %s', s.priority, s.weight, s.port, s.target); |
5cf13260edec
net.dns: Fix tostring() for SRV records
Matthew Wild <mwild1@gmail.com>
parents:
3955
diff
changeset
|
281 |
end; |
3747
7d5b135bf268
net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents:
3746
diff
changeset
|
282 |
}; |
337 | 283 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
284 |
local rr_metatable = {}; -- - - - - - - - - - - - - - - - - - - rr_metatable |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
285 |
function rr_metatable.__tostring(rr) |
3747
7d5b135bf268
net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents:
3746
diff
changeset
|
286 |
local rr_string = (special_tostrings[rr.type] or default_rr_tostring)(rr); |
7d5b135bf268
net.dns: Clean up tostring() of returned records, as a result PTR records can now be tostring()'d
Matthew Wild <mwild1@gmail.com>
parents:
3746
diff
changeset
|
287 |
return string.format('%2s %-5s %6i %-28s %s', rr.class, rr.type, rr.ttl, rr.name, rr_string); |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
288 |
end |
337 | 289 |
|
290 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
291 |
local rrs_metatable = {}; -- - - - - - - - - - - - - - - - - - rrs_metatable |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
292 |
function rrs_metatable.__tostring(rrs) |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
293 |
local t = {}; |
7472
363e4a5e9b0a
net.dns: remove unused one-letter loop variables [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents:
7325
diff
changeset
|
294 |
for _, rr in ipairs(rrs) do |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
295 |
append(t, tostring(rr)..'\n'); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
296 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
297 |
return table.concat(t); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
298 |
end |
337 | 299 |
|
300 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
301 |
local cache_metatable = {}; -- - - - - - - - - - - - - - - - cache_metatable |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
302 |
function cache_metatable.__tostring(cache) |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
303 |
local time = socket.gettime(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
304 |
local t = {}; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
305 |
for class,types in pairs(cache) do |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
306 |
for type,names in pairs(types) do |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
307 |
for name,rrs in pairs(names) do |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
308 |
prune(rrs, time); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
309 |
append(t, tostring(rrs)); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
310 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
311 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
312 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
313 |
return table.concat(t); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
314 |
end |
337 | 315 |
|
316 |
||
317 |
-- packet layer -------------------------------------------------- packet layer |
|
318 |
||
319 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
320 |
function dns.random(...) -- - - - - - - - - - - - - - - - - - - dns.random |
6648
4f934cf03bc9
net.dns: Make sure argument to math.randomseed does not overflow a 32 bit *signed* int (blame Lua). Closes #439
Kim Alvefur <zash@zash.se>
parents:
6634
diff
changeset
|
321 |
math.randomseed(math.floor(10000*socket.gettime()) % 0x80000000); |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
322 |
dns.random = math.random; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
323 |
return dns.random(...); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
324 |
end |
337 | 325 |
|
326 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
327 |
local function encodeHeader(o) -- - - - - - - - - - - - - - - encodeHeader |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
328 |
o = o or {}; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
329 |
o.id = o.id or dns.random(0, 0xffff); -- 16b (random) id |
337 | 330 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
331 |
o.rd = o.rd or 1; -- 1b 1 recursion desired |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
332 |
o.tc = o.tc or 0; -- 1b 1 truncated response |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
333 |
o.aa = o.aa or 0; -- 1b 1 authoritative response |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
334 |
o.opcode = o.opcode or 0; -- 4b 0 query |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
335 |
-- 1 inverse query |
337 | 336 |
-- 2 server status request |
337 |
-- 3-15 reserved |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
338 |
o.qr = o.qr or 0; -- 1b 0 query, 1 response |
337 | 339 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
340 |
o.rcode = o.rcode or 0; -- 4b 0 no error |
337 | 341 |
-- 1 format error |
342 |
-- 2 server failure |
|
343 |
-- 3 name error |
|
344 |
-- 4 not implemented |
|
345 |
-- 5 refused |
|
346 |
-- 6-15 reserved |
|
12391
05c250fa335a
Spelling: Fix various spelling mistakes (thanks timeless)
Kim Alvefur <zash@zash.se>
parents:
10980
diff
changeset
|
347 |
o.z = o.z or 0; -- 3b 0 reserved |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
348 |
o.ra = o.ra or 0; -- 1b 1 recursion available |
337 | 349 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
350 |
o.qdcount = o.qdcount or 1; -- 16b number of question RRs |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
351 |
o.ancount = o.ancount or 0; -- 16b number of answers RRs |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
352 |
o.nscount = o.nscount or 0; -- 16b number of nameservers RRs |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
353 |
o.arcount = o.arcount or 0; -- 16b number of additional RRs |
337 | 354 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
355 |
-- string.char() rounds, so prevent roundup with -0.4999 |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
356 |
local header = string.char( |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
357 |
highbyte(o.id), o.id %0x100, |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
358 |
o.rd + 2*o.tc + 4*o.aa + 8*o.opcode + 128*o.qr, |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
359 |
o.rcode + 16*o.z + 128*o.ra, |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
360 |
highbyte(o.qdcount), o.qdcount %0x100, |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
361 |
highbyte(o.ancount), o.ancount %0x100, |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
362 |
highbyte(o.nscount), o.nscount %0x100, |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
363 |
highbyte(o.arcount), o.arcount %0x100 |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
364 |
); |
337 | 365 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
366 |
return header, o.id; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
367 |
end |
337 | 368 |
|
369 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
370 |
local function encodeName(name) -- - - - - - - - - - - - - - - - encodeName |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
371 |
local t = {}; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
372 |
for part in string.gmatch(name, '[^.]+') do |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
373 |
append(t, string.char(string.len(part))); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
374 |
append(t, part); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
375 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
376 |
append(t, string.char(0)); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
377 |
return table.concat(t); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
378 |
end |
337 | 379 |
|
380 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
381 |
local function encodeQuestion(qname, qtype, qclass) -- - - - encodeQuestion |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
382 |
qname = encodeName(qname); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
383 |
qtype = dns.typecode[qtype or 'a']; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
384 |
qclass = dns.classcode[qclass or 'in']; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
385 |
return qname..qtype..qclass; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
386 |
end |
337 | 387 |
|
388 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
389 |
function resolver:byte(len) -- - - - - - - - - - - - - - - - - - - - - byte |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
390 |
len = len or 1; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
391 |
local offset = self.offset; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
392 |
local last = offset + len - 1; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
393 |
if last > #self.packet then |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
394 |
error(string.format('out of bounds: %i>%i', last, #self.packet)); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
395 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
396 |
self.offset = offset + len; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
397 |
return string.byte(self.packet, offset, last); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
398 |
end |
337 | 399 |
|
400 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
401 |
function resolver:word() -- - - - - - - - - - - - - - - - - - - - - - word |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
402 |
local b1, b2 = self:byte(2); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
403 |
return 0x100*b1 + b2; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
404 |
end |
337 | 405 |
|
406 |
||
407 |
function resolver:dword () -- - - - - - - - - - - - - - - - - - - - - dword |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
408 |
local b1, b2, b3, b4 = self:byte(4); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
409 |
--print('dword', b1, b2, b3, b4); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
410 |
return 0x1000000*b1 + 0x10000*b2 + 0x100*b3 + b4; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
411 |
end |
337 | 412 |
|
413 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
414 |
function resolver:sub(len) -- - - - - - - - - - - - - - - - - - - - - - sub |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
415 |
len = len or 1; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
416 |
local s = string.sub(self.packet, self.offset, self.offset + len - 1); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
417 |
self.offset = self.offset + len; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
418 |
return s; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
419 |
end |
337 | 420 |
|
421 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
422 |
function resolver:header(force) -- - - - - - - - - - - - - - - - - - header |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
423 |
local id = self:word(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
424 |
--print(string.format(':header id %x', id)); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
425 |
if not self.active[id] and not force then return nil; end |
337 | 426 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
427 |
local h = { id = id }; |
337 | 428 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
429 |
local b1, b2 = self:byte(2); |
337 | 430 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
431 |
h.rd = b1 %2; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
432 |
h.tc = b1 /2%2; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
433 |
h.aa = b1 /4%2; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
434 |
h.opcode = b1 /8%16; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
435 |
h.qr = b1 /128; |
337 | 436 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
437 |
h.rcode = b2 %16; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
438 |
h.z = b2 /16%8; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
439 |
h.ra = b2 /128; |
337 | 440 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
441 |
h.qdcount = self:word(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
442 |
h.ancount = self:word(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
443 |
h.nscount = self:word(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
444 |
h.arcount = self:word(); |
337 | 445 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
446 |
for k,v in pairs(h) do h[k] = v-v%1; end |
337 | 447 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
448 |
return h; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
449 |
end |
337 | 450 |
|
451 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
452 |
function resolver:name() -- - - - - - - - - - - - - - - - - - - - - - name |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
453 |
local remember, pointers = nil, 0; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
454 |
local len = self:byte(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
455 |
local n = {}; |
4425
c25dee24623f
s2smanager, net.dns: Fix handling for NXNAME and SRV target of "."
Florian Zeitz <florob@babelmonkeys.de>
parents:
4400
diff
changeset
|
456 |
if len == 0 then return "." end -- Root label |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
457 |
while len > 0 do |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
458 |
if len >= 0xc0 then -- name is "compressed" |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
459 |
pointers = pointers + 1; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
460 |
if pointers >= 20 then error('dns error: 20 pointers'); end; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
461 |
local offset = ((len-0xc0)*0x100) + self:byte(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
462 |
remember = remember or self.offset; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
463 |
self.offset = offset + 1; -- +1 for lua |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
464 |
else -- name is not compressed |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
465 |
append(n, self:sub(len)..'.'); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
466 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
467 |
len = self:byte(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
468 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
469 |
self.offset = remember or self.offset; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
470 |
return table.concat(n); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
471 |
end |
337 | 472 |
|
473 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
474 |
function resolver:question() -- - - - - - - - - - - - - - - - - - question |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
475 |
local q = {}; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
476 |
q.name = self:name(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
477 |
q.type = dns.type[self:word()]; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
478 |
q.class = dns.class[self:word()]; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
479 |
return q; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
480 |
end |
337 | 481 |
|
482 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
483 |
function resolver:A(rr) -- - - - - - - - - - - - - - - - - - - - - - - - A |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
484 |
local b1, b2, b3, b4 = self:byte(4); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
485 |
rr.a = string.format('%i.%i.%i.%i', b1, b2, b3, b4); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
486 |
end |
337 | 487 |
|
8430
1371518f70ff
net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents:
8266
diff
changeset
|
488 |
if have_util_net and util_net.ntop then |
1371518f70ff
net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents:
8266
diff
changeset
|
489 |
function resolver:A(rr) |
1371518f70ff
net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents:
8266
diff
changeset
|
490 |
rr.a = util_net.ntop(self:sub(4)); |
1371518f70ff
net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents:
8266
diff
changeset
|
491 |
end |
1371518f70ff
net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents:
8266
diff
changeset
|
492 |
end |
1371518f70ff
net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents:
8266
diff
changeset
|
493 |
|
4267
29d7eb6ff62c
net.dns: Support for resolving AAAA records
Matthew Wild <mwild1@gmail.com>
parents:
4251
diff
changeset
|
494 |
function resolver:AAAA(rr) |
29d7eb6ff62c
net.dns: Support for resolving AAAA records
Matthew Wild <mwild1@gmail.com>
parents:
4251
diff
changeset
|
495 |
local addr = {}; |
7503
4c519444d4a2
net.dns: remove unused one-letter loop variables [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents:
7483
diff
changeset
|
496 |
for _ = 1, rr.rdlength, 2 do |
4267
29d7eb6ff62c
net.dns: Support for resolving AAAA records
Matthew Wild <mwild1@gmail.com>
parents:
4251
diff
changeset
|
497 |
local b1, b2 = self:byte(2); |
29d7eb6ff62c
net.dns: Support for resolving AAAA records
Matthew Wild <mwild1@gmail.com>
parents:
4251
diff
changeset
|
498 |
table.insert(addr, ("%02x%02x"):format(b1, b2)); |
29d7eb6ff62c
net.dns: Support for resolving AAAA records
Matthew Wild <mwild1@gmail.com>
parents:
4251
diff
changeset
|
499 |
end |
4373 | 500 |
addr = table.concat(addr, ":"):gsub("%f[%x]0+(%x)","%1"); |
501 |
local zeros = {}; |
|
8424
3d21c63ec03f
net.dns: Don't compress a single zero group in IPv6 addresses to match behaviour of inet_ntop
Kim Alvefur <zash@zash.se>
parents:
8266
diff
changeset
|
502 |
for item in addr:gmatch(":[0:]+:[0:]+:") do |
4373 | 503 |
table.insert(zeros, item) |
504 |
end |
|
505 |
if #zeros == 0 then |
|
506 |
rr.aaaa = addr; |
|
507 |
return |
|
508 |
elseif #zeros > 1 then |
|
509 |
table.sort(zeros, function(a, b) return #a > #b end); |
|
510 |
end |
|
511 |
rr.aaaa = addr:gsub(zeros[1], "::", 1):gsub("^0::", "::"):gsub("::0$", "::"); |
|
4267
29d7eb6ff62c
net.dns: Support for resolving AAAA records
Matthew Wild <mwild1@gmail.com>
parents:
4251
diff
changeset
|
512 |
end |
337 | 513 |
|
8430
1371518f70ff
net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents:
8266
diff
changeset
|
514 |
if have_util_net and util_net.ntop then |
1371518f70ff
net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents:
8266
diff
changeset
|
515 |
function resolver:AAAA(rr) |
1371518f70ff
net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents:
8266
diff
changeset
|
516 |
rr.aaaa = util_net.ntop(self:sub(16)); |
1371518f70ff
net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents:
8266
diff
changeset
|
517 |
end |
1371518f70ff
net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents:
8266
diff
changeset
|
518 |
end |
1371518f70ff
net.dns: Use inet_ntop from util.net if available
Kim Alvefur <zash@zash.se>
parents:
8266
diff
changeset
|
519 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
520 |
function resolver:CNAME(rr) -- - - - - - - - - - - - - - - - - - - - CNAME |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
521 |
rr.cname = self:name(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
522 |
end |
337 | 523 |
|
524 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
525 |
function resolver:MX(rr) -- - - - - - - - - - - - - - - - - - - - - - - MX |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
526 |
rr.pref = self:word(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
527 |
rr.mx = self:name(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
528 |
end |
337 | 529 |
|
530 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
531 |
function resolver:LOC_nibble_power() -- - - - - - - - - - LOC_nibble_power |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
532 |
local b = self:byte(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
533 |
--print('nibbles', ((b-(b%0x10))/0x10), (b%0x10)); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
534 |
return ((b-(b%0x10))/0x10) * (10^(b%0x10)); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
535 |
end |
337 | 536 |
|
537 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
538 |
function resolver:LOC(rr) -- - - - - - - - - - - - - - - - - - - - - - LOC |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
539 |
rr.version = self:byte(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
540 |
if rr.version == 0 then |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
541 |
rr.loc = rr.loc or {}; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
542 |
rr.loc.size = self:LOC_nibble_power(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
543 |
rr.loc.horiz_pre = self:LOC_nibble_power(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
544 |
rr.loc.vert_pre = self:LOC_nibble_power(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
545 |
rr.loc.latitude = self:dword(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
546 |
rr.loc.longitude = self:dword(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
547 |
rr.loc.altitude = self:dword(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
548 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
549 |
end |
337 | 550 |
|
551 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
552 |
local function LOC_tostring_degrees(f, pos, neg) -- - - - - - - - - - - - - |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
553 |
f = f - 0x80000000; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
554 |
if f < 0 then pos = neg; f = -f; end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
555 |
local deg, min, msec; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
556 |
msec = f%60000; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
557 |
f = (f-msec)/60000; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
558 |
min = f%60; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
559 |
deg = (f-min)/60; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
560 |
return string.format('%3d %2d %2.3f %s', deg, min, msec/1000, pos); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
561 |
end |
337 | 562 |
|
563 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
564 |
function resolver.LOC_tostring(rr) -- - - - - - - - - - - - - LOC_tostring |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
565 |
local t = {}; |
337 | 566 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
567 |
--[[ |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
568 |
for k,name in pairs { 'size', 'horiz_pre', 'vert_pre', 'latitude', 'longitude', 'altitude' } do |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
569 |
append(t, string.format('%4s%-10s: %12.0f\n', '', name, rr.loc[name])); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
570 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
571 |
--]] |
337 | 572 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
573 |
append(t, string.format( |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
574 |
'%s %s %.2fm %.2fm %.2fm %.2fm', |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
575 |
LOC_tostring_degrees (rr.loc.latitude, 'N', 'S'), |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
576 |
LOC_tostring_degrees (rr.loc.longitude, 'E', 'W'), |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
577 |
(rr.loc.altitude - 10000000) / 100, |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
578 |
rr.loc.size / 100, |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
579 |
rr.loc.horiz_pre / 100, |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
580 |
rr.loc.vert_pre / 100 |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
581 |
)); |
337 | 582 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
583 |
return table.concat(t); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
584 |
end |
337 | 585 |
|
586 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
587 |
function resolver:NS(rr) -- - - - - - - - - - - - - - - - - - - - - - - NS |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
588 |
rr.ns = self:name(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
589 |
end |
337 | 590 |
|
591 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
592 |
function resolver:SOA(rr) -- - - - - - - - - - - - - - - - - - - - - - SOA |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
593 |
end |
337 | 594 |
|
595 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
596 |
function resolver:SRV(rr) -- - - - - - - - - - - - - - - - - - - - - - SRV |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
597 |
rr.srv = {}; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
598 |
rr.srv.priority = self:word(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
599 |
rr.srv.weight = self:word(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
600 |
rr.srv.port = self:word(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
601 |
rr.srv.target = self:name(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
602 |
end |
337 | 603 |
|
3513
4cf5962747fc
net.dns: Support for parsing PTR records
Matthew Wild <mwild1@gmail.com>
parents:
3512
diff
changeset
|
604 |
function resolver:PTR(rr) |
4cf5962747fc
net.dns: Support for parsing PTR records
Matthew Wild <mwild1@gmail.com>
parents:
3512
diff
changeset
|
605 |
rr.ptr = self:name(); |
4cf5962747fc
net.dns: Support for parsing PTR records
Matthew Wild <mwild1@gmail.com>
parents:
3512
diff
changeset
|
606 |
end |
337 | 607 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
608 |
function resolver:TXT(rr) -- - - - - - - - - - - - - - - - - - - - - - TXT |
4251 | 609 |
rr.txt = self:sub (self:byte()); |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
610 |
end |
337 | 611 |
|
612 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
613 |
function resolver:rr() -- - - - - - - - - - - - - - - - - - - - - - - - rr |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
614 |
local rr = {}; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
615 |
setmetatable(rr, rr_metatable); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
616 |
rr.name = self:name(self); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
617 |
rr.type = dns.type[self:word()] or rr.type; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
618 |
rr.class = dns.class[self:word()] or rr.class; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
619 |
rr.ttl = 0x10000*self:word() + self:word(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
620 |
rr.rdlength = self:word(); |
337 | 621 |
|
8266
9b52b1f19b51
net.dns: Correctly apply lower bound of RTT (thanks Ge0rG)
Kim Alvefur <zash@zash.se>
parents:
8167
diff
changeset
|
622 |
rr.tod = self.time + math.max(rr.ttl, 1); |
337 | 623 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
624 |
local remember = self.offset; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
625 |
local rr_parser = self[dns.type[rr.type]]; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
626 |
if rr_parser then rr_parser(self, rr); end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
627 |
self.offset = remember; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
628 |
rr.rdata = self:sub(rr.rdlength); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
629 |
return rr; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
630 |
end |
337 | 631 |
|
632 |
||
633 |
function resolver:rrs (count) -- - - - - - - - - - - - - - - - - - - - - rrs |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
634 |
local rrs = {}; |
7503
4c519444d4a2
net.dns: remove unused one-letter loop variables [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents:
7483
diff
changeset
|
635 |
for _ = 1, count do append(rrs, self:rr()); end |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
636 |
return rrs; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
637 |
end |
337 | 638 |
|
639 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
640 |
function resolver:decode(packet, force) -- - - - - - - - - - - - - - decode |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
641 |
self.packet, self.offset = packet, 1; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
642 |
local header = self:header(force); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
643 |
if not header then return nil; end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
644 |
local response = { header = header }; |
337 | 645 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
646 |
response.question = {}; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
647 |
local offset = self.offset; |
7503
4c519444d4a2
net.dns: remove unused one-letter loop variables [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents:
7483
diff
changeset
|
648 |
for _ = 1, response.header.qdcount do |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
649 |
append(response.question, self:question()); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
650 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
651 |
response.question.raw = string.sub(self.packet, offset, self.offset - 1); |
337 | 652 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
653 |
if not force then |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
654 |
if not self.active[response.header.id] or not self.active[response.header.id][response.question.raw] then |
5266
5c3a3ef6b769
net.dns: Clean up query list when a server is marked down
Matthew Wild <mwild1@gmail.com>
parents:
4425
diff
changeset
|
655 |
self.active[response.header.id] = nil; |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
656 |
return nil; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
657 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
658 |
end |
337 | 659 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
660 |
response.answer = self:rrs(response.header.ancount); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
661 |
response.authority = self:rrs(response.header.nscount); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
662 |
response.additional = self:rrs(response.header.arcount); |
337 | 663 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
664 |
return response; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
665 |
end |
337 | 666 |
|
667 |
||
668 |
-- socket layer -------------------------------------------------- socket layer |
|
669 |
||
670 |
||
10962
25680ece29c2
net.dns: Increase backoff delays
Matthew Wild <mwild1@gmail.com>
parents:
10961
diff
changeset
|
671 |
resolver.delays = { 1, 2, 3, 5 }; |
337 | 672 |
|
10961
8902cecbdd39
net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents:
10960
diff
changeset
|
673 |
resolver.jitter = have_timer and default_jitter or nil; |
8902cecbdd39
net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents:
10960
diff
changeset
|
674 |
resolver.retry_jitter = have_timer and default_retry_jitter or nil; |
337 | 675 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
676 |
function resolver:addnameserver(address) -- - - - - - - - - - addnameserver |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
677 |
self.server = self.server or {}; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
678 |
append(self.server, address); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
679 |
end |
337 | 680 |
|
681 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
682 |
function resolver:setnameserver(address) -- - - - - - - - - - setnameserver |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
683 |
self.server = {}; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
684 |
self:addnameserver(address); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
685 |
end |
337 | 686 |
|
687 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
688 |
function resolver:adddefaultnameservers() -- - - - - adddefaultnameservers |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
689 |
if is_windows then |
3544
f2aca3e0fe3b
net.dns: Fixed a traceback when util/windows.dll is unavailable on windows.
Waqas Hussain <waqas20@gmail.com>
parents:
3540
diff
changeset
|
690 |
if windows and windows.get_nameservers then |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
691 |
for _, server in ipairs(windows.get_nameservers()) do |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
692 |
self:addnameserver(server); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
693 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
694 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
695 |
if not self.server or #self.server == 0 then |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
696 |
-- TODO log warning about no nameservers, adding opendns servers as fallback |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
697 |
self:addnameserver("208.67.222.222"); |
2742
6c0a081cd766
net.dns: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents:
2741
diff
changeset
|
698 |
self:addnameserver("208.67.220.220"); |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
699 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
700 |
else -- posix |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
701 |
local resolv_conf = io.open("/etc/resolv.conf"); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
702 |
if resolv_conf then |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
703 |
for line in resolv_conf:lines() do |
2741
fcd30b72c50c
net.dns: More reliable parsing of resolv.conf - allow multiple nameserver IPs on one line (thanks dersd)
Matthew Wild <mwild1@gmail.com>
parents:
2620
diff
changeset
|
704 |
line = line:gsub("#.*$", "") |
7059
7b0651e4534f
net.dns: Allow a zone id in resolv.conf (eg like %eth0)
Kim Alvefur <zash@zash.se>
parents:
7057
diff
changeset
|
705 |
:match('^%s*nameserver%s+([%x:%.]*%%?%S*)%s*$'); |
2741
fcd30b72c50c
net.dns: More reliable parsing of resolv.conf - allow multiple nameserver IPs on one line (thanks dersd)
Matthew Wild <mwild1@gmail.com>
parents:
2620
diff
changeset
|
706 |
if line then |
7057
94d5e2f33a10
net.dns: Support IPv6 addresses in resolv.conf [Backported from 0.10]
Florian Zeitz <florob@babelmonkeys.de>
parents:
6866
diff
changeset
|
707 |
local ip = new_ip(line); |
94d5e2f33a10
net.dns: Support IPv6 addresses in resolv.conf [Backported from 0.10]
Florian Zeitz <florob@babelmonkeys.de>
parents:
6866
diff
changeset
|
708 |
if ip then |
94d5e2f33a10
net.dns: Support IPv6 addresses in resolv.conf [Backported from 0.10]
Florian Zeitz <florob@babelmonkeys.de>
parents:
6866
diff
changeset
|
709 |
self:addnameserver(ip.addr); |
94d5e2f33a10
net.dns: Support IPv6 addresses in resolv.conf [Backported from 0.10]
Florian Zeitz <florob@babelmonkeys.de>
parents:
6866
diff
changeset
|
710 |
end |
2741
fcd30b72c50c
net.dns: More reliable parsing of resolv.conf - allow multiple nameserver IPs on one line (thanks dersd)
Matthew Wild <mwild1@gmail.com>
parents:
2620
diff
changeset
|
711 |
end |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
712 |
end |
9956
6402bc76f51a
net.dns: Close resolv.conf handle when done (fixes #1342)
Kim Alvefur <zash@zash.se>
parents:
8912
diff
changeset
|
713 |
resolv_conf:close(); |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
714 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
715 |
if not self.server or #self.server == 0 then |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
716 |
-- TODO log warning about no nameservers, adding localhost as the default nameserver |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
717 |
self:addnameserver("127.0.0.1"); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
718 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
719 |
end |
399
93b6587d9afb
Added temporary fix for srv on windows: using opendns nameservers
Waqas Hussain <waqas20@gmail.com>
parents:
379
diff
changeset
|
720 |
end |
337 | 721 |
|
722 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
723 |
function resolver:getsocket(servernum) -- - - - - - - - - - - - - getsocket |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
724 |
self.socket = self.socket or {}; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
725 |
self.socketset = self.socketset or {}; |
337 | 726 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
727 |
local sock = self.socket[servernum]; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
728 |
if sock then return sock; end |
337 | 729 |
|
6512
7cb69eba3e95
net.dns: Try next server if peer name can not be set (thanks wirehack7)
Kim Alvefur <zash@zash.se>
parents:
6511
diff
changeset
|
730 |
local ok, err; |
7057
94d5e2f33a10
net.dns: Support IPv6 addresses in resolv.conf [Backported from 0.10]
Florian Zeitz <florob@babelmonkeys.de>
parents:
6866
diff
changeset
|
731 |
local peer = self.server[servernum]; |
94d5e2f33a10
net.dns: Support IPv6 addresses in resolv.conf [Backported from 0.10]
Florian Zeitz <florob@babelmonkeys.de>
parents:
6866
diff
changeset
|
732 |
if peer:find(":") then |
94d5e2f33a10
net.dns: Support IPv6 addresses in resolv.conf [Backported from 0.10]
Florian Zeitz <florob@babelmonkeys.de>
parents:
6866
diff
changeset
|
733 |
sock, err = socket.udp6(); |
94d5e2f33a10
net.dns: Support IPv6 addresses in resolv.conf [Backported from 0.10]
Florian Zeitz <florob@babelmonkeys.de>
parents:
6866
diff
changeset
|
734 |
else |
6860
86fcc3fa1a97
net.dns: Use new IPv4-specific socket factory if available (fixes dns on libevent with latest development version of luasocket)
Kim Alvefur <zash@zash.se>
parents:
6783
diff
changeset
|
735 |
sock, err = (socket.udp4 or socket.udp)(); |
7057
94d5e2f33a10
net.dns: Support IPv6 addresses in resolv.conf [Backported from 0.10]
Florian Zeitz <florob@babelmonkeys.de>
parents:
6866
diff
changeset
|
736 |
end |
5730
411e9e7d8035
net.dns, net.adns: Make sure errors from net.server are propagated (thanks asterix)
Kim Alvefur <zash@zash.se>
parents:
5566
diff
changeset
|
737 |
if sock and self.socket_wrapper then sock, err = self.socket_wrapper(sock, self); end |
3954
6e22b0cf3d72
net.dns: resolver:getsocket(): Return nil, err on failure
Matthew Wild <mwild1@gmail.com>
parents:
3747
diff
changeset
|
738 |
if not sock then |
6e22b0cf3d72
net.dns: resolver:getsocket(): Return nil, err on failure
Matthew Wild <mwild1@gmail.com>
parents:
3747
diff
changeset
|
739 |
return nil, err; |
6e22b0cf3d72
net.dns: resolver:getsocket(): Return nil, err on failure
Matthew Wild <mwild1@gmail.com>
parents:
3747
diff
changeset
|
740 |
end |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
741 |
sock:settimeout(0); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
742 |
-- todo: attempt to use a random port, fallback to 0 |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
743 |
self.socket[servernum] = sock; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
744 |
self.socketset[sock] = servernum; |
6512
7cb69eba3e95
net.dns: Try next server if peer name can not be set (thanks wirehack7)
Kim Alvefur <zash@zash.se>
parents:
6511
diff
changeset
|
745 |
-- set{sock,peer}name can fail, eg because of local routing table |
7cb69eba3e95
net.dns: Try next server if peer name can not be set (thanks wirehack7)
Kim Alvefur <zash@zash.se>
parents:
6511
diff
changeset
|
746 |
-- if so, try the next server |
7cb69eba3e95
net.dns: Try next server if peer name can not be set (thanks wirehack7)
Kim Alvefur <zash@zash.se>
parents:
6511
diff
changeset
|
747 |
ok, err = sock:setsockname('*', 0); |
7cb69eba3e95
net.dns: Try next server if peer name can not be set (thanks wirehack7)
Kim Alvefur <zash@zash.se>
parents:
6511
diff
changeset
|
748 |
if not ok then return self:servfail(sock, err); end |
7057
94d5e2f33a10
net.dns: Support IPv6 addresses in resolv.conf [Backported from 0.10]
Florian Zeitz <florob@babelmonkeys.de>
parents:
6866
diff
changeset
|
749 |
ok, err = sock:setpeername(peer, 53); |
6512
7cb69eba3e95
net.dns: Try next server if peer name can not be set (thanks wirehack7)
Kim Alvefur <zash@zash.se>
parents:
6511
diff
changeset
|
750 |
if not ok then return self:servfail(sock, err); end |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
751 |
return sock; |
1786
4016d8bc30b8
net.dns: Multiple internal changes and API extensions to allow for more reliable DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
1523
diff
changeset
|
752 |
end |
337 | 753 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
754 |
function resolver:voidsocket(sock) |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
755 |
if self.socket[sock] then |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
756 |
self.socketset[self.socket[sock]] = nil; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
757 |
self.socket[sock] = nil; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
758 |
elseif self.socketset[sock] then |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
759 |
self.socket[self.socketset[sock]] = nil; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
760 |
self.socketset[sock] = nil; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
761 |
end |
5267
a2080e5c4eda
net.dns: Close voided sockets, so they don't stay in net.server
Kim Alvefur <zash@zash.se>
parents:
5266
diff
changeset
|
762 |
sock:close(); |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
763 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
764 |
|
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
765 |
function resolver:socket_wrapper_set(func) -- - - - - - - socket_wrapper_set |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
766 |
self.socket_wrapper = func; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
767 |
end |
337 | 768 |
|
769 |
||
770 |
function resolver:closeall () -- - - - - - - - - - - - - - - - - - closeall |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
771 |
for i,sock in ipairs(self.socket) do |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
772 |
self.socket[i] = nil; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
773 |
self.socketset[sock] = nil; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
774 |
sock:close(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
775 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
776 |
end |
337 | 777 |
|
778 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
779 |
function resolver:remember(rr, type) -- - - - - - - - - - - - - - remember |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
780 |
--print ('remember', type, rr.class, rr.type, rr.name) |
2620
481c6724818f
net.dns: Normalize records before placing them in the cache, fixes issues with CNAME targets in CAPS (fixes #161)
Matthew Wild <mwild1@gmail.com>
parents:
2619
diff
changeset
|
781 |
local qname, qtype, qclass = standardize(rr.name, rr.type, rr.class); |
337 | 782 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
783 |
if type ~= '*' then |
2620
481c6724818f
net.dns: Normalize records before placing them in the cache, fixes issues with CNAME targets in CAPS (fixes #161)
Matthew Wild <mwild1@gmail.com>
parents:
2619
diff
changeset
|
784 |
type = qtype; |
481c6724818f
net.dns: Normalize records before placing them in the cache, fixes issues with CNAME targets in CAPS (fixes #161)
Matthew Wild <mwild1@gmail.com>
parents:
2619
diff
changeset
|
785 |
local all = get(self.cache, qclass, '*', qname); |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
786 |
--print('remember all', all); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
787 |
if all then append(all, rr); end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
788 |
end |
337 | 789 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
790 |
self.cache = self.cache or setmetatable({}, cache_metatable); |
2620
481c6724818f
net.dns: Normalize records before placing them in the cache, fixes issues with CNAME targets in CAPS (fixes #161)
Matthew Wild <mwild1@gmail.com>
parents:
2619
diff
changeset
|
791 |
local rrs = get(self.cache, qclass, type, qname) or |
481c6724818f
net.dns: Normalize records before placing them in the cache, fixes issues with CNAME targets in CAPS (fixes #161)
Matthew Wild <mwild1@gmail.com>
parents:
2619
diff
changeset
|
792 |
set(self.cache, qclass, type, qname, setmetatable({}, rrs_metatable)); |
8903
fcf42bd7d067
net.dns: Don't attempt to cache unparsed data (fixes #1056)
Kim Alvefur <zash@zash.se>
parents:
8901
diff
changeset
|
793 |
if rr[qtype:lower()] and not rrs[rr[qtype:lower()]] then |
6466
460584257cc9
net.dns: Avoid duplicate cache entries
Florian Zeitz <florob@babelmonkeys.de>
parents:
6310
diff
changeset
|
794 |
rrs[rr[qtype:lower()]] = true; |
460584257cc9
net.dns: Avoid duplicate cache entries
Florian Zeitz <florob@babelmonkeys.de>
parents:
6310
diff
changeset
|
795 |
append(rrs, rr); |
460584257cc9
net.dns: Avoid duplicate cache entries
Florian Zeitz <florob@babelmonkeys.de>
parents:
6310
diff
changeset
|
796 |
end |
337 | 797 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
798 |
if type == 'MX' then self.unsorted[rrs] = true; end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
799 |
end |
337 | 800 |
|
801 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
802 |
local function comp_mx(a, b) -- - - - - - - - - - - - - - - - - - - comp_mx |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
803 |
return (a.pref == b.pref) and (a.mx < b.mx) or (a.pref < b.pref); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
804 |
end |
337 | 805 |
|
806 |
||
6634
45222bfb206f
net.dns, mod_s2s: Add chasing of CNAMEs to net.dns and remove it from mod_s2s
Kim Alvefur <zash@zash.se>
parents:
6512
diff
changeset
|
807 |
function resolver:peek (qname, qtype, qclass, n) -- - - - - - - - - - - - peek |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
808 |
qname, qtype, qclass = standardize(qname, qtype, qclass); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
809 |
local rrs = get(self.cache, qclass, qtype, qname); |
6634
45222bfb206f
net.dns, mod_s2s: Add chasing of CNAMEs to net.dns and remove it from mod_s2s
Kim Alvefur <zash@zash.se>
parents:
6512
diff
changeset
|
810 |
if not rrs then |
45222bfb206f
net.dns, mod_s2s: Add chasing of CNAMEs to net.dns and remove it from mod_s2s
Kim Alvefur <zash@zash.se>
parents:
6512
diff
changeset
|
811 |
if n then if n <= 0 then return end else n = 3 end |
45222bfb206f
net.dns, mod_s2s: Add chasing of CNAMEs to net.dns and remove it from mod_s2s
Kim Alvefur <zash@zash.se>
parents:
6512
diff
changeset
|
812 |
rrs = get(self.cache, qclass, "CNAME", qname); |
45222bfb206f
net.dns, mod_s2s: Add chasing of CNAMEs to net.dns and remove it from mod_s2s
Kim Alvefur <zash@zash.se>
parents:
6512
diff
changeset
|
813 |
if not (rrs and rrs[1]) then return end |
45222bfb206f
net.dns, mod_s2s: Add chasing of CNAMEs to net.dns and remove it from mod_s2s
Kim Alvefur <zash@zash.se>
parents:
6512
diff
changeset
|
814 |
return self:peek(rrs[1].cname, qtype, qclass, n - 1); |
45222bfb206f
net.dns, mod_s2s: Add chasing of CNAMEs to net.dns and remove it from mod_s2s
Kim Alvefur <zash@zash.se>
parents:
6512
diff
changeset
|
815 |
end |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
816 |
if prune(rrs, socket.gettime()) and qtype == '*' or not next(rrs) then |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
817 |
set(self.cache, qclass, qtype, qname, nil); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
818 |
return nil; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
819 |
end |
6634
45222bfb206f
net.dns, mod_s2s: Add chasing of CNAMEs to net.dns and remove it from mod_s2s
Kim Alvefur <zash@zash.se>
parents:
6512
diff
changeset
|
820 |
if self.unsorted[rrs] then table.sort (rrs, comp_mx); self.unsorted[rrs] = nil; end |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
821 |
return rrs; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
822 |
end |
337 | 823 |
|
824 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
825 |
function resolver:purge(soft) -- - - - - - - - - - - - - - - - - - - purge |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
826 |
if soft == 'soft' then |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
827 |
self.time = socket.gettime(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
828 |
for class,types in pairs(self.cache or {}) do |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
829 |
for type,names in pairs(types) do |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
830 |
for name,rrs in pairs(names) do |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
831 |
prune(rrs, self.time, 'soft') |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
832 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
833 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
834 |
end |
4400
ac651265766c
net.dns: Preserve metatable on manual cache purge
Matthew Wild <mwild1@gmail.com>
parents:
4373
diff
changeset
|
835 |
else self.cache = setmetatable({}, cache_metatable); end |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
836 |
end |
337 | 837 |
|
838 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
839 |
function resolver:query(qname, qtype, qclass) -- - - - - - - - - - -- query |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
840 |
qname, qtype, qclass = standardize(qname, qtype, qclass) |
337 | 841 |
|
6288
d122420542fb
net.dns: Fix duplicated cache insertions by limiting outstanding queries per name to one
Kim Alvefur <zash@zash.se>
parents:
5730
diff
changeset
|
842 |
local co = coroutine.running(); |
d122420542fb
net.dns: Fix duplicated cache insertions by limiting outstanding queries per name to one
Kim Alvefur <zash@zash.se>
parents:
5730
diff
changeset
|
843 |
local q = get(self.wanted, qclass, qtype, qname); |
d122420542fb
net.dns: Fix duplicated cache insertions by limiting outstanding queries per name to one
Kim Alvefur <zash@zash.se>
parents:
5730
diff
changeset
|
844 |
if co and q then |
d122420542fb
net.dns: Fix duplicated cache insertions by limiting outstanding queries per name to one
Kim Alvefur <zash@zash.se>
parents:
5730
diff
changeset
|
845 |
-- We are already waiting for a reply to an identical query. |
d122420542fb
net.dns: Fix duplicated cache insertions by limiting outstanding queries per name to one
Kim Alvefur <zash@zash.se>
parents:
5730
diff
changeset
|
846 |
set(self.wanted, qclass, qtype, qname, co, true); |
d122420542fb
net.dns: Fix duplicated cache insertions by limiting outstanding queries per name to one
Kim Alvefur <zash@zash.se>
parents:
5730
diff
changeset
|
847 |
return true; |
d122420542fb
net.dns: Fix duplicated cache insertions by limiting outstanding queries per name to one
Kim Alvefur <zash@zash.se>
parents:
5730
diff
changeset
|
848 |
end |
d122420542fb
net.dns: Fix duplicated cache insertions by limiting outstanding queries per name to one
Kim Alvefur <zash@zash.se>
parents:
5730
diff
changeset
|
849 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
850 |
if not self.server then self:adddefaultnameservers(); end |
337 | 851 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
852 |
local question = encodeQuestion(qname, qtype, qclass); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
853 |
local peek = self:peek (qname, qtype, qclass); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
854 |
if peek then return peek; end |
337 | 855 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
856 |
local header, id = encodeHeader(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
857 |
--print ('query id', id, qclass, qtype, qname) |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
858 |
local o = { |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
859 |
packet = header..question, |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
860 |
server = self.best_server, |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
861 |
delay = 1, |
10961
8902cecbdd39
net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents:
10960
diff
changeset
|
862 |
retry = socket.gettime() + self.delays[1]; |
10960
03a09fa02e8e
net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents:
10959
diff
changeset
|
863 |
qclass = qclass; |
03a09fa02e8e
net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents:
10959
diff
changeset
|
864 |
qtype = qtype; |
03a09fa02e8e
net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents:
10959
diff
changeset
|
865 |
qname = qname; |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
866 |
}; |
337 | 867 |
|
3540
bc139431830b
Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents:
3513
diff
changeset
|
868 |
-- remember the query |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
869 |
self.active[id] = self.active[id] or {}; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
870 |
self.active[id][question] = o; |
337 | 871 |
|
3955
a096700d23d9
net.dns: resolver:query(): Handle getsocket() failures, and return true on success
Matthew Wild <mwild1@gmail.com>
parents:
3954
diff
changeset
|
872 |
local conn, err = self:getsocket(o.server) |
a096700d23d9
net.dns: resolver:query(): Handle getsocket() failures, and return true on success
Matthew Wild <mwild1@gmail.com>
parents:
3954
diff
changeset
|
873 |
if not conn then |
a096700d23d9
net.dns: resolver:query(): Handle getsocket() failures, and return true on success
Matthew Wild <mwild1@gmail.com>
parents:
3954
diff
changeset
|
874 |
return nil, err; |
a096700d23d9
net.dns: resolver:query(): Handle getsocket() failures, and return true on success
Matthew Wild <mwild1@gmail.com>
parents:
3954
diff
changeset
|
875 |
end |
10961
8902cecbdd39
net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents:
10960
diff
changeset
|
876 |
if self.jitter then |
8902cecbdd39
net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents:
10960
diff
changeset
|
877 |
timer.add_task(math.random()*self.jitter, function () |
8902cecbdd39
net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents:
10960
diff
changeset
|
878 |
conn:send(o.packet); |
8902cecbdd39
net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents:
10960
diff
changeset
|
879 |
end); |
8902cecbdd39
net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents:
10960
diff
changeset
|
880 |
else |
8902cecbdd39
net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents:
10960
diff
changeset
|
881 |
conn:send(o.packet); |
8902cecbdd39
net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents:
10960
diff
changeset
|
882 |
end |
7096
388281be2bc7
net.dns: Remember query only after it was sent, in case it was not (fixes #598)
Kim Alvefur <zash@zash.se>
parents:
7062
diff
changeset
|
883 |
|
388281be2bc7
net.dns: Remember query only after it was sent, in case it was not (fixes #598)
Kim Alvefur <zash@zash.se>
parents:
7062
diff
changeset
|
884 |
-- remember which coroutine wants the answer |
388281be2bc7
net.dns: Remember query only after it was sent, in case it was not (fixes #598)
Kim Alvefur <zash@zash.se>
parents:
7062
diff
changeset
|
885 |
if co then |
388281be2bc7
net.dns: Remember query only after it was sent, in case it was not (fixes #598)
Kim Alvefur <zash@zash.se>
parents:
7062
diff
changeset
|
886 |
set(self.wanted, qclass, qtype, qname, co, true); |
388281be2bc7
net.dns: Remember query only after it was sent, in case it was not (fixes #598)
Kim Alvefur <zash@zash.se>
parents:
7062
diff
changeset
|
887 |
end |
12391
05c250fa335a
Spelling: Fix various spelling mistakes (thanks timeless)
Kim Alvefur <zash@zash.se>
parents:
10980
diff
changeset
|
888 |
|
10668
c2b79b44ded7
net.dns: Handle being loaded outside of Prosody
Kim Alvefur <zash@zash.se>
parents:
9956
diff
changeset
|
889 |
if have_timer and self.timeout then |
3324
070c8ba71b76
net.dns: Handle our own timeouts, including falling onto other servers in resolv.conf if necessary
Matthew Wild <mwild1@gmail.com>
parents:
3057
diff
changeset
|
890 |
local num_servers = #self.server; |
070c8ba71b76
net.dns: Handle our own timeouts, including falling onto other servers in resolv.conf if necessary
Matthew Wild <mwild1@gmail.com>
parents:
3057
diff
changeset
|
891 |
local i = 1; |
3327
b447682f2a8d
net.dns: Make timeout configurable (default 15s)
Matthew Wild <mwild1@gmail.com>
parents:
3326
diff
changeset
|
892 |
timer.add_task(self.timeout, function () |
3324
070c8ba71b76
net.dns: Handle our own timeouts, including falling onto other servers in resolv.conf if necessary
Matthew Wild <mwild1@gmail.com>
parents:
3057
diff
changeset
|
893 |
if get(self.wanted, qclass, qtype, qname, co) then |
10959
7bcfac630b65
net.dns: Add some debug logging
Matthew Wild <mwild1@gmail.com>
parents:
10668
diff
changeset
|
894 |
log("debug", "DNS request timeout %d/%d", i, num_servers) |
3324
070c8ba71b76
net.dns: Handle our own timeouts, including falling onto other servers in resolv.conf if necessary
Matthew Wild <mwild1@gmail.com>
parents:
3057
diff
changeset
|
895 |
i = i + 1; |
10960
03a09fa02e8e
net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents:
10959
diff
changeset
|
896 |
self:servfail(self.socket[o.server]); |
03a09fa02e8e
net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents:
10959
diff
changeset
|
897 |
-- end |
03a09fa02e8e
net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents:
10959
diff
changeset
|
898 |
end |
03a09fa02e8e
net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents:
10959
diff
changeset
|
899 |
-- Still outstanding? (i.e. retried) |
03a09fa02e8e
net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents:
10959
diff
changeset
|
900 |
if get(self.wanted, qclass, qtype, qname, co) then |
03a09fa02e8e
net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents:
10959
diff
changeset
|
901 |
return self.timeout; -- Then wait |
3324
070c8ba71b76
net.dns: Handle our own timeouts, including falling onto other servers in resolv.conf if necessary
Matthew Wild <mwild1@gmail.com>
parents:
3057
diff
changeset
|
902 |
end |
070c8ba71b76
net.dns: Handle our own timeouts, including falling onto other servers in resolv.conf if necessary
Matthew Wild <mwild1@gmail.com>
parents:
3057
diff
changeset
|
903 |
end) |
070c8ba71b76
net.dns: Handle our own timeouts, including falling onto other servers in resolv.conf if necessary
Matthew Wild <mwild1@gmail.com>
parents:
3057
diff
changeset
|
904 |
end |
3955
a096700d23d9
net.dns: resolver:query(): Handle getsocket() failures, and return true on success
Matthew Wild <mwild1@gmail.com>
parents:
3954
diff
changeset
|
905 |
return true; |
869
09019c452709
net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
759
diff
changeset
|
906 |
end |
09019c452709
net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
759
diff
changeset
|
907 |
|
6512
7cb69eba3e95
net.dns: Try next server if peer name can not be set (thanks wirehack7)
Kim Alvefur <zash@zash.se>
parents:
6511
diff
changeset
|
908 |
function resolver:servfail(sock, err) |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
909 |
-- Resend all queries for this server |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
910 |
|
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
911 |
local num = self.socketset[sock] |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
912 |
|
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
913 |
-- Socket is dead now |
6511
4a28b8320d7f
net.dns: Return new socket from servfail
Kim Alvefur <zash@zash.se>
parents:
6466
diff
changeset
|
914 |
sock = self:voidsocket(sock); |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
915 |
|
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
916 |
-- Find all requests to the down server, and retry on the next server |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
917 |
self.time = socket.gettime(); |
10959
7bcfac630b65
net.dns: Add some debug logging
Matthew Wild <mwild1@gmail.com>
parents:
10668
diff
changeset
|
918 |
log("debug", "servfail %d (of %d)", num, #self.server); |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
919 |
for id,queries in pairs(self.active) do |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
920 |
for question,o in pairs(queries) do |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
921 |
if o.server == num then -- This request was to the broken server |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
922 |
o.server = o.server + 1 -- Use next server |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
923 |
if o.server > #self.server then |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
924 |
o.server = 1; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
925 |
end |
337 | 926 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
927 |
o.retries = (o.retries or 0) + 1; |
10960
03a09fa02e8e
net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents:
10959
diff
changeset
|
928 |
local retried; |
03a09fa02e8e
net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents:
10959
diff
changeset
|
929 |
if o.retries < #self.server then |
03a09fa02e8e
net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents:
10959
diff
changeset
|
930 |
sock, err = self:getsocket(o.server); |
03a09fa02e8e
net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents:
10959
diff
changeset
|
931 |
if sock then |
03a09fa02e8e
net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents:
10959
diff
changeset
|
932 |
retried = true; |
10961
8902cecbdd39
net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents:
10960
diff
changeset
|
933 |
if self.retry_jitter then |
8902cecbdd39
net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents:
10960
diff
changeset
|
934 |
local delay = self.delays[((o.retries-1)%#self.delays)+1] + (math.random()*self.retry_jitter); |
8902cecbdd39
net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents:
10960
diff
changeset
|
935 |
log("debug", "retry %d in %0.2fs", o.retries, delay); |
8902cecbdd39
net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents:
10960
diff
changeset
|
936 |
timer.add_task(delay, function () |
8902cecbdd39
net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents:
10960
diff
changeset
|
937 |
sock:send(o.packet); |
8902cecbdd39
net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents:
10960
diff
changeset
|
938 |
end); |
8902cecbdd39
net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents:
10960
diff
changeset
|
939 |
else |
10960
03a09fa02e8e
net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents:
10959
diff
changeset
|
940 |
log("debug", "retry %d (immediate)", o.retries); |
03a09fa02e8e
net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents:
10959
diff
changeset
|
941 |
sock:send(o.packet); |
10961
8902cecbdd39
net.dns: Add jitter to spread queries and reduce failures due to congestion
Matthew Wild <mwild1@gmail.com>
parents:
10960
diff
changeset
|
942 |
end |
10960
03a09fa02e8e
net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents:
10959
diff
changeset
|
943 |
end |
12391
05c250fa335a
Spelling: Fix various spelling mistakes (thanks timeless)
Kim Alvefur <zash@zash.se>
parents:
10980
diff
changeset
|
944 |
end |
10960
03a09fa02e8e
net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents:
10959
diff
changeset
|
945 |
if not retried then |
03a09fa02e8e
net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents:
10959
diff
changeset
|
946 |
log("debug", 'tried all servers, giving up'); |
03a09fa02e8e
net.dns: Fix timeout retry logic
Matthew Wild <mwild1@gmail.com>
parents:
10959
diff
changeset
|
947 |
self:cancel(o.qclass, o.qtype, o.qname); |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
948 |
queries[question] = nil; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
949 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
950 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
951 |
end |
5266
5c3a3ef6b769
net.dns: Clean up query list when a server is marked down
Matthew Wild <mwild1@gmail.com>
parents:
4425
diff
changeset
|
952 |
if next(queries) == nil then |
5c3a3ef6b769
net.dns: Clean up query list when a server is marked down
Matthew Wild <mwild1@gmail.com>
parents:
4425
diff
changeset
|
953 |
self.active[id] = nil; |
5c3a3ef6b769
net.dns: Clean up query list when a server is marked down
Matthew Wild <mwild1@gmail.com>
parents:
4425
diff
changeset
|
954 |
end |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
955 |
end |
3540
bc139431830b
Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents:
3513
diff
changeset
|
956 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
957 |
if num == self.best_server then |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
958 |
self.best_server = self.best_server + 1; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
959 |
if self.best_server > #self.server then |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
960 |
-- Exhausted all servers, try first again |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
961 |
self.best_server = 1; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
962 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
963 |
end |
6512
7cb69eba3e95
net.dns: Try next server if peer name can not be set (thanks wirehack7)
Kim Alvefur <zash@zash.se>
parents:
6511
diff
changeset
|
964 |
return sock, err; |
1786
4016d8bc30b8
net.dns: Multiple internal changes and API extensions to allow for more reliable DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
1523
diff
changeset
|
965 |
end |
337 | 966 |
|
3327
b447682f2a8d
net.dns: Make timeout configurable (default 15s)
Matthew Wild <mwild1@gmail.com>
parents:
3326
diff
changeset
|
967 |
function resolver:settimeout(seconds) |
b447682f2a8d
net.dns: Make timeout configurable (default 15s)
Matthew Wild <mwild1@gmail.com>
parents:
3326
diff
changeset
|
968 |
self.timeout = seconds; |
b447682f2a8d
net.dns: Make timeout configurable (default 15s)
Matthew Wild <mwild1@gmail.com>
parents:
3326
diff
changeset
|
969 |
end |
b447682f2a8d
net.dns: Make timeout configurable (default 15s)
Matthew Wild <mwild1@gmail.com>
parents:
3326
diff
changeset
|
970 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
971 |
function resolver:receive(rset) -- - - - - - - - - - - - - - - - - receive |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
972 |
--print('receive'); print(self.socket); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
973 |
self.time = socket.gettime(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
974 |
rset = rset or self.socket; |
337 | 975 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
976 |
local response; |
7472
363e4a5e9b0a
net.dns: remove unused one-letter loop variables [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents:
7325
diff
changeset
|
977 |
for _, sock in pairs(rset) do |
337 | 978 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
979 |
if self.socketset[sock] then |
2619
04158baefa34
net.dns: Update for new socket API
Matthew Wild <mwild1@gmail.com>
parents:
2578
diff
changeset
|
980 |
local packet = sock:receive(); |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
981 |
if packet then |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
982 |
response = self:decode(packet); |
2278
8c10f13c0c20
modulemanager, net.dns: Remove trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents:
2082
diff
changeset
|
983 |
if response and self.active[response.header.id] |
2081
b9bbb709d62e
net.dns: Be more strict about checking the DNS replies we receive
Matthew Wild <mwild1@gmail.com>
parents:
2069
diff
changeset
|
984 |
and self.active[response.header.id][response.question.raw] then |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
985 |
--print('received response'); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
986 |
--self.print(response); |
337 | 987 |
|
7472
363e4a5e9b0a
net.dns: remove unused one-letter loop variables [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents:
7325
diff
changeset
|
988 |
for _, rr in pairs(response.answer) do |
7062
7ec52755622f
Backout 88d54bec26b7 prior to release, as it certainly requires more testing
Matthew Wild <mwild1@gmail.com>
parents:
7059
diff
changeset
|
989 |
if rr.name:sub(-#response.question[1].name, -1) == response.question[1].name then |
7ec52755622f
Backout 88d54bec26b7 prior to release, as it certainly requires more testing
Matthew Wild <mwild1@gmail.com>
parents:
7059
diff
changeset
|
990 |
self:remember(rr, response.question[1].type) |
7ec52755622f
Backout 88d54bec26b7 prior to release, as it certainly requires more testing
Matthew Wild <mwild1@gmail.com>
parents:
7059
diff
changeset
|
991 |
end |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
992 |
end |
337 | 993 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
994 |
-- retire the query |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
995 |
local queries = self.active[response.header.id]; |
2082
1381b2071c2e
net.dns: Be more strict about the records we cache
Matthew Wild <mwild1@gmail.com>
parents:
2081
diff
changeset
|
996 |
queries[response.question.raw] = nil; |
12391
05c250fa335a
Spelling: Fix various spelling mistakes (thanks timeless)
Kim Alvefur <zash@zash.se>
parents:
10980
diff
changeset
|
997 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
998 |
if not next(queries) then self.active[response.header.id] = nil; end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
999 |
if not next(self.active) then self:closeall(); end |
337 | 1000 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1001 |
-- was the query on the wanted list? |
2301
8a01b0898679
net.dns: Fix for blocking dns lookups to find waiting coroutines correctly (not that we use this in Prosody...)
Matthew Wild <mwild1@gmail.com>
parents:
2300
diff
changeset
|
1002 |
local q = response.question[1]; |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1003 |
local cos = get(self.wanted, q.class, q.type, q.name); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1004 |
if cos then |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1005 |
for co in pairs(cos) do |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1006 |
if coroutine.status(co) == "suspended" then coroutine.resume(co); end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1007 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1008 |
set(self.wanted, q.class, q.type, q.name, nil); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1009 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1010 |
end |
12391
05c250fa335a
Spelling: Fix various spelling mistakes (thanks timeless)
Kim Alvefur <zash@zash.se>
parents:
10980
diff
changeset
|
1011 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1012 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1013 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1014 |
end |
337 | 1015 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1016 |
return response; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1017 |
end |
337 | 1018 |
|
1019 |
||
3512
e344b00f2cc9
net.dns: Add 'force' parameter to resolver:feed() to force decoding a packet even if it doesn't match an outstanding request
Matthew Wild <mwild1@gmail.com>
parents:
3360
diff
changeset
|
1020 |
function resolver:feed(sock, packet, force) |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1021 |
--print('receive'); print(self.socket); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1022 |
self.time = socket.gettime(); |
869
09019c452709
net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
759
diff
changeset
|
1023 |
|
3512
e344b00f2cc9
net.dns: Add 'force' parameter to resolver:feed() to force decoding a packet even if it doesn't match an outstanding request
Matthew Wild <mwild1@gmail.com>
parents:
3360
diff
changeset
|
1024 |
local response = self:decode(packet, force); |
2300
e182b5029ef2
net.dns: Port some DNS fixes to the resolver:feed() function for net.adns to use
Matthew Wild <mwild1@gmail.com>
parents:
2278
diff
changeset
|
1025 |
if response and self.active[response.header.id] |
e182b5029ef2
net.dns: Port some DNS fixes to the resolver:feed() function for net.adns to use
Matthew Wild <mwild1@gmail.com>
parents:
2278
diff
changeset
|
1026 |
and self.active[response.header.id][response.question.raw] then |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1027 |
--print('received response'); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1028 |
--self.print(response); |
869
09019c452709
net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
759
diff
changeset
|
1029 |
|
7472
363e4a5e9b0a
net.dns: remove unused one-letter loop variables [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents:
7325
diff
changeset
|
1030 |
for _, rr in pairs(response.answer) do |
8900
102242a7ee60
net.dns: Cache all records from the 'answer' section (fixes #487)
Kim Alvefur <zash@zash.se>
parents:
8424
diff
changeset
|
1031 |
self:remember(rr, rr.type); |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1032 |
end |
869
09019c452709
net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
759
diff
changeset
|
1033 |
|
8901
e6ba0e5260b4
net.dns: Also cache records from the 'additional' section
Kim Alvefur <zash@zash.se>
parents:
8900
diff
changeset
|
1034 |
for _, rr in pairs(response.additional) do |
e6ba0e5260b4
net.dns: Also cache records from the 'additional' section
Kim Alvefur <zash@zash.se>
parents:
8900
diff
changeset
|
1035 |
self:remember(rr, rr.type); |
e6ba0e5260b4
net.dns: Also cache records from the 'additional' section
Kim Alvefur <zash@zash.se>
parents:
8900
diff
changeset
|
1036 |
end |
e6ba0e5260b4
net.dns: Also cache records from the 'additional' section
Kim Alvefur <zash@zash.se>
parents:
8900
diff
changeset
|
1037 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1038 |
-- retire the query |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1039 |
local queries = self.active[response.header.id]; |
2300
e182b5029ef2
net.dns: Port some DNS fixes to the resolver:feed() function for net.adns to use
Matthew Wild <mwild1@gmail.com>
parents:
2278
diff
changeset
|
1040 |
queries[response.question.raw] = nil; |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1041 |
if not next(queries) then self.active[response.header.id] = nil; end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1042 |
if not next(self.active) then self:closeall(); end |
869
09019c452709
net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
759
diff
changeset
|
1043 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1044 |
-- was the query on the wanted list? |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1045 |
local q = response.question[1]; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1046 |
if q then |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1047 |
local cos = get(self.wanted, q.class, q.type, q.name); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1048 |
if cos then |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1049 |
for co in pairs(cos) do |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1050 |
if coroutine.status(co) == "suspended" then coroutine.resume(co); end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1051 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1052 |
set(self.wanted, q.class, q.type, q.name, nil); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1053 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1054 |
end |
2742
6c0a081cd766
net.dns: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents:
2741
diff
changeset
|
1055 |
end |
869
09019c452709
net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
759
diff
changeset
|
1056 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1057 |
return response; |
869
09019c452709
net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
759
diff
changeset
|
1058 |
end |
09019c452709
net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
759
diff
changeset
|
1059 |
|
6309
b6f76a52eb36
net.dns: Ensure all pending requests get notified of a timeout when looking up a record (fix for d122420542fb)
Matthew Wild <mwild1@gmail.com>
parents:
6288
diff
changeset
|
1060 |
function resolver:cancel(qclass, qtype, qname) |
3326
fb95015bc646
net.dns, net.adns: Update resolver:cancel() API so that a table doesn't need to be created for each cancellation internal to net.dns
Matthew Wild <mwild1@gmail.com>
parents:
3325
diff
changeset
|
1061 |
local cos = get(self.wanted, qclass, qtype, qname); |
1202
e69fafc14491
net.dns: Add support for cancelling a coroutine-based request
Matthew Wild <mwild1@gmail.com>
parents:
896
diff
changeset
|
1062 |
if cos then |
6309
b6f76a52eb36
net.dns: Ensure all pending requests get notified of a timeout when looking up a record (fix for d122420542fb)
Matthew Wild <mwild1@gmail.com>
parents:
6288
diff
changeset
|
1063 |
for co in pairs(cos) do |
b6f76a52eb36
net.dns: Ensure all pending requests get notified of a timeout when looking up a record (fix for d122420542fb)
Matthew Wild <mwild1@gmail.com>
parents:
6288
diff
changeset
|
1064 |
if coroutine.status(co) == "suspended" then coroutine.resume(co); end |
3325
b3117a1da834
net.dns, net.adns: Move coroutine-calling logic into resolver:cancel()
Matthew Wild <mwild1@gmail.com>
parents:
3324
diff
changeset
|
1065 |
end |
6309
b6f76a52eb36
net.dns: Ensure all pending requests get notified of a timeout when looking up a record (fix for d122420542fb)
Matthew Wild <mwild1@gmail.com>
parents:
6288
diff
changeset
|
1066 |
set(self.wanted, qclass, qtype, qname, nil); |
1202
e69fafc14491
net.dns: Add support for cancelling a coroutine-based request
Matthew Wild <mwild1@gmail.com>
parents:
896
diff
changeset
|
1067 |
end |
e69fafc14491
net.dns: Add support for cancelling a coroutine-based request
Matthew Wild <mwild1@gmail.com>
parents:
896
diff
changeset
|
1068 |
end |
869
09019c452709
net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
759
diff
changeset
|
1069 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1070 |
function resolver:pulse() -- - - - - - - - - - - - - - - - - - - - - pulse |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1071 |
--print(':pulse'); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1072 |
while self:receive() do end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1073 |
if not next(self.active) then return nil; end |
337 | 1074 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1075 |
self.time = socket.gettime(); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1076 |
for id,queries in pairs(self.active) do |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1077 |
for question,o in pairs(queries) do |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1078 |
if self.time >= o.retry then |
337 | 1079 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1080 |
o.server = o.server + 1; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1081 |
if o.server > #self.server then |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1082 |
o.server = 1; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1083 |
o.delay = o.delay + 1; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1084 |
end |
337 | 1085 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1086 |
if o.delay > #self.delays then |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1087 |
--print('timeout'); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1088 |
queries[question] = nil; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1089 |
if not next(queries) then self.active[id] = nil; end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1090 |
if not next(self.active) then return nil; end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1091 |
else |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1092 |
--print('retry', o.server, o.delay); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1093 |
local _a = self.socket[o.server]; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1094 |
if _a then _a:send(o.packet); end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1095 |
o.retry = self.time + self.delays[o.delay]; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1096 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1097 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1098 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1099 |
end |
337 | 1100 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1101 |
if next(self.active) then return true; end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1102 |
return nil; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1103 |
end |
337 | 1104 |
|
1105 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1106 |
function resolver:lookup(qname, qtype, qclass) -- - - - - - - - - - lookup |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1107 |
self:query (qname, qtype, qclass) |
3049
e54774bd73a7
net/dns: Fix socket.select timeout.
Brian Cully <bjc@junctionnetworks.com>
parents:
2742
diff
changeset
|
1108 |
while self:pulse() do |
3540
bc139431830b
Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents:
3513
diff
changeset
|
1109 |
local recvt = {} |
bc139431830b
Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents:
3513
diff
changeset
|
1110 |
for i, s in ipairs(self.socket) do |
bc139431830b
Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents:
3513
diff
changeset
|
1111 |
recvt[i] = s |
bc139431830b
Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents:
3513
diff
changeset
|
1112 |
end |
bc139431830b
Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents:
3513
diff
changeset
|
1113 |
socket.select(recvt, nil, 4) |
bc139431830b
Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents:
3513
diff
changeset
|
1114 |
end |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1115 |
--print(self.cache); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1116 |
return self:peek(qname, qtype, qclass); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1117 |
end |
337 | 1118 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1119 |
function resolver:lookupex(handler, qname, qtype, qclass) -- - - - - - - - - - lookup |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1120 |
return self:peek(qname, qtype, qclass) or self:query(qname, qtype, qclass); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1121 |
end |
337 | 1122 |
|
3746
9719316c854e
net.dns: Add resolver:tohostname() and dns.tohostname()
Matthew Wild <mwild1@gmail.com>
parents:
3719
diff
changeset
|
1123 |
function resolver:tohostname(ip) |
9719316c854e
net.dns: Add resolver:tohostname() and dns.tohostname()
Matthew Wild <mwild1@gmail.com>
parents:
3719
diff
changeset
|
1124 |
return dns.lookup(ip:gsub("(%d+)%.(%d+)%.(%d+)%.(%d+)", "%4.%3.%2.%1.in-addr.arpa."), "PTR"); |
9719316c854e
net.dns: Add resolver:tohostname() and dns.tohostname()
Matthew Wild <mwild1@gmail.com>
parents:
3719
diff
changeset
|
1125 |
end |
869
09019c452709
net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
759
diff
changeset
|
1126 |
|
09019c452709
net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
759
diff
changeset
|
1127 |
--print ---------------------------------------------------------------- print |
337 | 1128 |
|
1129 |
||
1130 |
local hints = { -- - - - - - - - - - - - - - - - - - - - - - - - - - - hints |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1131 |
qr = { [0]='query', 'response' }, |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1132 |
opcode = { [0]='query', 'inverse query', 'server status request' }, |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1133 |
aa = { [0]='non-authoritative', 'authoritative' }, |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1134 |
tc = { [0]='complete', 'truncated' }, |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1135 |
rd = { [0]='recursion not desired', 'recursion desired' }, |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1136 |
ra = { [0]='recursion not available', 'recursion available' }, |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1137 |
z = { [0]='(reserved)' }, |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1138 |
rcode = { [0]='no error', 'format error', 'server failure', 'name error', 'not implemented' }, |
337 | 1139 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1140 |
type = dns.type, |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1141 |
class = dns.class |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1142 |
}; |
337 | 1143 |
|
1144 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1145 |
local function hint(p, s) -- - - - - - - - - - - - - - - - - - - - - - hint |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1146 |
return (hints[s] and hints[s][p[s]]) or ''; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1147 |
end |
337 | 1148 |
|
1149 |
||
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1150 |
function resolver.print(response) -- - - - - - - - - - - - - resolver.print |
7483
3dc7de31d3d1
net.dns: don't use "for s,s in pairs..." (unused loop variable s) [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents:
7472
diff
changeset
|
1151 |
for _, s in pairs { 'id', 'qr', 'opcode', 'aa', 'tc', 'rd', 'ra', 'z', |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1152 |
'rcode', 'qdcount', 'ancount', 'nscount', 'arcount' } do |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1153 |
print( string.format('%-30s', 'header.'..s), response.header[s], hint(response.header, s) ); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1154 |
end |
337 | 1155 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1156 |
for i,question in ipairs(response.question) do |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1157 |
print(string.format ('question[%i].name ', i), question.name); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1158 |
print(string.format ('question[%i].type ', i), question.type); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1159 |
print(string.format ('question[%i].class ', i), question.class); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1160 |
end |
337 | 1161 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1162 |
local common = { name=1, type=1, class=1, ttl=1, rdlength=1, rdata=1 }; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1163 |
local tmp; |
7483
3dc7de31d3d1
net.dns: don't use "for s,s in pairs..." (unused loop variable s) [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents:
7472
diff
changeset
|
1164 |
for _, s in pairs({'answer', 'authority', 'additional'}) do |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1165 |
for i,rr in pairs(response[s]) do |
7503
4c519444d4a2
net.dns: remove unused one-letter loop variables [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents:
7483
diff
changeset
|
1166 |
for _, t in pairs({ 'name', 'type', 'class', 'ttl', 'rdlength' }) do |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1167 |
tmp = string.format('%s[%i].%s', s, i, t); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1168 |
print(string.format('%-30s', tmp), rr[t], hint(rr, t)); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1169 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1170 |
for j,t in pairs(rr) do |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1171 |
if not common[j] then |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1172 |
tmp = string.format('%s[%i].%s', s, i, j); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1173 |
print(string.format('%-30s %s', tostring(tmp), tostring(t))); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1174 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1175 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1176 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1177 |
end |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1178 |
end |
337 | 1179 |
|
1180 |
||
1181 |
-- module api ------------------------------------------------------ module api |
|
1182 |
||
1183 |
||
1184 |
function dns.resolver () -- - - - - - - - - - - - - - - - - - - - - resolver |
|
6310
d232bb1bbe1e
net.dns: Remove unused obsolete code
Matthew Wild <mwild1@gmail.com>
parents:
6309
diff
changeset
|
1185 |
local r = { active = {}, cache = {}, unsorted = {}, wanted = {}, best_server = 1 }; |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1186 |
setmetatable (r, resolver); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1187 |
setmetatable (r.cache, cache_metatable); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1188 |
setmetatable (r.unsorted, { __mode = 'kv' }); |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1189 |
return r; |
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1190 |
end |
337 | 1191 |
|
2573
60493186fef6
net.dns: Removed some useless indirection to improve readability.
Waqas Hussain <waqas20@gmail.com>
parents:
2425
diff
changeset
|
1192 |
local _resolver = dns.resolver(); |
60493186fef6
net.dns: Removed some useless indirection to improve readability.
Waqas Hussain <waqas20@gmail.com>
parents:
2425
diff
changeset
|
1193 |
dns._resolver = _resolver; |
10980
540f1bc5f082
net.dns: Disable jitter for default resolver (used by blocking dns.lookup() calls)
Matthew Wild <mwild1@gmail.com>
parents:
10963
diff
changeset
|
1194 |
_resolver.jitter, _resolver.retry_jitter = false, false; |
337 | 1195 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1196 |
function dns.lookup(...) -- - - - - - - - - - - - - - - - - - - - - lookup |
2573
60493186fef6
net.dns: Removed some useless indirection to improve readability.
Waqas Hussain <waqas20@gmail.com>
parents:
2425
diff
changeset
|
1197 |
return _resolver:lookup(...); |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1198 |
end |
337 | 1199 |
|
3746
9719316c854e
net.dns: Add resolver:tohostname() and dns.tohostname()
Matthew Wild <mwild1@gmail.com>
parents:
3719
diff
changeset
|
1200 |
function dns.tohostname(...) |
9719316c854e
net.dns: Add resolver:tohostname() and dns.tohostname()
Matthew Wild <mwild1@gmail.com>
parents:
3719
diff
changeset
|
1201 |
return _resolver:tohostname(...); |
9719316c854e
net.dns: Add resolver:tohostname() and dns.tohostname()
Matthew Wild <mwild1@gmail.com>
parents:
3719
diff
changeset
|
1202 |
end |
9719316c854e
net.dns: Add resolver:tohostname() and dns.tohostname()
Matthew Wild <mwild1@gmail.com>
parents:
3719
diff
changeset
|
1203 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1204 |
function dns.purge(...) -- - - - - - - - - - - - - - - - - - - - - - purge |
2573
60493186fef6
net.dns: Removed some useless indirection to improve readability.
Waqas Hussain <waqas20@gmail.com>
parents:
2425
diff
changeset
|
1205 |
return _resolver:purge(...); |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1206 |
end |
337 | 1207 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1208 |
function dns.peek(...) -- - - - - - - - - - - - - - - - - - - - - - - peek |
2573
60493186fef6
net.dns: Removed some useless indirection to improve readability.
Waqas Hussain <waqas20@gmail.com>
parents:
2425
diff
changeset
|
1209 |
return _resolver:peek(...); |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1210 |
end |
337 | 1211 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1212 |
function dns.query(...) -- - - - - - - - - - - - - - - - - - - - - - query |
2573
60493186fef6
net.dns: Removed some useless indirection to improve readability.
Waqas Hussain <waqas20@gmail.com>
parents:
2425
diff
changeset
|
1213 |
return _resolver:query(...); |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1214 |
end |
337 | 1215 |
|
2575
8f4d69940132
net.dns: Fixed whitespace/indentation.
Waqas Hussain <waqas20@gmail.com>
parents:
2574
diff
changeset
|
1216 |
function dns.feed(...) -- - - - - - - - - - - - - - - - - - - - - - - feed |
2573
60493186fef6
net.dns: Removed some useless indirection to improve readability.
Waqas Hussain <waqas20@gmail.com>
parents:
2425
diff
changeset
|
1217 |
return _resolver:feed(...); |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1218 |
end |
869
09019c452709
net.dns: Add methods necessary for allowing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
759
diff
changeset
|
1219 |
|
2575
8f4d69940132
net.dns: Fixed whitespace/indentation.
Waqas Hussain <waqas20@gmail.com>
parents:
2574
diff
changeset
|
1220 |
function dns.cancel(...) -- - - - - - - - - - - - - - - - - - - - - - cancel |
2573
60493186fef6
net.dns: Removed some useless indirection to improve readability.
Waqas Hussain <waqas20@gmail.com>
parents:
2425
diff
changeset
|
1221 |
return _resolver:cancel(...); |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1222 |
end |
337 | 1223 |
|
3328
5ac4fbbfb74d
net.dns: Add dns.settimeout() to set the timeout for the default resolver
Matthew Wild <mwild1@gmail.com>
parents:
3327
diff
changeset
|
1224 |
function dns.settimeout(...) |
5ac4fbbfb74d
net.dns: Add dns.settimeout() to set the timeout for the default resolver
Matthew Wild <mwild1@gmail.com>
parents:
3327
diff
changeset
|
1225 |
return _resolver:settimeout(...); |
5ac4fbbfb74d
net.dns: Add dns.settimeout() to set the timeout for the default resolver
Matthew Wild <mwild1@gmail.com>
parents:
3327
diff
changeset
|
1226 |
end |
5ac4fbbfb74d
net.dns: Add dns.settimeout() to set the timeout for the default resolver
Matthew Wild <mwild1@gmail.com>
parents:
3327
diff
changeset
|
1227 |
|
5566
74ae3e7e8779
net.dns: Add nicer API to cached records
Kim Alvefur <zash@zash.se>
parents:
5340
diff
changeset
|
1228 |
function dns.cache() |
74ae3e7e8779
net.dns: Add nicer API to cached records
Kim Alvefur <zash@zash.se>
parents:
5340
diff
changeset
|
1229 |
return _resolver.cache; |
74ae3e7e8779
net.dns: Add nicer API to cached records
Kim Alvefur <zash@zash.se>
parents:
5340
diff
changeset
|
1230 |
end |
74ae3e7e8779
net.dns: Add nicer API to cached records
Kim Alvefur <zash@zash.se>
parents:
5340
diff
changeset
|
1231 |
|
2578
61e5eff54415
net.dns, net.adns: Changed dns:socket_wrapper_set to dns.socket_wrapper_set for consistency.
Waqas Hussain <waqas20@gmail.com>
parents:
2575
diff
changeset
|
1232 |
function dns.socket_wrapper_set(...) -- - - - - - - - - socket_wrapper_set |
2573
60493186fef6
net.dns: Removed some useless indirection to improve readability.
Waqas Hussain <waqas20@gmail.com>
parents:
2425
diff
changeset
|
1233 |
return _resolver:socket_wrapper_set(...); |
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1234 |
end |
337 | 1235 |
|
2069
72357b1c6d88
net.dns: Fixed indentation and coding style.
Waqas Hussain <waqas20@gmail.com>
parents:
2068
diff
changeset
|
1236 |
return dns; |