Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753195AbdLHKV0 (ORCPT ); Fri, 8 Dec 2017 05:21:26 -0500 Received: from mx1.redhat.com ([209.132.183.28]:53626 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752872AbdLHKVH (ORCPT ); Fri, 8 Dec 2017 05:21:07 -0500 From: Eduardo Otubo To: linux-kernel@vger.kernel.org Cc: devel@linuxdriverproject.org, sthemmin@microsoft.com, haiyangz@microsoft.com, kys@microsoft.com, vkuznets@redhat.com, mgamal@redhat.com, cavery@redhat.com Subject: [PATCHv2] tools: hv: hv_set_ifconfig.sh double check before setting ip Date: Fri, 8 Dec 2017 11:20:56 +0100 Message-Id: <20171208102056.4725-1-otubo@redhat.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Fri, 08 Dec 2017 10:21:06 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2544 Lines: 68 This patch fixes the behavior of the hv_set_ifconfig script when setting the interface ip. Sometimes the interface has already been configured by network daemon, in this case hv_set_ifconfig causes "RTNETLINK: file exists error"; in order to avoid this error this patch makes sure double checks the interface before trying anything. Signed-off-by: Eduardo Otubo --- v2: wrap the interface configuration inside a safe wAY to avoid interaction with network script. tools/hv/hv_set_ifconfig.sh | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/tools/hv/hv_set_ifconfig.sh b/tools/hv/hv_set_ifconfig.sh index 7ed9f85ef908..b6429703cc98 100755 --- a/tools/hv/hv_set_ifconfig.sh +++ b/tools/hv/hv_set_ifconfig.sh @@ -61,5 +61,46 @@ cp $1 /etc/sysconfig/network-scripts/ interface=$(echo $1 | awk -F - '{ print $2 }') -/sbin/ifdown $interface 2>/dev/null -/sbin/ifup $interface 2>/dev/null +current_ip=$(ip addr show $interface|sed -En 's/.*inet (addr:)?(([0-9*\.){3}[0-9]*).*/\2/p'); +config_file_ip=$(grep IPADDR /etc/sysconfig/network-scripts/ifcfg-$interface|cut -d"=" -f2); + +current_ipv6=$(ip addr show $interface|sed -E 's/^*.inet6\ (.*)\ scope\ global/\1/'); +config_file_ipv6=$(grep IPV6ADDR /etc/sysconfig/network-scripts/ifcfg-eth-$interface|cut -d"=" -f2); +config_file_ipv6_netmask=$(grep IPV6NETMASK /etc/sysconfig/network-scripts/ifcfg-eth-$interface|cut -d"=" -f2); +config_file_ipv6=${config_file_ipv6}/${config_file_ipv6_netmask}; + +configure_interface(){ + # only set the IP if the network service has not done yet + if [[ ${current_ip} != *${config_file_ip}* || ${current_ipv6} != ${config_file_ipv6} ]]; then + /sbin/ifdown $interface 2>/dev/null + /sbin/ifup $interface 2>/dev/null + fi +} + +error_exit(){ + message=$1 + logger "KVP daemon: $message" + exit 1; +} + +if [ -e /var/run/subsys/network ]; then + # network script is already up + # it is safe to configure the interface + configure_interface; +else + i=0; + while [ ! -e /var/run/subsys/network ]; do + # network script might be still starting. + # let's wait for 3 minutes + sleep 1m; + ((i++)); + + # if network service doens't come up in 3 minutes + # perhaps there's no network service at all + [[ $i == 3 ]] && break; + done + + # at this point it doesn't matter if network service is up or down + # we're safe either way + configure_interface; +fi -- 2.13.6