#!/opt/lnxall_app/bin/lua

-- Created by jiaqiang.ye@lnxall.com
-- find a list of real network devices
-- 2025/11/14

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

local function isbad_netdev(netdev)
	if string.find(netdev, "can", 1, true) then return true end
	if string.find(netdev, "usb", 1, true) then return true end
	if string.find(netdev, "wlan", 1, true) then return true end
	return false
end

local function glob_netdevs()
	if not invoker.chdir("/sys/class/net") then
		io.stderr:write("Error, failed to goto directory: /sys/class/net\n")
		io.stderr:flush()
		return nil
	end

	local netdevs = invoker.glob("*", 4)
	if not netdevs then
		io.stderr:write("Error, nothing found in /sys/class/net\n")
		io.stderr:flush()
		return nil
	end

	if #netdevs >= 2 then
		table.sort(netdevs)
	end

	local nettab, netnum = {}, 0
	for _, ndev in ipairs(netdevs) do
		if isbad_netdev(ndev) then
			io.stderr:write(gfmt("WARNING: skipped network device: %s\n", ndev))
			io.stderr:flush()
		elseif invoker.statfile(ndev .. "/device") then
			netnum = netnum + 1
			nettab[netnum] = ndev
			io.stderr:write(gfmt("Found network device %s => %s\n", netnum, ndev))
			io.stderr:flush()
		else
			io.stderr:write(gfmt("WARNING: skipped virtual network: %s\n", ndev))
			io.stderr:flush()
		end
	end

	if netnum == 0 then
		io.stderr:write("Error, no real network device found.\n")
		io.stderr:flush()
		return nil
	end

	return nettab
end

local ndevs = glob_netdevs()
if ndevs then
	io.stderr:write("=============================================\n\t")
	io.stderr:flush()
	if #ndevs >= 2 then
		io.stdout:write(table.concat(ndevs, " "))
	else
		io.stdout:write(ndevs[1])
	end
	io.stdout:write("\n")
	io.stdout:flush()
	os.exit(0)
end
os.exit(1)
