File: drbl-get-dnsserver

package info (click to toggle)
drbl 5.7.11-1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 6,984 kB
  • sloc: sh: 43,522; perl: 8,820; xml: 867; makefile: 131
file content (79 lines) | stat: -rwxr-xr-x 2,829 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/bin/bash
# Author: Steven Shiau, <steven _at_ clonezilla org>
# License: GPL
# Program to get DNS server

# Load DRBL setting and functions
DRBL_SCRIPT_PATH="${DRBL_SCRIPT_PATH:-/usr/share/drbl}"

. $DRBL_SCRIPT_PATH/sbin/drbl-conf-functions
#
# Settings
DNS_sys="/etc/resolv.conf"

Usage() {
  echo "Get the DNS server IP address for system." 
  echo "Usage:"
  echo "$(basename $0)"
  echo "Ex: $(basename $0)"
}

#
while [ $# -gt 0 ]; do
  case "$1" in
    -*)	echo "${0}: ${1}: invalid option" >&2
	Usage >&2
	exit 2 ;;
    *)	break ;;
  esac
done

nameserver_sys="$(LC_ALL=C grep -Ew "^nameserver" $DNS_sys | awk -F" " '{print $2}')"
if [ -z "$nameserver_sys" -o -n "$(echo "$nameserver_sys" | grep -E "^127\..*")" ]; then
  # On Ubuntu, dnsmasq with network-manager, the result might 127.0.0.1. We use nm-tool to get the real one
  # Ubuntu >= 22.04, use "resolvectl status"
  # Ubuntu >= 17.10 or Debian >= 9, use "systemd-resolve --status"
  # Ubuntu <= 14.04, use "nmcli dev list", while > 14.04, "nmcli dev show".
  # Results of systemd-resolve --status, example:
  # DNS Servers: 8.8.8.8
  #		 8.8.4.4
  # or
  # DNS Servers: 8.8.8.8
  # 		 8.8.4.4
  #              168.95.1.1
  #              DNSSEC NTA: 10.in-addr.arpa
  nameserver_sys="$(LC_ALL=C resolvectl status 2>/dev/null | grep -E "^[[:space:]]*DNS Servers" | awk -F":" '{print $2}')"
  if [ -z "$nameserver_sys" ]; then
    nameserver_sys="$(LC_ALL=C resolvectl status 2>/dev/null | sed -r -n '/DNS Servers:/,/(^$|^[[:print:]]*:[[:space:]]+.*)/p' | sed -r -e "s/DNS Servers://g")"
    # Decide the last line if it's the IP address.
    last_line="$(LC_ALL=C echo "$nameserver_sys" | tail -n 1 | grep -E "^[[:print:]]*:[[:space:]]+.*$")"
  fi
  if [ -n "$last_line" ]; then
    # Do not show the last line, remove it.
    nameserver_sys="$(echo "$nameserver_sys" | head -n -1)"
  fi
  if [ -z "$nameserver_sys" ]; then
    nameserver_sys="$(LC_ALL=C nmcli dev show 2>/dev/null | grep -i "IP4.DNS" | awk -F " " '{print $2}')"
  fi
  if [ -z "$nameserver_sys" ]; then
    nameserver_sys="$(LC_ALL=C nmcli dev list 2>/dev/null | grep -i "IP4.DNS" | awk -F " " '{print $2}')"
  fi
  if [ -z "$nameserver_sys" ]; then
    # Last posibility, dnsmasq
    nameserver_sys="$(LC_ALL=C grep -Ew "^nameserver" /var/run/dnsmasq/resolv.conf 2>/dev/null | awk -F" " '{print $2}')"
  fi
fi

sys_dns=""
# For multiple NIC configured with DNS, 
# nameserver_sys can be like: '8.8.8.8 DNS Domain: ~.  8.8.8.8 DNS Domain: ~.     '
# Hence we only put correct IPv4 address.
# Ref: https://groups.google.com/g/drbl/c/ebgoMdLIo9c
# Thanks to Alber Yang (alber.yang _at_ gmail com) for reporting this issue.
for i in $nameserver_sys; do
  if `is_valid_IPv4_add $i`; then
    sys_dns="$sys_dns, $i"
  fi
done
# Strip the leading ", "
echo "$(echo $sys_dns | sed -r -e "s/^, //")"