mirror of
https://github.com/remittor/zapret-openwrt.git
synced 2025-12-14 07:26:48 +03:00
Update luci-app-zapret module
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
//}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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" ]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user