luci-base: consolidate network.js data acquisition

The new luci-rpc/getNetworkDevices procedure offers netdev enumeration
with included IPv4 and IPv6 address information as well as 64bit traffic
counters, so we can remove the calls to network.device/status and
luci/getIfaddrs now as we're able to obtain all info from a single source.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
Jo-Philipp Wich 2019-10-31 15:01:26 +01:00
parent cc1cbdaf32
commit 6e633b3ed2
3 changed files with 45 additions and 89 deletions

View File

@ -56,12 +56,6 @@ var callLuciWirelessDevices = rpc.declare({
expect: { '': {} }
});
var callLuciIfaddrs = rpc.declare({
object: 'luci',
method: 'getIfaddrs',
expect: { result: [] }
});
var callLuciBoardJSON = rpc.declare({
object: 'luci-rpc',
method: 'getBoardJSON'
@ -94,12 +88,6 @@ var callNetworkInterfaceDump = rpc.declare({
expect: { 'interface': [] }
});
var callNetworkDeviceStatus = rpc.declare({
object: 'network.device',
method: 'status',
expect: { '': {} }
});
var callNetworkProtoHandlers = rpc.declare({
object: 'network',
method: 'get_proto_handlers',
@ -361,9 +349,7 @@ function initNetworkState(refresh) {
if (_state == null || refresh) {
_init = _init || Promise.all([
L.resolveDefault(callNetworkInterfaceDump(), []),
L.resolveDefault(callNetworkDeviceStatus(), {}),
L.resolveDefault(callLuciBoardJSON(), {}),
L.resolveDefault(callLuciIfaddrs(), []),
L.resolveDefault(callLuciNetworkDevices(), {}),
L.resolveDefault(callLuciWirelessDevices(), {}),
L.resolveDefault(callLuciHostHints(), {}),
@ -371,95 +357,72 @@ function initNetworkState(refresh) {
uci.load(['network', 'wireless', 'luci'])
]).then(function(data) {
var netifd_ifaces = data[0],
netifd_devs = data[1],
board_json = data[2],
luci_ifaddrs = data[3],
luci_devs = data[4];
board_json = data[1],
luci_devs = data[2];
var s = {
isTunnel: {}, isBridge: {}, isSwitch: {}, isWifi: {},
ifaces: netifd_ifaces, radios: data[5], hosts: data[6],
ifaces: netifd_ifaces, radios: data[3], hosts: data[4],
netdevs: {}, bridges: {}, switches: {}
};
for (var i = 0, a; (a = luci_ifaddrs[i]) != null; i++) {
var name = a.name.replace(/:.+$/, '');
for (var name in luci_devs) {
var dev = luci_devs[name];
if (isVirtualIfname(name))
s.isTunnel[name] = true;
if (s.isTunnel[name] || !(isIgnoredIfname(name) || isVirtualIfname(name))) {
s.netdevs[name] = s.netdevs[name] || {
idx: a.ifindex || i,
name: name,
rawname: a.name,
flags: [],
ipaddrs: [],
ip6addrs: []
};
if (a.family == 'packet') {
s.netdevs[name].flags = a.flags;
s.netdevs[name].stats = a.data;
if (a.addr != null && a.addr != '00:00:00:00:00:00' && a.addr.length == 17)
s.netdevs[name].macaddr = a.addr;
}
else if (a.family == 'inet') {
s.netdevs[name].ipaddrs.push(a.addr + '/' + a.netmask);
}
else if (a.family == 'inet6') {
s.netdevs[name].ip6addrs.push(a.addr + '/' + a.netmask);
}
}
}
/* override getifaddr() stats with netifd device status stats as
the former are limited to 32bit counters only */
for (var devname in netifd_devs) {
if (!s.netdevs.hasOwnProperty(devname))
if (!s.isTunnel[name] && isIgnoredIfname(name))
continue;
if (!L.isObject(netifd_devs[devname]))
continue;
s.netdevs[name] = s.netdevs[name] || {
idx: dev.ifindex,
name: name,
rawname: name,
flags: dev.flags,
stats: dev.stats,
macaddr: dev.mac,
type: dev.type,
mtu: dev.mtu,
qlen: dev.qlen,
ipaddrs: [],
ip6addrs: []
};
s.netdevs[devname].stats = Object.assign({},
s.netdevs[devname].stats, netifd_devs[devname].statistics);
if (Array.isArray(dev.ipaddrs))
for (var i = 0; i < dev.ipaddrs.length; i++)
s.netdevs[name].ipaddrs.push(dev.ipaddrs[i].address + '/' + dev.ipaddrs[i].netmask);
if (Array.isArray(dev.ip6addrs))
for (var i = 0; i < dev.ip6addrs.length; i++)
s.netdevs[name].ip6addrs.push(dev.ip6addrs[i].address + '/' + dev.ip6addrs[i].netmask);
}
for (var devname in luci_devs) {
var dev = luci_devs[devname];
for (var name in luci_devs) {
var dev = luci_devs[name];
if (dev.bridge) {
var b = {
name: devname,
id: dev.id,
stp: dev.stp,
ifnames: []
};
if (!dev.bridge)
continue;
for (var i = 0; dev.ports && i < dev.ports.length; i++) {
var subdev = s.netdevs[dev.ports[i]];
var b = {
name: name,
id: dev.id,
stp: dev.stp,
ifnames: []
};
if (subdev == null)
continue;
for (var i = 0; dev.ports && i < dev.ports.length; i++) {
var subdev = s.netdevs[dev.ports[i]];
b.ifnames.push(subdev);
subdev.bridge = b;
}
if (subdev == null)
continue;
s.bridges[devname] = b;
s.isBridge[devname] = true;
b.ifnames.push(subdev);
subdev.bridge = b;
}
if (s.netdevs.hasOwnProperty(devname)) {
Object.assign(s.netdevs[devname], {
macaddr: dev.mac,
type: dev.type,
mtu: dev.mtu,
qlen: dev.qlen
});
}
s.bridges[name] = b;
s.isBridge[name] = true;
}
if (L.isObject(board_json.switch)) {

View File

@ -160,12 +160,6 @@ local methods = {
end
},
getIfaddrs = {
call = function()
return { result = nixio.getifaddrs() }
end
},
getDUIDHints = {
call = function()
local fp = io.open('/var/hosts/odhcpd')

View File

@ -41,9 +41,8 @@
"ubus": {
"file": [ "list", "read", "stat" ],
"iwinfo": [ "assoclist", "freqlist", "txpowerlist", "countrylist" ],
"luci": [ "getDUIDHints", "getIfaddrs", "getInitList", "getLocaltime", "getTimezones", "getLEDs", "getUSBDevices", "getSwconfigFeatures", "getSwconfigPortState", "getBlockDevices", "getMountPoints" ],
"luci": [ "getDUIDHints", "getInitList", "getLocaltime", "getTimezones", "getLEDs", "getUSBDevices", "getSwconfigFeatures", "getSwconfigPortState", "getBlockDevices", "getMountPoints" ],
"luci-rpc": [ "getBoardJSON", "getDHCPLeases", "getHostHints", "getNetworkDevices", "getWirelessDevices" ],
"network.device": [ "status" ],
"network.interface": [ "dump" ],
"network": [ "get_proto_handlers" ],
"system": [ "validate_firmware_image" ],