'use strict'; 'require view'; 'require dom'; 'require fs'; 'require ui'; 'require uci'; 'require network'; return view.extend({ handleCommand: function(exec, args) { var buttons = document.querySelectorAll('.diag-action > .cbi-button'); for (var i = 0; i < buttons.length; i++) buttons[i].setAttribute('disabled', 'true'); return fs.exec(exec, args).then(function(res) { var out = document.querySelector('textarea'); dom.content(out, [ res.stdout || '', res.stderr || '' ]); }).catch(function(err) { ui.addNotification(null, E('p', [ err ])) }).finally(function() { for (var i = 0; i < buttons.length; i++) buttons[i].removeAttribute('disabled'); }); }, handlePing: function(ev, cmd) { var exec = cmd || 'ping', addr = ev.currentTarget.parentNode.previousSibling.value, args = (exec == 'ping') ? [ '-4', '-c', '5', '-W', '1', addr ] : [ '-6', '-c', '5', addr ]; return this.handleCommand(exec, args); }, handleTraceroute: function(ev, cmd) { var exec = cmd || 'traceroute', addr = ev.currentTarget.parentNode.previousSibling.value, args = (exec == 'traceroute') ? [ '-4', '-q', '1', '-w', '1', '-n', '-m', String(L.env.rpctimeout || 20), addr ] : [ '-q', '1', '-w', '2', '-n', addr ]; return this.handleCommand(exec, args); }, handleNslookup: function(ev, cmd) { var addr = ev.currentTarget.parentNode.previousSibling.value; return this.handleCommand('nslookup', [ addr ]); }, handleArpScan: function(ev, cmd) { var addr = ev.currentTarget.parentNode.previousSibling.value; return this.handleCommand('arp-scan', [ '-l', '-I', addr ]); }, load: function() { return Promise.all([ L.resolveDefault(fs.stat('/bin/ping6'), {}), L.resolveDefault(fs.stat('/usr/bin/ping6'), {}), L.resolveDefault(fs.stat('/bin/traceroute6'), {}), L.resolveDefault(fs.stat('/usr/bin/traceroute6'), {}), L.resolveDefault(fs.stat('/usr/bin/arp-scan'), {}), network.getDevices(), uci.load('luci') ]); }, render: function(res) { var has_ping6 = res[0].path || res[1].path, has_traceroute6 = res[2].path || res[3].path, has_arpscan = res[4].path, devices = res[5], dns_host = uci.get('luci', 'diag', 'dns') || 'openwrt.org', ping_host = uci.get('luci', 'diag', 'ping') || 'openwrt.org', route_host = uci.get('luci', 'diag', 'route') || 'openwrt.org'; var table = E('table', { 'class': 'table' }, [ E('tr', { 'class': 'tr' }, [ E('td', { 'class': 'td left', 'style': 'overflow:initial' }, [ E('input', { 'style': 'margin:5px 0', 'type': 'text', 'value': ping_host }), E('span', { 'class': 'diag-action' }, [ has_ping6 ? new ui.ComboButton('ping', { 'ping': '%s %s'.format(_('IPv4'), _('Ping')), 'ping6': '%s %s'.format(_('IPv6'), _('Ping')), }, { 'click': ui.createHandlerFn(this, 'handlePing'), 'classes': { 'ping': 'btn cbi-button cbi-button-action', 'ping6': 'btn cbi-button cbi-button-action' } }).render() : E('button', { 'class': 'cbi-button cbi-button-action', 'click': ui.createHandlerFn(this, 'handlePing') }, [ _('Ping') ]) ]) ]), E('td', { 'class': 'td left', 'style': 'overflow:initial' }, [ E('input', { 'style': 'margin:5px 0', 'type': 'text', 'value': route_host }), E('span', { 'class': 'diag-action' }, [ has_traceroute6 ? new ui.ComboButton('traceroute', { 'traceroute': '%s %s'.format(_('IPv4'), _('Traceroute')), 'traceroute6': '%s %s'.format(_('IPv6'), _('Traceroute')), }, { 'click': ui.createHandlerFn(this, 'handleTraceroute'), 'classes': { 'traceroute': 'btn cbi-button cbi-button-action', 'traceroute6': 'btn cbi-button cbi-button-action' } }).render() : E('button', { 'class': 'cbi-button cbi-button-action', 'click': ui.createHandlerFn(this, 'handleTraceroute') }, [ _('Traceroute') ]) ]) ]), E('td', { 'class': 'td left' }, [ E('input', { 'style': 'margin:5px 0', 'type': 'text', 'value': dns_host }), E('span', { 'class': 'diag-action' }, [ E('button', { 'class': 'cbi-button cbi-button-action', 'click': ui.createHandlerFn(this, 'handleNslookup') }, [ _('Nslookup') ]) ]) ]), has_arpscan ? E('td', { 'class': 'td left' }, [ E('select', { 'style': 'margin:5px 0' }, devices.map(function(device) { if (!device.isUp()) return E([]); return E('option', { 'value': device.getName() }, [ device.getI18n() ]); })), E('span', { 'class': 'diag-action' }, [ E('button', { 'class': 'cbi-button cbi-button-action', 'click': ui.createHandlerFn(this, 'handleArpScan') }, [ _('Arp-scan') ]) ]) ]) : E([]), ]) ]); var view = E('div', { 'class': 'cbi-map'}, [ E('h2', {}, [ _('Diagnostics') ]), E('div', { 'class': 'cbi-map-descr'}, _('Execution of various network commands to check the connection and name resolution to other systems.')), table, E('div', {'class': 'cbi-section'}, [ E('div', { 'id' : 'command-output'}, E('textarea', { 'id': 'widget.command-output', 'style': 'width: 100%; font-family:monospace; white-space:pre', 'readonly': true, 'wrap': 'off', 'rows': '20' }) ) ]) ]); return view; }, handleSaveApply: null, handleSave: null, handleReset: null });