const nodeKeys = document.querySelectorAll('[id^="widget.cbid.json"][id$="name"]');
for (let i = 0; i < nodeKeys.length; i++) {
let subElements = {};
- let elements = document.querySelectorAll('[id^="widget.cbid.json.' + nodeKeys[i].id.split('.')[3] + '\."]');
+ const elements = document.querySelectorAll('[id^="widget.cbid.json.' + nodeKeys[i].id.split('.')[3] + '\."], \
+ [id^="cbid.json.' + nodeKeys[i].id.split('.')[3] + '\.rule_4"], \
+ [id^="cbid.json.' + nodeKeys[i].id.split('.')[3] + '\.rule_6"]');
for (const element of elements) {
- let key = element.id.split('.')[4];
- let value = element.value || "";
- if (value === "") {
+ let key;
+ const value = element.value || "";
+ const parts = element.id.split('.');
+ if (parts.length === 5) {
+ key = element.id.split('.')[4];
+ } else if (parts.length === 4) {
+ key = element.id.split('.')[3];
+ }
+ if (!key || value === "") {
continue;
}
switch (key) {
load: function () {
return L.resolveDefault(fs.stat('/etc/banip/banip.custom.feeds'), "")
.then(function (stat) {
- if (!stat) {
- return fs.write('/etc/banip/banip.custom.feeds', "");
- }
- return L.resolveDefault(fs.read_direct('/etc/banip/banip.custom.feeds', 'json'), "");
- })
+ if (!stat) {
+ return fs.write('/etc/banip/banip.custom.feeds', "");
+ }
+ return L.resolveDefault(fs.read_direct('/etc/banip/banip.custom.feeds', 'json'), "");
+ })
},
render: function (data) {
return true;
}
- o = s.option(form.ListValue, 'rule_4', _('Rulev4'));
+ o = s.option(form.Value, 'rule_4', _('Rulev4'));
o.value('/^127\\./{next}/^(([1-9][0-9]{0,2}\\.){1}([0-9]{1,3}\\.){2}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\\/(1?[0-9]|2?[0-9]|3?[0-2]))?)[[:space:]]/{printf \"%s,\\n\",$1}', _('<IPv4><SPACE>'));
o.value('/^127\\./{next}/^(([1-9][0-9]{0,2}\\.){1}([0-9]{1,3}\\.){2}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\\/(1?[0-9]|2?[0-9]|3?[0-2]))?)$/{printf \"%s,\\n\",$1}', _('<IPv4><END>'));
o.value('/^127\\./{next}/^(([1-9][0-9]{0,2}\\.){1}([0-9]{1,3}\\.){2}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\\/(1?[0-9]|2?[0-9]|3?[0-2]))?)[[:space:]]/{printf \"%s/%s,\\n\",$1,$3}', _('<IPv4><SPACE>, concatinated'));
return true;
}
- o = s.option(form.ListValue, 'rule_6', _('Rulev6'));
+ o = s.option(form.Value, 'rule_6', _('Rulev6'));
o.value('/^(([0-9A-f]{0,4}:){1,7}[0-9A-f]{0,4}:?(\\/(1?[0-2][0-8]|[0-9][0-9]))?)[[:space:]]/{printf \"%s,\\n\",$1}', _('<IPv6><SPACE>'));
o.value('/^(([0-9A-f]{0,4}:){1,7}[0-9A-f]{0,4}:?(\\/(1?[0-2][0-8]|[0-9][0-9]))?)$/{printf \"%s,\\n\",$1}', _('<IPv6><END>'));
o.value('BEGIN{FS=\",\"}/^(([0-9A-f]{0,4}:){1,7}[0-9A-f]{0,4}:?(\\/(1?[0-2][0-8]|[0-9][0-9]))?)/{printf \"%s,\\n\",$1}', _('<IPv6>, csv'));
<script>
'use strict';
+ /* intialize map */
+ let map = L.map('map', {
+ zoom: 4,
+ minZoom: 2,
+ maxZoom: 18,
+ center: [50, 10]
+ }).setView([50, 10]);
+ L.tileLayer('https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png', {
+ attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
+ }).addTo(map);
+
/* get mapData */
const mapData = sessionStorage.getItem('mapData');
if (mapData) {
}
});
- /* intialize map and map tiles */
- let map;
+ /* render markers for local IPs, reset focus and zoom level */
homeCoordinates.forEach(function (coordObj) {
let latHome = coordObj.lat;
let lonHome = coordObj.lon;
let cityHome = coordObj.city.slice(0, 33);
let ccHome = coordObj.cc;
- if (typeof map === "undefined") {
- map = L.map('map', {
- zoom: 6,
- minZoom: 2,
- maxZoom: 18,
- center: [latHome, lonHome]
- }).setView([latHome, lonHome]);
- L.tileLayer('https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png', {
- attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
- }).addTo(map);
- }
+ map.setView([latHome, lonHome], 6);
- /* render markers for local IPs */
let circle = L.circleMarker([latHome, lonHome]).addTo(map);
circle.setStyle({ color: '#378242', opacity: 1.0, fillColor: '#378242', fillOpacity: 0.5, radius: 6 });
circle.bindPopup("<b><center>local IP</center></b>" +
*/
function handleAction(report, ev) {
if (ev === 'search') {
- L.ui.showModal(_('IP Search'), [
+ ui.showModal(_('IP Search'), [
E('p', _('Search the banIP-related Sets for a specific IP.')),
E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [
E('label', { 'style': 'padding-top:.5em', 'id': 'run' }, [
E('div', { 'class': 'right' }, [
E('button', {
'class': 'btn cbi-button',
- 'click': L.hideModal
+ 'click': ui.hideModal
}, _('Cancel')),
' ',
E('button', {
.forEach(key => {
selectOption.push(E('option', { 'value': content.nftables[key].set.name }, content.nftables[key].set.name));
})
- L.ui.showModal(_('Set Content'), [
+ ui.showModal(_('Set Content'), [
E('p', _('List the elements of a specific banIP-related Set.')),
E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [
E('label', { 'class': 'cbi-input-select', 'style': 'padding-top:.5em', 'id': 'run' }, [
E('div', { 'class': 'right' }, [
E('button', {
'class': 'btn cbi-button',
- 'click': L.hideModal
+ 'click': ui.hideModal
}, _('Cancel')),
' ',
E('button', {
document.getElementById('set').focus();
}
if (ev === 'map') {
- let md = L.ui.showModal(null, [
+ let md = ui.showModal(null, [
E('div', { id: 'mapModal',
style: 'position: relative;' }, [
E('iframe', {
E('div', { 'class': 'right' }, [
E('button', {
'class': 'btn cbi-button',
- 'click': function() {
- L.hideModal();
+ 'click': ui.createHandlerFn(this, function (ev) {
+ ui.hideModal();
sessionStorage.clear();
- }
+ location.reload();
+ })
}, _('Cancel')),
' ',
E('button', {
},
render: function (report) {
- let content, rowSets, tblSets, notMsg, errMsg;
+ let content=[], rowSets, tblSets, notMsg, errMsg;
- if (report[0]) {
+ if (report) {
try {
content = JSON.parse(report[0]);
} catch (e) {
- content = "";
- if (!errMsg) {
- errMsg = true;
- ui.addNotification(null, E('p', _('Unable to parse the report file!')), 'error');
- }
+ content[0] = "";
}
} else {
- content = "";
+ content[0] = "";
}
rowSets = [];
tblSets = E('table', { 'class': 'table', 'id': 'sets' }, [
])
]);
- if (content[0] && content[0].sets) {
+ if (content[0].sets) {
let cnt1, cnt2;
Object.keys(content[0].sets).sort().forEach(function (key) {
E('button', {
'class': 'btn cbi-button cbi-button-positive important',
'style': 'float:none',
- 'click': ui.createHandlerFn(this, function () {
- location.reload();
- })
+ 'click': function () {
+ document.querySelectorAll('.cbi-page-actions button').forEach(function(btn) {
+ btn.disabled = true;
+ })
+ this.blur();
+ this.classList.add('spinning');
+ L.resolveDefault(fs.exec_direct('/etc/init.d/banip', ['report', 'gen']))
+ .then(function () {
+ location.reload();
+ })
+ }
}, [_('Refresh')]),
])
]);
"/etc/init.d/banip report json": [
"exec"
],
+ "/etc/init.d/banip report gen": [
+ "exec"
+ ],
"/etc/init.d/banip search [A-Za-z0-9:.]*": [
"exec"
],