Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
e74116c
commit 82dc678
Showing
9 changed files
with
931 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
#!/bin/sh | ||
|
||
# /bin/sh on Solaris is not a POSIX compatible shell, but /usr/bin/ksh is. | ||
if [ `uname -s` = 'SunOS' -a "${POSIX_SHELL}" != "true" ]; then | ||
POSIX_SHELL="true" | ||
export POSIX_SHELL | ||
exec /usr/bin/ksh $0 "$@" | ||
fi | ||
|
||
# clear it so if we invoke other scripts, they run as ksh as well | ||
unset POSIX_SHELL | ||
|
||
## This script replaces the default "erl" in erts-VSN/bin. This is | ||
## necessary as escript depends on erl and in turn, erl depends on | ||
## having access to a bootscript (start.boot). Note that this script | ||
## is ONLY invoked as a side-effect of running escript -- the embedded | ||
## node bypasses erl and uses erlexec directly (as it should). | ||
## | ||
## Note that this script makes the assumption that there is a | ||
## start_clean.boot file available in $ROOTDIR/release/VSN. | ||
|
||
# Determine the abspath of where this script is executing from. | ||
ERTS_BIN_DIR=$(cd ${0%/*} && pwd -P) | ||
|
||
# Now determine the root directory -- this script runs from erts-VSN/bin, | ||
# so we simply need to strip off two dirs from the end of the ERTS_BIN_DIR | ||
# path. | ||
ROOTDIR=${ERTS_BIN_DIR%/*/*} | ||
|
||
# Parse out release and erts info | ||
START_ERL=`cat $ROOTDIR/releases/start_erl.data` | ||
ERTS_VSN=${START_ERL% *} | ||
APP_VSN=${START_ERL#* } | ||
|
||
BINDIR=$ROOTDIR/erts-$ERTS_VSN/bin | ||
EMU=beam | ||
PROGNAME=`echo $0 | sed 's/.*\\///'` | ||
CMD="$BINDIR/erlexec" | ||
export EMU | ||
export ROOTDIR | ||
export BINDIR | ||
export PROGNAME | ||
|
||
exec $CMD -boot $ROOTDIR/releases/$APP_VSN/start_clean ${1+"$@"} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
#!/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()])). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,201 @@ | ||
#!/usr/bin/env escript | ||
%% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*- | ||
%% ex: ft=erlang ts=4 sw=4 et | ||
%% ------------------------------------------------------------------- | ||
%% | ||
%% nodetool: Helper Script for interacting with live nodes | ||
%% | ||
%% ------------------------------------------------------------------- | ||
main(Args) -> | ||
ok = start_epmd(), | ||
%% Extract the args | ||
{RestArgs, TargetNode} = process_args(Args, [], undefined), | ||
|
||
%% any commands that don't need a running node | ||
case RestArgs of | ||
["chkconfig", File] -> | ||
case file:consult(File) of | ||
{ok, _} -> | ||
io:format("ok\n"), | ||
halt(0); | ||
{error, {Line, Mod, Term}} -> | ||
io:format(standard_error, ["Error on line ", | ||
file:format_error({Line, Mod, Term}), "\n"], []), | ||
halt(1); | ||
{error, R} -> | ||
io:format(standard_error, ["Error reading config file: ", | ||
file:format_error(R), "\n"], []), | ||
halt(1) | ||
end; | ||
_ -> | ||
ok | ||
end, | ||
|
||
%% See if the node is currently running -- if it's not, we'll bail | ||
case {net_kernel:hidden_connect_node(TargetNode), | ||
net_adm:ping(TargetNode)} of | ||
{true, pong} -> | ||
ok; | ||
{false,pong} -> | ||
io:format("Failed to connect to node ~p .\n", [TargetNode]), | ||
halt(1); | ||
{_, pang} -> | ||
io:format("Node ~p not responding to pings.\n", [TargetNode]), | ||
halt(1) | ||
end, | ||
|
||
case RestArgs of | ||
["getpid"] -> | ||
io:format("~p\n", | ||
[list_to_integer(rpc:call(TargetNode, os, getpid, []))]); | ||
["ping"] -> | ||
%% If we got this far, the node already responsed to a | ||
%% ping, so just dump a "pong" | ||
io:format("pong\n"); | ||
["stop"] -> | ||
io:format("~p\n", [rpc:call(TargetNode, init, stop, [], 60000)]); | ||
["restart"] -> | ||
io:format("~p\n", [rpc:call(TargetNode, init, restart, [], 60000)]); | ||
["reboot"] -> | ||
io:format("~p\n", [rpc:call(TargetNode, init, reboot, [], 60000)]); | ||
["rpc", Module, Function | RpcArgs] -> | ||
case rpc:call(TargetNode, | ||
list_to_atom(Module), | ||
list_to_atom(Function), | ||
[RpcArgs], 60000) of | ||
ok -> | ||
ok; | ||
{badrpc, Reason} -> | ||
io:format("RPC to ~p failed: ~p\n", [TargetNode, Reason]), | ||
halt(1); | ||
_ -> | ||
halt(1) | ||
end; | ||
["rpc_infinity", Module, Function | RpcArgs] -> | ||
case rpc:call(TargetNode, | ||
list_to_atom(Module), | ||
list_to_atom(Function), | ||
[RpcArgs], infinity) of | ||
ok -> | ||
ok; | ||
{badrpc, Reason} -> | ||
io:format("RPC to ~p failed: ~p\n", [TargetNode, Reason]), | ||
halt(1); | ||
_ -> | ||
halt(1) | ||
end; | ||
["rpcterms", Module, Function, ArgsAsString] -> | ||
case rpc:call(TargetNode, | ||
list_to_atom(Module), | ||
list_to_atom(Function), | ||
consult(ArgsAsString), 60000) of | ||
{badrpc, Reason} -> | ||
io:format("RPC to ~p failed: ~p\n", [TargetNode, Reason]), | ||
halt(1); | ||
Other -> | ||
io:format("~p\n", [Other]) | ||
end; | ||
["eval", Str0] -> | ||
Str = string:strip(Str0, right, $.) ++ ".", | ||
Bindings = erl_eval:new_bindings(), | ||
case rpc:call(TargetNode, | ||
erl_eval, | ||
exprs, | ||
[parse(Str), Bindings], | ||
60000) of | ||
{badrpc, Reason} -> | ||
io:format("RPC to ~p failed: ~p\n", [TargetNode, Reason]), | ||
halt(1); | ||
{value, Value, _Bindings} -> | ||
io:format("~p\n", [Value]) | ||
end; | ||
Other -> | ||
io:format("Other: ~p\n", [Other]), | ||
io:format("Usage: nodetool {chkconfig|getpid|ping|stop|restart|reboot|rpc|rpc_infinity|rpcterms|eval}\n") | ||
end, | ||
net_kernel:stop(). | ||
|
||
process_args([], Acc, TargetNode) -> | ||
{lists:reverse(Acc), TargetNode}; | ||
process_args(["-setcookie", Cookie | Rest], Acc, TargetNode) -> | ||
erlang:set_cookie(node(), list_to_atom(Cookie)), | ||
process_args(Rest, Acc, TargetNode); | ||
process_args(["-name", TargetName | Rest], Acc, _) -> | ||
ThisNode = append_node_suffix(TargetName, "_maint_"), | ||
{ok, _} = net_kernel:start([ThisNode, longnames]), | ||
process_args(Rest, Acc, nodename(TargetName)); | ||
process_args(["-sname", TargetName | Rest], Acc, _) -> | ||
ThisNode = append_node_suffix(TargetName, "_maint_"), | ||
{ok, _} = net_kernel:start([ThisNode, shortnames]), | ||
process_args(Rest, Acc, nodename(TargetName)); | ||
process_args([Arg | Rest], Acc, Opts) -> | ||
process_args(Rest, [Arg | Acc], Opts). | ||
|
||
|
||
start_epmd() -> | ||
[] = os:cmd(epmd_path() ++ " -daemon"), | ||
ok. | ||
|
||
epmd_path() -> | ||
ErtsBinDir = filename:dirname(escript:script_name()), | ||
Name = "epmd", | ||
case os:find_executable(Name, ErtsBinDir) of | ||
false -> | ||
case os:find_executable(Name) of | ||
false -> | ||
io:format("Could not find epmd.~n"), | ||
halt(1); | ||
GlobalEpmd -> | ||
GlobalEpmd | ||
end; | ||
Epmd -> | ||
Epmd | ||
end. | ||
|
||
|
||
nodename(Name) -> | ||
case string:tokens(Name, "@") of | ||
[_Node, _Host] -> | ||
list_to_atom(Name); | ||
[Node] -> | ||
[_, Host] = string:tokens(atom_to_list(node()), "@"), | ||
list_to_atom(lists:concat([Node, "@", Host])) | ||
end. | ||
|
||
append_node_suffix(Name, Suffix) -> | ||
case string:tokens(Name, "@") of | ||
[Node, Host] -> | ||
list_to_atom(lists:concat([Node, Suffix, os:getpid(), "@", Host])); | ||
[Node] -> | ||
list_to_atom(lists:concat([Node, Suffix, os:getpid()])) | ||
end. | ||
|
||
|
||
%% | ||
%% Given a string or binary, parse it into a list of terms, ala file:consult/0 | ||
%% | ||
consult(Str) when is_list(Str) -> | ||
consult([], Str, []); | ||
consult(Bin) when is_binary(Bin)-> | ||
consult([], binary_to_list(Bin), []). | ||
|
||
consult(Cont, Str, Acc) -> | ||
case erl_scan:tokens(Cont, Str, 0) of | ||
{done, Result, Remaining} -> | ||
case Result of | ||
{ok, Tokens, _} -> | ||
{ok, Term} = erl_parse:parse_term(Tokens), | ||
consult([], Remaining, [Term | Acc]); | ||
{eof, _Other} -> | ||
lists:reverse(Acc); | ||
{error, Info, _} -> | ||
{error, Info} | ||
end; | ||
{more, Cont1} -> | ||
consult(Cont1, eof, Acc) | ||
end. | ||
|
||
parse(Str) -> | ||
{ok, Tokens, _} = erl_scan:string(Str), | ||
{ok, Exprs} = erl_parse:parse_exprs(Tokens), | ||
Exprs. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
@setlocal | ||
|
||
@rem Parse arguments. erlsrv.exe prepends erl arguments prior to first ++. | ||
@rem Other args are position dependent. | ||
@set args="%*" | ||
@for /F "delims=++ tokens=1,2,3" %%I in (%args%) do @( | ||
@set erl_args=%%I | ||
@call :set_trim node_name %%J | ||
@rem Trim spaces from the left of %%K (node_root), which may have spaces inside | ||
@for /f "tokens=* delims= " %%a in ("%%K") do @set node_root=%%a | ||
) | ||
|
||
@set releases_dir=%node_root%\releases | ||
|
||
@rem parse ERTS version and release version from start_erl.dat | ||
@for /F "usebackq tokens=1,2" %%I in ("%releases_dir%\start_erl.data") do @( | ||
@call :set_trim erts_version %%I | ||
@call :set_trim release_version %%J | ||
) | ||
|
||
@set erl_exe="%node_root%\erts-%erts_version%\bin\erl.exe" | ||
@set boot_file="%releases_dir%\%release_version%\%node_name%" | ||
|
||
@if exist "%releases_dir%\%release_version%\sys.config" ( | ||
@set app_config="%releases_dir%\%release_version%\sys.config" | ||
) else ( | ||
@set app_config="%node_root%\etc\app.config" | ||
) | ||
|
||
@if exist "%releases_dir%\%release_version%\vm.args" ( | ||
@set vm_args="%releases_dir%\%release_version%\vm.args" | ||
) else ( | ||
@set vm_args="%node_root%\etc\vm.args" | ||
) | ||
|
||
@%erl_exe% %erl_args% -boot %boot_file% -config %app_config% -args_file %vm_args% | ||
|
||
:set_trim | ||
@set %1=%2 | ||
@goto :EOF |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
[ | ||
%% SASL config | ||
{sasl, [ | ||
{sasl_error_logger, {file, "log/sasl-error.log"}}, | ||
{errlog_type, error}, | ||
{error_logger_mf_dir, "log/sasl"}, % Log directory | ||
{error_logger_mf_maxbytes, 10485760}, % 10 MB max file size | ||
{error_logger_mf_maxfiles, 5} % 5 files max | ||
]} | ||
]. | ||
|
Oops, something went wrong.