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 let 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 let 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') {
68 let content
, selectOption
;
71 content
= JSON
.parse(report
[1]);
75 selectOption
= [E('option', { value
: '' }, [_('-- Set Selection --')])];
76 for (let i
= 0; i
< Object
.keys(content
.nftables
).length
; i
++) {
77 if (content
.nftables
[i
].set && content
.nftables
[i
].set.name
!== undefined && content
.nftables
[i
].set.table
!== undefined && content
.nftables
[i
].set.table
=== 'banIP') {
78 selectOption
.push(E('option', { 'value': content
.nftables
[i
].set.name
}, content
.nftables
[i
].set.name
));
81 L
.ui
.showModal(_('Set Survey'), [
82 E('p', _('List the elements of a specific banIP-related Set.')),
83 E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [
84 E('label', { 'class': 'cbi-input-select', 'style': 'padding-top:.5em', 'id': 'run' }, [
86 E('select', { 'class': 'cbi-input-select', 'id': 'set' },
91 E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [
96 'style': 'width: 100% !important; padding: 5px; font-family: monospace',
97 'readonly': 'readonly',
102 E('div', { 'class': 'right' }, [
104 'class': 'btn cbi-button',
109 'class': 'btn cbi-button-action',
110 'click': ui
.createHandlerFn(this, function (ev
) {
111 let set = document
.getElementById('set').value
;
113 document
.getElementById('run').classList
.add("spinning");
114 document
.getElementById('result').textContent
= 'The survey is running, please wait...';
115 L
.resolveDefault(fs
.exec_direct('/etc/init.d/banip', ['survey', set])).then(function (res
) {
116 let result
= document
.getElementById('result');
118 result
.textContent
= res
.trim();
120 result
.textContent
= _('No Search results!');
122 document
.getElementById('run').classList
.remove("spinning");
123 document
.getElementById('set').value
= '';
126 document
.getElementById('set').focus();
131 document
.getElementById('set').focus();
138 L
.resolveDefault(fs
.exec_direct('/etc/init.d/banip', ['report', 'json']), ''),
139 L
.resolveDefault(fs
.exec_direct('/usr/sbin/nft', ['-tj', 'list', 'ruleset']), '')
143 render: function (report
) {
144 let content
, rowSets
, tblSets
;
147 content
= JSON
.parse(report
[0]);
152 tblSets
= E('table', { 'class': 'table', 'id': 'sets' }, [
153 E('tr', { 'class': 'tr table-titles' }, [
154 E('th', { 'class': 'th' }, _('Set')),
155 E('th', { 'class': 'th right', 'style': 'padding-right: 20px' }, _('Elements')),
156 E('th', { 'class': 'th' }, _('WAN-Input (packets)')),
157 E('th', { 'class': 'th' }, _('WAN-Forward (packets)')),
158 E('th', { 'class': 'th' }, _('LAN-Forward (packets)')),
159 E('th', { 'class': 'th' }, _('Port/Protocol Limit'))
164 let cnt1
, cnt2
, cnt3
;
165 Object
.keys(content
.sets
).forEach(function (key
) {
166 cnt1
= content
.sets
[key
].cnt_input
? ': (' + content
.sets
[key
].cnt_input
+ ')' : '';
167 cnt2
= content
.sets
[key
].cnt_forwardwan
? ': (' + content
.sets
[key
].cnt_forwardwan
+ ')' : '';
168 cnt3
= content
.sets
[key
].cnt_forwardlan
? ': (' + content
.sets
[key
].cnt_forwardlan
+ ')' : '';
171 E('em', { 'style': 'padding-right: 20px' }, content
.sets
[key
].cnt_elements
),
172 E('em', content
.sets
[key
].input
+ cnt1
),
173 E('em', content
.sets
[key
].wan_forward
+ cnt2
),
174 E('em', content
.sets
[key
].lan_forward
+ cnt3
),
175 E('em', content
.sets
[key
].port
)
179 E('em', { 'style': 'font-weight: bold' }, content
.sum_sets
),
180 E('em', { 'style': 'font-weight: bold; padding-right: 20px' }, content
.sum_setelements
),
181 E('em', { 'style': 'font-weight: bold' }, content
.sum_setinput
+ ' (' + content
.sum_cntinput
+ ')'),
182 E('em', { 'style': 'font-weight: bold' }, content
.sum_setforwardwan
+ ' (' + content
.sum_cntforwardwan
+ ')'),
183 E('em', { 'style': 'font-weight: bold' }, content
.sum_setforwardlan
+ ' (' + content
.sum_cntforwardlan
+ ')')
186 cbi_update_table(tblSets
, rowSets
);
188 return E('div', { 'class': 'cbi-map', 'id': 'map' }, [
189 E('div', { 'class': 'cbi-section' }, [
190 E('p', _('This tab shows the last generated Set Report, press the \'Refresh\' button to get a new one.')),
192 E('div', { 'class': 'cbi-value' }, [
193 E('div', { 'class': 'cbi-value-title', 'style': 'margin-bottom:-5px;float:left;width:230px;font-weight:bold;' }, _('Timestamp')),
194 E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'margin-bottom:-5px;float:left;color:#37c;font-weight:bold;' }, content
.timestamp
|| '-')
197 E('div', { 'class': 'cbi-value' }, [
198 E('div', { 'class': 'cbi-value-title', 'style': 'margin-top:-5px;float:left;width:230px;font-weight:bold;' }, _('blocked syn-flood packets')),
199 E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'margin-top:-5px;float:left;color:#37c;font-weight:bold;' }, content
.sum_synflood
|| '-')
201 E('div', { 'class': 'cbi-value' }, [
202 E('div', { 'class': 'cbi-value-title', 'style': 'margin-top:-5px;float:left;width:230px;font-weight:bold;' }, _('blocked udp-flood packets')),
203 E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'margin-top:-5px;float:left;color:#37c;font-weight:bold;' }, content
.sum_udpflood
|| '-')
205 E('div', { 'class': 'cbi-value' }, [
206 E('div', { 'class': 'cbi-value-title', 'style': 'margin-top:-5px;float:left;width:230px;font-weight:bold;' }, _('blocked icmp-flood packets')),
207 E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'margin-top:-5px;float:left;color:#37c;font-weight:bold;' }, content
.sum_icmpflood
|| '-')
209 E('div', { 'class': 'cbi-value' }, [
210 E('div', { 'class': 'cbi-value-title', 'style': 'margin-top:-5px;float:left;width:230px;font-weight:bold;' }, _('blocked invalid ct packets')),
211 E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'margin-top:-5px;float:left;color:#37c;font-weight:bold;' }, content
.sum_ctinvalid
|| '-')
213 E('div', { 'class': 'cbi-value' }, [
214 E('div', { 'class': 'cbi-value-title', 'style': 'margin-top:-5px;float:left;width:230px;font-weight:bold;' }, _('blocked invalid tcp packets')),
215 E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'margin-top:-5px;float:left;color:#37c;font-weight:bold;' }, content
.sum_tcpinvalid
|| '-')
218 E('div', { 'class': 'cbi-value' }, [
219 E('div', { 'class': 'cbi-value-title', 'style': 'margin-top:-5px;float:left;width:230px;font-weight:bold;' }, _('auto-added IPs to allowlist')),
220 E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'margin-top:-5px;float:left;color:#37c;font-weight:bold;' }, content
.autoadd_allow
|| '-')
222 E('div', { 'class': 'cbi-value' }, [
223 E('div', { 'class': 'cbi-value-title', 'style': 'margin-top:-5px;float:left;width:230px;font-weight:bold;' }, _('auto-added IPs to blocklist')),
224 E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'margin-top:-5px;float:left;color:#37c;font-weight:bold;' }, content
.autoadd_block
|| '-')
226 E('div', { 'class': 'right' }, [
228 'class': 'btn cbi-button cbi-button-apply',
229 'click': ui
.createHandlerFn(this, function () {
230 return handleAction(report
, 'survey');
232 }, [_('Set Survey...')]),
235 'class': 'btn cbi-button cbi-button-apply',
236 'click': ui
.createHandlerFn(this, function () {
237 return handleAction(report
, 'search');
239 }, [_('IP Search...')]),
242 'class': 'btn cbi-button cbi-button-positive',
243 'click': ui
.createHandlerFn(this, function () {
251 E('div', { 'class': 'cbi-section' }, [
252 E('div', { 'class': 'left' }, [
253 E('h3', _('Set details')),
259 handleSaveApply
: null,