From 8d5022cdfd10d10a7c6214f7882ca3466fc2d04a Mon Sep 17 00:00:00 2001 From: gSpot Date: Wed, 3 Nov 2021 19:11:15 +0300 Subject: [PATCH] Fixed init status --- README.md | 12 +++--- luci-app-internet-detector/Makefile | 2 +- .../resources/view/internet-detector.js | 39 +++++++++++++----- .../po/ru/internet-detector.po | 7 +++- .../po/templates/internet-detector.pot | 5 ++- .../acl.d/luci-app-internet-detector.json | 3 +- ...luci-app-internet-detector_0.3.0-1_all.ipk | Bin 5543 -> 0 bytes ...luci-app-internet-detector_0.3.0-2_all.ipk | Bin 0 -> 5602 bytes ...-i18n-internet-detector-ru_0.3.0-1_all.ipk | Bin 2914 -> 0 bytes ...-i18n-internet-detector-ru_0.3.0-2_all.ipk | Bin 0 -> 2981 bytes 10 files changed, 46 insertions(+), 22 deletions(-) delete mode 100644 packages/19.07/luci-app-internet-detector_0.3.0-1_all.ipk create mode 100644 packages/19.07/luci-app-internet-detector_0.3.0-2_all.ipk delete mode 100644 packages/19.07/luci-i18n-internet-detector-ru_0.3.0-1_all.ipk create mode 100644 packages/19.07/luci-i18n-internet-detector-ru_0.3.0-2_all.ipk diff --git a/README.md b/README.md index bde7dd4..fd31dc8 100644 --- a/README.md +++ b/README.md @@ -11,16 +11,16 @@ Dependences: lua, luci-lib-nixio, libuci-lua opkg install /tmp/internet-detector_0.3.0-1_all.ipk rm /tmp/internet-detector_0.3.0-1_all.ipk - wget --no-check-certificate -O /tmp/luci-app-internet-detector_0.3.0-1_all.ipk https://github.com/gSpotx2f/luci-app-internet-detector/raw/master/packages/19.07/luci-app-internet-detector_0.3.0-1_all.ipk - opkg install /tmp/luci-app-internet-detector_0.3.0-1_all.ipk - rm /tmp/luci-app-internet-detector_0.3.0-1_all.ipk + wget --no-check-certificate -O /tmp/luci-app-internet-detector_0.3.0-2_all.ipk https://github.com/gSpotx2f/luci-app-internet-detector/raw/master/packages/19.07/luci-app-internet-detector_0.3.0-2_all.ipk + opkg install /tmp/luci-app-internet-detector_0.3.0-2_all.ipk + rm /tmp/luci-app-internet-detector_0.3.0-2_all.ipk /etc/init.d/rpcd reload **i18n-ru:** - wget --no-check-certificate -O /tmp/luci-i18n-internet-detector-ru_0.3.0-1_all.ipk https://github.com/gSpotx2f/luci-app-internet-detector/raw/master/packages/19.07/luci-i18n-internet-detector-ru_0.3.0-1_all.ipk - opkg install /tmp/luci-i18n-internet-detector-ru_0.3.0-1_all.ipk - rm /tmp/luci-i18n-internet-detector-ru_0.3.0-1_all.ipk + wget --no-check-certificate -O /tmp/luci-i18n-internet-detector-ru_0.3.0-2_all.ipk https://github.com/gSpotx2f/luci-app-internet-detector/raw/master/packages/19.07/luci-i18n-internet-detector-ru_0.3.0-2_all.ipk + opkg install /tmp/luci-i18n-internet-detector-ru_0.3.0-2_all.ipk + rm /tmp/luci-i18n-internet-detector-ru_0.3.0-2_all.ipk **Script for LED control:** diff --git a/luci-app-internet-detector/Makefile b/luci-app-internet-detector/Makefile index 9a80e67..0f5458d 100644 --- a/luci-app-internet-detector/Makefile +++ b/luci-app-internet-detector/Makefile @@ -5,7 +5,7 @@ include $(TOPDIR)/rules.mk PKG_VERSION:=0.3.0 -PKG_RELEASE:=1 +PKG_RELEASE:=2 LUCI_TITLE:=LuCI support for internet-detector LUCI_DEPENDS:=+internet-detector LUCI_PKGARCH:=all diff --git a/luci-app-internet-detector/htdocs/luci-static/resources/view/internet-detector.js b/luci-app-internet-detector/htdocs/luci-static/resources/view/internet-detector.js index c31c130..faa000f 100644 --- a/luci-app-internet-detector/htdocs/luci-static/resources/view/internet-detector.js +++ b/luci-app-internet-detector/htdocs/luci-static/resources/view/internet-detector.js @@ -11,7 +11,6 @@ const btnStyleApply = 'btn cbi-button-apply'; return L.view.extend({ execPath : '/usr/bin/internet-detector', - initPath : '/etc/init.d/internet-detector', upScriptPath : '/etc/internet-detector/up-script', downScriptPath : '/etc/internet-detector/down-script', runScriptPath : '/etc/internet-detector/run-script', @@ -30,6 +29,26 @@ return L.view.extend({ uiCheckIntervalDown : null, currentAppMode : '0', + callInitStatus: rpc.declare({ + object: 'luci', + method: 'getInitList', + params: [ 'name' ], + expect: { '': {} } + }), + + getInitStatus: function() { + return this.callInitStatus('internet-detector').then(res => { + if(res) { + return res['internet-detector'].enabled; + } else { + throw _('Command failed'); + } + }).catch(e => { + ui.addNotification(null, + E('p', _('Failed to get %s init status: %s').format('internet-detector', e))); + }); + }, + callInitAction: rpc.declare({ object: 'luci', method: 'setInitAction', @@ -45,7 +64,7 @@ return L.view.extend({ return true; }).catch(e => { ui.addNotification(null, - E('p', _('Failed to execute "%s %s": %s').format(this.initPath, action, e))); + E('p', _('Service action failed "%s %s": %s').format('internet-detector', action, e))); }); }, @@ -191,27 +210,27 @@ return L.view.extend({ 'click': ui.createHandlerFn(this.ctx, this.ctx.serviceRestart), }, _('Restart')); this.ctx.initButton = E('button', { - 'class': (this.ctx.initStatus === 1) ? btnStyleDisabled : btnStyleEnabled, + 'class': (!this.ctx.initStatus) ? btnStyleDisabled : btnStyleEnabled, 'click': ui.createHandlerFn(this, () => { return this.ctx.handleServiceAction( - (this.ctx.initStatus === 1) ? 'enable' : 'disable' + (!this.ctx.initStatus) ? 'enable' : 'disable' ).then(success => { if(!success) { return; }; - if(this.ctx.initStatus === 1) { + if(!this.ctx.initStatus) { this.ctx.initButton.textContent = _('Enabled'); this.ctx.initButton.className = btnStyleEnabled; - this.ctx.initStatus = 0; + this.ctx.initStatus = true; } else { this.ctx.initButton.textContent = _('Disabled'); this.ctx.initButton.className = btnStyleDisabled; - this.ctx.initStatus = 1; + this.ctx.initStatus = false; }; }); }), - }, (this.ctx.initStatus == 1) ? _('Disabled') : _('Enabled')); + }, (!this.ctx.initStatus) ? _('Disabled') : _('Enabled')); this.ctx.setInternetStatus(true); @@ -316,7 +335,7 @@ return L.view.extend({ load: function() { return Promise.all([ fs.exec(this.execPath, [ 'status' ]), - fs.exec(this.initPath, [ 'enabled' ]), + this.getInitStatus(), uci.load('internet-detector'), ]).catch(e => { ui.addNotification(null, E('p', _('An error has occurred') + ': %s'.format(e.message))); @@ -328,7 +347,7 @@ return L.view.extend({ return; }; this.appStatus = (data[0].code === 0) ? data[0].stdout.trim() : null; - this.initStatus = data[1].code; + this.initStatus = data[1]; this.currentAppMode = uci.get('internet-detector', 'config', 'mode'); this.uiCheckIntervalUp = Number(uci.get('internet-detector', 'config', 'ui_interval_up')); this.uiCheckIntervalDown = Number(uci.get('internet-detector', 'config', 'ui_interval_down')); diff --git a/luci-app-internet-detector/po/ru/internet-detector.po b/luci-app-internet-detector/po/ru/internet-detector.po index de47677..0d1a469 100644 --- a/luci-app-internet-detector/po/ru/internet-detector.po +++ b/luci-app-internet-detector/po/ru/internet-detector.po @@ -93,8 +93,8 @@ msgstr "Выполнение команд при подключении к Ин msgid "Execute commands when the Internet is disconnected" msgstr "Выполнение команд при отключении от Интернет" -msgid "Failed to execute \"%s %s\": %s" -msgstr "Не удалось выполнить \"%s %s\": %s" +msgid "Failed to get %s init status: %s" +msgstr "Не удалось получить статус инициализации %s: %s" msgid "Host availability check type" msgstr "Тип проверки доступности хоста" @@ -156,6 +156,9 @@ msgstr "Сохранить" msgid "Service" msgstr "Служба" +msgid "Service action failed \"%s %s\": %s" +msgstr "Не удалось выполнить действие службы \"%s %s\": %s" + msgid "Service configuration" msgstr "Конфигурация службы" diff --git a/luci-app-internet-detector/po/templates/internet-detector.pot b/luci-app-internet-detector/po/templates/internet-detector.pot index d858368..ad584b7 100644 --- a/luci-app-internet-detector/po/templates/internet-detector.pot +++ b/luci-app-internet-detector/po/templates/internet-detector.pot @@ -82,7 +82,7 @@ msgstr "" msgid "Execute commands when the Internet is disconnected" msgstr "" -msgid "Failed to execute \"%s %s\": %s" +msgid "Failed to get %s init status: %s" msgstr "" msgid "Host availability check type" @@ -142,6 +142,9 @@ msgstr "" msgid "Service" msgstr "" +msgid "Service action failed \"%s %s\": %s" +msgstr "" + msgid "Service configuration" msgstr "" diff --git a/luci-app-internet-detector/root/usr/share/rpcd/acl.d/luci-app-internet-detector.json b/luci-app-internet-detector/root/usr/share/rpcd/acl.d/luci-app-internet-detector.json index f1f486f..cf1da28 100644 --- a/luci-app-internet-detector/root/usr/share/rpcd/acl.d/luci-app-internet-detector.json +++ b/luci-app-internet-detector/root/usr/share/rpcd/acl.d/luci-app-internet-detector.json @@ -6,12 +6,11 @@ "/etc/internet-detector/up-script": [ "read" ], "/etc/internet-detector/down-script": [ "read" ], "/etc/internet-detector/run-script": [ "read" ], - "/etc/init.d/internet-detector": [ "exec" ], "/usr/bin/internet-detector*": [ "exec" ] }, "uci": [ "internet-detector" ], "ubus": { - "luci": [ "setInitAction" ] + "luci": [ "getInitList", "setInitAction" ] } }, "write": { diff --git a/packages/19.07/luci-app-internet-detector_0.3.0-1_all.ipk b/packages/19.07/luci-app-internet-detector_0.3.0-1_all.ipk deleted file mode 100644 index a5ca034222ac3f557de1ea0894cc1ec09f6f3a3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5543 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