File sysconfig-ifup-dhcp-dhcpcd-config-sync.bnc518219.diff of Package sysconfig

From ab1c0052856a2d2efbaf292076029d68a9ca6801 Mon Sep 17 00:00:00 2001
From: mt <mt@bf393798-0adf-0310-9952-bd479070b6c1>
Date: Wed, 16 Dec 2009 21:39:35 +0000
Subject: [PATCH] Synchronized ifup-dhcp and dhcpcd configuration steps to report
 status after dhcpcd really finished all its steps (bnc#518219).

git-svn-id: https://svn.suse.de/svn/sysconfig/branches/opensuse-11.2@2069 bf393798-0adf-0310-9952-bd479070b6c1
---
 scripts/dhcpcd-hook |   29 +++++++++++++++++++++--------
 scripts/ifup-dhcp   |   47 ++++++++++++++++++++++++++++++-----------------
 2 files changed, 51 insertions(+), 25 deletions(-)

diff --git a/scripts/dhcpcd-hook b/scripts/dhcpcd-hook
index 2fcb5f4..5c5ff45 100755
--- a/scripts/dhcpcd-hook
+++ b/scripts/dhcpcd-hook
@@ -133,6 +133,9 @@ hostname_changed()
 
 case $state in
 up)
+	write_cached_config_data  dhcp4_state up       $INTERFACE
+	commit_cached_config_data                      $INTERFACE
+
 	$debug && $log_dbg "Running ifup $INTERFACE -o dhcp"
 	ifup $INTERFACE -o dhcp
 
@@ -141,12 +144,11 @@ up)
 		-i $INTERFACE $NC_OPTIONS  \
 		-l $leaseinfo 2>&1 | $log_dbg
 
-	if hostname_changed ; then
-		# reload syslog so it knows the new hostname
-		/etc/init.d/syslog reload
-	fi
 	;;
 down)
+	write_cached_config_data  dhcp4_state down     $INTERFACE
+	commit_cached_config_data                      $INTERFACE
+
 	# We now call PRE_DOWN_SCRIPT directly from ifdown, because it was called
 	# POST from here (after IP address was removed). Thus we don't need this
 	# $debug && $log_dbg "Running ifdown $INTERFACE -o dhcp"
@@ -158,6 +160,9 @@ down)
 		2>&1 | $log_dbg
 	;;
 new)
+	write_cached_config_data  dhcp4_state new      $INTERFACE
+	commit_cached_config_data                      $INTERFACE
+
 	$debug && $log_dbg "new IP address: $IPADDR"
 
 	$debug && NC_OPTIONS="-v"
@@ -165,15 +170,23 @@ new)
 		-i $INTERFACE $NC_OPTIONS  \
 		< $leaseinfo 2>&1 | $log_dbg
 
+	$debug && $log_dbg "Running ifdown $INTERFACE -o dhcp"
+	ifdown $INTERFACE -o dhcp
+	$debug && $log_dbg "Running ifup $INTERFACE -o dhcp"
+	ifup $INTERFACE -o dhcp
+	;;
+complete)
+	# dhcpcd finished all requested configuration steps ...
+	# check if hostname changed and reload syslog when needed
 	if hostname_changed ; then
 		# reload syslog so it knows the new hostname
 		/etc/init.d/syslog reload
 	fi
 
-	$debug && $log_dbg "Running ifdown $INTERFACE -o dhcp"
-	ifdown $INTERFACE -o dhcp
-	$debug && $log_dbg "Running ifup $INTERFACE -o dhcp"
-	ifup $INTERFACE -o dhcp
+	$debug && $log_dbg "DHCP4 configuration of $INTERFACE is complete"
+
+	write_cached_config_data  dhcp4_state complete $INTERFACE
+	commit_cached_config_data                      $INTERFACE
 	;;
 esac
 
diff --git a/scripts/ifup-dhcp b/scripts/ifup-dhcp
index f2f0a3a..cad54ae 100755
--- a/scripts/ifup-dhcp
+++ b/scripts/ifup-dhcp
@@ -47,7 +47,7 @@ test "$DEBUG" = "EXTRA" && . scripts/extradebug
 # check arguments and how we are called (in case of links)
 #
 SCRIPTNAME=${0##*/}
-debug $*
+debug "$SCRIPTNAME $*"
 
 case "${SCRIPTNAME}" in
 	ifup-*) ACTION=start ;;
@@ -555,7 +555,7 @@ case "$ACTION" in
 
 			# remember the hostname to handle a change later
 			write_cached_config_data hostname "`hostname 2>/dev/null`" $INTERFACE
-			commit_cached_config_data $INTERFACE
+			commit_cached_config_data                                  $INTERFACE
 
 			debug "Activating interface $INTERFACE"
 			if ! is_iface_up $INTERFACE ; then
@@ -590,14 +590,19 @@ case "$ACTION" in
 					case "$DHCLIENT" in
 					(dhcpcd)
 						test -n "$DHCP4_STATUS" || {
-							start_dhcp4_dhcpcd
-							DHCP4_STARTED="yes"
+							start_dhcp4_dhcpcd && {
+								DHCP4_STARTED="yes"
+								write_cached_config_data dhcp4_client $DHCLIENT  $INTERFACE
+								write_cached_config_data dhcp4_state  started    $INTERFACE
+								commit_cached_config_data                        $INTERFACE
+							} || DHCP4_STATUS=$?
 						}
 					;;
 					(dhclient)
 						test -n "$DHCP4_STATUS" || {
-							start_dhcp4_dhclient
-							DHCP4_STARTED="yes"
+							start_dhcp4_dhclient && {
+								DHCP4_STARTED="yes"
+							} || DHCP4_STATUS=$?
 						}
 					;;
 					esac
@@ -606,8 +611,9 @@ case "$ACTION" in
 					case "$DHCLIENT6" in
 					(dhcp6c)
 						test -n "$DHCP6_STATUS" || {
-							start_dhcp6_dhcp6c
-							DHCP6_STARTED="yes"
+							start_dhcp6_dhcp6c && {
+								DHCP6_STARTED="yes"
+							} || DHCP6_STATUS=$?
 						}
 					;;
 					#(dhclient)
@@ -620,8 +626,9 @@ case "$ACTION" in
 				;;
 				esac
 			done
+			### FIXME
 			# don't hurry too much...
-			[ "x$DHCP6_STARTED" = xyes -o "x$DHCP4_STARTED" = xyes ] && sleep 1
+			###[ "x$DHCP6_STARTED" = xyes -o "x$DHCP4_STARTED" = xyes ] && sleep 1
 
 			#
 			# in case we've started at least one client, wait the specified
@@ -630,9 +637,7 @@ case "$ACTION" in
 			DHCP4_MESSAGE=''
 			DHCP6_MESSAGE=''
 
-			#
-			# TODO: does one the actual clients still exit on infinite lease??
-			#       (dhcpcd does not do this any more)
+			typeset -i wusleep=100000
 			typeset -i wab_max=${DHCLIENT_WAIT_AT_BOOT:-15};
 			let wab_max\*=10
 			for ((wab_cnt=0; wab_cnt<=wab_max; wab_cnt++)); do
@@ -652,7 +657,8 @@ case "$ACTION" in
 							fi
 							[ -n "$DHCP4_STATUS" ] && continue
 
-							if [ -e $info -a ! $info -ot $stamp ]; then
+							state=`read_cached_config_data dhcp4_state $INTERFACE`
+							if [ "x$state" = "xcomplete" -a -e $info -a ! $info -ot $stamp ]; then
 								IP='' ; NM='' ; HN=''
 								while read line ; do
 									case "$line" in
@@ -730,7 +736,10 @@ case "$ACTION" in
 				done
 				if [ -z "$DHCP4_STATUS" -o -z "$DHCP6_STATUS" ] ; then
 					((wab_cnt % 20 == 1)) && message_n .\ 
-					usleep 100000
+					usleep $wusleep
+				else
+					# ok, we have status from both clients now => done
+					break
 				fi
 			done
 			message " "
@@ -962,8 +971,10 @@ case "$ACTION" in
 			#if [ $STATUS -eq $R_SUCCESS ] ; then
 
 			# delete primary flag from cache file if needed
-			delete_from_cached_config_data primary yes $INTERFACE
-			commit_cached_config_data $INTERFACE
+			delete_from_cached_config_data primary yes  $INTERFACE
+			delete_from_cached_config_data 'dhcp4_*' '' $INTERFACE
+			delete_from_cached_config_data 'dhcp6_*' '' $INTERFACE
+			commit_cached_config_data                   $INTERFACE
 
 			# This is useful for pcmcia interfaces... before the modules can be
 			# unloaded, the device must be unused.
@@ -996,7 +1007,9 @@ case "$ACTION" in
 						stamp=/var/lib/dhcpcd/dhcpcd-$INTERFACE.timestamp
 						info=/var/lib/dhcpcd/dhcpcd-$INTERFACE.info
 
-						if [ \( -e $info -a ! $info -ot $stamp \) -a -n \
+						state=`read_cached_config_data dhcp4_state $INTERFACE`
+						if [ "x$state" = "xcomplete" -a \
+						     \( -e $info -a ! $info -ot $stamp \) -a -n \
 						     "`ip -o -f inet addr show $INTERFACE`" ]; then
 							while read line ; do
 								case "$line" in
-- 
1.6.4.2
openSUSE Build Service is sponsored by