123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343 |
- #!/bin/sh
- # Copyright 2022 Stan Grishin (stangri@melmac.ca)
- # shellcheck disable=SC2018,SC2019,SC2039,SC3043,SC3057,SC3060
- # TechRef: https://openwrt.org/docs/techref/rpcd
- # TESTS
- # ubus -v list luci.pbr
- # ubus -S call luci.pbr getInitList '{"name": "pbr" }'
- # ubus -S call luci.pbr getInitStatus '{"name": "pbr" }'
- # ubus -S call luci.pbr getPlatformSupport '{"name": "pbr" }'
- # ubus -S call luci.pbr getGateways '{"name": "pbr" }'
- # ubus -S call luci.pbr getInterfaces '{"name": "pbr" }'
- readonly luciCompat='11'
- readonly pbrFunctionsFile='/etc/init.d/pbr'
- if [ -s "$pbrFunctionsFile" ]; then
- # shellcheck source=../../../../../pbr/files/etc/init.d/pbr
- . "$pbrFunctionsFile"
- else
- print_json_string 'error' "pbr init.d file ($pbrFunctionsFile) not found!"
- logger -t pbr 'error' "pbr init.d file ($pbrFunctionsFile) not found!"
- fi
- # compatibility with old luci app versions
- is_running_iptables() { iptables -t mangle -L | grep -q PBR_PREROUTING >/dev/null 2>&1; }
- is_running() { is_running_iptables || is_running_nft; }
- check_ipset() { { [ -n "$ipset" ] && "$ipset" help hash:net; } >/dev/null 2>&1; }
- check_agh_ipset() {
- check_ipset || return 1
- check_agh || return 1
- is_greater_or_equal "$($agh --version | sed 's|AdGuard Home, version v\(.*\)|\1|' | sed 's|-.*||')" '0.107.13'
- }
- check_dnsmasq_ipset() {
- local o;
- check_ipset || return 1
- check_dnsmasq || return 1
- o="$(dnsmasq -v 2>/dev/null)"
- ! echo "$o" | grep -q 'no-ipset' && echo "$o" | grep -q 'ipset'
- }
- get_init_list() {
- local name
- name="$(basename "$1")"
- name="${name:-$packageName}"
- json_init
- json_add_object "$packageName"
- json_add_boolean 'enabled' "$(is_enabled "$packageName")"
- if is_running "$packageName"; 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/$packageName" ]; 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)
- cmd="/etc/init.d/${name} ${action}"
- ;;
- esac
- if [ -n "$cmd" ] && eval "$cmd" 1>/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 gateways warnings errors
- gateways="$(ubus_get_status gateways | sed "s|\\\n|<br />|g;s|\(\\\033[^<]*\)|✓|g;")"
- warnings="$(ubus_get_status warnings)"
- errors="$(ubus_get_status errors)"
- json_init
- json_add_object "$packageName"
- json_add_boolean 'enabled' "$(is_enabled "$packageName")"
- if is_running "$packageName"; then
- json_add_boolean 'running' '1'
- else
- json_add_boolean 'running' '0'
- fi
- if is_running_iptables "$packageName"; then
- json_add_boolean 'running_iptables' '1'
- else
- json_add_boolean 'running_iptables' '0'
- fi
- if is_running_nft "$packageName"; then
- json_add_boolean 'running_nft' '1'
- else
- json_add_boolean 'running_nft' '0'
- fi
- if is_running_nft_file "$packageName"; then
- json_add_boolean 'running_nft_file' '1'
- else
- json_add_boolean 'running_nft_file' '0'
- fi
- json_add_string 'version' "$PKG_VERSION"
- json_add_string 'gateways' "$gateways"
- json_add_array 'errors'
- if [ -n "$errors" ]; then
- while read -r line; do
- if str_contains "$line" ' '; then
- error_id="${line% *}"
- error_extra="${line#* }"
- else
- error_id="$line"
- unset error_extra
- fi
- json_add_object
- json_add_string 'id' "$error_id"
- json_add_string 'extra' "$error_extra"
- json_close_object
- done <<EOF
- $(echo "$errors" | tr \# \\n)
- EOF
- fi
- json_close_array
- json_add_array 'warnings'
- if [ -n "$warnings" ]; then
- while read -r line; do
- if str_contains "$line" ' '; then
- warning_id="${line% *}"
- warning_extra="${line#* }"
- else
- warning_id="$line"
- unset warning_extra
- fi
- json_add_object
- json_add_string 'id' "$warning_id"
- json_add_string 'extra' "$warning_extra"
- json_close_object
- done <<EOF
- $(echo "$warnings" | tr \# \\n)
- EOF
- 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
- json_close_object
- json_dump
- json_cleanup
- }
- get_platform_support() {
- local name
- name="$(basename "$1")"
- name="${name:-$packageName}"
- json_init
- json_add_object "$packageName"
- 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_agh; then
- json_add_boolean 'adguardhome_installed' '1'
- else
- json_add_boolean 'adguardhome_installed' '0'
- fi
- if check_dnsmasq; then
- json_add_boolean 'dnsmasq_installed' '1'
- else
- json_add_boolean 'dnsmasq_installed' '0'
- fi
- if check_unbound; then
- json_add_boolean 'unbound_installed' '1'
- else
- json_add_boolean 'unbound_installed' '0'
- fi
- if check_agh_ipset; then
- json_add_boolean 'adguardhome_ipset_support' '1'
- else
- json_add_boolean 'adguardhome_ipset_support' '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
- json_close_object
- json_dump
- json_cleanup
- }
- # shellcheck disable=SC3037
- get_gateways() {
- echo -en "{\"$packageName\":{\"gateways\":"
- ubus_get_gateways
- echo -en "}}"
- }
- get_supported_interfaces() {
- _build_ifaces_supported() { is_supported_interface "$1" && ! str_contains "$ifacesSupported" "$1" && ifacesSupported="${ifacesSupported}${1} "; }
- _find_firewall_wan_zone() { [ "$(uci_get 'firewall' "$1" 'name')" = "wan" ] && firewallWanZone="$1"; }
- local i
- local firewallWanZone
- local ifacesSupported
- local webui_show_ignore_target
- local ignored_interface supported_interface
- local wanIface4 wanIface6
- config_load "$packageName"
- config_get_bool webui_show_ignore_target 'config' 'webui_show_ignore_target' '0'
- config_get ignored_interface 'config' 'ignored_interface'
- config_get supported_interface 'config' 'supported_interface'
- config_get procd_wan_interface 'config' 'procd_wan_interface' 'wan'
- config_get procd_wan6_interface 'config' 'procd_wan6_interface' 'wan6'
- local i
- wanIface4="$procd_wan_interface"
- wanIface6="$procd_wan6_interface"
- config_load 'firewall'
- config_foreach _find_firewall_wan_zone 'zone'
- for i in $(uci_get 'firewall' "$firewallWanZone" 'network'); do
- is_supported_interface "$i" && ! str_contains "$ifacesSupported" "$1" && ifacesSupported="${ifacesSupported}${i} "
- done
- config_load 'network'
- config_foreach _build_ifaces_supported 'interface'
- is_tor_running && ifacesSupported="$ifacesSupported tor"
- for i in $supported_interface; do
- is_xray "$i" && ifacesSupported="$ifacesSupported $i"
- done
- [ "$webui_show_ignore_target" -eq '1' ] && ifacesSupported="$ifacesSupported ignore"
- json_init
- json_add_object "$packageName"
- json_add_array 'interfaces'
- for i in $ifacesSupported; do
- json_add_string '' "$i"
- done
- json_close_array
- json_close_object
- json_dump
- json_cleanup
- }
- case "$1" in
- list)
- json_init
- json_add_object "getGateways"
- 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 "getInterfaces"
- 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
- getGateways)
- read -r input
- json_load "$input"
- json_get_var name 'name'
- json_cleanup
- get_gateways "$packageName"
- ;;
- getInitList)
- read -r input
- json_load "$input"
- json_get_var name 'name'
- json_cleanup
- get_init_list "$packageName"
- ;;
- getInitStatus)
- read -r input
- json_load "$input"
- json_get_var name 'name'
- json_cleanup
- get_init_status "$packageName"
- ;;
- getInterfaces)
- read -r input
- json_load "$input"
- json_get_var name 'name'
- json_cleanup
- get_supported_interfaces "$packageName"
- ;;
- getPlatformSupport)
- read -r input
- json_load "$input"
- json_get_var name 'name'
- json_cleanup
- get_platform_support "$packageName"
- ;;
- setInitAction)
- read -r input
- json_load "$input"
- json_get_var name 'name'
- json_get_var action 'action'
- json_cleanup
- set_init_action "$packageName" "$action"
- ;;
- esac
- ;;
- esac
|