mirror of
https://github.com/correl/rebar.git
synced 2024-11-27 11:09:55 +00:00
0a1961fb0d
Implemented, by moving upgrade functionality from install_upgrade.escript to nodetool, which already supports both short and long names. Make install_upgrade.escript as wrapper for nodetool for backward compatibility.
55 lines
1.9 KiB
Erlang
55 lines
1.9 KiB
Erlang
#!/usr/bin/env escript
|
|
%%! -noshell -noinput
|
|
%% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*-
|
|
%% ex: ft=erlang ts=4 sw=4 et
|
|
%% This file is left for backward-compatibility.
|
|
%% You, probably, shouldn't include it to new projects.
|
|
|
|
|
|
main([NodeName, Cookie, ReleasePackage]) ->
|
|
io:format("WARNING: 'install_upgrade.escript' is deprecated! "
|
|
"Use 'nodetool upgrade' instead.~n"),
|
|
NodeRoot = filename:dirname(filename:dirname(escript:script_name())),
|
|
NodeTool = which_nodetool(NodeRoot),
|
|
process_flag(trap_exit, true),
|
|
Port = erlang:open_port(
|
|
{spawn_executable, NodeTool},
|
|
[{args, ["-sname", NodeName,
|
|
"-setcookie", Cookie,
|
|
"upgrade", ReleasePackage]},
|
|
binary, exit_status, use_stdio, stderr_to_stdout, hide]),
|
|
port_loop(Port);
|
|
main(_) ->
|
|
halt(1).
|
|
|
|
|
|
which_nodetool(NodeRoot) ->
|
|
%% ${RELEASE_ROOT}/
|
|
%% bin/install_upgrade.escript
|
|
%% bin/nodetool ?
|
|
%% erts-<erts_ver>/bin/nodetool ?
|
|
%% releases/<app_ver>/nodetool ?
|
|
%% releases/start_erl.data
|
|
{ok, Content} = file:read_file(filename:join([NodeRoot, "releases", "start_erl.data"])),
|
|
[ErtsVsn, AppVsn] = binary:split(Content, <<" ">>),
|
|
Probes = [
|
|
filename:join([NodeRoot, "bin", "nodetool"]),
|
|
filename:join([NodeRoot, <<"erts-", ErtsVsn/binary>>, "bin", "nodetool"]),
|
|
filename:join([NodeRoot, "releases", AppVsn, "bin", "nodetool"])
|
|
],
|
|
case lists:dropwhile(fun(Path) -> not filelib:is_regular(Path) end, Probes) of
|
|
[] ->
|
|
io:format("ERROR: can't find 'nodetool' in ~p.~n", [Probes]),
|
|
halt(2);
|
|
[Path | _] ->
|
|
Path
|
|
end.
|
|
|
|
port_loop(Port) ->
|
|
receive
|
|
{Port, {data, Data}} ->
|
|
io:put_chars(Data),
|
|
port_loop(Port);
|
|
{Port, {exit_status, Status}} ->
|
|
halt(Status)
|
|
end.
|