Persist DNS across Debian resolvers

This commit is contained in:
2026-05-22 14:21:02 +02:00
parent 90b6693bb1
commit d1060e7ee3
2 changed files with 84 additions and 4 deletions
+80 -3
View File
@@ -211,6 +211,16 @@ has_dhcpcd() {
grep -qi 'dhcpcd' /etc/resolv.conf 2>/dev/null
}
# Indique si systemd-resolved semble gerer la resolution DNS.
has_systemd_resolved() {
local resolv_target
resolv_target="$(readlink -f /etc/resolv.conf 2>/dev/null || true)"
[[ "${resolv_target}" == *systemd/resolve* ]] ||
[[ -e /lib/systemd/system/systemd-resolved.service ]] ||
[[ -e /usr/lib/systemd/system/systemd-resolved.service ]]
}
# Met a jour /etc/dhcpcd.conf avec un bloc statique dedie au script.
write_dhcpcd_conf() {
local interface="$1"
@@ -244,14 +254,73 @@ write_dhcpcd_conf() {
rm -f "${tmp_file}"
}
# Ecrit les serveurs DNS dans /etc/resolv.conf quand ce fichier n'est pas gere par lien symbolique.
# Ajoute un hook dhcpcd qui restaure les DNS apres regeneration de resolv.conf.
write_dhcpcd_dns_hook() {
local dns_servers="$1"
local resolv_target
local server tmp_file
if ! has_dhcpcd; then
return 0
fi
resolv_target="$(readlink -f /etc/resolv.conf 2>/dev/null || true)"
if [[ "${resolv_target}" == *systemd/resolve* ]]; then
return 0
fi
touch /etc/dhcpcd.exit-hook
tmp_file="$(mktemp)"
awk '
$0 == "# BEGIN configure-debian-network.sh" { skip = 1; next }
$0 == "# END configure-debian-network.sh" { skip = 0; next }
skip != 1 { print }
' /etc/dhcpcd.exit-hook > "${tmp_file}"
{
printf '\n# BEGIN configure-debian-network.sh\n'
printf 'cat > /etc/resolv.conf <<'\''EOF_DNS'\''\n'
printf '# Fichier genere par configure-debian-network.sh via dhcpcd.exit-hook\n'
for server in ${dns_servers}; do
printf 'nameserver %s\n' "${server}"
done
printf 'EOF_DNS\n'
printf '# END configure-debian-network.sh\n'
} >> "${tmp_file}"
install -m 0755 "${tmp_file}" /etc/dhcpcd.exit-hook
rm -f "${tmp_file}"
}
# Configure les DNS persistants pour systemd-resolved si ce backend est present.
write_systemd_resolved_conf() {
local dns_servers="$1"
if ! has_systemd_resolved; then
return 0
fi
install -m 0755 -d /etc/systemd/resolved.conf.d
cat > /etc/systemd/resolved.conf.d/99-configure-debian-network.conf <<EOF
# Fichier genere par configure-debian-network.sh
[Resolve]
DNS=${dns_servers}
Domains=~.
EOF
}
# Ecrit les serveurs DNS dans /etc/resolv.conf quand c'est pertinent.
write_resolv_conf() {
local dns_servers="$1"
local resolv_target
local server
if [[ -L /etc/resolv.conf ]]; then
echo "/etc/resolv.conf est un lien symbolique, il ne sera pas modifie directement."
return 0
resolv_target="$(readlink -f /etc/resolv.conf 2>/dev/null || true)"
if [[ "${resolv_target}" == *systemd/resolve* ]] || ! has_dhcpcd; then
echo "/etc/resolv.conf est un lien symbolique, il ne sera pas modifie directement."
return 0
fi
fi
{
@@ -322,9 +391,13 @@ main() {
if [[ "${network_changed}" -eq 1 ]]; then
backup_file /etc/network/interfaces
backup_file /etc/dhcpcd.conf
backup_file /etc/dhcpcd.exit-hook
backup_file /etc/systemd/resolved.conf.d/99-configure-debian-network.conf
backup_file /etc/resolv.conf
write_network_interfaces "${interface}" "${ip_cidr}" "${gateway}" "${dns_servers}"
write_dhcpcd_conf "${interface}" "${ip_cidr}" "${gateway}" "${dns_servers}"
write_dhcpcd_dns_hook "${dns_servers}"
write_systemd_resolved_conf "${dns_servers}"
write_resolv_conf "${dns_servers}"
fi
@@ -337,6 +410,10 @@ main() {
systemctl restart dhcpcd
echo "Service dhcpcd redemarre."
fi
if has_systemd_resolved && systemctl is-active --quiet systemd-resolved; then
systemctl restart systemd-resolved
echo "Service systemd-resolved redemarre."
fi
if systemctl restart networking; then
echo "Service networking redemarre."
else