Created
February 19, 2017 15:47
-
-
Save k0nsl/6ba4e26d23ecbfefd3b4dade16fb33f4 to your computer and use it in GitHub Desktop.
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 | |
# | |
# $Id: fixdns 445 2016-01-25 02:49:25Z carl $ | |
# | |
# Recursive/Caching Nameservers | |
# | |
# Dallas, Standard Network | |
nsc_dl1="72.249.191.254" | |
# Dallas, Premium Network | |
nsc_dl2="206.123.113.254" | |
# Reading | |
nsc_rdg1="185.17.252.125" | |
# Auckland | |
nsc_akl1="103.16.180.254" | |
# Sydney | |
nsc_syd1="43.239.97.254" | |
bad_nameservers=( | |
118.127.6.7 | |
118.127.6.6 | |
60.234.2.2 | |
60.234.1.1 | |
206.123.64.245 | |
206.123.69.4 | |
72.29.96.250 | |
207.210.212.202 | |
72.249.0.34 | |
206.123.69.254 | |
66.199.228.130 | |
206.123.113.132 | |
207.99.0.41 | |
207.99.0.42 | |
207.99.0.1 | |
207.99.0.2 | |
66.199.235.50 | |
72.9.108.146 | |
210.56.80.56 | |
202.60.64.6 | |
203.25.185.119 | |
202.60.64.7 | |
4.2.2.2 | |
4.2.2.1 | |
122.100.15.254 | |
92.48.122.126 | |
66.199.228.254 | |
) | |
au_nameservers="$nsc_syd1 $nsc_akl1 $nsc_dl1" | |
ln_nameservers="$nsc_rdg1 $nsc_dl1 $nsc_dl2" | |
ny_nameservers="$nsc_dl1 $nsc_dl2 $nsc_rdg1" | |
dl_nameservers="$nsc_dl1 $nsc_dl2 $nsc_rdg1" | |
ak_nameservers="$nsc_akl1 $nsc_syd1 $nsc_dl1" | |
fr_nameservers="$nsc_rdg1 $nsc_dl1 $nsc_dl2" | |
google_nameservers="8.8.8.8 8.8.4.4" | |
ny_ranges="63. 66.199. 72.9. 216." | |
ln_ranges="85. 94. 217. 92. 213.229. 31. 151. 185.26. 185.17.252. 185.17.253. 185.17.254. 91.186." | |
fr_ranges="185.17.255. 84.200.48." | |
au_ranges="202. 122. 117. 101.234. 43.239. 103.52.116. 223.252." | |
dl_ranges="206.123. 207.210. 65.99. 72.249. 72.29. 74.50. 199.231. 199.255. 174." | |
ak_ranges="103.6. 103.16. 49.50. 113.21." | |
google_ranges="" | |
eth0=$(ip -4 addr show eth0 | grep 'inet' | head -n1 | awk '{print $2}' | cut -f1 -d'/') | |
if [ -z "${eth0}" ]; then | |
eth0=$(/sbin/ifconfig eth0 | grep 'inet addr' | cut -f2 -d: | awk '{print $1}') | |
fi | |
if [[ -e /etc/resolveconf ]]; then | |
echo "WARN: server appears to have the resolvconf package installed, that may" >&2 | |
echo " override your changes. Consider uninstalling that then reruning" >&2 | |
echo " this script?" >&2 | |
exit 0 | |
fi | |
if [ ! -e /etc/resolv.conf ] ; then | |
echo "No /etc/resolv.conf file" >&2 | |
exit 1 | |
fi | |
if [ ! -w /etc/resolv.conf ] ; then | |
echo "No write permission to /etc/resolv.conf file. Run as root?" >&2 | |
exit 1 | |
fi | |
function usage() { | |
echo "$0 [--dc ny|ln|au|dl|google] [--nameservers "8.8.8.8 8.8.4.4"] [--removebad] [--help] [--[no]check]" | |
} | |
while [ -n "$1" ]; do | |
case "$1" in | |
--dc) | |
[ $# -lt 1 ] && echo "--dc value required" >&2 && exit 1 | |
shift | |
eval good_nameservers=\$\{${1}_nameservers\} | |
echo "Using name servers for this location $1 are $good_nameservers" | |
;; | |
--nameservers) | |
[ $# -lt 1 ] && echo "--nameserver value required" >&2 && exit 1 | |
shift | |
good_nameservers=$1 | |
;; | |
--removebad) | |
REMOVEBAD="Y" | |
;; | |
--noremovebad) | |
REMOVEBAD="N" | |
;; | |
--nocheck) | |
CHECK="N" | |
;; | |
--check) | |
CHECK="Y" | |
;; | |
--help|-?) | |
usage | |
exit 0 | |
;; | |
*) | |
echo "Unexpected argument $1" >&2 && exit 1 | |
;; | |
esac | |
shift | |
done | |
known_range="unknown" | |
for dc in ny ln au dl ak fr; do | |
[ -n "$good_nameservers" ] && break | |
eval ranges=\$\{${dc}_ranges\} | |
for range in $ranges; do | |
if [ $(echo $eth0 | grep -c ^$range) -gt 0 ]; then | |
eval good_nameservers=\$\{${dc}_nameservers\} | |
echo "Default name servers for this location $dc are $good_nameservers" | |
break | |
fi | |
done | |
done | |
if [ -z "$good_nameservers" ]; then | |
echo "Using google name servers for IP '$eth0'" | |
good_nameservers=$google_nameservers | |
fi | |
#echo "Default name servers for this location are $good_nameservers" | |
#good_nameservers=($(echo "$good_nameservers")) | |
#echo "Default name servers for this location are $good_nameservers" | |
[ -e /etc/resolv.conf ] || exit 1 | |
old="/etc/resolv.conf.rimu-$$" | |
cp /etc/resolv.conf $old | |
if [ "$REMOVEBAD" == "Y" ]; then | |
if ! which dig >/dev/null 2>&1 ; then echo "dig not installed, exiting." >&2; exit 1; fi | |
nameservers=$(cat /etc/resolv.conf | grep '^nameserver' | awk '{print $2}') | |
for server in $nameservers; do | |
if [ $(dig @${server} +short google.com | grep -v '^;' | wc -l) -lt 1 ]; then | |
bad_nameservers+=($server) | |
echo "$server is not responding, will remove." | |
fi | |
done | |
fi | |
count=0 | |
for ((i=0;i<${#bad_nameservers[@]};i++)); do | |
ns=${bad_nameservers[$i]} | |
if [ $(grep -c "^nameserver $ns" /etc/resolv.conf) -gt 0 ]; then | |
sed s/"^nameserver $ns"/"#nameserver $ns"/g --in-place /etc/resolv.conf | |
if [ $? -ne 0 ]; then | |
exit 1 | |
fi | |
((count++)) | |
echo "Removing $ns" | |
fi | |
done | |
# If there is less than 2 nameservers listed in resolv.conf, and we're going to add less than 2 | |
if [ $(grep -c '^nameserver' /etc/resolv.conf ) -lt 2 -a ${count} -lt 2 ]; then | |
count=2 | |
fi | |
for ns in $good_nameservers; do | |
# need more name servers? | |
if [ $count -lt 1 ]; then break; fi | |
# name server already listed? | |
if [ $(grep -c "^nameserver $ns" /etc/resolv.conf) -gt 0 ]; then | |
continue; | |
fi | |
# name server working? | |
if [ "Y" == "$CHECK" ] ; then | |
if [ $(dig @${ns} +short google.com | grep -v '^;' | wc -l) -lt 1 ]; then | |
continue; | |
fi | |
fi | |
# add name server | |
echo "nameserver $ns" >> /etc/resolv.conf | |
# one fewer name server needed | |
((count--)) | |
done | |
if [ $(grep -c '^nameserver' /etc/resolv.conf ) -lt 2 -a $(grep -c '^nameserver 8.8.8.8' /etc/resolv.conf ) -eq 0 ]; then | |
echo "nameserver 8.8.8.8" >> /etc/resolv.conf | |
fi | |
if [ $(grep -c '^nameserver' /etc/resolv.conf ) -lt 2 -a $(grep -c '^nameserver 8.8.4.4' /etc/resolv.conf ) -eq 0 ]; then | |
echo "nameserver 8.8.4.4" >> /etc/resolv.conf | |
fi | |
# show any changes. if none remove the old file | |
diff $old /etc/resolv.conf || rm -f $old | |
retcode=0 | |
goodns=0 | |
if [ "N" == "$CHECK" ] ; then | |
echo "Skipping checks" | |
else | |
echo "Checking your name servers:" | |
nameservers=$(cat /etc/resolv.conf | grep '^nameserver' | awk '{print $2}') | |
for server in $nameservers; do | |
if [ $(dig @${server} +short google.com | grep -v '^;' | wc -l) -lt 1 ]; then | |
echo "$server in /etc/resolv.conf is not working. Rerun this script with --removebad to remove that." | |
((retcode++)) | |
continue | |
fi | |
((goodns++)) | |
echo $server is working; | |
done | |
fi | |
if [ $goodns -lt 1 ] ; then | |
((retcode++)) | |
fi | |
# else breaks wget script | bash | |
exit $retcode | |
#example from lenny, dont use 'host', is no longer consistent output across distros. 'dig' is better | |
#dcs:~# host google.com | |
#google.com A 74.125.225.98 | |
#google.com A 74.125.225.97 | |
#google.com A 74.125.225.101 | |
#google.com A 74.125.225.110 | |
#google.com A 74.125.225.100 | |
#google.com A 74.125.225.105 | |
#google.com A 74.125.225.102 | |
#google.com A 74.125.225.103 | |
#google.com A 74.125.225.96 | |
#google.com A 74.125.225.99 | |
#google.com A 74.125.225.104 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment