From: Jo-Philipp Wich Date: Sun, 3 Nov 2019 19:07:58 +0000 (+0100) Subject: luci-base, luci-mod-status: convert process status to client side view X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=a43b1c6468e8fd931c721e83f9f18955509cfdaa;p=oweals%2Fluci.git luci-base, luci-mod-status: convert process status to client side view Signed-off-by: Jo-Philipp Wich --- diff --git a/modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json b/modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json index 540fc72c1..a60c432bc 100644 --- a/modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json +++ b/modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json @@ -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 index 000000000..b996b78ce --- /dev/null +++ b/modules/luci-mod-status/htdocs/luci-static/resources/processes.js @@ -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 +}); diff --git a/modules/luci-mod-status/luasrc/controller/admin/status.lua b/modules/luci-mod-status/luasrc/controller/admin/status.lua index e888ccf09..6f8414922 100644 --- a/modules/luci-mod-status/luasrc/controller/admin/status.lua +++ b/modules/luci-mod-status/luasrc/controller/admin/status.lua @@ -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 index 0a6e48fd8..000000000 --- a/modules/luci-mod-status/luasrc/model/cbi/admin_status/processes.lua +++ /dev/null @@ -1,34 +0,0 @@ --- Copyright 2008 Steven Barth --- Copyright 2008 Jo-Philipp Wich --- 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