Skip to content

Commit 9a74cf7

Browse files
committed
dnscrypt: operability check is carried out by means of self-control
1 parent f11ac19 commit 9a74cf7

File tree

2 files changed

+40
-39
lines changed

2 files changed

+40
-39
lines changed

src/system/etc/dnscrypt-proxy/init-functions

+8-5
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ check_resolvers () {
2828
fi
2929
timestamp=$(date +%s)
3030
let "time=(timestamp-timegen)/3600"
31-
if [ "$time" -lt 96 ]; then # updated every 4 days
31+
if [ "$time" -lt 168 ]; then # updated every 7 days
3232
return 0
3333
fi
3434
fi
@@ -83,6 +83,8 @@ status_of_proc () {
8383
return 4 # Unable to determine status
8484
}
8585

86+
WAITFORDAEMON=30
87+
8688
killproc () {
8789
_daemon="$1"
8890
_pidfile="$2"
@@ -99,7 +101,7 @@ killproc () {
99101
if [ -n "${PIDTMP:-}" ]; then
100102
KILL_FLAGS=("-TERM" "-KILL")
101103
for flag in "${KILL_FLAGS[@]}" ; do
102-
wait_for_daemon $(kill "$flag" "$PIDTMP" 2>/dev/null)
104+
wait_for_daemon $WAITFORDAEMON $(kill "$flag" "$PIDTMP" 2>/dev/null)
103105
done
104106

105107
return 0
@@ -108,14 +110,15 @@ killproc () {
108110
return 1
109111
}
110112

111-
WAITFORDAEMON=30
112-
113113
wait_for_daemon () {
114+
_wait=$1
114115
_timeout=0
116+
shift
117+
115118
while :; do
116119
let _timeout=$_timeout+1
117120

118-
[ "$_timeout" -gt "$WAITFORDAEMON" ] && return 1
121+
[ "$_timeout" -gt "$_wait" ] && return 1
119122
"$@" && break
120123

121124
sleep 1

src/system/etc/init.d/99dnscrypt.sh

+32-34
Original file line numberDiff line numberDiff line change
@@ -37,22 +37,26 @@ set_prop () { setpropf "$LOCKFILE" "$1" "$2"; }
3737

3838
check_health () {
3939
if [ -s "$LOCKFILE" ]; then
40-
if [ grep -q "dnscrypt-resolvers=" "$LOCKFILE" ]; then
41-
resolvers="public-resolvers.md"
42-
minisig="$resolvers.minisig"
43-
44-
DNSCRYPT_RESOLV_PATH="$(get_prop 'dnscrypt-resolvers')"
40+
while IFS== read -r KEY VALUE || [[ -n $KEY ]]; do
41+
[[ "$KEY" = [#!]* ]] && continue;
42+
export "$KEY=$VALUE"
43+
done < $LOCKFILE
44+
45+
if [ -z "${DNSCRYPT_RESOLV_PATH:-}" ]; then
4546
confdir=${DNSCRYPT_RESOLV_PATH:-`dirname "$CONFIG_FILE"`}
46-
47-
if check_resolvers $confdir/$resolvers; then
48-
log_debug_msg "copy $confdir/$resolvers to $PIDDIR..."
49-
cp $confdir/{$resolvers,$minisig} $PIDDIR/
50-
else
51-
log_debug_msg "$confdir/$resolvers(.minisig): file not found"
52-
fi
47+
48+
resolvers=$(ls $confdir/*.md 2>/dev/null)
49+
for file in "$resolvers"; do
50+
if check_resolvers $file; then
51+
log_debug_msg "copy $file to $PIDDIR..."
52+
cp $file $file.minisig $PIDDIR
53+
else
54+
log_debug_msg "$file(.minisig): file not found"
55+
fi
56+
done
5357
fi
5458

55-
if [ "$(get_prop 'ipv4-enabled')" = "false" ]; then
59+
if [ -z "${DNSCRYPT_ADDR_LOCK:-}" ]; then
5660
log_debug_msg "ipv4_addr_unlock: enable IPv4"
5761
ipv4_addr_unlock
5862
fi
@@ -62,12 +66,6 @@ check_health () {
6266
fi
6367
}
6468

65-
_wfd_call () {
66-
if ! ls "$PIDDIR"/*.md 2>/dev/null; then
67-
return 1
68-
fi
69-
}
70-
7169
do_start () {
7270
if test ! -s "$CONFIG_FILE"; then
7371
log_debug_msg "missing config file $CONFIG_FILE"
@@ -76,6 +74,12 @@ do_start () {
7674

7775
mkdir -p -m 01755 "$PIDDIR" 2>/dev/null || \
7876
{ log_debug_msg "cannot access $PIDDIR directory, are you root?"; exit 1; }
77+
78+
if ! $DAEMON -check -config "$CONFIG_FILE" > /dev/null; then
79+
log_error_msg "$NAME configuration is invalid"
80+
set_prop "DNSCRYPT_RESOLV_PATH" ""
81+
return 10
82+
fi
7983

8084
nohup $DAEMON -config "$CONFIG_FILE" \
8185
-pidfile="$PIDFILE" > /dev/null 2>&1 &
@@ -86,19 +90,14 @@ do_start () {
8690

8791
case "$status" in
8892
0)
89-
if [[ "$DNSCRYPT_NOLIST" = 1 ]]; then
90-
sleep $WAITFORDAEMON
91-
elif ! wait_for_daemon _wfd_call; then
92-
log_error_msg "the resolvers file couldn't be uploaded?"
93-
set_prop "dnscrypt-resolvers" ""
94-
return 10
95-
fi
9693
log_debug_msg "enabling iptables firewall rules"
9794
iptrules_on
9895
;;
9996
*) # offline
10097
log_error_msg "ipv4_addr_lock: disable IPv4 (#$status)"
101-
ipv4_addr_lock && $(set_prop "ipv4-enabled" "false")
98+
ipv4_addr_lock
99+
100+
set_prop "DNSCRYPT_ADDR_LOCK" "1"
102101
return 1
103102
;;
104103
esac
@@ -107,7 +106,7 @@ do_start () {
107106

108107
do_stop () {
109108
if ! killproc "$DAEMON" "$PIDFILE"; then
110-
killall $NAME >/dev/null 2>&1
109+
killall $NAME >/dev/null 2>&1 &
111110
fi
112111

113112
log_debug_msg "disabling iptables firewall rules"
@@ -135,21 +134,18 @@ case "$1" in
135134
continue
136135
elif [[ $arg == -f || $arg == --force ]]; then
137136
DNSCRYPT_FORCE=1
138-
elif [[ $arg == -s || $arg == --no-lists ]]; then
139-
DNSCRYPT_NOLIST=1
140137
elif [[ $arg == -r || $arg == --resolv_path ]]; then
141138
:
142139
elif [[ $prev == -r || $prev == --resolv_path ]]; then
143-
set_prop "dnscrypt-resolvers" "$arg" # use with --force flag
140+
set_prop "DNSCRYPT_RESOLV_PATH" "$arg" # use with --force flag
144141
else
145142
echo Unrecognized argument $arg
146143
fi
147144
prev=$arg
148145
done
149146

150-
do_start
151-
152-
status="$?"
147+
status="0"
148+
do_start || status="$?"
153149
if [[ "$status" -ne 0 || "$DNSCRYPT_FORCE" = 1 ]]; then
154150
log_debug_msg "restore $DESC (#$status)"
155151
do_restart
@@ -173,6 +169,8 @@ case "$1" in
173169
3) log_error_msg "could not access PID file" ;;
174170
*) log_error_msg "$NAME is NOT running (#$status)" ;;
175171
esac
172+
173+
$DAEMON -check -config "$CONFIG_FILE" >&2
176174

177175
exit $status
178176
;;

0 commit comments

Comments
 (0)