9 function handleAction(report
, ev
) {
10 if (ev
=== 'search') {
11 L
.ui
.showModal(_('IP Search'), [
12 E('p', _('Search the banIP-related Sets for a specific IP.')),
13 E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [
14 E('label', { 'style': 'padding-top:.5em', 'id': 'run' }, [
16 'class': 'cbi-input-text',
17 'placeholder': '192.168.0.1',
18 'style': 'width:300px',
19 'spellcheck': 'false',
24 E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [
29 'style': 'width: 100% !important; padding: 5px; font-family: monospace',
30 'readonly': 'readonly',
35 E('div', { 'class': 'right' }, [
37 'class': 'btn cbi-button',
42 'class': 'btn cbi-button-action',
43 'click': ui
.createHandlerFn(this, function (ev
) {
44 var ip
= document
.getElementById('search').value
.trim().toLowerCase();
46 document
.getElementById('run').classList
.add("spinning");
47 document
.getElementById('search').value
= ip
;
48 document
.getElementById('result').textContent
= 'The search is running, please wait...';
49 L
.resolveDefault(fs
.exec_direct('/etc/init.d/banip', ['search', ip
])).then(function (res
) {
50 var result
= document
.getElementById('result');
52 result
.textContent
= res
.trim();
54 result
.textContent
= _('No Search results!');
56 document
.getElementById('run').classList
.remove("spinning");
57 document
.getElementById('search').value
= '';
60 document
.getElementById('search').focus();
65 document
.getElementById('search').focus();
67 if (ev
=== 'survey') {
70 content
= JSON
.parse(report
[1]);
71 selectO
= [E('option', { value
: '' }, [_('-- Set Selection --')])];
72 for (var i
= 0; i
< Object
.keys(content
.nftables
).length
; i
++) {
73 if (content
.nftables
[i
].set !== undefined && content
.nftables
[i
].set.name
!== undefined) {
74 selectO
.push(E('option', { 'value': content
.nftables
[i
].set.name
}, content
.nftables
[i
].set.name
));
77 L
.ui
.showModal(_('Set Survey'), [
78 E('p', _('List the elements of a specific banIP-related Set.')),
79 E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [
80 E('label', { 'class': 'cbi-input-select', 'style': 'padding-top:.5em', 'id': 'run' }, [
82 E('select', { 'class': 'cbi-input-select', 'id': 'set' },
87 E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [
92 'style': 'width: 100% !important; padding: 5px; font-family: monospace',
93 'readonly': 'readonly',
98 E('div', { 'class': 'right' }, [
100 'class': 'btn cbi-button',
105 'class': 'btn cbi-button-action',
106 'click': ui
.createHandlerFn(this, function (ev
) {
107 var set = document
.getElementById('set').value
;
109 document
.getElementById('run').classList
.add("spinning");
110 document
.getElementById('result').textContent
= 'The survey is running, please wait...';
111 L
.resolveDefault(fs
.exec_direct('/etc/init.d/banip', ['survey', set])).then(function (res
) {
112 var result
= document
.getElementById('result');
114 result
.textContent
= res
.trim();
116 result
.textContent
= _('No Search results!');
118 document
.getElementById('run').classList
.remove("spinning");
119 document
.getElementById('set').value
= '';
122 document
.getElementById('set').focus();
127 document
.getElementById('set').focus();
134 L
.resolveDefault(fs
.exec_direct('/etc/init.d/banip', ['report', 'json']), '{}'),
135 L
.resolveDefault(fs
.exec_direct('/usr/sbin/nft', ['-tj', 'list', 'table', 'inet', 'banIP']), '{}')
139 render: function (report
) {
141 content
= JSON
.parse(report
[0]);
144 var tbl_sets
= E('table', { 'class': 'table', 'id': 'sets' }, [
145 E('tr', { 'class': 'tr table-titles' }, [
146 E('th', { 'class': 'th' }, _('Set')),
147 E('th', { 'class': 'th right', 'style': 'padding-right: 20px' }, _('Elements')),
148 E('th', { 'class': 'th' }, _('WAN-Input (packets)')),
149 E('th', { 'class': 'th' }, _('WAN-Forward (packets)')),
150 E('th', { 'class': 'th' }, _('LAN-Forward (packets)'))
155 var cnt1
, cnt2
, cnt3
;
156 Object
.keys(content
.sets
).forEach(function (key
) {
157 cnt1
= content
.sets
[key
].cnt_input
? ': (' + content
.sets
[key
].cnt_input
+ ')' : '';
158 cnt2
= content
.sets
[key
].cnt_forwardwan
? ': (' + content
.sets
[key
].cnt_forwardwan
+ ')' : '';
159 cnt3
= content
.sets
[key
].cnt_forwardlan
? ': (' + content
.sets
[key
].cnt_forwardlan
+ ')' : '';
162 E('em', { 'style': 'padding-right: 20px' }, content
.sets
[key
].cnt_elements
),
163 E('em', content
.sets
[key
].input
+ cnt1
),
164 E('em', content
.sets
[key
].wan_forward
+ cnt2
),
165 E('em', content
.sets
[key
].lan_forward
+ cnt3
)
169 E('em', { 'style': 'font-weight: bold' }, content
.sum_sets
),
170 E('em', { 'style': 'font-weight: bold; padding-right: 20px' }, content
.sum_setelements
),
171 E('em', { 'style': 'font-weight: bold' }, content
.sum_setinput
+ ' (' + content
.sum_cntinput
+ ')'),
172 E('em', { 'style': 'font-weight: bold' }, content
.sum_setforwardwan
+ ' (' + content
.sum_cntforwardwan
+ ')'),
173 E('em', { 'style': 'font-weight: bold' }, content
.sum_setforwardlan
+ ' (' + content
.sum_cntforwardlan
+ ')')
176 cbi_update_table(tbl_sets
, rows_sets
);
178 return E('div', { 'class': 'cbi-map', 'id': 'map' }, [
179 E('div', { 'class': 'cbi-section' }, [
180 E('p', _('This tab shows the last generated Set Report, press the \'Refresh\' button to get a new one.')),
182 E('div', { 'class': 'cbi-value' }, [
183 E('div', { 'class': 'cbi-value-title', 'style': 'float:left;width:230px' }, _('Timestamp')),
184 E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'float:left;color:#37c' }, content
.timestamp
|| '-')
186 E('div', { 'class': 'cbi-value' }, [
187 E('div', { 'class': 'cbi-value-title', 'style': 'float:left;width:230px' }, _('auto-added to allowlist today')),
188 E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'float:left;color:#37c' }, content
.autoadd_allow
|| '-')
190 E('div', { 'class': 'cbi-value' }, [
191 E('div', { 'class': 'cbi-value-title', 'style': 'float:left;width:230px' }, _('auto-added to blocklist today')),
192 E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'float:left;color:#37c' }, content
.autoadd_block
|| '-')
194 E('div', { 'class': 'right' }, [
196 'class': 'btn cbi-button cbi-button-apply',
197 'click': ui
.createHandlerFn(this, function () {
198 return handleAction(report
, 'survey');
200 }, [_('Set Survey...')]),
203 'class': 'btn cbi-button cbi-button-apply',
204 'click': ui
.createHandlerFn(this, function () {
205 return handleAction(report
, 'search');
207 }, [_('IP Search...')]),
210 'class': 'btn cbi-button cbi-button-positive',
211 'click': ui
.createHandlerFn(this, async
function () {
212 L
.resolveDefault(fs
.exec_direct('/etc/init.d/banip', ['report', 'json']), '');
220 E('div', { 'class': 'cbi-section' }, [
221 E('div', { 'class': 'left' }, [
222 E('h3', _('Set details')),
228 handleSaveApply
: null,