Skip to content

Commit

Permalink
widgets: add a re-useable filtered logread view
Browse files Browse the repository at this point in the history
Multiple apps introduced their own implementation of a syslog view,
filtered for just their own application logs.  Pull that out as a shared
view.  Some of these had _minor_ style differences, which has been
"standardized" now.  A full "widget" conversion would allow more end app
tuning of that, but is not implemented.

Signed-off-by: Karl Palsson <karlp@etactica.com>

app-nextdns: fix Logs title

Minor typo, introduced in 625abbf (convert simple controllers to
menu.json)

Signed-off-by: Karl Palsson <karlp@etactica.com>

luci-base: implement shared log reader view

Closes #5452

Signed-off-by: Paul Donald <newtwen@gmail.com>
  • Loading branch information
karlp authored and systemcrash committed Mar 17, 2024
1 parent 97ebdcb commit c5a65a8
Show file tree
Hide file tree
Showing 6 changed files with 54 additions and 162 deletions.
Original file line number Diff line number Diff line change
@@ -1,41 +1,4 @@
'use strict';
'require view';
'require poll';
'require fs';
'require tools.views as views';

return view.extend({
load: function() {
return Promise.all([
L.resolveDefault(fs.stat('/sbin/logread'), null),
L.resolveDefault(fs.stat('/usr/sbin/logread'), null)
]);
},
render: function(stat) {
var logger = stat[0] ? stat[0].path : stat[1] ? stat[1].path : null;
poll.add(function() {
return L.resolveDefault(fs.exec_direct(logger, ['-e', 'adblock-'])).then(function(res) {
var log = document.getElementById("logfile");
if (res) {
log.value = res.trim();
} else {
log.value = _('No adblock related logs yet!');
}
log.scrollTop = log.scrollHeight;
});
});
return E('div', { class: 'cbi-map' },
E('div', { class: 'cbi-section' }, [
E('div', { class: 'cbi-section-descr' }, _('The syslog output, pre-filtered for adblock related messages only.')),
E('textarea', {
'id': 'logfile',
'style': 'width: 100% !important; padding: 5px; font-family: monospace',
'readonly': 'readonly',
'wrap': 'off',
'rows': 25
})
]));
},
handleSaveApply: null,
handleSave: null,
handleReset: null
});
return views.LogreadBox("adblock-", "adblock");
Original file line number Diff line number Diff line change
@@ -1,41 +1,4 @@
'use strict';
'require view';
'require poll';
'require fs';
'require tools.views as views';

return view.extend({
load: function () {
return Promise.all([
L.resolveDefault(fs.stat('/sbin/logread'), null),
L.resolveDefault(fs.stat('/usr/sbin/logread'), null)
]);
},
render: function (stat) {
var logger = stat[0] ? stat[0].path : stat[1] ? stat[1].path : null;
poll.add(function () {
return L.resolveDefault(fs.exec_direct(logger, ['-e', 'banIP-'])).then(function (res) {
var log = document.getElementById("logfile");
if (res) {
log.value = res.trim();
} else {
log.value = _('No banIP related processing logs yet!');
}
log.scrollTop = log.scrollHeight;
});
});
return E('div', { class: 'cbi-map' },
E('div', { class: 'cbi-section' }, [
E('div', { class: 'cbi-section-descr' }, _('The syslog output, prefiltered for banIP-related processing log entries only.')),
E('textarea', {
'id': 'logfile',
'style': 'width: 100% !important; padding: 5px; font-family: monospace',
'readonly': 'readonly',
'wrap': 'off',
'rows': 25
})
]));
},
handleSaveApply: null,
handleSave: null,
handleReset: null
});
return views.LogreadBox("banIP-", "banIP");
Original file line number Diff line number Diff line change
@@ -1,45 +1,4 @@
'use strict';
'require view';
'require poll';
'require fs';
'require tools.views as views';

return view.extend({
render: function() {
poll.add(function() {
return L.resolveDefault(fs.exec('/sbin/logread', ['-e', 'nextdns']), { code: 1 })
.then(function(res) {
var content;
if (res.code === 0)
content = res.stdout.trim();
if (!content)
content = _('No nextdns related logs yet!');
var view = document.getElementById("view_id");
view.value = content;
view.scrollTop = view.scrollHeight;
});
});
return E('div', { class: 'cbi-map' },
E('div', { class: 'cbi-section' }, [
E('div', { class: 'cbi-section-descr' },
_('The syslog output, pre-filtered for nextdns related messages only.')),
E('textarea', {
id: 'view_id',
readonly: 'readonly',
wrap: 'off',
style: 'width: 100% !important;\
height: 450px !important;\
border: 1px solid #cccccc;\
padding: 5px;\
font-size: 12px;\
font-family: monospace;\
resize: none;\
pointer-events: auto;\
cursor: auto;'
})
])
);
},
handleSaveApply: null,
handleSave: null,
handleReset: null
});
return views.LogreadBox("nextdns", "nextdns");
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
},

"admin/services/nextdns/log": {
"title": "Configuration",
"title": "Logs",
"order": 2,
"action": {
"type": "view",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,42 +1,4 @@
'use strict';
'require view';
'require poll';
'require fs';
'require tools.views as views';

return view.extend({
load: function() {
return Promise.all([
L.resolveDefault(fs.stat('/sbin/logread'), null),
L.resolveDefault(fs.stat('/usr/sbin/logread'), null)
]);
},
render: function(stat) {
var logger = stat[0] ? stat[0].path : stat[1] ? stat[1].path : null;
poll.add(function() {
return L.resolveDefault(fs.exec_direct(logger, ['-e', 'trm-'])).then(function(res) {
var log = document.getElementById("logfile");
if (res) {
log.value = res.trim();
}
else {
log.value = _('No travelmate related logs yet!');
}
log.scrollTop = log.scrollHeight;
});
});
return E('div', { class: 'cbi-map' },
E('div', { class: 'cbi-section' }, [
E('div', { class: 'cbi-section-descr' }, _('The syslog output, pre-filtered for travelmate related messages only.')),
E('textarea', {
'id': 'logfile',
'style': 'width: 100% !important; padding: 5px; font-family: monospace',
'readonly': 'readonly',
'wrap': 'off',
'rows': 25
})
]));
},
handleSaveApply: null,
handleSave: null,
handleReset: null
});
return views.LogreadBox("trm-", "travelmate");
45 changes: 45 additions & 0 deletions modules/luci-base/htdocs/luci-static/resources/tools/views.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
'use strict';
'require fs';

var CBILogreadBox = function(logtag, name) {
return L.view.extend({
load: function() {
return Promise.all([
L.resolveDefault(fs.stat('/sbin/logread'), null),
L.resolveDefault(fs.stat('/usr/sbin/logread'), null)
]);
},
render: function(stat) {
var logger = stat[0] ? stat[0].path : stat[1] ? stat[1].path : null;
L.Poll.add(function() {
return L.resolveDefault(fs.exec_direct(logger, ['-e', logtag])).then(function(res) {
var log = document.getElementById("logfile");
if (res) {
log.value = res.trim();
} else {
log.value = _('No related logs yet!');
}
log.scrollTop = log.scrollHeight;
});
});
return E('div', { class: 'cbi-map' },
E('div', { class: 'cbi-section' }, [
E('div', { class: 'cbi-section-descr' }, _('The syslog output, pre-filtered for messages related to: ' + name)),
E('textarea', {
'id': 'logfile',
'style': 'width: 100% !important; padding: 5px; font-family: monospace',
'readonly': 'readonly',
'wrap': 'off',
'rows': 25
})
]));
},
handleSaveApply: null,
handleSave: null,
handleReset: null
});
};

return L.Class.extend({
LogreadBox: CBILogreadBox,
});

0 comments on commit c5a65a8

Please sign in to comment.