1614d9096eafe3a22c258404bf91cf4fbdb2d8f9
[feed/packages.git] / net / https-dns-proxy / files / https-dns-proxy.init
1 #!/bin/sh /etc/rc.common
2 # Copyright 2019 Stan Grishin (stangri@melmac.net)
3 # shellcheck disable=SC2039
4
5 export START=80
6 export USE_PROCD=1
7
8 dnsmasqConfig=''
9
10 PROG=/usr/sbin/https-dns-proxy
11
12 xappend() { param="$param $1"; }
13
14 append_bool() {
15 local section="$1"
16 local option="$2"
17 local value="$3"
18 local default="$4"
19 local _loctmp
20 [ -z "$default" ] && default="0"
21 config_get_bool _loctmp "$section" "$option" "$default"
22 [ "$_loctmp" != "0" ] && xappend "$value"
23 }
24
25 append_parm() {
26 local section="$1"
27 local option="$2"
28 local switch="$3"
29 local default="$4"
30 local _loctmp
31 config_get _loctmp "$section" "$option" "$default"
32 [ -z "$_loctmp" ] && return 0
33 xappend "$switch $_loctmp"
34 }
35
36 start_instance() {
37 local cfg="$1" param listen_addr listen_port i
38
39 append_parm "$cfg" 'listen_addr' '-a' '127.0.0.1'
40 append_parm "$cfg" 'listen_port' '-p' "$p"
41 append_parm "$cfg" 'bootstrap_dns' '-b'
42 append_parm "$cfg" 'resolver_url' '-r'
43 append_parm "$cfg" 'user' '-u' 'nobody'
44 append_parm "$cfg" 'group' '-g' 'nogroup'
45 append_parm "$cfg" 'proxy_server' '-t'
46 append_parm "$cfg" 'logfile' '-l'
47 append_bool "$cfg" 'use_http1' '-x'
48 config_get_bool ipv6_resolvers_only "$cfg" 'use_ipv6_resolvers_only' '0'
49 config_get verbosity "$cfg" 'verbosity' "0"
50
51 # shellcheck disable=SC2086,SC2154
52 for i in $(seq 1 $verbosity); do
53 xappend "-v"
54 done
55 # shellcheck disable=SC2154
56 if [ "$ipv6_resolvers_only" = 0 ]; then
57 xappend "-4"
58 fi
59
60 procd_open_instance
61 # shellcheck disable=SC2086
62 procd_set_param command ${PROG} ${param}
63 procd_set_param stderr 1
64 procd_set_param stdout 1
65 procd_set_param respawn
66 procd_close_instance
67
68 config_get listen_addr "$cfg" 'listen_addr' '127.0.0.1'
69 config_get listen_port "$cfg" 'listen_port' "$p"
70
71 if [ "$dnsmasqConfig" = "*" ]; then
72 config_load 'dhcp'
73 config_foreach dnsmasq_add_doh_server 'dnsmasq' "${listen_addr}" "${listen_port}"
74 elif [ -n "$dnsmasqConfig" ]; then
75 for i in $dnsmasqConfig; do
76 dnsmasq_add_doh_server "@dnsmasq[${i}]" "${listen_addr}" "${listen_port}"
77 done
78 fi
79 p="$((p+1))"
80 }
81
82 service_triggers() {
83 procd_add_reload_trigger 'https-dns-proxy'
84 }
85
86 start_service() {
87 local p=5053
88 config_load 'https-dns-proxy'
89 config_get dnsmasqConfig 'config' 'update_dnsmasq_config' '*'
90 dhcp_backup 'create'
91 config_load 'https-dns-proxy'
92 config_foreach start_instance 'https-dns-proxy'
93 if [ -n "$(uci -q changes dhcp)" ]; then
94 uci -q commit dhcp
95 [ -x /etc/init.d/dnsmasq ] && /etc/init.d/dnsmasq restart >/dev/null 2>&1
96 fi
97 }
98
99 stop_service() {
100 config_load 'https-dns-proxy'
101 config_get dnsmasqConfig 'config' 'update_dnsmasq_config' '*'
102 dhcp_backup 'restore'
103 if [ -n "$(uci -q changes dhcp)" ]; then
104 uci -q commit dhcp
105 [ -x /etc/init.d/dnsmasq ] && /etc/init.d/dnsmasq restart >/dev/null 2>&1
106 fi
107 }
108
109 service_triggers() {
110 procd_add_reload_trigger 'https-dns-proxy'
111 }
112
113 dnsmasq_add_doh_server() {
114 local cfg="$1" address="$2" port="$3"
115 case $address in
116 0.0.0.0|::ffff:0.0.0.0) address='127.0.0.1';;
117 ::) address='::1';;
118 esac
119 uci -q del_list "dhcp.${cfg}.server=${address}#${port}"
120 uci -q add_list "dhcp.${cfg}.server=${address}#${port}"
121 }
122
123 dnsmasq_create_server_backup() {
124 local cfg="$1"
125 local i
126 uci -q get "dhcp.${cfg}" >/dev/null || return 0
127 if ! uci -q get "dhcp.${cfg}.doh_backup_noresolv" >/dev/null; then
128 if [ -z "$(uci -q get "dhcp.${cfg}.noresolv")" ]; then
129 uci -q set "dhcp.${cfg}.noresolv=1"
130 uci -q set "dhcp.${cfg}.doh_backup_noresolv=-1"
131 elif [ "$(uci -q get "dhcp.${cfg}.noresolv")" != "1" ]; then
132 uci -q set "dhcp.${cfg}.noresolv=1"
133 uci -q set "dhcp.${cfg}.doh_backup_noresolv=0"
134 fi
135 fi
136 if ! uci -q get "dhcp.${cfg}.doh_backup_server" >/dev/null; then
137 for i in $(uci -q get "dhcp.${cfg}.server"); do
138 uci -q add_list "dhcp.${cfg}.doh_backup_server=$i"
139 if [ "$i" = "${i//127.0.0.1}" ] && [ "$i" = "$(echo "$i" | tr -d /)" ]; then
140 uci -q del_list "dhcp.${cfg}.server=$i"
141 fi
142 done
143 fi
144 }
145
146 dnsmasq_restore_server_backup() {
147 local cfg="$1"
148 local i
149 uci -q get "dhcp.${cfg}" >/dev/null || return 0
150 if uci -q get "dhcp.${cfg}.doh_backup_noresolv" >/dev/null; then
151 if [ "$(uci -q get "dhcp.${cfg}.doh_backup_noresolv")" = "0" ]; then
152 uci -q set "dhcp.${cfg}.noresolv=0"
153 else
154 uci -q del "dhcp.${cfg}.noresolv"
155 fi
156 uci -q del "dhcp.${cfg}.doh_backup_noresolv"
157 fi
158 if uci -q get "dhcp.${cfg}.doh_backup_server" >/dev/null; then
159 uci -q del "dhcp.${cfg}.server"
160 for i in $(uci -q get "dhcp.${cfg}.doh_backup_server"); do
161 uci -q add_list "dhcp.${cfg}.server=$i"
162 done
163 uci -q del "dhcp.${cfg}.doh_backup_server"
164 fi
165 }
166
167 dhcp_backup() {
168 local i
169 config_load 'dhcp'
170 case "$1" in
171 create)
172 if [ "$dnsmasqConfig" = "*" ]; then
173 config_foreach dnsmasq_create_server_backup 'dnsmasq'
174 elif [ -n "$dnsmasqConfig" ]; then
175 for i in $dnsmasqConfig; do
176 dnsmasq_create_server_backup "@dnsmasq[${i}]"
177 done
178 fi
179 ;;
180 restore)
181 config_foreach dnsmasq_restore_server_backup 'dnsmasq'
182 ;;
183 esac
184 }