123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- 'use strict';
- 'require view';
- 'require dom';
- 'require uci';
- 'require fs';
- 'require ui';
- 'require rpc';
- 'require form';
- 'require tools.widgets as widgets';
- return 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(),
- uci.load('etherwake')
- ]);
- },
- 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.default = uci.get('etherwake', 'setup', 'interface');
- 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;
- L.sortedKeys(hosts).forEach(function(mac) {
- o.value(mac, E([], [ mac, ' (', E('strong', [
- hosts[mac].name ||
- L.toArray(hosts[mac].ipaddrs || hosts[mac].ipv4)[0] ||
- L.toArray(hosts[mac].ip6addrs || hosts[mac].ipv6)[0] ||
- '?'
- ]), ')' ]));
- });
- 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 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'), [
- res.stderr ? 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') ])
- ]);
- }
- });
|