Merge pull request #1956 from freifunk-gluon/primary-mac-cleanup

Primary MAC logic refactoring
This commit is contained in:
Matthias Schiffer 2020-03-14 16:13:14 +01:00 committed by GitHub
commit cd09c95e60
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 125 additions and 64 deletions

View File

@ -4,75 +4,136 @@ local sysconfig = require 'gluon.sysconfig'
if sysconfig.primary_mac then
os.exit(0)
os.exit(0)
end
local util = require 'gluon.util'
local platform = require 'gluon.platform'
local util = require 'gluon.util'
local try_files = {
'/sys/class/net/eth0/address'
local function sysfs(...)
local path = string.format(...)
return function()
local addr = util.readfile(path)
if addr then
return util.trim(addr)
end
end
end
local function eth(index)
return sysfs('/sys/class/net/eth%d/address', index)
end
local function phy(index)
return sysfs('/sys/class/ieee80211/phy%d/macaddress', index)
end
-- Entries are matched in the order they are listed
local primary_addrs = {
{eth(0), {
{'x86'},
{'brcm2708'},
{'ar71xx', 'generic', {
'a40',
'a60',
'archer-c25-v1',
'archer-c60-v2',
'archer-c7-v4',
'archer-c7-v5',
'carambola2',
'koala',
'mr600',
'mr600v2',
'mr900',
'mr900v2',
'mr1750',
'mr1750v2',
'om2p',
'om2pv2',
'om2pv4',
'om2p-hs',
'om2p-hsv2',
'om2p-hsv3',
'om2p-hsv4',
'om2p-lc',
'om5p',
'om5p-an',
'om5p-ac',
'om5p-acv2',
'unifi-outdoor-plus',
'unifiac-lite',
'unifiac-pro',
}},
{'ar71xx', 'mikrotik'},
{'ar71xx', 'nand', {
'hiveap-121',
}},
{'ath79', 'generic', {
'ocedo,raccoon',
}},
{'ipq40xx', 'generic', {
'avm,fritzbox-4040',
'openmesh,a42',
'openmesh,a62',
}},
{'mpc85xx', 'p1020', {
'aerohive,hiveap-330',
}},
{'ramips', 'mt7620', {
'miwifi-mini', 'tplink,c2-v1', 'c20-v1', 'c20i', 'c50',
}},
}},
{eth(1), {
{'ar71xx', 'generic', {
'archer-c5',
'archer-c58-v1',
'archer-c59-v1',
'archer-c60-v1',
'archer-c7',
}},
{'ipq806x', 'generic', {
'netgear,r7800',
}},
{'mpc85xx', 'p1020', {
'ocedo,panda',
}},
}},
{phy(1), {
{'ar71xx', 'generic', {
'tl-wdr3600',
'tl-wdr4300',
'tl-wr902ac-v1',
}},
{'ramips', 'mt7621', {
'dir-860l-b1',
}},
}},
-- phy0 default
{phy(0), {
{}, -- matches everything
}},
-- eth0 fallback when phy0 does not exist
{eth(0), {
{}, -- matches everything
}},
}
if not (
util.contains({'x86', 'brcm2708'}, platform.get_target()) or
platform.match('ar71xx', 'mikrotik')
) then
table.insert(try_files, 1, '/sys/class/ieee80211/phy0/macaddress')
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
if platform.match('ar71xx', 'generic', {'tl-wdr3600', 'tl-wdr4300',
'tl-wr902ac-v1'}) then
table.insert(try_files, 1, '/sys/class/ieee80211/phy1/macaddress')
elseif platform.match('ar71xx', 'generic', {'a40', 'a60',
'archer-c25-v1',
'archer-c60-v2',
'archer-c7-v4', 'archer-c7-v5',
'carambola2',
'koala',
'mr600', 'mr600v2',
'mr900', 'mr900v2',
'mr1750', 'mr1750v2',
'om2p', 'om2pv2', 'om2pv4',
'om2p-hs', 'om2p-hsv2', 'om2p-hsv3',
'om2p-hsv4',
'om2p-lc',
'om5p', 'om5p-an',
'om5p-ac', 'om5p-acv2',
'unifi-outdoor-plus',
'unifiac-lite', 'unifiac-pro'}) then
table.insert(try_files, 1, '/sys/class/net/eth0/address')
elseif platform.match('ar71xx', 'generic', {'archer-c5', 'archer-c58-v1',
'archer-c59-v1', 'archer-c60-v1',
'archer-c7'}) then
table.insert(try_files, 1, '/sys/class/net/eth1/address')
elseif platform.match('ar71xx', 'nand', {'hiveap-121'}) then
table.insert(try_files, 1, '/sys/class/net/eth0/address')
elseif platform.match('ath79', 'generic', {'ocedo,raccoon'}) then
table.insert(try_files, 1, '/sys/class/net/eth0/address')
elseif platform.match('ipq40xx', 'generic', {'avm,fritzbox-4040',
'openmesh,a42', 'openmesh,a62'}) then
table.insert(try_files, 1, '/sys/class/net/eth0/address')
elseif platform.match('ipq806x', 'generic', {'netgear,r7800'}) then
table.insert(try_files, 1, '/sys/class/net/eth1/address')
elseif platform.match('mpc85xx', 'p1020', {'aerohive,hiveap-330'}) then
table.insert(try_files, 1, '/sys/class/net/eth0/address')
elseif platform.match('mpc85xx', 'p1020', {'ocedo,panda'}) then
table.insert(try_files, 1, '/sys/class/net/eth1/address')
elseif platform.match('ramips', 'mt7620', {'miwifi-mini', 'tplink,c2-v1', 'c20-v1', 'c20i', 'c50'}) then
table.insert(try_files, 1, '/sys/class/net/eth0/address')
elseif platform.match('ramips', 'mt7621', {'dir-860l-b1'}) then
table.insert(try_files, 1, '/sys/class/ieee80211/phy1/macaddress')
end
for _, file in ipairs(try_files) do
local addr = util.readfile(file)
if addr then
sysconfig.primary_mac = util.trim(addr)
break
end
end
error('no primary MAC address found')

View File

@ -7,11 +7,11 @@ local M = setmetatable({}, {
})
function M.match(target, subtarget, boards)
if M.get_target() ~= target then
if target and M.get_target() ~= target then
return false
end
if M.get_subtarget() ~= subtarget then
if subtarget and M.get_subtarget() ~= subtarget then
return false
end