02865335a7b28ac5eece03d3ec935e91b42c3115
[project/luci.git] / applications / luci-app-banip / htdocs / luci-static / resources / view / banip / setreport.js
1 'use strict';
2 'require view';
3 'require fs';
4 'require ui';
5
6 /*
7 button handling
8 */
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' }, [
15 E('input', {
16 'class': 'cbi-input-text',
17 'placeholder': '192.168.0.1',
18 'style': 'width:300px',
19 'spellcheck': 'false',
20 'id': 'search'
21 })
22 ])
23 ]),
24 E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [
25 '\xa0',
26 E('h5', _('Result')),
27 E('textarea', {
28 'id': 'result',
29 'style': 'width: 100% !important; padding: 5px; font-family: monospace',
30 'readonly': 'readonly',
31 'wrap': 'off',
32 'rows': 20
33 })
34 ]),
35 E('div', { 'class': 'right' }, [
36 E('button', {
37 'class': 'btn cbi-button',
38 'click': L.hideModal
39 }, _('Cancel')),
40 ' ',
41 E('button', {
42 'class': 'btn cbi-button-action',
43 'click': ui.createHandlerFn(this, function (ev) {
44 let ip = document.getElementById('search').value.trim().toLowerCase();
45 if (ip) {
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');
51 if (res) {
52 result.textContent = res.trim();
53 } else {
54 result.textContent = _('No Search results!');
55 }
56 document.getElementById('run').classList.remove("spinning");
57 document.getElementById('search').value = '';
58 })
59 }
60 document.getElementById('search').focus();
61 })
62 }, _('Search'))
63 ])
64 ]);
65 document.getElementById('search').focus();
66 }
67 if (ev === 'survey') {
68 let content, selectOption;
69
70 if (report[1]) {
71 content = JSON.parse(report[1]);
72 } else {
73 content = "";
74 }
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));
79 }
80 }
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' }, [
85 E('h5', _('Set')),
86 E('select', { 'class': 'cbi-input-select', 'id': 'set' },
87 selectOption
88 )
89 ]),
90 ]),
91 E('div', { 'class': 'left', 'style': 'display:flex; flex-direction:column' }, [
92 '\xa0',
93 E('h5', _('Result')),
94 E('textarea', {
95 'id': 'result',
96 'style': 'width: 100% !important; padding: 5px; font-family: monospace',
97 'readonly': 'readonly',
98 'wrap': 'off',
99 'rows': 20
100 })
101 ]),
102 E('div', { 'class': 'right' }, [
103 E('button', {
104 'class': 'btn cbi-button',
105 'click': L.hideModal
106 }, _('Cancel')),
107 ' ',
108 E('button', {
109 'class': 'btn cbi-button-action',
110 'click': ui.createHandlerFn(this, function (ev) {
111 let set = document.getElementById('set').value;
112 if (set) {
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');
117 if (res) {
118 result.textContent = res.trim();
119 } else {
120 result.textContent = _('No Search results!');
121 }
122 document.getElementById('run').classList.remove("spinning");
123 document.getElementById('set').value = '';
124 })
125 }
126 document.getElementById('set').focus();
127 })
128 }, _('Survey'))
129 ])
130 ]);
131 document.getElementById('set').focus();
132 }
133 }
134
135 return view.extend({
136 load: function () {
137 return Promise.all([
138 L.resolveDefault(fs.exec_direct('/etc/init.d/banip', ['report', 'json']), ''),
139 L.resolveDefault(fs.exec_direct('/usr/sbin/nft', ['-tj', 'list', 'ruleset']), '')
140 ]);
141 },
142
143 render: function (report) {
144 let content, rowSets, tblSets;
145
146 if (report[0]) {
147 content = JSON.parse(report[0]);
148 } else {
149 content = "";
150 }
151 rowSets = [];
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'))
160 ])
161 ]);
162
163 if (content.sets) {
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 + ')' : '';
169 rowSets.push([
170 E('em', key),
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)
176 ]);
177 });
178 rowSets.push([
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 + ')')
184 ]);
185 }
186 cbi_update_table(tblSets, rowSets);
187
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.')),
191 E('p', '\xa0'),
192 E('div', { 'class': 'cbi-value' }, [
193 E('div', { 'class': 'cbi-value-title', 'style': 'float:left;width:230px' }, _('Timestamp')),
194 E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'float:left;color:#37c' }, content.timestamp || '-')
195 ]),
196 E('div', { 'class': 'cbi-value' }, [
197 E('div', { 'class': 'cbi-value-title', 'style': 'float:left;width:230px' }, _('auto-added to allowlist today')),
198 E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'float:left;color:#37c' }, content.autoadd_allow || '-')
199 ]),
200 E('div', { 'class': 'cbi-value' }, [
201 E('div', { 'class': 'cbi-value-title', 'style': 'float:left;width:230px' }, _('auto-added to blocklist today')),
202 E('div', { 'class': 'cbi-value-title', 'id': 'start', 'style': 'float:left;color:#37c' }, content.autoadd_block || '-')
203 ]),
204 E('div', { 'class': 'right' }, [
205 E('button', {
206 'class': 'btn cbi-button cbi-button-apply',
207 'click': ui.createHandlerFn(this, function () {
208 return handleAction(report, 'survey');
209 })
210 }, [_('Set Survey...')]),
211 '\xa0\xa0\xa0',
212 E('button', {
213 'class': 'btn cbi-button cbi-button-apply',
214 'click': ui.createHandlerFn(this, function () {
215 return handleAction(report, 'search');
216 })
217 }, [_('IP Search...')]),
218 '\xa0\xa0\xa0',
219 E('button', {
220 'class': 'btn cbi-button cbi-button-positive',
221 'click': ui.createHandlerFn(this, function () {
222 location.reload();
223 })
224 }, [_('Refresh')])
225 ]),
226 ])
227 ,
228 E('br'),
229 E('div', { 'class': 'cbi-section' }, [
230 E('div', { 'class': 'left' }, [
231 E('h3', _('Set details')),
232 tblSets
233 ])
234 ])
235 ]);
236 },
237 handleSaveApply: null,
238 handleSave: null,
239 handleReset: null
240 });