| #!/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)). |
| |
| %% 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 |
| |
| 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()])). |