245 lines
8.8 KiB
JavaScript
245 lines
8.8 KiB
JavaScript
'use strict';
|
|
'require view';
|
|
'require fs';
|
|
'require ui';
|
|
|
|
/*
|
|
button handling
|
|
*/
|
|
function handleAction(ev) {
|
|
if (ev.target && ev.target.getAttribute('name') === 'whitelist') {
|
|
L.ui.showModal(_('Whitelist IP/CIDR'), [
|
|
E('p', _('Add this IP/CIDR to your local whitelist.')),
|
|
E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [
|
|
E('label', { 'class': 'cbi-input-text', 'style': 'padding-top:.5em' }, [
|
|
E('input', { 'class': 'cbi-input-text', 'style': 'width:300px', 'spellcheck': 'false', 'id': 'whitelist', 'value': ev.target.getAttribute('value') }, [])
|
|
])
|
|
]),
|
|
E('div', { 'class': 'right' }, [
|
|
E('button', {
|
|
'class': 'btn cbi-button',
|
|
'click': L.hideModal
|
|
}, _('Cancel')),
|
|
' ',
|
|
E('button', {
|
|
'class': 'btn cbi-button-action',
|
|
'click': ui.createHandlerFn(this, function(ev) {
|
|
L.resolveDefault(fs.read_direct('/etc/banip/banip.whitelist'), '')
|
|
.then(function(res) {
|
|
var ip = document.getElementById('whitelist').value.trim().toLowerCase();
|
|
if (ip) {
|
|
var whitelist = res + ip + '\n';
|
|
fs.write('/etc/banip/banip.whitelist', whitelist);
|
|
ui.addNotification(null, E('p', _('Whitelist changes have been saved. Refresh your banIP lists that changes take effect.')), 'info');
|
|
}
|
|
L.hideModal();
|
|
});
|
|
})
|
|
}, _('Save'))
|
|
])
|
|
]);
|
|
document.getElementById('whitelist').focus();
|
|
}
|
|
|
|
if (ev === 'query') {
|
|
L.ui.showModal(_('IPSet Query'), [
|
|
E('p', _('Search the active banIP-related IPSets for a specific IP, CIDR or MAC address.')),
|
|
E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [
|
|
E('label', { 'style': 'padding-top:.5em', 'id': 'run' }, [
|
|
E('input', {
|
|
'class': 'cbi-input-text',
|
|
'placeholder': '192.168.0.1',
|
|
'style': 'width:300px',
|
|
'spellcheck': 'false',
|
|
'id': 'search'
|
|
})
|
|
])
|
|
]),
|
|
E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [
|
|
'\xa0',
|
|
E('h5', _('Result')),
|
|
E('textarea', {
|
|
'id': 'result',
|
|
'style': 'width: 100% !important; padding: 5px; font-family: monospace',
|
|
'readonly': 'readonly',
|
|
'wrap': 'off',
|
|
'rows': 20
|
|
})
|
|
]),
|
|
E('div', { 'class': 'right' }, [
|
|
E('button', {
|
|
'class': 'btn cbi-button',
|
|
'click': L.hideModal
|
|
}, _('Cancel')),
|
|
' ',
|
|
E('button', {
|
|
'class': 'btn cbi-button-action',
|
|
'click': ui.createHandlerFn(this, function(ev) {
|
|
var ip = document.getElementById('search').value.trim().toLowerCase();
|
|
if (ip) {
|
|
document.getElementById('run').classList.add("spinning");
|
|
document.getElementById('search').value = ip;
|
|
document.getElementById('result').textContent = 'The query is running, please wait...';
|
|
L.resolveDefault(fs.exec_direct('/etc/init.d/banip', ['query', ip])).then(function(res) {
|
|
var result = document.getElementById('result');
|
|
if (res) {
|
|
result.textContent = res.trim();
|
|
} else {
|
|
result.textContent = _('No Query results!');
|
|
}
|
|
document.getElementById('run').classList.remove("spinning");
|
|
document.getElementById('search').value = '';
|
|
})
|
|
}
|
|
document.getElementById('search').focus();
|
|
})
|
|
}, _('Query'))
|
|
])
|
|
]);
|
|
document.getElementById('search').focus();
|
|
}
|
|
}
|
|
|
|
return view.extend({
|
|
load: function() {
|
|
return L.resolveDefault(fs.exec_direct('/etc/init.d/banip', ['report', 'json']),'');
|
|
},
|
|
|
|
render: function(ipsetreport) {
|
|
if (!ipsetreport) {
|
|
ipsetreport = '{}';
|
|
};
|
|
var content;
|
|
content = JSON.parse(ipsetreport);
|
|
|
|
var rows_ipsets = [];
|
|
var tbl_ipsets = E('table', { 'class': 'table', 'id': 'ipsets' }, [
|
|
E('tr', { 'class': 'tr table-titles' }, [
|
|
E('th', { 'class': 'th' }, _('Name')),
|
|
E('th', { 'class': 'th' }, _('Type')),
|
|
E('th', { 'class': 'th' }, _('Count SUM')),
|
|
E('th', { 'class': 'th' }, _('Count IP')),
|
|
E('th', { 'class': 'th' }, _('Count CIDR')),
|
|
E('th', { 'class': 'th' }, _('Count MAC')),
|
|
E('th', { 'class': 'th' }, _('Count ACC')),
|
|
E('th', { 'class': 'th' }, _('Entry Details')),
|
|
E('th', { 'class': 'th' }, '\xa0'),
|
|
E('th', { 'class': 'th' }, _('Action'))
|
|
])
|
|
]);
|
|
|
|
if (content.ipsets) {
|
|
var button, member, urlprefix;
|
|
Object.keys(content.ipsets).forEach(function(key) {
|
|
rows_ipsets.push([
|
|
E('em', key),
|
|
E('em', content.ipsets[key].type),
|
|
E('em', content.ipsets[key].count),
|
|
E('em', content.ipsets[key].count_ip),
|
|
E('em', content.ipsets[key].count_cidr),
|
|
E('em', content.ipsets[key].count_mac),
|
|
E('em', content.ipsets[key].count_acc)
|
|
]);
|
|
for (var i = 0; i < content.ipsets[key].member_acc.length; i++) {
|
|
if (key != 'maclist' && key.substr(0,9) != 'whitelist') {
|
|
urlprefix = content.ipsets[key].member_acc[i].member.includes('/') ? 'prefix/' : 'ip/';
|
|
member = '<a href="https://api.bgpview.io/' + urlprefix + encodeURIComponent(content.ipsets[key].member_acc[i].member) + '" target="_blank" rel="noreferrer noopener" title="IP/CIDR Lookup" >' + content.ipsets[key].member_acc[i].member + '</a>';
|
|
button = E('button', {
|
|
'class': 'btn cbi-button cbi-button-apply',
|
|
'style': 'word-break: inherit',
|
|
'name': 'whitelist',
|
|
'value': content.ipsets[key].member_acc[i].member,
|
|
'click': handleAction
|
|
}, [ _('Whitelist...')]);
|
|
} else {
|
|
member = content.ipsets[key].member_acc[i].member;
|
|
button = '';
|
|
}
|
|
rows_ipsets.push([
|
|
'',
|
|
'',
|
|
'',
|
|
'',
|
|
'',
|
|
'',
|
|
'',
|
|
member,
|
|
content.ipsets[key].member_acc[i].packets,
|
|
button
|
|
]);
|
|
}
|
|
});
|
|
}
|
|
cbi_update_table(tbl_ipsets, rows_ipsets);
|
|
|
|
return E('div', { 'class': 'cbi-map', 'id': 'map' }, [
|
|
E('div', { 'class': 'cbi-section' }, [
|
|
E('p', _('This tab shows the last generated IPSet Report, press the \'Refresh\' button to get a current one.')),
|
|
E('p', '\xa0'),
|
|
E('div', { 'class': 'cbi-value' }, [
|
|
E('div', { 'class': 'cbi-value-title', 'style': 'float:left;width:230px' }, _('Timestamp')),
|
|
E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'float:left;color:#37c' }, content.timestamp || '-')
|
|
]),
|
|
E('div', { 'class': 'cbi-value' }, [
|
|
E('div', { 'class': 'cbi-value-title', 'style': 'float:left;width:230px' }, _('Number of all IPSets')),
|
|
E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'float:left;color:#37c' }, content.cnt_set_sum || '-')
|
|
]),
|
|
E('div', { 'class': 'cbi-value' }, [
|
|
E('div', { 'class': 'cbi-value-title', 'style': 'float:left;width:230px' }, _('Number of all entries')),
|
|
E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'float:left;color:#37c' }, content.cnt_sum || '-')
|
|
]),
|
|
E('div', { 'class': 'cbi-value' }, [
|
|
E('div', { 'class': 'cbi-value-title', 'style': 'float:left;width:230px' }, _('Number of IP entries')),
|
|
E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'float:left;color:#37c' }, content.cnt_ip_sum || '-')
|
|
]),
|
|
E('div', { 'class': 'cbi-value' }, [
|
|
E('div', { 'class': 'cbi-value-title', 'style': 'float:left;width:230px' }, _('Number of CIDR entries')),
|
|
E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'float:left;color:#37c' }, content.cnt_cidr_sum || '-')
|
|
]),
|
|
E('div', { 'class': 'cbi-value' }, [
|
|
E('div', { 'class': 'cbi-value-title', 'style': 'float:left;width:230px' }, _('Number of MAC entries')),
|
|
E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'float:left;color:#37c' }, content.cnt_mac_sum || '-')
|
|
]),
|
|
E('div', { 'class': 'cbi-value' }, [
|
|
E('div', { 'class': 'cbi-value-title', 'style': 'float:left;width:230px' }, _('Number of accessed entries')),
|
|
E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'float:left;color:#37c' }, content.cnt_acc_sum || '-')
|
|
]),
|
|
E('div', { 'class': 'right' }, [
|
|
E('button', {
|
|
'class': 'btn cbi-button cbi-button-apply',
|
|
'click': ui.createHandlerFn(this, function() {
|
|
return handleAction('query');
|
|
})
|
|
}, [ _('IPSet Query...') ]),
|
|
'\xa0\xa0\xa0',
|
|
E('button', {
|
|
'class': 'btn cbi-button cbi-button-positive',
|
|
'click': ui.createHandlerFn(this, async function() {
|
|
L.resolveDefault(fs.exec_direct('/etc/init.d/banip', ['report', 'gen']),'');
|
|
var running = 1;
|
|
while (running === 1) {
|
|
await new Promise(r => setTimeout(r, 1000));
|
|
L.resolveDefault(fs.read_direct('/var/run/banip.pid')).then(function(res) {
|
|
if (!res) {
|
|
running = 0;
|
|
}
|
|
})
|
|
}
|
|
location.reload();
|
|
})
|
|
}, [ _('Refresh') ])
|
|
]),
|
|
]),
|
|
E('br'),
|
|
E('div', { 'class': 'cbi-section' }, [
|
|
E('div', { 'class': 'left' }, [
|
|
E('h3', _('IPSet details')),
|
|
tbl_ipsets
|
|
])
|
|
])
|
|
]);
|
|
},
|
|
handleSaveApply: null,
|
|
handleSave: null,
|
|
handleReset: null
|
|
});
|