mirror of
https://github.com/openwrt/luci.git
synced 2025-04-21 21:29:14 +00:00
334 lines
8.5 KiB
Bash
Executable File
334 lines
8.5 KiB
Bash
Executable File
#!/bin/sh
|
|
# Copyright 2023 MOSSDeF, Stan Grishin (stangri@melmac.ca)
|
|
# shellcheck disable=SC2018,SC2019,SC3043,SC3060
|
|
|
|
# TechRef: https://openwrt.org/docs/techref/rpcd
|
|
# TESTS
|
|
# ubus -v list luci.adblock-fast
|
|
# ubus -S call luci.adblock-fast getFileUrlFilesizes '{"name": "adblock-fast" }'
|
|
# ubus -S call luci.adblock-fast getInitList '{"name": "adblock-fast" }'
|
|
# ubus -S call luci.adblock-fast getInitStatus '{"name": "adblock-fast" }'
|
|
# ubus -S call luci.adblock-fast getPlatformSupport '{"name": "adblock-fast" }'
|
|
# ubus -S call luci.adblock-fast setInitAction '{"name": "adblock-fast", "action": "start" }'
|
|
# ubus -S call luci.adblock-fast setInitAction '{"name": "adblock-fast", "action": "dl" }'
|
|
# ubus -S call luci.adblock-fast setInitAction '{"name": "adblock-fast", "action": "pause" }'
|
|
# ubus -S call luci.adblock-fast setInitAction '{"name": "adblock-fast", "action": "stop" }'
|
|
|
|
readonly luciCompat='4'
|
|
readonly adbFunctionsFile='/etc/init.d/adblock-fast'
|
|
if [ -s "$adbFunctionsFile" ]; then
|
|
# shellcheck source=../../../../../adblock-fast/files/etc/init.d/adblock-fast
|
|
. "$adbFunctionsFile"
|
|
else
|
|
logger -t adblock-fast 'error' "adblock-fast init.d file ($adbFunctionsFile) not found!"
|
|
print_json_string 'error' "adblock-fast init.d file ($adbFunctionsFile) not found!"
|
|
fi
|
|
|
|
get_file_url_filesizes() {
|
|
_get_file_url_size() {
|
|
local url size
|
|
config_get url "$1" 'url'
|
|
config_get size "$1" 'size'
|
|
if [ -z "$size" ]; then
|
|
size="$(get_url_filesize "$url")"
|
|
uci_set "$name" "$1" 'size' "$size"
|
|
fi
|
|
json_add_object
|
|
json_add_string 'url' "$url"
|
|
json_add_int 'size' "$size"
|
|
json_close_object
|
|
}
|
|
local name="$1" i
|
|
json_init
|
|
json_add_object "$name"
|
|
json_add_array 'sizes'
|
|
config_load "$name"
|
|
config_foreach _get_file_url_size 'file_url'
|
|
json_close_array
|
|
json_close_object
|
|
json_dump
|
|
json_cleanup
|
|
[ -n "$(uci_changes "$name")" ] && uci_commit "$name"
|
|
}
|
|
|
|
get_init_list() {
|
|
local name
|
|
name="$(basename "$1")"
|
|
name="${name:-$packageName}"
|
|
json_init
|
|
json_add_object "$name"
|
|
json_add_boolean 'enabled' "$(is_enabled "$name")"
|
|
if is_running "$name"; then
|
|
json_add_boolean 'running' '1'
|
|
else
|
|
json_add_boolean 'running' '0'
|
|
fi
|
|
json_close_object
|
|
json_dump
|
|
json_cleanup
|
|
}
|
|
|
|
set_init_action() {
|
|
local name action="$2" cmd
|
|
name="$(basename "$1")"
|
|
name="${name:-$packageName}"
|
|
if [ ! -f "/etc/init.d/$name" ]; then
|
|
print_json_string 'error' 'Init script not found!'
|
|
return
|
|
fi
|
|
case $action in
|
|
enable)
|
|
cmd="/etc/init.d/${name} ${action}"
|
|
cmd="${cmd} && uci_set ${name} config enabled 1 && uci_commit $name"
|
|
;;
|
|
disable)
|
|
cmd="/etc/init.d/${name} ${action}"
|
|
cmd="${cmd} && uci_set ${name} config enabled 0 && uci_commit $name"
|
|
;;
|
|
start|stop|reload|restart|dl|pause)
|
|
cmd="/etc/init.d/${name} ${action}"
|
|
;;
|
|
esac
|
|
if [ -n "$cmd" ] && eval "$cmd" >/dev/null 2>&1; then
|
|
print_json_bool "result" '1'
|
|
else
|
|
print_json_bool "result" '0'
|
|
fi
|
|
}
|
|
|
|
get_init_status() {
|
|
local name
|
|
name="$(basename "$1")"
|
|
name="${name:-$packageName}"
|
|
local errors warnings ports dns outputFile outputCache outputGzip outputConfig
|
|
local i j
|
|
# shellcheck disable=SC2034
|
|
local compressed_cache_dir
|
|
config_load "$name"
|
|
config_get compressed_cache_dir 'config' 'compressed_cache_dir' '/etc'
|
|
compressed_cache_dir="$(sanitize_dir "$compressed_cache_dir")"
|
|
compressed_cache_dir="${compressed_cache_dir:-/etc}"
|
|
if [ -n "$(uci_get "$packageName" 'config' 'dnsmasq_config_file_url')" ]; then
|
|
dns="dnsmasq.conf"
|
|
else
|
|
dns="$(uci_get "$packageName" 'config' 'dns' 'dnsmasq.servers')"
|
|
fi
|
|
|
|
dns_set_output_values "$dns"
|
|
|
|
json_init
|
|
json_add_object "$name"
|
|
json_add_boolean 'enabled' "$(is_enabled "$name")"
|
|
json_add_string 'status' "$(json 'get' 'status')"
|
|
if is_running "$name"; then
|
|
json_add_boolean 'running' '1'
|
|
else
|
|
json_add_boolean 'running' '0'
|
|
fi
|
|
json_add_string 'version' "$PKG_VERSION"
|
|
errors="$(ubus_get_data errors)"
|
|
json_add_array 'errors'
|
|
if [ -n "$errors" ]; then
|
|
for i in $errors; do
|
|
if str_contains "$i" '|'; then
|
|
error_extra="${i##*|}"
|
|
error_id="${i%|*}"
|
|
else
|
|
error_id="$i"
|
|
unset error_extra
|
|
fi
|
|
json_add_object
|
|
json_add_string 'id' "$error_id"
|
|
json_add_string 'extra' "$error_extra"
|
|
json_close_object
|
|
done
|
|
fi
|
|
json_close_array
|
|
warnings="$(ubus_get_data warnings)"
|
|
json_add_array 'warnings'
|
|
if [ -n "$warnings" ]; then
|
|
for i in $warnings; do
|
|
if str_contains "$i" '|'; then
|
|
error_extra="${i##*|}"
|
|
error_id="${i%|*}"
|
|
else
|
|
error_id="$i"
|
|
unset error_extra
|
|
fi
|
|
json_add_object
|
|
json_add_string 'id' "$error_id"
|
|
json_add_string 'extra' "$error_extra"
|
|
json_close_object
|
|
done
|
|
fi
|
|
if is_greater "${packageCompat:-0}" "${luciCompat:-0}"; then
|
|
json_add_object
|
|
json_add_string 'id' 'warningOutdatedLuciPackage'
|
|
json_close_object
|
|
elif is_greater "${luciCompat:-0}" "${packageCompat:-0}"; then
|
|
json_add_object
|
|
json_add_string 'id' 'warningOutdatedPrincipalPackage'
|
|
json_close_object
|
|
fi
|
|
json_close_array
|
|
|
|
ports="$(ubus_get_ports)"
|
|
if [ -n "$ports" ]; then
|
|
json_add_boolean 'force_dns_active' '1'
|
|
json_add_array 'force_dns_ports'
|
|
for i in $ports; do json_add_int '' "$i"; done
|
|
json_close_array
|
|
else
|
|
json_add_boolean 'force_dns_active' '0'
|
|
fi
|
|
json_add_int 'entries' "$(ubus_get_data entries)"
|
|
json_add_string 'dns' "$dns"
|
|
json_add_string 'outputFile' "$outputFile"
|
|
json_add_string 'outputCache' "$outputCache"
|
|
json_add_string 'outputGzip' "$outputGzip"
|
|
if [ -s "$outputFile" ]; then
|
|
json_add_boolean 'outputFileExists' '1'
|
|
else
|
|
json_add_boolean 'outputFileExists' '0'
|
|
fi
|
|
if [ -s "$outputCache" ]; then
|
|
json_add_boolean 'outputCacheExists' '1'
|
|
else
|
|
json_add_boolean 'outputCacheExists' '0'
|
|
fi
|
|
if [ -s "$outputGzip" ]; then
|
|
json_add_boolean 'outputGzipExists' '1'
|
|
else
|
|
json_add_boolean 'outputGzipExists' '0'
|
|
fi
|
|
json_add_array 'leds'
|
|
for i in /sys/class/leds/*; do json_add_string '' "$(basename "$i")"; done
|
|
json_close_array
|
|
json_close_object
|
|
json_dump
|
|
json_cleanup
|
|
}
|
|
|
|
get_platform_support() {
|
|
local name
|
|
name="$(basename "$1")"
|
|
name="${name:-$packageName}"
|
|
json_init
|
|
json_add_object "$name"
|
|
if check_ipset; then
|
|
json_add_boolean 'ipset_installed' '1'
|
|
else
|
|
json_add_boolean 'ipset_installed' '0'
|
|
fi
|
|
if check_nft; then
|
|
json_add_boolean 'nft_installed' '1'
|
|
else
|
|
json_add_boolean 'nft_installed' '0'
|
|
fi
|
|
if check_dnsmasq; then
|
|
json_add_boolean 'dnsmasq_installed' '1'
|
|
else
|
|
json_add_boolean 'dnsmasq_installed' '0'
|
|
fi
|
|
if check_dnsmasq_ipset; then
|
|
json_add_boolean 'dnsmasq_ipset_support' '1'
|
|
else
|
|
json_add_boolean 'dnsmasq_ipset_support' '0'
|
|
fi
|
|
if check_dnsmasq_nftset; then
|
|
json_add_boolean 'dnsmasq_nftset_support' '1'
|
|
else
|
|
json_add_boolean 'dnsmasq_nftset_support' '0'
|
|
fi
|
|
if check_smartdns; then
|
|
json_add_boolean 'smartdns_installed' '1'
|
|
else
|
|
json_add_boolean 'smartdns_installed' '0'
|
|
fi
|
|
if check_smartdns_ipset; then
|
|
json_add_boolean 'smartdns_ipset_support' '1'
|
|
else
|
|
json_add_boolean 'smartdns_ipset_support' '0'
|
|
fi
|
|
if check_smartdns_nftset; then
|
|
json_add_boolean 'smartdns_nftset_support' '1'
|
|
else
|
|
json_add_boolean 'smartdns_nftset_support' '0'
|
|
fi
|
|
if check_unbound; then
|
|
json_add_boolean 'unbound_installed' '1'
|
|
else
|
|
json_add_boolean 'unbound_installed' '0'
|
|
fi
|
|
json_add_array 'leds'
|
|
for i in /sys/class/leds/*; do json_add_string '' "$(basename "$i")"; done
|
|
json_close_array
|
|
json_close_object
|
|
json_dump
|
|
json_cleanup
|
|
}
|
|
|
|
case "$1" in
|
|
list)
|
|
json_init
|
|
json_add_object "getFileUrlFilesizes"
|
|
json_add_string 'name' 'name'
|
|
json_close_object
|
|
json_add_object "getInitList"
|
|
json_add_string 'name' 'name'
|
|
json_close_object
|
|
json_add_object "getInitStatus"
|
|
json_add_string 'name' 'name'
|
|
json_close_object
|
|
json_add_object "getPlatformSupport"
|
|
json_add_string 'name' 'name'
|
|
json_close_object
|
|
json_add_object "setInitAction"
|
|
json_add_string 'name' 'name'
|
|
json_add_string 'action' 'action'
|
|
json_close_object
|
|
json_dump
|
|
json_cleanup
|
|
;;
|
|
call)
|
|
case "$2" in
|
|
getFileUrlFilesizes)
|
|
read -r input
|
|
json_load "$input"
|
|
json_get_var name 'name'
|
|
json_cleanup
|
|
get_file_url_filesizes "$name"
|
|
;;
|
|
getInitList)
|
|
read -r input
|
|
json_load "$input"
|
|
json_get_var name 'name'
|
|
json_cleanup
|
|
get_init_list "$name"
|
|
;;
|
|
getInitStatus)
|
|
read -r input
|
|
json_load "$input"
|
|
json_get_var name 'name'
|
|
json_cleanup
|
|
get_init_status "$name"
|
|
;;
|
|
getPlatformSupport)
|
|
read -r input
|
|
json_load "$input"
|
|
json_get_var name 'name'
|
|
json_cleanup
|
|
get_platform_support "$name"
|
|
;;
|
|
setInitAction)
|
|
read -r input
|
|
json_load "$input"
|
|
json_get_var name 'name'
|
|
json_get_var action 'action'
|
|
json_cleanup
|
|
set_init_action "$name" "$action"
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|