luci-mod-status: add support for one-click static lease
Introduce a button in the status lease table to quickly add an host as static. Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
This commit is contained in:
parent
1da9df8376
commit
f6b6a12927
1 changed files with 93 additions and 12 deletions
|
@ -1,7 +1,9 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
'require baseclass';
|
'require baseclass';
|
||||||
'require rpc';
|
'require rpc';
|
||||||
|
'require uci';
|
||||||
'require network';
|
'require network';
|
||||||
|
'require validation';
|
||||||
|
|
||||||
var callLuciDHCPLeases = rpc.declare({
|
var callLuciDHCPLeases = rpc.declare({
|
||||||
object: 'luci-rpc',
|
object: 'luci-rpc',
|
||||||
|
@ -12,29 +14,85 @@ var callLuciDHCPLeases = rpc.declare({
|
||||||
return baseclass.extend({
|
return baseclass.extend({
|
||||||
title: '',
|
title: '',
|
||||||
|
|
||||||
|
isMACStatic: {},
|
||||||
|
isDUIDStatic: {},
|
||||||
|
|
||||||
load: function() {
|
load: function() {
|
||||||
return Promise.all([
|
return Promise.all([
|
||||||
callLuciDHCPLeases(),
|
callLuciDHCPLeases(),
|
||||||
network.getHostHints()
|
network.getHostHints(),
|
||||||
|
uci.load('dhcp')
|
||||||
]);
|
]);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
handleCreateStaticLease: function(lease, ev) {
|
||||||
|
ev.currentTarget.classList.add('spinning');
|
||||||
|
ev.currentTarget.disabled = true;
|
||||||
|
ev.currentTarget.blur();
|
||||||
|
|
||||||
|
var cfg = uci.add('dhcp', 'host');
|
||||||
|
uci.set('dhcp', cfg, 'name', lease.hostname || '-');
|
||||||
|
uci.set('dhcp', cfg, 'ip', lease.ipaddr);
|
||||||
|
uci.set('dhcp', cfg, 'mac', lease.macaddr.toUpperCase());
|
||||||
|
|
||||||
|
return uci.save()
|
||||||
|
.then(L.bind(L.ui.changes.init, L.ui.changes))
|
||||||
|
.then(L.bind(L.ui.changes.displayChanges, L.ui.changes));
|
||||||
|
},
|
||||||
|
|
||||||
|
handleCreateStaticLease6: function(lease, ev) {
|
||||||
|
ev.currentTarget.classList.add('spinning');
|
||||||
|
ev.currentTarget.disabled = true;
|
||||||
|
ev.currentTarget.blur();
|
||||||
|
|
||||||
|
var cfg = uci.add('dhcp', 'host'),
|
||||||
|
ip6arr = lease.ip6addrs[0] ? validation.parseIPv6(lease.ip6addrs[0]) : null;
|
||||||
|
|
||||||
|
uci.set('dhcp', cfg, 'name', lease.hostname || '-');
|
||||||
|
uci.set('dhcp', cfg, 'duid', lease.duid.toUpperCase());
|
||||||
|
uci.set('dhcp', cfg, 'mac', lease.macaddr);
|
||||||
|
if (ip6arr)
|
||||||
|
uci.set('dhcp', cfg, 'hostid', (ip6arr[6] * 0xFFFF + ip6arr[7]).toString(16));
|
||||||
|
|
||||||
|
return uci.save()
|
||||||
|
.then(L.bind(L.ui.changes.init, L.ui.changes))
|
||||||
|
.then(L.bind(L.ui.changes.displayChanges, L.ui.changes));
|
||||||
|
},
|
||||||
|
|
||||||
renderLeases: function(data) {
|
renderLeases: function(data) {
|
||||||
var leases = Array.isArray(data[0].dhcp_leases) ? data[0].dhcp_leases : [],
|
var leases = Array.isArray(data[0].dhcp_leases) ? data[0].dhcp_leases : [],
|
||||||
leases6 = Array.isArray(data[0].dhcp6_leases) ? data[0].dhcp6_leases : [],
|
leases6 = Array.isArray(data[0].dhcp6_leases) ? data[0].dhcp6_leases : [],
|
||||||
machints = data[1].getMACHints(false);
|
machints = data[1].getMACHints(false),
|
||||||
|
hosts = uci.sections('dhcp', 'host');
|
||||||
|
|
||||||
|
for (var i = 0; i < hosts.length; i++) {
|
||||||
|
var host = hosts[i];
|
||||||
|
|
||||||
|
if (host.mac) {
|
||||||
|
var macs = L.toArray(host.mac);
|
||||||
|
for (var j = 0; j < macs.length; j++) {
|
||||||
|
var mac = macs[j].toUpperCase();
|
||||||
|
this.isMACStatic[mac] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (host.duid) {
|
||||||
|
var duid = host.duid.toUpperCase();
|
||||||
|
this.isDUIDStatic[duid] = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
var table = E('div', { 'class': 'table lases' }, [
|
var table = E('div', { 'class': 'table lases' }, [
|
||||||
E('div', { 'class': 'tr table-titles' }, [
|
E('div', { 'class': 'tr table-titles' }, [
|
||||||
E('div', { 'class': 'th' }, _('Hostname')),
|
E('div', { 'class': 'th' }, _('Hostname')),
|
||||||
E('div', { 'class': 'th' }, _('IPv4-Address')),
|
E('div', { 'class': 'th' }, _('IPv4-Address')),
|
||||||
E('div', { 'class': 'th' }, _('MAC-Address')),
|
E('div', { 'class': 'th' }, _('MAC-Address')),
|
||||||
E('div', { 'class': 'th' }, _('Lease time remaining'))
|
E('div', { 'class': 'th' }, _('Lease time remaining')),
|
||||||
|
E('div', { 'class': 'th cbi-section-actions' }, _('Static Lease'))
|
||||||
])
|
])
|
||||||
]);
|
]);
|
||||||
|
|
||||||
cbi_update_table(table, leases.map(function(lease) {
|
cbi_update_table(table, leases.map(L.bind(function(lease) {
|
||||||
var exp;
|
var exp, rows;
|
||||||
|
|
||||||
if (lease.expires === false)
|
if (lease.expires === false)
|
||||||
exp = E('em', _('unlimited'));
|
exp = E('em', _('unlimited'));
|
||||||
|
@ -43,25 +101,37 @@ return baseclass.extend({
|
||||||
else
|
else
|
||||||
exp = '%t'.format(lease.expires);
|
exp = '%t'.format(lease.expires);
|
||||||
|
|
||||||
return [
|
rows = [
|
||||||
lease.hostname || '-',
|
lease.hostname || '-',
|
||||||
lease.ipaddr,
|
lease.ipaddr,
|
||||||
lease.macaddr,
|
lease.macaddr,
|
||||||
exp
|
exp
|
||||||
];
|
];
|
||||||
}), E('em', _('There are no active leases')));
|
|
||||||
|
if (lease.macaddr != null) {
|
||||||
|
var mac = lease.macaddr.toUpperCase();
|
||||||
|
rows.push(E('button', {
|
||||||
|
'class': 'cbi-button cbi-button-apply',
|
||||||
|
'click': L.bind(this.handleCreateStaticLease, this, lease),
|
||||||
|
'disabled': this.isMACStatic[mac]
|
||||||
|
}, [ _('Set Static') ]));
|
||||||
|
}
|
||||||
|
|
||||||
|
return rows;
|
||||||
|
}, this)), E('em', _('There are no active leases')));
|
||||||
|
|
||||||
var table6 = E('div', { 'class': 'table leases6' }, [
|
var table6 = E('div', { 'class': 'table leases6' }, [
|
||||||
E('div', { 'class': 'tr table-titles' }, [
|
E('div', { 'class': 'tr table-titles' }, [
|
||||||
E('div', { 'class': 'th' }, _('Host')),
|
E('div', { 'class': 'th' }, _('Host')),
|
||||||
E('div', { 'class': 'th' }, _('IPv6-Address')),
|
E('div', { 'class': 'th' }, _('IPv6-Address')),
|
||||||
E('div', { 'class': 'th' }, _('DUID')),
|
E('div', { 'class': 'th' }, _('DUID')),
|
||||||
E('div', { 'class': 'th' }, _('Lease time remaining'))
|
E('div', { 'class': 'th' }, _('Lease time remaining')),
|
||||||
|
E('div', { 'class': 'th cbi-section-actions' }, _('Static Lease'))
|
||||||
])
|
])
|
||||||
]);
|
]);
|
||||||
|
|
||||||
cbi_update_table(table6, leases6.map(function(lease) {
|
cbi_update_table(table6, leases6.map(L.bind(function(lease) {
|
||||||
var exp;
|
var exp, rows;
|
||||||
|
|
||||||
if (lease.expires === false)
|
if (lease.expires === false)
|
||||||
exp = E('em', _('unlimited'));
|
exp = E('em', _('unlimited'));
|
||||||
|
@ -80,13 +150,24 @@ return baseclass.extend({
|
||||||
else if (hint)
|
else if (hint)
|
||||||
host = hint[1];
|
host = hint[1];
|
||||||
|
|
||||||
return [
|
rows = [
|
||||||
host || '-',
|
host || '-',
|
||||||
lease.ip6addrs ? lease.ip6addrs.join(' ') : lease.ip6addr,
|
lease.ip6addrs ? lease.ip6addrs.join(' ') : lease.ip6addr,
|
||||||
lease.duid,
|
lease.duid,
|
||||||
exp
|
exp
|
||||||
];
|
];
|
||||||
}), E('em', _('There are no active leases')));
|
|
||||||
|
if (lease.duid != null) {
|
||||||
|
var duid = lease.duid.toUpperCase();
|
||||||
|
rows.push(E('button', {
|
||||||
|
'class': 'cbi-button cbi-button-apply',
|
||||||
|
'click': L.bind(this.handleCreateStaticLease6, this, lease),
|
||||||
|
'disabled': this.isDUIDStatic[duid]
|
||||||
|
}, [ _('Set Static') ]));
|
||||||
|
}
|
||||||
|
|
||||||
|
return rows;
|
||||||
|
}, this)), E('em', _('There are no active leases')));
|
||||||
|
|
||||||
return E([
|
return E([
|
||||||
E('h3', _('Active DHCP Leases')),
|
E('h3', _('Active DHCP Leases')),
|
||||||
|
|
Loading…
Reference in a new issue