mirror of
https://github.com/openwrt/luci.git
synced 2025-12-21 21:24:35 +04:00
luci-app-antiblock: Add luci-app-antiblock package
Adding LuCI web interface for antiblock package Signed-off-by: Khachatryan Karen <karen0734@gmail.com>
This commit is contained in:
committed by
Paul Donald
parent
2fb2bd36c7
commit
0f743ad0f2
14
applications/luci-app-antiblock/Makefile
Normal file
14
applications/luci-app-antiblock/Makefile
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
|
PKG_NAME:=luci-app-antiblock
|
||||||
|
PKG_LICENSE:=GPL-3.0-or-later
|
||||||
|
PKG_MAINTAINER:=Khachatryan Karen <karen0734@gmail.com>
|
||||||
|
|
||||||
|
LUCI_TITLE:=AntiBlock Web UI
|
||||||
|
LUCI_URL:=https://github.com/karen07/luci-app-antiblock-openwrt-package
|
||||||
|
LUCI_DESCRIPTION:=Provides Web UI for AntiBlock
|
||||||
|
LUCI_DEPENDS:=+luci-base +antiblock
|
||||||
|
|
||||||
|
include ../../luci.mk
|
||||||
|
|
||||||
|
# call BuildPackage - OpenWrt buildroot signature
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
'use strict';
|
||||||
|
'require ui';
|
||||||
|
'require form';
|
||||||
|
'require rpc';
|
||||||
|
'require view';
|
||||||
|
|
||||||
|
const read_domains = rpc.declare({
|
||||||
|
object: 'luci.antiblock',
|
||||||
|
method: 'read_domains'
|
||||||
|
});
|
||||||
|
|
||||||
|
const write_domains = rpc.declare({
|
||||||
|
object: 'luci.antiblock',
|
||||||
|
method: 'write_domains',
|
||||||
|
params: ['domains']
|
||||||
|
});
|
||||||
|
|
||||||
|
return view.extend({
|
||||||
|
generic_failure: function (message) {
|
||||||
|
return E('div', {
|
||||||
|
'class': 'error'
|
||||||
|
}, ['RPC call failure: ', message]);
|
||||||
|
},
|
||||||
|
load: function () {
|
||||||
|
return Promise.all([
|
||||||
|
read_domains()
|
||||||
|
]);
|
||||||
|
},
|
||||||
|
render: function (data) {
|
||||||
|
const main_div = E('div');
|
||||||
|
|
||||||
|
const header = E('h2', {}, _('AntiBlock'));
|
||||||
|
|
||||||
|
const section_descr_div = E(
|
||||||
|
'div',
|
||||||
|
{
|
||||||
|
class: 'cbi-section-descr',
|
||||||
|
},
|
||||||
|
_('Domains count in file: ')
|
||||||
|
);
|
||||||
|
|
||||||
|
const section_div = E(
|
||||||
|
'div',
|
||||||
|
{
|
||||||
|
class: 'cbi-section',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
main_div.appendChild(header);
|
||||||
|
main_div.appendChild(section_div);
|
||||||
|
section_div.appendChild(section_descr_div);
|
||||||
|
|
||||||
|
if (typeof data[0].domains !== 'undefined') {
|
||||||
|
const domains_textarea = E(
|
||||||
|
'textarea',
|
||||||
|
{
|
||||||
|
class: 'cbi-input-textarea',
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
section_descr_div.innerHTML += data[0].domains.length;
|
||||||
|
|
||||||
|
domains_textarea.value = '';
|
||||||
|
data[0].domains.forEach((element) => domains_textarea.value += element + '\n');
|
||||||
|
|
||||||
|
const btn_write_domains = E(
|
||||||
|
'button',
|
||||||
|
{
|
||||||
|
class: 'btn cbi-button cbi-button-apply',
|
||||||
|
click: function (ev) {
|
||||||
|
ui.showModal(null, [
|
||||||
|
E(
|
||||||
|
'p',
|
||||||
|
{ class: 'spinning' },
|
||||||
|
_('Write domains')
|
||||||
|
),
|
||||||
|
]);
|
||||||
|
const lines = domains_textarea.value.split(/\r?\n/).filter(Boolean);
|
||||||
|
const write_domains_res = Promise.all([write_domains(lines)]);
|
||||||
|
write_domains_res.then(
|
||||||
|
function (value) { location.reload(); },
|
||||||
|
function (error) { /* code if some error */ }
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
_('Write domains')
|
||||||
|
);
|
||||||
|
|
||||||
|
section_div.appendChild(domains_textarea);
|
||||||
|
section_div.appendChild(btn_write_domains);
|
||||||
|
} else {
|
||||||
|
const error_div = E(
|
||||||
|
'div',
|
||||||
|
{
|
||||||
|
},
|
||||||
|
_('The File argument was not specified.')
|
||||||
|
);
|
||||||
|
|
||||||
|
section_div.appendChild(error_div);
|
||||||
|
}
|
||||||
|
|
||||||
|
return main_div;
|
||||||
|
},
|
||||||
|
handleSave: null,
|
||||||
|
handleSaveApply: null,
|
||||||
|
handleReset: null
|
||||||
|
});
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
'use strict';
|
||||||
|
'require view';
|
||||||
|
'require form';
|
||||||
|
'require tools.widgets as widgets';
|
||||||
|
|
||||||
|
return view.extend({
|
||||||
|
render: function () {
|
||||||
|
const m = new form.Map('antiblock', _('AntiBlock'));
|
||||||
|
|
||||||
|
const s = m.section(form.NamedSection, 'config', 'antiblock', _('AntiBlock'));
|
||||||
|
s.addremove = true;
|
||||||
|
|
||||||
|
let o = s.option(form.Flag, 'enabled', _('Enabled'));
|
||||||
|
|
||||||
|
o = s.option(form.Value, 'url', _('URL'), _('Domains file URL, either File or URL or both'));
|
||||||
|
o.default = 'https://antifilter.download/list/domains.lst';
|
||||||
|
o.depends('enabled', '1');
|
||||||
|
|
||||||
|
o = s.option(form.Value, 'file', _('File'), _('Domains file path, either File or URL or both'));
|
||||||
|
o.depends('enabled', '1');
|
||||||
|
|
||||||
|
o = s.option(form.Value, 'DNS', _('DNS'), _('DNS address, required parameter'));
|
||||||
|
o.default = '1.1.1.1:53';
|
||||||
|
o.depends('enabled', '1');
|
||||||
|
|
||||||
|
o = s.option(form.Value, 'listen', _('Listen'), _('Listen address, required parameter'));
|
||||||
|
o.default = '192.168.1.1:5053';
|
||||||
|
o.depends('enabled', '1');
|
||||||
|
|
||||||
|
o = s.option(widgets.DeviceSelect, 'VPN_name', _('VPN name'), _('Interface name, required parameter'));
|
||||||
|
o.depends('enabled', '1');
|
||||||
|
|
||||||
|
o = s.option(form.Value, 'output', _('Output'), _('Log or statistics output folder, optional parameter'));
|
||||||
|
o.depends('enabled', '1');
|
||||||
|
|
||||||
|
o = s.option(form.Flag, 'log', _('Log'), _('Show operations log, optional parameter'));
|
||||||
|
o.depends({ output: '/', '!contains': true });
|
||||||
|
|
||||||
|
o = s.option(form.Flag, 'stat', _('Stat'), _('Show statistics data, optional parameter'));
|
||||||
|
o.depends({ output: '/', '!contains': true });
|
||||||
|
|
||||||
|
return m.render();
|
||||||
|
},
|
||||||
|
});
|
||||||
85
applications/luci-app-antiblock/root/usr/libexec/rpcd/luci.antiblock
Executable file
85
applications/luci-app-antiblock/root/usr/libexec/rpcd/luci.antiblock
Executable file
@@ -0,0 +1,85 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# ubus -v list luci.antiblock
|
||||||
|
# ubus -S call luci.antiblock read_domains
|
||||||
|
# ubus -S call luci.antiblock write_domains '{"domains":["test0.com","test1.com","test2.com"]}'
|
||||||
|
|
||||||
|
. /lib/functions.sh
|
||||||
|
. /usr/share/libubox/jshn.sh
|
||||||
|
|
||||||
|
get_file_path() {
|
||||||
|
file_path="$(uci -q get antiblock.config.file)"
|
||||||
|
}
|
||||||
|
|
||||||
|
read_domains() {
|
||||||
|
get_file_path
|
||||||
|
|
||||||
|
json_init
|
||||||
|
if [ -n "$file_path" ]; then
|
||||||
|
if [ ! -f "$file_path" ]; then
|
||||||
|
touch "$file_path"
|
||||||
|
fi
|
||||||
|
|
||||||
|
json_add_array "domains"
|
||||||
|
file_data=$(cat $file_path)
|
||||||
|
for domain in $file_data; do
|
||||||
|
json_add_string "" "$domain"
|
||||||
|
done
|
||||||
|
json_close_array
|
||||||
|
else
|
||||||
|
json_add_array "empty"
|
||||||
|
json_close_array
|
||||||
|
fi
|
||||||
|
json_dump
|
||||||
|
json_cleanup
|
||||||
|
}
|
||||||
|
|
||||||
|
write_domains() {
|
||||||
|
get_file_path
|
||||||
|
|
||||||
|
if [ -n "$file_path" ]; then
|
||||||
|
if [ ! -f "$file_path" ]; then
|
||||||
|
touch "$file_path"
|
||||||
|
fi
|
||||||
|
|
||||||
|
json_load "$1"
|
||||||
|
json_get_values values "domains"
|
||||||
|
>$file_path
|
||||||
|
for key in $values; do
|
||||||
|
echo "$key" >>$file_path
|
||||||
|
done
|
||||||
|
json_cleanup
|
||||||
|
|
||||||
|
/etc/init.d/antiblock restart
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
list)
|
||||||
|
json_init
|
||||||
|
json_add_object "read_domains"
|
||||||
|
json_close_object
|
||||||
|
json_add_object "write_domains"
|
||||||
|
json_add_string 'domains' "domains"
|
||||||
|
json_close_object
|
||||||
|
json_dump
|
||||||
|
json_cleanup
|
||||||
|
;;
|
||||||
|
call)
|
||||||
|
case "$2" in
|
||||||
|
read_domains)
|
||||||
|
read_domains
|
||||||
|
;;
|
||||||
|
write_domains)
|
||||||
|
read -r input
|
||||||
|
write_domains "$input"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"admin/services/antiblock": {
|
||||||
|
"title": "AntiBlock",
|
||||||
|
"order": 90,
|
||||||
|
"action": {
|
||||||
|
"type": "firstchild"
|
||||||
|
},
|
||||||
|
"depends": {
|
||||||
|
"acl": [
|
||||||
|
"luci-app-antiblock"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"admin/services/antiblock/form": {
|
||||||
|
"title": "Args View",
|
||||||
|
"order": 1,
|
||||||
|
"action": {
|
||||||
|
"type": "view",
|
||||||
|
"path": "antiblock/form"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"admin/services/antiblock/domains": {
|
||||||
|
"title": "Domains file View",
|
||||||
|
"order": 2,
|
||||||
|
"action": {
|
||||||
|
"type": "view",
|
||||||
|
"path": "antiblock/domains"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"luci-app-antiblock": {
|
||||||
|
"description": "Grant UCI and RPC access to LuCI app AntiBlock",
|
||||||
|
"read": {
|
||||||
|
"ubus": {
|
||||||
|
"luci.antiblock": [
|
||||||
|
"read_domains",
|
||||||
|
"write_domains"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"uci": [
|
||||||
|
"antiblock"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"write": {
|
||||||
|
"uci": [
|
||||||
|
"antiblock"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user