-
-
Save nfekete/cf523d6820d353437f58dd1209430f4c to your computer and use it in GitHub Desktop.
Init.d script for keeping WSL resolv.conf in-sync with Windows
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /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