From 514519da33a7eb34e68f964d659ce40289571ee0 Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Wed, 21 Sep 2022 13:23:26 +0200 Subject: [PATCH 01/16] docs: Add v4.3.22 in CHANGES-4.3.md --- CHANGES-4.3.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES-4.3.md b/CHANGES-4.3.md index 55882077e..2e2f5157c 100644 --- a/CHANGES-4.3.md +++ b/CHANGES-4.3.md @@ -10,6 +10,8 @@ File format: - One list item per change topic Change log ends with a list of GitHub PRs +## v4.3.22 + ## v4.3.21 ### Enhancements From 4635d522737f4947204a8433259ad9cdb7ed6a35 Mon Sep 17 00:00:00 2001 From: zhongwencool Date: Fri, 2 Sep 2022 15:04:39 +0800 Subject: [PATCH 02/16] chore: add reboot_hook/shutdown_hook for enterprise --- src/emqx.app.src | 2 +- src/emqx.appup.src | 26 ++++++++++++++++++++------ src/emqx.erl | 33 +++++++++++++++++++++++++++++++-- 3 files changed, 52 insertions(+), 9 deletions(-) diff --git a/src/emqx.app.src b/src/emqx.app.src index 433c75326..99715d1a2 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.3.22"}, % strict semver, bump manually! + {vsn, "4.3.23"}, % strict semver, bump manually! {modules, []}, {registered, []}, {applications, [ kernel diff --git a/src/emqx.appup.src b/src/emqx.appup.src index 600c87d8d..8a0a2d4ff 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.3.21", + [{"4.3.22", + [{load_module,emqx,brutal_purge,soft_purge,[]}, + {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, + {"4.3.21", [{load_module,emqx_alarm,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}, @@ -11,7 +14,8 @@ {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_tracer,brutal_purge,soft_purge,[]}, - {load_module,emqx_channel,brutal_purge,soft_purge,[]}]}, + {load_module,emqx_channel,brutal_purge,soft_purge,[]}, + {load_module,emqx,brutal_purge,soft_purge,[]}]}, {"4.3.20", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, {load_module,emqx_router_helper,brutal_purge,soft_purge,[]}, @@ -24,7 +28,8 @@ {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]}, - {load_module,emqx_cm,brutal_purge,soft_purge,[]}]}, + {load_module,emqx_cm,brutal_purge,soft_purge,[]}, + {load_module,emqx,brutal_purge,soft_purge,[]}]}, {"4.3.19", [{load_module,emqx_listeners,brutal_purge,soft_purge,[]}, {load_module,emqx_router_helper,brutal_purge,soft_purge,[]}, @@ -37,6 +42,7 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_misc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, + {load_module,emqx,brutal_purge,soft_purge,[]}, {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_plugins,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}]}, @@ -54,6 +60,7 @@ {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, + {load_module,emqx,brutal_purge,soft_purge,[]}, {load_module,emqx_plugins,brutal_purge,soft_purge,[]}]}, {"4.3.17", [{load_module,emqx_listeners,brutal_purge,soft_purge,[]}, @@ -819,7 +826,10 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {<<".*">>,[]}], - [{"4.3.21", + [{"4.3.22", + [{load_module,emqx,brutal_purge,soft_purge,[]}, + {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, + {"4.3.21", [{load_module,emqx_alarm,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}, @@ -829,7 +839,8 @@ {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_tracer,brutal_purge,soft_purge,[]}, - {load_module,emqx_channel,brutal_purge,soft_purge,[]}]}, + {load_module,emqx_channel,brutal_purge,soft_purge,[]}, + {load_module,emqx,brutal_purge,soft_purge,[]}]}, {"4.3.20", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, {load_module,emqx_router_helper,brutal_purge,soft_purge,[]}, @@ -842,7 +853,8 @@ {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]}, - {load_module,emqx_cm,brutal_purge,soft_purge,[]}]}, + {load_module,emqx_cm,brutal_purge,soft_purge,[]}, + {load_module,emqx,brutal_purge,soft_purge,[]}]}, {"4.3.19", [{load_module,emqx_listeners,brutal_purge,soft_purge,[]}, {load_module,emqx_router_helper,brutal_purge,soft_purge,[]}, @@ -855,6 +867,7 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_misc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, + {load_module,emqx,brutal_purge,soft_purge,[]}, {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_plugins,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}]}, @@ -872,6 +885,7 @@ {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, + {load_module,emqx,brutal_purge,soft_purge,[]}, {load_module,emqx_plugins,brutal_purge,soft_purge,[]}]}, {"4.3.17", [{load_module,emqx_listeners,brutal_purge,soft_purge,[]}, diff --git a/src/emqx.erl b/src/emqx.erl index 469a4672b..4892fa6cc 100644 --- a/src/emqx.erl +++ b/src/emqx.erl @@ -228,6 +228,7 @@ shutdown() -> shutdown(Reason) -> ?LOG(critical, "emqx shutdown for ~s", [Reason]), + on_shutdown_hook(Reason), _ = emqx_plugins:unload(), lists:foreach(fun application:stop/1 , lists:reverse(default_started_applications()) @@ -238,10 +239,12 @@ reboot() -> true -> _ = application:stop(emqx_dashboard), %% dashboard must be started after mnesia lists:foreach(fun application:start/1 , default_started_applications()), - application:start(emqx_dashboard); + _ = application:start(emqx_dashboard), + on_reboot_hooks(); false -> - lists:foreach(fun application:start/1 , default_started_applications()) + lists:foreach(fun application:start/1 , default_started_applications()), + on_reboot_hooks() end. is_application_running(App) -> @@ -256,6 +259,32 @@ default_started_applications() -> [gproc, esockd, ranch, cowboy, ekka, emqx, emqx_modules]. -endif. +-ifdef(EMQX_ENTERPRISE). +on_reboot_hooks() -> + try + _ = emqx_license_api:bootstrap_license(), + ok + catch + Kind:Reason:Stack -> + ?LOG(critical, "~p while rebooting: ~p, ~p", [Kind, Reason, Stack]), + ok + end, + ok. + +on_shutdown_hook(join) -> + emqx_modules:sync_load_modules_file(), + ok; +on_shutdown_hook(_) -> + ok. + +-else. +on_reboot_hooks() -> + ok. + +on_shutdown_hook(_) -> + ok. +-endif. + %%-------------------------------------------------------------------- %% Internal functions %%-------------------------------------------------------------------- From 362c176d24842d096108bed0a8eeda6d14b10aef Mon Sep 17 00:00:00 2001 From: zhongwencool Date: Fri, 9 Sep 2022 09:52:33 +0800 Subject: [PATCH 03/16] chore: update appup.src --- src/emqx.appup.src | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/emqx.appup.src b/src/emqx.appup.src index 8a0a2d4ff..f5fb5b0ba 100644 --- a/src/emqx.appup.src +++ b/src/emqx.appup.src @@ -28,8 +28,13 @@ {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]}, +<<<<<<< HEAD {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx,brutal_purge,soft_purge,[]}]}, +======= + {load_module,emqx,brutal_purge,soft_purge,[]}, + {load_module,emqx_cm,brutal_purge,soft_purge,[]}]}, +>>>>>>> 8e5674f14 (chore: update appup.src) {"4.3.19", [{load_module,emqx_listeners,brutal_purge,soft_purge,[]}, {load_module,emqx_router_helper,brutal_purge,soft_purge,[]}, From c2f1f1aab85fc2cd24d919df8885af31d09f5b49 Mon Sep 17 00:00:00 2001 From: zhongwencool Date: Wed, 14 Sep 2022 10:22:03 +0800 Subject: [PATCH 04/16] chore: rename on_xxx_hooks to on_xxx --- src/emqx.appup.src | 5 ----- src/emqx.erl | 16 ++++++++-------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/emqx.appup.src b/src/emqx.appup.src index f5fb5b0ba..8a0a2d4ff 100644 --- a/src/emqx.appup.src +++ b/src/emqx.appup.src @@ -28,13 +28,8 @@ {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]}, -<<<<<<< HEAD {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx,brutal_purge,soft_purge,[]}]}, -======= - {load_module,emqx,brutal_purge,soft_purge,[]}, - {load_module,emqx_cm,brutal_purge,soft_purge,[]}]}, ->>>>>>> 8e5674f14 (chore: update appup.src) {"4.3.19", [{load_module,emqx_listeners,brutal_purge,soft_purge,[]}, {load_module,emqx_router_helper,brutal_purge,soft_purge,[]}, diff --git a/src/emqx.erl b/src/emqx.erl index 4892fa6cc..ae78e5795 100644 --- a/src/emqx.erl +++ b/src/emqx.erl @@ -228,7 +228,7 @@ shutdown() -> shutdown(Reason) -> ?LOG(critical, "emqx shutdown for ~s", [Reason]), - on_shutdown_hook(Reason), + on_shutdown(Reason), _ = emqx_plugins:unload(), lists:foreach(fun application:stop/1 , lists:reverse(default_started_applications()) @@ -240,11 +240,11 @@ reboot() -> _ = application:stop(emqx_dashboard), %% dashboard must be started after mnesia lists:foreach(fun application:start/1 , default_started_applications()), _ = application:start(emqx_dashboard), - on_reboot_hooks(); + on_reboot(); false -> lists:foreach(fun application:start/1 , default_started_applications()), - on_reboot_hooks() + on_reboot() end. is_application_running(App) -> @@ -260,7 +260,7 @@ default_started_applications() -> -endif. -ifdef(EMQX_ENTERPRISE). -on_reboot_hooks() -> +on_reboot() -> try _ = emqx_license_api:bootstrap_license(), ok @@ -271,17 +271,17 @@ on_reboot_hooks() -> end, ok. -on_shutdown_hook(join) -> +on_shutdown(join) -> emqx_modules:sync_load_modules_file(), ok; -on_shutdown_hook(_) -> +on_shutdown(_) -> ok. -else. -on_reboot_hooks() -> +on_reboot() -> ok. -on_shutdown_hook(_) -> +on_shutdown(_) -> ok. -endif. From 61d745a230218ee59c1083085d6f48f54dda1067 Mon Sep 17 00:00:00 2001 From: zhongwencool Date: Thu, 22 Sep 2022 11:00:16 +0800 Subject: [PATCH 05/16] feat: add emqx_misc:ipv6_probe/2 function --- src/emqx.appup.src | 6 ++++++ src/emqx_misc.erl | 10 +++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/emqx.appup.src b/src/emqx.appup.src index 8a0a2d4ff..c7643fdfc 100644 --- a/src/emqx.appup.src +++ b/src/emqx.appup.src @@ -3,6 +3,7 @@ {VSN, [{"4.3.22", [{load_module,emqx,brutal_purge,soft_purge,[]}, + {load_module,emqx_misc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.21", [{load_module,emqx_alarm,brutal_purge,soft_purge,[]}, @@ -15,6 +16,7 @@ {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_tracer,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, + {load_module,emqx_misc,brutal_purge,soft_purge,[]}, {load_module,emqx,brutal_purge,soft_purge,[]}]}, {"4.3.20", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, @@ -29,6 +31,7 @@ {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_cm,brutal_purge,soft_purge,[]}, + {load_module,emqx_misc,brutal_purge,soft_purge,[]}, {load_module,emqx,brutal_purge,soft_purge,[]}]}, {"4.3.19", [{load_module,emqx_listeners,brutal_purge,soft_purge,[]}, @@ -828,6 +831,7 @@ {<<".*">>,[]}], [{"4.3.22", [{load_module,emqx,brutal_purge,soft_purge,[]}, + {load_module,emqx_misc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.21", [{load_module,emqx_alarm,brutal_purge,soft_purge,[]}, @@ -840,6 +844,7 @@ {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_tracer,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, + {load_module,emqx_misc,brutal_purge,soft_purge,[]}, {load_module,emqx,brutal_purge,soft_purge,[]}]}, {"4.3.20", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, @@ -854,6 +859,7 @@ {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_cm,brutal_purge,soft_purge,[]}, + {load_module,emqx_misc,brutal_purge,soft_purge,[]}, {load_module,emqx,brutal_purge,soft_purge,[]}]}, {"4.3.19", [{load_module,emqx_listeners,brutal_purge,soft_purge,[]}, diff --git a/src/emqx_misc.erl b/src/emqx_misc.erl index 813ab84e8..bfda5bb38 100644 --- a/src/emqx_misc.erl +++ b/src/emqx_misc.erl @@ -45,6 +45,7 @@ , index_of/2 , maybe_parse_ip/1 , ipv6_probe/1 + , ipv6_probe/2 ]). -export([ bin2hexstr_A_F/1 @@ -84,12 +85,15 @@ maybe_parse_ip(Host) -> %% @doc Add `ipv6_probe' socket option if it's supported. ipv6_probe(Opts) -> + ipv6_probe(Opts, true). + +ipv6_probe(Opts, Ipv6Probe) when is_boolean(Ipv6Probe) orelse is_integer(Ipv6Probe) -> Bool = try gen_tcp:ipv6_probe() catch _ : _ -> false end, - ipv6_probe(Bool, Opts). + ipv6_probe(Bool, Opts, Ipv6Probe). -ipv6_probe(false, Opts) -> Opts; -ipv6_probe(true, Opts) -> [{ipv6_probe, true} | Opts]. +ipv6_probe(false, Opts, _) -> Opts; +ipv6_probe(true, Opts, Ipv6Probe) -> [{ipv6_probe, Ipv6Probe} | Opts]. %% @doc Merge options -spec(merge_opts(Opts, Opts) -> Opts when Opts :: proplists:proplist()). From 27983e7df40b1deaaecaf4485eb23ae9c8ec3fb9 Mon Sep 17 00:00:00 2001 From: zhongwencool Date: Thu, 22 Sep 2022 14:24:59 +0800 Subject: [PATCH 06/16] chore: update emqx.appup.src --- src/emqx.appup.src | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/emqx.appup.src b/src/emqx.appup.src index c7643fdfc..16dfd1464 100644 --- a/src/emqx.appup.src +++ b/src/emqx.appup.src @@ -2,7 +2,16 @@ %% Unless you know what you are doing, DO NOT edit manually!! {VSN, [{"4.3.22", - [{load_module,emqx,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]}, + {load_module,emqx_tracer,brutal_purge,soft_purge,[]}, + {load_module,emqx_channel,brutal_purge,soft_purge,[]}, + {load_module,emqx_alarm,brutal_purge,soft_purge,[]}, + {load_module,emqx_cm,brutal_purge,soft_purge,[]}, + {load_module,emqx_router_helper,brutal_purge,soft_purge,[]}, + {load_module,emqx_router,brutal_purge,soft_purge,[]}, + {load_module,emqx_connection,brutal_purge,soft_purge,[]}, + {load_module,emqx,brutal_purge,soft_purge,[]}, {load_module,emqx_misc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.21", @@ -830,7 +839,16 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {<<".*">>,[]}], [{"4.3.22", - [{load_module,emqx,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]}, + {load_module,emqx_tracer,brutal_purge,soft_purge,[]}, + {load_module,emqx_channel,brutal_purge,soft_purge,[]}, + {load_module,emqx_alarm,brutal_purge,soft_purge,[]}, + {load_module,emqx_cm,brutal_purge,soft_purge,[]}, + {load_module,emqx_router_helper,brutal_purge,soft_purge,[]}, + {load_module,emqx_router,brutal_purge,soft_purge,[]}, + {load_module,emqx_connection,brutal_purge,soft_purge,[]}, + {load_module,emqx,brutal_purge,soft_purge,[]}, {load_module,emqx_misc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.21", From 9642f25ea0ec99dbe9afd27514785c605bcf398b Mon Sep 17 00:00:00 2001 From: zhongwencool Date: Thu, 22 Sep 2022 14:36:30 +0800 Subject: [PATCH 07/16] chore: update changelog --- CHANGES-4.3.md | 6 ++++-- src/emqx.app.src | 2 +- src/emqx.appup.src | 29 ++--------------------------- 3 files changed, 7 insertions(+), 30 deletions(-) diff --git a/CHANGES-4.3.md b/CHANGES-4.3.md index 2e2f5157c..737303c27 100644 --- a/CHANGES-4.3.md +++ b/CHANGES-4.3.md @@ -12,6 +12,10 @@ File format: ## v4.3.22 +### Minor changes +- Fix delayed publish inaccurate caused by os time change. [#8908](https://github.com/emqx/emqx/pull/8908) + + ## v4.3.21 ### Enhancements @@ -25,8 +29,6 @@ File format: - TLS listener default buffer size to 4KB [#9007](https://github.com/emqx/emqx/pull/9007) Eliminate uncertainty that the buffer size is set by OS default. -- Fix delayed publish inaccurate caused by os time change. [#8908](https://github.com/emqx/emqx/pull/8908) - - Disable authorization for `api/v4/emqx_prometheus` endpoint. [8955](https://github.com/emqx/emqx/pull/8955) - Added a test to prevent a last will testament message to be diff --git a/src/emqx.app.src b/src/emqx.app.src index 99715d1a2..433c75326 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.3.23"}, % strict semver, bump manually! + {vsn, "4.3.22"}, % strict semver, bump manually! {modules, []}, {registered, []}, {applications, [ kernel diff --git a/src/emqx.appup.src b/src/emqx.appup.src index 16dfd1464..4bca299a1 100644 --- a/src/emqx.appup.src +++ b/src/emqx.appup.src @@ -1,20 +1,7 @@ %% -*- mode: erlang -*- %% Unless you know what you are doing, DO NOT edit manually!! {VSN, - [{"4.3.22", - [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, - {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]}, - {load_module,emqx_tracer,brutal_purge,soft_purge,[]}, - {load_module,emqx_channel,brutal_purge,soft_purge,[]}, - {load_module,emqx_alarm,brutal_purge,soft_purge,[]}, - {load_module,emqx_cm,brutal_purge,soft_purge,[]}, - {load_module,emqx_router_helper,brutal_purge,soft_purge,[]}, - {load_module,emqx_router,brutal_purge,soft_purge,[]}, - {load_module,emqx_connection,brutal_purge,soft_purge,[]}, - {load_module,emqx,brutal_purge,soft_purge,[]}, - {load_module,emqx_misc,brutal_purge,soft_purge,[]}, - {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, - {"4.3.21", + [{"4.3.21", [{load_module,emqx_alarm,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}, @@ -838,19 +825,7 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {<<".*">>,[]}], - [{"4.3.22", - [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, - {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]}, - {load_module,emqx_tracer,brutal_purge,soft_purge,[]}, - {load_module,emqx_channel,brutal_purge,soft_purge,[]}, - {load_module,emqx_alarm,brutal_purge,soft_purge,[]}, - {load_module,emqx_cm,brutal_purge,soft_purge,[]}, - {load_module,emqx_router_helper,brutal_purge,soft_purge,[]}, - {load_module,emqx_router,brutal_purge,soft_purge,[]}, - {load_module,emqx_connection,brutal_purge,soft_purge,[]}, - {load_module,emqx,brutal_purge,soft_purge,[]}, - {load_module,emqx_misc,brutal_purge,soft_purge,[]}, - {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, + [ {"4.3.21", [{load_module,emqx_alarm,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, From deca9cc39505efb4276696b1ff2392b1cd3f5414 Mon Sep 17 00:00:00 2001 From: zhongwencool Date: Thu, 22 Sep 2022 16:09:42 +0800 Subject: [PATCH 08/16] chore: update changelog for delayed publish --- CHANGES-4.3.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGES-4.3.md b/CHANGES-4.3.md index 737303c27..eb5587d78 100644 --- a/CHANGES-4.3.md +++ b/CHANGES-4.3.md @@ -13,8 +13,6 @@ File format: ## v4.3.22 ### Minor changes -- Fix delayed publish inaccurate caused by os time change. [#8908](https://github.com/emqx/emqx/pull/8908) - ## v4.3.21 @@ -34,6 +32,10 @@ File format: - Added a test to prevent a last will testament message to be published when a client is denied connection. [#8894](https://github.com/emqx/emqx/pull/8894) +### Bug fixes + +- Fix delayed publish inaccurate caused by os time change. [#8908](https://github.com/emqx/emqx/pull/8908) + ## v4.3.20 ### Bug fixes From 7a26aae27b88537fc22638d82793f881bf3bd0db Mon Sep 17 00:00:00 2001 From: Ilya Averyanov Date: Thu, 22 Sep 2022 12:20:17 +0300 Subject: [PATCH 09/16] chore(retainer): sync retainer from release-e43 --- apps/emqx_retainer/src/emqx_retainer.app.src | 2 +- apps/emqx_retainer/src/emqx_retainer_sup.erl | 17 +++++++++++++++++ .../test/emqx_retainer_ct_helper.erl | 3 +++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/apps/emqx_retainer/src/emqx_retainer.app.src b/apps/emqx_retainer/src/emqx_retainer.app.src index 80ec02c73..dcc48fbae 100644 --- a/apps/emqx_retainer/src/emqx_retainer.app.src +++ b/apps/emqx_retainer/src/emqx_retainer.app.src @@ -1,6 +1,6 @@ {application, emqx_retainer, [{description, "EMQ X Retainer"}, - {vsn, "4.3.4"}, % strict semver, bump manually! + {vsn, "4.3.5"}, % strict semver, bump manually! {modules, []}, {registered, [emqx_retainer_sup]}, {applications, [kernel,stdlib]}, diff --git a/apps/emqx_retainer/src/emqx_retainer_sup.erl b/apps/emqx_retainer/src/emqx_retainer_sup.erl index 2028affb6..ca16a98bb 100644 --- a/apps/emqx_retainer/src/emqx_retainer_sup.erl +++ b/apps/emqx_retainer/src/emqx_retainer_sup.erl @@ -34,6 +34,23 @@ init([Env]) -> type => worker, modules => [emqx_retainer]} || not is_managed_by_modules()]}}. +-ifdef(EMQX_ENTERPRISE). + +is_managed_by_modules() -> + try + case supervisor:get_childspec(emqx_modules_sup, emqx_retainer) of + {ok, _} -> true; + _ -> false + end + catch + exit : {noproc, _} -> + false + end. + +-else. + is_managed_by_modules() -> %% always false for opensource edition false. + +-endif. diff --git a/apps/emqx_retainer/test/emqx_retainer_ct_helper.erl b/apps/emqx_retainer/test/emqx_retainer_ct_helper.erl index fd12a4e01..67f58ec26 100644 --- a/apps/emqx_retainer/test/emqx_retainer_ct_helper.erl +++ b/apps/emqx_retainer/test/emqx_retainer_ct_helper.erl @@ -20,7 +20,9 @@ -export([ensure_start/0, ensure_stop/0]). -ifdef(EMQX_ENTERPRISE). ensure_start() -> + %% for enterprise edition, retainer is started by modules application:stop(emqx_modules), + ensure_stop(), init_conf(), emqx_ct_helpers:start_apps([emqx_retainer]), ok. @@ -29,6 +31,7 @@ ensure_start() -> ensure_start() -> init_conf(), + ensure_stop(), emqx_ct_helpers:start_apps([emqx_retainer]), ok. From 1379f39f26583ca33e4a2652732364f0d3ad28ac Mon Sep 17 00:00:00 2001 From: zhongwencool Date: Thu, 22 Sep 2022 18:02:39 +0800 Subject: [PATCH 10/16] chore: sync from release-e4.3 --- src/emqx.appup.src | 20 ++++++++++++++++++++ src/emqx_http_lib.erl | 4 ++-- src/emqx_plugins.erl | 19 +++++++++++++++---- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/emqx.appup.src b/src/emqx.appup.src index 4bca299a1..dc255a221 100644 --- a/src/emqx.appup.src +++ b/src/emqx.appup.src @@ -13,6 +13,7 @@ {load_module,emqx_tracer,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_misc,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx,brutal_purge,soft_purge,[]}]}, {"4.3.20", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, @@ -28,6 +29,7 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_misc,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx,brutal_purge,soft_purge,[]}]}, {"4.3.19", [{load_module,emqx_listeners,brutal_purge,soft_purge,[]}, @@ -44,6 +46,7 @@ {load_module,emqx,brutal_purge,soft_purge,[]}, {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}]}, {"4.3.18", [{load_module,emqx_listeners,brutal_purge,soft_purge,[]}, @@ -60,6 +63,7 @@ {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_plugins,brutal_purge,soft_purge,[]}]}, {"4.3.17", [{load_module,emqx_listeners,brutal_purge,soft_purge,[]}, @@ -80,6 +84,7 @@ {update,emqx_broker_sup,supervisor}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]}]}, {"4.3.16", [{load_module,emqx_listeners,brutal_purge,soft_purge,[]}, @@ -107,6 +112,7 @@ {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_ctl,brutal_purge,soft_purge,[]}, {load_module,emqx_mqtt_caps,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_topic,brutal_purge,soft_purge,[]}]}, {"4.3.15", [{load_module,emqx_listeners,brutal_purge,soft_purge,[]}, @@ -141,6 +147,7 @@ {load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]}, {load_module,emqx_alarm,brutal_purge,soft_purge,[]}, {update,emqx_os_mon,{advanced,[]}}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.14", [{load_module,emqx_listeners,brutal_purge,soft_purge,[]}, @@ -177,6 +184,7 @@ {load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]}, {load_module,emqx_alarm,brutal_purge,soft_purge,[]}, {update,emqx_os_mon,{advanced,[]}}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_hooks,brutal_purge,soft_purge,[]}]}, {"4.3.13", [{load_module,emqx_router_helper,brutal_purge,soft_purge,[]}, @@ -216,6 +224,7 @@ {load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]}, {load_module,emqx_alarm,brutal_purge,soft_purge,[]}, {update,emqx_os_mon,{advanced,[]}}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}]}, {"4.3.12", [{load_module,emqx_router_helper,brutal_purge,soft_purge,[]}, @@ -258,6 +267,7 @@ {load_module,emqx,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.11", [{load_module,emqx_router_helper,brutal_purge,soft_purge,[]}, @@ -838,6 +848,7 @@ {load_module,emqx_tracer,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_misc,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx,brutal_purge,soft_purge,[]}]}, {"4.3.20", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, @@ -853,6 +864,7 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_misc,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx,brutal_purge,soft_purge,[]}]}, {"4.3.19", [{load_module,emqx_listeners,brutal_purge,soft_purge,[]}, @@ -869,6 +881,7 @@ {load_module,emqx,brutal_purge,soft_purge,[]}, {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}]}, {"4.3.18", [{load_module,emqx_listeners,brutal_purge,soft_purge,[]}, @@ -885,6 +898,7 @@ {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_plugins,brutal_purge,soft_purge,[]}]}, {"4.3.17", [{load_module,emqx_listeners,brutal_purge,soft_purge,[]}, @@ -905,6 +919,7 @@ {update,emqx_broker_sup,supervisor}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]}]}, {"4.3.16", [{load_module,emqx_listeners,brutal_purge,soft_purge,[]}, @@ -932,6 +947,7 @@ {load_module,emqx_mqtt_caps,brutal_purge,soft_purge,[]}, {load_module,emqx_topic,brutal_purge,soft_purge,[]}, {apply,{emqx_exclusive_subscription,on_delete_module,[]}}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {delete_module,emqx_exclusive_subscription}]}, {"4.3.15", [{load_module,emqx_listeners,brutal_purge,soft_purge,[]}, @@ -965,6 +981,7 @@ {load_module,emqx_access_rule,brutal_purge,soft_purge,[]}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_os_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.14", [{load_module,emqx_listeners,brutal_purge,soft_purge,[]}, @@ -1000,6 +1017,7 @@ {load_module,emqx_frame,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_os_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_hooks,brutal_purge,soft_purge,[]}]}, {"4.3.13", [{load_module,emqx_router_helper,brutal_purge,soft_purge,[]}, @@ -1038,6 +1056,7 @@ {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_ctl,brutal_purge,soft_purge,[]}, {load_module,emqx_cm,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}]}, {"4.3.12", [{load_module,emqx_router_helper,brutal_purge,soft_purge,[]}, @@ -1078,6 +1097,7 @@ {load_module,emqx,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.11", [{load_module,emqx_router_helper,brutal_purge,soft_purge,[]}, diff --git a/src/emqx_http_lib.erl b/src/emqx_http_lib.erl index 58f908041..8b73a572a 100644 --- a/src/emqx_http_lib.erl +++ b/src/emqx_http_lib.erl @@ -96,8 +96,8 @@ do_parse(URI) -> %% underscores replaced with hyphens %% NOTE: assuming the input Headers list is a proplists, %% that is, when a key is duplicated, list header overrides tail -%% e.g. [{"Content_Type", "applicaiton/binary"}, {<<"content-type">>, "applicaiton/json"}] -%% results in: [{"content-type", "applicaiton/binary"}] +%% e.g. [{"Content_Type", "applicaiton/binary"}, {"content-type", "applicaiton/json"}] +%% results in: [{<<"content-type">>, "applicaiton/binary"}] normalise_headers(Headers0) -> F = fun({K0, V}) -> K = re:replace(K0, "_", "-", [{return,binary}]), diff --git a/src/emqx_plugins.erl b/src/emqx_plugins.erl index a01dc2a5b..0a25e0102 100644 --- a/src/emqx_plugins.erl +++ b/src/emqx_plugins.erl @@ -24,6 +24,7 @@ -export([init/0]). -export([ load/0 + , force_load/0 , load/1 , unload/0 , unload/1 @@ -59,12 +60,17 @@ init() -> %% @doc Load all plugins when the broker started. -spec(load() -> ok | ignore | {error, term()}). load() -> + do_load(#{force_load => false}). +force_load() -> + do_load(#{force_load => true}). + +do_load(Options) -> ok = load_ext_plugins(emqx:get_env(expand_plugins_dir)), case emqx:get_env(plugins_loaded_file) of undefined -> ignore; %% No plugins available File -> _ = ensure_file(File), - with_loaded_file(File, fun(Names) -> load_plugins(Names, false) end) + with_loaded_file(File, fun(Names) -> load_plugins(Names, Options, false) end) end. %% @doc Load a Plugin @@ -282,18 +288,23 @@ filter_plugins([{Name, Load} | Names], Plugins) -> filter_plugins([Name | Names], Plugins) when is_atom(Name) -> filter_plugins([{Name, true} | Names], Plugins). -load_plugins(Names, Persistent) -> +load_plugins(Names, Options, Persistent) -> Plugins = list(), NotFound = Names -- names(Plugins), case NotFound of [] -> ok; NotFound -> ?LOG(alert, "cannot_find_plugins: ~p", [NotFound]) end, - NeedToLoad = (Names -- NotFound) -- names(started_app), + NeedToLoad0 = Names -- NotFound, + NeedToLoad1 = + case Options of + #{force_load := true} -> NeedToLoad0; + _ -> NeedToLoad0 -- names(started_app) + end, lists:foreach(fun(Name) -> Plugin = find_plugin(Name, Plugins), load_plugin(Plugin#plugin.name, Persistent) - end, NeedToLoad). + end, NeedToLoad1). generate_configs(App) -> ConfigFile = filename:join([emqx:get_env(plugins_etc_dir), App]) ++ ".config", From c05ce82933f2667a390927a637acdba9b28fc1b7 Mon Sep 17 00:00:00 2001 From: JianBo He Date: Tue, 29 Mar 2022 12:09:19 +0800 Subject: [PATCH 11/16] refactor(psk): create the ets table in supervisor process --- apps/emqx_psk_file/include/emqx_psk_file.hrl | 25 +++++++++++++++++++ apps/emqx_psk_file/src/emqx_psk_file.app.src | 2 +- .../emqx_psk_file/src/emqx_psk_file.appup.src | 10 ++++++++ apps/emqx_psk_file/src/emqx_psk_file.erl | 12 ++++----- apps/emqx_psk_file/src/emqx_psk_file_sup.erl | 7 +++++- 5 files changed, 47 insertions(+), 9 deletions(-) create mode 100644 apps/emqx_psk_file/include/emqx_psk_file.hrl create mode 100644 apps/emqx_psk_file/src/emqx_psk_file.appup.src diff --git a/apps/emqx_psk_file/include/emqx_psk_file.hrl b/apps/emqx_psk_file/include/emqx_psk_file.hrl new file mode 100644 index 000000000..fe8ed1f94 --- /dev/null +++ b/apps/emqx_psk_file/include/emqx_psk_file.hrl @@ -0,0 +1,25 @@ +%%-------------------------------------------------------------------- +%% 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. +%%-------------------------------------------------------------------- + +-ifndef(EMQX_PSK_FILE). +-define(EMQX_PSK_FILE, true). + +-define(PSK_FILE_TAB, emqx_psk_file). + +-record(psk_entry, {psk_id :: binary(), + psk_str :: binary()}). + +-endif. diff --git a/apps/emqx_psk_file/src/emqx_psk_file.app.src b/apps/emqx_psk_file/src/emqx_psk_file.app.src index b8a6f08a0..ef18c8b69 100644 --- a/apps/emqx_psk_file/src/emqx_psk_file.app.src +++ b/apps/emqx_psk_file/src/emqx_psk_file.app.src @@ -1,6 +1,6 @@ {application, emqx_psk_file, [{description,"EMQX PSK Plugin from File"}, - {vsn, "4.3.0"}, % strict semver, bump manually! + {vsn, "4.3.1"}, % strict semver, bump manually! {modules,[]}, {registered,[emqx_psk_file_sup]}, {applications,[kernel,stdlib]}, diff --git a/apps/emqx_psk_file/src/emqx_psk_file.appup.src b/apps/emqx_psk_file/src/emqx_psk_file.appup.src new file mode 100644 index 000000000..c782000b5 --- /dev/null +++ b/apps/emqx_psk_file/src/emqx_psk_file.appup.src @@ -0,0 +1,10 @@ +%% -*- mode: erlang -*- +{VSN, + [{"4.3.0", + [{load_module,emqx_psk_file,brutal_purge,soft_purge,[]}, + {load_module,emqx_psk_file_sup,brutal_purge,soft_purge,[]}]} + ], + [{"4.3.0", + [{load_module,emqx_psk_file,brutal_purge,soft_purge,[]}, + {load_module,emqx_psk_file_sup,brutal_purge,soft_purge,[]}]} + ]}. diff --git a/apps/emqx_psk_file/src/emqx_psk_file.erl b/apps/emqx_psk_file/src/emqx_psk_file.erl index b4daee370..e252393c4 100644 --- a/apps/emqx_psk_file/src/emqx_psk_file.erl +++ b/apps/emqx_psk_file/src/emqx_psk_file.erl @@ -16,6 +16,7 @@ -module(emqx_psk_file). +-include("emqx_psk_file.hrl"). -include_lib("emqx/include/emqx.hrl"). -include_lib("emqx/include/logger.hrl"). @@ -26,15 +27,10 @@ %% Hooks functions -export([on_psk_lookup/2]). --define(TAB, ?MODULE). -define(LF, 10). --record(psk_entry, {psk_id :: binary(), - psk_str :: binary()}). - %% Called when the plugin application start load(Env) -> - _ = ets:new(?TAB, [set, named_table, {keypos, #psk_entry.psk_id}]), {ok, PskFile} = file:open(get_value(path, Env), [read, raw, binary, read_ahead]), preload_psks(PskFile, bin(get_value(delimiter, Env))), _ = file:close(PskFile), @@ -45,7 +41,7 @@ unload() -> emqx:unhook('tls_handshake.psk_lookup', fun ?MODULE:on_psk_lookup/2). on_psk_lookup(ClientPSKID, UserState) -> - case ets:lookup(?TAB, ClientPSKID) of + case ets:lookup(?PSK_FILE_TAB, ClientPSKID) of [#psk_entry{psk_str = PskStr}] -> {stop, PskStr}; [] -> @@ -57,7 +53,9 @@ preload_psks(FileHandler, Delimiter) -> {ok, Line} -> case binary:split(Line, Delimiter) of [Key, Rem] -> - ets:insert(?TAB, #psk_entry{psk_id = Key, psk_str = trim_lf(Rem)}), + ets:insert( + ?PSK_FILE_TAB, + #psk_entry{psk_id = Key, psk_str = trim_lf(Rem)}), preload_psks(FileHandler, Delimiter); [Line] -> ?LOG(warning, "[~p] - Invalid line: ~p, delimiter: ~p", [?MODULE, Line, Delimiter]) diff --git a/apps/emqx_psk_file/src/emqx_psk_file_sup.erl b/apps/emqx_psk_file/src/emqx_psk_file_sup.erl index 2e739519c..e643c000a 100644 --- a/apps/emqx_psk_file/src/emqx_psk_file_sup.erl +++ b/apps/emqx_psk_file/src/emqx_psk_file_sup.erl @@ -16,6 +16,8 @@ -module(emqx_psk_file_sup). +-include("emqx_psk_file.hrl"). + -behaviour(supervisor). %% API @@ -25,8 +27,11 @@ -export([init/1]). start_link() -> + _ = ets:new( + ?PSK_FILE_TAB, + [set, named_table, public, {keypos, #psk_entry.psk_id}] + ), supervisor:start_link({local, ?MODULE}, ?MODULE, []). init([]) -> {ok, { {one_for_one, 0, 1}, []} }. - From 0ac78734bdfa62b6be7959770f567628679e8d19 Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Sun, 25 Sep 2022 14:17:49 +0200 Subject: [PATCH 12/16] build(update_appup.escript): allow external app non-semver --- scripts/update_appup.escript | 50 +++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/scripts/update_appup.escript b/scripts/update_appup.escript index f5fb15898..183888817 100755 --- a/scripts/update_appup.escript +++ b/scripts/update_appup.escript @@ -62,7 +62,8 @@ app_specific_actions(_) -> ignored_apps() -> [gpb, %% only a build tool emqx_dashboard, %% generic appup file for all versions - emqx_management %% generic appup file for all versions + emqx_management, %% generic appup file for all versions + emqx_modules_spec %% generic appup file for all versions ] ++ otp_standard_apps(). main(Args) -> @@ -284,9 +285,9 @@ merge_update_actions(App, Changes, Vsns, PrevVersion) -> %% but there is a 1.1.2 in appup we may skip merging instructions for %% 1.1.2 because it's not used and no way to know what has been changed is_skipped_version(App, Vsn, PrevVersion) when is_list(Vsn) andalso is_list(PrevVersion) -> - case is_app_external(App) andalso parse_version_number(Vsn) of + case is_app_external(App) andalso parse_version(Vsn, non_strict_semver) of {ok, VsnTuple} -> - case parse_version_number(PrevVersion) of + case parse_version(PrevVersion, non_strict_semver) of {ok, PrevVsnTuple} -> VsnTuple > PrevVsnTuple; _ -> @@ -397,7 +398,7 @@ contains_version(Needle, Haystack) when is_list(Needle) -> %% past versions that should be covered by regexes in .appup file %% instructions. enumerate_past_versions(Vsn) when is_list(Vsn) -> - case parse_version_number(Vsn) of + case parse_version(Vsn) of {ok, ParsedVsn} -> {ok, enumerate_past_versions(ParsedVsn)}; Error -> @@ -406,14 +407,39 @@ enumerate_past_versions(Vsn) when is_list(Vsn) -> enumerate_past_versions({Major, Minor, Patch}) -> [{Major, Minor, P} || P <- lists:seq(Patch - 1, 0, -1)]. -parse_version_number(Vsn) when is_list(Vsn) -> - Nums = string:split(Vsn, ".", all), - Results = lists:map(fun string:to_integer/1, Nums), - case Results of - [{Major, []}, {Minor, []}, {Patch, []}] -> - {ok, {Major, Minor, Patch}}; - _ -> - {error, bad_version} +parse_version(Vsn) -> + parse_version(Vsn, strict_semver). + +parse_version(Vsn, MaybeSemver) when is_list(Vsn) -> + case parse_dot_separated_numbers(Vsn) of + {ok, {_Major, _Minor, _Patch}} = Res -> + Res; + {ok, Nums} -> + case MaybeSemver of + strict_semver -> + {error, {bad_semver, Vsn}}; + non_strict_semver -> + {ok, Nums} + end; + {error, Reason} -> + {error, {Reason, Vsn}} + end. + +parse_dot_separated_numbers(Str) when is_list(Str) -> + try + Split = string:split(Str, ".", all), + IntL = lists:map(fun(SubStr) -> + case string:to_integer(SubStr) of + {Int, []} when is_integer(Int) -> + Int; + _ -> + throw(no_integer) + end + end, Split), + {ok, list_to_tuple(IntL)} + catch + _ : _ -> + {error, bad_version_string} end. vsn_number_to_string({Major, Minor, Patch}) -> From 2e0eae54f827d9ab8281c686e1518d6f9f85c7d6 Mon Sep 17 00:00:00 2001 From: Thales Macedo Garitezi Date: Mon, 26 Sep 2022 10:06:27 -0300 Subject: [PATCH 13/16] fix(acl): check ACL before publishing last will testament (lwt) message (4.3) --- .../test/emqx_acl_mnesia_SUITE.erl | 56 ++++++++++++++++++- src/emqx_channel.erl | 34 +++++++---- 2 files changed, 78 insertions(+), 12 deletions(-) diff --git a/apps/emqx_auth_mnesia/test/emqx_acl_mnesia_SUITE.erl b/apps/emqx_auth_mnesia/test/emqx_acl_mnesia_SUITE.erl index 941ebedb9..213f9c278 100644 --- a/apps/emqx_auth_mnesia/test/emqx_acl_mnesia_SUITE.erl +++ b/apps/emqx_auth_mnesia/test/emqx_acl_mnesia_SUITE.erl @@ -20,6 +20,7 @@ -compile(export_all). -include("emqx_auth_mnesia.hrl"). +-include_lib("emqx/include/emqx.hrl"). -include_lib("eunit/include/eunit.hrl"). -include_lib("common_test/include/ct.hrl"). -include_lib("snabbkaffe/include/snabbkaffe.hrl"). @@ -77,15 +78,37 @@ init_per_testcase_migration(_, Config) -> emqx_acl_mnesia_migrator:migrate_records(), Config. +init_per_testcase_other(t_last_will_testament_message_check_acl, Config) -> + OriginalACLNoMatch = application:get_env(emqx, acl_nomatch), + application:set_env(emqx, acl_nomatch, deny), + emqx_mod_acl_internal:unload([]), + %% deny all for this client + ClientID = <<"lwt_client">>, + ok = emqx_acl_mnesia_db:add_acl({clientid, ClientID}, <<"#">>, pubsub, deny), + [ {original_acl_nomatch, OriginalACLNoMatch} + , {clientid, ClientID} + | Config]; +init_per_testcase_other(_TestCase, Config) -> + Config. + init_per_testcase(Case, Config) -> PerTestInitializers = [ fun init_per_testcase_clean/2, fun init_per_testcase_migration/2, - fun init_per_testcase_emqx_hook/2 + fun init_per_testcase_emqx_hook/2, + fun init_per_testcase_other/2 ], lists:foldl(fun(Init, Conf) -> Init(Case, Conf) end, Config, PerTestInitializers). -end_per_testcase(_, Config) -> +end_per_testcase(t_last_will_testament_message_check_acl, Config) -> + emqx:unhook('client.check_acl', fun emqx_acl_mnesia:check_acl/5), + case ?config(original_acl_nomatch, Config) of + {ok, Original} -> application:set_env(emqx, acl_nomatch, Original); + _ -> ok + end, + emqx_mod_acl_internal:load([]), + ok; +end_per_testcase(_TestCase, Config) -> emqx:unhook('client.check_acl', fun emqx_acl_mnesia:check_acl/5), Config. @@ -464,6 +487,35 @@ t_rest_api(_Config) -> {ok, Res3} = request_http_rest_list(["$all"]), ?assertMatch([], get_http_data(Res3)). +%% asserts that we check ACL for the LWT topic before publishing the +%% LWT. +t_last_will_testament_message_check_acl(Config) -> + ClientID = ?config(clientid, Config), + {ok, C} = emqtt:start_link([ + {clientid, ClientID}, + {will_topic, <<"$SYS/lwt">>}, + {will_payload, <<"should not be published">>} + ]), + {ok, _} = emqtt:connect(C), + ok = emqx:subscribe(<<"$SYS/lwt">>), + unlink(C), + ok = snabbkaffe:start_trace(), + {true, {ok, _}} = + ?wait_async_action( + exit(C, kill), + #{?snk_kind := last_will_testament_publish_denied}, + 1_000 + ), + ok = snabbkaffe:stop(), + + receive + {deliver, <<"$SYS/lwt">>, #message{payload = <<"should not be published">>}} -> + error(lwt_should_not_be_published_to_forbidden_topic) + after 1_000 -> + ok + end, + + ok. create_conflicting_records() -> Records = [ diff --git a/src/emqx_channel.erl b/src/emqx_channel.erl index 5ac212678..b8f3c5b2c 100644 --- a/src/emqx_channel.erl +++ b/src/emqx_channel.erl @@ -951,9 +951,10 @@ return_sub_unsub_ack(Packet, Channel) -> handle_call(kick, Channel = #channel{ conn_state = ConnState, will_msg = WillMsg, + clientinfo = ClientInfo, conninfo = #{proto_ver := ProtoVer} }) -> - (WillMsg =/= undefined) andalso publish_will_msg(WillMsg), + (WillMsg =/= undefined) andalso publish_will_msg(ClientInfo, WillMsg), Channel1 = case ConnState of connected -> ensure_disconnected(kicked, Channel); _ -> Channel @@ -1102,8 +1103,9 @@ handle_timeout(_TRef, expire_awaiting_rel, handle_timeout(_TRef, expire_session, Channel) -> shutdown(expired, Channel); -handle_timeout(_TRef, will_message, Channel = #channel{will_msg = WillMsg}) -> - (WillMsg =/= undefined) andalso publish_will_msg(WillMsg), +handle_timeout(_TRef, will_message, Channel = #channel{will_msg = WillMsg, + clientinfo = ClientInfo}) -> + (WillMsg =/= undefined) andalso publish_will_msg(ClientInfo, WillMsg), {ok, clean_timer(will_timer, Channel#channel{will_msg = undefined})}; handle_timeout(_TRef, expire_quota_limit, Channel) -> @@ -1159,9 +1161,10 @@ terminate(_Reason, #channel{conn_state = idle} = _Channel) -> ok; terminate(normal, Channel) -> run_terminate_hook(normal, Channel); -terminate(Reason, Channel = #channel{will_msg = WillMsg}) -> +terminate(Reason, Channel = #channel{will_msg = WillMsg, + clientinfo = ClientInfo}) -> should_publish_will_message(Reason, Channel) - andalso publish_will_msg(WillMsg), + andalso publish_will_msg(ClientInfo, WillMsg), run_terminate_hook(Reason, Channel). run_terminate_hook(_Reason, #channel{session = undefined} = _Channel) -> @@ -1701,10 +1704,11 @@ ensure_disconnected(Reason, Channel = #channel{conninfo = ConnInfo, maybe_publish_will_msg(Channel = #channel{will_msg = undefined}) -> Channel; -maybe_publish_will_msg(Channel = #channel{will_msg = WillMsg}) -> +maybe_publish_will_msg(Channel = #channel{will_msg = WillMsg, + clientinfo = ClientInfo}) -> case will_delay_interval(WillMsg) of 0 -> - ok = publish_will_msg(WillMsg), + ok = publish_will_msg(ClientInfo, WillMsg), Channel#channel{will_msg = undefined}; I -> ensure_timer(will_timer, timer:seconds(I), Channel) @@ -1714,9 +1718,19 @@ will_delay_interval(WillMsg) -> maps:get('Will-Delay-Interval', emqx_message:get_header(properties, WillMsg, #{}), 0). -publish_will_msg(Msg) -> - _ = emqx_broker:publish(Msg), - ok. +publish_will_msg(ClientInfo, Msg = #message{topic = Topic}) -> + case emqx_access_control:check_acl(ClientInfo, publish, Topic) of + allow -> + _ = emqx_broker:publish(Msg), + ok; + deny -> + ?tp( + warning, + last_will_testament_publish_denied, + #{topic => Topic} + ), + ok + end. %%-------------------------------------------------------------------- %% Disconnect Reason From a7709838824bc5650de2e808d2d282476f282fa0 Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Tue, 27 Sep 2022 08:36:25 +0200 Subject: [PATCH 14/16] fix(bin/emqx): allow space in root path Prior to this fix, space was already allowed in root path for 'start' 'console' etc. (the boot commands). However the non-boot commands such as 'ping' still had trouble. --- bin/emqx | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/bin/emqx b/bin/emqx index 306efe527..82eb90e16 100755 --- a/bin/emqx +++ b/bin/emqx @@ -481,6 +481,16 @@ case "$1" in ;; esac +if [ "$IS_BOOT_COMMAND" = 'no' ]; then + # for non-boot commands, inspect vm.