From 8db1aae642005f4482ba63a26f8210444a88dab8 Mon Sep 17 00:00:00 2001 From: Shawn <506895667@qq.com> Date: Fri, 21 Apr 2023 16:49:28 +0800 Subject: [PATCH 1/3] feat: improve the syntax of ${} in payload templates --- .../src/emqx_rule_engine.app.src | 2 +- apps/emqx_rule_engine/src/emqx_rule_utils.erl | 5 ++++- .../test/emqx_rule_utils_SUITE.erl | 19 +++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine.app.src b/apps/emqx_rule_engine/src/emqx_rule_engine.app.src index 9e228622e..1eb151707 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine.app.src +++ b/apps/emqx_rule_engine/src/emqx_rule_engine.app.src @@ -1,6 +1,6 @@ {application, emqx_rule_engine, [{description, "EMQX Rule Engine"}, - {vsn, "4.4.17"}, % strict semver, bump manually! + {vsn, "4.4.18"}, % strict semver, bump manually! {modules, []}, {registered, [emqx_rule_engine_sup, emqx_rule_registry, emqx_rule_engine_jwt_sup]}, {applications, [kernel,stdlib,rulesql,getopt,jose]}, diff --git a/apps/emqx_rule_engine/src/emqx_rule_utils.erl b/apps/emqx_rule_engine/src/emqx_rule_utils.erl index 143f9bf48..78d77ed58 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_utils.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_utils.erl @@ -71,7 +71,10 @@ [ float/1 ]}). --define(EX_PLACE_HOLDER, "(\\$\\{[a-zA-Z0-9\\._]+\\})"). +%% To match any pattern starts with '$' and followed by '{', and closed by a '}' char: +%% e.g. for string "a${abc}bb", "${abc}" will be matched. +%% Note that if "${{abc}}" is given, the "${{abc}" should be matched, NOT "${{abc}}". +-define(EX_PLACE_HOLDER, "(\\$\\{.*?\\})"). -define(EX_WITHE_CHARS, "\\s"). %% Space and CRLF -define(FLOAT_PRECISION, 17). diff --git a/apps/emqx_rule_engine/test/emqx_rule_utils_SUITE.erl b/apps/emqx_rule_engine/test/emqx_rule_utils_SUITE.erl index 74e002567..208680907 100644 --- a/apps/emqx_rule_engine/test/emqx_rule_utils_SUITE.erl +++ b/apps/emqx_rule_engine/test/emqx_rule_utils_SUITE.erl @@ -76,6 +76,25 @@ t_proc_tmpl(_) -> Selected = #{a => <<"1">>, b => 1, c => 1.0, d => #{d1 => <<"hi">>}}, Tks = emqx_rule_utils:preproc_tmpl(<<"a:${a},b:${b},c:${c},d:${d}">>), ?assertEqual(<<"a:1,b:1,c:1.0,d:{\"d1\":\"hi\"}">>, + emqx_rule_utils:proc_tmpl(Tks, Selected)), + Tks1 = emqx_rule_utils:preproc_tmpl(<<"a:${a},b:${b},c:${c},d:${d.d1}">>), + ?assertEqual(<<"a:1,b:1,c:1.0,d:hi">>, + emqx_rule_utils:proc_tmpl(Tks1, Selected)). + +t_proc_tmpl_arbitrary_var_name(_) -> + Selected = #{<<"中"/utf8>> => <<"1">>, + <<"中-1"/utf8>> => <<"1-1">>, + <<"-_+=<>,/?:;\"'\\[]|">> => 1, + <<"-_+=<>,">> => #{<<"/?:;\"'\\[]|">> => 2}, + <<"!@#$%^&*()">> => 1.0, + <<"d">> => #{ + <<"$ff">> => <<"oo">>, + <<"${f">> => <<"hi">>, + <<"${f}">> => <<"qq">> + }}, + Tks = emqx_rule_utils:preproc_tmpl( + <<"a:${中},a:${中-1},b:${-_+=<>,/?:;\"'\\[]|},b:${-_+=<>,./?:;\"'\\[]|},c:${!@#$%^&*()},d:${d.$ff},d1:${d.${f}}"/utf8>>), + ?assertEqual(<<"a:1,a:1-1,b:1,b:2,c:1.0,d:oo,d1:hi}">>, emqx_rule_utils:proc_tmpl(Tks, Selected)). t_proc_tmpl1(_) -> From e5ca44d0b6f1cb3b2ddb4d63ce9719533a36fcc4 Mon Sep 17 00:00:00 2001 From: Shawn <506895667@qq.com> Date: Fri, 21 Apr 2023 16:52:07 +0800 Subject: [PATCH 2/3] chore: update appups and app vsns --- .../src/emqx_rule_engine.appup.src | 57 ++++++++++--------- .../emqx_dashboard/src/emqx_dashboard.app.src | 2 +- src/emqx.app.src | 2 +- src/emqx.appup.src | 10 +++- 4 files changed, 41 insertions(+), 30 deletions(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine.appup.src b/apps/emqx_rule_engine/src/emqx_rule_engine.appup.src index b2a339fe5..2c065e7a9 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine.appup.src +++ b/apps/emqx_rule_engine/src/emqx_rule_engine.appup.src @@ -1,27 +1,30 @@ %% -*- mode: erlang -*- %% Unless you know what you are doing, DO NOT edit manually!! {VSN, - [{"4.4.16", - [{load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, + [{"4.4.17",[{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]}]}, + {"4.4.16", + [{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]}, - {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]} - ]}, + {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}]}, {"4.4.15", - [{load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, + [{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}, - {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]} - ]}, + {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}]}, {<<"4\\.4\\.1[3-4]">>, - [{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]}, + [{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}]}, {"4.4.12", - [{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]}, + [{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, @@ -31,7 +34,8 @@ {update,emqx_rule_engine_jwt_sup,supervisor}, {load_module,emqx_rule_engine_jwt,brutal_purge,soft_purge,[]}]}, {"4.4.11", - [{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]}, + [{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine_jwt_worker,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, @@ -60,8 +64,7 @@ {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]}, - {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]} - ]}, + {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}]}, {"4.4.9", [{load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]}, {add_module,emqx_rule_engine_jwt}, @@ -118,8 +121,7 @@ {load_module,emqx_rule_utils,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_actions,brutal_purge,soft_purge,[]}, - {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]} - ]}, + {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}]}, {"4.4.5", [{add_module,emqx_rule_engine_jwt}, {add_module,emqx_rule_engine_jwt_worker}, @@ -227,8 +229,7 @@ {load_module,emqx_rule_utils,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]}, {add_module,emqx_rule_date}, - {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]} - ]}, + {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}]}, {"4.4.0", [{add_module,emqx_rule_engine_jwt}, {add_module,emqx_rule_engine_jwt_worker}, @@ -253,27 +254,30 @@ {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]}]}, {<<".*">>,[]}], - [{"4.4.16", - [{load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, + [{"4.4.17",[{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]}]}, + {"4.4.16", + [{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]}, - {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]} - ]}, + {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}]}, {"4.4.15", - [{load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, + [{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}, - {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]} - ]}, + {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}]}, {<<"4\\.4\\.1[3-4]">>, - [{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]}, + [{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}]}, {"4.4.12", - [{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]}, + [{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, @@ -283,7 +287,8 @@ {update,emqx_rule_engine_jwt_sup,supervisor}, {load_module,emqx_rule_engine_jwt,brutal_purge,soft_purge,[]}]}, {"4.4.11", - [{load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]}, + [{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_engine_app,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine_jwt_worker,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, diff --git a/lib-ce/emqx_dashboard/src/emqx_dashboard.app.src b/lib-ce/emqx_dashboard/src/emqx_dashboard.app.src index e63396592..bc45aed88 100644 --- a/lib-ce/emqx_dashboard/src/emqx_dashboard.app.src +++ b/lib-ce/emqx_dashboard/src/emqx_dashboard.app.src @@ -1,6 +1,6 @@ {application, emqx_dashboard, [{description, "EMQX Web Dashboard"}, - {vsn, "4.4.16"}, % strict semver, bump manually! + {vsn, "4.4.17"}, % strict semver, bump manually! {modules, []}, {registered, [emqx_dashboard_sup]}, {applications, [kernel,stdlib,mnesia,minirest]}, diff --git a/src/emqx.app.src b/src/emqx.app.src index c2b169f27..1ad866313 100644 --- a/src/emqx.app.src +++ b/src/emqx.app.src @@ -6,7 +6,7 @@ %% the emqx `release' version, which in turn is comprised of several %% apps, one of which is this. See `emqx_release.hrl' for more %% info. - {vsn, "4.4.17"}, % strict semver, bump manually! + {vsn, "4.4.18"}, % strict semver, bump manually! {modules, []}, {registered, []}, {applications, [ kernel diff --git a/src/emqx.appup.src b/src/emqx.appup.src index 47de7747d..dcb3b7fa3 100644 --- a/src/emqx.appup.src +++ b/src/emqx.appup.src @@ -1,7 +1,10 @@ %% -*- mode: erlang -*- %% Unless you know what you are doing, DO NOT edit manually!! {VSN, - [{"4.4.16", + [{"4.4.17", + [{load_module,emqx_relup,brutal_purge,soft_purge,[]}, + {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, + {"4.4.16", [{load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_pool,brutal_purge,soft_purge,[]}, {load_module,emqx_misc,brutal_purge,soft_purge,[]}, @@ -526,7 +529,10 @@ {apply,{application,set_env, [gen_rpc,insecure_auth_fallback_allowed,true]}}]}, {<<".*">>,[]}], - [{"4.4.16", + [{"4.4.17", + [{load_module,emqx_relup,brutal_purge,soft_purge,[]}, + {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, + {"4.4.16", [{load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_pool,brutal_purge,soft_purge,[]}, {load_module,emqx_misc,brutal_purge,soft_purge,[]}, From 7836eb44d463f43c5e0ab4ea4ada077c3bd7fbc6 Mon Sep 17 00:00:00 2001 From: Shawn <506895667@qq.com> Date: Fri, 21 Apr 2023 18:18:55 +0800 Subject: [PATCH 3/3] chore: add change logs for v4.4.18 --- changes/v4.4.18-en.md | 10 ++++++++++ changes/v4.4.18-zh.md | 11 +++++++++++ 2 files changed, 21 insertions(+) create mode 100644 changes/v4.4.18-en.md create mode 100644 changes/v4.4.18-zh.md diff --git a/changes/v4.4.18-en.md b/changes/v4.4.18-en.md new file mode 100644 index 000000000..bc5af67b3 --- /dev/null +++ b/changes/v4.4.18-en.md @@ -0,0 +1,10 @@ +# v4.4.18 + +## Enhancements + +- Improved the placeholder syntax of the rule engine [#10470](https://github.com/emqx/emqx/pull/10470). + + The parameters of certain actions support using placeholder syntax to dynamically fill in the content of strings. The format of the placeholder syntax is `${key}`. + Prior to the improvement, the `key` in `${key}` could only contain letters, numbers, and underscores. Now the `key` supports any UTF8 character after the improvement. + +## Bug fixes diff --git a/changes/v4.4.18-zh.md b/changes/v4.4.18-zh.md new file mode 100644 index 000000000..5a9e7c42a --- /dev/null +++ b/changes/v4.4.18-zh.md @@ -0,0 +1,11 @@ +# v4.4.18 + +## 增强 + +- 改进规则引擎的占位符语法 [#10470](https://github.com/emqx/emqx/pull/10470)。 + + 某些动作的参数支持使用占位符语法,来动态的填充字符串的内容,占位符语法的格式为 `${key}`。 + 改进前,`${key}` 中的 `key` 只能包含字母、数字和下划线。改进后 `key` 支持任意的 UTF8 字符了。 + +## 修复 +