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:
Khachatryan Karen
2025-01-30 00:17:14 +03:00
committed by Paul Donald
parent 2fb2bd36c7
commit 0f743ad0f2
6 changed files with 301 additions and 0 deletions

View 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

View File

@@ -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
});

View File

@@ -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();
},
});

View 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

View File

@@ -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"
}
}
}

View File

@@ -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"
]
}
}
}