d56eca5071966202bba83df12e7b6134ca2e2b2e
[project/luci.git] / modules / luci-mod-status / htdocs / luci-static / resources / view / status / processes.js
1 'use strict';
2 'require fs';
3 'require ui';
4 'require rpc';
5
6 var callLuciProcessList = rpc.declare({
7 object: 'luci',
8 method: 'getProcessList',
9 expect: { result: [] }
10 });
11
12 return L.view.extend({
13 load: function() {
14 return callLuciProcessList();
15 },
16
17 handleSignal: function(signum, pid, ev) {
18 return fs.exec('/bin/kill', ['-%d'.format(signum), '%s'.format(pid)]).then(L.bind(function() {
19 return callLuciProcessList().then(L.bind(function(processes) {
20 this.updateTable('.table', processes);
21 }, this));
22 }, this)).catch(function(e) { ui.addNotification(null, E('p', e.message)) });
23 },
24
25 updateTable: function(table, processes) {
26 var rows = [];
27
28 processes.sort(function(a, b) {
29 return (a.PID - b.PID);
30 });
31
32 for (var i = 0; i < processes.length; i++) {
33 var proc = processes[i];
34
35 rows.push([
36 proc.PID,
37 proc.USER,
38 proc.COMMAND,
39 proc['%CPU'],
40 proc['%MEM'],
41 E('div', {}, [
42 E('button', {
43 'class': 'btn cbi-button-action',
44 'click': ui.createHandlerFn(this, 'handleSignal', 1, proc.PID)
45 }, _('Hang Up')), ' ',
46 E('button', {
47 'class': 'btn cbi-button-negative',
48 'click': ui.createHandlerFn(this, 'handleSignal', 15, proc.PID)
49 }, _('Terminate')), ' ',
50 E('button', {
51 'class': 'btn cbi-button-negative',
52 'click': ui.createHandlerFn(this, 'handleSignal', 9, proc.PID)
53 }, _('Kill'))
54 ])
55 ]);
56 }
57
58 cbi_update_table(table, rows, E('em', _('No information available')));
59 },
60
61 render: function(processes) {
62 var v = E([], [
63 E('h2', _('Processes')),
64 E('div', { 'class': 'cbi-map-descr' }, _('This list gives an overview over currently running system processes and their status.')),
65
66 E('div', { 'class': 'table' }, [
67 E('div', { 'class': 'tr table-titles' }, [
68 E('div', { 'class': 'th' }, _('PID')),
69 E('div', { 'class': 'th' }, _('Owner')),
70 E('div', { 'class': 'th' }, _('Command')),
71 E('div', { 'class': 'th' }, _('CPU usage (%)')),
72 E('div', { 'class': 'th' }, _('Memory usage (%)')),
73 E('div', { 'class': 'th center nowrap cbi-section-actions' })
74 ])
75 ])
76 ]);
77
78 this.updateTable(v.lastElementChild, processes);
79
80 return v;
81 },
82
83 handleSaveApply: null,
84 handleSave: null,
85 handleReset: null
86 });