summaryrefslogtreecommitdiff
path: root/src/rebar_dist_utils.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/rebar_dist_utils.erl')
-rw-r--r--src/rebar_dist_utils.erl36
1 files changed, 29 insertions, 7 deletions
diff --git a/src/rebar_dist_utils.erl b/src/rebar_dist_utils.erl
index f462826..5de858e 100644
--- a/src/rebar_dist_utils.erl
+++ b/src/rebar_dist_utils.erl
@@ -7,6 +7,9 @@
%%%%%%%%%%%%%%%%%%
%%% PUBLIC API %%%
%%%%%%%%%%%%%%%%%%
+
+%% @doc allows to pick whether to use a short or long name, and
+%% starts the distributed mode for it.
-spec either(Name::atom(), SName::atom(), Opts::[{setcookie,term()}]) -> atom().
either(undefined, undefined, _) ->
'nonode@nohost';
@@ -19,13 +22,19 @@ either(undefined, SName, Opts) ->
either(_, _, _) ->
?ABORT("Cannot have both short and long node names defined", []).
+%% @doc starts a node with a short name.
+-spec short(SName::atom(), Opts::[{setcookie,term()}]) -> term().
short(Name, Opts) ->
start(Name, shortnames, Opts).
+%% @doc starts a node with a long name.
+-spec long(Name::atom(), Opts::[{setcookie,term()}]) -> term().
long(Name, Opts) ->
start(Name, longnames, Opts).
--spec find_options(rebar_state:state()) -> {Long, Short, Opts} when
+%% @doc utility function to extract all distribution options
+%% from a rebar3 state tuple.
+-spec find_options(rebar_state:t()) -> {Long, Short, Opts} when
Long :: atom(),
Short :: atom(),
Opts :: [{setcookie,term()}].
@@ -42,14 +51,27 @@ find_options(State) ->
%%% PRIVATE %%%
%%%%%%%%%%%%%%%
start(Name, Type, Opts) ->
- check_epmd(net_kernel:start([Name, Type])),
+ case dist_up(net_kernel:start([Name, Type])) of
+ false ->
+ start_epmd(),
+ dist_up(net_kernel:start([Name, Type])) orelse warn_dist();
+ true ->
+ ok
+ end,
setup_cookie(Opts).
-check_epmd({error,{{shutdown, {_,net_kernel,{'EXIT',nodistribution}}},_}}) ->
- ?ERROR("Erlang Distribution failed, falling back to nonode@nohost. "
- "Verify that epmd is running and try again.",[]);
-check_epmd(_) ->
- ok.
+dist_up({error,{{shutdown,{_,net_kernel,{'EXIT',nodistribution}}},_}}) -> false;
+dist_up(_) -> true.
+
+start_epmd() ->
+ %% Indirectly boot EPMD through calling Erlang so that we don't risk
+ %% attaching it to the current proc
+ ?CONSOLE("Attempting to start epmd...", []),
+ os:cmd("erl -sname a -eval 'halt(0).'").
+
+warn_dist() ->
+ ?ERROR("Erlang Distribution failed, falling back to nonode@nohost.", []).
+
setup_cookie(Opts) ->
case {node(), proplists:get_value(setcookie, Opts, nocookie)} of