Просмотр исходного кода

feat(rule_engine): CLI to list rules

ieQu1 3 лет назад
Родитель
Сommit
7817aec0d0

+ 2 - 0
apps/emqx_rule_engine/src/emqx_rule_engine_app.erl

@@ -30,8 +30,10 @@ start(_Type, _Args) ->
     SupRet = emqx_rule_engine_sup:start_link(),
     ok = emqx_rule_engine:load_rules(),
     emqx_conf:add_handler(emqx_rule_engine:config_key_path(), emqx_rule_engine),
+    emqx_rule_engine_cli:load(),
     SupRet.
 
 stop(_State) ->
+    emqx_rule_engine_cli:unload(),
     emqx_conf:remove_handler(emqx_rule_engine:config_key_path()),
     ok = emqx_rule_events:unload().

+ 94 - 0
apps/emqx_rule_engine/src/emqx_rule_engine_cli.erl

@@ -0,0 +1,94 @@
+%%--------------------------------------------------------------------
+%% Copyright (c) 2022 EMQ Technologies Co., Ltd. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%%     http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%--------------------------------------------------------------------
+-module(emqx_rule_engine_cli).
+
+%% API:
+-export([load/0, unload/0]).
+
+-export([cmd/1]).
+
+%%================================================================================
+%% API funcions
+%%================================================================================
+
+load() ->
+    ok = emqx_ctl:register_command(rules, {?MODULE, cmd}, []).
+
+unload() ->
+    ok = emqx_ctl:unregister_command(rules).
+
+%%================================================================================
+%% Internal exports
+%%================================================================================
+
+cmd(["list"]) ->
+    lists:foreach(
+        fun pretty_print_rule_summary/1,
+        emqx_rule_engine:get_rules_ordered_by_ts()
+    );
+cmd(["show", ID]) ->
+    pretty_print_rule(ID);
+cmd(_) ->
+    emqx_ctl:usage(
+        [
+            {"rules list", "List rules"},
+            {"rules show <RuleID>", "Show a rule"}
+        ]
+    ).
+
+%%================================================================================
+%% Internal functions
+%%================================================================================
+
+pretty_print_rule_summary(#{id := Id, name := Name, enable := Enable, description := Desc}) ->
+    emqx_ctl:print("Rule{id=~ts, name=~ts, enabled=~ts, descr=~ts}\n", [
+        Id, Name, Enable, Desc
+    ]).
+
+%% erlfmt-ignore
+pretty_print_rule(ID) ->
+    case emqx_rule_engine:get_rule(list_to_binary(ID)) of
+        {ok, #{id := Id, name := Name, description := Descr, enable := Enable,
+               sql := SQL, created_at := CreatedAt, updated_at := UpdatedAt,
+               actions := Actions}} ->
+            emqx_ctl:print(
+              "Id:\n  ~ts\n"
+              "Name:\n  ~ts\n"
+              "Description:\n  ~ts\n"
+              "Enabled:\n  ~ts\n"
+              "SQL:\n  ~ts\n"
+              "Created at:\n  ~ts\n"
+              "Updated at:\n  ~ts\n"
+              "Actions:\n  ~s\n"
+             ,[Id, Name, left_pad(Descr), Enable, left_pad(SQL),
+               calendar:system_time_to_rfc3339(CreatedAt, [{unit, millisecond}]),
+               calendar:system_time_to_rfc3339(UpdatedAt, [{unit, millisecond}]),
+               [left_pad(format_action(A)) || A <- Actions]
+              ]
+             );
+        _ ->
+            ok
+    end.
+
+%% erlfmt-ignore
+format_action(#{func := Func, args := Args}) ->
+    io_lib:format("Function:\n  ~p\n"
+                  "Args:\n  ~p\n"
+                 ,[Func, maps:without([preprocessed_tmpl], Args)]
+                 ).
+
+left_pad(Str) ->
+    re:replace(Str, "\n", "\n  ", [global]).