Merge pull request #711 from skuhl/wait-for-dns-flush

Fix defunct process after flushing DNS cache.
This commit is contained in:
Brian May 2022-01-09 20:14:02 +11:00 committed by GitHub
commit 9e4822d7b7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -9,7 +9,7 @@ import subprocess as ssubprocess
import sshuttle.ssyslog as ssyslog import sshuttle.ssyslog as ssyslog
import sshuttle.helpers as helpers import sshuttle.helpers as helpers
from sshuttle.helpers import debug1, debug2, Fatal from sshuttle.helpers import log, debug1, debug2, Fatal
from sshuttle.methods import get_auto_method, get_method from sshuttle.methods import get_auto_method, get_method
HOSTSFILE = '/etc/hosts' HOSTSFILE = '/etc/hosts'
@ -108,17 +108,25 @@ def flush_systemd_dns_cache():
# resolvectl in systemd 239. # resolvectl in systemd 239.
# https://github.com/systemd/systemd/blob/f8eb41003df1a4eab59ff9bec67b2787c9368dbd/NEWS#L3816 # https://github.com/systemd/systemd/blob/f8eb41003df1a4eab59ff9bec67b2787c9368dbd/NEWS#L3816
p = None
if helpers.which("resolvectl"): if helpers.which("resolvectl"):
debug2("Flushing systemd's DNS resolver cache: " debug2("Flushing systemd's DNS resolver cache: "
"resolvectl flush-caches") "resolvectl flush-caches")
ssubprocess.Popen(["resolvectl", "flush-caches"], p = ssubprocess.Popen(["resolvectl", "flush-caches"],
stdout=ssubprocess.PIPE, env=helpers.get_env()) stdout=ssubprocess.PIPE, env=helpers.get_env())
elif helpers.which("systemd-resolve"): elif helpers.which("systemd-resolve"):
debug2("Flushing systemd's DNS resolver cache: " debug2("Flushing systemd's DNS resolver cache: "
"systemd-resolve --flush-caches") "systemd-resolve --flush-caches")
ssubprocess.Popen(["systemd-resolve", "--flush-caches"], p = ssubprocess.Popen(["systemd-resolve", "--flush-caches"],
stdout=ssubprocess.PIPE, env=helpers.get_env()) stdout=ssubprocess.PIPE, env=helpers.get_env())
if p:
# Wait so flush is finished and process doesn't show up as defunct.
rv = p.wait()
if rv != 0:
log("Received non-zero return code %d when flushing DNS resolver "
"cache." % rv)
# This is some voodoo for setting up the kernel's transparent # This is some voodoo for setting up the kernel's transparent
# proxying stuff. If subnets is empty, we just delete our sshuttle rules; # proxying stuff. If subnets is empty, we just delete our sshuttle rules;