luci-base: rpc: add call to enumerate builtin ethernet ports
Add a new luci/getBuiltinEthernetPorts RPC call which returns a consolidated list of known ethernet ports found in `/etc/board.json`. Add an x86/64 specific workaround which attempts to enumerate missing ethernet devices too. Ref: #6534, #6538 Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
parent
727c0895a4
commit
98e37433e7
1 changed files with 44 additions and 1 deletions
|
@ -8,7 +8,7 @@ import { cursor } from 'uci';
|
|||
|
||||
import { init_list, init_index, init_enabled, init_action, conntrack_list, process_list } from 'luci.sys';
|
||||
import { revision, branch } from 'luci.version';
|
||||
import { statvfs } from 'luci.core';
|
||||
import { statvfs, uname } from 'luci.core';
|
||||
|
||||
import timezones from 'luci.zoneinfo';
|
||||
|
||||
|
@ -538,6 +538,49 @@ const methods = {
|
|||
call: function() {
|
||||
return { result: process_list() };
|
||||
}
|
||||
},
|
||||
|
||||
getBuiltinEthernetPorts: {
|
||||
call: function() {
|
||||
let fd = open('/etc/board.json', 'r');
|
||||
let board = fd ? json(fd) : {};
|
||||
let ports = [];
|
||||
|
||||
for (let k in [ 'lan', 'wan' ]) {
|
||||
if (!board?.network?.[k])
|
||||
continue;
|
||||
|
||||
if (type(board.network[k].ports) == 'array') {
|
||||
for (let ifname in board.network[k].ports) {
|
||||
push(ports, { role: k, device: ifname });
|
||||
}
|
||||
}
|
||||
else if (type(board.network[k].device) == 'string') {
|
||||
push(ports, { role: k, device: board.network[k].device });
|
||||
}
|
||||
}
|
||||
|
||||
/* Workaround for targets that do not enumerate all netdevs in board.json */
|
||||
if (uname().machine in [ 'x86_64' ] &&
|
||||
match(ports[0]?.device, /^eth\d+$/)) {
|
||||
let bus = readlink(`/sys/class/net/${ports[0].device}/device/subsystem`);
|
||||
|
||||
for (let netdev in lsdir('/sys/class/net')) {
|
||||
if (!match(netdev, /^eth\d+$/))
|
||||
continue;
|
||||
|
||||
if (length(filter(ports, port => port.device == netdev)))
|
||||
continue;
|
||||
|
||||
if (readlink(`/sys/class/net/${netdev}/device/subsystem`) != bus)
|
||||
continue;
|
||||
|
||||
push(ports, { role: 'unknown', device: netdev });
|
||||
}
|
||||
}
|
||||
|
||||
return { result: ports };
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue