gluon-firmware/package/gluon-core/luasrc/lib/gluon/upgrade/010-primary-mac

153 lines
2.8 KiB
Lua
Executable File

#!/usr/bin/lua
local sysconfig = require 'gluon.sysconfig'
if sysconfig.primary_mac then
os.exit(0)
end
local json = require 'jsonc'
local platform = require 'gluon.platform'
local util = require 'gluon.util'
local board_data = json.load('/etc/board.json')
local network_data = (board_data or {}).network
local function read(...)
local addr = util.readfile(string.format(...))
if addr then
return util.trim(addr)
end
end
local function get_netdev_addr(ifname)
return read('/sys/class/net/%s/address', ifname)
end
local function strip_vlan(ifname)
return (ifname:gsub('%..*', ''))
end
local function netdev(ifname)
return function()
return get_netdev_addr(ifname)
end
end
local function phy(index)
return function()
return read('/sys/class/ieee80211/phy%d/macaddress', index)
end
end
local function interface(name)
return function()
local ifdata = network_data[name] or {}
if ifdata.macaddr then
return ifdata.macaddr
elseif ifdata.ifname then
return get_netdev_addr(strip_vlan(ifdata.ifname))
end
end
end
local function label_mac()
return function()
local mac = util.exec('/lib/gluon/label_mac.sh')
if mac == nil then return nil end
mac = util.trim(mac)
if string.len(mac) ~= 17 then return nil end
return mac
end
end
-- Entries are matched in the order they are listed
local primary_addrs = {
{interface('lan'), {
{'ath79', 'generic', {
'glinet,gl-ar750s-nor',
'ocedo,raccoon',
'tplink,archer-c2-v3',
'tplink,archer-d50-v1',
}},
{'brcm2708'},
{'ipq40xx', 'generic', {
'avm,fritzbox-4040',
'plasmacloud,pa1200',
'plasmacloud,pa2200',
}},
{'ipq806x', 'generic', {
'netgear,r7800',
}},
{'lantiq', 'xway', {
'netgear,dgn3500b',
}},
{'ramips', 'mt7620', {
'netgear,ex3700',
'tplink,archer-c2-v1',
'tplink,archer-c20-v1',
'tplink,archer-c20i',
'tplink,archer-c50-v1',
}},
{'ramips', 'mt76x8', {
'xiaomi,mi-router-4a-100m',
}},
{'x86'},
}},
{interface('wan'), {
{'ipq40xx', 'generic', {
'linksys,ea6350v3',
'openmesh,a42',
'openmesh,a62',
}},
{'mpc85xx', 'p1020', {
'aerohive,hiveap-330',
'ocedo,panda',
}},
{'ramips', 'mt7620', {
'xiaomi,miwifi-mini',
}},
}},
{phy(1), {
{'ramips', 'mt7621', {
'dlink,dir-860l-b1',
}},
}},
-- label-mac-device default
{label_mac(), {
{}, -- matches everything
}},
-- phy0 default
{phy(0), {
{}, -- matches everything
}},
-- eth0 fallback when phy0 does not exist
{netdev('eth0'), {
{}, -- matches everything
}},
}
for _, matcher in ipairs(primary_addrs) do
local f, matches = unpack(matcher)
for _, match in ipairs(matches) do
if platform.match(unpack(match)) then
local addr = f()
if addr then
sysconfig.primary_mac = addr
return
end
end
end
end
error('no primary MAC address found')