Merge pull request #6717 from zhongwencool/auth-mnesia-default-import
fix(auth): force update default mqtt_user when password or hash_type changed.
This commit is contained in:
commit
51e62468ed
|
@ -10,6 +10,13 @@ File format:
|
||||||
- One list item per change topic
|
- One list item per change topic
|
||||||
Change log ends with a list of github PRs
|
Change log ends with a list of github PRs
|
||||||
|
|
||||||
|
## v4.3.12
|
||||||
|
### Important changes
|
||||||
|
|
||||||
|
### Minor changes
|
||||||
|
* Fix updating `emqx_auth_mnesia.conf` password and restarting the new password does not take effect [#6717]
|
||||||
|
* Fix import data crash when emqx_auth_mnesia's record is not empty [#6717]
|
||||||
|
|
||||||
## v4.3.11
|
## v4.3.11
|
||||||
|
|
||||||
Important notes:
|
Important notes:
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{application, emqx_auth_mnesia,
|
{application, emqx_auth_mnesia,
|
||||||
[{description, "EMQ X Authentication with Mnesia"},
|
[{description, "EMQ X Authentication with Mnesia"},
|
||||||
{vsn, "4.3.4"}, % strict semver, bump manually
|
{vsn, "4.3.5"}, % strict semver, bump manually
|
||||||
{modules, []},
|
{modules, []},
|
||||||
{registered, []},
|
{registered, []},
|
||||||
{applications, [kernel,stdlib,mnesia]},
|
{applications, [kernel,stdlib,mnesia]},
|
||||||
|
|
|
@ -11,6 +11,10 @@
|
||||||
{load_module,emqx_acl_mnesia_api, brutal_purge,soft_purge,[]},
|
{load_module,emqx_acl_mnesia_api, brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_acl_mnesia_cli, brutal_purge,soft_purge,[]}
|
{load_module,emqx_acl_mnesia_cli, brutal_purge,soft_purge,[]}
|
||||||
]},
|
]},
|
||||||
|
{<<"4.3.4">>, [
|
||||||
|
{load_module,emqx_auth_mnesia, brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_auth_mnesia_cli, brutal_purge,soft_purge,[]}
|
||||||
|
]},
|
||||||
{<<".*">>, [
|
{<<".*">>, [
|
||||||
]}
|
]}
|
||||||
],
|
],
|
||||||
|
@ -25,6 +29,10 @@
|
||||||
{delete_module,emqx_acl_mnesia_migrator},
|
{delete_module,emqx_acl_mnesia_migrator},
|
||||||
{delete_module,emqx_acl_mnesia_db}
|
{delete_module,emqx_acl_mnesia_db}
|
||||||
]},
|
]},
|
||||||
|
{<<"4.3.4">>, [
|
||||||
|
{load_module,emqx_auth_mnesia, brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_auth_mnesia_cli, brutal_purge,soft_purge,[]}
|
||||||
|
]},
|
||||||
{<<".*">>, [
|
{<<".*">>, [
|
||||||
]}
|
]}
|
||||||
]
|
]
|
||||||
|
|
|
@ -32,6 +32,8 @@
|
||||||
, description/0
|
, description/0
|
||||||
]).
|
]).
|
||||||
|
|
||||||
|
-export([match_password/3]).
|
||||||
|
|
||||||
init(#{clientid_list := ClientidList, username_list := UsernameList}) ->
|
init(#{clientid_list := ClientidList, username_list := UsernameList}) ->
|
||||||
ok = ekka_mnesia:create_table(?TABLE, [
|
ok = ekka_mnesia:create_table(?TABLE, [
|
||||||
{disc_copies, [node()]},
|
{disc_copies, [node()]},
|
||||||
|
@ -45,7 +47,7 @@ init(#{clientid_list := ClientidList, username_list := UsernameList}) ->
|
||||||
|
|
||||||
%% @private
|
%% @private
|
||||||
add_default_user({Login, Password}) when is_tuple(Login) ->
|
add_default_user({Login, Password}) when is_tuple(Login) ->
|
||||||
emqx_auth_mnesia_cli:add_user(Login, Password).
|
emqx_auth_mnesia_cli:force_add_user(Login, Password).
|
||||||
|
|
||||||
-spec(register_metrics() -> ok).
|
-spec(register_metrics() -> ok).
|
||||||
register_metrics() ->
|
register_metrics() ->
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
-define(TABLE, emqx_user).
|
-define(TABLE, emqx_user).
|
||||||
%% Auth APIs
|
%% Auth APIs
|
||||||
-export([ add_user/2
|
-export([ add_user/2
|
||||||
|
, force_add_user/2
|
||||||
, update_user/2
|
, update_user/2
|
||||||
, remove_user/1
|
, remove_user/1
|
||||||
, lookup_user/1
|
, lookup_user/1
|
||||||
|
@ -56,6 +57,32 @@ insert_user(User = #emqx_user{login = Login}) ->
|
||||||
[_|_] -> mnesia:abort(existed)
|
[_|_] -> mnesia:abort(existed)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
force_add_user(Login, Password) ->
|
||||||
|
User = #emqx_user{
|
||||||
|
login = Login,
|
||||||
|
password = encrypted_data(Password),
|
||||||
|
created_at = erlang:system_time(millisecond)
|
||||||
|
},
|
||||||
|
case ret(mnesia:transaction(fun insert_or_update_user/2, [Password, User])) of
|
||||||
|
{ok, override} ->
|
||||||
|
?LOG(warning, "[Mnesia] (~p)'s password has be updated.", [Login]),
|
||||||
|
ok;
|
||||||
|
Other -> Other
|
||||||
|
end.
|
||||||
|
|
||||||
|
insert_or_update_user(NewPwd, User = #emqx_user{login = Login}) ->
|
||||||
|
case mnesia:read(?TABLE, Login) of
|
||||||
|
[] -> mnesia:write(User);
|
||||||
|
[#emqx_user{password = Pwd}] ->
|
||||||
|
case emqx_auth_mnesia:match_password(NewPwd, hash_type(), [Pwd]) of
|
||||||
|
true -> ok;
|
||||||
|
false ->
|
||||||
|
ok = mnesia:write(User),
|
||||||
|
{ok, override}
|
||||||
|
end
|
||||||
|
end.
|
||||||
|
|
||||||
|
|
||||||
%% @doc Update User
|
%% @doc Update User
|
||||||
-spec(update_user(tuple(), binary()) -> ok | {error, any()}).
|
-spec(update_user(tuple(), binary()) -> ok | {error, any()}).
|
||||||
update_user(Login, NewPassword) ->
|
update_user(Login, NewPassword) ->
|
||||||
|
@ -105,11 +132,11 @@ comparing({?TABLE, _, _, CreatedAt1},
|
||||||
{?TABLE, _, _, CreatedAt2}) ->
|
{?TABLE, _, _, CreatedAt2}) ->
|
||||||
CreatedAt1 >= CreatedAt2.
|
CreatedAt1 >= CreatedAt2.
|
||||||
|
|
||||||
ret({atomic, ok}) -> ok;
|
ret({atomic, Res}) -> Res;
|
||||||
ret({aborted, Error}) -> {error, Error}.
|
ret({aborted, Error}) -> {error, Error}.
|
||||||
|
|
||||||
encrypted_data(Password) ->
|
encrypted_data(Password) ->
|
||||||
HashType = application:get_env(emqx_auth_mnesia, password_hash, sha256),
|
HashType = hash_type(),
|
||||||
SaltBin = salt(),
|
SaltBin = salt(),
|
||||||
<<SaltBin/binary, (hash(Password, SaltBin, HashType))/binary>>.
|
<<SaltBin/binary, (hash(Password, SaltBin, HashType))/binary>>.
|
||||||
|
|
||||||
|
@ -192,3 +219,5 @@ auth_username_cli(_) ->
|
||||||
{"user add <Username> <Password>", "Add username auth rule"},
|
{"user add <Username> <Password>", "Add username auth rule"},
|
||||||
{"user update <Username> <NewPassword>", "Update username auth rule"},
|
{"user update <Username> <NewPassword>", "Update username auth rule"},
|
||||||
{"user delete <Username>", "Delete username auth rule"}]).
|
{"user delete <Username>", "Delete username auth rule"}]).
|
||||||
|
hash_type() ->
|
||||||
|
application:get_env(emqx_auth_mnesia, password_hash, sha256).
|
||||||
|
|
|
@ -46,11 +46,15 @@ all() ->
|
||||||
groups() ->
|
groups() ->
|
||||||
[].
|
[].
|
||||||
|
|
||||||
|
init_per_suite(t_boot) ->
|
||||||
|
ok;
|
||||||
init_per_suite(Config) ->
|
init_per_suite(Config) ->
|
||||||
ok = emqx_ct_helpers:start_apps([emqx_management, emqx_auth_mnesia], fun set_special_configs/1),
|
ok = emqx_ct_helpers:start_apps([emqx_management, emqx_auth_mnesia], fun set_special_configs/1),
|
||||||
create_default_app(),
|
create_default_app(),
|
||||||
Config.
|
Config.
|
||||||
|
|
||||||
|
end_per_suite(t_boot) ->
|
||||||
|
ok;
|
||||||
end_per_suite(_Config) ->
|
end_per_suite(_Config) ->
|
||||||
delete_default_app(),
|
delete_default_app(),
|
||||||
emqx_ct_helpers:stop_apps([emqx_management, emqx_auth_mnesia]).
|
emqx_ct_helpers:stop_apps([emqx_management, emqx_auth_mnesia]).
|
||||||
|
@ -65,10 +69,63 @@ set_special_configs(emqx) ->
|
||||||
set_special_configs(_App) ->
|
set_special_configs(_App) ->
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
|
set_default(ClientId, UserName, Pwd, HashType) ->
|
||||||
|
application:set_env(emqx_auth_mnesia, clientid_list, [{ClientId, Pwd}]),
|
||||||
|
application:set_env(emqx_auth_mnesia, username_list, [{UserName, Pwd}]),
|
||||||
|
application:set_env(emqx_auth_mnesia, password_hash, HashType),
|
||||||
|
ok.
|
||||||
%%------------------------------------------------------------------------------
|
%%------------------------------------------------------------------------------
|
||||||
%% Testcases
|
%% Testcases
|
||||||
%%------------------------------------------------------------------------------
|
%%------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
t_boot(_Config) ->
|
||||||
|
clean_all_users(),
|
||||||
|
emqx_ct_helpers:stop_apps([emqx_auth_mnesia]),
|
||||||
|
ClientId = <<"clientid-test">>,
|
||||||
|
UserName = <<"username-test">>,
|
||||||
|
Pwd = <<"emqx123456">>,
|
||||||
|
ok = emqx_ct_helpers:start_apps([emqx_auth_mnesia],
|
||||||
|
fun(_) -> set_default(ClientId, UserName, Pwd, sha256) end),
|
||||||
|
Ok = {stop, #{anonymous => false, auth_result => success}},
|
||||||
|
Failed = {stop, #{anonymous => false, auth_result => password_error}},
|
||||||
|
?assertEqual(Ok,
|
||||||
|
emqx_auth_mnesia:check(#{clientid => ClientId, password => Pwd}, #{}, #{hash_type => sha256})),
|
||||||
|
?assertEqual(Ok,
|
||||||
|
emqx_auth_mnesia:check(#{clientid => <<"NotExited">>, username => UserName, password => Pwd},
|
||||||
|
#{}, #{hash_type => sha256})),
|
||||||
|
?assertEqual(Failed,
|
||||||
|
emqx_auth_mnesia:check(#{clientid => ClientId, password => <<Pwd/binary, "bad">>},
|
||||||
|
#{}, #{hash_type => sha256})),
|
||||||
|
?assertEqual(Failed,
|
||||||
|
emqx_auth_mnesia:check(#{clientid => ClientId, username => UserName, password => <<Pwd/binary, "bad">>},
|
||||||
|
#{}, #{hash_type => sha256})),
|
||||||
|
emqx_ct_helpers:stop_apps([emqx_auth_mnesia]),
|
||||||
|
|
||||||
|
%% change default pwd
|
||||||
|
NewPwd = <<"emqx654321">>,
|
||||||
|
ok = emqx_ct_helpers:start_apps([emqx_auth_mnesia],
|
||||||
|
fun(_) -> set_default(ClientId, UserName, NewPwd, sha256) end),
|
||||||
|
?assertEqual(Ok,
|
||||||
|
emqx_auth_mnesia:check(#{clientid => ClientId, password => NewPwd},
|
||||||
|
#{}, #{hash_type => sha256})),
|
||||||
|
?assertEqual(Ok,
|
||||||
|
emqx_auth_mnesia:check(#{clientid => <<"NotExited">>, username => UserName, password => NewPwd},
|
||||||
|
#{}, #{hash_type => sha256})),
|
||||||
|
emqx_ct_helpers:stop_apps([emqx_auth_mnesia]),
|
||||||
|
|
||||||
|
%% change hash_type
|
||||||
|
NewPwd2 = <<"emqx6543210">>,
|
||||||
|
ok = emqx_ct_helpers:start_apps([emqx_auth_mnesia],
|
||||||
|
fun(_) -> set_default(ClientId, UserName, NewPwd2, plain) end),
|
||||||
|
?assertEqual(Ok,
|
||||||
|
emqx_auth_mnesia:check(#{clientid => ClientId, password => NewPwd2},
|
||||||
|
#{}, #{hash_type => plain})),
|
||||||
|
?assertEqual(Ok,
|
||||||
|
emqx_auth_mnesia:check(#{clientid => <<"NotExited">>, username => UserName, password => NewPwd2},
|
||||||
|
#{}, #{hash_type => plain})),
|
||||||
|
clean_all_users(),
|
||||||
|
ok.
|
||||||
|
|
||||||
t_management(_Config) ->
|
t_management(_Config) ->
|
||||||
clean_all_users(),
|
clean_all_users(),
|
||||||
|
|
||||||
|
|
|
@ -602,7 +602,7 @@ import(Filename, OverridesJson) ->
|
||||||
Overrides = emqx_json:decode(OverridesJson, [return_maps]),
|
Overrides = emqx_json:decode(OverridesJson, [return_maps]),
|
||||||
Data = maps:merge(Imported, Overrides),
|
Data = maps:merge(Imported, Overrides),
|
||||||
Version = to_version(maps:get(<<"version">>, Data)),
|
Version = to_version(maps:get(<<"version">>, Data)),
|
||||||
read_global_auth_type(Data),
|
read_global_auth_type(Data, Version),
|
||||||
try
|
try
|
||||||
do_import_data(Data, Version),
|
do_import_data(Data, Version),
|
||||||
logger:debug("The emqx data has been imported successfully"),
|
logger:debug("The emqx data has been imported successfully"),
|
||||||
|
@ -621,7 +621,7 @@ import(Filename, OverridesJson) ->
|
||||||
Overrides = emqx_json:decode(OverridesJson, [return_maps]),
|
Overrides = emqx_json:decode(OverridesJson, [return_maps]),
|
||||||
Data = maps:merge(Imported, Overrides),
|
Data = maps:merge(Imported, Overrides),
|
||||||
Version = to_version(maps:get(<<"version">>, Data)),
|
Version = to_version(maps:get(<<"version">>, Data)),
|
||||||
read_global_auth_type(Data),
|
read_global_auth_type(Data, Version),
|
||||||
case is_version_supported(Data, Version) of
|
case is_version_supported(Data, Version) of
|
||||||
true ->
|
true ->
|
||||||
try
|
try
|
||||||
|
@ -696,17 +696,17 @@ is_version_supported2(Version) ->
|
||||||
end.
|
end.
|
||||||
-endif.
|
-endif.
|
||||||
|
|
||||||
read_global_auth_type(Data) ->
|
read_global_auth_type(Data, Version) ->
|
||||||
case {maps:get(<<"auth_mnesia">>, Data, []), maps:get(<<"acl_mnesia">>, Data, [])} of
|
case {maps:get(<<"auth_mnesia">>, Data, []), maps:get(<<"acl_mnesia">>, Data, [])} of
|
||||||
{[], []} ->
|
{[], []} ->
|
||||||
%% Auth mnesia plugin is not used:
|
%% Auth mnesia plugin is not used:
|
||||||
ok;
|
ok;
|
||||||
_ ->
|
_ ->
|
||||||
do_read_global_auth_type(Data)
|
do_read_global_auth_type(Data, Version)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-ifdef(EMQX_ENTERPRISE).
|
-ifdef(EMQX_ENTERPRISE).
|
||||||
do_read_global_auth_type(Data) ->
|
do_read_global_auth_type(Data, _Version) ->
|
||||||
case Data of
|
case Data of
|
||||||
#{<<"auth.mnesia.as">> := <<"username">>} ->
|
#{<<"auth.mnesia.as">> := <<"username">>} ->
|
||||||
application:set_env(emqx_auth_mnesia, as, username);
|
application:set_env(emqx_auth_mnesia, as, username);
|
||||||
|
@ -717,13 +717,15 @@ do_read_global_auth_type(Data) ->
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-else.
|
-else.
|
||||||
do_read_global_auth_type(Data) ->
|
do_read_global_auth_type(Data, FromVersion) ->
|
||||||
case Data of
|
case Data of
|
||||||
#{<<"auth.mnesia.as">> := <<"username">>} ->
|
#{<<"auth.mnesia.as">> := <<"username">>} ->
|
||||||
application:set_env(emqx_auth_mnesia, as, username);
|
application:set_env(emqx_auth_mnesia, as, username);
|
||||||
#{<<"auth.mnesia.as">> := <<"clientid">>} ->
|
#{<<"auth.mnesia.as">> := <<"clientid">>} ->
|
||||||
application:set_env(emqx_auth_mnesia, as, clientid);
|
application:set_env(emqx_auth_mnesia, as, clientid);
|
||||||
_ ->
|
_ when FromVersion =:= "4.0" orelse
|
||||||
|
FromVersion =:= "4.1" orelse
|
||||||
|
FromVersion =:= "4.2"->
|
||||||
logger:error("While importing data from EMQX versions prior to 4.3 "
|
logger:error("While importing data from EMQX versions prior to 4.3 "
|
||||||
"it is necessary to specify the value of \"auth.mnesia.as\" parameter "
|
"it is necessary to specify the value of \"auth.mnesia.as\" parameter "
|
||||||
"as it was configured in etc/plugins/emqx_auth_mnesia.conf.\n"
|
"as it was configured in etc/plugins/emqx_auth_mnesia.conf.\n"
|
||||||
|
@ -732,7 +734,9 @@ do_read_global_auth_type(Data) ->
|
||||||
"or\n"
|
"or\n"
|
||||||
" $ emqx_ctl data import <filename> --env '{\"auth.mnesia.as\":\"clientid\"}'",
|
" $ emqx_ctl data import <filename> --env '{\"auth.mnesia.as\":\"clientid\"}'",
|
||||||
[]),
|
[]),
|
||||||
error(import_failed)
|
error(import_failed);
|
||||||
|
_ ->
|
||||||
|
ok
|
||||||
end.
|
end.
|
||||||
-endif.
|
-endif.
|
||||||
|
|
||||||
|
|
|
@ -583,7 +583,7 @@ t_data(_) ->
|
||||||
?assertMatch({ok, _}, request_api(post, api_path(["data","import"]), [], auth_header_(), #{<<"filename">> => Filename, <<"node">> => Node})),
|
?assertMatch({ok, _}, request_api(post, api_path(["data","import"]), [], auth_header_(), #{<<"filename">> => Filename, <<"node">> => Node})),
|
||||||
?assertMatch({ok, _}, request_api(post, api_path(["data","import"]), [], auth_header_(), #{<<"filename">> => Filename})),
|
?assertMatch({ok, _}, request_api(post, api_path(["data","import"]), [], auth_header_(), #{<<"filename">> => Filename})),
|
||||||
application:stop(emqx_rule_engine),
|
application:stop(emqx_rule_engine),
|
||||||
application:stop(emqx_dahboard),
|
application:stop(emqx_dashboard),
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
t_data_import_content(_) ->
|
t_data_import_content(_) ->
|
||||||
|
@ -598,7 +598,7 @@ t_data_import_content(_) ->
|
||||||
Content = emqx_json:decode(Bin),
|
Content = emqx_json:decode(Bin),
|
||||||
?assertMatch({ok, "{\"code\":0}"}, request_api(post, api_path(["data","import"]), [], auth_header_(), Content)),
|
?assertMatch({ok, "{\"code\":0}"}, request_api(post, api_path(["data","import"]), [], auth_header_(), Content)),
|
||||||
application:stop(emqx_rule_engine),
|
application:stop(emqx_rule_engine),
|
||||||
application:stop(emqx_dahboard).
|
application:stop(emqx_dashboard).
|
||||||
|
|
||||||
request_api(Method, Url, Auth) ->
|
request_api(Method, Url, Auth) ->
|
||||||
request_api(Method, Url, [], Auth, []).
|
request_api(Method, Url, [], Auth, []).
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
[ {load_module,emqx_channel,brutal_purge,soft_purge,[]}
|
[ {load_module,emqx_channel,brutal_purge,soft_purge,[]}
|
||||||
, {load_module,emqx_metrics,brutal_purge,soft_purge,[]}
|
, {load_module,emqx_metrics,brutal_purge,soft_purge,[]}
|
||||||
, {load_module,emqx_session,brutal_purge,soft_purge,[]}
|
, {load_module,emqx_session,brutal_purge,soft_purge,[]}
|
||||||
|
, {load_module,emqx_alarm,brutal_purge,soft_purge,[]}
|
||||||
]},
|
]},
|
||||||
{"4.3.11",
|
{"4.3.11",
|
||||||
[{load_module,emqx_connection,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_connection,brutal_purge,soft_purge,[]},
|
||||||
|
@ -13,6 +14,7 @@
|
||||||
{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
|
{load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.10",
|
{"4.3.10",
|
||||||
[{load_module,emqx_channel,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_channel,brutal_purge,soft_purge,[]},
|
||||||
|
@ -23,6 +25,7 @@
|
||||||
{load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
|
{load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_connection,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_connection,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.9",
|
{"4.3.9",
|
||||||
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
|
@ -38,6 +41,7 @@
|
||||||
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.8",
|
{"4.3.8",
|
||||||
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
|
@ -53,6 +57,7 @@
|
||||||
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.7",
|
{"4.3.7",
|
||||||
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
|
@ -70,6 +75,7 @@
|
||||||
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.6",
|
{"4.3.6",
|
||||||
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
|
@ -88,6 +94,7 @@
|
||||||
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.5",
|
{"4.3.5",
|
||||||
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
|
@ -107,6 +114,7 @@
|
||||||
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.4",
|
{"4.3.4",
|
||||||
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
|
@ -127,6 +135,7 @@
|
||||||
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.3",
|
{"4.3.3",
|
||||||
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
|
@ -148,6 +157,7 @@
|
||||||
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.2",
|
{"4.3.2",
|
||||||
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
|
@ -169,6 +179,7 @@
|
||||||
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.1",
|
{"4.3.1",
|
||||||
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
|
@ -194,6 +205,7 @@
|
||||||
{load_module,emqx_pqueue,brutal_purge,soft_purge,[]},
|
{load_module,emqx_pqueue,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.0",
|
{"4.3.0",
|
||||||
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
|
@ -222,12 +234,14 @@
|
||||||
{load_module,emqx_access_rule,brutal_purge,soft_purge,[]},
|
{load_module,emqx_access_rule,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
|
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
||||||
{<<".*">>,[]}],
|
{<<".*">>,[]}],
|
||||||
[{"4.3.12",
|
[{"4.3.12",
|
||||||
[ {load_module,emqx_channel,brutal_purge,soft_purge,[]}
|
[ {load_module,emqx_channel,brutal_purge,soft_purge,[]}
|
||||||
, {load_module,emqx_metrics,brutal_purge,soft_purge,[]}
|
, {load_module,emqx_metrics,brutal_purge,soft_purge,[]}
|
||||||
, {load_module,emqx_session,brutal_purge,soft_purge,[]}
|
, {load_module,emqx_session,brutal_purge,soft_purge,[]}
|
||||||
|
, {load_module,emqx_alarm,brutal_purge,soft_purge,[]}
|
||||||
]},
|
]},
|
||||||
{"4.3.11",
|
{"4.3.11",
|
||||||
[{load_module,emqx_connection,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_connection,brutal_purge,soft_purge,[]},
|
||||||
|
@ -237,6 +251,7 @@
|
||||||
{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
|
{load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.10",
|
{"4.3.10",
|
||||||
[{load_module,emqx_channel,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_channel,brutal_purge,soft_purge,[]},
|
||||||
|
@ -247,6 +262,7 @@
|
||||||
{load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
|
{load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_connection,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_connection,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.9",
|
{"4.3.9",
|
||||||
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
|
@ -262,6 +278,7 @@
|
||||||
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.8",
|
{"4.3.8",
|
||||||
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
|
@ -277,6 +294,7 @@
|
||||||
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.7",
|
{"4.3.7",
|
||||||
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
|
@ -294,6 +312,7 @@
|
||||||
{load_module,emqx_misc,brutal_purge,soft_purge,[]},
|
{load_module,emqx_misc,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.6",
|
{"4.3.6",
|
||||||
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
|
@ -312,6 +331,7 @@
|
||||||
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
|
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.5",
|
{"4.3.5",
|
||||||
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
|
@ -331,6 +351,7 @@
|
||||||
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
|
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.4",
|
{"4.3.4",
|
||||||
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
|
@ -351,6 +372,7 @@
|
||||||
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
|
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.3",
|
{"4.3.3",
|
||||||
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
|
@ -372,6 +394,7 @@
|
||||||
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
|
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.2",
|
{"4.3.2",
|
||||||
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
|
@ -393,6 +416,7 @@
|
||||||
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
|
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
{load_module,emqx_frame,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.1",
|
{"4.3.1",
|
||||||
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
|
@ -418,6 +442,7 @@
|
||||||
{load_module,emqx_access_rule,brutal_purge,soft_purge,[]},
|
{load_module,emqx_access_rule,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
|
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.0",
|
{"4.3.0",
|
||||||
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_vm,brutal_purge,soft_purge,[]},
|
||||||
|
@ -445,5 +470,6 @@
|
||||||
{load_module,emqx_pqueue,brutal_purge,soft_purge,[]},
|
{load_module,emqx_pqueue,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rpc,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_alarm,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_app,brutal_purge,soft_purge,[]}]},
|
||||||
{<<".*">>,[]}]}.
|
{<<".*">>,[]}]}.
|
||||||
|
|
Loading…
Reference in New Issue