[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#316321: revisiting the "reload target" issue



severity 316321 serious
tags 316321 patch
thanks

hi,

revisiting this issue, and after having spoken with folks
on -devel and -policy, the consensus is that this is in
fact a policy violation, so i am changing the severity
appropriately.

but, because doing so merely to do so wouldn't be so
constructive, i've also patched the init script to
behave appropriately.  i've attempted to keep the
patch as clean as possible... and have taken
code that would otherwise be duplicated and
placed them in common functions (apache_get_pid and 
apache_kill).  

here's some sample output of the new behavior:

mini-me[~]17:34:55$ sudo /etc/init.d/apache2 start
Starting apache 2.0 web server....
mini-me[~]17:35:00$ sudo /etc/init.d/apache2 reload
Reloading apache 2.0 configuration....
mini-me[~]17:35:05$ sudo /etc/init.d/apache2 stop  
Stopping apache 2.0 web server....
mini-me[~]17:35:12$ sudo /etc/init.d/apache2 reload
Reloading apache 2.0 configuration... no pidfile, not sending signal.  failed!


thanks,
	sean

-- 
--- /etc/init.d/apache2.old	2006-01-26 16:53:24.000000000 +0100
+++ /etc/init.d/apache2	2006-01-26 17:24:54.000000000 +0100
@@ -27,9 +27,8 @@
 APACHE2="$ENV /usr/sbin/apache2"
 APACHE2CTL="$ENV /usr/sbin/apache2ctl"
 
-apache_stop() {
-	PID=""
-	PIDFILE=""
+# find and echo the PID if it exists in the PIDFILE
+apache_get_pid(){
 	AP_CONF=/etc/apache2/apache2.conf
 
 	# apache2 allows more than PidFile entry in the config but only the
@@ -39,45 +38,26 @@
 	for i in $AP_CONF `awk '$1 ~ /^\s*[Ii]nclude$/ && $2 ~ /^\// {print $2}' $AP_CONF`; do
 		PIDFILE=`grep -i ^PidFile $i | tail -n 1 | awk '{print $2}'`
 		if [ -e "$PIDFILE" ]; then
-			PID=`cat $PIDFILE`
+			cat $PIDFILE
 		fi
 	done
-	
-	if `$APACHE2 -t > /dev/null 2>&1`; then
-		# if the config is ok than we just stop normaly
-
-		if [ -n "$PID" ]
-		then
-			$APACHE2CTL stop
-
-			CNT=0
-			while [ 1 ]
-			do
-				CNT=$(expr $CNT + 1)
-		
-				[ ! -d /proc/$PID ] && break
+}
 
-				if [ $CNT -gt 60 ]
-				then
-					if [ "$VERBOSE" != "no" ]; then
-						echo " ... failed!"
-						echo "Apache2 failed to honor the stop command, please investigate the situation by hand."
-					fi
-					return 1
-				fi
+# send a signal (optionally $1) to the apache server if possible
+apache_kill(){
+		PID=`apache_get_pid`
+		if [ "$1" ]; then
+			SIGNAL="-$1"
+		fi
 
-				sleep 1
-			done
-		else
+		# if there's no pid, then stop now
+		if [ ! "$PID" ]; then
 			if [ "$VERBOSE" != "no" ]; then
-				echo -n " ... no pidfile found! not running?"
+				echo -n " no pidfile, not sending signal."
 			fi
+			return 1
 		fi
 
-	else
-		# if we are here something is broken and we need to try
-		# to exit as nice and clean as possible
-
 		# if pidof is null for some reasons the script exits automagically
 		# classified as good/unknown feature
 		PIDS=`pidof apache2` || true
@@ -97,7 +77,7 @@
 		if [ $REALPID = 1 ]; then
 			# in this case everything is nice and dandy
 			# and we kill apache2
-			kill $PID
+			kill $SIGNAL $PID
 		else
 			# this is the worst situation... just kill all of them
 			#for i in $PIDS; do
@@ -105,17 +85,74 @@
 			#done
 			# Except, we can't do that, because it's very, very bad
 			if [ "$VERBOSE" != "no" ]; then
-                                echo " ... failed!"
+			        echo " ... failed!"
 			        echo "You may still have some apache2 processes running.  There are"
  			        echo "processes named 'apache2' which do not match your pid file,"
 			        echo "and in the name of safety, we've left them alone.  Please review"
 			        echo "the situation by hand."
-                        fi
-                        return 1
+			fi
+			return 1
+		fi
+}
+
+apache_stop() {
+	PID=""
+	PIDFILE=""
+	AP_CONF=/etc/apache2/apache2.conf
+
+	PID=`apache_get_pid`
+	
+	if `$APACHE2 -t > /dev/null 2>&1`; then
+		# if the config is ok than we just stop normaly
+
+		if [ -n "$PID" ]
+		then
+			$APACHE2CTL stop
+
+			CNT=0
+			while [ 1 ]
+			do
+				CNT=$(expr $CNT + 1)
+		
+				[ ! -d /proc/$PID ] && break
+
+				if [ $CNT -gt 60 ]
+				then
+					if [ "$VERBOSE" != "no" ]; then
+						echo " ... failed!"
+						echo "Apache2 failed to honor the stop command, please investigate the situation by hand."
+					fi
+					return 1
+				fi
+
+				sleep 1
+			done
 		fi
+
+	else
+		# if we are here something is broken and we need to try
+		# to exit as nice and clean as possible
+		apache_kill
 	fi
 }
 
+# this function will reload the apache2 server if running, otherwise nothing
+apache_reload() {
+	PID=`apache_get_pid`
+
+	$APACHE2 $EXTRA -t >/dev/null 2>&1
+	if [ ! $? = 0 ]; then
+		# echo so the error message starts on a new line
+		echo
+		$APACHE2 $EXTRA -t
+		return 1
+	else
+		apache_kill HUP
+		return $?
+	fi
+}
+
+
 # Stupid hack to keep lintian happy. (Warrk! Stupidhack!).
 case $1 in
 	start)
@@ -139,7 +176,7 @@
 	;;
 	reload)
 		log_begin_msg "Reloading apache 2.0 configuration..."
-		if $APACHE2CTL graceful $2 ; then
+		if apache_reload; then
                         log_end_msg 0
                 else
                         log_end_msg 1

Attachment: signature.asc
Description: Digital signature


Reply to: