From 399ce9fb7f47d3c392aff328f6837b0836da104e Mon Sep 17 00:00:00 2001 From: gSpot Date: Mon, 15 Mar 2021 21:02:38 +0300 Subject: [PATCH] luci-app: Added support for syslog-ng --- autoinstall/autoinstall.sh | 2 +- luci-app-ruantiblock/Makefile | 2 +- .../resources/view/ruantiblock/baselog.js | 164 ++++++++++-------- .../resources/view/ruantiblock/log.js | 66 +++++-- .../rpcd/acl.d/luci-app-ruantiblock.json | 4 +- .../luci-app-ruantiblock_0.9.0-3_all.ipk | Bin 13591 -> 0 bytes .../luci-app-ruantiblock_0.9.0-4_all.ipk | Bin 0 -> 13849 bytes .../luci-i18n-ruantiblock-ru_0.9.0-3_all.ipk | Bin 4516 -> 0 bytes .../luci-i18n-ruantiblock-ru_0.9.0-4_all.ipk | Bin 0 -> 4513 bytes 9 files changed, 145 insertions(+), 93 deletions(-) delete mode 100644 packages/19.07/luci-app-ruantiblock_0.9.0-3_all.ipk create mode 100644 packages/19.07/luci-app-ruantiblock_0.9.0-4_all.ipk delete mode 100644 packages/19.07/luci-i18n-ruantiblock-ru_0.9.0-3_all.ipk create mode 100644 packages/19.07/luci-i18n-ruantiblock-ru_0.9.0-4_all.ipk diff --git a/autoinstall/autoinstall.sh b/autoinstall/autoinstall.sh index 262c2b2..7a061ba 100755 --- a/autoinstall/autoinstall.sh +++ b/autoinstall/autoinstall.sh @@ -11,7 +11,7 @@ LUCI_APP=1 OWRT_VERSION="19.07" RUAB_VERSION="0.9.0-2" RUAB_MOD_LUA_VERSION="0.9.0-2" -RUAB_LUCI_APP_VERSION="0.9.0-3" +RUAB_LUCI_APP_VERSION="0.9.0-4" BASE_URL="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master" PKG_DIR="/tmp" diff --git a/luci-app-ruantiblock/Makefile b/luci-app-ruantiblock/Makefile index 85c0bbf..833340a 100644 --- a/luci-app-ruantiblock/Makefile +++ b/luci-app-ruantiblock/Makefile @@ -5,7 +5,7 @@ include $(TOPDIR)/rules.mk PKG_VERSION:=0.9.0 -PKG_RELEASE:=3 +PKG_RELEASE:=4 LUCI_TITLE:=LuCI support for ruantiblock LUCI_DEPENDS:=+ruantiblock +luci-mod-admin-full LUCI_PKGARCH:=all diff --git a/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/baselog.js b/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/baselog.js index 76437ba..f6b13cf 100644 --- a/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/baselog.js +++ b/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/baselog.js @@ -44,7 +44,8 @@ return L.Class.extend({ /&/g, '&').replace( //g, '>').replace( - /"/g, '"'); + /"/g, '"').replace( + /'/g, '''); }, /** @@ -70,6 +71,44 @@ return L.Class.extend({ throw new Error('parseLogData needs to be reloaded in subclass'); }, + setLevelFilter: function(cArr) { + let logLevelsKeys = Object.keys(this.logLevels); + if(logLevelsKeys.length > 0) { + let selectedLevels = this.logLevelsDropdown.getValue(); + if(logLevelsKeys.length === selectedLevels.length) { + return cArr; + }; + return cArr.filter(s => selectedLevels.length === 0 || selectedLevels.includes(s[2])); + }; + return cArr; + }, + + setRegexpFilter: function(cArr) { + let fPattern = document.getElementById('logFilter').value; + if(!fPattern) { + return cArr; + }; + let fArr = []; + try { + let regExp = new RegExp(`(${fPattern})`, 'giu'); + cArr.forEach((e, i) => { + if(e[4] !== null && regExp.test(e[4])) { + e[4] = e[4].replace(regExp, '$1'); + fArr.push(e); + }; + }); + } catch(err) { + if(err.name === 'SyntaxError') { + ui.addNotification(null, + E('p', {}, _('Invalid regular expression') + ': ' + err.message)); + return cArr; + } else { + throw err; + }; + }; + return fArr; + }, + makeLogArea: function(logdataArray) { let lines = `
${_('No entries available...')}
`; let logTable = E('div', { 'id': 'logTable', 'class': 'table' }); @@ -81,15 +120,16 @@ return L.Class.extend({ if(logdataArray.length > 0) { lines = []; logdataArray.forEach((e, i) => { - this.logLevelsStat[e[2]] = (this.logLevelsStat[e[2]] != undefined) ? - this.logLevelsStat[e[2]] + 1 : 1; + if(e[2] in this.logLevels) { + this.logLevelsStat[e[2]] = this.logLevelsStat[e[2]] + 1; + }; lines.push( `
${e[0]}
` + ((e[1]) ? `
${e[1]}
` : '') + ((e[2]) ? `
${e[2]}
` : '') + ((e[3]) ? `
${e[3]}
` : '') + - ((e[4]) ? `
${e[4]}
` : '') + + ((e[4]) ? `
${e[4]}
` : '') + `
` ); }); @@ -119,7 +159,7 @@ return L.Class.extend({ let levelsStatString = ''; if((Object.values(this.logLevelsStat).reduce((s,c) => s + c, 0)) > 0) { Object.entries(this.logLevelsStat).forEach(e => { - if(e[1] > 0) { + if(e[0] in this.logLevels && e[1] > 0) { levelsStatString += `${e[1]}`; }; }); @@ -133,52 +173,14 @@ return L.Class.extend({ ]); }, - setLevelFilter: function(cArr) { - let logLevelsKeys = Object.keys(this.logLevels); - if(logLevelsKeys.length > 0) { - let selectedLevels = this.logLevelsDropdown.getValue(); - if(logLevelsKeys.length === selectedLevels.length) { - return cArr; - }; - return cArr.filter(s => selectedLevels.length === 0 || selectedLevels.includes(s[2])); - }; - return cArr; - }, - - setRegexpFilter: function(cArr) { - let fPattern = document.getElementById('logFilter').value; - if(!fPattern) { - return cArr; - }; - let fArr = []; - try { - let regExp = new RegExp(`(${fPattern})`, 'giu'); - cArr.forEach((e, i) => { - if(regExp.test(e[4])) { - e[4] = e[4].replace(regExp, '$1'); - fArr.push(e); - }; - }); - } catch(err) { - if(err.name === 'SyntaxError') { - ui.addNotification(null, - E('p', {}, _('Invalid regular expression') + ': ' + err.message)); - return cArr; - } else { - throw err; - }; - }; - return fArr; - }, - - downloadLog: function() { + downloadLog: function(ev) { let formElems = Array.from(document.forms.logForm.elements); formElems.forEach(e => e.disabled = true); return this.getLogData(0).then(logdata => { logdata = logdata || ''; let link = E('a', { - 'download': this.viewName + '.txt', + 'download': this.viewName + '.log', 'href': URL.createObjectURL( new Blob([ logdata ], { type: 'text/plain' })), }); @@ -228,16 +230,32 @@ return L.Class.extend({ .log-entry-message { min-width: 25em !important; } +.log-entry-message-cell { + overflow-x: hidden !important; + text-overflow: ellipsis !important; +} .log-empty { } .log-emerg { background-color: #a93734 !important; color: #fff; } +log-emerg .td { + color: #fff !important; +} +log-emerg td { + color: #fff !important; +} .log-alert { background-color: #ff7968 !important; color: #fff; } +.log-alert .td { + color: #fff !important; +} +.log-alert td { + color: #fff !important; +} .log-crit { background-color: #fcc3bf !important; } @@ -354,6 +372,7 @@ return L.Class.extend({ let logSorting = E('select', { 'id': 'logSorting', + 'name': 'logSorting', 'form': 'logForm', 'class': "cbi-input-select", }, [ @@ -363,6 +382,8 @@ return L.Class.extend({ logSorting.value = this.logSortingValue; let logDownloadBtn = E('button', { + 'id': 'logDownloadBtn', + 'name': 'logDownloadBtn', 'class': 'cbi-button btn', 'click': ui.createHandlerFn(this, this.downloadLog), }, _('Download log')); @@ -412,7 +433,7 @@ return L.Class.extend({ E('form', { 'id': 'logForm', 'name': 'logForm', - 'style': 'display:inline-block', + 'style': 'display:inline-block; margin-top:0.5em', 'submit': ui.createHandlerFn(this, function(ev) { ev.preventDefault(); let formElems = Array.from(document.forms.logForm.elements); @@ -458,38 +479,33 @@ return L.Class.extend({ ]) ), E('div', { 'class': 'cbi-section fade-in' }, - E('div', { 'class': 'cbi-section-node' }, - E('div', { 'class': 'cbi-value' }, [ - E('div', { 'style': 'position:fixed; z-index:1 !important' }, [ - E('button', { - 'class': 'btn', - 'style': 'position:relative; display:block; margin:0 !important; left:1px; top:1px', - 'click': ev => { - document.getElementById('logTitle').scrollIntoView(true); - ev.target.blur(); - }, - }, '↑'), - E('button', { - 'class': 'btn', - 'style': 'position:relative; display:block; margin:0 !important; margin-top:1px !important; left:1px; top:1px', - 'click': ev => { - logWrapper.scrollIntoView(false); - ev.target.blur(); - }, - }, '↓'), - ]), - logWrapper, - ]) - ) + E('div', { 'class': 'cbi-section-node' }, [ + E('div', { 'style': 'position:fixed; z-index:1 !important' }, [ + E('button', { + 'class': 'btn', + 'style': 'position:relative; display:block; margin:0 !important; left:1px; top:1px', + 'click': ev => { + document.getElementById('logTitle').scrollIntoView(true); + ev.target.blur(); + }, + }, '↑'), + E('button', { + 'class': 'btn', + 'style': 'position:relative; display:block; margin:0 !important; margin-top:1px !important; left:1px; top:1px', + 'click': ev => { + logWrapper.scrollIntoView(false); + ev.target.blur(); + }, + }, '↓'), + ]), + logWrapper, + ]) ), E('div', { 'class': 'cbi-section fade-in' }, E('div', { 'class': 'cbi-section-node' }, E('div', { 'class': 'cbi-value' }, - E('div', { 'style': 'width:100%; text-align:right !important' }, [ - E('hr'), - logDownloadBtn, - ]) - ) + E('div', { 'style': 'width:100%; text-align:right !important' }, logDownloadBtn) + ), ) ), ]); diff --git a/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/log.js b/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/log.js index 7f2d312..ad21c26 100644 --- a/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/log.js +++ b/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/log.js @@ -1,13 +1,44 @@ 'require fs'; 'require ui'; -'require view.ruantiblock.baselog as baselog'; +'require view.log.baselog as baselog'; 'require view.ruantiblock.tools as tools'; return baselog.view.extend({ - viewName: 'ruantiblock-log', + viewName: 'ruantiblock', title: _('Ruantiblock') + ' - ' + _('Log'), + appRegexp: new RegExp(`^.*${tools.app_name}\[[0-9]+\].*$`, 'gm'), + + testRegexp: new RegExp(/([0-9]{2}:){2}[0-9]{2}/), + + isLoggerChecked: false, + + entriesHandler: null, + + // logd + logdHandler: function(strArray, lineNum) { + let logLevel = strArray[5].split('.'); + return [ + lineNum, // # (Number) + strArray.slice(0, 5).join(' '), // Timestamp (String) + logLevel[1], // Level (String) + logLevel[0], // Facility (String) + this.htmlEntities(strArray.slice(6).join(' ')), // Message (String) + ]; + }, + + // syslog-ng + syslog_ngHandler: function(strArray, lineNum) { + return [ + lineNum, // # (Number) + strArray.slice(0, 3).join(' '), // Timestamp (String) + null, // Level (String) + null, // Facility (String) + this.htmlEntities(strArray.slice(4).join(' ')), // Message (String) + ]; + }, + getLogData: function(tail) { return Promise.all([ L.resolveDefault(fs.stat('/sbin/logread'), null), @@ -16,10 +47,8 @@ return baselog.view.extend({ let logger = (stat[0]) ? stat[0].path : (stat[1]) ? stat[1].path : null; if(logger) { - return fs.exec_direct(logger, [ '-e', '^' + tools.app_name ]).catch(err => { - ui.addNotification(null, E('p', _('Unable to execute or read contents') - + ': %s
[ %s ]'.format(err.message, logger) - )); + return fs.exec_direct(logger, [ '-e', tools.app_name ]).catch(err => { + ui.addNotification(null, E('p', {}, _('Unable to load log data: ' + err.message))); return ''; }); }; @@ -31,7 +60,7 @@ return baselog.view.extend({ return []; }; - let strings = logdata.trim().split(/\n/); + let strings = logdata.trim().match(this.appRegexp) || []; if(tail && tail > 0 && strings) { strings = strings.slice(-tail); @@ -41,15 +70,22 @@ return baselog.view.extend({ let entriesArray = strings.map((e, i) => { let strArray = e.split(/\s+/); - let logLevel = strArray[5].split('.'); - return [ - i + 1, // # (Number) - strArray.slice(0, 5).join(' '), // Timestamp (String) - logLevel[1], // Level (String) - logLevel[0], // Facility (String) - this.htmlEntities(strArray.slice(6).join(' ')), // Message (String) - ]; + if(!this.isLoggerChecked) { + /** + * Checking the third field of a line. + * If it contains time then syslog-ng. + */ + if(this.testRegexp.test(strArray[2])) { + this.logLevels = {}; + this.entriesHandler = this.syslog_ngHandler; + } else { + this.entriesHandler = this.logdHandler; + }; + this.isLoggerChecked = true; + }; + + return this.entriesHandler(strArray, i + 1); }); if(this.logSortingValue === 'desc') { diff --git a/luci-app-ruantiblock/root/usr/share/rpcd/acl.d/luci-app-ruantiblock.json b/luci-app-ruantiblock/root/usr/share/rpcd/acl.d/luci-app-ruantiblock.json index 32e0b22..7c239e0 100644 --- a/luci-app-ruantiblock/root/usr/share/rpcd/acl.d/luci-app-ruantiblock.json +++ b/luci-app-ruantiblock/root/usr/share/rpcd/acl.d/luci-app-ruantiblock.json @@ -18,8 +18,8 @@ "/etc/init.d/cron enabled": [ "exec" ], "/etc/init.d/cron enable": [ "exec" ], "/etc/init.d/cron restart": [ "exec" ], - "/sbin/logread -e ^ruantiblock": [ "exec" ], - "/usr/sbin/logread -e ^ruantiblock": [ "exec" ] + "/sbin/logread -e ruantiblock": [ "exec" ], + "/usr/sbin/logread -e ruantiblock": [ "exec" ] }, "uci": [ "network", "ruantiblock" ] }, diff --git a/packages/19.07/luci-app-ruantiblock_0.9.0-3_all.ipk b/packages/19.07/luci-app-ruantiblock_0.9.0-3_all.ipk deleted file mode 100644 index 236617efe1ae19d53d7cba3a5d7a767ed5484f17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13591 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
S@qKa() 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 diff --git a/packages/19.07/luci-app-ruantiblock_0.9.0-4_all.ipk b/packages/19.07/luci-app-ruantiblock_0.9.0-4_all.ipk new file mode 100644 index 0000000000000000000000000000000000000000..6d91ce6a95db88d9e74d1537c3d0d8523c3e0c07 GIT binary patch literal 13849 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 CpY}Zf diff --git a/packages/19.07/luci-i18n-ruantiblock-ru_0.9.0-4_all.ipk b/packages/19.07/luci-i18n-ruantiblock-ru_0.9.0-4_all.ipk new file mode 100644 index 0000000000000000000000000000000000000000..00b3f455418d8f921ac8fc93960a418af8c1bc71 GIT binary patch literal 4513 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