File ec2-3.patch of Package cluster-glue.8576

commit 76138dfb642cae548f2aa48c0a9caaa16509b319
Author: Kristoffer Grönlund <krig@koru.se>
Date:   Wed Apr 11 10:19:00 2018 +0200

    Medium: external/ec2: Mitigate fence race (bsc#1088656)
    
    Minimize risk of fence race by performing instance status check
    after instance_for_port lookup.

diff --git a/lib/plugins/stonith/external/ec2 b/lib/plugins/stonith/external/ec2
index 7ff4b512..8e6798a1 100755
--- a/lib/plugins/stonith/external/ec2
+++ b/lib/plugins/stonith/external/ec2
@@ -170,6 +170,33 @@ EOF
 	exit 0;
 }
 
+function is_instance_running()
+{
+	local myinstance
+	local mystatus
+
+	# get my instance id
+	myinstance="$(curl http://169.254.169.254/latest/meta-data/instance-id)"
+
+	# check my status.
+	# When the EC2 instance be stopped by the "aws ec2 stop-instances" , the stop processing of the OS is executed.
+	# While the OS stop processing, Pacemaker can execute the STONITH processing.
+	# So, If my status is not "running", it determined that I was already fenced. And to prevent fencing each other
+	# in split-brain, I don't fence other node.
+	if [ -z "$myinstance" ]; then
+		ha_log.sh err "Failed to get Instance ID. Unable to check instance status."
+		return 1
+	fi
+
+	mystatus="$(instance_status $myinstance)"
+
+	if [ "$mystatus" != "running" ]; then #do not fence
+		ha_log.sh warn "Already fenced (Instance status = $mystatus). Aborting fence attempt."
+		return 1
+	fi
+	return 0
+}
+
 function instance_for_port()
 {
 	local port=$1
@@ -312,24 +339,6 @@ case $action in
 	;;
 esac
 
-# get my instance id
-myinstance=`curl http://169.254.169.254/latest/meta-data/instance-id`
-
-# check my status.
-# When the EC2 instance be stopped by the "aws ec2 stop-instances" , the stop processing of the OS is executed.
-# While the OS stop processing, Pacemaker can execute the STONITH processing.
-# So, If my status is not "running", it determined that I was already fenced. And to prevent fencing each other
-# in split-brain, I don't fence other node.
-if [ -z "$myinstance" ]; then
-	ha_log.sh err "Failed to get My Instance ID. so can not check my status."
-	exit 1
-fi
-mystatus=`instance_status $myinstance`
-if [ "$mystatus" != "running" ]; then #do not fence
-	ha_log.sh warn "I was already fenced (My instance status=$mystatus). I don't fence other node."
-	exit 1
-fi
-
 if [ -z "$port" ]; then
 	port="$node_to_fence"
 fi
@@ -340,6 +349,8 @@ if [ ! -z "$port" ]; then
 	instance=`instance_for_port $port $options`
 fi
 
+is_instance_running || exit 1
+
 case $action in
 	reboot|reset)
 		status=`instance_status $instance`
openSUSE Build Service is sponsored by