From 475e4457f8d40c40eab770f01a48c8fc1bae5718 Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Wed, 21 Dec 2022 19:45:54 +0100 Subject: [PATCH 1/2] test: support starting enterprise in docker --- scripts/start-two-nodes-in-docker.sh | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/scripts/start-two-nodes-in-docker.sh b/scripts/start-two-nodes-in-docker.sh index e0526c26f..6955ff768 100755 --- a/scripts/start-two-nodes-in-docker.sh +++ b/scripts/start-two-nodes-in-docker.sh @@ -26,6 +26,12 @@ NODE1="node1.$NET" NODE2="node2.$NET" COOKIE='this-is-a-secret' +if [ -f EMQX_ENTERPRISE ]; then + REL_DIR='emqx-ee' +else + REL_DIR='emqx' +fi + ## clean up docker rm -f "$NODE1" >/dev/null 2>&1 || true docker rm -f "$NODE2" >/dev/null 2>&1 || true @@ -33,22 +39,22 @@ docker network rm "$NET" >/dev/null 2>&1 || true docker network create "$NET" -docker run -d -t --restart=always --name "$NODE1" \ +docker run -d -it --restart=always --name "$NODE1" \ --net "$NET" \ -e EMQX_NODE_NAME="emqx@$NODE1" \ -e EMQX_NODE_COOKIE="$COOKIE" \ -e WAIT_FOR_ERLANG=60 \ -p 18083:18083 \ - -v "$PROJ_DIR"/_build/emqx/rel/emqx:/built \ + -v "$PROJ_DIR"/_build/"${REL_DIR}"/rel/emqx:/built \ "$IMAGE" sh -c 'cp -r /built /emqx && /emqx/bin/emqx console' -docker run -d -t --restart=always --name "$NODE2" \ +docker run -d -it --restart=always --name "$NODE2" \ --net "$NET" \ -e EMQX_NODE_NAME="emqx@$NODE2" \ -e EMQX_NODE_COOKIE="$COOKIE" \ -e WAIT_FOR_ERLANG=60 \ -p 18084:18083 \ - -v "$PROJ_DIR"/_build/emqx/rel/emqx:/built \ + -v "$PROJ_DIR"/_build/"${REL_DIR}"/rel/emqx:/built \ "$IMAGE" sh -c 'cp -r /built /emqx && /emqx/bin/emqx console' wait (){ From d89119725601f283ad8cc6cb5329a618bc980854 Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Wed, 21 Dec 2022 19:50:35 +0100 Subject: [PATCH 2/2] feat: add emqx_misc:safe_io_device/0 --- src/emqx_misc.erl | 29 +++++++++++++++++++++++++++++ test/emqx_misc_SUITE.erl | 3 +++ 2 files changed, 32 insertions(+) diff --git a/src/emqx_misc.erl b/src/emqx_misc.erl index 1fd1152ce..1da1180b3 100644 --- a/src/emqx_misc.erl +++ b/src/emqx_misc.erl @@ -26,6 +26,7 @@ -export([ merge_opts/2 , maybe_apply/2 , maybe_mute_rpc_log/0 + , safe_io_device/0 , compose/1 , compose/2 , run_fold/3 @@ -478,6 +479,34 @@ maybe_mute_rpc_log(Node) -> ok end. +is_group_leader_node_connected() -> + GLNode = node(group_leader()), + case atom_to_list(GLNode) of + "remsh" ++ _ -> + {ok, Nodes} = net_kernel:nodes_info(), + lists:keymember(GLNode, 1, Nodes); + _ -> + %% for a non-remsh node + %% as long as the group leader is showing up + %% it should be connected + true + end. + +%% @doc Return 'standard_io' or 'standard_error' io device depending on the +%% current group leader node. +%% EMQX nodes do not use EPMD, there is no way for a EMQX node to connect to +%% a remsh node which is not directly connected already. +%% In this case, io:format may fail with {io,terminated} exception. +%% For io:format calls which can be evaluated from RPC calls, call this +%% function to get a safe io device. +safe_io_device() -> + case is_group_leader_node_connected() of + true -> + standard_io; + false -> + standard_error + end. + is_sensitive_key(token) -> true; is_sensitive_key("token") -> true; is_sensitive_key(<<"token">>) -> true; diff --git a/test/emqx_misc_SUITE.erl b/test/emqx_misc_SUITE.erl index e9dd3e132..5bf0d4974 100644 --- a/test/emqx_misc_SUITE.erl +++ b/test/emqx_misc_SUITE.erl @@ -179,3 +179,6 @@ t_pmap_exception(_) -> [{2, 3}, {3, 4}, error] ) ). + +t_safe_io_device(_) -> + ?assertEqual(standard_io, emqx_misc:safe_io_device()).