luci-mod-system: reimplent system/startup as client side view
authorJo-Philipp Wich <jo@mein.io>
Thu, 12 Sep 2019 12:13:08 +0000 (14:13 +0200)
committerJo-Philipp Wich <jo@mein.io>
Thu, 12 Sep 2019 12:16:06 +0000 (14:16 +0200)
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js [new file with mode: 0644]
modules/luci-mod-system/luasrc/controller/admin/system.lua
modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua [deleted file]

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 (file)
index 0000000..d083403
--- /dev/null
@@ -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;
+       }
+});
index d73a1cbdb4cc318df0f6996ff1af757ee5b9020e..c3e3678fd4898f9e79198f942c747dc0d588c663 100644 (file)
@@ -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 (file)
index 99ddb09..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
--- Copyright 2008 Steven Barth <steven@midlink.org>
--- Copyright 2010-2012 Jo-Philipp Wich <jow@openwrt.org>
--- Copyright 2010 Manuel Munz <freifunk at somakoma dot de>
--- 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.<br /><strong>Warning: If you disable essential init scripts like \"network\", your device might become inaccessible!</strong>"))
-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