Compare commits
27 Commits
v65-202410
...
v67-202410
| Author | SHA1 | Date | |
|---|---|---|---|
| 2cf3d0b996 | |||
| d463d2e39e | |||
| 148a397051 | |||
| 9f73af44dd | |||
| 40f0432b1c | |||
| ca11a6cd55 | |||
| 39833fdcea | |||
| 425fde748f | |||
| 0df621f443 | |||
| f17b00c107 | |||
| c67ce19626 | |||
| 4b932b2c4a | |||
| a8d25b2d2b | |||
| 9f40c1fcd1 | |||
| 3154d3f5f6 | |||
| 7e901513c5 | |||
| 5373d5dd2a | |||
| 836b324a0b | |||
| 2db3bd7514 | |||
| 0b20fe4a93 | |||
| 5f3dfe04ab | |||
| 030b243bd6 | |||
| f72a82bfe7 | |||
| ed09612065 | |||
| 144b9369b9 | |||
| 79af08d99e | |||
| 8d915f3e1d |
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@ -209,7 +209,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
mkdir -p public
|
mkdir -p public
|
||||||
find . -name "ipk-openwrt-$BRANCH-*.tar" -exec tar -xvf {} --wildcards '*.ipk' \;
|
find . -name "ipk-openwrt-$BRANCH-*.tar" -exec tar -xvf {} --wildcards '*.ipk' \;
|
||||||
find $BRANCH -mindepth 1 -type d -exec sh -c 'zip -0 ./public/zapret_${TAG}_$(basename {}).ipk.zip -j {} {}/*' \;
|
find $BRANCH -mindepth 1 -type d -exec sh -c 'zip -0 ./public/zapret_${TAG}_$(basename {}).zip -j {} {}/*' \;
|
||||||
ls -lh ./public/*.zip
|
ls -lh ./public/*.zip
|
||||||
|
|
||||||
- name: Upload assets
|
- name: Upload assets
|
||||||
|
|||||||
11
README.md
Normal file
11
README.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[](https://github.com/remittor/zapret-openwrt/actions/workflows/build.yml)
|
||||||
|
# zapret-openwrt
|
||||||
|
|
||||||
|
[Instructions for installing](https://github.com/remittor/zapret-openwrt/wiki/Installing-zapret‐openwrt-package)
|
||||||
|
|
||||||
|
[Download page](https://github.com/remittor/zapret-openwrt/releases)
|
||||||
|
|
||||||
|
Screenshot:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
@ -5,15 +5,27 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=luci-app-zapret
|
PKG_NAME:=luci-app-zapret
|
||||||
PKG_RELEASE:=20241018
|
PKG_RELEASE:=20241030
|
||||||
PKG_VERSION:=65-$(PKG_RELEASE)
|
PKG_VERSION:=67-$(PKG_RELEASE)
|
||||||
PKG_LICENSE:=MIT
|
PKG_LICENSE:=MIT
|
||||||
|
|
||||||
LUCI_TITLE:=LuCI support for zapret
|
LUCI_TITLE:=LuCI support for zapret
|
||||||
LUCI_DEPENDS:=+zapret
|
LUCI_DEPENDS:=+zapret
|
||||||
LUCI_PKGARCH:=all
|
LUCI_PKGARCH:=all
|
||||||
|
|
||||||
#include ../../luci.mk
|
define Package/$(PKG_NAME)/postinst
|
||||||
|
#!/bin/sh
|
||||||
|
if [ -z "$${IPKG_INSTROOT}" ]; then
|
||||||
|
rm -f /tmp/luci-index*
|
||||||
|
rm -rf /tmp/luci-modulecache/
|
||||||
|
#killall -HUP rpcd 2>/dev/null
|
||||||
|
/etc/init.d/rpcd reload
|
||||||
|
/sbin/luci-reload
|
||||||
|
/etc/init.d/uhttpd reload
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
endef
|
||||||
|
|
||||||
include $(TOPDIR)/feeds/luci/luci.mk
|
include $(TOPDIR)/feeds/luci/luci.mk
|
||||||
|
|
||||||
# call BuildPackage - OpenWrt buildroot signature
|
# call BuildPackage - OpenWrt buildroot signature
|
||||||
|
|||||||
@ -14,111 +14,101 @@ const btn_style_warning = 'btn cbi-button-negative';
|
|||||||
const btn_style_success = 'btn cbi-button-success important';
|
const btn_style_success = 'btn cbi-button-success important';
|
||||||
|
|
||||||
return view.extend({
|
return view.extend({
|
||||||
disableButtons: function(flag, btn, elems = [ ]) {
|
get_svc_buttons: function(elems = { }) {
|
||||||
let btn_start = elems[1] || document.getElementById("btn_start");
|
return {
|
||||||
//let btn_destroy = elems[4] || document.getElementById("btn_destroy");
|
enable : elems.btn_enable || document.getElementById('btn_enable'),
|
||||||
let btn_enable = elems[2] || document.getElementById("btn_enable");
|
disable : elems.btn_disable || document.getElementById('btn_disable'),
|
||||||
let btn_update = elems[3] || document.getElementById("btn_update");
|
start : elems.btn_start || document.getElementById('btn_start'),
|
||||||
|
restart : elems.btn_restart || document.getElementById('btn_restart'),
|
||||||
btn_start.disabled = flag;
|
stop : elems.btn_stop || document.getElementById('btn_stop'),
|
||||||
btn_update.disabled = true; // TODO
|
update : elems.btn_update || document.getElementById('btn_update'),
|
||||||
//btn_destroy.disabled = flag;
|
reset : elems.btn_update || document.getElementById('btn_reset'),
|
||||||
if (btn === btn_update) {
|
};
|
||||||
btn_enable.disabled = false;
|
},
|
||||||
} else {
|
|
||||||
btn_enable.disabled = flag;
|
disableButtons: function(flag, button, elems = { }) {
|
||||||
}
|
let btn = this.get_svc_buttons(elems);
|
||||||
|
btn.enable.disabled = flag;
|
||||||
|
btn.disable.disabled = flag;
|
||||||
|
btn.start.disabled = flag;
|
||||||
|
btn.restart.disabled = flag;
|
||||||
|
btn.stop.disabled = flag;
|
||||||
|
btn.update.disabled = true; // TODO
|
||||||
|
btn.reset.disabled = flag;
|
||||||
},
|
},
|
||||||
|
|
||||||
getAppStatus: function() {
|
getAppStatus: function() {
|
||||||
return Promise.all([
|
return Promise.all([
|
||||||
{ code: -1 }, //fs.exec(tools.execPath, [ 'raw-status' ]),
|
tools.getInitState(tools.appName), // svc_state
|
||||||
{ code: -1 }, //fs.exec(tools.execPath, [ 'vpn-route-status' ]),
|
fs.exec(tools.execPath, [ 'info' ]), // svc_info
|
||||||
tools.getInitStatus(tools.appName),
|
fs.exec('/bin/ps'), // process list
|
||||||
//L.resolveDefault(fs.read(tools.tokenFile), 0),
|
fs.exec('/bin/opkg', [ 'list-installed', '*zapret*' ]), // installed packages
|
||||||
uci.load(tools.appName),
|
uci.load(tools.appName), // config
|
||||||
]).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')
|
||||||
+ ': %s [ %s | %s | %s ]'.format(
|
+ ': %s [ %s | %s | %s ]'.format(
|
||||||
e.message, tools.execPath, 'tools.getInitStatus', 'uci.zapret'
|
e.message, tools.execPath, 'tools.getInitState', 'uci.zapret'
|
||||||
)));
|
)));
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
setAppStatus: function(status_array, elems = [ ], force_app_code = 0) {
|
setAppStatus: function(status_array, elems = { }, force_app_status = 0) {
|
||||||
let section = uci.get(tools.appName, 'config');
|
let cfg = uci.get(tools.appName, 'config');
|
||||||
if (!status_array || section == null || typeof(section) !== 'object') {
|
if (!status_array || cfg == null || typeof(cfg) !== 'object') {
|
||||||
(elems[0] || document.getElementById("status")).innerHTML = tools.makeStatusString(1);
|
let elem_status = elems.status || document.getElementById("status");
|
||||||
|
elem_status.innerHTML = tools.makeStatusString(null);
|
||||||
ui.addNotification(null, E('p', _('Unable to read the contents') + ': setAppStatus()'));
|
ui.addNotification(null, E('p', _('Unable to read the contents') + ': setAppStatus()'));
|
||||||
this.disableButtons(true, null, elems);
|
this.disableButtons(true, null, elems);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
let svc_autorun = status_array[0] ? true : false;
|
||||||
let app_status_code = (force_app_code) ? force_app_code : status_array[0].code;
|
let svc_info = status_array[1]; // stdout: JSON as text
|
||||||
let vpn_route_status_code = status_array[1].code;
|
let proc_list = status_array[2]; // stdout: multiline text
|
||||||
let enabled_flag = status_array[2];
|
let pkg_list = status_array[3]; // stdout: installed packages
|
||||||
let z_fwtype = section.FWTYPE;
|
if (svc_info.code != 0) {
|
||||||
let z_mode = section.MODE;
|
ui.addNotification(null, E('p', _('Unable to read the service info') + ': setAppStatus()'));
|
||||||
let bllist_preset = 'user_only';
|
|
||||||
|
|
||||||
let btn_enable = elems[2] || document.getElementById('btn_enable');
|
|
||||||
/*
|
|
||||||
if (enabled_flag == true) {
|
|
||||||
btn_enable.onclick = ui.createHandlerFn(this, this.serviceAction, 'disable', 'btn_enable');
|
|
||||||
btn_enable.textContent = _('Enabled');
|
|
||||||
btn_enable.className = btn_style_positive;
|
|
||||||
} else {
|
|
||||||
btn_enable.onclick = ui.createHandlerFn(this, this.serviceAction, 'enable', 'btn_enable');
|
|
||||||
btn_enable.textContent = _('Disabled');
|
|
||||||
btn_enable.className = btn_style_negative;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
let btn_start = elems[1] || document.getElementById('btn_start');
|
|
||||||
let btn_update = elems[3] || document.getElementById('btn_update');
|
|
||||||
//let btn_destroy = elems[4] || document.getElementById('btn_destroy');
|
|
||||||
|
|
||||||
let btnStartStateOn = () => {
|
|
||||||
//btn_start.onclick = ui.createHandlerFn(this, this.appAction, 'stop', 'btn_start');
|
|
||||||
//btn_start.textContent = _('Enabled');
|
|
||||||
//btn_start.className = btn_style_positive;
|
|
||||||
};
|
|
||||||
|
|
||||||
let btnStartStateOff = () => {
|
|
||||||
//btn_start.onclick = ui.createHandlerFn(this, this.appAction, 'start', 'btn_start');
|
|
||||||
//btn_start.textContent = _('Disabled');
|
|
||||||
//btn_start.className = btn_style_negative;
|
|
||||||
};
|
|
||||||
|
|
||||||
if (app_status_code == -1) {
|
|
||||||
this.disableButtons(false, null, elems);
|
|
||||||
btnStartStateOn();
|
|
||||||
}
|
|
||||||
else if (app_status_code == 0) {
|
|
||||||
this.disableButtons(false, null, elems);
|
|
||||||
btnStartStateOn();
|
|
||||||
//btn_destroy.disabled = false;
|
|
||||||
btn_update.disabled = false;
|
|
||||||
}
|
|
||||||
else if (app_status_code == 2) {
|
|
||||||
this.disableButtons(false, null, elems);
|
|
||||||
btnStartStateOff();
|
|
||||||
btn_update.disabled = true;
|
|
||||||
}
|
|
||||||
else if (app_status_code == 3) {
|
|
||||||
btnStartStateOff();
|
|
||||||
this.disableButtons(true, btn_start, elems);
|
|
||||||
}
|
|
||||||
else if (app_status_code == 4) {
|
|
||||||
btnStartStateOn();
|
|
||||||
this.disableButtons(true, btn_update, elems);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ui.addNotification(null, E('p', _('Error')
|
|
||||||
+ ' %s: return code = %s'.format(tools.execPath, app_status_code)));
|
|
||||||
this.disableButtons(true, null, elems);
|
this.disableButtons(true, null, elems);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
if (proc_list.code != 0) {
|
||||||
|
ui.addNotification(null, E('p', _('Unable to read process list') + ': setAppStatus()'));
|
||||||
|
this.disableButtons(true, null, elems);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (pkg_list.code != 0) {
|
||||||
|
ui.addNotification(null, E('p', _('Unable to enumerate installed packages') + ': setAppStatus()'));
|
||||||
|
this.disableButtons(true, null, elems);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let svcinfo;
|
||||||
|
if (force_app_status) {
|
||||||
|
svcinfo = force_app_status;
|
||||||
|
} else {
|
||||||
|
svcinfo = tools.decode_svc_info(svc_autorun, svc_info, proc_list, cfg);
|
||||||
|
}
|
||||||
|
let btn = this.get_svc_buttons(elems);
|
||||||
|
btn.update.disabled = true; // TODO
|
||||||
|
btn.reset.disabled = false;
|
||||||
|
|
||||||
(elems[0] || document.getElementById("status")).innerHTML = tools.makeStatusString(app_status_code, z_fwtype, bllist_preset);
|
if (Number.isInteger(svcinfo)) {
|
||||||
|
ui.addNotification(null, E('p', _('Error')
|
||||||
|
+ ' %s: return code = %s'.format('decode_svc_info', svcinfo + ' ')));
|
||||||
|
this.disableButtons(true, null, elems);
|
||||||
|
} else {
|
||||||
|
btn.enable.disabled = (svc_autorun) ? true : false;
|
||||||
|
btn.disable.disabled = (svc_autorun) ? false : true;
|
||||||
|
if (!svcinfo.dmn.inited) {
|
||||||
|
btn.start.disabled = false;
|
||||||
|
btn.restart.disabled = true;
|
||||||
|
btn.stop.disabled = true;
|
||||||
|
} else {
|
||||||
|
btn.start.disabled = true;
|
||||||
|
btn.restart.disabled = false;
|
||||||
|
btn.stop.disabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let elem_status = elems.status || document.getElementById("status");
|
||||||
|
elem_status.innerHTML = tools.makeStatusString(svcinfo, cfg.FWTYPE, 'user_only');
|
||||||
|
|
||||||
if (!poll.active()) {
|
if (!poll.active()) {
|
||||||
poll.start();
|
poll.start();
|
||||||
@ -130,31 +120,67 @@ return view.extend({
|
|||||||
let elem = document.getElementById(button);
|
let elem = document.getElementById(button);
|
||||||
this.disableButtons(true, elem);
|
this.disableButtons(true, elem);
|
||||||
}
|
}
|
||||||
|
|
||||||
poll.stop();
|
poll.stop();
|
||||||
|
|
||||||
let _this = this;
|
let _this = this;
|
||||||
|
|
||||||
return fs.exec('/opt/zapret/sync_config.sh')
|
return tools.handleServiceAction(tools.appName, action)
|
||||||
|
.then(() => {
|
||||||
|
return _this.getAppStatus().then(
|
||||||
|
(status_array) => {
|
||||||
|
_this.setAppStatus(status_array);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
})
|
||||||
|
.catch(e => {
|
||||||
|
ui.addNotification(null, E('p', _('Unable to run service action.') + ' Error: ' + e.message));
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
serviceActionEx: function(action, button, hide_modal = false) {
|
||||||
|
if (button) {
|
||||||
|
let elem = document.getElementById(button);
|
||||||
|
this.disableButtons(true, elem);
|
||||||
|
}
|
||||||
|
poll.stop();
|
||||||
|
|
||||||
|
let _this = this;
|
||||||
|
let exec_cmd = null;
|
||||||
|
let exec_arg = [ ];
|
||||||
|
let errmsg = 'ERROR:';
|
||||||
|
if (action == 'start' || action == 'restart') {
|
||||||
|
exec_cmd = tools.syncCfgPath;
|
||||||
|
errmsg = _('Unable to run sync_config.sh script.');
|
||||||
|
}
|
||||||
|
else if (action == 'reset') {
|
||||||
|
exec_cmd = tools.defaultCfgPath;
|
||||||
|
exec_arg = [ '-f' ];
|
||||||
|
errmsg = _('Unable to run uci-def-cfg.sh script.');
|
||||||
|
action = null;
|
||||||
|
} else {
|
||||||
|
ui.addNotification(null, E('p', 'ERROR: unknown action'));
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return fs.exec(exec_cmd, exec_arg)
|
||||||
.then(function(res) {
|
.then(function(res) {
|
||||||
if (res.code != 0) {
|
if (res.code != 0) {
|
||||||
ui.addNotification(null, E('p', _('Unable to run sync_config.sh script.') + ' res.code = ' + res.code));
|
ui.addNotification(null, E('p', errmsg + ' res.code = ' + res.code));
|
||||||
|
action = null; // return with error
|
||||||
|
}
|
||||||
|
if (hide_modal) {
|
||||||
|
ui.hideModal();
|
||||||
|
}
|
||||||
|
if (!action) {
|
||||||
return _this.getAppStatus().then(
|
return _this.getAppStatus().then(
|
||||||
(status_array) => {
|
(status_array) => {
|
||||||
_this.setAppStatus(status_array);
|
_this.setAppStatus(status_array);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return tools.handleServiceAction(tools.appName, action).then(() => {
|
return _this.serviceAction(action, null);
|
||||||
return _this.getAppStatus().then(
|
|
||||||
(status_array) => {
|
|
||||||
_this.setAppStatus(status_array);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
})
|
})
|
||||||
.catch(e => {
|
.catch(e => {
|
||||||
ui.addNotification(null, E('p', _('Unable to run sync_config.sh script.') + ' Error: ' + e.message));
|
ui.addNotification(null, E('p', errmsg + ' Error: ' + e.message));
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -190,29 +216,29 @@ return view.extend({
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
dialogDestroy: function(ev) {
|
dialogResetCfg: function(ev) {
|
||||||
ev.target.blur();
|
ev.target.blur();
|
||||||
let cancel_button = E('button', {
|
let cancel_button = E('button', {
|
||||||
'class': btn_style_neutral,
|
'class': btn_style_neutral,
|
||||||
'click': ui.hideModal,
|
'click': ui.hideModal,
|
||||||
}, _('Cancel'));
|
}, _('Cancel'));
|
||||||
|
|
||||||
let shutdown_btn = E('button', {
|
let resetcfg_btn = E('button', {
|
||||||
'class': btn_style_warning,
|
'class': btn_style_action,
|
||||||
}, _('Shutdown'));
|
}, _('Reset settings'));
|
||||||
shutdown_btn.onclick = ui.createHandlerFn(this, () => {
|
resetcfg_btn.onclick = ui.createHandlerFn(this, () => {
|
||||||
cancel_button.disabled = true;
|
cancel_button.disabled = true;
|
||||||
return this.appAction('destroy');
|
return this.serviceActionEx('reset', resetcfg_btn, true);
|
||||||
});
|
});
|
||||||
|
|
||||||
ui.showModal(_('Shutdown'), [
|
ui.showModal(_('Reset settings to default'), [
|
||||||
E('div', { 'class': 'cbi-section' }, [
|
E('div', { 'class': 'cbi-section' }, [
|
||||||
E('p', _('The service will be disabled. Continue?')),
|
E('p', _('All settings will be reset to default. Continue?')),
|
||||||
]),
|
]),
|
||||||
E('div', { 'class': 'right' }, [
|
E('div', { 'class': 'right' }, [
|
||||||
shutdown_btn,
|
|
||||||
' ',
|
|
||||||
cancel_button,
|
cancel_button,
|
||||||
|
' ',
|
||||||
|
resetcfg_btn,
|
||||||
])
|
])
|
||||||
]);
|
]);
|
||||||
},
|
},
|
||||||
@ -225,8 +251,13 @@ return view.extend({
|
|||||||
if (!status_array) {
|
if (!status_array) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
let cfg = uci.get(tools.appName, 'config');
|
||||||
|
|
||||||
let section = uci.get(tools.appName, 'config');
|
let pkg_list = status_array[3];
|
||||||
|
if (pkg_list === undefined || typeof(pkg_list) !== 'object' || pkg_list.code != 0) {
|
||||||
|
ui.addNotification(null, E('p', _('Unable to enumerate installed packages') + ': setAppStatus()'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let status_string = E('div', {
|
let status_string = E('div', {
|
||||||
'id' : 'status',
|
'id' : 'status',
|
||||||
@ -236,15 +267,15 @@ return view.extend({
|
|||||||
|
|
||||||
let layout = E('div', { 'class': 'cbi-section-node' });
|
let layout = E('div', { 'class': 'cbi-section-node' });
|
||||||
|
|
||||||
function layout_append(title, descr, elem) {
|
function layout_append(title, descr, elems) {
|
||||||
descr = (descr) ? E('div', { 'class': 'cbi-value-description' }, descr) : '';
|
descr = (descr) ? E('div', { 'class': 'cbi-value-description' }, descr) : '';
|
||||||
let elist;
|
let elist = elems;
|
||||||
if (elem instanceof E) {
|
let elem_list = [ ];
|
||||||
elist = [ elem ];
|
for (let i = 0; i < elist.length; i++) {
|
||||||
} else {
|
elem_list.push(elist[i]);
|
||||||
elist = elem;
|
elem_list.push(' ');
|
||||||
}
|
}
|
||||||
let vlist = [ E('div', {}, elist ) ];
|
let vlist = [ E('div', {}, elem_list ) ];
|
||||||
for (let i = 0; i < elist.length; i++) {
|
for (let i = 0; i < elist.length; i++) {
|
||||||
let input = E('input', {
|
let input = E('input', {
|
||||||
'id' : elist[i].id + '_hidden',
|
'id' : elist[i].id + '_hidden',
|
||||||
@ -252,9 +283,10 @@ return view.extend({
|
|||||||
});
|
});
|
||||||
vlist.push(input);
|
vlist.push(input);
|
||||||
}
|
}
|
||||||
|
let elem_name = (elist.length == 1) ? elist[0].id + '_hidden' : null;
|
||||||
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_name }, title),
|
||||||
E('div', { 'class': 'cbi-value-field' }, vlist),
|
E('div', { 'class': 'cbi-value-field' }, vlist),
|
||||||
])
|
])
|
||||||
);
|
);
|
||||||
@ -272,35 +304,61 @@ return view.extend({
|
|||||||
btn_enable.onclick = ui.createHandlerFn(this, this.serviceAction, 'enable', 'btn_enable');
|
btn_enable.onclick = ui.createHandlerFn(this, this.serviceAction, 'enable', 'btn_enable');
|
||||||
let btn_disable = create_btn('btn_disable', btn_style_warning, _('Disable'));
|
let btn_disable = create_btn('btn_disable', btn_style_warning, _('Disable'));
|
||||||
btn_disable.onclick = ui.createHandlerFn(this, this.serviceAction, 'disable', 'btn_disable');
|
btn_disable.onclick = ui.createHandlerFn(this, this.serviceAction, 'disable', 'btn_disable');
|
||||||
layout_append(_('Service Status'), null, [ btn_enable, btn_disable ] );
|
layout_append(_('Service autorun control'), null, [ btn_enable, btn_disable ] );
|
||||||
|
|
||||||
let btn_start = create_btn('btn_start', btn_style_action, _('Start'));
|
let btn_start = create_btn('btn_start', btn_style_action, _('Start'));
|
||||||
btn_start.onclick = ui.createHandlerFn(this, this.serviceAction, 'start', 'btn_start');
|
btn_start.onclick = ui.createHandlerFn(this, this.serviceActionEx, 'start', 'btn_start');
|
||||||
let btn_restart = create_btn('btn_restart', btn_style_action, _('Restart'));
|
let btn_restart = create_btn('btn_restart', btn_style_action, _('Restart'));
|
||||||
btn_restart.onclick = ui.createHandlerFn(this, this.serviceAction, 'restart', 'btn_restart');
|
btn_restart.onclick = ui.createHandlerFn(this, this.serviceActionEx, 'restart', 'btn_restart');
|
||||||
let btn_stop = create_btn('btn_stop', btn_style_warning, _('Stop'));
|
let btn_stop = create_btn('btn_stop', btn_style_warning, _('Stop'));
|
||||||
btn_stop.onclick = ui.createHandlerFn(this, this.serviceAction, 'stop', 'btn_stop');
|
btn_stop.onclick = ui.createHandlerFn(this, this.serviceAction, 'stop', 'btn_stop');
|
||||||
layout_append(_('Service Control'), null, [ btn_start, btn_restart, btn_stop ] );
|
layout_append(_('Service daemons control'), null, [ btn_start, btn_restart, btn_stop ] );
|
||||||
|
|
||||||
let btn_update = create_btn('btn_update', btn_style_action, _('Update'));
|
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(_('Update blacklist'), null, btn_update);
|
layout_append(_('Update blacklist'), null, [ btn_update ] );
|
||||||
|
|
||||||
let btn_destroy = create_btn('btn_destroy', btn_style_negative, _('Shutdown'));
|
let btn_reset = create_btn('btn_reset', btn_style_action, _('Reset settings'));
|
||||||
btn_destroy.onclick = L.bind(this.dialogDestroy, this);
|
btn_reset.onclick = L.bind(this.dialogResetCfg, this);
|
||||||
//layout_append(_('Shutdown'), _('Complete service shutdown'), btn_destroy);
|
layout_append(_('Reset settings to default'), null, [ btn_reset ] );
|
||||||
|
|
||||||
//let elems = [ status_string, btn_start, btn_enable, btn_update, btn_destroy ];
|
let elems = {
|
||||||
let elems = [ status_string, btn_start, btn_enable, btn_update ];
|
"status": status_string,
|
||||||
|
"btn_enable": btn_enable,
|
||||||
|
"btn_disable": btn_disable,
|
||||||
|
"btn_start": btn_start,
|
||||||
|
"btn_restart": btn_restart,
|
||||||
|
"btn_stop": btn_stop,
|
||||||
|
"btn_update": btn_update,
|
||||||
|
"btn_reset": btn_reset,
|
||||||
|
};
|
||||||
this.setAppStatus(status_array, elems);
|
this.setAppStatus(status_array, elems);
|
||||||
|
|
||||||
poll.add(L.bind(this.statusPoll, this));
|
poll.add(L.bind(this.statusPoll, this));
|
||||||
|
|
||||||
|
let page_title = _('Zapret');
|
||||||
|
let pkgdict = tools.decode_pkg_list(pkg_list.stdout);
|
||||||
|
page_title += '   ';
|
||||||
|
if (pkgdict['zapret'] === undefined || pkgdict['zapret'] == '') {
|
||||||
|
page_title += 'unknown version';
|
||||||
|
} else {
|
||||||
|
page_title += 'v' + pkgdict['zapret'];
|
||||||
|
}
|
||||||
|
let aux1 = E('em');
|
||||||
|
let aux2 = E('em');
|
||||||
|
if (pkgdict['zapret'] != pkgdict['luci-app-zapret']) {
|
||||||
|
let errtxt = 'LuCI APP v' + pkgdict['luci-app-zapret'] + ' [ incorrect version! ]';
|
||||||
|
aux1 = E('div', { 'class': 'label-status error' }, errtxt);
|
||||||
|
aux2 = E('div', { }, ' ');
|
||||||
|
}
|
||||||
|
|
||||||
let url1 = 'https://github.com/bol-van/zapret';
|
let url1 = 'https://github.com/bol-van/zapret';
|
||||||
let url2 = 'https://github.com/remittor/zapret-openwrt';
|
let url2 = 'https://github.com/remittor/zapret-openwrt';
|
||||||
|
|
||||||
return E([
|
return E([
|
||||||
E('h2', { 'class': 'fade-in' }, _('Zapret')),
|
E('h2', { 'class': 'fade-in' }, page_title),
|
||||||
|
aux1,
|
||||||
|
aux2,
|
||||||
E('div', { 'class': 'cbi-section-descr fade-in' },
|
E('div', { 'class': 'cbi-section-descr fade-in' },
|
||||||
E('a', { 'href': url1, 'target': '_blank' }, url1),
|
E('a', { 'href': url1, 'target': '_blank' }, url1),
|
||||||
),
|
),
|
||||||
@ -309,7 +367,6 @@ return view.extend({
|
|||||||
),
|
),
|
||||||
E('div', { 'class': 'cbi-section fade-in' }, [
|
E('div', { 'class': 'cbi-section fade-in' }, [
|
||||||
status_string,
|
status_string,
|
||||||
E('hr'),
|
|
||||||
]),
|
]),
|
||||||
E('div', { 'class': 'cbi-section fade-in' },
|
E('div', { 'class': 'cbi-section fade-in' },
|
||||||
layout
|
layout
|
||||||
|
|||||||
@ -64,10 +64,10 @@ return view.extend({
|
|||||||
//o.value('iptables', 'iptables');
|
//o.value('iptables', 'iptables');
|
||||||
//o.value('ipfw', 'ipfw');
|
//o.value('ipfw', 'ipfw');
|
||||||
|
|
||||||
o = s.taboption(tabname, form.ListValue, 'MODE', _('MODE'));
|
o = s.taboption(tabname, form.Flag, 'POSTNAT', _('POSTNAT'));
|
||||||
o.value('nfqws', 'nfqws');
|
o.rmempty = false;
|
||||||
//o.value('tpws', 'tpws');
|
o.default = 1;
|
||||||
|
|
||||||
o = s.taboption(tabname, form.ListValue, 'FLOWOFFLOAD', _('FLOWOFFLOAD'));
|
o = s.taboption(tabname, form.ListValue, 'FLOWOFFLOAD', _('FLOWOFFLOAD'));
|
||||||
o.value('donttouch', 'donttouch');
|
o.value('donttouch', 'donttouch');
|
||||||
o.value('none', 'none');
|
o.value('none', 'none');
|
||||||
@ -92,32 +92,6 @@ return view.extend({
|
|||||||
o.value('hostlist', 'hostlist');
|
o.value('hostlist', 'hostlist');
|
||||||
o.value('autohostlist', 'autohostlist');
|
o.value('autohostlist', 'autohostlist');
|
||||||
|
|
||||||
o = s.taboption(tabname, form.Flag, 'MODE_HTTP', _('MODE_HTTP'));
|
|
||||||
o.rmempty = false;
|
|
||||||
o.default = 0;
|
|
||||||
|
|
||||||
o = s.taboption(tabname, form.Flag, 'MODE_HTTP_KEEPALIVE', _('MODE_HTTP_KEEPALIVE'));
|
|
||||||
o.rmempty = false;
|
|
||||||
o.default = 0;
|
|
||||||
|
|
||||||
o = s.taboption(tabname, form.Flag, 'MODE_HTTPS', _('MODE_HTTPS'));
|
|
||||||
o.rmempty = false;
|
|
||||||
o.default = 0;
|
|
||||||
|
|
||||||
o = s.taboption(tabname, form.Flag, 'MODE_QUIC', _('MODE_QUIC'));
|
|
||||||
o.rmempty = false;
|
|
||||||
o.default = 0;
|
|
||||||
|
|
||||||
o = s.taboption(tabname, form.Value, 'DESYNC_MARK', _('DESYNC_MARK'));
|
|
||||||
//o.description = _("nfqws option for DPI desync attack");
|
|
||||||
o.rmempty = false;
|
|
||||||
o.datatype = 'string';
|
|
||||||
|
|
||||||
o = s.taboption(tabname, form.Value, 'DESYNC_MARK_POSTNAT', _('DESYNC_MARK_POSTNAT'));
|
|
||||||
//o.description = _("nfqws option for DPI desync attack");
|
|
||||||
o.rmempty = false;
|
|
||||||
o.datatype = 'string';
|
|
||||||
|
|
||||||
/* NFQWS_OPT_DESYNC tab */
|
/* NFQWS_OPT_DESYNC tab */
|
||||||
|
|
||||||
tabname = 'nfqws_params';
|
tabname = 'nfqws_params';
|
||||||
@ -129,67 +103,154 @@ return view.extend({
|
|||||||
o.default = '<hr style="width: 620px; height: 1px; margin: 1px 0 1px; border-top: 1px solid;">';
|
o.default = '<hr style="width: 620px; height: 1px; margin: 1px 0 1px; border-top: 1px solid;">';
|
||||||
};
|
};
|
||||||
|
|
||||||
let add_param = function(sec, param, locname = null, rows = 10) {
|
let add_param = function(sec, param, locname = null, rows = 10, multiline = false) {
|
||||||
if (!locname)
|
if (!locname)
|
||||||
locname = param;
|
locname = param;
|
||||||
let btn = sec.taboption(tabname, form.Button, '_' + param + '_btn', locname);
|
let btn = sec.taboption(tabname, form.Button, '_' + param + '_btn', locname);
|
||||||
btn.inputtitle = _('Edit');
|
btn.inputtitle = _('Edit');
|
||||||
btn.inputstyle = 'edit btn';
|
btn.inputstyle = 'edit btn';
|
||||||
let val = sec.taboption(tabname, form.DummyValue, '_' + param);
|
let val = sec.taboption(tabname, form.DummyValue, '_' + param);
|
||||||
val.rawhtml = false;
|
val.rawhtml = multiline ? true : false;
|
||||||
val.cfgvalue = function(section_id) {
|
val.cfgvalue = function(section_id) {
|
||||||
let name = uci.get(tools.appName, section_id, param);
|
let value = uci.get(tools.appName, section_id, param);
|
||||||
if (name == null || name == "")
|
if (value == null) {
|
||||||
name = "";
|
return "";
|
||||||
return name;
|
}
|
||||||
|
value = value.trim();
|
||||||
|
if (multiline == 2) {
|
||||||
|
value = value.replace(/\n --/g, "\n--");
|
||||||
|
value = value.replace(/\n --/g, "\n--");
|
||||||
|
value = value.replace(/ --/g, "\n--");
|
||||||
|
}
|
||||||
|
if (val.rawhtml) {
|
||||||
|
value = value.replace(/</g, '˂');
|
||||||
|
value = value.replace(/>/g, '˃');
|
||||||
|
value = value.replace(/\n/g, '<br/>');
|
||||||
|
}
|
||||||
|
return value;
|
||||||
};
|
};
|
||||||
val.validate = function(section_id, value) {
|
val.validate = function(section_id, value) {
|
||||||
if (!value)
|
return (value) ? value.trim() : "";
|
||||||
return "";
|
|
||||||
return value.trim();
|
|
||||||
};
|
};
|
||||||
btn.onclick = () => new tools.longstrEditDialog('config', param, param, locname, rows).show();
|
btn.onclick = () => new tools.longstrEditDialog('config', param, param, locname, rows, multiline).show();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
o = s.taboption(tabname, form.Flag, 'NFQWS_ENABLE', _('NFQWS_ENABLE'));
|
||||||
|
o.rmempty = false;
|
||||||
|
o.default = 1;
|
||||||
|
|
||||||
|
o = s.taboption(tabname, form.Value, 'DESYNC_MARK', _('DESYNC_MARK'));
|
||||||
|
//o.description = _("nfqws option for DPI desync attack");
|
||||||
|
o.rmempty = false;
|
||||||
|
o.datatype = 'string';
|
||||||
|
|
||||||
|
o = s.taboption(tabname, form.Value, 'DESYNC_MARK_POSTNAT', _('DESYNC_MARK_POSTNAT'));
|
||||||
|
//o.description = _("nfqws option for DPI desync attack");
|
||||||
|
o.rmempty = false;
|
||||||
|
o.datatype = 'string';
|
||||||
|
|
||||||
|
o = s.taboption(tabname, form.Value, 'NFQWS_PORTS_TCP', _('NFQWS_PORTS_TCP'));
|
||||||
|
o.rmempty = false;
|
||||||
|
o.datatype = 'string';
|
||||||
|
|
||||||
|
o = s.taboption(tabname, form.Value, 'NFQWS_PORTS_UDP', _('NFQWS_PORTS_UDP'));
|
||||||
|
o.rmempty = false;
|
||||||
|
o.datatype = 'string';
|
||||||
|
|
||||||
|
o = s.taboption(tabname, form.Value, 'NFQWS_TCP_PKT_OUT', _('NFQWS_TCP_PKT_OUT'));
|
||||||
|
o.rmempty = false;
|
||||||
|
o.datatype = 'string';
|
||||||
|
|
||||||
|
o = s.taboption(tabname, form.Value, 'NFQWS_TCP_PKT_IN', _('NFQWS_TCP_PKT_IN'));
|
||||||
|
o.rmempty = false;
|
||||||
|
o.datatype = 'string';
|
||||||
|
|
||||||
|
o = s.taboption(tabname, form.Value, 'NFQWS_UDP_PKT_OUT', _('NFQWS_UDP_PKT_OUT'));
|
||||||
|
o.rmempty = false;
|
||||||
|
o.datatype = 'string';
|
||||||
|
|
||||||
|
o = s.taboption(tabname, form.Value, 'NFQWS_UDP_PKT_IN', _('NFQWS_UDP_PKT_IN'));
|
||||||
|
o.rmempty = false;
|
||||||
|
o.datatype = 'string';
|
||||||
|
|
||||||
|
o = s.taboption(tabname, form.Value, 'NFQWS_PORTS_TCP_KEEPALIVE', _('NFQWS_PORTS_TCP_KEEPALIVE'));
|
||||||
|
o.rmempty = false;
|
||||||
|
o.datatype = 'uinteger';
|
||||||
|
|
||||||
|
o = s.taboption(tabname, form.Value, 'NFQWS_PORTS_UDP_KEEPALIVE', _('NFQWS_PORTS_UDP_KEEPALIVE'));
|
||||||
|
o.rmempty = false;
|
||||||
|
o.datatype = 'uinteger';
|
||||||
|
|
||||||
add_delim(s);
|
add_delim(s);
|
||||||
add_param(s, 'NFQWS_OPT_DESYNC');
|
add_param(s, 'NFQWS_OPT', null, 18, 2);
|
||||||
add_delim(s);
|
|
||||||
add_param(s, 'NFQWS_OPT_DESYNC_SUFFIX');
|
/* AutoHostList settings */
|
||||||
add_delim(s);
|
|
||||||
add_param(s, 'NFQWS_OPT_DESYNC_HTTP');
|
tabname = 'autohostlist_tab';
|
||||||
add_delim(s);
|
s.tab(tabname, _('AutoHostList'));
|
||||||
add_param(s, 'NFQWS_OPT_DESYNC_HTTP_SUFFIX');
|
|
||||||
add_delim(s);
|
o = s.taboption(tabname, form.Value, 'AUTOHOSTLIST_RETRANS_THRESHOLD', _('RETRANS_THRESHOLD'));
|
||||||
add_param(s, 'NFQWS_OPT_DESYNC_HTTPS');
|
o.rmempty = false;
|
||||||
add_delim(s);
|
o.datatype = 'uinteger';
|
||||||
add_param(s, 'NFQWS_OPT_DESYNC_HTTPS_SUFFIX');
|
|
||||||
add_delim(s);
|
o = s.taboption(tabname, form.Value, 'AUTOHOSTLIST_FAIL_THRESHOLD', _('FAIL_THRESHOLD'));
|
||||||
add_param(s, 'NFQWS_OPT_DESYNC_HTTP6');
|
o.rmempty = false;
|
||||||
add_delim(s);
|
o.datatype = 'uinteger';
|
||||||
add_param(s, 'NFQWS_OPT_DESYNC_HTTP6_SUFFIX');
|
|
||||||
add_delim(s);
|
o = s.taboption(tabname, form.Value, 'AUTOHOSTLIST_FAIL_TIME', _('FAIL_TIME'));
|
||||||
add_param(s, 'NFQWS_OPT_DESYNC_HTTPS6');
|
o.rmempty = false;
|
||||||
add_delim(s);
|
o.datatype = 'uinteger';
|
||||||
add_param(s, 'NFQWS_OPT_DESYNC_HTTPS6_SUFFIX');
|
|
||||||
add_delim(s);
|
o = s.taboption(tabname, form.Button, '_auto_host_btn', _('Auto host list entries'));
|
||||||
add_param(s, 'NFQWS_OPT_DESYNC_QUIC');
|
o.inputtitle = _('Edit');
|
||||||
add_delim(s);
|
o.inputstyle = 'edit btn';
|
||||||
add_param(s, 'NFQWS_OPT_DESYNC_QUIC_SUFFIX');
|
o.description = tools.autoHostListFN;
|
||||||
add_delim(s);
|
o.onclick = () => new tools.fileEditDialog(
|
||||||
add_param(s, 'NFQWS_OPT_DESYNC_QUIC6');
|
tools.autoHostListFN,
|
||||||
add_delim(s);
|
_('Auto host list'),
|
||||||
add_param(s, 'NFQWS_OPT_DESYNC_QUIC6_SUFFIX');
|
'',
|
||||||
|
'',
|
||||||
|
15
|
||||||
|
).show();
|
||||||
|
|
||||||
|
o = s.taboption(tabname, form.Flag, 'AUTOHOSTLIST_DEBUGLOG', _('DEBUGLOG'));
|
||||||
|
o.rmempty = false;
|
||||||
|
o.default = 0;
|
||||||
|
|
||||||
|
o = s.taboption(tabname, form.Button, '_auto_host_debug_btn', _('Auto host debug list entries'));
|
||||||
|
o.inputtitle = _('Edit');
|
||||||
|
o.inputstyle = 'edit btn';
|
||||||
|
o.description = tools.autoHostListDbgFN;
|
||||||
|
o.onclick = () => new tools.fileEditDialog(
|
||||||
|
tools.autoHostListDbgFN,
|
||||||
|
_('Auto host debug list'),
|
||||||
|
'',
|
||||||
|
'',
|
||||||
|
15
|
||||||
|
).show();
|
||||||
|
|
||||||
/* Blacklist settings */
|
/* Blacklist settings */
|
||||||
|
|
||||||
tabname = 'blacklist_tab';
|
tabname = 'blacklist_tab';
|
||||||
s.tab(tabname, _('Blacklist settings'));
|
s.tab(tabname, _('Blacklist settings'));
|
||||||
|
|
||||||
|
o = s.taboption(tabname, form.Button, '_google_entries_btn', _('Google hostname entries'));
|
||||||
|
o.inputtitle = _('Edit');
|
||||||
|
o.inputstyle = 'edit btn';
|
||||||
|
o.description = tools.hostsGoogleFN;
|
||||||
|
o.onclick = () => new tools.fileEditDialog(
|
||||||
|
tools.hostsGoogleFN,
|
||||||
|
_('Google hostname entries'),
|
||||||
|
_('One hostname per line.<br />Examples:'),
|
||||||
|
'<code>youtube.com<br />googlevideo.com</code>',
|
||||||
|
15
|
||||||
|
).show();
|
||||||
|
|
||||||
o = s.taboption(tabname, form.Button, '_user_entries_btn', _('User hostname entries'));
|
o = s.taboption(tabname, form.Button, '_user_entries_btn', _('User hostname entries'));
|
||||||
o.inputtitle = _('Edit');
|
o.inputtitle = _('Edit');
|
||||||
o.inputstyle = 'edit btn';
|
o.inputstyle = 'edit btn';
|
||||||
o.description = tools.hostsUserFN;
|
o.description = tools.hostsUserFN;
|
||||||
o.onclick = () => new tools.fileEditDialog(
|
o.onclick = () => new tools.fileEditDialog(
|
||||||
tools.hostsUserFN,
|
tools.hostsUserFN,
|
||||||
_('User entries'),
|
_('User entries'),
|
||||||
_('One hostname per line.<br />Examples:'),
|
_('One hostname per line.<br />Examples:'),
|
||||||
@ -201,7 +262,7 @@ return view.extend({
|
|||||||
o.inputtitle = _('Edit');
|
o.inputtitle = _('Edit');
|
||||||
o.inputstyle = 'edit btn';
|
o.inputstyle = 'edit btn';
|
||||||
o.description = tools.hostsUserExcludeFN;
|
o.description = tools.hostsUserExcludeFN;
|
||||||
o.onclick = () => new tools.fileEditDialog(
|
o.onclick = () => new tools.fileEditDialog(
|
||||||
tools.hostsUserExcludeFN,
|
tools.hostsUserExcludeFN,
|
||||||
_('User excluded entries'),
|
_('User excluded entries'),
|
||||||
_('One hostname per line.<br />Examples:'),
|
_('One hostname per line.<br />Examples:'),
|
||||||
|
|||||||
@ -37,6 +37,10 @@ document.head.append(E('style', {'type': 'text/css'},
|
|||||||
return baseclass.extend({
|
return baseclass.extend({
|
||||||
appName : 'zapret',
|
appName : 'zapret',
|
||||||
execPath : '/etc/init.d/zapret',
|
execPath : '/etc/init.d/zapret',
|
||||||
|
syncCfgPath : '/opt/zapret/sync_config.sh',
|
||||||
|
defaultCfgPath : '/opt/zapret/uci-def-cfg.sh',
|
||||||
|
|
||||||
|
hostsGoogleFN : '/opt/zapret/ipset/zapret-hosts-google.txt',
|
||||||
hostsUserFN : '/opt/zapret/ipset/zapret-hosts-user.txt',
|
hostsUserFN : '/opt/zapret/ipset/zapret-hosts-user.txt',
|
||||||
hostsUserExcludeFN: '/opt/zapret/ipset/zapret-hosts-user-exclude.txt',
|
hostsUserExcludeFN: '/opt/zapret/ipset/zapret-hosts-user-exclude.txt',
|
||||||
iplstExcludeFN : '/opt/zapret/ipset/zapret-ip-exclude.txt',
|
iplstExcludeFN : '/opt/zapret/ipset/zapret-ip-exclude.txt',
|
||||||
@ -45,13 +49,26 @@ return baseclass.extend({
|
|||||||
custFileMax : 4,
|
custFileMax : 4,
|
||||||
custFileTemplate : '/opt/zapret/ipset/cust%s.txt',
|
custFileTemplate : '/opt/zapret/ipset/cust%s.txt',
|
||||||
|
|
||||||
infoLabelStarting : '<span class="label-status starting">' + _('Starting') + '</span>',
|
autoHostListFN : '/opt/zapret/ipset/zapret-hosts-auto.txt',
|
||||||
infoLabelRunning : '<span class="label-status running">' + _('Enabled') + '</span>',
|
autoHostListDbgFN : '/opt/zapret/ipset/zapret-hosts-auto-debug.log',
|
||||||
infoLabelUpdating : '<span class="label-status updating">' + _('Updating') + '</span>',
|
|
||||||
infoLabelStopped : '<span class="label-status stopped">' + _('Disabled') + '</span>',
|
|
||||||
infoLabelError : '<span class="label-status error">' + _('Error') + '</span>',
|
|
||||||
|
|
||||||
callInitStatus: rpc.declare({
|
infoLabelRunning : '<span class="label-status running">' + _('Running') + '</span>',
|
||||||
|
infoLabelStarting : '<span class="label-status starting">' + _('Starting') + '</span>',
|
||||||
|
infoLabelStopped : '<span class="label-status stopped">' + _('Stopped') + '</span>',
|
||||||
|
infoLabelDisabled : '<span class="label-status stopped">' + _('Disabled') + '</span>',
|
||||||
|
infoLabelError : '<span class="label-status error">' + _('Error') + '</span>',
|
||||||
|
|
||||||
|
infoLabelUpdating : '<span class="label-status updating">' + _('Updating') + '</span>',
|
||||||
|
|
||||||
|
statusDict: {
|
||||||
|
error : { code: 0, name: _('Error') , label: this.infoLabelError },
|
||||||
|
disabled : { code: 1, name: _('Disabled') , label: this.infoLabelDisabled },
|
||||||
|
stopped : { code: 2, name: _('Stopped') , label: this.infoLabelStopped },
|
||||||
|
starting : { code: 3, name: _('Starting') , label: this.infoLabelStarting },
|
||||||
|
running : { code: 4, name: _('Running') , label: this.infoLabelRunning },
|
||||||
|
},
|
||||||
|
|
||||||
|
callInitState: rpc.declare({
|
||||||
object: 'luci',
|
object: 'luci',
|
||||||
method: 'getInitList',
|
method: 'getInitList',
|
||||||
params: [ 'name' ],
|
params: [ 'name' ],
|
||||||
@ -65,10 +82,10 @@ return baseclass.extend({
|
|||||||
expect: { result: false }
|
expect: { result: false }
|
||||||
}),
|
}),
|
||||||
|
|
||||||
getInitStatus: function(name) {
|
getInitState: function(name) {
|
||||||
return this.callInitStatus(name).then(res => {
|
return this.callInitState(name).then(res => {
|
||||||
if (res) {
|
if (res) {
|
||||||
return res[name].enabled;
|
return res[name].enabled ? true : false;
|
||||||
} else {
|
} else {
|
||||||
throw _('Command failed');
|
throw _('Command failed');
|
||||||
}
|
}
|
||||||
@ -92,72 +109,146 @@ return baseclass.extend({
|
|||||||
return (v && typeof(v) === 'string') ? v.trim().replace(/\r?\n/g, '') : v;
|
return (v && typeof(v) === 'string') ? v.trim().replace(/\r?\n/g, '') : v;
|
||||||
},
|
},
|
||||||
|
|
||||||
makeStatusString: function(app_status_code, fwtype, bllist_preset) {
|
decode_pkg_list: function(pkg_list) {
|
||||||
let app_status_label;
|
let pkg_dict = { };
|
||||||
let spinning = '';
|
let lines = pkg_list.trim().split('\n');
|
||||||
/*
|
for (let i = 0; i < lines.length; i++) {
|
||||||
switch(app_status_code) {
|
let line = lines[i].trim();
|
||||||
case 0:
|
if (line.length >= 4) {
|
||||||
app_status_label = this.infoLabelRunning;
|
let word_list = line.split(' - ');
|
||||||
break;
|
let name = word_list[0].trim();
|
||||||
case 2:
|
let ver = word_list[1].trim();
|
||||||
app_status_label = this.infoLabelStopped;
|
pkg_dict[name] = ver;
|
||||||
break;
|
}
|
||||||
case 3:
|
|
||||||
app_status_label = this.infoLabelStarting;
|
|
||||||
spinning = ' spinning';
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
app_status_label = this.infoLabelUpdating;
|
|
||||||
spinning = ' spinning';
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
app_status_label = this.infoLabelError;
|
|
||||||
return `<table class="table">
|
|
||||||
<tr class="tr">
|
|
||||||
<td class="td left" style="min-width:33%%">
|
|
||||||
${_('Status')}:
|
|
||||||
</td>
|
|
||||||
<td class="td left">
|
|
||||||
${app_status_label}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>`;
|
|
||||||
}
|
}
|
||||||
*/
|
return pkg_dict;
|
||||||
return `<table class="table">
|
},
|
||||||
|
|
||||||
|
get_pid_list: function(proc_list) {
|
||||||
|
let plist = [ ];
|
||||||
|
let lines = proc_list.trim().split('\n');
|
||||||
|
for (let i = 0; i < lines.length; i++) {
|
||||||
|
let line = lines[i].trim();
|
||||||
|
if (line.length > 5) {
|
||||||
|
let word_list = line.split(/\s+/);
|
||||||
|
let pid = word_list[0];
|
||||||
|
let isnum = /^\d+$/.test(pid);
|
||||||
|
if (isnum) {
|
||||||
|
plist.push(parseInt(pid));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return plist;
|
||||||
|
},
|
||||||
|
|
||||||
|
decode_svc_info: function(svc_autorun, svc_info, proc_list, cfg) {
|
||||||
|
let result = {
|
||||||
|
"autorun": svc_autorun,
|
||||||
|
"dmn": {
|
||||||
|
inited: false,
|
||||||
|
total: 0,
|
||||||
|
running: 0,
|
||||||
|
working: 0,
|
||||||
|
},
|
||||||
|
"status": this.statusDict.error,
|
||||||
|
};
|
||||||
|
if (svc_info.code != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (proc_list.code != 0) {
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
let plist = this.get_pid_list(proc_list.stdout);
|
||||||
|
|
||||||
|
let jdata = JSON.parse(svc_info.stdout);
|
||||||
|
if (typeof(jdata) !== 'object') {
|
||||||
|
return -3;
|
||||||
|
}
|
||||||
|
if (typeof(jdata.zapret) == 'object') {
|
||||||
|
result.dmn.inited = true;
|
||||||
|
let dmn_list = jdata.zapret.instances;
|
||||||
|
if (typeof(dmn_list) == 'object') {
|
||||||
|
for (const [dmn_name, daemon] of Object.entries(dmn_list)) {
|
||||||
|
result.dmn.total += 1;
|
||||||
|
if (daemon.running) {
|
||||||
|
result.dmn.running += 1;
|
||||||
|
}
|
||||||
|
if (daemon.pid !== undefined && daemon.pid != null) {
|
||||||
|
if (plist.includes(daemon.pid)) {
|
||||||
|
result.dmn.working += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//console.log('SVC_DAEMONS: ' + result.dmn.working + ' / ' + result.dmn.total);
|
||||||
|
if (result.dmn.total == 0) {
|
||||||
|
result.status = (!svc_autorun) ? this.statusDict.disabled : this.statusDict.stopped;
|
||||||
|
} else {
|
||||||
|
result.status = (result.dmn.inited) ? this.statusDict.started : this.statusDict.running;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
},
|
||||||
|
|
||||||
|
makeStatusString: function(svcinfo, fwtype, bllist_preset) {
|
||||||
|
let svc_autorun = _('Unknown');
|
||||||
|
let svc_daemons = _('Unknown');
|
||||||
|
|
||||||
|
if (typeof(svcinfo) == 'object') {
|
||||||
|
svc_autorun = (svcinfo.autorun) ? _('Enabled') : _('Disabled');
|
||||||
|
if (!svcinfo.dmn.inited) {
|
||||||
|
svc_daemons = _('Stopped');
|
||||||
|
} else {
|
||||||
|
svc_daemons = (!svcinfo.dmn.working) ? _('Starting') : _('Running');
|
||||||
|
svc_daemons += ' [' + svcinfo.dmn.working + '/' + svcinfo.dmn.total + ']';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let update_mode = _('user entries only');
|
||||||
|
|
||||||
|
let td_name_width = 40;
|
||||||
|
let td_name_style = `style="width: ${td_name_width}%; min-width:${td_name_width}%; max-width:${td_name_width}%;"`;
|
||||||
|
let out = `
|
||||||
|
<table class="table">
|
||||||
<tr class="tr">
|
<tr class="tr">
|
||||||
<td class="td left" style="min-width:33%%">
|
<td class="td left" ${td_name_style}>
|
||||||
${_('Status')}:
|
${_('Service autorun status')}:
|
||||||
</td>
|
</td>
|
||||||
<td class="td left%s">
|
<td class="td left">
|
||||||
%s %s
|
${svc_autorun}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="tr">
|
<tr class="tr">
|
||||||
<td class="td left">
|
<td class="td left" ${td_name_style}>
|
||||||
|
${_('Service daemons status')}:
|
||||||
|
</td>
|
||||||
|
<td class="td left %s">
|
||||||
|
${svc_daemons}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="tr">
|
||||||
|
<td class="td left" ${td_name_style}>
|
||||||
${_('FW type')}:
|
${_('FW type')}:
|
||||||
</td>
|
</td>
|
||||||
<td class="td left">
|
<td class="td left">
|
||||||
%s
|
${fwtype}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="tr">
|
<tr class="tr">
|
||||||
<td class="td left">
|
<td class="td left" ${td_name_style}>
|
||||||
${_('Blacklist update mode')}:
|
${_('Blacklist update mode')}:
|
||||||
</td>
|
</td>
|
||||||
<td class="td left">
|
<td class="td left">
|
||||||
%s
|
${update_mode}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
<tr class="tr">
|
||||||
`.format(
|
<td class="td left" ${td_name_style}>
|
||||||
spinning,
|
</td>
|
||||||
app_status_label,
|
<td class="td left">
|
||||||
'',
|
</td>
|
||||||
fwtype,
|
</tr>
|
||||||
_('user entries only')
|
</table>`;
|
||||||
);
|
return out;
|
||||||
},
|
},
|
||||||
|
|
||||||
fileEditDialog: baseclass.extend({
|
fileEditDialog: baseclass.extend({
|
||||||
@ -261,16 +352,26 @@ return baseclass.extend({
|
|||||||
}),
|
}),
|
||||||
|
|
||||||
longstrEditDialog: baseclass.extend({
|
longstrEditDialog: baseclass.extend({
|
||||||
__init__: function(cfgsec, cfgparam, title, desc, rows = 10) {
|
__init__: function(cfgsec, cfgparam, title, desc, rows = 10, multiline = false) {
|
||||||
this.cfgsec = cfgsec;
|
this.cfgsec = cfgsec;
|
||||||
this.cfgparam = cfgparam;
|
this.cfgparam = cfgparam;
|
||||||
this.title = title;
|
this.title = title;
|
||||||
this.desc = desc;
|
this.desc = desc;
|
||||||
this.rows = rows;
|
this.rows = rows;
|
||||||
|
this.multiline = multiline;
|
||||||
},
|
},
|
||||||
|
|
||||||
load: function() {
|
load: function() {
|
||||||
return uci.get('zapret', this.cfgsec, this.cfgparam);
|
let value = uci.get('zapret', this.cfgsec, this.cfgparam);
|
||||||
|
if (typeof(value) === 'string') {
|
||||||
|
value = value.trim();
|
||||||
|
if (this.multiline == 2) {
|
||||||
|
value = value.replace(/\n --/g, "\n--");
|
||||||
|
value = value.replace(/\n --/g, "\n--");
|
||||||
|
value = value.replace(/ --/g, "\n--");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return value;
|
||||||
},
|
},
|
||||||
|
|
||||||
render: function(content) {
|
render: function(content) {
|
||||||
@ -308,13 +409,36 @@ return baseclass.extend({
|
|||||||
|
|
||||||
handleSave: function(ev) {
|
handleSave: function(ev) {
|
||||||
let txt = document.getElementById('widget.modal_content');
|
let txt = document.getElementById('widget.modal_content');
|
||||||
let value = txt.value.trim().replace(/\r\n/g, ' ').replace(/\r/g, ' ').replace(/\n/g, ' ').trim();
|
let value = txt.value.trim();
|
||||||
|
if (this.multiline) {
|
||||||
|
value = value.replace(/\r/g, '');
|
||||||
|
if (value != "" && value != "\t") {
|
||||||
|
value = '\n' + value + '\n';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
value = value.replace(/\r\n/g, ' ');
|
||||||
|
value = value.replace(/\r/g, ' ');
|
||||||
|
value = value.replace(/\n/g, ' ');
|
||||||
|
value = value.trim();
|
||||||
|
}
|
||||||
|
if (value == "") {
|
||||||
|
value = "\t";
|
||||||
|
}
|
||||||
|
value = value.replace(/˂/g, '<');
|
||||||
|
value = value.replace(/˃/g, '>');
|
||||||
uci.set('zapret', this.cfgsec, this.cfgparam, value);
|
uci.set('zapret', this.cfgsec, this.cfgparam, value);
|
||||||
uci.save();
|
uci.save();
|
||||||
let elem = document.getElementById("cbi-zapret-" + this.cfgsec + "-_" + this.cfgparam);
|
let elem = document.getElementById("cbi-zapret-" + this.cfgsec + "-_" + this.cfgparam);
|
||||||
if (elem) {
|
if (elem) {
|
||||||
elem.querySelector('div').textContent = value;
|
let val = value.trim();
|
||||||
|
if (this.multiline) {
|
||||||
|
val = val.replace(/</g, '˂');
|
||||||
|
val = val.replace(/>/g, '˃');
|
||||||
|
val = val.replace(/\n/g, '<br/>');
|
||||||
|
elem.querySelector('div').innerHTML = val;
|
||||||
|
} else {
|
||||||
|
elem.querySelector('div').textContent = val;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ui.hideModal();
|
ui.hideModal();
|
||||||
/*
|
/*
|
||||||
|
|||||||
@ -8,6 +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" ],
|
||||||
|
"/bin/ps*": [ "exec" ],
|
||||||
|
"/bin/opkg*": [ "exec" ],
|
||||||
|
"/opt/zapret/uci-def-cfg.sh*": [ "exec" ],
|
||||||
"/opt/zapret/sync_config.sh*": [ "exec" ]
|
"/opt/zapret/sync_config.sh*": [ "exec" ]
|
||||||
},
|
},
|
||||||
"uci": [ "zapret", "network" ],
|
"uci": [ "zapret", "network" ],
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=zapret-ip2net
|
PKG_NAME:=zapret-ip2net
|
||||||
PKG_VERSION:=65
|
PKG_VERSION:=67
|
||||||
PKG_RELEASE:=20241018
|
PKG_RELEASE:=20241030
|
||||||
|
|
||||||
PKG_MAINTAINER:=bol-van
|
PKG_MAINTAINER:=bol-van
|
||||||
PKG_LICENSE:=MIT
|
PKG_LICENSE:=MIT
|
||||||
@ -10,8 +10,8 @@ PKG_LICENSE_FILES:=docs/LICENSE.txt
|
|||||||
|
|
||||||
PKG_SOURCE_URL:=https://github.com/bol-van/zapret.git
|
PKG_SOURCE_URL:=https://github.com/bol-van/zapret.git
|
||||||
PKG_SOURCE_PROTO:=git
|
PKG_SOURCE_PROTO:=git
|
||||||
PKG_SOURCE_VERSION:=d97e7920cc79ff93a46a0ad30d8803a8e635157c
|
PKG_SOURCE_VERSION:=f22dcb24877ec9fe6be63ce3cf64d5433a3061b3
|
||||||
PKG_SOURCE_DATE:=2024-10-18
|
PKG_SOURCE_DATE:=2024-10-30
|
||||||
|
|
||||||
#PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
#PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||||
#PKG_SOURCE_URL:=https://github.com/bol-van/zapret/archive/refs/tags/v$(PKG_VERSION).tar.gz?
|
#PKG_SOURCE_URL:=https://github.com/bol-van/zapret/archive/refs/tags/v$(PKG_VERSION).tar.gz?
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=zapret-mdig
|
PKG_NAME:=zapret-mdig
|
||||||
PKG_VERSION:=65
|
PKG_VERSION:=67
|
||||||
PKG_RELEASE:=20241018
|
PKG_RELEASE:=20241030
|
||||||
|
|
||||||
PKG_MAINTAINER:=bol-van
|
PKG_MAINTAINER:=bol-van
|
||||||
PKG_LICENSE:=MIT
|
PKG_LICENSE:=MIT
|
||||||
@ -10,8 +10,8 @@ PKG_LICENSE_FILES:=docs/LICENSE.txt
|
|||||||
|
|
||||||
PKG_SOURCE_URL:=https://github.com/bol-van/zapret.git
|
PKG_SOURCE_URL:=https://github.com/bol-van/zapret.git
|
||||||
PKG_SOURCE_PROTO:=git
|
PKG_SOURCE_PROTO:=git
|
||||||
PKG_SOURCE_VERSION:=d97e7920cc79ff93a46a0ad30d8803a8e635157c
|
PKG_SOURCE_VERSION:=f22dcb24877ec9fe6be63ce3cf64d5433a3061b3
|
||||||
PKG_SOURCE_DATE:=2024-10-18
|
PKG_SOURCE_DATE:=2024-10-30
|
||||||
|
|
||||||
#PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
#PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||||
#PKG_SOURCE_URL:=https://github.com/bol-van/zapret/archive/refs/tags/v$(PKG_VERSION).tar.gz?
|
#PKG_SOURCE_URL:=https://github.com/bol-van/zapret/archive/refs/tags/v$(PKG_VERSION).tar.gz?
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=zapret-tpws
|
PKG_NAME:=zapret-tpws
|
||||||
PKG_VERSION:=65
|
PKG_VERSION:=67
|
||||||
PKG_RELEASE:=20241018
|
PKG_RELEASE:=20241030
|
||||||
|
|
||||||
PKG_MAINTAINER:=bol-van
|
PKG_MAINTAINER:=bol-van
|
||||||
PKG_LICENSE:=MIT
|
PKG_LICENSE:=MIT
|
||||||
@ -10,8 +10,8 @@ PKG_LICENSE_FILES:=docs/LICENSE.txt
|
|||||||
|
|
||||||
PKG_SOURCE_URL:=https://github.com/bol-van/zapret.git
|
PKG_SOURCE_URL:=https://github.com/bol-van/zapret.git
|
||||||
PKG_SOURCE_PROTO:=git
|
PKG_SOURCE_PROTO:=git
|
||||||
PKG_SOURCE_VERSION:=d97e7920cc79ff93a46a0ad30d8803a8e635157c
|
PKG_SOURCE_VERSION:=f22dcb24877ec9fe6be63ce3cf64d5433a3061b3
|
||||||
PKG_SOURCE_DATE:=2024-10-18
|
PKG_SOURCE_DATE:=2024-10-30
|
||||||
|
|
||||||
#PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
#PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||||
#PKG_SOURCE_URL:=https://github.com/bol-van/zapret/archive/refs/tags/v$(PKG_VERSION).tar.gz?
|
#PKG_SOURCE_URL:=https://github.com/bol-van/zapret/archive/refs/tags/v$(PKG_VERSION).tar.gz?
|
||||||
|
|||||||
@ -5,8 +5,8 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=zapret
|
PKG_NAME:=zapret
|
||||||
PKG_VERSION:=65
|
PKG_VERSION:=67
|
||||||
PKG_RELEASE:=20241018
|
PKG_RELEASE:=20241030
|
||||||
|
|
||||||
PKG_MAINTAINER:=bol-van
|
PKG_MAINTAINER:=bol-van
|
||||||
PKG_LICENSE:=MIT
|
PKG_LICENSE:=MIT
|
||||||
@ -14,8 +14,8 @@ PKG_LICENSE_FILES:=docs/LICENSE.txt
|
|||||||
|
|
||||||
PKG_SOURCE_URL:=https://github.com/bol-van/zapret.git
|
PKG_SOURCE_URL:=https://github.com/bol-van/zapret.git
|
||||||
PKG_SOURCE_PROTO:=git
|
PKG_SOURCE_PROTO:=git
|
||||||
PKG_SOURCE_VERSION:=d97e7920cc79ff93a46a0ad30d8803a8e635157c
|
PKG_SOURCE_VERSION:=f22dcb24877ec9fe6be63ce3cf64d5433a3061b3
|
||||||
PKG_SOURCE_DATE:=2024-10-18
|
PKG_SOURCE_DATE:=2024-10-30
|
||||||
|
|
||||||
#PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
#PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||||
#PKG_SOURCE_URL:=https://github.com/bol-van/zapret/archive/refs/tags/v$(PKG_VERSION).tar.gz?
|
#PKG_SOURCE_URL:=https://github.com/bol-van/zapret/archive/refs/tags/v$(PKG_VERSION).tar.gz?
|
||||||
@ -78,19 +78,14 @@ define Package/$(PKG_NAME)/install
|
|||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/init.d/openwrt/90-zapret $(1)/etc/hotplug.d/iface/90-zapret
|
$(INSTALL_BIN) $(PKG_BUILD_DIR)/init.d/openwrt/90-zapret $(1)/etc/hotplug.d/iface/90-zapret
|
||||||
$(INSTALL_DIR) $(1)/etc/init.d
|
$(INSTALL_DIR) $(1)/etc/init.d
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/init.d/openwrt/zapret $(1)/etc/init.d/zapret
|
$(INSTALL_BIN) $(PKG_BUILD_DIR)/init.d/openwrt/zapret $(1)/etc/init.d/zapret
|
||||||
$(INSTALL_DIR) $(1)/etc/config
|
$(INSTALL_CONF) ./config.default $(1)/opt/zapret/config.default
|
||||||
$(INSTALL_CONF) ./zapret.config $(1)/etc/config/zapret
|
$(INSTALL_CONF) ./ipset/zapret-hosts-google.txt $(1)/opt/zapret/ipset/zapret-hosts-google.txt
|
||||||
$(INSTALL_CONF) ./config $(1)/opt/zapret/config
|
|
||||||
#$(INSTALL_CONF) ./ipset/zapret-hosts-auto.txt $(1)/opt/zapret/ipset/zapret-hosts-auto.txt
|
|
||||||
$(INSTALL_CONF) ./ipset/zapret-hosts-user.txt $(1)/opt/zapret/ipset/zapret-hosts-user.txt
|
|
||||||
$(INSTALL_CONF) ./ipset/zapret-hosts-user-exclude.txt $(1)/opt/zapret/ipset/zapret-hosts-user-exclude.txt
|
$(INSTALL_CONF) ./ipset/zapret-hosts-user-exclude.txt $(1)/opt/zapret/ipset/zapret-hosts-user-exclude.txt
|
||||||
$(INSTALL_CONF) ./ipset/zapret-hosts-user-ipban.txt $(1)/opt/zapret/ipset/zapret-hosts-user-ipban.txt
|
|
||||||
#$(INSTALL_CONF) ./ipset/zapret-ip.txt $(1)/opt/zapret/ipset/zapret-ip.txt
|
|
||||||
$(INSTALL_CONF) ./ipset/zapret-ip-exclude.txt $(1)/opt/zapret/ipset/zapret-ip-exclude.txt
|
$(INSTALL_CONF) ./ipset/zapret-ip-exclude.txt $(1)/opt/zapret/ipset/zapret-ip-exclude.txt
|
||||||
$(INSTALL_CONF) ./ipset/zapret-ip-user.txt $(1)/opt/zapret/ipset/zapret-ip-user.txt
|
|
||||||
$(INSTALL_CONF) ./ipset/zapret-ip-user-exclude.txt $(1)/opt/zapret/ipset/zapret-ip-user-exclude.txt
|
|
||||||
$(INSTALL_CONF) ./ipset/zapret-ip-user-ipban.txt $(1)/opt/zapret/ipset/zapret-ip-user-ipban.txt
|
|
||||||
$(INSTALL_BIN) ./sync_config.sh $(1)/opt/zapret/sync_config.sh
|
$(INSTALL_BIN) ./sync_config.sh $(1)/opt/zapret/sync_config.sh
|
||||||
|
$(INSTALL_DIR) $(1)/etc/uci-defaults
|
||||||
|
$(INSTALL_BIN) ./uci-def-cfg.sh $(1)/etc/uci-defaults/zapret-uci-def-cfg.sh
|
||||||
|
$(INSTALL_BIN) ./uci-def-cfg.sh $(1)/opt/zapret/uci-def-cfg.sh
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/$(PKG_NAME)/preinst
|
define Package/$(PKG_NAME)/preinst
|
||||||
@ -108,7 +103,15 @@ if [ -z "$${IPKG_INSTROOT}" ]; then
|
|||||||
# stop service if PKG_UPGRADE
|
# stop service if PKG_UPGRADE
|
||||||
[ -x "/etc/init.d/zapret" ] && /etc/init.d/zapret stop >/dev/null 2>&1
|
[ -x "/etc/init.d/zapret" ] && /etc/init.d/zapret stop >/dev/null 2>&1
|
||||||
fi
|
fi
|
||||||
fi
|
if [ ! -f "/opt/zapret/ipset/zapret-hosts-google.txt" ]; then
|
||||||
|
if [ -f "/opt/zapret/ipset/zapret-hosts-user.txt" ]; then
|
||||||
|
CFGLISTHASH=$$( md5sum "/opt/zapret/ipset/zapret-hosts-user.txt" | awk '{print $$1;}' )
|
||||||
|
if [ "$${CFGLISTHASH}" = "79e35df62b0d1ae455d0a7e04c4cecac" ]; then
|
||||||
|
rm -f "/opt/zapret/ipset/zapret-hosts-user.txt"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
exit 0
|
exit 0
|
||||||
endef
|
endef
|
||||||
|
|
||||||
@ -116,25 +119,37 @@ define Package/$(PKG_NAME)/postinst
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# check if we are on real system
|
# check if we are on real system
|
||||||
if [ -z "$${IPKG_INSTROOT}" ]; then
|
if [ -z "$${IPKG_INSTROOT}" ]; then
|
||||||
NEWCFGNAME=zapret-opkg
|
ZAPRET_CONFIG=/opt/zapret/config
|
||||||
NEWCFGFILE=/etc/config/$${NEWCFGNAME}
|
ZAPRET_CONFIG_DEF="/opt/zapret/config.default"
|
||||||
if [ -f "$${NEWCFGFILE}" ]; then
|
# creating main config if its not exists
|
||||||
uci -m -f /etc/config/zapret import "$${NEWCFGNAME}"
|
if [ ! -f "$${ZAPRET_CONFIG}" ]; then
|
||||||
uci commit "$${NEWCFGNAME}"
|
cp -f "$${ZAPRET_CONFIG_DEF}" "$${ZAPRET_CONFIG}"
|
||||||
uci -m -f "$${NEWCFGFILE}" import zapret
|
|
||||||
uci commit zapret
|
|
||||||
rm -f "$${NEWCFGFILE}"
|
|
||||||
echo "File /etc/config/zapret merged from IPK"
|
|
||||||
fi
|
fi
|
||||||
NEWCONFIG=/opt/zapret/config-opkg
|
# check obsolete format for main config
|
||||||
if [ -f "$${NEWCONFIG}" ]; then
|
if grep -qE "^NFQWS_OPT_DESYNC=|^MODE_HTTP=|^MODE_HTTPS=|^MODE_QUIC=|^MODE=" "$${ZAPRET_CONFIG}" ; then
|
||||||
# backup current main config
|
echo "Detect obsolute format for main config!"
|
||||||
mv -f /opt/zapret/config /opt/zapret/config.backup
|
ZAPRET_CONFIG_BACKUP="$${ZAPRET_CONFIG}.backup"
|
||||||
# renew main config
|
cp -f "$${ZAPRET_CONFIG}" "$${ZAPRET_CONFIG_BACKUP}"
|
||||||
mv -f "$${NEWCONFIG}" /opt/zapret/config
|
echo "Current file $${ZAPRET_CONFIG} backuped to $${ZAPRET_CONFIG_BACKUP}"
|
||||||
echo "File /opt/zapret/config replaced from IPK"
|
cp -f "$${ZAPRET_CONFIG_DEF}" "$${ZAPRET_CONFIG}"
|
||||||
fi
|
fi
|
||||||
# synchnonize main config
|
# create empty txt files into ipset directory
|
||||||
|
[ ! -f "/opt/zapret/ipset/zapret-hosts-google.txt" ] && touch "/opt/zapret/ipset/zapret-hosts-google.txt"
|
||||||
|
#[ ! -f "/opt/zapret/ipset/zapret-hosts-auto.txt" ] && touch "/opt/zapret/ipset/zapret-hosts-auto.txt"
|
||||||
|
[ ! -f "/opt/zapret/ipset/zapret-hosts-user.txt" ] && touch "/opt/zapret/ipset/zapret-hosts-user.txt"
|
||||||
|
[ ! -f "/opt/zapret/ipset/zapret-hosts-user-ipban.txt" ] && touch "/opt/zapret/ipset/zapret-hosts-user-ipban.txt"
|
||||||
|
#[ ! -f "/opt/zapret/ipset/zapret-ip.txt" ] && touch "/opt/zapret/ipset/zapret-ip.txt"
|
||||||
|
[ ! -f "/opt/zapret/ipset/zapret-ip-user.txt" ] && touch "/opt/zapret/ipset/zapret-ip-user.txt"
|
||||||
|
[ ! -f "/opt/zapret/ipset/zapret-ip-user-exclude.txt" ] && touch "/opt/zapret/ipset/zapret-ip-user-exclude.txt"
|
||||||
|
[ ! -f "/opt/zapret/ipset/zapret-ip-user-ipban.txt" ] && touch "/opt/zapret/ipset/zapret-ip-user-ipban.txt"
|
||||||
|
# check existing uci-config
|
||||||
|
[ -f "/etc/config/zapret" ] && ZAPRET_CFG_EXISTS=1 || ZAPRET_CFG_EXISTS=0
|
||||||
|
# create or merge uci-config
|
||||||
|
/opt/zapret/uci-def-cfg.sh
|
||||||
|
[ "$${ZAPRET_CFG_EXISTS}" = "1" ] && echo "Config /etc/config/zapret merged with default uci-config"
|
||||||
|
# remove uci-default script from system dir (used into /etc/init.d/boot)
|
||||||
|
rm -f /etc/uci-defaults/zapret-uci-def-cfg.sh
|
||||||
|
# copy (sync) all params from uci-config to main config
|
||||||
/opt/zapret/sync_config.sh
|
/opt/zapret/sync_config.sh
|
||||||
# enable main service
|
# enable main service
|
||||||
/etc/init.d/zapret enable
|
/etc/init.d/zapret enable
|
||||||
@ -178,7 +193,7 @@ define Package/$(PKG_NAME)/postrm
|
|||||||
# check if we are on real system
|
# check if we are on real system
|
||||||
if [ -z "$${IPKG_INSTROOT}" ]; then
|
if [ -z "$${IPKG_INSTROOT}" ]; then
|
||||||
[ -f "/etc/config/zapret-opkg" ] && rm -f "/etc/config/zapret-opkg"
|
[ -f "/etc/config/zapret-opkg" ] && rm -f "/etc/config/zapret-opkg"
|
||||||
[ -f "/opt/zapret/config" ] && cp -f /opt/zapret/config "/opt/zapret/config.backup2"
|
[ -f "/opt/zapret/config" ] && cp -f /opt/zapret/config "/opt/zapret/config.backup"
|
||||||
#rm -rf /opt/zapret
|
#rm -rf /opt/zapret
|
||||||
#echo "Directory /opt/zapret removed!"
|
#echo "Directory /opt/zapret removed!"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@ -7,6 +7,10 @@
|
|||||||
# override firewall type : iptables,nftables,ipfw
|
# override firewall type : iptables,nftables,ipfw
|
||||||
FWTYPE=nftables
|
FWTYPE=nftables
|
||||||
|
|
||||||
|
# nftables only : set this to 0 to use pre-nat mode. default is post-nat.
|
||||||
|
# pre-nat mode disables some bypass techniques for forwarded traffic but allows to see client IP addresses in debug log
|
||||||
|
POSTNAT=1
|
||||||
|
|
||||||
# options for ipsets
|
# options for ipsets
|
||||||
# maximum number of elements in sets. also used for nft sets
|
# maximum number of elements in sets. also used for nft sets
|
||||||
SET_MAXELEM=522288
|
SET_MAXELEM=522288
|
||||||
@ -41,66 +45,56 @@ GZIP_LISTS=0
|
|||||||
# set to "-" to disable reload
|
# set to "-" to disable reload
|
||||||
#LISTS_RELOAD="pfctl -f /etc/pf.conf"
|
#LISTS_RELOAD="pfctl -f /etc/pf.conf"
|
||||||
|
|
||||||
# override ports
|
|
||||||
#HTTP_PORTS=80-81,85
|
|
||||||
#HTTPS_PORTS=443,500-501
|
|
||||||
#QUIC_PORTS=443,444
|
|
||||||
|
|
||||||
# CHOOSE OPERATION MODE
|
|
||||||
# MODE : nfqws,tpws,tpws-socks,filter,custom
|
|
||||||
# nfqws : nfqws for dpi desync
|
|
||||||
# tpws : tpws transparent mode
|
|
||||||
# tpws-socks : tpws socks mode
|
|
||||||
# filter : no daemon, just create ipset or download hostlist
|
|
||||||
# custom : custom mode. should modify custom init script and add your own code
|
|
||||||
MODE=nfqws
|
|
||||||
|
|
||||||
MODE_HTTP=1
|
|
||||||
MODE_HTTP_KEEPALIVE=0
|
|
||||||
MODE_HTTPS=1
|
|
||||||
MODE_QUIC=1
|
|
||||||
|
|
||||||
# none,ipset,hostlist,autohostlist
|
# none,ipset,hostlist,autohostlist
|
||||||
MODE_FILTER=hostlist
|
MODE_FILTER=hostlist
|
||||||
|
|
||||||
# CHOOSE NFQWS DAEMON OPTIONS for DPI desync mode. run "nfq/nfqws --help" for option list
|
# mark bit used by nfqws to prevent loop
|
||||||
DESYNC_MARK=0x40000000
|
DESYNC_MARK=0x40000000
|
||||||
DESYNC_MARK_POSTNAT=0x20000000
|
DESYNC_MARK_POSTNAT=0x20000000
|
||||||
|
|
||||||
|
|
||||||
NFQWS_OPT_DESYNC="--dpi-desync=fake,split2 --dpi-desync-ttl=7 --dpi-desync-ttl6=0 --dpi-desync-repeats=20 --dpi-desync-fooling=md5sig,badseq --dpi-desync-fake-tls=/opt/zapret/files/fake/tls_clienthello_www_google_com.bin"
|
TPWS_SOCKS_ENABLE=0
|
||||||
|
# tpws socks listens on this port on localhost and LAN interfaces
|
||||||
|
TPPORT_SOCKS=987
|
||||||
|
# use <HOSTLIST> and <HOSTLIST_NOAUTO> placeholders to engage standard hostlists and autohostlist in ipset dir
|
||||||
|
# hostlist markers are replaced to empty string if MODE_FILTER does not satisfy
|
||||||
|
# <HOSTLIST_NOAUTO> appends ipset/zapret-hosts-auto.txt as normal list
|
||||||
|
TPWS_SOCKS_OPT="--filter-tcp=80 --methodeol <HOSTLIST> --new --filter-tcp=443 --split-tls=sni --disorder <HOSTLIST>"
|
||||||
|
|
||||||
NFQWS_OPT_DESYNC_SUFFIX=""
|
TPWS_ENABLE=0
|
||||||
|
TPWS_PORTS="80,443"
|
||||||
NFQWS_OPT_DESYNC_HTTP=""
|
# use <HOSTLIST> and <HOSTLIST_NOAUTO> placeholders to engage standard hostlists and autohostlist in ipset dir
|
||||||
|
# hostlist markers are replaced to empty string if MODE_FILTER does not satisfy
|
||||||
NFQWS_OPT_DESYNC_HTTP_SUFFIX=""
|
# <HOSTLIST_NOAUTO> appends ipset/zapret-hosts-auto.txt as normal list
|
||||||
|
TPWS_OPT="--filter-tcp=80 --methodeol <HOSTLIST> --new --filter-tcp=443 --split-tls=sni --disorder <HOSTLIST>"
|
||||||
NFQWS_OPT_DESYNC_HTTPS=""
|
|
||||||
|
|
||||||
NFQWS_OPT_DESYNC_HTTPS_SUFFIX=""
|
|
||||||
|
|
||||||
NFQWS_OPT_DESYNC_HTTP6=""
|
|
||||||
|
|
||||||
NFQWS_OPT_DESYNC_HTTP6_SUFFIX=""
|
|
||||||
|
|
||||||
NFQWS_OPT_DESYNC_HTTPS6=""
|
|
||||||
|
|
||||||
NFQWS_OPT_DESYNC_HTTPS6_SUFFIX=""
|
|
||||||
|
|
||||||
NFQWS_OPT_DESYNC_QUIC="--dpi-desync=fake,split2 --dpi-desync-repeats=15 --dpi-desync-fake-quic=/opt/zapret/files/fake/quic_initial_www_google_com.bin --new --dpi-desync=fake --dpi-desync-repeats=15"
|
|
||||||
|
|
||||||
NFQWS_OPT_DESYNC_QUIC_SUFFIX=""
|
|
||||||
|
|
||||||
NFQWS_OPT_DESYNC_QUIC6=""
|
|
||||||
|
|
||||||
NFQWS_OPT_DESYNC_QUIC6_SUFFIX=""
|
|
||||||
|
|
||||||
|
|
||||||
# CHOOSE TPWS DAEMON OPTIONS. run "tpws/tpws --help" for option list
|
NFQWS_ENABLE=1
|
||||||
# SUFFIX VARS define additional lower priority desync profile. it's required if MODE_FILTER=hostlist and strategy has hostlist-incompatible 0-phase desync methods (mss)
|
|
||||||
TPWS_OPT="--hostspell=HOST --split-http-req=method --split-pos=3 --oob"
|
# redirect outgoing traffic with connbytes limiter applied in both directions.
|
||||||
#TPWS_OPT_SUFFIX="--mss 88"
|
NFQWS_PORTS_TCP="80,443"
|
||||||
|
NFQWS_PORTS_UDP="443"
|
||||||
|
|
||||||
|
# PKT_OUT means connbytes dir original
|
||||||
|
# PKT_IN means connbytes dir reply
|
||||||
|
# this is --dpi-desync-cutoff=nX kernel mode implementation for linux. it saves a lot of CPU.
|
||||||
|
NFQWS_TCP_PKT_OUT="9"
|
||||||
|
NFQWS_TCP_PKT_IN="3"
|
||||||
|
NFQWS_UDP_PKT_OUT="9"
|
||||||
|
NFQWS_UDP_PKT_IN="0"
|
||||||
|
|
||||||
|
# redirect outgoing traffic without connbytes limiter and incoming with connbytes limiter
|
||||||
|
# normally it's needed only for stateless DPI that matches every packet in a single TCP session
|
||||||
|
# typical example are plain HTTP keep alives
|
||||||
|
# this mode can be very CPU consuming. enable with care !
|
||||||
|
NFQWS_PORTS_TCP_KEEPALIVE=0
|
||||||
|
NFQWS_PORTS_UDP_KEEPALIVE=0
|
||||||
|
|
||||||
|
# use <HOSTLIST> and <HOSTLIST_NOAUTO> placeholders to engage standard hostlists and autohostlist in ipset dir
|
||||||
|
# hostlist markers are replaced to empty string if MODE_FILTER does not satisfy
|
||||||
|
# <HOSTLIST_NOAUTO> appends ipset/zapret-hosts-auto.txt as normal list
|
||||||
|
NFQWS_OPT="--filter-tcp=80 <HOSTLIST> --dpi-desync=fake,split2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig --new --filter-tcp=443 --hostlist=/opt/zapret/ipset/zapret-hosts-google.txt --dpi-desync=fake,split2 --dpi-desync-repeats=11 --dpi-desync-fooling=md5sig --dpi-desync-fake-tls=/opt/zapret/files/fake/tls_clienthello_www_google_com.bin --new --filter-udp=443 --hostlist=/opt/zapret/ipset/zapret-hosts-google.txt --dpi-desync=fake --dpi-desync-repeats=11 --dpi-desync-fake-quic=/opt/zapret/files/fake/quic_initial_www_google_com.bin --new --filter-udp=443 <HOSTLIST_NOAUTO> --dpi-desync=fake --dpi-desync-repeats=11 --new <HOSTLIST> --dpi-desync=fake,disorder2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig"
|
||||||
|
|
||||||
|
|
||||||
# FlowOffload mode : donttouch,none,software,hardware
|
# FlowOffload mode : donttouch,none,software,hardware
|
||||||
FLOWOFFLOAD=none
|
FLOWOFFLOAD=none
|
||||||
@ -141,4 +135,3 @@ DISABLE_IPV6=1
|
|||||||
# possible values : get_user.sh get_antizapret.sh get_combined.sh get_reestr.sh get_hostlist.sh
|
# possible values : get_user.sh get_antizapret.sh get_combined.sh get_reestr.sh get_hostlist.sh
|
||||||
# comment if not required
|
# comment if not required
|
||||||
#GETLIST=get_antizapret_domains.sh
|
#GETLIST=get_antizapret_domains.sh
|
||||||
#GETLIST=get_antifilter_ipsmart.sh
|
|
||||||
@ -4,14 +4,40 @@
|
|||||||
EXEDIR=/opt/zapret
|
EXEDIR=/opt/zapret
|
||||||
ZAPRET_BASE=/opt/zapret
|
ZAPRET_BASE=/opt/zapret
|
||||||
ZAPRET_CONFIG="$ZAPRET_BASE/config"
|
ZAPRET_CONFIG="$ZAPRET_BASE/config"
|
||||||
|
ZAPRET_CONFIG_DEF="$ZAPRET_BASE/config.default"
|
||||||
ZAPRET_CFG=/etc/config/zapret
|
ZAPRET_CFG=/etc/config/zapret
|
||||||
|
|
||||||
|
ZAPRET_CFG_SEC_NAME="$( uci -q get zapret.config )"
|
||||||
|
|
||||||
|
if [ -z "$ZAPRET_CFG_SEC_NAME" ]; then
|
||||||
|
# wrong uci-config
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
function get_sed_compat
|
function get_sed_compat
|
||||||
{
|
{
|
||||||
local str=$( ( echo $1|sed -r 's/([\$\.\*\/\[\\^])/\\\1/g'|sed 's/[]]/\\]/g' )>&1 )
|
local str=$( ( echo $1|sed -r 's/([\$\.\*\/\[\\^])/\\\1/g'|sed 's/[]]/\\]/g' )>&1 )
|
||||||
echo "$str"
|
echo "$str"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function uncomment_param
|
||||||
|
{
|
||||||
|
local param=$1
|
||||||
|
local fname=${2:-$ZAPRET_CONFIG}
|
||||||
|
sed -i "/^#$param=/s/^#//" $fname
|
||||||
|
}
|
||||||
|
|
||||||
|
function append_param
|
||||||
|
{
|
||||||
|
local param=$1
|
||||||
|
local fname=${2:-$ZAPRET_CONFIG}
|
||||||
|
grep -q "^$param=" $fname
|
||||||
|
if [ "$?" != "0" ]; then
|
||||||
|
echo "" >> $fname
|
||||||
|
echo "$param=" >> $fname
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
function set_param_value
|
function set_param_value
|
||||||
{
|
{
|
||||||
local param=$1
|
local param=$1
|
||||||
@ -32,38 +58,50 @@ function sync_param
|
|||||||
{
|
{
|
||||||
local param=$1
|
local param=$1
|
||||||
local vtype=$2
|
local vtype=$2
|
||||||
local value=$( uci -q get zapret.@main[0].$param )
|
local value="$( uci -q get zapret.config.$param )"
|
||||||
|
uncomment_param $param
|
||||||
|
append_param $param
|
||||||
|
local TAB="$( echo -n -e '\t' )"
|
||||||
|
if [ "$value" = "$TAB" ]; then
|
||||||
|
value=""
|
||||||
|
fi
|
||||||
if [ "$vtype" = "str" ]; then
|
if [ "$vtype" = "str" ]; then
|
||||||
set_param_value_str $param "$value"
|
set_param_value_str $param "$value"
|
||||||
else
|
else
|
||||||
set_param_value $param $value
|
set_param_value $param $value
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
sync_param MODE
|
if [ ! -f "$ZAPRET_CONFIG" ]; then
|
||||||
|
if [ ! -f "$ZAPRET_CONFIG_DEF" ]; then
|
||||||
|
touch "$ZAPRET_CONFIG"
|
||||||
|
else
|
||||||
|
cp -f "$ZAPRET_CONFIG_DEF" "$ZAPRET_CONFIG"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
sync_param FWTYPE
|
||||||
|
sync_param POSTNAT
|
||||||
sync_param FLOWOFFLOAD
|
sync_param FLOWOFFLOAD
|
||||||
sync_param INIT_APPLY_FW
|
sync_param INIT_APPLY_FW
|
||||||
sync_param DISABLE_IPV4
|
sync_param DISABLE_IPV4
|
||||||
sync_param DISABLE_IPV6
|
sync_param DISABLE_IPV6
|
||||||
sync_param MODE_FILTER
|
sync_param MODE_FILTER
|
||||||
|
|
||||||
|
sync_param AUTOHOSTLIST_RETRANS_THRESHOLD
|
||||||
|
sync_param AUTOHOSTLIST_FAIL_THRESHOLD
|
||||||
|
sync_param AUTOHOSTLIST_FAIL_TIME
|
||||||
|
sync_param AUTOHOSTLIST_DEBUGLOG
|
||||||
|
|
||||||
|
sync_param NFQWS_ENABLE
|
||||||
sync_param DESYNC_MARK
|
sync_param DESYNC_MARK
|
||||||
sync_param DESYNC_MARK_POSTNAT
|
sync_param DESYNC_MARK_POSTNAT
|
||||||
sync_param NFQWS_OPT_DESYNC str
|
sync_param NFQWS_PORTS_TCP str
|
||||||
sync_param NFQWS_OPT_DESYNC_SUFFIX str
|
sync_param NFQWS_PORTS_UDP str
|
||||||
sync_param MODE_HTTP
|
sync_param NFQWS_TCP_PKT_OUT str
|
||||||
sync_param MODE_HTTP_KEEPALIVE
|
sync_param NFQWS_TCP_PKT_IN str
|
||||||
sync_param NFQWS_OPT_DESYNC_HTTP str
|
sync_param NFQWS_UDP_PKT_OUT str
|
||||||
sync_param NFQWS_OPT_DESYNC_HTTP_SUFFIX str
|
sync_param NFQWS_UDP_PKT_IN str
|
||||||
sync_param NFQWS_OPT_DESYNC_HTTP6 str
|
sync_param NFQWS_PORTS_TCP_KEEPALIVE
|
||||||
sync_param NFQWS_OPT_DESYNC_HTTP6_SUFFIX str
|
sync_param NFQWS_PORTS_UDP_KEEPALIVE
|
||||||
sync_param MODE_HTTPS
|
sync_param NFQWS_OPT str
|
||||||
sync_param NFQWS_OPT_DESYNC_HTTPS str
|
|
||||||
sync_param NFQWS_OPT_DESYNC_HTTPS_SUFFIX str
|
|
||||||
sync_param NFQWS_OPT_DESYNC_HTTPS6 str
|
|
||||||
sync_param NFQWS_OPT_DESYNC_HTTPS6_SUFFIX str
|
|
||||||
sync_param MODE_QUIC
|
|
||||||
sync_param NFQWS_OPT_DESYNC_QUIC str
|
|
||||||
sync_param NFQWS_OPT_DESYNC_QUIC_SUFFIX str
|
|
||||||
sync_param NFQWS_OPT_DESYNC_QUIC6 str
|
|
||||||
sync_param NFQWS_OPT_DESYNC_QUIC6_SUFFIX str
|
|
||||||
|
|
||||||
|
|||||||
142
zapret/uci-def-cfg.sh
Executable file
142
zapret/uci-def-cfg.sh
Executable file
@ -0,0 +1,142 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Copyright (c) 2024 remittor
|
||||||
|
|
||||||
|
SCRIPT_SOURCED=0
|
||||||
|
case ${0##*/} in ash|-ash) SCRIPT_SOURCED=1;; esac
|
||||||
|
#[[ $_ != $0 ]] && echo "Script is being sourced" || echo "Script is a subshell"
|
||||||
|
|
||||||
|
ZAPRET_BASE=/opt/zapret
|
||||||
|
ZAPRET_CONFIG="$ZAPRET_BASE/config"
|
||||||
|
ZAPRET_CONFIG_DEF="$ZAPRET_BASE/config.default"
|
||||||
|
ZAPRET_CFG_FILE=/etc/config/zapret
|
||||||
|
ZAPRET_CFG_NAME=zapret
|
||||||
|
|
||||||
|
CFG_OPT_FORCE=0
|
||||||
|
CFG_OPT_MERGE=0
|
||||||
|
CFG_OPT_SYNC_CFG=0
|
||||||
|
|
||||||
|
|
||||||
|
function set_default_values
|
||||||
|
{
|
||||||
|
local cfgname=${1:-$ZAPRET_CFG_NAME}
|
||||||
|
local TAB="$( echo -n -e '\t' )"
|
||||||
|
uci batch <<-EOF
|
||||||
|
set $cfgname.config.autostart='0'
|
||||||
|
# settings for zapret service
|
||||||
|
set $cfgname.config.FWTYPE='nftables'
|
||||||
|
set $cfgname.config.POSTNAT='1'
|
||||||
|
set $cfgname.config.FLOWOFFLOAD='none'
|
||||||
|
set $cfgname.config.INIT_APPLY_FW='1'
|
||||||
|
set $cfgname.config.DISABLE_IPV4='0'
|
||||||
|
set $cfgname.config.DISABLE_IPV6='1'
|
||||||
|
set $cfgname.config.MODE_FILTER='hostlist'
|
||||||
|
# autohostlist options
|
||||||
|
set $cfgname.config.AUTOHOSTLIST_RETRANS_THRESHOLD='3'
|
||||||
|
set $cfgname.config.AUTOHOSTLIST_FAIL_THRESHOLD='3'
|
||||||
|
set $cfgname.config.AUTOHOSTLIST_FAIL_TIME='60'
|
||||||
|
set $cfgname.config.AUTOHOSTLIST_DEBUGLOG='0'
|
||||||
|
# nfqws options
|
||||||
|
set $cfgname.config.NFQWS_ENABLE='1'
|
||||||
|
set $cfgname.config.DESYNC_MARK='0x40000000'
|
||||||
|
set $cfgname.config.DESYNC_MARK_POSTNAT='0x20000000'
|
||||||
|
set $cfgname.config.NFQWS_PORTS_TCP='80,443'
|
||||||
|
set $cfgname.config.NFQWS_PORTS_UDP='443'
|
||||||
|
set $cfgname.config.NFQWS_TCP_PKT_OUT='9'
|
||||||
|
set $cfgname.config.NFQWS_TCP_PKT_IN='3'
|
||||||
|
set $cfgname.config.NFQWS_UDP_PKT_OUT='9'
|
||||||
|
set $cfgname.config.NFQWS_UDP_PKT_IN='0'
|
||||||
|
set $cfgname.config.NFQWS_PORTS_TCP_KEEPALIVE='0'
|
||||||
|
set $cfgname.config.NFQWS_PORTS_UDP_KEEPALIVE='0'
|
||||||
|
set $cfgname.config.NFQWS_OPT="
|
||||||
|
--filter-tcp=80 <HOSTLIST>
|
||||||
|
--dpi-desync=fake,split2
|
||||||
|
--dpi-desync-autottl=2
|
||||||
|
--dpi-desync-fooling=md5sig
|
||||||
|
--new
|
||||||
|
--filter-tcp=443 --hostlist=/opt/zapret/ipset/zapret-hosts-google.txt
|
||||||
|
--dpi-desync=fake,split2
|
||||||
|
--dpi-desync-repeats=11
|
||||||
|
--dpi-desync-fooling=md5sig
|
||||||
|
--dpi-desync-fake-tls=/opt/zapret/files/fake/tls_clienthello_www_google_com.bin
|
||||||
|
--new
|
||||||
|
--filter-udp=443 --hostlist=/opt/zapret/ipset/zapret-hosts-google.txt
|
||||||
|
--dpi-desync=fake
|
||||||
|
--dpi-desync-repeats=11
|
||||||
|
--dpi-desync-fake-quic=/opt/zapret/files/fake/quic_initial_www_google_com.bin
|
||||||
|
--new
|
||||||
|
--filter-udp=443 <HOSTLIST_NOAUTO>
|
||||||
|
--dpi-desync=fake
|
||||||
|
--dpi-desync-repeats=11
|
||||||
|
--new
|
||||||
|
<HOSTLIST>
|
||||||
|
--dpi-desync=fake,disorder2
|
||||||
|
--dpi-desync-autottl=2
|
||||||
|
--dpi-desync-fooling=md5sig
|
||||||
|
"
|
||||||
|
# save changes
|
||||||
|
commit $cfgname
|
||||||
|
EOF
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
function create_default_config
|
||||||
|
{
|
||||||
|
local cfgname=${1:-$ZAPRET_CFG_NAME}
|
||||||
|
local cfgfile=/etc/config/$cfgname
|
||||||
|
rm -f $cfgfile
|
||||||
|
touch $cfgfile
|
||||||
|
uci set $cfgname.config=main
|
||||||
|
set_default_values $cfgname
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
function merge_config_with_def_values
|
||||||
|
{
|
||||||
|
local cfgname=${1:-$ZAPRET_CFG_NAME}
|
||||||
|
local force=$2
|
||||||
|
local cfgfile=/etc/config/$cfgname
|
||||||
|
local NEWCFGNAME="zapret-default"
|
||||||
|
local NEWCFGFILE="/etc/config/$NEWCFGNAME"
|
||||||
|
|
||||||
|
create_default_config "$NEWCFGNAME"
|
||||||
|
[ ! -f "$NEWCFGFILE" ] && return 1
|
||||||
|
|
||||||
|
uci -m -f $cfgfile import "$NEWCFGNAME"
|
||||||
|
uci commit "$NEWCFGNAME"
|
||||||
|
uci -m -f "$NEWCFGFILE" import $cfgname
|
||||||
|
uci commit $cfgname
|
||||||
|
rm -f "$NEWCFGFILE"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if [ "$SCRIPT_SOURCED" != "1" ]; then
|
||||||
|
while getopts "fms" SCRIPT_OPT; do
|
||||||
|
case $SCRIPT_OPT in
|
||||||
|
f) CFG_OPT_FORCE=1;;
|
||||||
|
m) CFG_OPT_MERGE=1;;
|
||||||
|
s) CFG_OPT_SYNC_CFG=1;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ ! -f "$ZAPRET_CFG_FILE" ]; then
|
||||||
|
CFG_OPT_FORCE=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$CFG_OPT_FORCE" = "1" ]; then
|
||||||
|
create_default_config
|
||||||
|
[ "$CFG_OPT_SYNC_CFG" = "1" ] && /opt/zapret/sync_config.sh
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
CFG_OPT_MERGE=1
|
||||||
|
merge_config_with_def_values
|
||||||
|
|
||||||
|
if [ ! -f "$ZAPRET_CONFIG" ]; then
|
||||||
|
# create main config
|
||||||
|
/opt/zapret/sync_config.sh
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 0
|
||||||
@ -1,29 +0,0 @@
|
|||||||
config main 'config'
|
|
||||||
option autostart '0'
|
|
||||||
option FWTYPE 'nftables'
|
|
||||||
option MODE 'nfqws'
|
|
||||||
option FLOWOFFLOAD 'none'
|
|
||||||
option INIT_APPLY_FW '1'
|
|
||||||
option DISABLE_IPV4 '0'
|
|
||||||
option DISABLE_IPV6 '1'
|
|
||||||
option MODE_FILTER 'hostlist'
|
|
||||||
option DESYNC_MARK '0x40000000'
|
|
||||||
option DESYNC_MARK_POSTNAT '0x20000000'
|
|
||||||
option NFQWS_OPT_DESYNC '--dpi-desync=fake,split2 --dpi-desync-ttl=7 --dpi-desync-ttl6=0 --dpi-desync-repeats=20 --dpi-desync-fooling=md5sig,badseq --dpi-desync-fake-tls=/opt/zapret/files/fake/tls_clienthello_www_google_com.bin'
|
|
||||||
option NFQWS_OPT_DESYNC_SUFFIX ''
|
|
||||||
option MODE_HTTP '1'
|
|
||||||
option MODE_HTTP_KEEPALIVE '0'
|
|
||||||
option NFQWS_OPT_DESYNC_HTTP ''
|
|
||||||
option NFQWS_OPT_DESYNC_HTTP_SUFFIX ''
|
|
||||||
option NFQWS_OPT_DESYNC_HTTP6 ''
|
|
||||||
option NFQWS_OPT_DESYNC_HTTP6_SUFFIX ''
|
|
||||||
option MODE_HTTPS '1'
|
|
||||||
option NFQWS_OPT_DESYNC_HTTPS ''
|
|
||||||
option NFQWS_OPT_DESYNC_HTTPS_SUFFIX ''
|
|
||||||
option NFQWS_OPT_DESYNC_HTTPS6 ''
|
|
||||||
option NFQWS_OPT_DESYNC_HTTPS6_SUFFIX ''
|
|
||||||
option MODE_QUIC '1'
|
|
||||||
option NFQWS_OPT_DESYNC_QUIC '--dpi-desync=fake,split2 --dpi-desync-repeats=15 --dpi-desync-fake-quic=/opt/zapret/files/fake/quic_initial_www_google_com.bin --new --dpi-desync=fake --dpi-desync-repeats=15'
|
|
||||||
option NFQWS_OPT_DESYNC_QUIC_SUFFIX ''
|
|
||||||
option NFQWS_OPT_DESYNC_QUIC6 ''
|
|
||||||
option NFQWS_OPT_DESYNC_QUIC6_SUFFIX ''
|
|
||||||
Reference in New Issue
Block a user