#!/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-/bin/nodetool ? %% releases//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.