#!/opt/lnxall_app/bin/lua

local invoker    = require "invoker"
local gfmt       = string.format

local g_destfile = "/etc/config/network"
local g_islan    = nil

local function init_script()
	local typ = invoker.statfile(g_destfile)
	if typ == "regular" then
		dow = os.getenv("ADD_NETWORK_CONFIG")
		if dow ~= "FORCE_APPEND" then
			io.stderr:write(gfmt("Error, file already exists: %s\n", g_destfile))
			io.stderr:flush()
			return false
		end
	end

	local wanlan = arg[1]
	if wanlan == "wan" then
		g_islan = false
	elseif wanlan == "lan" then
		g_islan = true
	else
		if type(wanlan) ~= "string" then wanlan = "NONE" end
		io.stderr:write(gfmt("Error, invalid network type: %s\n", wanlan))
		io.stderr:flush()
		return false
	end
	return true
end

local function add_lan_network()
	local netdup = {}
	local netdev, numdev = {}, 1
	while numdev < 32 do
		numdev = numdev + 1
		local dev = arg[numdev]
		if dev and invoker.invoke(invoker.NOSTDIO, "ip", "link", "show", "dev", dev) == 0 then
			if not netdup[dev] then
				netdup[dev] = true
				netdev[#netdev + 1] = dev
			end
		end
	end

	if #netdev == 0 then
		io.stderr:write("Error, network device not specified.\n")
		io.stderr:flush()
		return false
	end

	local nh = io.open(g_destfile, "ab")
	if not nh then
		io.stderr:write(gfmt("Error, failed to open file: %s\n", g_destfile))
		io.stderr:flush()
		return false
	end

	nh:write([[
config device
	option name 'br-lan'
	option type 'bridge'
]])

	for _, ndev in ipairs(netdev) do
		nh:write(gfmt("\tlist ports '%s'\n", ndev))
	end
	nh:write("\n")

	nh:write([[config interface 'lan'
	option device 'br-lan'
	option proto 'static'
	option ipaddr '172.18.39.254'
	option netmask '255.255.255.0'
	option disabled '0'

]])
	nh:close(); nh = nil
	return true
end

local function add_network()
	if g_islan then
		return add_lan_network()
	end

	-- Add network configurations for WAN
	local metric = {}
	local netdev, numdev = {}, 0
	while numdev < 32 do
		numdev = numdev + 2
		local dev = arg[numdev]
		if dev and invoker.invoke(invoker.NOSTDIO, "ip", "link", "show", "dev", dev) == 0 then
			local met = arg[numdev + 1]
			if met then met = tonumber(met) end
			if type(met) == "number" and met >= 0 and not metric[dev] then
				metric[dev] = met
				local netnum = #netdev + 1
				netdev[netnum] = dev
				if netnum >= 10 then break end
			end
		end
	end

	if #netdev == 0 then
		io.stderr:write("Error, no network device specified for WAN.\n")
		io.stderr:flush()
		return false
	end

	local nh = io.open(g_destfile, "ab")
	if not nh then
		io.stderr:write(gfmt("Error, failed to open file: %s\n", g_destfile))
		io.stderr:flush()
		return false
	end

	for idx, ndev in ipairs(netdev) do
		nh:write(gfmt([[
config interface 'wan%s'
	option device '%s'
	option proto 'dhcp'
	option metric '%d'
	option disabled '0'

]], idx >= 2 and tostring(idx - 1) or "", ndev, metric[ndev]))
	end

	nh:close(); nh = nil
	return true
end

if not init_script() then
	os.exit(1)
end
if not add_network() then
	os.exit(2)
end
os.exit(0)

