summaryrefslogtreecommitdiffhomepage
path: root/applications/luci-app-https-dns-proxy/root/usr/libexec/rpcd/luci.https-dns-proxy
diff options
context:
space:
mode:
Diffstat (limited to 'applications/luci-app-https-dns-proxy/root/usr/libexec/rpcd/luci.https-dns-proxy')
-rwxr-xr-xapplications/luci-app-https-dns-proxy/root/usr/libexec/rpcd/luci.https-dns-proxy206
1 files changed, 206 insertions, 0 deletions
diff --git a/applications/luci-app-https-dns-proxy/root/usr/libexec/rpcd/luci.https-dns-proxy b/applications/luci-app-https-dns-proxy/root/usr/libexec/rpcd/luci.https-dns-proxy
new file mode 100755
index 0000000000..8400af5f1f
--- /dev/null
+++ b/applications/luci-app-https-dns-proxy/root/usr/libexec/rpcd/luci.https-dns-proxy
@@ -0,0 +1,206 @@
+#!/bin/sh
+# Copyright 2023 MOSSDeF, Stan Grishin (stangri@melmac.ca)
+# shellcheck disable=SC1091,SC2039,SC3043
+
+# TechRef: https://openwrt.org/docs/techref/rpcd
+
+# ubus -v list luci.https-dns-proxy
+# ubus -S call luci.https-dns-proxy getInitList '{"name": "https-dns-proxy" }'
+# ubus -S call luci.https-dns-proxy getInitStatus '{"name": "https-dns-proxy" }'
+# ubus -S call luci.https-dns-proxy getPlatformSupport '{"name": "https-dns-proxy" }'
+# ubus -S call luci.https-dns-proxy getProviders '{"name": "https-dns-proxy" }'
+# ubus -S call luci.https-dns-proxy getRuntime '{"name": "https-dns-proxy" }'
+
+readonly packageName="https-dns-proxy"
+readonly providersDir="/usr/share/${packageName}/providers"
+
+. /lib/functions.sh
+. /usr/share/libubox/jshn.sh
+
+is_enabled() { "/etc/init.d/${1}" enabled; }
+is_running() { [ "$(ubus call service list "{ 'name': '$1' }" | jsonfilter -q -e "@['$1'].instances[*].running" | uniq)" = 'true' ]; }
+get_version() { grep -m1 -A2 -w "^Package: $1$" /usr/lib/opkg/status | sed -n 's/Version: //p'; }
+check_http2() { grep -q 'Provides: libnghttp2' /usr/lib/opkg/status; }
+check_http3() { grep -q 'Provides: libnghttp3' /usr/lib/opkg/status; }
+ubus_get_ports() { ubus call service list "{ 'name': '$packageName' }" | jsonfilter -e "@['${packageName}'].instances[*].data.firewall.*.dest_port"; }
+logger() { /usr/bin/logger -t "$packageName" "$@"; }
+print_json_bool() { json_init; json_add_boolean "$1" "$2"; json_dump; json_cleanup; }
+
+get_init_list() {
+ local name="$1"
+ json_init
+ json_add_object "$name"
+ if is_enabled "$name"; then
+ json_add_boolean 'enabled' '1'
+ else
+ json_add_boolean 'enabled' '0'
+ fi
+ if is_running "$name"; then
+ json_add_boolean 'running' '1'
+ else
+ json_add_boolean 'running' '0'
+ fi
+ json_close_object
+ json_dump
+ json_cleanup
+}
+
+get_init_status() {
+ local name
+ local i ports
+ local version
+ name="$(basename "$1")"
+ name="${name:-$packageName}"
+ ports="$(ubus_get_ports)"
+ [ -z "$version" ] && version="$(get_version "$name")"
+ json_init
+ json_add_object "$name"
+ if is_enabled "$name"; then
+ json_add_boolean 'enabled' '1'
+ else
+ json_add_boolean 'enabled' '0'
+ fi
+ if is_running "$name"; then
+ json_add_boolean 'running' '1'
+ else
+ json_add_boolean 'running' '0'
+ fi
+ 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_string 'version' "$version"
+ 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_http2; then
+ json_add_boolean 'http2_support' '1'
+ else
+ json_add_boolean 'http2_support' '0'
+ fi
+ if check_http3; then
+ json_add_boolean 'http3_support' '1'
+ else
+ json_add_boolean 'http3_support' '0'
+ fi
+ json_close_object
+ json_dump
+ json_cleanup
+}
+
+get_providers() {
+ local f
+ echo '{"https-dns-proxy":['
+ for f in "$providersDir"/*; do
+ cat "$f"
+ echo ','
+ done
+# echo '{ "title": "Custom", "template": "{option}", "params": { "option": { "type": "text", }, }, },'
+ echo ']}'
+}
+
+get_runtime() { ubus call service list "{ 'verbose': true, 'name': '$1' }"; }
+
+set_init_action() {
+ local name="$1" action="$2" cmd
+ case $action in
+ enable)
+ cmd="/etc/init.d/${name} enable";;
+ disable)
+ cmd="/etc/init.d/${name} disable";;
+ start|stop|restart)
+ 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
+}
+
+case "$1" in
+ list)
+ json_init
+ 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 "getProviders"
+ json_add_string 'name' "name"
+ json_close_object
+ json_add_object "getRuntime"
+ 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
+ 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"
+ ;;
+ getProviders)
+ read -r input
+ json_load "$input"
+ json_get_var name "name"
+ json_cleanup
+ get_providers "$name"
+ ;;
+ getRuntime)
+ read -r input
+ json_load "$input"
+ json_get_var name "name"
+ json_cleanup
+ get_runtime "$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