This repository has been archived by the owner on Nov 2, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 35
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Magnus <[email protected]>
- Loading branch information
Showing
13 changed files
with
909 additions
and
11 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 |
---|---|---|
|
@@ -44,7 +44,7 @@ | |
[ | ||
{lager, | ||
[ { handlers, | ||
[{lager_console_backend, notice}] | ||
[{lager_console_backend, debug}] | ||
} | ||
] | ||
}, | ||
|
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
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
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,44 @@ | ||
#!/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)). | ||
|
||
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,182 @@ | ||
#!/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; | ||
Other -> | ||
io:format("Other: ~p\n", [Other]), | ||
io:format("Usage: nodetool {chkconfig|getpid|ping|stop|restart|reboot|rpc|rpc_infinity|rpcterms}\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. |
Oops, something went wrong.