luci-mod-status,-network: remove checkUfpInstalled

Right now, the checkUfpInstalled RPC call is performed first, and only after
that can the other Promises be called. Simplify this by adding a single check
for /usr/sbin/ufpd in the rpcd ucode, and replace calls to checkUfpInstalled()
with simple L.hasSystemFeature('ufpd') check (which is only done once, and
cached).

This also allows the 'stat' permission to be removed from a couple of acls.

Signed-off-by: David Härdeman <david@hardeman.nu>
This commit is contained in:
David Härdeman
2025-10-15 15:07:32 +02:00
committed by Paul Donald
parent 3ed815fe4a
commit 50abd15e88
8 changed files with 36 additions and 81 deletions

View File

@@ -16,12 +16,6 @@ var callUfpList = rpc.declare({
method: 'fingerprint',
});
var checkUfpInstalled = rpc.declare({
object: 'file',
method: 'stat',
params: [ 'path' ]
});
return baseclass.extend({
title: '',
@@ -30,17 +24,11 @@ return baseclass.extend({
load: function() {
return Promise.all([
checkUfpInstalled('/usr/sbin/ufpd')
]).then(data => {
var promises = [
callLuciDHCPLeases(),
network.getHostHints(),
data[0].type === 'file' ? callUfpList() : null,
L.resolveDefault(uci.load('dhcp'))
];
return Promise.all(promises);
});
callLuciDHCPLeases(),
network.getHostHints(),
L.hasSystemFeature('ufpd') ? callUfpList() : null,
L.resolveDefault(uci.load('dhcp'))
]);
},
handleCreateStaticLease: function(lease, ev) {

View File

@@ -11,12 +11,6 @@ const callNetworkInterfaceDump = rpc.declare({
expect: { interface: [] }
});
const checkUfpInstalled = rpc.declare({
object: 'file',
method: 'stat',
params: [ 'path' ]
});
const callUfpList = rpc.declare({
object: 'fingerprint',
method: 'fingerprint',
@@ -44,19 +38,15 @@ function applyMask(addr, mask, v6) {
return view.extend({
load() {
return Promise.all([
checkUfpInstalled('/usr/sbin/ufpd')
]).then(([ufpcheck]) => {
return Promise.all([
callNetworkInterfaceDump(),
L.resolveDefault(fs.exec('/sbin/ip', [ '-4', 'neigh', 'show' ]), {}),
L.resolveDefault(fs.exec('/sbin/ip', [ '-4', 'route', 'show', 'table', 'all' ]), {}),
L.resolveDefault(fs.exec('/sbin/ip', [ '-4', 'rule', 'show' ]), {}),
L.resolveDefault(fs.exec('/sbin/ip', [ '-6', 'neigh', 'show' ]), {}),
L.resolveDefault(fs.exec('/sbin/ip', [ '-6', 'route', 'show', 'table', 'all' ]), {}),
L.resolveDefault(fs.exec('/sbin/ip', [ '-6', 'rule', 'show' ]), {}),
ufpcheck?.type === 'file' ? callUfpList() : null
]);
});
callNetworkInterfaceDump(),
L.resolveDefault(fs.exec('/sbin/ip', [ '-4', 'neigh', 'show' ]), {}),
L.resolveDefault(fs.exec('/sbin/ip', [ '-4', 'route', 'show', 'table', 'all' ]), {}),
L.resolveDefault(fs.exec('/sbin/ip', [ '-4', 'rule', 'show' ]), {}),
L.resolveDefault(fs.exec('/sbin/ip', [ '-6', 'neigh', 'show' ]), {}),
L.resolveDefault(fs.exec('/sbin/ip', [ '-6', 'route', 'show', 'table', 'all' ]), {}),
L.resolveDefault(fs.exec('/sbin/ip', [ '-6', 'rule', 'show' ]), {}),
L.hasSystemFeature('ufpd') ? callUfpList() : null
]);
},
getNetworkByDevice(networks, dev, addr, mask, v6) {

View File

@@ -12,12 +12,6 @@ const callNetworkInterfaceDump = rpc.declare({
expect: { interface: [] }
});
const checkUfpInstalled = rpc.declare({
object: 'file',
method: 'stat',
params: [ 'path' ]
});
const callUfpList = rpc.declare({
object: 'fingerprint',
method: 'fingerprint',
@@ -45,19 +39,15 @@ function applyMask(addr, mask, v6) {
return view.extend({
load() {
return Promise.all([
checkUfpInstalled('/usr/sbin/ufpd')
]).then(([ufpcheck]) => {
return Promise.all([
callNetworkInterfaceDump(),
L.resolveDefault(fs.exec('/sbin/ip', [ '-4', '-j', 'neigh', 'show' ]), {}),
L.resolveDefault(fs.exec('/sbin/ip', [ '-4', '-j', 'route', 'show', 'table', 'all' ]), {}),
L.resolveDefault(fs.exec('/sbin/ip', [ '-4', '-j', 'rule', 'show' ]), {}),
L.resolveDefault(fs.exec('/sbin/ip', [ '-6', '-j', 'neigh', 'show' ]), {}),
L.resolveDefault(fs.exec('/sbin/ip', [ '-6', '-j', 'route', 'show', 'table', 'all' ]), {}),
L.resolveDefault(fs.exec('/sbin/ip', [ '-6', '-j', 'rule', 'show' ]), {}),
ufpcheck?.type === 'file' ? callUfpList() : null,
]);
});
callNetworkInterfaceDump(),
L.resolveDefault(fs.exec('/sbin/ip', [ '-4', '-j', 'neigh', 'show' ]), {}),
L.resolveDefault(fs.exec('/sbin/ip', [ '-4', '-j', 'route', 'show', 'table', 'all' ]), {}),
L.resolveDefault(fs.exec('/sbin/ip', [ '-4', '-j', 'rule', 'show' ]), {}),
L.resolveDefault(fs.exec('/sbin/ip', [ '-6', '-j', 'neigh', 'show' ]), {}),
L.resolveDefault(fs.exec('/sbin/ip', [ '-6', '-j', 'route', 'show', 'table', 'all' ]), {}),
L.resolveDefault(fs.exec('/sbin/ip', [ '-6', '-j', 'rule', 'show' ]), {}),
L.hasSystemFeature('ufpd') ? callUfpList() : null,
]);
},
getNetworkByDevice(networks, dev, addr, mask, v6) {

View File

@@ -34,8 +34,7 @@
"read": {
"ubus": {
"luci-rpc": [ "getDHCPLeases" ],
"fingerprint": [ "fingerprint" ],
"file": [ "stat" ]
"fingerprint": [ "fingerprint" ]
}
}
},

View File

@@ -49,7 +49,7 @@
"/sbin/ip -[46] rule show": [ "exec" ]
},
"ubus": {
"file": [ "exec", "stat" ],
"file": [ "exec" ],
"fingerprint": [ "fingerprint" ]
}
}
@@ -64,7 +64,7 @@
"/sbin/ip -[46] -j rule show": [ "exec" ]
},
"ubus": {
"file": [ "exec", "stat" ],
"file": [ "exec" ],
"fingerprint": [ "fingerprint" ]
}
}