summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/rabbit_cli.hrl10
-rw-r--r--src/rabbit_cli.erl36
2 files changed, 30 insertions, 16 deletions
diff --git a/include/rabbit_cli.hrl b/include/rabbit_cli.hrl
index 737bb4ea3d..e49adf5b5a 100644
--- a/include/rabbit_cli.hrl
+++ b/include/rabbit_cli.hrl
@@ -48,3 +48,13 @@
-define(ONLINE_DEF, {?ONLINE_OPT, flag}).
-define(RPC_TIMEOUT, infinity).
+
+%% Subset of standartized exit codes from sysexits.h
+-define(EX_OK , 0).
+-define(EX_USAGE , 64). % Bad command-line arguments.
+-define(EX_DATAERR , 65). % Wrong data in command-line arguments.
+-define(EX_NOUSER , 67). % The user specified does not exist.
+-define(EX_UNAVAILABLE, 69). % Could not connect to the target node.
+-define(EX_SOFTWARE , 70). % Failed to execute command.
+-define(EX_TEMPFAIL , 75). % Temporary error (e.g. something has timed out).
+-define(EX_CONFIG , 78). % Misconfiguration detected
diff --git a/src/rabbit_cli.erl b/src/rabbit_cli.erl
index 1dfbb11b2a..6dad003bb5 100644
--- a/src/rabbit_cli.erl
+++ b/src/rabbit_cli.erl
@@ -65,10 +65,10 @@ main(ParseFun, DoFun, UsageMod) ->
%% thrown errors into normal return values
case catch DoFun(Command, Node, Args, Opts) of
ok ->
- rabbit_misc:quit(0);
+ rabbit_misc:quit(?EX_OK);
{ok, Result} ->
rabbit_ctl_misc:print_cmd_result(Command, Result),
- rabbit_misc:quit(0);
+ rabbit_misc:quit(?EX_OK);
{'EXIT', {function_clause, [{?MODULE, action, _} | _]}} -> %% < R15
PrintInvalidCommandError(),
usage(UsageMod);
@@ -78,43 +78,44 @@ main(ParseFun, DoFun, UsageMod) ->
{error, {missing_dependencies, Missing, Blame}} ->
print_error("dependent plugins ~p not found; used by ~p.",
[Missing, Blame]),
- rabbit_misc:quit(2);
+ rabbit_misc:quit(?EX_CONFIG);
{'EXIT', {badarg, _}} ->
print_error("invalid parameter: ~p", [Args]),
- usage(UsageMod);
+ usage(UsageMod, ?EX_DATAERR);
{error, {Problem, Reason}} when is_atom(Problem), is_binary(Reason) ->
%% We handle this common case specially to avoid ~p since
%% that has i18n issues
print_error("~s: ~s", [Problem, Reason]),
- rabbit_misc:quit(2);
+ rabbit_misc:quit(?EX_SOFTWARE);
{error, Reason} ->
print_error("~p", [Reason]),
- rabbit_misc:quit(2);
+ rabbit_misc:quit(?EX_SOFTWARE);
{error_string, Reason} ->
print_error("~s", [Reason]),
- rabbit_misc:quit(2);
+ rabbit_misc:quit(?EX_SOFTWARE);
{badrpc, {'EXIT', Reason}} ->
print_error("~p", [Reason]),
- rabbit_misc:quit(2);
+ rabbit_misc:quit(?EX_SOFTWARE);
{badrpc, Reason} ->
case Reason of
timeout ->
- print_error("operation ~w on node ~w timed out", [Command, Node]);
+ print_error("operation ~w on node ~w timed out", [Command, Node]),
+ rabbit_misc:quit(?EX_TEMPFAIL);
_ ->
print_error("unable to connect to node ~w: ~w", [Node, Reason]),
- print_badrpc_diagnostics([Node])
- end,
- rabbit_misc:quit(2);
+ print_badrpc_diagnostics([Node]),
+ rabbit_misc:quit(?EX_UNAVAILABLE)
+ end;
{badrpc_multi, Reason, Nodes} ->
print_error("unable to connect to nodes ~p: ~w", [Nodes, Reason]),
print_badrpc_diagnostics(Nodes),
- rabbit_misc:quit(2);
+ rabbit_misc:quit(?EX_UNAVAILABLE);
{refused, Username, _, _} ->
print_error("failed to authenticate user \"~s\"", [Username]),
- rabbit_misc:quit(2);
+ rabbit_misc:quit(?EX_NOUSER);
Other ->
print_error("~p", [Other]),
- rabbit_misc:quit(2)
+ rabbit_misc:quit(?EX_SOFTWARE)
end.
start_distribution() ->
@@ -132,8 +133,11 @@ name_type() ->
end.
usage(Mod) ->
+ usage(Mod, ?EX_USAGE).
+
+usage(Mod, ExitCode) ->
io:format("~s", [Mod:usage()]),
- rabbit_misc:quit(1).
+ rabbit_misc:quit(ExitCode).
%%----------------------------------------------------------------------------