2012-01-09 22:37:44 +00:00
|
|
|
#!/usr/bin/env escript
|
|
|
|
%%! -noshell -noinput
|
|
|
|
%% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*-
|
|
|
|
%% ex: ft=erlang ts=4 sw=4 et
|
|
|
|
|
|
|
|
-define(TIMEOUT, 60000).
|
|
|
|
-define(INFO(Fmt,Args), io:format(Fmt,Args)).
|
|
|
|
|
2013-12-27 07:54:20 +00:00
|
|
|
%% TODO: This script currently does NOT support slim releases.
|
|
|
|
%% Necessary steps to upgrade a slim release are as follows:
|
|
|
|
%% 1. unpack relup archive manually
|
|
|
|
%% 2. copy releases directory and necessary libraries
|
|
|
|
%% 3. using release_hander:set_unpacked/2 .
|
|
|
|
%% For more details, see https://github.com/rebar/rebar/pull/52
|
|
|
|
%% and https://github.com/rebar/rebar/issues/202
|
|
|
|
|
2012-01-09 22:37:44 +00:00
|
|
|
main([NodeName, Cookie, ReleasePackage]) ->
|
|
|
|
TargetNode = start_distribution(NodeName, Cookie),
|
|
|
|
{ok, Vsn} = rpc:call(TargetNode, release_handler, unpack_release,
|
|
|
|
[ReleasePackage], ?TIMEOUT),
|
|
|
|
?INFO("Unpacked Release ~p~n", [Vsn]),
|
|
|
|
{ok, OtherVsn, Desc} = rpc:call(TargetNode, release_handler,
|
|
|
|
check_install_release, [Vsn], ?TIMEOUT),
|
|
|
|
{ok, OtherVsn, Desc} = rpc:call(TargetNode, release_handler,
|
|
|
|
install_release, [Vsn], ?TIMEOUT),
|
|
|
|
?INFO("Installed Release ~p~n", [Vsn]),
|
|
|
|
ok = rpc:call(TargetNode, release_handler, make_permanent, [Vsn], ?TIMEOUT),
|
|
|
|
?INFO("Made Release ~p Permanent~n", [Vsn]);
|
|
|
|
main(_) ->
|
|
|
|
init:stop(1).
|
|
|
|
|
|
|
|
start_distribution(NodeName, Cookie) ->
|
|
|
|
MyNode = make_script_node(NodeName),
|
|
|
|
{ok, _Pid} = net_kernel:start([MyNode, shortnames]),
|
|
|
|
erlang:set_cookie(node(), list_to_atom(Cookie)),
|
|
|
|
TargetNode = make_target_node(NodeName),
|
|
|
|
case {net_kernel:hidden_connect_node(TargetNode),
|
|
|
|
net_adm:ping(TargetNode)} of
|
|
|
|
{true, pong} ->
|
|
|
|
ok;
|
|
|
|
{_, pang} ->
|
|
|
|
io:format("Node ~p not responding to pings.\n", [TargetNode]),
|
|
|
|
init:stop(1)
|
|
|
|
end,
|
|
|
|
TargetNode.
|
|
|
|
|
|
|
|
make_target_node(Node) ->
|
|
|
|
[_, Host] = string:tokens(atom_to_list(node()), "@"),
|
|
|
|
list_to_atom(lists:concat([Node, "@", Host])).
|
|
|
|
|
|
|
|
make_script_node(Node) ->
|
|
|
|
list_to_atom(lists:concat([Node, "_upgrader_", os:getpid()])).
|