From 278fa96bc1e9a124b833ab2e46601740957cb975 Mon Sep 17 00:00:00 2001 From: DDDHuang <44492639+DDDHuang@users.noreply.github.com> Date: Thu, 3 Mar 2022 15:26:13 +0800 Subject: [PATCH 1/7] fix(plugins): usort plugin list --- CHANGES-4.3.md | 1 + src/emqx.appup.src | 72 +++++++++++++++++++++++++++++--------------- src/emqx_plugins.erl | 24 ++++++++++++--- 3 files changed, 69 insertions(+), 28 deletions(-) diff --git a/CHANGES-4.3.md b/CHANGES-4.3.md index 7f6d2b5a3..2dd729105 100644 --- a/CHANGES-4.3.md +++ b/CHANGES-4.3.md @@ -37,6 +37,7 @@ File format: * Fix system memory false alarm at boot * Fix the MQTT-SN message replay when the topic is not registered to the client [#6970] * Fix rpc get node info maybe crash when other nodes is not ready. +* Fix abnormal logs caused by duplicate plugin names in loaded_plugins files. ## v4.3.12 ### Important changes diff --git a/src/emqx.appup.src b/src/emqx.appup.src index c69f104e3..76d54655b 100644 --- a/src/emqx.appup.src +++ b/src/emqx.appup.src @@ -1,7 +1,8 @@ %% -*- mode: erlang -*- {VSN, [{"4.3.13", - [{load_module,emqx_connection,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, @@ -12,7 +13,8 @@ {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}]}, {"4.3.12", - [{load_module,emqx_connection,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, @@ -32,7 +34,8 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.11", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, @@ -55,7 +58,8 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.10", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, @@ -78,7 +82,8 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.9", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, @@ -105,7 +110,8 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.8", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, @@ -132,7 +138,8 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.7", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, @@ -161,7 +168,8 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.6", - [{load_module,emqx_pmon,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, @@ -190,7 +198,8 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.5", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, @@ -220,7 +229,8 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.4", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, @@ -251,7 +261,8 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.3", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, @@ -283,7 +294,8 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.2", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, @@ -391,7 +403,8 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {<<".*">>,[]}], [{"4.3.13", - [{load_module,emqx_app,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, @@ -402,7 +415,8 @@ {load_module,emqx_os_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}]}, {"4.3.12", - [{load_module,emqx_connection,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, @@ -421,7 +435,8 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.11", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, @@ -443,7 +458,8 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.10", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, @@ -465,7 +481,8 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.9", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, @@ -491,7 +508,8 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.8", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, @@ -517,7 +535,8 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.7", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, @@ -545,7 +564,8 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.6", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, @@ -573,7 +593,8 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.5", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, @@ -602,7 +623,8 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.4", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, @@ -632,7 +654,8 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.3", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, @@ -663,7 +686,8 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.2", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, diff --git a/src/emqx_plugins.erl b/src/emqx_plugins.erl index 6ef3d2d21..01c389413 100644 --- a/src/emqx_plugins.erl +++ b/src/emqx_plugins.erl @@ -228,10 +228,26 @@ with_loaded_file(File, SuccFun) -> end. filter_plugins(Names) -> - lists:filtermap(fun(Name1) when is_atom(Name1) -> {true, Name1}; - ({Name1, true}) -> {true, Name1}; - ({_Name1, false}) -> false - end, Names). + Filter = + fun + ({Name, true}) when is_atom(Name) -> + {true, Name}; + (Name) when is_atom(Name) -> + {true, Name}; + (_) -> + false + end, + filter_plugins(lists:filtermap(Filter, Names), []). + +filter_plugins([], Plugins) -> + lists:reverse(Plugins); +filter_plugins([Name | Names], Plugins) -> + case lists:member(Name, Plugins) of + true -> + filter_plugins(Names, Plugins); + false -> + filter_plugins(Names, [Name | Plugins]) + end. load_plugins(Names, Persistent) -> Plugins = list(), From 0a6e2d596b731f9fe0157373c354eab6164bfd6c Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Sat, 5 Mar 2022 11:49:44 +0100 Subject: [PATCH 2/7] build: fix update-appup for ee --- scripts/update-appup.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/scripts/update-appup.sh b/scripts/update-appup.sh index db0759695..11cef1ab0 100755 --- a/scripts/update-appup.sh +++ b/scripts/update-appup.sh @@ -59,5 +59,10 @@ fi PACKAGE_NAME="${PROFILE}-${SYSTEM}-${PREV_VERSION}-${ARCH}.zip" DOWNLOAD_URL="https://www.emqx.com/downloads/${DIR}/v${PREV_VERSION}/${PACKAGE_NAME}" +if [ ! -f EMQX_ENTERPRISE ]; then + SRC_DIRS='{src,apps,lib-ce}/**' +else + SRC_DIRS='{src,apps,lib-ee}/**' +fi # shellcheck disable=SC2086 -./scripts/update_appup.escript --make-command "make ${PROFILE}-rel" --binary-rel-url "$DOWNLOAD_URL" $ESCRIPT_ARGS "$PREV_VERSION" +./scripts/update_appup.escript --make-command "make ${PROFILE}-rel" --binary-rel-url "$DOWNLOAD_URL" --release-dir "_build/${PROFILE}/rel/emqx/lib" --src-dirs "${SRC_DIRS}" $ESCRIPT_ARGS "$PREV_VERSION" From 1ae46cc22a11276314640a241659529002596e6e Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Sat, 5 Mar 2022 16:49:58 +0100 Subject: [PATCH 3/7] build(appup): exclude gpb from appup checks --- scripts/update_appup.escript | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/update_appup.escript b/scripts/update_appup.escript index b84e210fa..a8d9d4828 100755 --- a/scripts/update_appup.escript +++ b/scripts/update_appup.escript @@ -531,6 +531,7 @@ index_app(AppFile) -> , modules = Modules }}. +diff_app(_, gpb, _, _) -> ok; %% gpb is not a runtime app diff_app(UpOrDown, App, #app{version = NewVersion, modules = NewModules}, #app{version = OldVersion, modules = OldModules}) -> From 111b93b4ea4f03385ed5d741be3414be7edf92dd Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Sat, 5 Mar 2022 17:24:49 +0100 Subject: [PATCH 4/7] fix(update-appup): pass in --repo option even when download bin package the repo url is NOT used to clone the source, but used to determin the sub-dir name when extracting the zip package --- scripts/update-appup.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/scripts/update-appup.sh b/scripts/update-appup.sh index 11cef1ab0..d70bfcf21 100755 --- a/scripts/update-appup.sh +++ b/scripts/update-appup.sh @@ -60,9 +60,17 @@ PACKAGE_NAME="${PROFILE}-${SYSTEM}-${PREV_VERSION}-${ARCH}.zip" DOWNLOAD_URL="https://www.emqx.com/downloads/${DIR}/v${PREV_VERSION}/${PACKAGE_NAME}" if [ ! -f EMQX_ENTERPRISE ]; then + SRC_REPO='emqx.git' SRC_DIRS='{src,apps,lib-ce}/**' else + SRC_REPO='emqx-enterprise.git' SRC_DIRS='{src,apps,lib-ee}/**' fi # shellcheck disable=SC2086 -./scripts/update_appup.escript --make-command "make ${PROFILE}-rel" --binary-rel-url "$DOWNLOAD_URL" --release-dir "_build/${PROFILE}/rel/emqx/lib" --src-dirs "${SRC_DIRS}" $ESCRIPT_ARGS "$PREV_VERSION" +./scripts/update_appup.escript \ + --make-command "make ${PROFILE}-rel" \ + --binary-rel-url "$DOWNLOAD_URL" \ + --repo "$SRC_REPO" \ + --release-dir "_build/${PROFILE}/rel/emqx/lib" \ + --src-dirs "${SRC_DIRS}" \ + $ESCRIPT_ARGS "$PREV_VERSION" From 7884238073cb14c476ea60a08b5f1cd15c5afda7 Mon Sep 17 00:00:00 2001 From: DDDHuang <44492639+DDDHuang@users.noreply.github.com> Date: Mon, 7 Mar 2022 09:53:19 +0800 Subject: [PATCH 5/7] fix(doc): better change log Co-authored-by: Zaiming (Stone) Shi --- CHANGES-4.3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES-4.3.md b/CHANGES-4.3.md index 2dd729105..9063c7129 100644 --- a/CHANGES-4.3.md +++ b/CHANGES-4.3.md @@ -37,7 +37,7 @@ File format: * Fix system memory false alarm at boot * Fix the MQTT-SN message replay when the topic is not registered to the client [#6970] * Fix rpc get node info maybe crash when other nodes is not ready. -* Fix abnormal logs caused by duplicate plugin names in loaded_plugins files. +* Fix false alert level log “cannot_find_plugins” caused by duplicate plugin names in `loaded_plugins` files. ## v4.3.12 ### Important changes From fbd70b02bcc1aee9d5d956a209b606c310a1a12c Mon Sep 17 00:00:00 2001 From: DDDHuang <44492639+DDDHuang@users.noreply.github.com> Date: Mon, 7 Mar 2022 10:32:49 +0800 Subject: [PATCH 6/7] fix: override plugins list --- src/emqx_plugins.erl | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/src/emqx_plugins.erl b/src/emqx_plugins.erl index 01c389413..7c4633e38 100644 --- a/src/emqx_plugins.erl +++ b/src/emqx_plugins.erl @@ -228,26 +228,21 @@ with_loaded_file(File, SuccFun) -> end. filter_plugins(Names) -> - Filter = - fun - ({Name, true}) when is_atom(Name) -> - {true, Name}; - (Name) when is_atom(Name) -> - {true, Name}; - (_) -> - false - end, - filter_plugins(lists:filtermap(Filter, Names), []). + filter_plugins(Names, []). filter_plugins([], Plugins) -> lists:reverse(Plugins); -filter_plugins([Name | Names], Plugins) -> - case lists:member(Name, Plugins) of - true -> - filter_plugins(Names, Plugins); - false -> - filter_plugins(Names, [Name | Plugins]) - end. +filter_plugins([{Name, Load} | Names], Plugins) -> + case {Load, lists:member(Name, Plugins)} of + {true, false} -> + filter_plugins(Names, [Name | Plugins]); + {false, true} -> + filter_plugins(Names, Plugins -- [Name]); + _ -> + filter_plugins(Names, Plugins) + end; +filter_plugins([Name | Names], Plugins) when is_atom(Name) -> + filter_plugins([{Name, true} | Names], Plugins). load_plugins(Names, Persistent) -> Plugins = list(), From d8e29f19cbb775e88d5f795f1055be32d3e03d12 Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Mon, 7 Mar 2022 19:43:55 +0100 Subject: [PATCH 7/7] refactor(appup): always generate appup from script --- .../src/emqx_auth_mnesia.appup.src | 19 +- .../src/emqx_bridge_mqtt.appup.src | 10 +- scripts/update-appup.sh | 78 +++-- scripts/update_appup.escript | 289 +++++++++--------- src/emqx.appup.src | 105 +++---- 5 files changed, 271 insertions(+), 230 deletions(-) diff --git a/apps/emqx_auth_mnesia/src/emqx_auth_mnesia.appup.src b/apps/emqx_auth_mnesia/src/emqx_auth_mnesia.appup.src index 46b3c8312..f4c6ebadd 100644 --- a/apps/emqx_auth_mnesia/src/emqx_auth_mnesia.appup.src +++ b/apps/emqx_auth_mnesia/src/emqx_auth_mnesia.appup.src @@ -1,6 +1,10 @@ %% -*- mode: erlang -*- +%% Unless you know what you are doing, DO NOT edit manually!! {VSN, - [{<<"4.3.[0-3]">>, + [{"4.3.5", + [{load_module,emqx_auth_mnesia_api,brutal_purge,soft_purge,[]}, + {load_module,emqx_auth_mnesia,brutal_purge,soft_purge,[]}]}, + {<<"4\\.3\\.[0-3]">>, [{load_module,emqx_auth_mnesia_cli,brutal_purge,soft_purge,[]}, {load_module,emqx_auth_mnesia,brutal_purge,soft_purge,[]}, {add_module,emqx_acl_mnesia_db}, @@ -12,17 +16,17 @@ {load_module,emqx_auth_mnesia_app,brutal_purge,soft_purge,[]}, {load_module,emqx_acl_mnesia_api,brutal_purge,soft_purge,[]}, {load_module,emqx_acl_mnesia_cli,brutal_purge,soft_purge,[]}]}, - {<<"4.3.4">>, + {"4.3.4", [{load_module,emqx_auth_mnesia_api,brutal_purge,soft_purge,[]}, {load_module,emqx_auth_mnesia,brutal_purge,soft_purge,[]}, {load_module,emqx_auth_mnesia_cli,brutal_purge,soft_purge,[]}, {load_module,emqx_acl_mnesia,brutal_purge,soft_purge,[]}, {load_module,emqx_auth_mnesia_app,brutal_purge,soft_purge,[]}]}, - {<<"4.3.5">>, + {<<".*">>,[]}], + [{"4.3.5", [{load_module,emqx_auth_mnesia_api,brutal_purge,soft_purge,[]}, {load_module,emqx_auth_mnesia,brutal_purge,soft_purge,[]}]}, - {<<".*">>,[]}], - [{<<"4.3.[0-3]">>, + {<<"4\\.3\\.[0-3]">>, [{load_module,emqx_auth_mnesia_cli,brutal_purge,soft_purge,[]}, {load_module,emqx_auth_mnesia,brutal_purge,soft_purge,[]}, {apply,{emqx_acl_mnesia_migrator,stop_supervised,[]}}, @@ -34,13 +38,10 @@ {load_module,emqx_auth_mnesia_app,brutal_purge,soft_purge,[]}, {delete_module,emqx_acl_mnesia_migrator}, {delete_module,emqx_acl_mnesia_db}]}, - {<<"4.3.4">>, + {"4.3.4", [{load_module,emqx_auth_mnesia_api,brutal_purge,soft_purge,[]}, {load_module,emqx_auth_mnesia,brutal_purge,soft_purge,[]}, {load_module,emqx_auth_mnesia_cli,brutal_purge,soft_purge,[]}, {load_module,emqx_acl_mnesia,brutal_purge,soft_purge,[]}, {load_module,emqx_auth_mnesia_app,brutal_purge,soft_purge,[]}]}, - {<<"4.3.5">>, - [{load_module,emqx_auth_mnesia_api,brutal_purge,soft_purge,[]}, - {load_module,emqx_auth_mnesia,brutal_purge,soft_purge,[]}]}, {<<".*">>,[]}]}. diff --git a/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt.appup.src b/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt.appup.src index 21fc2d8b1..fdf2dec81 100644 --- a/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt.appup.src +++ b/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt.appup.src @@ -2,10 +2,10 @@ {"4.3.4", [ - {<<"4.3.3">>, [ + {"4.3.3", [ {load_module, emqx_bridge_mqtt, brutal_purge, soft_purge, []} ]}, - {<<"4.3.[1-2]">>, [ + {<<"4\\.3\\.[1-2]">>, [ {load_module, emqx_bridge_mqtt, brutal_purge, soft_purge, []}, {load_module, emqx_bridge_mqtt_actions, brutal_purge, soft_purge, []} ]}, @@ -17,10 +17,10 @@ {<<".*">>, []} ], [ - {<<"4.3.3">>, [ + {"4.3.3", [ {load_module, emqx_bridge_mqtt, brutal_purge, soft_purge, []} ]}, - {<<"4.3.[1-2]">>, [ + {<<"4\\.3\\.[1-2]">>, [ {load_module, emqx_bridge_mqtt, brutal_purge, soft_purge, []}, {load_module, emqx_bridge_mqtt_actions, brutal_purge, soft_purge, []} ]}, @@ -31,4 +31,4 @@ ]}, {<<".*">>, []} ] -}. \ No newline at end of file +}. diff --git a/scripts/update-appup.sh b/scripts/update-appup.sh index d70bfcf21..1d18187ee 100755 --- a/scripts/update-appup.sh +++ b/scripts/update-appup.sh @@ -8,7 +8,7 @@ set -euo pipefail usage() { - echo "$0 PROFILE PREV_VERSION" + echo "$0 PROFILE" } # ensure dir cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")/.." @@ -34,11 +34,43 @@ case "$PROFILE" in ;; esac -PREV_VERSION="$(git describe --tag --match "${TAG_PREFIX}*" | grep -oE "${TAG_PREFIX}4\.[0-9]+\.[0-9]+")" -PREV_VERSION="${PREV_VERSION#[e|v]}" +PREV_TAG="$(git describe --tag --match "${TAG_PREFIX}*" | grep -oE "${TAG_PREFIX}4\.[0-9]+\.[0-9]+")" +PREV_VERSION="${PREV_TAG#[e|v]}" shift 1 -ESCRIPT_ARGS="$*" +ESCRIPT_ARGS=() +while [ "$#" -gt 0 ]; do + case $1 in + -h|--help) + help + exit 0 + ;; + --skip-build) + SKIP_BUILD='yes' + shift + ;; + --check) + # hijack the --check option + IS_CHECK='yes' + shift + ;; + *) + ESCRIPT_ARGS+=( "$1" ) + shift + ;; + esac +done + +if [ "$TAG_PREFIX" = 'v' ]; then + SRC_DIRS="{apps,src,lib-ce}" +else + SRC_DIRS="{apps,src,lib-ee}" +fi + +## make sure we build here in bash and always pass --skip-build to escript +if [ "${SKIP_BUILD:-}" != 'yes' ]; then + make "${PROFILE}" +fi SYSTEM="${SYSTEM:-$(./scripts/get-distro.sh)}" if [ -z "${ARCH:-}" ]; then @@ -59,18 +91,30 @@ fi PACKAGE_NAME="${PROFILE}-${SYSTEM}-${PREV_VERSION}-${ARCH}.zip" DOWNLOAD_URL="https://www.emqx.com/downloads/${DIR}/v${PREV_VERSION}/${PACKAGE_NAME}" -if [ ! -f EMQX_ENTERPRISE ]; then - SRC_REPO='emqx.git' - SRC_DIRS='{src,apps,lib-ce}/**' -else - SRC_REPO='emqx-enterprise.git' - SRC_DIRS='{src,apps,lib-ee}/**' +PREV_DIR_BASE="/tmp/emqx-appup-base" +mkdir -p "${PREV_DIR_BASE}" +pushd "${PREV_DIR_BASE}" +if [ ! -f "${PACKAGE_NAME}" ]; then + echo "Download: ${PACKAGE_NAME}" + curl -f -L -o "${PACKAGE_NAME}" "${DOWNLOAD_URL}" fi -# shellcheck disable=SC2086 +if [ ! -d "${PREV_TAG}" ]; then + unzip -q -n -d "${PREV_TAG}" "${PACKAGE_NAME}" +fi +popd + ./scripts/update_appup.escript \ - --make-command "make ${PROFILE}-rel" \ - --binary-rel-url "$DOWNLOAD_URL" \ - --repo "$SRC_REPO" \ - --release-dir "_build/${PROFILE}/rel/emqx/lib" \ - --src-dirs "${SRC_DIRS}" \ - $ESCRIPT_ARGS "$PREV_VERSION" + --src-dirs "${SRC_DIRS}/**" \ + --release-dir "_build/${PROFILE}/lib" \ + --prev-release-dir "${PREV_DIR_BASE}/${PREV_TAG}/emqx/lib" \ + --skip-build \ + "${ESCRIPT_ARGS[@]}" "$PREV_VERSION" + +if [ "${IS_CHECK:-}" = 'yes' ]; then + diffs="$(git diff --name-only | grep -E '\.appup\.src' || true)" + if [ "$diffs" != '' ]; then + git --no-pager diff + echo "$0 ---check produced git diff" + exit 1 + fi +fi diff --git a/scripts/update_appup.escript b/scripts/update_appup.escript index a8d9d4828..19b546f43 100755 --- a/scripts/update_appup.escript +++ b/scripts/update_appup.escript @@ -25,15 +25,14 @@ Usage: Options: - --check Don't update the appfile, just check that they are complete - --repo Upsteam git repo URL - --remote Get upstream repo URL from the specified git remote - --skip-build Don't rebuild the releases. May produce wrong results - --make-command A command used to assemble the release - --release-dir Release directory - --src-dirs Directories where source code is found. Defaults to '{src,apps,lib-*}/**/' - --binary-rel-url Binary release URL pattern. - E.g. https://www.emqx.com/downloads/broker/v4.3.12/emqx-centos7-4.3.12-amd64.zip + --check Don't update the appfile, just check that they are complete + --repo Upsteam git repo URL + --remote Get upstream repo URL from the specified git remote + --skip-build Don't rebuild the releases. May produce wrong results + --make-command A command used to assemble the release + --prev-release-dir Previous version's release dir (if already built/extracted) + --release-dir Release directory + --src-dirs Directories where source code is found. Defaults to '{src,apps,lib-*}/**/' ". -record(app, @@ -48,7 +47,7 @@ default_options() -> , check => false , prev_tag => undefined , src_dirs => "{src,apps,lib-*}/**/" - , binary_rel_url => undefined + , prev_beams_dir => undefined }. %% App-specific actions that should be added unconditionally to any update/downgrade: @@ -56,7 +55,7 @@ app_specific_actions(_) -> []. ignored_apps() -> - [emqx_dashboard, emqx_management] ++ otp_standard_apps(). + [gpb, emqx_dashboard, emqx_management] ++ otp_standard_apps(). main(Args) -> #{prev_tag := Baseline} = Options = parse_args(Args, default_options()), @@ -68,7 +67,7 @@ parse_args([PrevTag = [A|_]], State) when A =/= $- -> parse_args(["--check"|Rest], State) -> parse_args(Rest, State#{check => true}); parse_args(["--skip-build"|Rest], State) -> - parse_args(Rest, State#{make_command => "true"}); + parse_args(Rest, State#{make_command => undefined}); parse_args(["--repo", Repo|Rest], State) -> parse_args(Rest, State#{clone_url => Repo}); parse_args(["--remote", Remote|Rest], State) -> @@ -77,15 +76,16 @@ parse_args(["--make-command", Command|Rest], State) -> parse_args(Rest, State#{make_command => Command}); parse_args(["--release-dir", Dir|Rest], State) -> parse_args(Rest, State#{beams_dir => Dir}); +parse_args(["--prev-release-dir", Dir|Rest], State) -> + parse_args(Rest, State#{prev_beams_dir => Dir}); parse_args(["--src-dirs", Pattern|Rest], State) -> parse_args(Rest, State#{src_dirs => Pattern}); -parse_args(["--binary-rel-url", URL|Rest], State) -> - parse_args(Rest, State#{binary_rel_url => {ok, URL}}); parse_args(_, _) -> fail(usage()). main(Options, Baseline) -> {CurrRelDir, PrevRelDir} = prepare(Baseline, Options), + putopt(prev_beams_dir, PrevRelDir), log("~n===================================~n" "Processing changes..." "~n===================================~n"), @@ -93,38 +93,9 @@ main(Options, Baseline) -> PrevAppsIdx = index_apps(PrevRelDir), %% log("Curr: ~p~nPrev: ~p~n", [CurrAppsIdx, PrevAppsIdx]), AppupChanges = find_appup_actions(CurrAppsIdx, PrevAppsIdx), - case getopt(check) of - true -> - case AppupChanges of - [] -> - ok; - _ -> - Diffs = - lists:filtermap( - fun({App, {Upgrade, Downgrade, OldUpgrade, OldDowngrade}}) -> - case parse_appup_diffs(Upgrade, OldUpgrade, - Downgrade, OldDowngrade) of - ok -> - false; - {diffs, Diffs} -> - {true, {App, Diffs}} - end - end, - AppupChanges), - case Diffs =:= [] of - true -> - ok; - false -> - set_invalid(), - log("ERROR: The appup files are incomplete. Missing changes:~n ~p", - [Diffs]) - end - end; - false -> - update_appups(AppupChanges) - end, - check_appup_files(), - warn_and_exit(is_valid()). + ok = update_appups(AppupChanges), + ok = check_appup_files(), + ok = warn_and_exit(is_valid()). warn_and_exit(true) -> log(" @@ -136,50 +107,34 @@ warn_and_exit(false) -> log("~nERROR: Incomplete appups found. Please inspect the output for more details.~n"), halt(1). -prepare(Baseline, Options = #{make_command := MakeCommand, beams_dir := BeamDir, binary_rel_url := BinRel}) -> +prepare(Baseline, Options = #{make_command := MakeCommand, beams_dir := BeamDir}) -> log("~n===================================~n" "Baseline: ~s" "~n===================================~n", [Baseline]), log("Building the current version...~n"), - bash(MakeCommand), - log("Downloading and building the previous release...~n"), + ok = bash(MakeCommand), PrevRelDir = - case BinRel of + case maps:get(prev_beams_dir, Options, undefined) of undefined -> + log("Building the previous release...~n"), {ok, PrevRootDir} = build_prev_release(Baseline, Options), filename:join(PrevRootDir, BeamDir); - {ok, _URL} -> - {ok, PrevRootDir} = download_prev_release(Baseline, Options), - PrevRootDir + Dir -> + %% already built + Dir end, {BeamDir, PrevRelDir}. build_prev_release(Baseline, #{clone_url := Repo, make_command := MakeCommand}) -> - BaseDir = "/tmp/emqx-baseline/", + BaseDir = "/tmp/emqx-appup-base/", Dir = filename:basename(Repo, ".git") ++ [$-|Baseline], - %% TODO: shallow clone Script = "mkdir -p ${BASEDIR} && cd ${BASEDIR} && - { [ -d ${DIR} ] || git clone --branch ${TAG} ${REPO} ${DIR}; } && + { [ -d ${DIR} ] || git clone --depth 1 --branch ${TAG} ${REPO} ${DIR}; } && cd ${DIR} &&" ++ MakeCommand, Env = [{"REPO", Repo}, {"TAG", Baseline}, {"BASEDIR", BaseDir}, {"DIR", Dir}], - bash(Script, Env), - {ok, filename:join(BaseDir, Dir)}. - -download_prev_release(Tag, #{binary_rel_url := {ok, URL0}, clone_url := Repo}) -> - URL = string:replace(URL0, "%TAG%", Tag, all), - BaseDir = "/tmp/emqx-baseline-bin/", - Dir = filename:basename(Repo, ".git") ++ [$-|Tag], - Filename = filename:join(BaseDir, Dir), - Script = "mkdir -p ${OUTFILE} && - if [ ! -f \"${OUTFILE}.zip\" ]; then \ - echo \"Download: ${OUTFILE}\" && \ - curl -f -L -o \"${OUTFILE}.zip\" \"${URL}\"; \ - fi && - unzip -q -n -d ${OUTFILE} ${OUTFILE}.zip", - Env = [{"TAG", Tag}, {"OUTFILE", Filename}, {"URL", URL}], - bash(Script, Env), - {ok, Filename}. + ok = bash(Script, Env), + {ok, filename:join([BaseDir, Dir, "_build/*/lib"])}. find_upstream_repo(Remote) -> string:trim(os:cmd("git remote get-url " ++ Remote)). @@ -208,16 +163,16 @@ find_appup_actions(_App, AppIdx, AppIdx) -> find_appup_actions(App, CurrAppIdx = #app{version = CurrVersion}, PrevAppIdx = #app{version = PrevVersion}) -> - {OldUpgrade0, OldDowngrade0} = find_old_appup_actions(App, PrevVersion), + {OldUpgrade0, OldDowngrade0} = find_base_appup_actions(App, PrevVersion), OldUpgrade = ensure_all_patch_versions(App, CurrVersion, OldUpgrade0), OldDowngrade = ensure_all_patch_versions(App, CurrVersion, OldDowngrade0), - Upgrade = merge_update_actions(App, diff_app(up, App, CurrAppIdx, PrevAppIdx), OldUpgrade), - Downgrade = merge_update_actions(App, diff_app(down, App, PrevAppIdx, CurrAppIdx), OldDowngrade), - if OldUpgrade =:= Upgrade andalso OldDowngrade =:= Downgrade -> - %% The appup file has been already updated: - []; - true -> - [{App, {Upgrade, Downgrade, OldUpgrade, OldDowngrade}}] + UpDiff = diff_app(up, App, CurrAppIdx, PrevAppIdx), + DownDiff = diff_app(down, App, PrevAppIdx, CurrAppIdx), + Upgrade = merge_update_actions(App, UpDiff, OldUpgrade), + Downgrade = merge_update_actions(App, DownDiff, OldDowngrade), + case OldUpgrade =:= Upgrade andalso OldDowngrade =:= Downgrade of + true -> []; + false -> [{App, {Upgrade, Downgrade, OldUpgrade, OldDowngrade}}] end. %% To avoid missing one patch version when upgrading, we try to @@ -268,7 +223,7 @@ diff_appup_instructions(ComputedChanges, PresentChanges) -> [], ComputedChanges). -%% For external dependencies, checks if any missing diffs are present +%% checks if any missing diffs are present %% and groups them by `up' and `down' types. parse_appup_diffs(Upgrade, OldUpgrade, Downgrade, OldDowngrade) -> DiffUp = diff_appup_instructions(Upgrade, OldUpgrade), @@ -278,7 +233,6 @@ parse_appup_diffs(Upgrade, OldUpgrade, Downgrade, OldDowngrade) -> %% no diff for external dependency; ignore ok; _ -> - set_invalid(), Diffs = #{ up => DiffUp , down => DiffDown }, @@ -292,27 +246,17 @@ parse_appup_diffs(Upgrade, OldUpgrade, Downgrade, OldDowngrade) -> find_matching_version(VsnOrRegex, PresentChanges) -> proplists:get_value(VsnOrRegex, PresentChanges). -find_old_appup_actions(App, PrevVersion) -> - {Upgrade0, Downgrade0} = - case locate(ebin_current, App, ".appup") of - {ok, AppupFile} -> - log("Found the previous appup file: ~s~n", [AppupFile]), - {_, U, D} = read_appup(AppupFile), - {U, D}; +find_base_appup_actions(App, PrevVersion) -> + {Upgrade, Downgrade} = + case locate_appup(App) of + {ok, AppupSrcFile} -> + log("INFO: Using ~s as a source of previous update actions~n", [AppupSrcFile]), + read_appup(AppupSrcFile); undefined -> - %% Fallback to the app.src file, in case the - %% application doesn't have a release (useful for the - %% apps that live outside the EMQX monorepo): - case locate(src, App, ".appup.src") of - {ok, AppupSrcFile} -> - log("Using ~s as a source of previous update actions~n", [AppupSrcFile]), - {_, U, D} = read_appup(AppupSrcFile), - {U, D}; - undefined -> - {[], []} - end + log("INFO: no appup base found for ~p~n", [App]), + {[], []} end, - {ensure_version(PrevVersion, Upgrade0), ensure_version(PrevVersion, Downgrade0)}. + {ensure_version(PrevVersion, Upgrade), ensure_version(PrevVersion, Downgrade)}. merge_update_actions(App, Changes, Vsns) -> lists:map(fun(Ret = {<<".*">>, _}) -> @@ -391,7 +335,8 @@ ensure_version(Version, OldInstructions) -> contains_version(Needle, Haystack) when is_list(Needle) -> lists:any( - fun(Regex) when is_binary(Regex) -> + fun(<<"*">>) -> true; %% TODO: delete after we pass esockd 5.8.4 + (Regex) when is_binary(Regex) -> case re:run(Needle, Regex) of {match, _} -> true; @@ -434,11 +379,19 @@ vsn_number_to_string({Major, Minor, Patch}) -> read_appup(File) -> %% NOTE: appup file is a script, it may contain variables or functions. + case do_read_appup(File) of + {ok, {U, D}} -> {U, D}; + {error, Reason} -> fail("Failed to parse appup file ~p~n~p", [File, Reason]) + end. + +do_read_appup(File) -> case file:script(File, [{'VSN', "VSN"}]) of - {ok, Terms} -> - Terms; - Error -> - fail("Failed to parse appup file ~s: ~p", [File, Error]) + {ok, {_, U, D}} -> + {ok, {U, D}}; + {ok, Other} -> + {error, {bad_appup_format, Other}}; + {error, Reason} -> + {error, Reason} end. check_appup_files() -> @@ -453,52 +406,77 @@ update_appups(Changes) -> Changes). do_update_appup(App, Upgrade, Downgrade, OldUpgrade, OldDowngrade) -> - case locate(src, App, ".appup.src") of + case locate_current_src(App, ".appup.src") of {ok, AppupFile} -> case contains_contents(AppupFile, Upgrade, Downgrade) of true -> ok; false -> - render_appfile(AppupFile, Upgrade, Downgrade) + render_appup(App, AppupFile, Upgrade, Downgrade) end; undefined -> - case create_stub(App) of - {ok, AppupFile} -> - render_appfile(AppupFile, Upgrade, Downgrade); - false -> - case parse_appup_diffs(Upgrade, OldUpgrade, - Downgrade, OldDowngrade) of - ok -> - %% no diff for external dependency; ignore - ok; - {diffs, Diffs} -> - set_invalid(), - log("ERROR: Appup file for the external dependency '~p' is not complete.~n Missing changes: ~100p~n", [App, Diffs]), - log("NOTE: Some changes above might be already covered by regexes.~n") - end - end + maybe_create_appup(App, Upgrade, Downgrade, OldUpgrade, OldDowngrade) + end. + +maybe_create_appup(App, Upgrade, Downgrade, OldUpgrade, OldDowngrade) -> + case create_stub(App) of + {ok, AppupFile} -> + render_appup(App, AppupFile, Upgrade, Downgrade); + external -> + %% for external appup, the best we can do is to validate it + _ = check_appup(App, Upgrade, Downgrade, OldUpgrade, OldDowngrade), + ok + end. + +check_appup(App, Upgrade, Downgrade, OldUpgrade, OldDowngrade) -> + case parse_appup_diffs(Upgrade, OldUpgrade, Downgrade, OldDowngrade) of + ok -> + %% no diff for external dependency; ignore + ok; + {diffs, Diffs} -> + set_invalid(), + log("ERROR: Appup file for '~p' is not complete.~n" + "Missing:~100p~n", [App, Diffs]), + notok end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Appup file creation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -render_appfile(File, Upgrade, Downgrade) -> - IOList = io_lib:format("%% -*- mode: erlang -*-\n{VSN,~n ~p,~n ~p}.~n", [Upgrade, Downgrade]), +render_appup(App, File, Up, Down) -> + IsCheck = getopt(check), + case do_read_appup(File) of + {ok, {U, D}} when U =:= Up andalso D =:= Down -> + ok; + {ok, {OldU, OldD}} when IsCheck -> + check_appup(App, Up, Down, OldU, OldD); + {ok, {_, _}} -> + do_render_appup(File, Up, Down); + {error, enoent} when IsCheck -> + %% failed to read old file, exit + log("ERROR: ~s is missing", [File]), + set_invalid() + end. + +do_render_appup(File, Up, Down) -> + IOList = io_lib:format("%% -*- mode: erlang -*-~n" + "%% Unless you know what you are doing, DO NOT edit manually!!~n" + "{VSN,~n ~p,~n ~p}.~n", [Up, Down]), ok = file:write_file(File, IOList). create_stub(App) -> Ext = ".app.src", - case locate(src, App, Ext) of + case locate_current_src(App, Ext) of {ok, AppSrc} -> DirName = filename:dirname(AppSrc), AppupFile = filename:basename(AppSrc, Ext) ++ ".appup.src", Default = {<<".*">>, []}, AppupFileFullpath = filename:join(DirName, AppupFile), - render_appfile(AppupFileFullpath, [Default], [Default]), + render_appup(App, AppupFileFullpath, [Default], [Default]), {ok, AppupFileFullpath}; undefined -> - false + external end. %% we check whether the destination file already has the contents we @@ -517,6 +495,7 @@ contains_contents(File, Upgrade, Downgrade) -> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% index_apps(ReleaseDir) -> + log("INFO: indexing apps in ~s~n", [ReleaseDir]), Apps0 = maps:from_list([index_app(filename:join(ReleaseDir, AppFile)) || AppFile <- filelib:wildcard("**/ebin/*.app", ReleaseDir)]), maps:without(ignored_apps(), Apps0). @@ -531,7 +510,6 @@ index_app(AppFile) -> , modules = Modules }}. -diff_app(_, gpb, _, _) -> ok; %% gpb is not a runtime app diff_app(UpOrDown, App, #app{version = NewVersion, modules = NewModules}, #app{version = OldVersion, modules = OldModules}) -> @@ -568,6 +546,7 @@ diff_app(UpOrDown, App, end; false -> log("INFO: Application '~p' has been updated: ~p --[~p]--> ~p~n", [App, OldVersion, UpOrDown, NewVersion]), + log("INFO: changes [~p]: ~p~n", [UpOrDown, Changes]), ok end, {New, Changed, Deleted}. @@ -588,7 +567,7 @@ hashsums(EbinDir) -> is_app_external(App) -> Ext = ".app.src", - case locate(src, App, Ext) of + case locate_current_src(App, Ext) of {ok, _} -> false; undefined -> @@ -604,8 +583,16 @@ init_globals(Options) -> ets:insert(globals, {valid, true}), ets:insert(globals, {options, Options}). +putopt(Option, Value) -> + ets:insert(globals, {{option, Option}, Value}). + getopt(Option) -> - maps:get(Option, ets:lookup_element(globals, options, 2)). + case ets:lookup(globals, {option, Option}) of + [] -> + maps:get(Option, ets:lookup_element(globals, options, 2)); + [{_, V}] -> + V + end. %% Set a global flag that something about the appfiles is invalid set_invalid() -> @@ -618,20 +605,28 @@ is_valid() -> %% Utility functions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Locate a file in a specified application -locate(ebin_current, App, Suffix) -> - ReleaseDir = getopt(beams_dir), - AppStr = atom_to_list(App), - case filelib:wildcard(ReleaseDir ++ "/**/ebin/" ++ AppStr ++ Suffix) of - [File] -> +locate_appup(App) -> + case locate_current_rel(App, ".appup.src") of + {ok, File} -> {ok, File}; - [] -> - undefined - end; -locate(src, App, Suffix) -> - AppStr = atom_to_list(App), + undefined -> + %% fallback to .appup + locate_current_rel(App, ".appup") + end. + +locate_current_rel(App, Suffix) -> + CurDir = getopt(beams_dir), + do_locate(filename:join([CurDir, "**"]), App, Suffix). + +%% Locate a file in a specified application +locate_current_src(App, Suffix) -> SrcDirs = getopt(src_dirs), - case find_app(SrcDirs ++ AppStr ++ Suffix) of + do_locate(SrcDirs, App, Suffix). + +do_locate(Dir, App, Suffix) -> + AppStr = atom_to_list(App), + Pattern = filename:join(Dir, AppStr ++ Suffix), + case find_app(Pattern) of [File] -> {ok, File}; [] -> @@ -641,17 +636,17 @@ locate(src, App, Suffix) -> end. find_app(Pattern) -> - %% exclude _build dir inside apps - lists:filter(fun(S) -> string:find(S, "/_build/") =:= nomatch end, + lists:filter(fun(D) -> re:run(D, "apps/.*/_build") =:= nomatch end, filelib:wildcard(Pattern)). +bash(undefined) -> ok; bash(Script) -> bash(Script, []). bash(Script, Env) -> log("+ ~s~n+ Env: ~p~n", [Script, Env]), case cmd("bash", #{args => ["-c", Script], env => Env}) of - 0 -> true; + 0 -> ok; _ -> fail("Failed to run command: ~s", [Script]) end. diff --git a/src/emqx.appup.src b/src/emqx.appup.src index 76d54655b..542c02aa1 100644 --- a/src/emqx.appup.src +++ b/src/emqx.appup.src @@ -1,31 +1,32 @@ %% -*- mode: erlang -*- +%% Unless you know what you are doing, DO NOT edit manually!! {VSN, [{"4.3.13", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, - {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, - {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_banned,brutal_purge,soft_purge,[]}, - {load_module,emqx_ctl,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_os_mon,brutal_purge,soft_purge,[]}, - {load_module,emqx_cm,brutal_purge,soft_purge,[]}, + {load_module,emqx_channel,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, - {load_module,emqx_channel,brutal_purge,soft_purge,[]}]}, + {load_module,emqx_ctl,brutal_purge,soft_purge,[]}, + {load_module,emqx_cm,brutal_purge,soft_purge,[]}, + {load_module,emqx_connection,brutal_purge,soft_purge,[]}]}, {"4.3.12", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, - {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, - {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys,brutal_purge,soft_purge,[]}, + {load_module,emqx_cm,brutal_purge,soft_purge,[]}, + {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_ctl,brutal_purge,soft_purge,[]}, {load_module,emqx_metrics,brutal_purge,soft_purge,[]}, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, - {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_session,brutal_purge,soft_purge,[]}, {load_module,emqx_alarm,brutal_purge,soft_purge,[]}, {load_module,emqx_os_mon,brutal_purge,soft_purge,[]}, @@ -35,9 +36,10 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.11", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, + {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_ctl,brutal_purge,soft_purge,[]}, {load_module,emqx_metrics,brutal_purge,soft_purge,[]}, @@ -45,7 +47,6 @@ {load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, - {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_session,brutal_purge,soft_purge,[]}, {load_module,emqx_vm,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, @@ -59,16 +60,16 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.10", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, + {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_ctl,brutal_purge,soft_purge,[]}, {load_module,emqx_metrics,brutal_purge,soft_purge,[]}, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, - {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_session,brutal_purge,soft_purge,[]}, {load_module,emqx_vm,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, @@ -83,9 +84,9 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.9", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_ctl,brutal_purge,soft_purge,[]}, {load_module,emqx_metrics,brutal_purge,soft_purge,[]}, @@ -111,9 +112,9 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.8", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_ctl,brutal_purge,soft_purge,[]}, {load_module,emqx_metrics,brutal_purge,soft_purge,[]}, @@ -139,9 +140,9 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.7", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_ctl,brutal_purge,soft_purge,[]}, {load_module,emqx_metrics,brutal_purge,soft_purge,[]}, @@ -170,8 +171,8 @@ {"4.3.6", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, - {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_metrics,brutal_purge,soft_purge,[]}, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}, @@ -199,9 +200,9 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.5", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_metrics,brutal_purge,soft_purge,[]}, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}, @@ -230,9 +231,9 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.4", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_metrics,brutal_purge,soft_purge,[]}, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}, @@ -262,9 +263,9 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.3", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_metrics,brutal_purge,soft_purge,[]}, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}, @@ -295,9 +296,9 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.2", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_metrics,brutal_purge,soft_purge,[]}, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}, @@ -327,9 +328,9 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.1", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_pmon,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_metrics,brutal_purge,soft_purge,[]}, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}, @@ -363,9 +364,9 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.0", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_pmon,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_metrics,brutal_purge,soft_purge,[]}, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}, @@ -404,27 +405,27 @@ {<<".*">>,[]}], [{"4.3.13", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, - {load_module,emqx_app,brutal_purge,soft_purge,[]}, - {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, - {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, + {load_module,emqx_os_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_channel,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys,brutal_purge,soft_purge,[]}, + {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_os_mon,brutal_purge,soft_purge,[]}, - {load_module,emqx_channel,brutal_purge,soft_purge,[]}]}, + {load_module,emqx_connection,brutal_purge,soft_purge,[]}]}, {"4.3.12", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, - {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, - {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys,brutal_purge,soft_purge,[]}, + {load_module,emqx_cm,brutal_purge,soft_purge,[]}, + {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_ctl,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, - {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_metrics,brutal_purge,soft_purge,[]}, {load_module,emqx_session,brutal_purge,soft_purge,[]}, @@ -436,14 +437,14 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.11", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, + {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_ctl,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, - {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_metrics,brutal_purge,soft_purge,[]}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_session,brutal_purge,soft_purge,[]}, @@ -459,13 +460,13 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.10", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, + {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_ctl,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, - {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_metrics,brutal_purge,soft_purge,[]}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_session,brutal_purge,soft_purge,[]}, @@ -482,9 +483,9 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.9", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_ctl,brutal_purge,soft_purge,[]}, {load_module,emqx_vm,brutal_purge,soft_purge,[]}, @@ -509,9 +510,9 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.8", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_ctl,brutal_purge,soft_purge,[]}, {load_module,emqx_vm,brutal_purge,soft_purge,[]}, @@ -536,9 +537,9 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.7", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_ctl,brutal_purge,soft_purge,[]}, {load_module,emqx_vm,brutal_purge,soft_purge,[]}, @@ -565,9 +566,9 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.6", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, @@ -594,9 +595,9 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.5", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, @@ -624,9 +625,9 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.4", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, @@ -655,9 +656,9 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.3", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, @@ -687,9 +688,9 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.2", [{load_module,emqx_plugins,brutal_purge,soft_purge,[]}, + {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, @@ -718,9 +719,9 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.1", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_pmon,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, @@ -753,9 +754,9 @@ {load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {"4.3.0", - [{load_module,emqx_banned,brutal_purge,soft_purge,[]}, + [{load_module,emqx_pmon,brutal_purge,soft_purge,[]}, + {load_module,emqx_banned,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, - {load_module,emqx_pmon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_vm,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},