sonic-buildimage/files/image_config/interfaces/interfaces-config.sh
Oleksandr Ivantsiv 5ef488f808 Clear DNS configuration received from DHCP during networking reconfiguration in Linux. (#13516)
- Why I did it
fixes #12907

When the management interface IP address configuration changes from dynamic to static the DNS configuration (retrieved from the DHCP server) in /etc/resolv.conf remains uncleared. This leads to a DNS configuration pointing to the wrong nameserver. To make the behavior clear DNS configuration received from DHCP should be cleared.

- How I did it
Use resolvconf package for managing DNS configuration. It is capable of tracking the source of DNS configuration and puts the configuration retrieved from the DHCP servers into a separate file. This allows the implementation of DNS configuration cleanup retrieved from DHCP during networking reconfiguration.

- How to verify it
Ensure that the management interface has no static configuration.
Check that /etc/resolv.conf has DNS configuration.
Configure a static IP address on the management interface.
Verify that /etc/resolv.conf has no DNS configuration.
Remove the static IP address from the management interface.
Verify that /etc/resolv.conf has DNS configuration retrieved form DHCP server.
2023-02-16 18:36:33 +08:00

73 lines
2.6 KiB
Bash
Executable File

#!/bin/bash
function wait_networking_service_done() {
local -i _WDOG_CNT="1"
local -ir _WDOG_MAX="30"
local -r _TIMEOUT="1s"
while [[ "${_WDOG_CNT}" -le "${_WDOG_MAX}" ]]; do
networking_status="$(systemctl is-active networking 2>&1)"
if [[ "${networking_status}" == active || "${networking_status}" == inactive || "${networking_status}" == failed ]] ; then
return
fi
echo "interfaces-config: networking service is running, wait for it done"
let "_WDOG_CNT++"
sleep "${_TIMEOUT}"
done
echo "interfaces-config: networking service is still running after 30 seconds, killing it"
systemctl kill networking 2>&1
}
if [[ $(ifquery --running eth0) ]]; then
wait_networking_service_done
ifdown --force eth0
fi
# Check if ZTP DHCP policy has been installed
if [[ -e /etc/network/ifupdown2/policy.d/ztp_dhcp.json ]]; then
# Obtain port operational state information
redis-dump -d 0 -k "PORT_TABLE:Ethernet*" -y > /tmp/ztp_port_data.json
if [[ $? -ne 0 || ! -e /tmp/ztp_port_data.json || "$(cat /tmp/ztp_port_data.json)" = "" ]]; then
echo "{}" > /tmp/ztp_port_data.json
fi
# Create an input file with ztp input information
echo "{ \"PORT_DATA\" : $(cat /tmp/ztp_port_data.json) }" > \
/tmp/ztp_input.json
else
echo "{ \"ZTP_DHCP_DISABLED\" : \"true\" }" > /tmp/ztp_input.json
fi
# Create /e/n/i file for existing and active interfaces, dhcp6 sytcl.conf and dhclient.conf
CFGGEN_PARAMS=" \
-d -j /tmp/ztp_input.json \
-t /usr/share/sonic/templates/interfaces.j2,/etc/network/interfaces \
-t /usr/share/sonic/templates/90-dhcp6-systcl.conf.j2,/etc/sysctl.d/90-dhcp6-systcl.conf \
-t /usr/share/sonic/templates/dhclient.conf.j2,/etc/dhcp/dhclient.conf \
"
sonic-cfggen $CFGGEN_PARAMS
[[ -f /var/run/dhclient.eth0.pid ]] && kill `cat /var/run/dhclient.eth0.pid` && rm -f /var/run/dhclient.eth0.pid
[[ -f /var/run/dhclient6.eth0.pid ]] && kill `cat /var/run/dhclient6.eth0.pid` && rm -f /var/run/dhclient6.eth0.pid
for intf_pid in $(ls -1 /var/run/dhclient*.Ethernet*.pid 2> /dev/null); do
[[ -f ${intf_pid} ]] && kill `cat ${intf_pid}` && rm -f ${intf_pid}
done
[[ -f /var/run/resolvconf/interface/eth0.dhclient ]] && rm -f /var/run/resolvconf/interface/eth0.dhclient
[[ -f /var/run/resolvconf/interface/eth0.ip6.dhclient ]] && rm -f /var/run/resolvconf/interface/eth0.ip6.dhclient
# Read sysctl conf files again
sysctl -p /etc/sysctl.d/90-dhcp6-systcl.conf
systemctl restart networking
# Clean-up created files
rm -f /tmp/ztp_input.json /tmp/ztp_port_data.json