luci-base, luci-mod-status: convert process status to client side view
authorJo-Philipp Wich <jo@mein.io>
Sun, 3 Nov 2019 19:07:58 +0000 (20:07 +0100)
committerJo-Philipp Wich <jo@mein.io>
Sun, 3 Nov 2019 19:07:58 +0000 (20:07 +0100)
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json
modules/luci-mod-status/htdocs/luci-static/resources/processes.js [new file with mode: 0644]
modules/luci-mod-status/luasrc/controller/admin/status.lua
modules/luci-mod-status/luasrc/model/cbi/admin_status/processes.lua [deleted file]

index 540fc72c10e326567baed3818a2f38ba2bf3aa3c..a60c432bcba751eb0ed1526589b680712985db3e 100644 (file)
@@ -43,7 +43,7 @@
                        "ubus": {
                                "file": [ "list", "read", "stat" ],
                                "iwinfo": [ "assoclist", "freqlist", "txpowerlist", "countrylist" ],
-                               "luci": [ "getConntrackList", "getDUIDHints", "getInitList", "getLocaltime", "getRealtimeStats", "getTimezones", "getLEDs", "getUSBDevices", "getSwconfigFeatures", "getSwconfigPortState", "getBlockDevices", "getMountPoints" ],
+                               "luci": [ "getConntrackList", "getDUIDHints", "getInitList", "getLocaltime", "getProcessList", "getRealtimeStats", "getTimezones", "getLEDs", "getUSBDevices", "getSwconfigFeatures", "getSwconfigPortState", "getBlockDevices", "getMountPoints" ],
                                "luci-rpc": [ "getBoardJSON", "getDHCPLeases", "getDSLStatus", "getHostHints", "getNetworkDevices", "getWirelessDevices" ],
                                "network.interface": [ "dump" ],
                                "network.rrdns": [ "lookup" ],
@@ -68,6 +68,7 @@
                                "/sbin/reboot": [ "exec" ],
                                "/sbin/sysupgrade": [ "exec" ],
                                "/sbin/wifi": [ "exec" ],
+                               "/bin/kill": [ "exec" ],
                                "/bin/tar": [ "exec" ],
                                "/bin/umount": [ "exec" ],
                                "/tmp/backup.tar.gz": [ "write" ],
diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/processes.js b/modules/luci-mod-status/htdocs/luci-static/resources/processes.js
new file mode 100644 (file)
index 0000000..b996b78
--- /dev/null
@@ -0,0 +1,86 @@
+'use strict';
+'require fs';
+'require ui';
+'require rpc';
+
+var callLuciProcessList = rpc.declare({
+       object: 'luci',
+       method: 'getProcessList',
+       expect: { result: [] }
+});
+
+return L.view.extend({
+       load: function() {
+               return callLuciProcessList();
+       },
+
+       handleSignal: function(signum, pid, ev) {
+               return fs.exec('/bin/kill', ['-%d'.format(signum), '%s'.format(pid)]).then(L.bind(function() {
+                       return callLuciProcessList().then(L.bind(function(processes) {
+                               this.updateTable('.table', processes);
+                       }, this));
+               }, this)).catch(function(e) { ui.addNotification(null, E('p', e.message)) });
+       },
+
+       updateTable: function(table, processes) {
+               var rows = [];
+
+               processes.sort(function(a, b) {
+                       return (a.PID - b.PID);
+               });
+
+               for (var i = 0; i < processes.length; i++) {
+                       var proc = processes[i];
+
+                       rows.push([
+                               proc.PID,
+                               proc.USER,
+                               proc.COMMAND,
+                               proc['%CPU'],
+                               proc['%MEM'],
+                               E('div', { 'class': 'nowrap' }, [
+                                       E('button', {
+                                               'class': 'btn cbi-button-action',
+                                               'click': ui.createHandlerFn(this, 'handleSignal', 1, proc.PID)
+                                       }, _('Hang Up')), ' ',
+                                       E('button', {
+                                               'class': 'btn cbi-button-negative',
+                                               'click': ui.createHandlerFn(this, 'handleSignal', 15, proc.PID)
+                                       }, _('Terminate')), ' ',
+                                       E('button', {
+                                               'class': 'btn cbi-button-negative',
+                                               'click': ui.createHandlerFn(this, 'handleSignal', 9, proc.PID)
+                                       }, _('Kill'))
+                               ])
+                       ]);
+               }
+
+               cbi_update_table(table, rows, E('em', _('No information available')));
+       },
+
+       render: function(processes) {
+               var v = E([], [
+                       E('h2', _('Processes')),
+                       E('div', { 'class': 'cbi-map-descr' }, _('This list gives an overview over currently running system processes and their status.')),
+
+                       E('div', { 'class': 'table' }, [
+                               E('div', { 'class': 'tr table-titles' }, [
+                                       E('div', { 'class': 'th' }, _('PID')),
+                                       E('div', { 'class': 'th' }, _('Owner')),
+                                       E('div', { 'class': 'th' }, _('Command')),
+                                       E('div', { 'class': 'th' }, _('CPU usage (%)')),
+                                       E('div', { 'class': 'th' }, _('Memory usage (%)')),
+                                       E('div', { 'class': 'th center' }, _('Actions'))
+                               ])
+                       ])
+               ]);
+
+               this.updateTable(v.lastElementChild, processes);
+
+               return v;
+       },
+
+       handleSaveApply: null,
+       handleSave: null,
+       handleReset: null
+});
index e888ccf097437075438e919a3daf3d16ee32eff7..6f84149223652a858fbf067f160a54e81dd80455 100644 (file)
@@ -16,7 +16,7 @@ function index()
        entry({"admin", "status", "routes"}, template("admin_status/routes"), _("Routes"), 3)
        entry({"admin", "status", "syslog"}, call("action_syslog"), _("System Log"), 4)
        entry({"admin", "status", "dmesg"}, call("action_dmesg"), _("Kernel Log"), 5)
-       entry({"admin", "status", "processes"}, form("admin_status/processes"), _("Processes"), 6)
+       entry({"admin", "status", "processes"}, view("status/processes"), _("Processes"), 6)
 
        entry({"admin", "status", "realtime"}, alias("admin", "status", "realtime", "load"), _("Realtime Graphs"), 7)
 
diff --git a/modules/luci-mod-status/luasrc/model/cbi/admin_status/processes.lua b/modules/luci-mod-status/luasrc/model/cbi/admin_status/processes.lua
deleted file mode 100644 (file)
index 0a6e48f..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
--- Copyright 2008 Steven Barth <steven@midlink.org>
--- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
--- Licensed to the public under the Apache License 2.0.
-
-f = SimpleForm("processes", translate("Processes"), translate("This list gives an overview over currently running system processes and their status."))
-f.reset = false
-f.submit = false
-
-t = f:section(Table, luci.sys.process.list())
-t:option(DummyValue, "PID", translate("PID"))
-t:option(DummyValue, "USER", translate("Owner"))
-t:option(DummyValue, "COMMAND", translate("Command"))
-t:option(DummyValue, "%CPU", translate("CPU usage (%)"))
-t:option(DummyValue, "%MEM", translate("Memory usage (%)"))
-
-hup = t:option(Button, "_hup", translate("Hang Up"))
-hup.inputstyle = "reload"
-function hup.write(self, section)
-       null, self.tag_error[section] = luci.sys.process.signal(section, 1)
-end
-
-term = t:option(Button, "_term", translate("Terminate"))
-term.inputstyle = "remove"
-function term.write(self, section)
-       null, self.tag_error[section] = luci.sys.process.signal(section, 15)
-end
-
-kill = t:option(Button, "_kill", translate("Kill"))
-kill.inputstyle = "reset"
-function kill.write(self, section)
-       null, self.tag_error[section] = luci.sys.process.signal(section, 9)
-end
-
-return f
\ No newline at end of file