84 lines
1.5 KiB
Lua
84 lines
1.5 KiB
Lua
local ngx_re_split = require("ngx.re").split
|
|
local string_format = string.format
|
|
local tonumber = tonumber
|
|
|
|
local ngx_log = ngx.log
|
|
local ngx_ERR = ngx.ERR
|
|
|
|
local CONF_PATH = "/etc/resolv.conf"
|
|
|
|
local nameservers, search, ndots = {}, {}, 1
|
|
|
|
local function set_search(parts)
|
|
local length = #parts
|
|
|
|
for i = 2, length, 1 do
|
|
search[i-1] = parts[i]
|
|
end
|
|
end
|
|
|
|
local function set_ndots(parts)
|
|
local option = parts[2]
|
|
if not option then
|
|
return
|
|
end
|
|
|
|
local option_parts, err = ngx_re_split(option, ":")
|
|
if err then
|
|
ngx_log(ngx_ERR, err)
|
|
return
|
|
end
|
|
|
|
if option_parts[1] ~= "ndots" then
|
|
return
|
|
end
|
|
|
|
ndots = tonumber(option_parts[2])
|
|
end
|
|
|
|
local function is_comment(line)
|
|
return line:sub(1, 1) == "#"
|
|
end
|
|
|
|
local function parse_line(line)
|
|
if is_comment(line) then
|
|
return
|
|
end
|
|
|
|
local parts, err = ngx_re_split(line, "\\s+")
|
|
if err then
|
|
ngx_log(ngx_ERR, err)
|
|
end
|
|
|
|
local keyword, value = parts[1], parts[2]
|
|
|
|
if keyword == "nameserver" then
|
|
if not value:match("^%d+.%d+.%d+.%d+$") then
|
|
value = string_format("[%s]", value)
|
|
end
|
|
nameservers[#nameservers + 1] = value
|
|
elseif keyword == "search" then
|
|
set_search(parts)
|
|
elseif keyword == "options" then
|
|
set_ndots(parts)
|
|
end
|
|
end
|
|
|
|
do
|
|
local f, err = io.open(CONF_PATH, "r")
|
|
if not f then
|
|
error("could not open " .. CONF_PATH .. ": " .. tostring(err))
|
|
end
|
|
|
|
for line in f:lines() do
|
|
parse_line(line)
|
|
end
|
|
|
|
f:close()
|
|
end
|
|
|
|
return {
|
|
nameservers = nameservers,
|
|
search = search,
|
|
ndots = ndots,
|
|
}
|