summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2011-11-29 11:42:10 +0000
committerSimon MacMullen <simon@rabbitmq.com>2011-11-29 11:42:10 +0000
commit49876c1f8f0e28cf27abe7d37eb4227c513db2ce (patch)
treed6ec8b4b4b587bbf54261c52da1a4e706fc75f68
parent0560e52985816f7f2758d2b68a501ba87293e5b6 (diff)
parent19cffc781d7ec36a3a64b9b4c1526c68f85695aa (diff)
downloadrabbitmq-server-49876c1f8f0e28cf27abe7d37eb4227c513db2ce.tar.gz
Merge bug24579
-rw-r--r--docs/rabbitmqctl.1.xml16
-rw-r--r--src/mirrored_supervisor_tests.erl6
-rw-r--r--src/rabbit_control.erl24
-rw-r--r--src/rabbit_guid.erl9
4 files changed, 50 insertions, 5 deletions
diff --git a/docs/rabbitmqctl.1.xml b/docs/rabbitmqctl.1.xml
index f21888bd..15755038 100644
--- a/docs/rabbitmqctl.1.xml
+++ b/docs/rabbitmqctl.1.xml
@@ -1315,6 +1315,22 @@
</para>
</listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><cmdsynopsis><command>eval</command> <arg choice="req"><replaceable>expr</replaceable></arg></cmdsynopsis></term>
+ <listitem>
+ <para>
+ Evaluate an arbitrary Erlang expression.
+ </para>
+ <para role="example-prefix">
+ For example:
+ </para>
+ <screen role="example">rabbitmqctl eval 'node().'</screen>
+ <para role="example">
+ This command returns the name of the node to which rabbitmqctl has connected.
+ </para>
+ </listitem>
+ </varlistentry>
</variablelist>
</refsect2>
diff --git a/src/mirrored_supervisor_tests.erl b/src/mirrored_supervisor_tests.erl
index 0900f56f..6c91bc4f 100644
--- a/src/mirrored_supervisor_tests.erl
+++ b/src/mirrored_supervisor_tests.erl
@@ -158,7 +158,7 @@ test_no_migration_on_shutdown() ->
try
call(worker, ping),
exit(worker_should_not_have_migrated)
- catch exit:{timeout_waiting_for_server, _} ->
+ catch exit:{timeout_waiting_for_server, _, _} ->
ok
end
end, [evil, good]).
@@ -245,10 +245,10 @@ inc_group() ->
get_group(Group) ->
{Group, get(counter)}.
-call(Id, Msg) -> call(Id, Msg, 100, 10).
+call(Id, Msg) -> call(Id, Msg, 1000, 100).
call(Id, Msg, 0, _Decr) ->
- exit({timeout_waiting_for_server, {Id, Msg}});
+ exit({timeout_waiting_for_server, {Id, Msg}, erlang:get_stacktrace()});
call(Id, Msg, MaxDelay, Decr) ->
try
diff --git a/src/rabbit_control.erl b/src/rabbit_control.erl
index fa8dd262..20486af5 100644
--- a/src/rabbit_control.erl
+++ b/src/rabbit_control.erl
@@ -98,6 +98,9 @@ start() ->
{error, Reason} ->
print_error("~p", [Reason]),
rabbit_misc:quit(2);
+ {error_string, Reason} ->
+ print_error("~s", [Reason]),
+ rabbit_misc:quit(2);
{badrpc, {'EXIT', Reason}} ->
print_error("~p", [Reason]),
rabbit_misc:quit(2);
@@ -368,7 +371,23 @@ action(report, Node, _Args, _Opts, Inform) ->
[print_report(Node, Q) || Q <- ?GLOBAL_QUERIES],
[print_report(Node, Q, [V]) || Q <- ?VHOST_QUERIES, V <- VHosts],
io:format("End of server status report~n"),
- ok.
+ ok;
+
+action(eval, Node, [Expr], _Opts, _Inform) ->
+ case erl_scan:string(Expr) of
+ {ok, Scanned, _} ->
+ case erl_parse:parse_exprs(Scanned) of
+ {ok, Parsed} ->
+ {value, Value, _} = unsafe_rpc(
+ Node, erl_eval, exprs, [Parsed, []]),
+ io:format("~p~n", [Value]),
+ ok;
+ {error, E} ->
+ {error_string, format_parse_error(E)}
+ end;
+ {error, E, _} ->
+ {error_string, format_parse_error(E)}
+ end.
%%----------------------------------------------------------------------------
@@ -443,6 +462,9 @@ system(Cmd) ->
escape_quotes(Cmd) ->
lists:flatten(lists:map(fun ($') -> "'\\''"; (Ch) -> Ch end, Cmd)).
+format_parse_error({_Line, Mod, Err}) ->
+ lists:flatten(Mod:format_error(Err)).
+
%%----------------------------------------------------------------------------
default_if_empty(List, Default) when is_list(List) ->
diff --git a/src/rabbit_guid.erl b/src/rabbit_guid.erl
index 523af749..2d0f5014 100644
--- a/src/rabbit_guid.erl
+++ b/src/rabbit_guid.erl
@@ -89,8 +89,15 @@ guid() ->
erlang:md5(term_to_binary(G)).
%% generate a readable string representation of a GUID.
+%%
+%% employs base64url encoding, which is safer in more contexts than
+%% plain base64.
string_guid(Prefix) ->
- Prefix ++ "-" ++ base64:encode_to_string(guid()).
+ Prefix ++ "-" ++ lists:foldl(fun ($\+, Acc) -> [$\- | Acc];
+ ($\/, Acc) -> [$\_ | Acc];
+ ($\=, Acc) -> Acc;
+ (Chr, Acc) -> [Chr | Acc]
+ end, [], base64:encode_to_string(guid())).
binstring_guid(Prefix) ->
list_to_binary(string_guid(Prefix)).