You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

144 lines
3.3 KiB

#!/bin/sh /etc/rc.common
# Copyright 2019 Stan Grishin (stangri@melmac.net)
# shellcheck disable=SC2039
export START=80
export USE_PROCD=1
PROG=/usr/sbin/https-dns-proxy
xappend() { param="$param $1"; }
append_bool() {
local section="$1"
local option="$2"
local value="$3"
local default="$4"
local _loctmp
[ -z "$default" ] && default="0"
config_get_bool _loctmp "$section" "$option" "$default"
[ "$_loctmp" != "0" ] && xappend "$value"
}
append_parm() {
local section="$1"
local option="$2"
local switch="$3"
local default="$4"
local _loctmp
config_get _loctmp "$section" "$option" "$default"
[ -z "$_loctmp" ] && return 0
xappend "$switch $_loctmp"
}
start_instance() {
local cfg="$1" param listen_addr listen_port
append_parm "$cfg" 'listen_addr' '-a' '127.0.0.1'
append_parm "$cfg" 'listen_port' '-p' "$p"
append_parm "$cfg" 'bootstrap_dns' '-b'
append_parm "$cfg" 'resolver_url' '-r'
append_parm "$cfg" 'user' '-u' 'nobody'
append_parm "$cfg" 'group' '-g' 'nogroup'
append_parm "$cfg" 'edns_subnet' '-e'
append_parm "$cfg" 'proxy_server' '-t'
append_parm "$cfg" 'logfile' '-l'
append_bool "$cfg" 'use_http1' '-x'
append_bool "$cfg" 'ipv4_resolvers' '-4'
config_get verbosity "$cfg" 'verbosity' "0"
for i in $(seq 1 $verbosity); do
xappend "-v"
done
procd_open_instance
# shellcheck disable=SC2086
procd_set_param command ${PROG} ${param}
procd_set_param stderr 1
procd_set_param stdout 1
procd_set_param respawn
procd_close_instance
config_get listen_addr "$cfg" 'listen_addr' '127.0.0.1'
config_get listen_port "$cfg" 'listen_port' "$p"
# Don't add the any address to dnsmasq
case $listen_addr in
0.0.0.0|::ffff:0.0.0.0)
listen_addr='127.0.0.1'
;;
::)
listen_addr='::1'
;;
esac
config_load 'dhcp'
# shellcheck disable=SC2154
config_foreach dnsmasq_add_doh_server 'dnsmasq' "${listen_addr}#${listen_port}"
p="$((p+1))"
}
service_triggers() {
procd_add_reload_trigger 'https-dns-proxy'
}
start_service() {
local p=5053
dhcp_backup 'create'
config_load 'https-dns-proxy'
config_foreach start_instance 'https-dns-proxy'
if [ -z "$(uci -q get dhcp.@dnsmasq[0].server)" ]; then
dhcp_backup 'restore'
fi
if [ -n "$(uci -q changes dhcp)" ]; then
uci -q commit dhcp
[ -x /etc/init.d/dnsmasq ] && /etc/init.d/dnsmasq restart >/dev/null 2>&1
fi
}
stop_service() {
dhcp_backup 'restore'
if [ -n "$(uci -q changes dhcp)" ]; then
uci -q commit dhcp
[ -x /etc/init.d/dnsmasq ] && /etc/init.d/dnsmasq restart >/dev/null 2>&1
fi
}
service_triggers() {
procd_add_reload_trigger 'https-dns-proxy'
}
dnsmasq_add_doh_server() {
local cfg="$1" value="$2"
uci -q add_list dhcp."$cfg".server="$value"
}
dnsmasq_create_server_backup() {
local cfg="$1" i
if ! uci -q get "dhcp.$cfg.doh_backup_server" >/dev/null; then
for i in $(uci -q get "dhcp.$cfg.server"); do
uci -q add_list dhcp."$cfg".doh_backup_server="$i"
done
fi
uci -q del "dhcp.$cfg.server"
}
dnsmasq_restore_server_backup() {
local cfg="$1" i
if uci -q get "dhcp.$cfg.doh_backup_server" >/dev/null; then
uci -q del "dhcp.$cfg.server"
for i in $(uci -q get "dhcp.$cfg.doh_backup_server"); do
uci -q add_list dhcp."$cfg".server="$i"
done
fi
}
dhcp_backup() {
config_load 'dhcp'
case "$1" in
create)
config_foreach dnsmasq_create_server_backup 'dnsmasq';;
restore)
config_foreach dnsmasq_restore_server_backup 'dnsmasq';;
esac
}