From 113e2c0217a956259ba32aee4023b76d0fa10412 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Thu, 12 Sep 2019 14:13:08 +0200 Subject: [PATCH] luci-mod-system: reimplent system/startup as client side view Signed-off-by: Jo-Philipp Wich --- .../resources/view/system/startup.js | 92 ++++++++++++++++ .../luasrc/controller/admin/system.lua | 2 +- .../luasrc/model/cbi/admin_system/startup.lua | 104 ------------------ 3 files changed, 93 insertions(+), 105 deletions(-) create mode 100644 modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js delete mode 100644 modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua diff --git a/modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js new file mode 100644 index 000000000..d083403cc --- /dev/null +++ b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js @@ -0,0 +1,92 @@ +'use strict'; +'require rpc'; + +return L.view.extend({ + callInitList: rpc.declare({ + object: 'luci', + method: 'getInitList', + expect: { '': {} } + }), + + callInitAction: rpc.declare({ + object: 'luci', + method: 'setInitAction', + params: [ 'name', 'action' ], + expect: { result: false } + }), + + load: function() { + return this.callInitList(); + }, + + handleAction: function(name, action, ev) { + return this.callInitAction(name, action).then(function(success) { + if (success != true) { + L.ui.addNotification(null, E('p', _('Failed to execute "/etc/init.d/%s %s" action').format(name, action))); + return Promise.reject(false); + } + + return true; + }).catch(function() { + L.ui.addNotification(null, E('p', _('Connection failure while executing "/etc/init.d/%s %s" action').format(name, action))); + return Promise.reject(false); + }); + }, + + handleEnableDisable: function(name, isEnabled, ev) { + return this.handleAction(name, isEnabled ? 'disable' : 'enable', ev).then(L.bind(function(name, isEnabled, cell) { + L.dom.content(cell, this.renderEnableDisable({ + name: name, + enabled: isEnabled + })); + }, this, name, !isEnabled, ev.currentTarget.parentNode)); + }, + + renderEnableDisable: function(init) { + return E('button', { + class: 'btn cbi-button-%s'.format(init.enabled ? 'positive' : 'negative'), + click: L.ui.createHandlerFn(this, 'handleEnableDisable', init.name, init.enabled) + }, init.enabled ? _('Enabled') : _('Disabled')); + }, + + render: function(initList) { + var table = E('div', { 'class': 'table' }, [ + E('div', { 'class': 'tr table-titles' }, [ + E('div', { 'class': 'th' }, _('Start priority')), + E('div', { 'class': 'th' }, _('Initscript')), + E('div', { 'class': 'th' }, _('Enable/Disable')), + E('div', { 'class': 'th' }, _('Start')), + E('div', { 'class': 'th' }, _('Restart')), + E('div', { 'class': 'th' }, _('Stop')) + ]) + ]); + + var rows = [], list = []; + + for (var init in initList) + if (initList[init].index < 100) + list.push(Object.assign({ name: init }, initList[init])); + + list.sort(function(a, b) { + if (a.index != b.index) + return a.index - b.index + + return a.name > b.name; + }); + + for (var i = 0; i < list.length; i++) { + rows.push([ + '%02d'.format(list[i].index), + list[i].name, + this.renderEnableDisable(list[i]), + E('button', { 'class': 'btn cbi-button-action', 'click': L.ui.createHandlerFn(this, 'handleAction', list[i].name, 'start') }, _('Start')), + E('button', { 'class': 'btn cbi-button-action', 'click': L.ui.createHandlerFn(this, 'handleAction', list[i].name, 'restart') }, _('Restart')), + E('button', { 'class': 'btn cbi-button-action', 'click': L.ui.createHandlerFn(this, 'handleAction', list[i].name, 'stop') }, _('Stop')) + ]); + } + + cbi_update_table(table, rows); + + return table; + } +}); diff --git a/modules/luci-mod-system/luasrc/controller/admin/system.lua b/modules/luci-mod-system/luasrc/controller/admin/system.lua index d73a1cbdb..c3e3678fd 100644 --- a/modules/luci-mod-system/luasrc/controller/admin/system.lua +++ b/modules/luci-mod-system/luasrc/controller/admin/system.lua @@ -21,7 +21,7 @@ function index() entry({"admin", "system", "admin", "sshkeys", "json"}, post_on({ keys = true }, "action_sshkeys")) end - entry({"admin", "system", "startup"}, form("admin_system/startup"), _("Startup"), 45) + entry({"admin", "system", "startup"}, view("system/startup"), _("Startup"), 45) entry({"admin", "system", "crontab"}, form("admin_system/crontab"), _("Scheduled Tasks"), 46) if fs.access("/sbin/block") and fs.access("/etc/config/fstab") then diff --git a/modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua b/modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua deleted file mode 100644 index 99ddb0970..000000000 --- a/modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua +++ /dev/null @@ -1,104 +0,0 @@ --- Copyright 2008 Steven Barth --- Copyright 2010-2012 Jo-Philipp Wich --- Copyright 2010 Manuel Munz --- Licensed to the public under the Apache License 2.0. - -local fs = require "nixio.fs" -local sys = require "luci.sys" - -local inits = { } -local handled = false - -for _, name in ipairs(sys.init.names()) do - local index = sys.init.index(name) - local enabled = sys.init.enabled(name) - - if index < 255 then - inits["%02i.%s" % { index, name }] = { - name = name, - index = tostring(index), - enabled = enabled - } - end -end - - -m = SimpleForm("initmgr", translate("Initscripts"), translate("You can enable or disable installed init scripts here. Changes will applied after a device reboot.
Warning: If you disable essential init scripts like \"network\", your device might become inaccessible!")) -m.reset = false -m.submit = false - - -s = m:section(Table, inits) - -i = s:option(DummyValue, "index", translate("Start priority")) -n = s:option(DummyValue, "name", translate("Initscript")) - - -e = s:option(Button, "endisable", translate("Enable/Disable")) - -e.render = function(self, section, scope) - if inits[section].enabled then - self.title = translate("Enabled") - self.inputstyle = "save" - else - self.title = translate("Disabled") - self.inputstyle = "reset" - end - - Button.render(self, section, scope) -end - -e.write = function(self, section) - if inits[section].enabled then - handled = true - inits[section].enabled = false - return sys.init.disable(inits[section].name) - else - handled = true - inits[section].enabled = true - return sys.init.enable(inits[section].name) - end -end - - -start = s:option(Button, "start", translate("Start")) -start.inputstyle = "apply" -start.write = function(self, section) - handled = true - sys.call("/etc/init.d/%s %s >/dev/null" %{ inits[section].name, self.option }) -end - -restart = s:option(Button, "restart", translate("Restart")) -restart.inputstyle = "reload" -restart.write = start.write - -stop = s:option(Button, "stop", translate("Stop")) -stop.inputstyle = "remove" -stop.write = start.write - - - -f = SimpleForm("rc", translate("Local Startup"), - translate("This is the content of /etc/rc.local. Insert your own commands here (in front of 'exit 0') to execute them at the end of the boot process.")) - -t = f:field(TextValue, "rcs") -t.forcewrite = true -t.rmempty = true -t.rows = 20 - -function t.cfgvalue() - return fs.readfile("/etc/rc.local") or "" -end - -function f.handle(self, state, data) - if not handled and state == FORM_VALID then - if data.rcs then - fs.writefile("/etc/rc.local", data.rcs:gsub("\r\n", "\n")) - else - fs.writefile("/etc/rc.local", "") - end - end - return true -end - -return m, f -- 2.25.1