9be7a5cad7
This commit changes the behavior for the wan-dnsmasq to read the interfaces to update the DNS servers on from flag-files. This way, external custom packages which add a custom VPN WAN interface can update the DNS server gluon is using for WAN resolving.
75 lines
1.6 KiB
Lua
Executable File
75 lines
1.6 KiB
Lua
Executable File
#!/usr/bin/lua
|
|
|
|
local RESOLV_CONF = '/var/gluon/wan-dnsmasq/resolv.conf'
|
|
|
|
|
|
local stat = require 'posix.sys.stat'
|
|
local ubus = require('ubus').connect()
|
|
local uci = require('simple-uci').cursor()
|
|
local util = require 'gluon.util'
|
|
|
|
|
|
local new_servers = ''
|
|
|
|
local function append_server(server)
|
|
new_servers = new_servers .. 'nameserver ' .. server .. '\n'
|
|
end
|
|
|
|
|
|
local function handled_interfaces()
|
|
local interfaces = {}
|
|
|
|
for _, path in ipairs(util.glob('/lib/gluon/wan-dnsmasq/interface.d/*')) do
|
|
for interface in io.lines(path) do
|
|
table.insert(interfaces, interface)
|
|
end
|
|
end
|
|
|
|
return interfaces
|
|
end
|
|
|
|
|
|
local function handle_interface(status)
|
|
local ifname = status.device
|
|
local servers = status.inactive['dns-server']
|
|
|
|
for _, server in ipairs(servers) do
|
|
if server:match('^fe80:') then
|
|
append_server(server .. '%' .. ifname)
|
|
else
|
|
append_server(server)
|
|
end
|
|
end
|
|
end
|
|
|
|
local function append_interface_servers(iface)
|
|
handle_interface(ubus:call('network.interface.' .. iface, 'status', {}))
|
|
end
|
|
|
|
|
|
local static = uci:get_first('gluon-wan-dnsmasq', 'static', 'server')
|
|
|
|
if type(static) == 'table' and #static > 0 then
|
|
for _, server in ipairs(static) do
|
|
append_server(server)
|
|
end
|
|
else
|
|
for _, interface in ipairs(handled_interfaces()) do
|
|
pcall(append_interface_servers, interface)
|
|
end
|
|
end
|
|
|
|
|
|
local old_servers = util.readfile(RESOLV_CONF)
|
|
|
|
if new_servers ~= old_servers then
|
|
stat.mkdir('/var/gluon')
|
|
stat.mkdir('/var/gluon/wan-dnsmasq')
|
|
|
|
local f = io.open(RESOLV_CONF .. '.tmp', 'w')
|
|
f:write(new_servers)
|
|
f:close()
|
|
|
|
os.rename(RESOLV_CONF .. '.tmp', RESOLV_CONF)
|
|
end
|