Update luci-app-zapret module

This commit is contained in:
remittor
2024-10-11 21:10:31 +03:00
parent 90a47b3058
commit 1f73e6f451
5 changed files with 99 additions and 73 deletions

View File

@@ -1,5 +1,5 @@
# #
# Copyright (с) 2024 remittor # Copyright (c) 2024 remittor
# #
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
@@ -13,4 +13,7 @@ LUCI_TITLE:=LuCI support for zapret
LUCI_DEPENDS:=+zapret LUCI_DEPENDS:=+zapret
LUCI_PKGARCH:=all LUCI_PKGARCH:=all
#include ../../luci.mk
include $(TOPDIR)/feeds/luci/luci.mk include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature

View File

@@ -10,18 +10,19 @@ const btn_style_neutral = 'btn';
const btn_style_action = 'btn cbi-button-action'; const btn_style_action = 'btn cbi-button-action';
const btn_style_positive = 'btn cbi-button-save important'; const btn_style_positive = 'btn cbi-button-save important';
const btn_style_negative = 'btn cbi-button-reset important'; const btn_style_negative = 'btn cbi-button-reset important';
const btn_style_warning = 'btn cbi-button-negative important'; const btn_style_warning = 'btn cbi-button-negative';
const btn_style_success = 'btn cbi-button-success important';
return view.extend({ return view.extend({
disableButtons: function(flag, btn, elems = [ ]) { disableButtons: function(flag, btn, elems = [ ]) {
let btn_start = elems[1] || document.getElementById("btn_start"); let btn_start = elems[1] || document.getElementById("btn_start");
let btn_destroy = elems[4] || document.getElementById("btn_destroy"); //let btn_destroy = elems[4] || document.getElementById("btn_destroy");
let btn_enable = elems[2] || document.getElementById("btn_enable"); let btn_enable = elems[2] || document.getElementById("btn_enable");
let btn_update = elems[3] || document.getElementById("btn_update"); let btn_update = elems[3] || document.getElementById("btn_update");
btn_start.disabled = flag; btn_start.disabled = flag;
btn_update.disabled = true; // TODO btn_update.disabled = true; // TODO
btn_destroy.disabled = flag; //btn_destroy.disabled = flag;
if (btn === btn_update) { if (btn === btn_update) {
btn_enable.disabled = false; btn_enable.disabled = false;
} else { } else {
@@ -34,6 +35,7 @@ return view.extend({
{ code: -1 }, //fs.exec(tools.execPath, [ 'raw-status' ]), { code: -1 }, //fs.exec(tools.execPath, [ 'raw-status' ]),
{ code: -1 }, //fs.exec(tools.execPath, [ 'vpn-route-status' ]), { code: -1 }, //fs.exec(tools.execPath, [ 'vpn-route-status' ]),
tools.getInitStatus(tools.appName), tools.getInitStatus(tools.appName),
//L.resolveDefault(fs.read(tools.tokenFile), 0),
uci.load(tools.appName), uci.load(tools.appName),
]).catch(e => { ]).catch(e => {
ui.addNotification(null, E('p', _('Unable to execute or read contents') ui.addNotification(null, E('p', _('Unable to execute or read contents')
@@ -60,6 +62,7 @@ return view.extend({
let bllist_preset = 'user_only'; let bllist_preset = 'user_only';
let btn_enable = elems[2] || document.getElementById('btn_enable'); let btn_enable = elems[2] || document.getElementById('btn_enable');
/*
if (enabled_flag == true) { if (enabled_flag == true) {
btn_enable.onclick = ui.createHandlerFn(this, this.serviceAction, 'disable', 'btn_enable'); btn_enable.onclick = ui.createHandlerFn(this, this.serviceAction, 'disable', 'btn_enable');
btn_enable.textContent = _('Enabled'); btn_enable.textContent = _('Enabled');
@@ -69,21 +72,21 @@ return view.extend({
btn_enable.textContent = _('Disabled'); btn_enable.textContent = _('Disabled');
btn_enable.className = btn_style_negative; btn_enable.className = btn_style_negative;
} }
*/
let btn_start = elems[1] || document.getElementById('btn_start'); let btn_start = elems[1] || document.getElementById('btn_start');
let btn_update = elems[3] || document.getElementById('btn_update'); let btn_update = elems[3] || document.getElementById('btn_update');
let btn_destroy = elems[4] || document.getElementById('btn_destroy'); //let btn_destroy = elems[4] || document.getElementById('btn_destroy');
let btnStartStateOn = () => { let btnStartStateOn = () => {
btn_start.onclick = ui.createHandlerFn(this, this.appAction, 'stop', 'btn_start'); //btn_start.onclick = ui.createHandlerFn(this, this.appAction, 'stop', 'btn_start');
btn_start.textContent = _('Enabled'); //btn_start.textContent = _('Enabled');
btn_start.className = btn_style_positive; //btn_start.className = btn_style_positive;
}; };
let btnStartStateOff = () => { let btnStartStateOff = () => {
btn_start.onclick = ui.createHandlerFn(this, this.appAction, 'start', 'btn_start'); //btn_start.onclick = ui.createHandlerFn(this, this.appAction, 'start', 'btn_start');
btn_start.textContent = _('Disabled'); //btn_start.textContent = _('Disabled');
btn_start.className = btn_style_negative; //btn_start.className = btn_style_negative;
}; };
if (app_status_code == -1) { if (app_status_code == -1) {
@@ -93,7 +96,7 @@ return view.extend({
else if (app_status_code == 0) { else if (app_status_code == 0) {
this.disableButtons(false, null, elems); this.disableButtons(false, null, elems);
btnStartStateOn(); btnStartStateOn();
btn_destroy.disabled = false; //btn_destroy.disabled = false;
btn_update.disabled = false; btn_update.disabled = false;
} }
else if (app_status_code == 2) { else if (app_status_code == 2) {
@@ -130,6 +133,11 @@ return view.extend({
poll.stop(); poll.stop();
let res = fs.exec('/opr/zapret/sync_config.sh');
if (res.code != 0) {
ui.addNotification(null, E('p', _('Unable to run sync_config.sh') + ' [code: '+res.code+']'));
return res;
}
return tools.handleServiceAction(tools.appName, action).then(() => { return tools.handleServiceAction(tools.appName, action).then(() => {
return this.getAppStatus().then( return this.getAppStatus().then(
(status_array) => { (status_array) => {
@@ -217,55 +225,62 @@ return view.extend({
let layout = E('div', { 'class': 'cbi-section-node' }); let layout = E('div', { 'class': 'cbi-section-node' });
function layout_append(elem, title, descr) { function layout_append(title, descr, elem) {
descr = (descr) ? E('div', { 'class': 'cbi-value-description' }, descr) : ''; descr = (descr) ? E('div', { 'class': 'cbi-value-description' }, descr) : '';
let elist;
if (elem instanceof E) {
elist = [ elem ];
} else {
elist = elem;
}
let vlist = [ E('div', {}, elist ) ];
for (let i = 0; i < elist.length; i++) {
let input = E('input', {
'id' : elist[i].id + '_hidden',
'type': 'hidden',
});
vlist.push(input);
}
layout.append( layout.append(
E('div', { 'class': 'cbi-value' }, [ E('div', { 'class': 'cbi-value' }, [
E('label', { 'class': 'cbi-value-title', 'for': elem.id + '_hidden' || null }, title), E('label', { 'class': 'cbi-value-title', 'for': elem.id + '_hidden' || null }, title),
E('div', { 'class': 'cbi-value-field' }, [ E('div', { 'class': 'cbi-value-field' }, vlist),
E('div', {}, elem),
E('input', {
'id' : elem.id + '_hidden',
'type': 'hidden',
}),
descr,
]),
]) ])
); );
} }
let btn_start = E('button', { let create_btn = function(name, _class, locname) {
'id' : 'btn_start', return E('button', {
'name' : 'btn_start', 'id' : name,
'class': btn_style_action, 'name' : name,
}, _('Enable')); 'class': _class,
layout_append(btn_start, _('Service')); }, locname);
};
let btn_enable = E('button', { let btn_enable = create_btn('btn_enable', btn_style_success, _('Enable'));
'id' : 'btn_enable', btn_enable.onclick = ui.createHandlerFn(this, this.serviceAction, 'enable', 'btn_enable');
'name' : 'btn_enable', let btn_disable = create_btn('btn_disable', btn_style_warning, _('Disable'));
'class': btn_style_positive, btn_disable.onclick = ui.createHandlerFn(this, this.serviceAction, 'disable', 'btn_disable');
}, _('Enable')); layout_append(_('Service Status'), null, [ btn_enable, btn_disable ] );
layout_append(btn_enable, _('Run at startup'));
let btn_update = E('button', { let btn_start = create_btn('btn_start', btn_style_action, _('Start'));
'id' : 'btn_update', btn_start.onclick = ui.createHandlerFn(this, this.serviceAction, 'start', 'btn_start');
'name' : 'btn_update', let btn_restart = create_btn('btn_restart', btn_style_action, _('Restart'));
'class': btn_style_action, btn_restart.onclick = ui.createHandlerFn(this, this.serviceAction, 'restart', 'btn_restart');
}, _('Update')); let btn_stop = create_btn('btn_stop', btn_style_warning, _('Stop'));
btn_stop.onclick = ui.createHandlerFn(this, this.serviceAction, 'stop', 'btn_stop');
layout_append(_('Service Control'), null, [ btn_start, btn_restart, btn_stop ] );
let btn_update = create_btn('btn_update', btn_style_action, _('Update'));
btn_update.onclick = ui.createHandlerFn(this, () => { this.appAction('update', 'btn_update') }); btn_update.onclick = ui.createHandlerFn(this, () => { this.appAction('update', 'btn_update') });
layout_append(btn_update, _('Update blacklist')); layout_append(_('Update blacklist'), null, btn_update);
let btn_destroy = E('button', { let btn_destroy = create_btn('btn_destroy', btn_style_negative, _('Shutdown'));
'id' : 'btn_destroy',
'name' : 'btn_destroy',
'class': btn_style_negative,
}, _('Shutdown'));
btn_destroy.onclick = L.bind(this.dialogDestroy, this); btn_destroy.onclick = L.bind(this.dialogDestroy, this);
//layout_append(_('Shutdown'), _('Complete service shutdown'), btn_destroy);
layout_append(btn_destroy, _('Shutdown'), _('Complete service shutdown')); //let elems = [ status_string, btn_start, btn_enable, btn_update, btn_destroy ];
let elems = [ status_string, btn_start, btn_enable, btn_update ];
let elems = [ status_string, btn_start, btn_enable, btn_update, btn_destroy ];
this.setAppStatus(status_array, elems); this.setAppStatus(status_array, elems);
poll.add(L.bind(this.statusPoll, this)); poll.add(L.bind(this.statusPoll, this));

View File

@@ -134,6 +134,11 @@ return view.extend({
name = "<EMPTY>"; name = "<EMPTY>";
return name; return name;
}; };
o.validate = function(section_id, value) {
if (!value)
return "";
return value;
};
}; };
add_delim(); add_delim();
@@ -170,29 +175,27 @@ return view.extend({
tabname = 'blacklist_tab'; tabname = 'blacklist_tab';
s.tab(tabname, _('Blacklist settings')); s.tab(tabname, _('Blacklist settings'));
let user_entries_edit = new tools.fileEditDialog( o = s.taboption(tabname, form.Button, '_user_entries_btn', _('User hostname entries'));
o.inputtitle = _('Edit');
o.inputstyle = 'edit btn';
o.onclick = () => new tools.fileEditDialog(
tools.userEntriesFile, tools.userEntriesFile,
_('User entries'), _('User entries'),
_('One hostname per line.<br />Examples:'), _('One hostname per line.<br />Examples:'),
'<code>domain.net<br />sub.domain.com<br />googlevideo.com</code>', '<code>domain.net<br />sub.domain.com<br />googlevideo.com</code>',
15 15
); ).show();
o = s.taboption(tabname, form.Button, '_user_entries_btn', _('User hostname entries'));
o.onclick = () => user_entries_edit.show(); o = s.taboption(tabname, form.Button, '_ip_filter_btn', _('User IP entries'));
o.inputtitle = _('Edit'); o.inputtitle = _('Edit');
o.inputstyle = 'edit btn'; o.inputstyle = 'edit btn';
o.onclick = () => new tools.fileEditDialog(
let ip_filter_edit = new tools.fileEditDialog(
tools.ipFilterFile, tools.ipFilterFile,
_('IP filter'), _('IP filter'),
_('Patterns can be strings or regular expressions. Each pattern in a separate line<br />Examples:'), _('Patterns can be strings or regular expressions. Each pattern in a separate line<br />Examples:'),
'<code>128.199.0.0/16<br />34.217.90.52<br />162.13.190.77</code>', '<code>128.199.0.0/16<br />34.217.90.52<br />162.13.190.77</code>',
15 15
); ).show();
o = s.taboption(tabname, form.Button, '_ip_filter_btn', _('User IP entries'));
o.onclick = () => ip_filter_edit.show();
o.inputtitle = _('Edit');
o.inputstyle = 'edit btn';
let map_promise = m.render(); let map_promise = m.render();
map_promise.then(node => node.classList.add('fade-in')); map_promise.then(node => node.classList.add('fade-in'));
@@ -202,9 +205,9 @@ return view.extend({
handleSaveApply: function(ev, mode) { handleSaveApply: function(ev, mode) {
return this.handleSave(ev).then(() => { return this.handleSave(ev).then(() => {
ui.changes.apply(mode == '0'); ui.changes.apply(mode == '0');
if (this.appStatusCode != 1 && this.appStatusCode != 2) { //if (this.appStatusCode != 1 && this.appStatusCode != 2) {
window.setTimeout(() => fs.exec(tools.execPath, [ 'restart' ]), 3000); // window.setTimeout(() => fs.exec(tools.execPath, [ 'restart' ]), 3000);
} //}
}); });
}, },
}); });

View File

@@ -91,7 +91,7 @@ return baseclass.extend({
makeStatusString: function(app_status_code, fwtype, bllist_preset) { makeStatusString: function(app_status_code, fwtype, bllist_preset) {
let app_status_label; let app_status_label;
let spinning = ''; let spinning = '';
/*
switch(app_status_code) { switch(app_status_code) {
case 0: case 0:
app_status_label = this.infoLabelRunning; app_status_label = this.infoLabelRunning;
@@ -120,7 +120,7 @@ return baseclass.extend({
</tr> </tr>
</table>`; </table>`;
} }
*/
return `<table class="table"> return `<table class="table">
<tr class="tr"> <tr class="tr">
<td class="td left" style="min-width:33%%"> <td class="td left" style="min-width:33%%">
@@ -307,9 +307,13 @@ return baseclass.extend({
let value = txt.value.trim().replace(/\r\n/g, ' ').replace(/\r/g, ' ').replace(/\n/g, ' ').trim(); let value = txt.value.trim().replace(/\r\n/g, ' ').replace(/\r/g, ' ').replace(/\n/g, ' ').trim();
uci.set('zapret', this.cfgsec, this.cfgparam, value); uci.set('zapret', this.cfgsec, this.cfgparam, value);
uci.save();
ui.hideModal();
//ui.refreshPage(); // TODO
/*
return uci.save() return uci.save()
.then(L.bind(ui.changes.init, ui.changes)) .then(L.bind(ui.changes.init, ui.changes))
.then(L.bind(ui.changes.displayChanges, ui.changes))
//.then(L.bind(ui.changes.apply, ui.changes)) //.then(L.bind(ui.changes.apply, ui.changes))
.then(ui.addNotification(null, E('p', _('Contents have been saved.')), 'info')) .then(ui.addNotification(null, E('p', _('Contents have been saved.')), 'info'))
.catch(e => { .catch(e => {
@@ -317,6 +321,7 @@ return baseclass.extend({
}).finally(() => { }).finally(() => {
ui.hideModal(); ui.hideModal();
}); });
*/
}, },
error: function(e) { error: function(e) {
@@ -335,10 +340,10 @@ return baseclass.extend({
}, },
show: function() { show: function() {
ui.showModal(null, E('p', { 'class': 'spinning' }, _('Loading')) ); //ui.showModal(null, E('p', { 'class': 'spinning' }, _('Loading')) );
let content = this.load(); let content = this.load();
ui.hideModal(); //ui.hideModal();
if (content == null) { if (content === null) {
return this.error('Cannot load parameter'); return this.error('Cannot load parameter');
} }
return this.render(content); return this.render(content);

View File

@@ -8,9 +8,9 @@
"/opt/zapret/ipset/*": [ "read" ], "/opt/zapret/ipset/*": [ "read" ],
"/etc/crontabs/root": [ "read" ], "/etc/crontabs/root": [ "read" ],
"/etc/init.d/zapret*": [ "exec" ], "/etc/init.d/zapret*": [ "exec" ],
"/opt/zapret/sync_config.sh": [ "exec" ] "/opt/zapret/sync_config.sh*": [ "exec" ]
}, },
"uci": [ "zapret", "network", "firewall" ], "uci": [ "zapret", "network" ],
"ubus": { "ubus": {
"luci": [ "getInitList", "setInitAction" ] "luci": [ "getInitList", "setInitAction" ]
} }