Skip to content

Commit ed44282

Browse files
committed
wip
1 parent 8694388 commit ed44282

File tree

5 files changed

+147
-118
lines changed

5 files changed

+147
-118
lines changed

deps/rabbit/Makefile

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,13 +163,12 @@ ESCRIPT_FILE := scripts/rmq
163163

164164
ebin/$(PROJECT).app:: $(ESCRIPT_FILE)
165165

166-
$(ESCRIPT_FILE): ebin/rabbit_cli.beam ebin/rabbit_cli_args.beam ebin/rabbit_cli_io.beam
167-
$(gen_verbose) cd .. && $(ESCRIPT_ZIP) $(abspath $(ESCRIPT_ZIP_FILE)) $(patsubst %,$(PROJECT)/%,$^)
166+
$(ESCRIPT_FILE): ebin/rabbit_cli.beam
168167
$(gen_verbose) printf "%s\n" \
169168
"#!$(ESCRIPT_SHEBANG)" \
170169
"%% $(ESCRIPT_COMMENT)" \
171170
"%%! $(ESCRIPT_EMU_ARGS)" > $(ESCRIPT_FILE)
172-
$(verbose) cat $(abspath $(ESCRIPT_ZIP_FILE)) >> $(ESCRIPT_FILE)
171+
$(verbose) cat $< >> $(ESCRIPT_FILE)
173172
$(verbose) chmod a+x $(ESCRIPT_FILE)
174173

175174
clean:: clean-cli

deps/rabbit/src/rabbit_cli.erl

Lines changed: 72 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,44 +16,91 @@ main(Args) ->
1616
run_cli(Args) ->
1717
maybe
1818
Progname = escript:script_name(),
19+
add_rabbitmq_code_path(Progname),
20+
1921
{ok, ArgMap, RemainingArgs} ?= parse_args(Progname, Args),
2022
Nodename = lookup_rabbitmq_nodename(ArgMap),
2123
{ok, _} ?= net_kernel:start(undefined, #{name_domain => shortnames}),
22-
true ?= net_kernel:connect_node(Nodename),
2324

2425
{ok, IO} ?= rabbit_cli_io:start_link(),
25-
try
26-
Ret = run_command(Nodename, Progname, ArgMap, RemainingArgs, IO),
27-
io:format("Ret = ~p~n", [Ret])
28-
after
29-
rabbit_cli_io:stop(IO)
30-
end,
26+
Ret = case net_kernel:connect_node(Nodename) of
27+
true ->
28+
catch run_command(
29+
Nodename, Progname, ArgMap, RemainingArgs, IO);
30+
false ->
31+
catch run_command(
32+
undefined, Progname, ArgMap, RemainingArgs, IO)
33+
end,
34+
io:format("Ret = ~p~n", [Ret]),
35+
rabbit_cli_io:stop(IO),
3136
ok
3237
end.
3338

39+
add_rabbitmq_code_path(Progname) ->
40+
ScriptDir = filename:dirname(Progname),
41+
PluginsDir0 = filename:join([ScriptDir, "..", "plugins"]),
42+
PluginsDir1 = case filelib:is_dir(PluginsDir0) of
43+
true ->
44+
PluginsDir0
45+
end,
46+
Glob = filename:join([PluginsDir1, "*", "ebin"]),
47+
AppDirs = filelib:wildcard(Glob),
48+
lists:foreach(fun code:add_path/1, AppDirs),
49+
ok.
50+
51+
argparse_def() ->
52+
#{arguments =>
53+
[
54+
#{name => help,
55+
long => "-help",
56+
short => $h,
57+
type => boolean,
58+
help => "Display help and exit"},
59+
#{name => node,
60+
long => "-node",
61+
short => $n,
62+
type => string,
63+
nargs => 1,
64+
help => "Name of the node to control"},
65+
#{name => verbose,
66+
long => "-verbose",
67+
short => $v,
68+
action => count,
69+
help =>
70+
"Be verbose; can be specified multiple times to increase verbosity"},
71+
#{name => version,
72+
long => "-version",
73+
short => $V,
74+
help =>
75+
"Display version and exit"}
76+
]}.
77+
3478
parse_args(Progname, Args) ->
35-
Definition = #{arguments =>
36-
[#{name => verbose,
37-
long => "-verbose",
38-
short => $v,
39-
action => count,
40-
help =>
41-
"Be verbose; can be specified multiple times to "
42-
"increase verbosity"},
43-
#{name => node,
44-
long => "-node",
45-
short => $n,
46-
type => string,
47-
nargs => 1,
48-
help => "Name of the node to control"}]},
79+
Definition = argparse_def(),
4980
Options = #{progname => Progname},
50-
case rabbit_cli_args:parse(Args, Definition, Options) of
81+
case partial_parse(Args, Definition, Options) of
5182
{ok, ArgMap, _CmdPath, _Command, RemainingArgs} ->
5283
{ok, ArgMap, RemainingArgs};
5384
{error, _} = Error->
5485
Error
5586
end.
5687

88+
partial_parse(Args, Definition, Options) ->
89+
partial_parse(Args, Definition, Options, []).
90+
91+
partial_parse(Args, Definition, Options, RemainingArgs) ->
92+
case argparse:parse(Args, Definition, Options) of
93+
{ok, ArgMap, CmdPath, Command} ->
94+
RemainingArgs1 = lists:reverse(RemainingArgs),
95+
{ok, ArgMap, CmdPath, Command, RemainingArgs1};
96+
{error, {_CmdPath, undefined, Arg, <<>>}} ->
97+
Args1 = Args -- [Arg],
98+
RemainingArgs1 = [Arg | RemainingArgs],
99+
partial_parse(Args1, Definition, Options, RemainingArgs1);
100+
{error, _} = Error ->
101+
Error
102+
end.
103+
57104
lookup_rabbitmq_nodename(#{node := Nodename}) ->
58105
Nodename1 = complete_nodename(Nodename),
59106
Nodename1;
@@ -131,12 +178,10 @@ complete_nodename(Nodename) ->
131178
% nomatch ->
132179
% true
133180
% end.
134-
%
135-
%lookup_local_command_map() ->
136-
% ScriptDir = filename:dirname(escript:script_name()),
137-
% io:format("Script = ~p~n", [ScriptDir]),
138-
% ok.
139181

182+
run_command(undefined, Progname, #{help := true}, _RemainingArgs, IO) ->
183+
Definition = argparse_def(),
184+
rabbit_cli_io:display_help(IO, Progname, [], Definition);
140185
run_command(Nodename, Progname, ArgMap, RemainingArgs, IO) ->
141186
try
142187
erpc:call(

deps/rabbit/src/rabbit_cli_args.erl

Lines changed: 0 additions & 21 deletions
This file was deleted.

deps/rabbit/src/rabbit_cli_commands.erl

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,51 +2,52 @@
22

33
-include_lib("kernel/include/logger.hrl").
44

5-
-export([commands/0, run_command/4]).
6-
-export([list_exchanges/4]).
5+
-export([argparse_def/0, run_command/4]).
6+
-export([list_exchanges/3]).
77

8-
commands() ->
8+
argparse_def() ->
99
%% Extract the commands from module attributes like feature flags and boot
1010
%% steps.
11-
#{
12-
commands =>
13-
#{
14-
"list" =>
15-
#{
16-
commands =>
11+
#{commands =>
12+
#{"list" =>
13+
#{commands =>
1714
#{"exchanges" =>
18-
#{
19-
handler => {?MODULE, list_exchanges}
20-
}
15+
maps:merge(
16+
rabbit_cli_io:argparse_def(record_stream),
17+
#{handler => {?MODULE, list_exchanges}})
2118
}
2219
}
2320
}
2421
}.
2522

2623
run_command(Progname, ArgMap, Args, IO) ->
27-
Definition = commands(),
24+
Definition = argparse_def(),
2825
Options = #{progname => Progname},
29-
case rabbit_cli_args:parse(Args, Definition, Options) of
30-
{ok, NewArgMap, _CmdPath, Command, RemainingArgs} ->
26+
case argparse:parse(Args, Definition, Options) of
27+
{ok, NewArgMap, CmdPath, Command} ->
3128
ArgMap1 = maps:merge(ArgMap, NewArgMap),
32-
%% TODO: Put both processes under the rabbit supervision tree.
33-
RunnerPid = command_runner(
34-
Progname, Command, ArgMap1, RemainingArgs, IO),
35-
RunnerMRef = erlang:monitor(process, RunnerPid),
36-
receive
37-
{'DOWN', RunnerMRef, _, _, Reason} ->
38-
{ok, Reason}
39-
end;
29+
run_command1(Progname, CmdPath, ArgMap1, Command, IO);
4030
{error, Reason} = Error ->
4131
?LOG_ALERT("Error: ~s", [argparse:format_error(Reason)]),
4232
Error
4333
end.
4434

35+
run_command1(Progname, CmdPath, #{help := true}, Command, IO) ->
36+
rabbit_cli_io:display_help(IO, Progname, CmdPath, Command);
37+
run_command1(Progname, _CmdPath, ArgMap, Command, IO) ->
38+
%% TODO: Put both processes under the rabbit supervision tree.
39+
RunnerPid = command_runner(Progname, Command, ArgMap, IO),
40+
RunnerMRef = erlang:monitor(process, RunnerPid),
41+
receive
42+
{'DOWN', RunnerMRef, _, _, Reason} ->
43+
{ok, Reason}
44+
end.
45+
4546
command_runner(
46-
Progname, #{handler := {Mod, Fun}} = _Command, ArgMap, RemainingArgs, IO) ->
47-
spawn_link(Mod, Fun, [Progname, ArgMap, RemainingArgs, IO]).
47+
Progname, #{handler := {Mod, Fun}} = _Command, ArgMap, IO) ->
48+
spawn_link(Mod, Fun, [Progname, ArgMap, IO]).
4849

49-
list_exchanges(Progname, ArgMap, RemainingArgs, IO) ->
50+
list_exchanges(Progname, ArgMap, IO) ->
5051
InfoKeys = rabbit_exchange:info_keys(),
5152
Fields = lists:map(
5253
fun
@@ -69,7 +70,7 @@ list_exchanges(Progname, ArgMap, RemainingArgs, IO) ->
6970
(Key) ->
7071
#{name => Key, type => term}
7172
end, InfoKeys),
72-
case rabbit_cli_io:start_record_stream(IO, exchanges, Fields, {Progname, ArgMap, RemainingArgs}) of
73+
case rabbit_cli_io:start_record_stream(IO, exchanges, Fields, {Progname, ArgMap}) of
7374
{ok, Stream} ->
7475
Exchanges = rabbit_exchange:list(),
7576
lists:foreach(

deps/rabbit/src/rabbit_cli_io.erl

Lines changed: 45 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
-export([start_link/0,
88
stop/1,
9+
argparse_def/1,
10+
display_help/4,
911
start_record_stream/4,
1012
push_new_record/3,
1113
end_record_stream/2]).
@@ -29,12 +31,31 @@ stop(IO) ->
2931
ok
3032
end.
3133

32-
start_record_stream(
33-
IO, Name, Fields, {_Progname, ArgMap, RemainingArgs} = ProgAndArgs)
34+
argparse_def(record_stream) ->
35+
#{arguments =>
36+
[
37+
#{name => output,
38+
long => "-output",
39+
short => $o,
40+
type => string,
41+
nargs => 1,
42+
help => "Write output to file <FILE>"},
43+
#{name => format,
44+
long => "-format",
45+
short => $f,
46+
type => {atom, [plain, json]},
47+
nargs => 1,
48+
help => "Format output acccording to <FORMAT>"}
49+
]
50+
}.
51+
52+
display_help(IO, Progname, CmdPath, ArgparseDef) ->
53+
gen_server:cast(IO, {?FUNCTION_NAME, Progname, CmdPath, ArgparseDef}).
54+
55+
start_record_stream(IO, Name, Fields, {_Progname, ArgMap} = ProgAndArgs)
3456
when is_pid(IO) andalso
3557
is_atom(Name) andalso
36-
is_map(ArgMap) andalso
37-
is_list(RemainingArgs) ->
58+
is_map(ArgMap) ->
3859
gen_server:call(IO, {?FUNCTION_NAME, Name, Fields, ProgAndArgs}).
3960

4061
push_new_record(IO, #{name := Name}, Record) ->
@@ -49,49 +70,33 @@ init(_Args) ->
4970
{ok, State}.
5071

5172
handle_call(
52-
{start_record_stream, Name, Fields, {Progname, ArgMap, RemainingArgs}},
73+
{start_record_stream, Name, Fields, {_Progname, _ArgMap}},
5374
From,
5475
#?MODULE{record_streams = Streams} = State) ->
55-
Definition = #{
56-
arguments =>
57-
[
58-
#{name => output,
59-
long => "-output",
60-
short => $o,
61-
type => string,
62-
nargs => 1,
63-
help => "Write output to file <FILE>"},
64-
#{name => format,
65-
long => "-format",
66-
short => $f,
67-
type => {atom, [plain, json]},
68-
nargs => 1,
69-
help => "Format output acccording to <FORMAT>"}
70-
]
71-
},
72-
Options = #{progname => Progname},
73-
case rabbit_cli_args:parse(RemainingArgs, Definition, Options) of
74-
{ok, NewArgMap, _, _, []} ->
75-
_ArgMap1 = maps:merge(ArgMap, NewArgMap),
76-
Stream = #{name => Name, fields => Fields},
77-
gen_server:reply(From, {ok, Stream}),
78-
79-
FieldNames = [atom_to_list(FieldName)
80-
|| #{name := FieldName} <- Fields],
81-
Header = string:join(FieldNames, "\t"),
82-
io:format("~ts~n", [Header]),
83-
84-
Streams1 = Streams#{Name => Stream},
85-
State1 = State#?MODULE{record_streams = Streams1},
86-
{noreply, State1};
87-
{error, _} = Error ->
88-
{reply, Error, State}
89-
end;
76+
Stream = #{name => Name, fields => Fields},
77+
gen_server:reply(From, {ok, Stream}),
78+
79+
FieldNames = [atom_to_list(FieldName)
80+
|| #{name := FieldName} <- Fields],
81+
Header = string:join(FieldNames, "\t"),
82+
io:format("~ts~n", [Header]),
83+
84+
Streams1 = Streams#{Name => Stream},
85+
State1 = State#?MODULE{record_streams = Streams1},
86+
{noreply, State1};
9087
handle_call(stop, _From, State) ->
9188
{stop, normal, ok, State};
9289
handle_call(_Request, _From, State) ->
9390
{reply, ok, State}.
9491

92+
handle_cast(
93+
{display_help, Progname, CmdPath, ArgparseDef},
94+
State) ->
95+
Options = #{progname => Progname,
96+
command => CmdPath},
97+
Help = argparse:help(ArgparseDef, Options),
98+
io:format("~s~n", [Help]),
99+
{noreply, State};
95100
handle_cast(
96101
{push_new_record, Name, Record},
97102
#?MODULE{record_streams = Streams} = State) ->

0 commit comments

Comments
 (0)