luci-mod-status: add ACL entry for storage index

Add missing ACL entry for storage index page.

Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>

luci-mod-status: expand storage index page with mount points

Expand storage index page with mount points. For custom mounts point we
use the device name and we reference the mount point between ().

Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>

luci-mod-status: ensure each storage getMountPoints result is unique

Signed-off-by: Paul Donald <newtwen@gmail.com>

Closes #2767
This commit is contained in:
Christian Marangi 2023-06-15 18:52:55 +02:00 committed by Paul Donald
parent eb6ded749d
commit f1db42e670
2 changed files with 56 additions and 10 deletions

View file

@ -7,6 +7,20 @@ var callSystemInfo = rpc.declare({
method: 'info' method: 'info'
}); });
var callMountPoints = rpc.declare({
object: 'luci',
method: 'getMountPoints',
expect: { result: [] }
});
var MountSkipList = [
"/rom",
"/tmp",
"/dev",
"/overlay",
"/",
]
function progressbar(value, max, byte) { function progressbar(value, max, byte) {
var vn = parseInt(value) || 0, var vn = parseInt(value) || 0,
mn = parseInt(max) || 100, mn = parseInt(max) || 100,
@ -24,27 +38,49 @@ return baseclass.extend({
title: _('Storage'), title: _('Storage'),
load: function() { load: function() {
return L.resolveDefault(callSystemInfo(), {}); return Promise.all([
L.resolveDefault(callSystemInfo(), {}),
L.resolveDefault(callMountPoints(), {}),
]);
}, },
render: function(systeminfo) { render: function(data) {
var root = L.isObject(systeminfo.root) ? systeminfo.root : {}, var systeminfo = data[0],
mounts = data[1],
root = L.isObject(systeminfo.root) ? systeminfo.root : {},
tmp = L.isObject(systeminfo.tmp) ? systeminfo.tmp : {}; tmp = L.isObject(systeminfo.tmp) ? systeminfo.tmp : {};
var fields = []; const existenceChk = function(fields, name, values) {
fields.push(_('Disk space'), root.used*1024, root.total*1024); if (!fields.hasOwnProperty(name))
fields.push(_('Temp space'), tmp.used*1024, tmp.total*1024); fields[name] = values;
};
var fields = {};
existenceChk(fields, _('Disk space'), { used: root.used * 1024, size: root.total * 1024 });
existenceChk(fields, _('Temp space'), { used: tmp.used * 1024, size: tmp.total * 1024 });
for (var i = 0; i < mounts.length; i++) {
var entry = mounts[i];
if (MountSkipList.includes(entry.mount))
continue;
var name = entry.device + ' (' + entry.mount +')',
used = entry.size - entry.free;
existenceChk(fields, name, { used: used, size: entry.size });
}
var table = E('table', { 'class': 'table' }); var table = E('table', { 'class': 'table' });
for (var i = 0; i < fields.length; i += 3) { Object.keys(fields).forEach(function(key) {
table.appendChild(E('tr', { 'class': 'tr' }, [ table.appendChild(E('tr', { 'class': 'tr' }, [
E('td', { 'class': 'td left', 'width': '33%' }, [ fields[i] ]), E('td', { 'class': 'td left', 'width': '33%' }, [ key ]),
E('td', { 'class': 'td left' }, [ E('td', { 'class': 'td left' }, [
(fields[i + 1] != null) ? progressbar(fields[i + 1], fields[i + 2], true) : '?' (fields[key].used != null) ? progressbar(fields[key].used, fields[key].size, true) : '?'
]) ])
])); ]));
} });
return table; return table;
} }

View file

@ -19,6 +19,16 @@
} }
}, },
"luci-mod-status-index-storage": {
"description": "Grant access to Storage and Mount status display",
"read": {
"ubus": {
"luci": [ "getMountPoints" ],
"system": [ "info" ]
}
}
},
"luci-mod-status-index-dhcp": { "luci-mod-status-index-dhcp": {
"description": "Grant access to DHCP status display", "description": "Grant access to DHCP status display",
"read": { "read": {