From 03eac5f427cd3ee03255d0faad958ec61a80c051 Mon Sep 17 00:00:00 2001 From: gSpot Date: Fri, 26 Mar 2021 23:49:38 +0300 Subject: [PATCH] luci-app: Code fixes, updated log --- autoinstall/autoinstall.sh | 2 +- luci-app-ruantiblock/Makefile | 2 +- .../{baselog.js => abstract-log.js} | 496 ++++++++++-------- .../resources/view/ruantiblock/log.js | 12 +- .../resources/view/ruantiblock/service.js | 2 - .../resources/view/ruantiblock/tools.js | 52 +- luci-app-ruantiblock/po/ru/ruantiblock.po | 9 + .../po/templates/ruantiblock.pot | 12 + .../luci-app-ruantiblock_0.9.0-4_all.ipk | Bin 13849 -> 0 bytes .../luci-app-ruantiblock_0.9.0-5_all.ipk | Bin 0 -> 14050 bytes .../luci-i18n-ruantiblock-ru_0.9.0-4_all.ipk | Bin 4513 -> 0 bytes .../luci-i18n-ruantiblock-ru_0.9.0-5_all.ipk | Bin 0 -> 4539 bytes .../19.07/ruantiblock-mod-lua_0.9.0-2_all.ipk | Bin 6728 -> 6732 bytes .../19.07/ruantiblock-mod-py_0.9.0-2_all.ipk | Bin 5766 -> 5768 bytes .../files/usr/bin/ruab_parser.lua | 4 +- .../files/usr/bin/ruab_parser.py | 2 +- 16 files changed, 333 insertions(+), 260 deletions(-) rename luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/{baselog.js => abstract-log.js} (81%) delete mode 100644 packages/19.07/luci-app-ruantiblock_0.9.0-4_all.ipk create mode 100644 packages/19.07/luci-app-ruantiblock_0.9.0-5_all.ipk delete mode 100644 packages/19.07/luci-i18n-ruantiblock-ru_0.9.0-4_all.ipk create mode 100644 packages/19.07/luci-i18n-ruantiblock-ru_0.9.0-5_all.ipk diff --git a/autoinstall/autoinstall.sh b/autoinstall/autoinstall.sh index 7a061ba..88c2338 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-4" +RUAB_LUCI_APP_VERSION="0.9.0-5" 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 833340a..6c6a7d5 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:=4 +PKG_RELEASE:=5 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/abstract-log.js similarity index 81% rename from luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/baselog.js rename to luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/abstract-log.js index f6b13cf..b4d08da 100644 --- a/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/baselog.js +++ b/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/abstract-log.js @@ -1,217 +1,7 @@ 'use strict'; 'require ui'; -return L.Class.extend({ - view: L.view.extend({ - viewName: null, - - title: null, - - logFacilities: [ - 'kern', - 'user', - 'mail', - 'daemon', - 'auth', - 'syslog', - 'lpr', - 'news', - ], - - logLevels: { - 'emerg': E('span', { 'class': 'zonebadge log-emerg' }, E('strong', _('Emergency'))), - 'alert': E('span', { 'class': 'zonebadge log-alert' }, E('strong', _('Alert'))), - 'crit': E('span', { 'class': 'zonebadge log-crit' }, E('strong', _('Critical'))), - 'err': E('span', { 'class': 'zonebadge log-err' }, E('strong', _('Error'))), - 'warn': E('span', { 'class': 'zonebadge log-warn' }, E('strong', _('Warning'))), - 'notice': E('span', { 'class': 'zonebadge log-notice' }, E('strong', _('Notice'))), - 'info': E('span', { 'class': 'zonebadge log-info' }, E('strong', _('Info'))), - 'debug': E('span', { 'class': 'zonebadge log-debug' }, E('strong', _('Debug'))), - }, - - tailValue: 25, - - logSortingValue: 'asc', - - logLevelsStat: {}, - - logLevelsDropdown: null, - - totalLogLines: 0, - - htmlEntities: function(str) { - return String(str).replace( - /&/g, '&').replace( - //g, '>').replace( - /"/g, '"').replace( - /'/g, '''); - }, - - /** - * - * @param {number} tail - * @returns {string} - * Returns the raw content of the log - * - */ - getLogData: function(tail) { - throw new Error('getLogData needs to be reloaded in subclass'); - }, - - /** - * - * @param {string} logdata - * @param {number} tail - * @returns {Array} - * Returns an array of values: [ #, Timestamp, Level, Facility, Message ] - * - */ - parseLogData: function(logdata, tail) { - 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' }); - - for(let level of Object.keys(this.logLevels)) { - this.logLevelsStat[level] = 0; - }; - - if(logdataArray.length > 0) { - lines = []; - logdataArray.forEach((e, i) => { - 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]}
` : '') + - `
` - ); - }); - lines = lines.join(''); - - logTable.append( - E('div', { 'class': 'tr table-titles' }, [ - E('div', { 'class': 'th left log-entry-number' }, '#'), - (logdataArray[0][1]) ? E('div', { 'class': 'th left log-entry-time' }, _('Timestamp')) : '', - (logdataArray[0][2]) ? E('div', { 'class': 'th left log-entry-log-level' }, _('Level')) : '', - (logdataArray[0][3]) ? E('div', { 'class': 'th left log-entry-facility' }, _('Facility')) : '', - (logdataArray[0][4]) ? E('div', { 'class': 'th left log-entry-message' }, _('Message')) : '', - ]) - ); - }; - - try { - logTable.insertAdjacentHTML('beforeend', lines); - } catch(err) { - if(err.name === 'SyntaxError') { - ui.addNotification(null, - E('p', {}, _('HTML/XML error') + ': ' + err.message), 'error'); - }; - throw err; - }; - - let levelsStatString = ''; - if((Object.values(this.logLevelsStat).reduce((s,c) => s + c, 0)) > 0) { - Object.entries(this.logLevelsStat).forEach(e => { - if(e[0] in this.logLevels && e[1] > 0) { - levelsStatString += `${e[1]}`; - }; - }); - }; - - return E([ - E('div', { 'class': 'log-entries-count' }, - `${_('Entries')}: ${logdataArray.length} / ${this.totalLogLines}${levelsStatString}` - ), - logTable - ]); - }, - - 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 + '.log', - 'href': URL.createObjectURL( - new Blob([ logdata ], { type: 'text/plain' })), - }); - link.click(); - URL.revokeObjectURL(link.href); - }).catch(() => { - ui.addNotification(null, - E('p', {}, _('Download error') + ': ' + err.message)); - }).finally(() => { - formElems.forEach(e => e.disabled = false); - }); - }, - - load: function() { - - // Restoring settings from localStorage - let tailValueLocal = localStorage.getItem(`luci-app-${this.viewName}-tailValue`); - if(tailValueLocal) { - this.tailValue = Number(tailValueLocal); - }; - let logSortingLocal = localStorage.getItem(`luci-app-${this.viewName}-logSorting`); - if(logSortingLocal) { - this.logSortingValue = logSortingLocal; - }; - - return this.getLogData(this.tailValue); - }, - - render: function(logdata) { - - document.head.append(E('style', {'type': 'text/css'}, +document.head.append(E('style', {'type': 'text/css'}, ` .log-entry-empty { } @@ -221,6 +11,13 @@ return L.Class.extend({ .log-entry-time { min-width: 14em !important; } +.log-entry-host { + min-width: 10em !important; +} +.log-entry-host-cell { + word-break: break-all !important; + word-wrap: break-word !important; +} .log-entry-log-level { max-width: 5em !important; } @@ -291,9 +88,234 @@ log-emerg td { border: 1px solid #ccc; font-weight: normal; } -` - )); +.log-host-dropdown-item { +} +`)); +return L.Class.extend({ + view: L.view.extend({ + viewName: null, + + title: null, + + logLevels: { + 'emerg': E('span', { 'class': 'zonebadge log-emerg' }, E('strong', _('Emergency'))), + 'alert': E('span', { 'class': 'zonebadge log-alert' }, E('strong', _('Alert'))), + 'crit': E('span', { 'class': 'zonebadge log-crit' }, E('strong', _('Critical'))), + 'err': E('span', { 'class': 'zonebadge log-err' }, E('strong', _('Error'))), + 'warn': E('span', { 'class': 'zonebadge log-warn' }, E('strong', _('Warning'))), + 'notice': E('span', { 'class': 'zonebadge log-notice' }, E('strong', _('Notice'))), + 'info': E('span', { 'class': 'zonebadge log-info' }, E('strong', _('Info'))), + 'debug': E('span', { 'class': 'zonebadge log-debug' }, E('strong', _('Debug'))), + }, + + tailValue: 25, + + logSortingValue: 'asc', + + logLevelsStat: {}, + + logHosts: {}, + + logHostsDropdown: null, + + logLevelsDropdown: null, + + totalLogLines: 0, + + htmlEntities: function(str) { + return String(str).replace( + /&/g, '&').replace( + //g, '>').replace( + /"/g, '"').replace( + /'/g, '''); + }, + + makelogHostsDropdownItem: function(host) { + return E( + 'span', + { 'class': 'zonebadge log-host-dropdown-item' }, + E('strong', host) + ); + }, + + /** + * + * @param {number} tail + * @returns {string} + * Returns the raw content of the log + * + */ + getLogData: function(tail) { + throw new Error('getLogData must be overridden by a subclass'); + }, + + /** + * + * @param {string} logdata + * @param {number} tail + * @returns {Array} + * Returns an array of values: [ #, Timestamp, Host, Level, Facility, Message ] + * + */ + parseLogData: function(logdata, tail) { + throw new Error('parseLogData must be overridden by a subclass'); + }, + + setHostFilter: function(cArr) { + let logHostsKeys = Object.keys(this.logHosts); + if(logHostsKeys.length > 0) { + let selectedHosts = this.logHostsDropdown.getValue(); + this.logHostsDropdown.addChoices(Object.keys(this.logHosts), this.logHosts); + if(selectedHosts.length === 0 || logHostsKeys.length === selectedHosts.length) { + return cArr; + }; + return cArr.filter(e => selectedHosts.includes(e[2])); + }; + return cArr; + }, + + setLevelFilter: function(cArr) { + let logLevelsKeys = Object.keys(this.logLevels); + if(logLevelsKeys.length > 0) { + let selectedLevels = this.logLevelsDropdown.getValue(); + if(selectedLevels.length === 0 || logLevelsKeys.length === selectedLevels.length) { + return cArr; + }; + return cArr.filter(e => selectedLevels.includes(e[3])); + }; + 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[5] !== null && regExp.test(e[5])) { + e[5] = e[5].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' }); + + for(let level of Object.keys(this.logLevels)) { + this.logLevelsStat[level] = 0; + }; + + if(logdataArray.length > 0) { + lines = []; + logdataArray.forEach((e, i) => { + if(e[3] in this.logLevels) { + this.logLevelsStat[e[3]] = this.logLevelsStat[e[3]] + 1; + }; + + lines.push( + `
${e[0]}
` + + ((e[1]) ? `
${e[1]}
` : '') + + ((e[2]) ? `
${e[2]}
` : '') + + ((e[3]) ? `
${e[3]}
` : '') + + ((e[4]) ? `
${e[4]}
` : '') + + ((e[5]) ? `
${e[5]}
` : '') + + `
` + ); + }); + lines = lines.join(''); + + logTable.append( + E('div', { 'class': 'tr table-titles' }, [ + E('div', { 'class': 'th left log-entry-number' }, '#'), + (logdataArray[0][1]) ? E('div', { 'class': 'th left log-entry-time' }, _('Timestamp')) : '', + (logdataArray[0][2]) ? E('div', { 'class': 'th left log-entry-host' }, _('Host')) : '', + (logdataArray[0][3]) ? E('div', { 'class': 'th left log-entry-log-level' }, _('Level')) : '', + (logdataArray[0][4]) ? E('div', { 'class': 'th left log-entry-facility' }, _('Facility')) : '', + (logdataArray[0][5]) ? E('div', { 'class': 'th left log-entry-message' }, _('Message')) : '', + ]) + ); + }; + + try { + logTable.insertAdjacentHTML('beforeend', lines); + } catch(err) { + if(err.name === 'SyntaxError') { + ui.addNotification(null, + E('p', {}, _('HTML/XML error') + ': ' + err.message), 'error'); + }; + throw err; + }; + + let levelsStatString = ''; + if((Object.values(this.logLevelsStat).reduce((s,c) => s + c, 0)) > 0) { + Object.entries(this.logLevelsStat).forEach(e => { + if(e[0] in this.logLevels && e[1] > 0) { + levelsStatString += `${e[1]}`; + }; + }); + }; + + return E([ + E('div', { 'class': 'log-entries-count' }, + `${_('Entries')}: ${logdataArray.length} / ${this.totalLogLines}${levelsStatString}` + ), + logTable + ]); + }, + + 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 + '.log', + 'href': URL.createObjectURL( + new Blob([ logdata ], { type: 'text/plain' })), + }); + link.click(); + URL.revokeObjectURL(link.href); + }).catch(() => { + ui.addNotification(null, + E('p', {}, _('Download error') + ': ' + err.message)); + }).finally(() => { + formElems.forEach(e => e.disabled = false); + }); + }, + + load: function() { + // Restoring settings from localStorage + let tailValueLocal = localStorage.getItem(`luci-app-${this.viewName}-tailValue`); + if(tailValueLocal) { + this.tailValue = Number(tailValueLocal); + }; + let logSortingLocal = localStorage.getItem(`luci-app-${this.viewName}-logSorting`); + if(logSortingLocal) { + this.logSortingValue = logSortingLocal; + }; + + return this.getLogData(this.tailValue); + }, + + render: function(logdata) { let logWrapper = E('div', { 'id': 'logWrapper', 'style': 'width:100%; min-height:20em; padding: 0 0 0 45px; font-size:0.9em !important' @@ -324,6 +346,31 @@ log-emerg td { 'style': 'max-width:4em !important', }); + let logHostsDropdownElem = ''; + let logHostsKeys = Object.keys(this.logHosts); + if(logHostsKeys.length > 0) { + this.logHostsDropdown = new ui.Dropdown( + null, + this.logHosts, + { + id: 'logHostsDropdown', + multiple: true, + select_placeholder: _('All'), + } + ); + logHostsDropdownElem = E( + 'div', { 'class': 'cbi-value' }, [ + E('label', { + 'class': 'cbi-value-title', + 'for': 'logHostsDropdown', + }, _('Hosts')), + E('div', { 'class': 'cbi-value-field' }, + this.logHostsDropdown.render() + ), + ] + ); + }; + let logLevelsDropdownElem = ''; let logLevelsKeys = Object.keys(this.logLevels); if(logLevelsKeys.length > 0) { @@ -335,8 +382,6 @@ log-emerg td { sort: logLevelsKeys, multiple: true, select_placeholder: _('All'), - display_items: 3, - dropdown_items: -1, } ); logLevelsDropdownElem = E( @@ -405,6 +450,7 @@ log-emerg td { ]), ]), + logHostsDropdownElem, logLevelsDropdownElem, E('div', { 'class': 'cbi-value' }, [ @@ -427,7 +473,7 @@ log-emerg td { E('label', { 'class': 'cbi-value-title', 'for': 'logFilter', - }), + }, _('Refresh log')), E('div', { 'class': 'cbi-value-field' }, [ logFormSubmitBtn, E('form', { @@ -455,18 +501,18 @@ log-emerg td { let tail = (tailInput.value && tailInput.value > 0) ? tailInput.value : 0 return this.getLogData(tail).then(logdata => { logdata = logdata || ''; - - let loglines = this.makeLogArea( - this.setRegexpFilter( - this.setLevelFilter( - this.parseLogData(logdata, tail) + logWrapper.innerHTML = ''; + logWrapper.append( + this.makeLogArea( + this.setRegexpFilter( + this.setLevelFilter( + this.setHostFilter( + this.parseLogData(logdata, tail) + ) + ) ) ) ); - - logWrapper.innerHTML = ''; - logWrapper.append(loglines); - }).finally(() => { formElems.forEach(e => e.disabled = false); logDownloadBtn.disabled = false; 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 ad21c26..f3be49d 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,9 +1,9 @@ 'require fs'; 'require ui'; -'require view.log.baselog as baselog'; +'require view.log.abstract-log as abc'; 'require view.ruantiblock.tools as tools'; -return baselog.view.extend({ +return abc.view.extend({ viewName: 'ruantiblock', title: _('Ruantiblock') + ' - ' + _('Log'), @@ -22,6 +22,7 @@ return baselog.view.extend({ return [ lineNum, // # (Number) strArray.slice(0, 5).join(' '), // Timestamp (String) + null, // Host (String) logLevel[1], // Level (String) logLevel[0], // Facility (String) this.htmlEntities(strArray.slice(6).join(' ')), // Message (String) @@ -30,9 +31,14 @@ return baselog.view.extend({ // syslog-ng syslog_ngHandler: function(strArray, lineNum) { + if(!(strArray[3] in this.logHosts)) { + this.logHosts[strArray[3]] = this.makelogHostsDropdownItem(strArray[3]); + }; + return [ lineNum, // # (Number) strArray.slice(0, 3).join(' '), // Timestamp (String) + strArray[3], // Host (String) null, // Level (String) null, // Facility (String) this.htmlEntities(strArray.slice(4).join(' ')), // Message (String) @@ -48,7 +54,7 @@ return baselog.view.extend({ if(logger) { return fs.exec_direct(logger, [ '-e', tools.app_name ]).catch(err => { - ui.addNotification(null, E('p', {}, _('Unable to load log data: ' + err.message))); + ui.addNotification(null, E('p', {}, _('Unable to load log data:') + ' ' + err.message)); return ''; }); }; diff --git a/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/service.js b/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/service.js index b215abc..25730f2 100644 --- a/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/service.js +++ b/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/service.js @@ -250,8 +250,6 @@ return L.view.extend({ let proxy_local_clients = (typeof(section) === 'object') ? section.proxy_local_clients : null; status_token_value = (Array.isArray(status_array)) ? tools.normalize_value(status_array[4]) : null; - document.head.append(E('style', {'type': 'text/css'}, tools.css)); - let status_string = E('div', { 'id': 'status', 'name': 'status', diff --git a/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/tools.js b/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/tools.js index 671498a..48444c4 100644 --- a/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/tools.js +++ b/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/tools.js @@ -2,30 +2,8 @@ 'require fs'; 'require ui'; -return L.Class.extend({ - app_name: 'ruantiblock', - exec_path: '/usr/bin/ruantiblock', - init_path: '/etc/init.d/ruantiblock', - token_file: '/var/run/ruantiblock.token', - parsers_dir: '/usr/bin', - torrc_file: '/etc/tor/torrc', - user_entries_file: '/etc/ruantiblock/user_entries', - fqdn_filter_file: '/etc/ruantiblock/fqdn_filter', - ip_filter_file: '/etc/ruantiblock/ip_filter', - crontab_file: '/etc/crontabs/root', - info_label_starting: '' + _('Starting') + '', - info_label_running: '' + _('Enabled') + '', - info_label_updating: '' + _('Updating') + '', - info_label_stopped: '' + _('Disabled') + '', - info_label_error: '' + _('Error') + '', - - blacklist_sources: { - 'rublacklist': 'https://rublacklist.net', - 'zapret-info': 'https://github.com/zapret-info/z-i', - 'antifilter': 'https://antifilter.download', - }, - - css: ` +document.head.append(E('style', {'type': 'text/css'}, +` .label-status { display: inline; margin: 0px 2px 0px 0 !important; @@ -53,7 +31,31 @@ return L.Class.extend({ } .total-proxy { background-color: #ffb937 !important; -}`, +} +`)); + +return L.Class.extend({ + app_name: 'ruantiblock', + exec_path: '/usr/bin/ruantiblock', + init_path: '/etc/init.d/ruantiblock', + token_file: '/var/run/ruantiblock.token', + parsers_dir: '/usr/bin', + torrc_file: '/etc/tor/torrc', + user_entries_file: '/etc/ruantiblock/user_entries', + fqdn_filter_file: '/etc/ruantiblock/fqdn_filter', + ip_filter_file: '/etc/ruantiblock/ip_filter', + crontab_file: '/etc/crontabs/root', + info_label_starting: '' + _('Starting') + '', + info_label_running: '' + _('Enabled') + '', + info_label_updating: '' + _('Updating') + '', + info_label_stopped: '' + _('Disabled') + '', + info_label_error: '' + _('Error') + '', + + blacklist_sources: { + 'rublacklist': 'https://rublacklist.net', + 'zapret-info': 'https://github.com/zapret-info/z-i', + 'antifilter': 'https://antifilter.download', + }, normalize_value: function(v) { return (v && typeof(v) === 'string') ? v.trim().replace(/\r?\n/g, '') : v; diff --git a/luci-app-ruantiblock/po/ru/ruantiblock.po b/luci-app-ruantiblock/po/ru/ruantiblock.po index aac0bc3..da57d17 100644 --- a/luci-app-ruantiblock/po/ru/ruantiblock.po +++ b/luci-app-ruantiblock/po/ru/ruantiblock.po @@ -386,6 +386,12 @@ msgstr "Записи" msgid "Facility" msgstr "Категория" +msgid "Host" +msgstr "Хост" + +msgid "Hosts" +msgstr "Хосты" + msgid "Info" msgstr "Информация" @@ -413,6 +419,9 @@ msgstr "Нет доступных записей..." msgid "Notice" msgstr "Сообщение" +msgid "Refresh log" +msgstr "Обновить лог" + msgid "Sorting entries" msgstr "Сортировка записей" diff --git a/luci-app-ruantiblock/po/templates/ruantiblock.pot b/luci-app-ruantiblock/po/templates/ruantiblock.pot index 069ba5c..f3a858d 100644 --- a/luci-app-ruantiblock/po/templates/ruantiblock.pot +++ b/luci-app-ruantiblock/po/templates/ruantiblock.pot @@ -113,6 +113,9 @@ msgstr "" msgid "Hour" msgstr "" +msgid "Hour" +msgstr "" + msgid "Interval" msgstr "" @@ -356,6 +359,12 @@ msgstr "" msgid "Facility" msgstr "" +msgid "Host" +msgstr "" + +msgid "Hosts" +msgstr "" + msgid "Info" msgstr "" @@ -383,6 +392,9 @@ msgstr "" msgid "Notice" msgstr "" +msgid "Refresh log" +msgstr "" + msgid "Sorting entries" msgstr "" 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 deleted file mode 100644 index 6d91ce6a95db88d9e74d1537c3d0d8523c3e0c07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13849 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 U|N7Uz{=eh@0>Se@b^uTS02q(0;Q#;t literal 0 HcmV?d00001 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 deleted file mode 100644 index 00b3f455418d8f921ac8fc93960a418af8c1bc71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4513 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 Z3l}b2xNzaZg$w^1{{TS8V^07m000{C0ObGx literal 0 HcmV?d00001 diff --git a/packages/19.07/ruantiblock-mod-lua_0.9.0-2_all.ipk b/packages/19.07/ruantiblock-mod-lua_0.9.0-2_all.ipk index 8ab8f73268611db798b7cc37c46e7d2f0db7cf42..971a8b24bb71714a7d89b80a43f76536629ab288 100644 GIT binary patch literal 6732 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 literal 6728 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 GC;$MT>r&+a literal 5766 zcmV;17J2C(iwFP!000001MS&WP#j8^0APXy%LIZ3celaagA7g}xVzhsKyVlW1O|6^ z*8~DVf(CacxVu~ML1u65zHHrx{h#jt*H-1LQ`KG7UDfBI&&xTSTvpZ=_U0}e7WOXY z9v_kZ3BbPy@bUfk`j@}2f8j&o<`op+Mz|Z@)`sWrD z1pcZ2e+Q~4jQ`o79E%-$Yzib?7^-)<)v*40Q^F7kwao^9$o|6Q-fQX0ac9F8lPVV# zH=0JvPrn`O{b-rHcCfNVx&2#yHW~-dG-=yPEVB}yl|)&paB_Lig)b=VVVii|q(wtu zW_I6{8Ey)1ZfZIA`8I28`0>ZHD>5=RHm9n8@+qPYz7TcYzWJu8uN-prYBat(vxxsp%PI+x_VT-jM>KA9J21+jjea znFfQJ!^SpK#QX=H7B=JE0?9$8{#N#3(3j>mzgMZLFmPa6bgKRE@esx|E63&qJ(&sG zd}xv2$9b1;S#%(VJ`^+g3GI^W>J(nQ_6y-b& z){_q3!a#ZiV~gw*y~LRu=vWv$WA%KB8wH+?Sy~34dmldp2G&Yqz{8pPUA>lLCeNPS z6v|gts8G=#AA5SJ)M75-*^q#`AN64N+1yJn$d7E4=7Tdk+@q)CGP?=+Y?Ym^lRVeN#TDr~ zU!aiA0vuu~b+g`s-t1xPTSswpWKVzXRW2rt5y(%5G`RK{uaEfPx~u29u81rGm6Mo( zC(@OL&67CcsKMnA&ztVMuAc(jJlbk?QDmyG`^CwQu0^q#wWkJuRR*Gh+QpaVMQ_!p z#&mE{7Al@KSGNTIetNtaE7mKDhse_VC+=km(U?k z(&mF8;Zd#IO=1}MRQYB&=7Qm2+}siB^pkqz;;aTq!@iym*WU4BbuMK0 zsu3CchF?mU8eo**zHV=1_E}+!@KX{Ce^;GR_+Sz>ei(E^fP!EC&1?WSXk!XY(e!Ax zMgx*Qngd8U$@bgt8#h&(ZGBK=EWV(^XwKZ#e-aXa;9xsURMoMAOZb>|jtn8^nqK?4 zLdw(9OnIMq8xmNH^~4>vlWZ{C?;=ksuspwE!q~^XbZ*IW)7;V8GmeTv3M+N0bz;dT znbnlKx1Z%={*2pZc*K~#MSCjZ!Rh6_1-_&r#3t6MS(Fuh(pi1hxZY?Wd5Vdsx`DUZdln+k3>E^=Mmi5b{bLf9 zsOsGk4Mp5i%D1?9I_*x1{%jSiz4V_QcDF%BZm25BLbpvIp|%Bdn6(>altSkBB$A#l z<_F(Rv=+ESa)ai?XD`%Rl>j0}#? z2q7$N;qfU&T&ya0JnhyZ2ss~-2apldQ}dOQO;-oS^|fZ6-|!9=7G$t{vg|^amX`S3 zuD$FEUObR!kl{5u;zdv+i^p1v4GC58e{Yj0QFIO0)c%p8&E$SzuvXBt z-=I;#h z24`GHP~Sjm_Gb-MjujA;27nzo2wPpJANJ>FOx?b)*?6FuA$)L1whFhz>3#|(2=m}qYDbv=L4LhVU zNpb)xxvr4vP+rg)8ZzAn%HX`qH!>(Q!5Q3V$yGs$oRkOBfTjs4!&C8V3ec0C&zbLX zAckn{`@_Dsy?uCUhSZcWsp7UwTxeNSqnjj6Ih|?j^hJDRth=`yat%@4+L!5S?v~&| zR~IYV1&@wJitnQuiB-&AQoVaq^Dk`DF6hpT3a`*egt5O~W=gC!o52ObTc6#6qNSP*el^;zQiNM?1W4&clBNxmk(>cuqzG$Ex@y`V{Z=3D9hyp5!L zE5pN*E^n;-^^PBDPh|hznF;8!!N0{G7^cIAVYx7OQ{3+&Kw=g3 zhEt@-0dp&8KMdVCk}?POgPWn(ZEpw|vJj(Fd2itRruZ69zyh0{RjNg>6uOQj!AZ)Y zpFSs5#(!9(tm(1&I^R=ObHykmMi}C^;O0QzO{TxK2BlSx3Ocftm*HT+(<|D~fO#gw z*)WjR+>NY}hqWh^h^TBtCA~6pLEE?Px-$k@f%`Oq%D?ft)WfE^J-0-0FYzNCry$uU5DrZ)E54RPjbfli>&~Eit2Ow&P!wcIZr}H; z#IxWR?u1GAwR~1d9b{C$ADky`Ko>2eub?$&;bkaS|4#65{wtC~(gW}JLLimN0?v%w zy1M{rJEdQ5@w#L(;)kumUy_g)Cv z@e=&nS@{+EDn5-oOwYtCqoe{6`}oD4K!_beYijTKd zpO!ns(Wigz1?yySJvBuE21KV)eSVjBcXfKQ3MHLfpsa(w8+QAmSWY1w;7EhD)KpAD z2a5G~r88U>xV^~<$)dLy+LmqaXEe@Y)h{u2DY4!ELXICi)iv|1Acj3n1txmnLtGA)M(&&tHtc3EzhKNEQ?TD_M7TMIi1;@;3J{SVGL43{S{@xx3VgnW zuHCJutg=#VD3QwEiys*1?zmMybX!U6ioo8_b9qs{N~|G1k{R&dhP%)CM-S6H(*6QQLoc3yZtmv z{B2~FNi(rtSL1VLgchS#%Psxn=^1D8{8y_UGd|UDpNZ3!lV>!V>q+Tgway3k9@)8{ zs^j~~#5>S(SqiJ|74L*N?w@<~JYk!xF*2{id*9KJqYiXkzLar`Z*?_^A%3SW#JRXCi>uG1>NL~`N5Bo z?ddI6PU(P<%6khfNX6kH<6}OJd3JQ=p*o=v$UdxO)kf5jw`n%fZciiJF-mL1KPuL? z0oOZ0(=Rhl+uFE;79HthR$~`=uQ-=)8pj&Yx`xyk6GHG`C9D&9{;(=T%S%r0=OtGgMm9V^F5ZWh&#y zN#WyHZ%oR0UZP4poS#Qk+~(|@-LNH}^`25W1}W$xvhDUmCZ@i)@vKvBcVsHok&~h5 z#O&ZSk0O)wxA&X#`XUY&&Sk0>h+P%4``A#;tXx?V=ql zZg@Sj`heF>W?R~)#jl#3sr5h;kKE4>trl4Acd6cR?+^x=+4x=(R2~Y|0*%q1+FDxj zKa28?XrMbcDD6K^)xXYow@C%_tc($>n6K~Uit-P@K{(0mVh17TE2O-h^=d_g$Q7ha zhm*JQ4u=Gy2m7D@gx-=JQD&(t(1onezOA(hYSsRxy_F($=X=kceU6LUps z5bo|$67GK8m!L!rNRYxxm$q+viKtF9o9t1v(cI=aJ=0zKCIn0+`H3M;entvRA^)_wH^DXoq&o0M2o0@p&e7YK~%Ar+r#P@fM-*#YyNHzBl z_3n0aV!=E3dIFGG)hY4~s^*&zF^$#?iCYWYh*Ncg>ev3Vq%k1ewU3QtsGC4FNT)S~ zS7Bq3^6(n~>5e0H-asG*VOe(ac??HuCe=h6}s-R7KLmQ z94#Z+X5tMontZA_ODj=S716K##Lz4OmoLkzzLFP{E64@4Pt(v=3{i|7l~t+FRU2fl zf&Enku|M@L3DcS%Atzrh^TAVSDZ6}IuWFz6qvSr)1Rxkbk0b0l5HQ1sr}16ptA~r+ zfOA2KW=1jpC*9V=sMWxG_Fe(Rl=`|~f@w%MX26fe89u}z*)pN?)2yJ*EO7_oQdkLw zBmTovqN`SHl1e9%$(!ayrssLRlCQ$7<6>2XYzKMVZ^q%;tyP^3{NY~x!xP6eH!1`S+Hu@#RQELqwe8%wjT`>T%W2+$o|OammD=L$_vQQ}s28rn4PY!_2<4yA#}Hk_Ox<;kmNYh>HQsoiq~kIFFyd)}aey$l-;~=n{Nr+MtQIsnIynWx*+% ztYp)vhAGyu<$BAr+7-^bH(C}|prCBs5wj##I{YXc!2pV~Qx8@}Eyuk(c)3*>x5Kl-e^ z9TD%`i*s?*V1P%+z`Vaej4fR9dnJ3{QHoHfb5@C6l#;|_SYKa@gy_&S`VEX|nn?+Y z>1`11>h;#6hc~>@r#9Nr_lu_@^9y^BGPW8(CiFKcCo!v1*EUZ^!=?*B-TqyapolD$r7xk6- zUk7b60!=qu9)#rm5B2{zxh!2>JUv{U{=pXTznK4U1G)MCKL6q85%|;p{df3Z{ojObU*>imIW30kgS1-b}t=F>1f2#j9SPgb|y?Wv|+eBN~7`c>CC1 z0!Wk~e=%HWI>(@M=p7~$nbEX`kKLrMqjoUOu%1@3#p_Iv*)ts# z<$p@uNH9t=z*@10aSp!!v7&xRCD#>ub@K>};5ak*b=etcf^bi%{mP&!HKSiX4~_EM zuIgPXuQ^uNW@Q{g6}$O#C>;ElqtlR8i7J%2y?alyt6_X7le8||qp3ZcOcYYtFJZos zyzzn6Aw9Ebnp2deydBR&&SCUBtwPZea@ail`&80Si>3q7S4o?yUpx6c!PW+t050rm zwq)F|RxM?=E}Sz(B=e|Ik4~`acD8cUMOSMRptDYO@nD*}3yu<4L#PzYWNoTyy7ejk zj+!;KYGFIfyJB@1+YD;w%rH8gZ)mL0)=-$lIlWOUfW50pq#xBy68q zkH#nV1IVCU5-Q<^_V5!AV9wHqHA2samwv(Zym@3LUAz}rfTdCL7qG!?JHBRy9eL`g z7AL1Nqjza>nVI*vHyhGP97AOvzvTh?jkcgrWD9!fJP`rwZs#f|5ad z2qyDY#4+5*cVyxhMhNxaV~TP0S&gJ`4ifW!_9OoB#~*+E@y8#3{PAz`Uttjjy#Ocx E0N9LyBme*a diff --git a/ruantiblock-mod-lua/files/usr/bin/ruab_parser.lua b/ruantiblock-mod-lua/files/usr/bin/ruab_parser.lua index 36b7539..fde97a1 100755 --- a/ruantiblock-mod-lua/files/usr/bin/ruab_parser.lua +++ b/ruantiblock-mod-lua/files/usr/bin/ruab_parser.lua @@ -317,8 +317,8 @@ function BlackListParser:fill_domain_tables(val) end function BlackListParser:sink() - -- Needs to be reloaded in subclass - error("Method BlackListParser:sink() needs to be reloaded in subclass!") + -- Must be overridden by a subclass + error("Method BlackListParser:sink() must be overridden by a subclass!") end function BlackListParser:optimize_ip_table() diff --git a/ruantiblock-mod-py/files/usr/bin/ruab_parser.py b/ruantiblock-mod-py/files/usr/bin/ruab_parser.py index e64652a..240611b 100755 --- a/ruantiblock-mod-py/files/usr/bin/ruab_parser.py +++ b/ruantiblock-mod-py/files/usr/bin/ruab_parser.py @@ -294,7 +294,7 @@ class BlackListParser(Config): raise FieldValueError() def parser_func(self): - """Needs to be reloaded in subclass""" + """Must be overridden by a subclass""" raise NotImplementedError() def _check_sld_masks(self, sld):