'use strict'; 'require view'; 'require fs'; 'require ui'; 'require rpc'; var callLuciProcessList = rpc.declare({ object: 'luci', method: 'getProcessList', expect: { result: [] } }); return 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', {}, [ 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('table', { 'class': 'table' }, [ E('tr', { 'class': 'tr table-titles' }, [ E('th', { 'class': 'th' }, _('PID')), E('th', { 'class': 'th' }, _('Owner')), E('th', { 'class': 'th' }, _('Command')), E('th', { 'class': 'th' }, _('CPU usage (%)')), E('th', { 'class': 'th' }, _('Memory usage (%)')), E('th', { 'class': 'th center nowrap cbi-section-actions' }) ]) ]) ]); this.updateTable(v.lastElementChild, processes); return v; }, handleSaveApply: null, handleSave: null, handleReset: null });