diff --git a/src/emqttd_ctl.erl b/src/emqttd_ctl.erl index a880a674f..757b8c580 100644 --- a/src/emqttd_ctl.erl +++ b/src/emqttd_ctl.erl @@ -25,7 +25,8 @@ -define(SERVER, ?MODULE). %% API Function Exports --export([start_link/0, register_cmd/3, unregister_cmd/1, run/1]). +-export([start_link/0, register_cmd/2, register_cmd/3, unregister_cmd/1, + lookup/1, run/1]). %% gen_server Function Exports -export([init/1, handle_call/3, handle_cast/2, handle_info/2, @@ -43,6 +44,11 @@ start_link() -> gen_server:start_link({local, ?SERVER}, ?MODULE, [], []). %% @doc Register a command +-spec register_cmd(atom(), {module(), atom()}) -> ok. +register_cmd(Cmd, MF) -> + register_cmd(Cmd, MF, []). + +%% @doc Register a command with opts -spec register_cmd(atom(), {module(), atom()}, list()) -> ok. register_cmd(Cmd, MF, Opts) -> cast({register_cmd, Cmd, MF, Opts}). @@ -55,17 +61,25 @@ unregister_cmd(Cmd) -> cast(Msg) -> gen_server:cast(?SERVER, Msg). %% @doc Run a command +-spec run([string()]) -> any(). run([]) -> usage(); run(["help"]) -> usage(); run([CmdS|Args]) -> - Cmd = list_to_atom(CmdS), - case ets:match(?CMD_TAB, {{'_', Cmd}, '$1', '_'}) of - [[{Mod, Fun}]] -> Mod:Fun(Args); + case lookup(list_to_atom(CmdS)) of + [{Mod, Fun}] -> Mod:Fun(Args); [] -> usage() end. - + +%% @doc Lookup a command +-spec lookup(atom()) -> [{module(), atom()}]. +lookup(Cmd) -> + case ets:match(?CMD_TAB, {{'_', Cmd}, '$1', '_'}) of + [El] -> El; + [] -> [] + end. + %% @doc Usage usage() -> ?PRINT("Usage: ~s~n", [?MODULE]), diff --git a/test/emqttd_SUITE.erl b/test/emqttd_SUITE.erl index eca4b5294..6eafdd2dd 100644 --- a/test/emqttd_SUITE.erl +++ b/test/emqttd_SUITE.erl @@ -27,7 +27,8 @@ all() -> {group, retainer}, {group, broker}, {group, metrics}, - {group, stats}]. + {group, stats}, + {group, cli}]. groups() -> [{pubsub, [sequence], @@ -48,7 +49,18 @@ groups() -> {metrics, [sequence], [inc_dec_metric]}, {stats, [sequence], - [set_get_stat]}]. + [set_get_stat]}, + {cli, [sequence], + [ctl_register_cmd, + cli_status, + cli_broker, + cli_clients, + cli_sessions, + cli_topics, + cli_subscriptions, + cli_bridges, + cli_plugins, + cli_listeners]}]. init_per_suite(Config) -> application:start(lager), @@ -212,3 +224,65 @@ inc_dec_metric(_) -> set_get_stat(_) -> emqttd_stats:setstat('retained/max', 99), 99 = emqttd_stats:getstat('retained/max'). + +%%-------------------------------------------------------------------- +%% CLI Group +%%-------------------------------------------------------------------- + +ctl_register_cmd(_) -> + emqttd_ctl:register_cmd(test_cmd, {?MODULE, test_cmd}), + erlang:yield(), + timer:sleep(5), + [{?MODULE, test_cmd}] = emqttd_ctl:lookup(test_cmd), + emqttd_ctl:run(["test_cmd", "arg1", "arg2"]), + emqttd_ctl:unregister_cmd(test_cmd). + +test_cmd(["arg1", "arg2"]) -> + ct:print("test_cmd is called"); + +test_cmd([]) -> + io:format("test command"). + +cli_status(_) -> + emqttd_cli:status([]). + +cli_broker(_) -> + emqttd_cli:broker([]), + emqttd_cli:broker(["stats"]), + emqttd_cli:broker(["metrics"]), + emqttd_cli:broker(["pubsub"]). + +cli_clients(_) -> + emqttd_cli:clients(["list"]), + emqttd_cli:clients(["show", "clientId"]), + emqttd_cli:clients(["kick", "clientId"]). + +cli_sessions(_) -> + emqttd_cli:sessions(["list"]), + emqttd_cli:sessions(["list", "persistent"]), + emqttd_cli:sessions(["list", "transient"]), + emqttd_cli:sessions(["show", "clientId"]). + +cli_topics(_) -> + emqttd_cli:topics(["list"]), + emqttd_cli:topics(["show", "topic"]). + +cli_subscriptions(_) -> + emqttd_cli:subscriptions(["list"]), + emqttd_cli:subscriptions(["show", "clientId"]), + emqttd_cli:subscriptions(["add", "clientId", "topic", "2"]), + emqttd_cli:subscriptions(["del", "clientId", "topic"]). + +cli_plugins(_) -> + emqttd_cli:plugins(["list"]), + emqttd_cli:plugins(["load", "emqttd_plugin_template"]), + emqttd_cli:plugins(["unload", "emqttd_plugin_template"]). + +cli_bridges(_) -> + emqttd_cli:bridges(["list"]), + emqttd_cli:bridges(["start", "a@127.0.0.1", "topic"]), + emqttd_cli:bridges(["stop", "a@127.0.0.1", "topic"]). + +cli_listeners(_) -> + emqttd_cli:listeners([]). +