#!/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
