From 09d5a38a1fd85334030613696273e0828b94796b Mon Sep 17 00:00:00 2001 From: Karl Palsson Date: Mon, 18 Oct 2021 13:04:00 +0000 Subject: [PATCH] widgets: add a re-useable filtered logread view 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 app-nextdns: fix Logs title Minor typo, introduced in 625abbf (convert simple controllers to menu.json) Signed-off-by: Karl Palsson luci-base: implement shared log reader view Closes #5452 Signed-off-by: Paul Donald (cherry picked from commit c5a65a839713ab7ac70e6a6b5a7331593f67a9a0) --- .../resources/view/adblock/logread.js | 41 +---------------- .../resources/view/banip/processing_log.js | 41 +---------------- .../resources/view/nextdns/logread.js | 45 +------------------ .../share/luci/menu.d/luci-app-nextdns.json | 2 +- .../resources/view/travelmate/logread.js | 42 +---------------- .../luci-static/resources/tools/views.js | 45 +++++++++++++++++++ 6 files changed, 54 insertions(+), 162 deletions(-) create mode 100644 modules/luci-base/htdocs/luci-static/resources/tools/views.js diff --git a/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js b/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js index 4dc2a2e533..89b8b393f7 100644 --- a/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js +++ b/applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/logread.js @@ -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"); \ No newline at end of file diff --git a/applications/luci-app-banip/htdocs/luci-static/resources/view/banip/processing_log.js b/applications/luci-app-banip/htdocs/luci-static/resources/view/banip/processing_log.js index b6aaabe9f9..9d2e1654d7 100644 --- a/applications/luci-app-banip/htdocs/luci-static/resources/view/banip/processing_log.js +++ b/applications/luci-app-banip/htdocs/luci-static/resources/view/banip/processing_log.js @@ -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"); diff --git a/applications/luci-app-nextdns/htdocs/luci-static/resources/view/nextdns/logread.js b/applications/luci-app-nextdns/htdocs/luci-static/resources/view/nextdns/logread.js index 0ad4a79825..13b22476f7 100644 --- a/applications/luci-app-nextdns/htdocs/luci-static/resources/view/nextdns/logread.js +++ b/applications/luci-app-nextdns/htdocs/luci-static/resources/view/nextdns/logread.js @@ -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"); diff --git a/applications/luci-app-nextdns/root/usr/share/luci/menu.d/luci-app-nextdns.json b/applications/luci-app-nextdns/root/usr/share/luci/menu.d/luci-app-nextdns.json index fb9cb7e3fb..a27de0c075 100644 --- a/applications/luci-app-nextdns/root/usr/share/luci/menu.d/luci-app-nextdns.json +++ b/applications/luci-app-nextdns/root/usr/share/luci/menu.d/luci-app-nextdns.json @@ -21,7 +21,7 @@ }, "admin/services/nextdns/log": { - "title": "Configuration", + "title": "Logs", "order": 2, "action": { "type": "view", diff --git a/applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/logread.js b/applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/logread.js index d004ed4d2f..fc9323aa14 100644 --- a/applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/logread.js +++ b/applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/logread.js @@ -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"); diff --git a/modules/luci-base/htdocs/luci-static/resources/tools/views.js b/modules/luci-base/htdocs/luci-static/resources/tools/views.js new file mode 100644 index 0000000000..f851f61dff --- /dev/null +++ b/modules/luci-base/htdocs/luci-static/resources/tools/views.js @@ -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, +}); -- 2.30.2