mirror of
https://github.com/openwrt/luci.git
synced 2026-10-12 05:07:26 +04:00
luci-mod-status: resolve named counters in nftables view
The nftables status view rendered the byte/packet badge by reading .bytes/.packets directly off a rule's counter statement. That only holds for anonymous (inline) counters, whose JSON statement is an object. Named counter objects (counter name "<n>") are serialized as a bare name string instead, so .bytes was undefined and the badge showed "undefinedB". Named counters are used in banIP for example. Resolve named counter references against the standalone counter objects of the same family and table before rendering, and skip the badge when a reference cannot be resolved instead of emitting garbage. While at it, replace some withespaces with tabs. Signed-off-by: Dirk Brenken <dev@brenken.org>
This commit is contained in:
1 parent
769cb13c69
commit
40c7188aab
1 file changed
+36
-15
@@ -143,19 +143,34 @@ const action_translations = {
|
||||
};
|
||||
|
||||
return view.extend({
|
||||
|
||||
resolveCounter(data, spec, counter) {
|
||||
if (typeof(counter) == 'object')
|
||||
return counter;
|
||||
|
||||
for (let d of data)
|
||||
if (typeof(d.counter) == 'object' &&
|
||||
d.counter.family == spec.family &&
|
||||
d.counter.table == spec.table &&
|
||||
d.counter.name == counter)
|
||||
return d.counter;
|
||||
|
||||
return null;
|
||||
},
|
||||
|
||||
load() {
|
||||
return Promise.all([
|
||||
L.resolveDefault(fs.exec_direct('/usr/sbin/nft', [ '--terse', '--json', 'list', 'ruleset' ], 'json'), {}),
|
||||
L.resolveDefault(fs.exec_direct('/usr/sbin/nft', ['--terse', '--json', 'list', 'ruleset'], 'json'), {}),
|
||||
fs.stat('/usr/sbin/iptables-legacy-save').then(function() {
|
||||
return L.resolveDefault(fs.exec_direct('/usr/sbin/iptables-legacy-save'), '');
|
||||
}).catch(function() {
|
||||
return L.resolveDefault(fs.exec_direct('/usr/sbin/iptables-save'), '');
|
||||
}),
|
||||
fs.stat('/usr/sbin/ip6tables-legacy-save').then(function() {
|
||||
return L.resolveDefault(fs.exec_direct('/usr/sbin/ip6tables-legacy-save'), '');
|
||||
}).catch(function() {
|
||||
return L.resolveDefault(fs.exec_direct('/usr/sbin/ip6tables-save'), '');
|
||||
})
|
||||
return L.resolveDefault(fs.exec_direct('/usr/sbin/iptables-legacy-save'), '');
|
||||
}).catch(function() {
|
||||
return L.resolveDefault(fs.exec_direct('/usr/sbin/iptables-save'), '');
|
||||
}),
|
||||
fs.stat('/usr/sbin/ip6tables-legacy-save').then(function() {
|
||||
return L.resolveDefault(fs.exec_direct('/usr/sbin/ip6tables-legacy-save'), '');
|
||||
}).catch(function() {
|
||||
return L.resolveDefault(fs.exec_direct('/usr/sbin/ip6tables-save'), '');
|
||||
})
|
||||
]);
|
||||
},
|
||||
|
||||
@@ -582,8 +597,11 @@ return view.extend({
|
||||
empty = false;
|
||||
|
||||
if (typeof(se) == 'object' && se.counter) {
|
||||
row.childNodes[0].appendChild(
|
||||
this.renderCounter(se.counter));
|
||||
const ctr = this.resolveCounter(data, spec, se.counter);
|
||||
|
||||
if (ctr)
|
||||
row.childNodes[0].appendChild(
|
||||
this.renderCounter(ctr));
|
||||
}
|
||||
|
||||
// append each mapped action to the actions column
|
||||
@@ -595,9 +613,12 @@ return view.extend({
|
||||
const res = this.renderExpr(se, spec.table);
|
||||
|
||||
if (typeof(se) == 'object' && se.counter) {
|
||||
row.childNodes[0].insertBefore(
|
||||
this.renderCounter(se.counter),
|
||||
row.childNodes[0].firstChild);
|
||||
const ctr = this.resolveCounter(data, spec, se.counter);
|
||||
|
||||
if (ctr)
|
||||
row.childNodes[0].insertBefore(
|
||||
this.renderCounter(ctr),
|
||||
row.childNodes[0].firstChild);
|
||||
}
|
||||
else if (this.isActionExpression(se)) {
|
||||
dom.append(row.childNodes[1], [ res ]);
|
||||
|
||||
Reference in new issue
Block a user