From 7817aec0d067286d61e83bb0e3ddc4e9e2b05900 Mon Sep 17 00:00:00 2001 From: ieQu1 <99872536+ieQu1@users.noreply.github.com> Date: Mon, 13 Jun 2022 14:14:56 +0200 Subject: [PATCH] feat(rule_engine): CLI to list rules --- .../src/emqx_rule_engine_app.erl | 2 + .../src/emqx_rule_engine_cli.erl | 94 +++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 apps/emqx_rule_engine/src/emqx_rule_engine_cli.erl diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine_app.erl b/apps/emqx_rule_engine/src/emqx_rule_engine_app.erl index 67786147b..802154339 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine_app.erl +++ b/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(). diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine_cli.erl b/apps/emqx_rule_engine/src/emqx_rule_engine_cli.erl new file mode 100644 index 000000000..a198d0831 --- /dev/null +++ b/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 ", "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]).