Skip to content

Instantly share code, notes, and snippets.

@regisbsb
Forked from matthiassb/dns-sync.sh
Last active March 30, 2021 22:28
Show Gist options
  • Save regisbsb/37d5f2752b8c7d67140f0f30129af314 to your computer and use it in GitHub Desktop.
Save regisbsb/37d5f2752b8c7d67140f0f30129af314 to your computer and use it in GitHub Desktop.
Init.d script for keeping WSL resolv.conf in-sync with Windows

Steps to run (as root)

This init.d script will keep Ubuntu WSL dns config in-sync with windows with a 15 sec lag-time.

Be warned: If this service is not running and the nameservers in windows userspace changed, then you may lose connectivity in WSL - make the daemon is running at all times

   wget https://gist.githubusercontent.com/matthiassb/9c8162d2564777a70e3ae3cbee7d2e95/raw/56640fbb50ec870d2a2f62b1f188081c29d45337/dns-sync.sh -O /etc/init.d/dns-sync.s
   chmod +x /etc/init.d/dns-sync.sh
   unlink /etc/resolv.conf
   service dns-sync.sh start

Note: WSL does not support service auto-start, when you boot your system you'll need to start the service manually

#! /bin/bash
### BEGIN INIT INFO
# Provides: dns-sync
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop:
# Short-Description: Synchronizes /etc/resolv.conf in WLS with Windows DNS - Matthias Brooks
### END INIT INFO
PATH=/sbin:/bin
PS=/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe
. /lib/init/vars.sh
. /lib/lsb/init-functions
do_start () {
while true
do
#Retrieve nameservers from via Powershell
TEMPFILE=$(mktemp)
$PS -Command "Get-DnsClientServerAddress -AddressFamily IPv4 | Select-Object -ExpandProperty ServerAddresses" > $TEMPFILE
/usr/bin/awk '!x[$0]++' $TEMPFILE > $TEMPFILE.2
IFS=$'\r\n' GLOBIGNORE='*' command eval 'UNIQUE_NAMESERVERS=($(cat $TEMPFILE.2))'
rm -f $TEMPFILE $TEMPFILE.2
#Retrive search domains via powershell
IFS=$'\r\n' GLOBIGNORE='*' command eval 'SEARCH_DOMAIN=($($PS -Command "Get-DnsClientGlobalSetting | Select-Object -ExpandProperty SuffixSearchList"))'
UNIQUE_SEARCH_DOMAIN=($(/usr/bin/tr ' ' '\n' <<< "${SEARCH_DOMAIN[@]}" | /usr/bin/sort -u | /usr/bin/tr '\n' ' '))
#Modify /etc/resolv.conf
touch /etc/resolv.conf
sed -i '/nameserver/d' /etc/resolv.conf > /dev/null 2>&1 || true
sed -i '/search/d' /etc/resolv.conf > /dev/null 2>&1 || true
for i in "${UNIQUE_NAMESERVERS[@]}"
do
echo "nameserver ${i}" >> /etc/resolv.conf
done
if [ ${#UNIQUE_SEARCH_DOMAIN[@]} -ne 0 ]; then
echo "search ${UNIQUE_SEARCH_DOMAIN[@]}" >> /etc/resolv.conf
fi
sleep 15
done
}
do_status () {
PID=$(cat /var/run/dns-sync.pid 2>/dev/null)
if [ "$PID" == "" ]; then
echo "dns-sync is not running"
return
fi
if ps -p $PID > /dev/null
then
echo "dns-sync is running"
else
echo "dns-sync is not running"
fi
}
case "$1" in
start|"")
kill $(cat /var/run/dns-sync.pid >/dev/null 2>&1) > /dev/null 2>&1 || true
do_start &
DO_SYNC_PID=$!
echo "${DO_SYNC_PID}" > /var/run/dns-sync.pid
;;
restart|reload|force-reload)
echo "Error: argument '$1' not supported" >&2
exit 3
;;
stop)
PID=$(cat /var/run/dns-sync.pid)
if ps -p $PID > /dev/null
then
kill -9 $(cat /var/run/dns-sync.pid)
echo "dns-sync stopped"
else
echo "dns-sync is not running"
fi
;;
status)
do_status
exit $?
;;
*)
echo "Usage: dns-sync.sh [start|stop]" >&2
exit 3
;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment