/etc/resolvconf/update.d/libc is in resolvconf 1.78ubuntu2.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | #!/bin/sh
#
# Script to update resolv.conf, the libc resolver configuration file,
# and to notify users of the libc resolver of changes
#
# Assumption: On entry, PWD contains the resolv.conf-type files.
#
# This script is part of the resolvconf package.
#
# Set REPORT_ABSENT_SYMLINK=no to inhibit warning message that
# /etc/resolv.conf is not a symbolic link
#
# Set TRUNCATE_NAMESERVER_LIST_AFTER_LOOPBACK_ADDRESS=no
# to allow additional nameserver addresses to be listed in
# resolv.conf after an initial loopback address 127.* or ::1.
#
set -e
PATH=/sbin:/bin
[ -x /lib/resolvconf/list-records ] || exit 1
# Default override
[ -r /etc/default/resolvconf ] && . /etc/default/resolvconf
ETC=/etc
ETCRESOLVCONF="${ETC}/resolvconf"
RESOLVCONFDIR="${ETCRESOLVCONF}/resolv.conf.d"
BASEFILE="${RESOLVCONFDIR}/base"
HEADFILE="${RESOLVCONFDIR}/head"
TAILFILE="${RESOLVCONFDIR}/tail"
DYNAMICRSLVCNFFILE="/run/resolvconf/resolv.conf"
TMPFILE="${DYNAMICRSLVCNFFILE}_new.$$"
# Set unset variables to their defaults
if [ -z "$REPORT_ABSENT_SYMLINK" ] ; then
# '..._ALTERED_...' is the old deprecated name for this variable
if [ "$REPORT_ALTERED_SYMLINK" ] ; then
REPORT_ABSENT_SYMLINK="$REPORT_ALTERED_SYMLINK"
else
# Set to default value
REPORT_ABSENT_SYMLINK=y
fi
fi
if [ -z "$TRUNCATE_NAMESERVER_LIST_AFTER_LOOPBACK_ADDRESS" ] ; then
# '..._127' is the old deprecated name for this variable
if [ "$TRUNCATE_NAMESERVER_LIST_AFTER_127" ] ; then
TRUNCATE_NAMESERVER_LIST_AFTER_LOOPBACK_ADDRESS="$TRUNCATE_NAMESERVER_LIST_AFTER_127"
else
# Set to default value
TRUNCATE_NAMESERVER_LIST_AFTER_LOOPBACK_ADDRESS=y
fi
fi
report_warning() { echo "$0: Warning: $*" >&2 ; }
resolv_conf_is_symlinked_to_dynamic_file() {
[ -L ${ETC}/resolv.conf ] && [ "$(readlink -m ${ETC}/resolv.conf)" = "$DYNAMICRSLVCNFFILE" ]
}
if ! resolv_conf_is_symlinked_to_dynamic_file ; then
case "$REPORT_ABSENT_SYMLINK" in
y|Y|yes|YES|Yes)
report_warning "${ETC}/resolv.conf is not a symbolic link to $DYNAMICRSLVCNFFILE"
;;
esac
fi
# Args are candidate items not containing spaces
# Returns RSLT -- space-separated list of items without duplicates
#
# Stores arguments (minus duplicates) in RSLT, separated by spaces
uniquify()
{
RSLT=""
local D
while [ "$1" ] ; do
# Remove the root domain suffix
D="${1%.}"
for E in $RSLT ; do
[ "$D" = "$E" ] && { shift ; continue 2 ; }
done
RSLT="${RSLT:+$RSLT }$D"
shift
done
}
# Args are candidate items not containing spaces
# Returns NSMSRVS -- space-separate list of no more than 3 items,
# without duplicates,
# truncated after loopback address if TRUNCATE_NAMESERVER_LIST_AFTER_LOOPBACK_ADDRESS set affirmatively
uniquify_nameserver_list()
{
NMSRVRS=""
N=0
while [ "$1" ] ; do
for E in $NMSRVRS ; do
[ "$1" = "$E" ] && { shift ; continue 2 ; }
done
NMSRVRS="${NMSRVRS:+$NMSRVRS }$1"
case "$TRUNCATE_NAMESERVER_LIST_AFTER_LOOPBACK_ADDRESS" in (y|Y|yes|YES|Yes) case "$1" in (127.*|::1) return 0 ;; esac ;; esac
N=$(($N + 1))
[ "$N" = 3 ] && return 0
shift
done
}
RSLVCNFFILES="$(/lib/resolvconf/list-records)"
[ -f "$BASEFILE" ] && RSLVCNFFILES="$RSLVCNFFILES
$BASEFILE"
### Compile list of nameservers ###
NMSRVRS=""
if [ "$RSLVCNFFILES" ] ; then
uniquify_nameserver_list $(sed -n 's/^[[:space:]]*nameserver[[:space:]]\+//p' $RSLVCNFFILES)
fi
### Compile search list ###
SRCHS=""
if [ "$RSLVCNFFILES" ] ; then
uniquify $(sed -n 's/^[[:space:]]*\(\(search\)\|\(domain\)\)[[:space:]]\+//p' $RSLVCNFFILES)
SRCHS="$RSLT"
fi
clean_up() { rm -f "$TMPFILE" ; }
trap clean_up EXIT
clean_up
### Make the file ###
: > "$TMPFILE"
[ -f "$HEADFILE" ] && cat "$HEADFILE" >> "$TMPFILE"
for N in $NMSRVRS ; do echo "nameserver $N" >> "$TMPFILE" ; done
[ "$SRCHS" ] && echo "search $SRCHS" >> "$TMPFILE"
[ "$RSLVCNFFILES" ] && sed -e '/^[[:space:]]*$/d' -e '/^[[:space:]]*#/d' -e '/^[[:space:]]*\(\(nameserver\)\|\(search\)\|\(domain\)\)[[:space:]]/d' $RSLVCNFFILES >> "$TMPFILE" 2>/dev/null
[ -f "$TAILFILE" ] && cat "$TAILFILE" >> "$TMPFILE"
### Put the file in place ###
if [ -f "$DYNAMICRSLVCNFFILE" ] && [ "$(cat $TMPFILE)" = "$(cat $DYNAMICRSLVCNFFILE)" ] ; then
# The file has not changed
rm -f "$TMPFILE"
exit 0
fi
# The file has changed
mv -f "$TMPFILE" "$DYNAMICRSLVCNFFILE"
# Only notify users of /etc/resolv.conf if /etc/resolv.conf is actually
# symlinked to the file we have just updated.
resolv_conf_is_symlinked_to_dynamic_file || exit 0
# Notify users of the resolver
if [ -d "${ETCRESOLVCONF}/update-libc.d" ] ; then
exec run-parts "${ETCRESOLVCONF}/update-libc.d"
fi
exit 0
|