diff options
author | Jo-Philipp Wich <jo@mein.io> | 2020-01-26 22:48:20 +0100 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2020-01-26 22:48:20 +0100 |
commit | 40ee3fa3ce1742d625123be11f41df04cf353d7a (patch) | |
tree | 144118f66fa49e1ccf402a7fe34991c2a104cbd2 /applications/luci-app-wol/htdocs/luci-static/resources | |
parent | b34d08ca9ab3a4b9b09eeef7e1c234802e860a47 (diff) |
luci-app-woll: convert to client side rendering
Also make the interface option mandatory
Fixes: #3557
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'applications/luci-app-wol/htdocs/luci-static/resources')
-rw-r--r-- | applications/luci-app-wol/htdocs/luci-static/resources/view/wol.js | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/applications/luci-app-wol/htdocs/luci-static/resources/view/wol.js b/applications/luci-app-wol/htdocs/luci-static/resources/view/wol.js new file mode 100644 index 0000000000..0eb7b4f7ca --- /dev/null +++ b/applications/luci-app-wol/htdocs/luci-static/resources/view/wol.js @@ -0,0 +1,133 @@ +'use strict'; +'require fs'; +'require ui'; +'require rpc'; +'require form'; +'require tools.widgets as widgets'; + +return L.view.extend({ + formdata: { wol: {} }, + + callHostHints: rpc.declare({ + object: 'luci-rpc', + method: 'getHostHints', + expect: { '': {} } + }), + + load: function() { + return Promise.all([ + L.resolveDefault(fs.stat('/usr/bin/etherwake')), + L.resolveDefault(fs.stat('/usr/bin/wol')), + this.callHostHints() + ]); + }, + + render: function(data) { + var has_ewk = data[0], + has_wol = data[1], + hosts = data[2], + m, s, o; + + this.formdata.has_ewk = has_ewk; + this.formdata.has_wol = has_wol; + + m = new form.JSONMap(this.formdata, _('Wake on LAN'), + _('Wake on LAN is a mechanism to remotely boot computers in the local network.')); + + s = m.section(form.NamedSection, 'wol'); + + if (has_ewk && has_wol) { + o = s.option(form.ListValue, 'executable', _('WoL program'), + _('Sometimes only one of the two tools works. If one fails, try the other one')); + + o.value('/usr/bin/etherwake', 'Etherwake'); + o.value('/usr/bin/wol', 'WoL'); + } + + if (has_ewk) { + o = s.option(widgets.DeviceSelect, 'iface', _('Network interface to use'), + _('Specifies the interface the WoL packet is sent on')); + + o.rmempty = false; + o.noaliases = true; + o.noinactive = true; + + if (has_wol) + o.depends('executable', '/usr/bin/etherwake'); + } + + o = s.option(form.Value, 'mac', _('Host to wake up'), + _('Choose the host to wake up or enter a custom MAC address to use')); + + o.rmempty = false; + + Object.keys(hosts).sort().forEach(function(mac) { + o.value(mac, E([], [ mac, ' (', E('strong', [hosts[mac].name || hosts[mac].ipv4 || hosts[mac].ipv6 || '?']), ')' ])); + }); + + if (has_ewk) { + o = s.option(form.Flag, 'broadcast', ('Send to broadcast address')); + + if (has_wol) + o.depends('executable', '/usr/bin/etherwake'); + } + + return m.render(); + }, + + handleWakeup: function(ev) { + var map = document.querySelector('#maincontent .cbi-map'), + data = this.formdata; + + return L.dom.callClassMethod(map, 'save').then(function() { + if (!data.wol.mac) + return alert(_('No target host specified!')); + + var bin = data.executable || (data.has_ewk ? '/usr/bin/etherwake' : '/usr/bin/wol'), + args = []; + + if (bin == '/usr/bin/etherwake') { + args.push('-D', '-i', data.wol.iface); + + if (data.wol.broadcast == '1') + args.push('-b'); + + args.push(data.wol.mac); + } + else { + args.push('-v', data.wol.mac); + } + + ui.showModal(_('Waking host'), [ + E('p', { 'class': 'spinning' }, [ 'Starting WoL utility…' ]) + ]); + + return fs.exec(bin, args).then(function(res) { + ui.showModal(_('Waking host'), [ + E('p', [ res.stdout ]), + res.stderr ? E('pre', [ res.stderr ]) : '', + E('div', { 'class': 'right' }, [ + E('button', { + 'class': 'cbi-button cbi-button-primary', + 'click': ui.hideModal + }, [ _('Dismiss') ]) + ]) + ]); + }).catch(function(err) { + ui.hideModal(); + ui.addNotification(null, [ + E('p', [ _('Waking host failed: '), err ]) + ]); + }); + }); + }, + + addFooter: function() { + return E('div', { 'class': 'cbi-page-actions' }, [ + E('button', { + 'class': 'cbi-button cbi-button-save', + 'click': L.ui.createHandlerFn(this, 'handleWakeup') + }, [ _('Wake up host') ]) + ]); + } +}); |