aboutsummaryrefslogtreecommitdiffstats
path: root/dhcpcd-hooks/20-resolv.conf
diff options
context:
space:
mode:
Diffstat (limited to 'dhcpcd-hooks/20-resolv.conf')
-rw-r--r--dhcpcd-hooks/20-resolv.conf101
1 files changed, 60 insertions, 41 deletions
diff --git a/dhcpcd-hooks/20-resolv.conf b/dhcpcd-hooks/20-resolv.conf
index e757ddf..628636d 100644
--- a/dhcpcd-hooks/20-resolv.conf
+++ b/dhcpcd-hooks/20-resolv.conf
@@ -6,102 +6,121 @@
# Also, resolvconf can configure local nameservers such as bind
# or dnsmasq. This is important as the libc resolver isn't that powerful.
-resolv_conf_dir="${state_dir}/resolv.conf"
+resolv_conf_dir="$state_dir/resolv.conf"
build_resolv_conf()
{
- local cf="/etc/resolv.conf.${interface}"
+ local cf="$state_dir/resolv.conf.$interface"
local interfaces= header= search= srvs= servers= x=
# Build a list of interfaces
- interfaces=$(list_interfaces "${resolv_conf_dir}")
+ interfaces=$(list_interfaces "$resolv_conf_dir")
# Build the resolv.conf
- if [ -n "${interfaces}" ]; then
+ if [ -n "$interfaces" ]; then
# Build the header
for x in ${interfaces}; do
- header="${header}${header:+, }${x}"
+ header="$header${header:+, }$x"
done
# Build the search list
- search=$(cd "${resolv_conf_dir}"; \
+ domain=$(cd "$resolv_conf_dir"; \
+ key_get_value "domain " ${interfaces})
+ search=$(cd "$resolv_conf_dir"; \
key_get_value "search " ${interfaces})
- [ -n "${search}" ] && search="search $(uniqify ${search})\n"
+ set -- ${domain}
+ unset domain
+ if [ -n "$2" ]; then
+ search="$search $@"
+ elif [ -n "$1" ]; then
+ domain="domain $1\n"
+ fi
+ [ -n "$search" ] && search="search $(uniqify $search)\n"
# Build the nameserver list
- srvs=$(cd "${resolv_conf_dir}"; \
+ srvs=$(cd "$resolv_conf_dir"; \
key_get_value "nameserver " ${interfaces})
for x in $(uniqify ${srvs}); do
- servers="${servers}nameserver ${x}\n"
+ servers="${servers}nameserver $x\n"
done
fi
- header="${signature_base}${header:+ ${from} }${header}"
+ header="$signature_base${header:+ $from }$header"
# Assemble resolv.conf using our head and tail files
- [ -f "${cf}" ] && rm -f "${cf}"
- echo "${header}" > "${cf}"
+ [ -f "$cf" ] && rm -f "$cf"
+ [ -d "$resolv_conf_dir" ] || mkdir -p "$resolv_conf_dir"
+ echo "$header" > "$cf"
if [ -f /etc/resolv.conf.head ]; then
- cat /etc/resolv.conf.head >> "${cf}"
+ cat /etc/resolv.conf.head >> "$cf"
else
- echo "# /etc/resolv.conf.head can replace this line" >> "${cf}"
+ echo "# /etc/resolv.conf.head can replace this line" >> "$cf"
fi
- printf "${search}${servers}" >> "${cf}"
+ printf "$domain$search$servers" >> "$cf"
if [ -f /etc/resolv.conf.tail ]; then
- cat /etc/resolv.conf.tail >> "${cf}"
+ cat /etc/resolv.conf.tail >> "$cf"
else
- echo "# /etc/resolv.conf.tail can replace this line" >> "${cf}"
+ echo "# /etc/resolv.conf.tail can replace this line" >> "$cf"
fi
- mv -f "${cf}" /etc/resolv.conf
+ cat "$cf" > /etc/resolv.conf
+ chmod 644 /etc/resolv.conf
+ rm -f "$cf"
}
add_resolv_conf()
{
- local x= conf="${signature}\n"
+ local x= conf="$signature\n"
# If we don't have any configuration, remove it
- if [ -z "${new_domain_name_servers}" -a \
- -z "${new_domain_name}" -a \
- -z "${new_domain_search}" ]; then
+ if [ -z "$new_domain_name_servers" -a \
+ -z "$new_domain_name" -a \
+ -z "$new_domain_search" ]; then
remove_resolv_conf
return $?
fi
- if [ -n "${new_domain_search}" ]; then
- conf="${conf}search ${new_domain_search}\n"
- elif [ -n "${new_domain_name}" ]; then
- conf="${conf}search ${new_domain_name}\n"
+ if [ -n "$new_domain_name" ]; then
+ set -- $new_domain_name
+ new_domain_name="$1"
+ conf="${conf}domain $new_domain_name\n"
+ # Support RFC violating search in domain
+ if [ -z "$new_domain_search" -a -n "$2" ]; then
+ new_domain_search="$@"
+ fi
+ fi
+ if [ -n "$new_domain_search" ]; then
+ conf="${conf}search $new_domain_search\n"
fi
for x in ${new_domain_name_servers}; do
- conf="${conf}nameserver ${x}\n"
+ conf="${conf}nameserver $x\n"
done
if type resolvconf >/dev/null 2>&1; then
- printf "${conf}" | resolvconf -a "${interface}"
+ [ -n "$metric" ] && export IF_METRIC="$metric"
+ printf "$conf" | resolvconf -a "$interface"
return $?
fi
- if [ -e "${resolv_conf_dir}/${interface}" ]; then
- rm -f "${resolv_conf_dir}/${interface}"
- fi
- if [ ! -d "${resolv_conf_dir}" ]; then
- mkdir -p "${resolv_conf_dir}"
+ if [ -e "$resolv_conf_dir/$interface" ]; then
+ rm -f "$resolv_conf_dir/$interface"
fi
- printf "${conf}" > "${resolv_conf_dir}/${interface}"
+ [ -d "$resolv_conf_dir" ] || mkdir -p "$resolv_conf_dir"
+ printf "$conf" > "$resolv_conf_dir/$interface"
build_resolv_conf
}
remove_resolv_conf()
{
if type resolvconf >/dev/null 2>&1; then
- resolvconf -d "${interface}" -f
+ resolvconf -d "$interface" -f
else
- if [ -e "${resolv_conf_dir}/${interface}" ]; then
- rm -f "${resolv_conf_dir}/${interface}"
+ if [ -e "$resolv_conf_dir/$interface" ]; then
+ rm -f "$resolv_conf_dir/$interface"
fi
build_resolv_conf
fi
}
-case "${reason}" in
-BOUND|INFORM|REBIND|REBOOT|RENEW|TIMEOUT) add_resolv_conf;;
-PREINIT|EXPIRE|FAIL|IPV4LL|RELEASE|STOP) remove_resolv_conf;;
-esac
+if $if_up; then
+ add_resolv_conf
+elif $if_down; then
+ remove_resolv_conf
+fi