Blame SOURCES/bz1744467-rabbitmq-cluster-restore-users-single-node-mode.patch

011c77
From c0b6356bbf5b9a1fb76b011486dfce258d395ef8 Mon Sep 17 00:00:00 2001
011c77
From: Peter Lemenkov <lemenkov@gmail.com>
011c77
Date: Fri, 6 Sep 2019 14:22:46 +0200
011c77
Subject: [PATCH] Restore users/perms/policies even if starting in a single
011c77
 node mode
011c77
011c77
See https://bugzilla.redhat.com/1744467#c1
011c77
011c77
Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
011c77
---
011c77
 heartbeat/rabbitmq-cluster | 109 ++++++++++++++++++++-----------------
011c77
 1 file changed, 58 insertions(+), 51 deletions(-)
011c77
011c77
diff --git a/heartbeat/rabbitmq-cluster b/heartbeat/rabbitmq-cluster
011c77
index cf8ca21a6..7837e9e3c 100755
011c77
--- a/heartbeat/rabbitmq-cluster
011c77
+++ b/heartbeat/rabbitmq-cluster
011c77
@@ -114,6 +114,62 @@ rmq_wipe_data()
011c77
 	rm -rf $RMQ_DATA_DIR > /dev/null 2>&1 
011c77
 }
011c77
 
011c77
+rmq_restore_users_perms_policies()
011c77
+{
011c77
+	# Restore users, user permissions, and policies (if any)
011c77
+	BaseDataDir=`dirname $RMQ_DATA_DIR`
011c77
+	$RMQ_EVAL "
011c77
+		%% Run only if Mnesia is ready.
011c77
+		lists:any(fun({mnesia,_,_}) -> true; ({_,_,_}) -> false end, application:which_applications()) andalso
011c77
+		begin
011c77
+			Restore = fun(Table, PostprocessFun, Filename) ->
011c77
+				case file:consult(Filename) of
011c77
+					{error, _} ->
011c77
+						ok;
011c77
+					{ok, [Result]} ->
011c77
+						lists:foreach(fun(X) -> mnesia:dirty_write(Table, PostprocessFun(X)) end, Result),
011c77
+						file:delete(Filename)
011c77
+				end
011c77
+			end,
011c77
+
011c77
+			%% Restore users
011c77
+
011c77
+			Upgrade = fun
011c77
+				({internal_user, A, B, C}) -> {internal_user, A, B, C, rabbit_password_hashing_md5};
011c77
+				({internal_user, A, B, C, D}) -> {internal_user, A, B, C, D}
011c77
+			end,
011c77
+
011c77
+			Downgrade = fun
011c77
+				({internal_user, A, B, C}) -> {internal_user, A, B, C};
011c77
+				({internal_user, A, B, C, rabbit_password_hashing_md5}) -> {internal_user, A, B, C};
011c77
+				%% Incompatible scheme, so we will loose user's password ('B' value) during conversion.
011c77
+				%% Unfortunately, this case will require manual intervention - user have to run:
011c77
+				%%    rabbitmqctl change_password  <somenewpassword>
011c77
+				({internal_user, A, B, C, _}) -> {internal_user, A, B, C}
011c77
+			end,
011c77
+
011c77
+			%% Check db scheme first
011c77
+			[WildPattern] = ets:select(mnesia_gvar, [ { {{rabbit_user, wild_pattern}, '\\\$1'}, [], ['\\\$1'] } ]),
011c77
+			case WildPattern of
011c77
+				%% Version < 3.6.0
011c77
+				{internal_user,'_','_','_'} ->
011c77
+					Restore(rabbit_user, Downgrade, \"$BaseDataDir/users.erl\");
011c77
+				%% Version >= 3.6.0
011c77
+				{internal_user,'_','_','_','_'} ->
011c77
+					Restore(rabbit_user, Upgrade, \"$BaseDataDir/users.erl\")
011c77
+			end,
011c77
+
011c77
+			NoOp = fun(X) -> X end,
011c77
+
011c77
+			%% Restore user permissions
011c77
+			Restore(rabbit_user_permission, NoOp, \"$BaseDataDir/users_perms.erl\"),
011c77
+
011c77
+			%% Restore policies
011c77
+			Restore(rabbit_runtime_parameters, NoOp, \"$BaseDataDir/policies.erl\")
011c77
+		end.
011c77
+	"
011c77
+}
011c77
+
011c77
 rmq_local_node()
011c77
 {
011c77
 
011c77
@@ -411,6 +467,7 @@ rmq_try_start() {
011c77
 	if [ -z "$join_list" ]; then
011c77
 		rmq_start_first
011c77
 		rc=$?
011c77
+		rmq_restore_users_perms_policies
011c77
 		return $rc
011c77
 	fi
011c77
 
011c77
@@ -437,58 +494,8 @@ rmq_try_start() {
011c77
 		return $RMQ_TRY_RESTART_ERROR_CODE
011c77
 	fi
011c77
 
011c77
-	# Restore users, user permissions, and policies (if any)
011c77
-	BaseDataDir=`dirname $RMQ_DATA_DIR`
011c77
-	$RMQ_EVAL "
011c77
-		%% Run only if Mnesia is ready.
011c77
-		lists:any(fun({mnesia,_,_}) -> true; ({_,_,_}) -> false end, application:which_applications()) andalso
011c77
-		begin
011c77
-			Restore = fun(Table, PostprocessFun, Filename) ->
011c77
-				case file:consult(Filename) of
011c77
-					{error, _} ->
011c77
-						ok;
011c77
-					{ok, [Result]} ->
011c77
-						lists:foreach(fun(X) -> mnesia:dirty_write(Table, PostprocessFun(X)) end, Result),
011c77
-						file:delete(Filename)
011c77
-				end
011c77
-			end,
011c77
+	rmq_restore_users_perms_policies
011c77
 
011c77
-			%% Restore users
011c77
-
011c77
-			Upgrade = fun
011c77
-				({internal_user, A, B, C}) -> {internal_user, A, B, C, rabbit_password_hashing_md5};
011c77
-				({internal_user, A, B, C, D}) -> {internal_user, A, B, C, D}
011c77
-			end,
011c77
-
011c77
-			Downgrade = fun
011c77
-				({internal_user, A, B, C}) -> {internal_user, A, B, C};
011c77
-				({internal_user, A, B, C, rabbit_password_hashing_md5}) -> {internal_user, A, B, C};
011c77
-				%% Incompatible scheme, so we will loose user's password ('B' value) during conversion.
011c77
-				%% Unfortunately, this case will require manual intervention - user have to run:
011c77
-				%%    rabbitmqctl change_password  <somenewpassword>
011c77
-				({internal_user, A, B, C, _}) -> {internal_user, A, B, C}
011c77
-			end,
011c77
-
011c77
-			%% Check db scheme first
011c77
-			[WildPattern] = ets:select(mnesia_gvar, [ { {{rabbit_user, wild_pattern}, '\\\$1'}, [], ['\\\$1'] } ]),
011c77
-			case WildPattern of
011c77
-				%% Version < 3.6.0
011c77
-				{internal_user,'_','_','_'} ->
011c77
-					Restore(rabbit_user, Downgrade, \"$BaseDataDir/users.erl\");
011c77
-				%% Version >= 3.6.0
011c77
-				{internal_user,'_','_','_','_'} ->
011c77
-					Restore(rabbit_user, Upgrade, \"$BaseDataDir/users.erl\")
011c77
-			end,
011c77
-
011c77
-			NoOp = fun(X) -> X end,
011c77
-
011c77
-			%% Restore user permissions
011c77
-			Restore(rabbit_user_permission, NoOp, \"$BaseDataDir/users_perms.erl\"),
011c77
-
011c77
-			%% Restore policies
011c77
-			Restore(rabbit_runtime_parameters, NoOp, \"$BaseDataDir/policies.erl\")
011c77
-		end.
011c77
-	"
011c77
 	return $OCF_SUCCESS
011c77
 }
011c77