Jelajahi Sumber

Merge remote-tracking branch 'origin/dev/v4.3.0' into dev/v5.0

Zaiming Shi 5 tahun lalu
induk
melakukan
c2cd2fd231
100 mengubah file dengan 154 tambahan dan 57 penghapusan
  1. 6 6
      apps/emqx_auth_http/src/emqx_auth_http_app.erl
  2. 1 1
      apps/emqx_auth_mnesia/src/emqx_acl_mnesia_api.erl
  3. 5 5
      apps/emqx_auth_mnesia/src/emqx_auth_mnesia_cli.erl
  4. 2 2
      apps/emqx_coap/src/emqx_coap_server.erl
  5. 4 4
      apps/emqx_exproto/src/emqx_exproto.erl
  6. 2 2
      apps/emqx_lwm2m/src/emqx_lwm2m_coap_server.erl
  7. 0 0
      apps/emqx_rule_engine/.gitignore
  8. 0 0
      apps/emqx_rule_engine/README.md
  9. 0 0
      apps/emqx_rule_engine/docs/api_examples.md
  10. 0 0
      apps/emqx_rule_engine/docs/cli_examples.md
  11. 0 0
      apps/emqx_rule_engine/docs/design.md
  12. 0 0
      apps/emqx_rule_engine/etc/emqx_rule_engine.conf
  13. 0 0
      apps/emqx_rule_engine/include/rule_actions.hrl
  14. 0 0
      apps/emqx_rule_engine/include/rule_engine.hrl
  15. 0 0
      apps/emqx_rule_engine/priv/emqx_rule_engine.schema
  16. 0 0
      apps/emqx_rule_engine/rebar.config
  17. 0 0
      apps/emqx_rule_engine/src/emqx_rule_actions.erl
  18. 0 0
      apps/emqx_rule_engine/src/emqx_rule_actions_trans.erl
  19. 0 0
      apps/emqx_rule_engine/src/emqx_rule_engine.app.src
  20. 0 0
      apps/emqx_rule_engine/src/emqx_rule_engine.erl
  21. 0 0
      apps/emqx_rule_engine/src/emqx_rule_engine_api.erl
  22. 0 0
      apps/emqx_rule_engine/src/emqx_rule_engine_app.erl
  23. 0 0
      apps/emqx_rule_engine/src/emqx_rule_engine_cli.erl
  24. 0 0
      apps/emqx_rule_engine/src/emqx_rule_engine_sup.erl
  25. 0 0
      apps/emqx_rule_engine/src/emqx_rule_events.erl
  26. 0 0
      apps/emqx_rule_engine/src/emqx_rule_funcs.erl
  27. 0 0
      apps/emqx_rule_engine/src/emqx_rule_id.erl
  28. 0 0
      apps/emqx_rule_engine/src/emqx_rule_locker.erl
  29. 0 0
      apps/emqx_rule_engine/src/emqx_rule_maps.erl
  30. 0 0
      apps/emqx_rule_engine/src/emqx_rule_metrics.erl
  31. 0 0
      apps/emqx_rule_engine/src/emqx_rule_registry.erl
  32. 0 0
      apps/emqx_rule_engine/src/emqx_rule_runtime.erl
  33. 0 0
      apps/emqx_rule_engine/src/emqx_rule_sqlparser.erl
  34. 0 0
      apps/emqx_rule_engine/src/emqx_rule_sqltester.erl
  35. 0 0
      apps/emqx_rule_engine/src/emqx_rule_utils.erl
  36. 0 0
      apps/emqx_rule_engine/src/emqx_rule_validator.erl
  37. 0 0
      apps/emqx_rule_engine/test/emqx_rule_engine_SUITE.erl
  38. 0 0
      apps/emqx_rule_engine/test/emqx_rule_events_SUITE.erl
  39. 0 0
      apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl
  40. 0 0
      apps/emqx_rule_engine/test/emqx_rule_id_SUITE.erl
  41. 0 0
      apps/emqx_rule_engine/test/emqx_rule_maps_SUITE.erl
  42. 0 0
      apps/emqx_rule_engine/test/emqx_rule_metrics_SUITE.erl
  43. 0 0
      apps/emqx_rule_engine/test/emqx_rule_registry_SUITE.erl
  44. 0 0
      apps/emqx_rule_engine/test/emqx_rule_utils_SUITE.erl
  45. 0 0
      apps/emqx_rule_engine/test/emqx_rule_validator_SUITE.erl
  46. 0 0
      apps/emqx_rule_engine/test/prop_rule_maps.erl
  47. 2 2
      apps/emqx_sn/src/emqx_sn_app.erl
  48. 1 1
      apps/emqx_sn/vars
  49. 2 2
      apps/emqx_stomp/src/emqx_stomp.erl
  50. 1 1
      bin/nodetool
  51. 2 2
      elvis.config
  52. 2 2
      get-dashboard.sh
  53. 0 0
      lib-ce/emqx_dashboard/.gitignore
  54. 0 0
      lib-ce/emqx_dashboard/README.md
  55. 0 0
      lib-ce/emqx_dashboard/etc/emqx_dashboard.conf
  56. 0 0
      lib-ce/emqx_dashboard/include/emqx_dashboard.hrl
  57. 0 0
      lib-ce/emqx_dashboard/priv/emqx_dashboard.schema
  58. 0 0
      lib-ce/emqx_dashboard/rebar.config
  59. 0 0
      lib-ce/emqx_dashboard/src/emqx_dashboard.app.src
  60. 0 0
      lib-ce/emqx_dashboard/src/emqx_dashboard.erl
  61. 0 0
      lib-ce/emqx_dashboard/src/emqx_dashboard_admin.erl
  62. 0 0
      lib-ce/emqx_dashboard/src/emqx_dashboard_api.erl
  63. 0 0
      lib-ce/emqx_dashboard/src/emqx_dashboard_app.erl
  64. 0 0
      lib-ce/emqx_dashboard/src/emqx_dashboard_cli.erl
  65. 0 0
      lib-ce/emqx_dashboard/src/emqx_dashboard_sup.erl
  66. 0 0
      lib-ce/emqx_dashboard/test/.placeholder
  67. 0 0
      lib-ce/emqx_dashboard/test/emqx_dashboard_SUITE.erl
  68. 0 0
      lib-ce/emqx_management/.gitignore
  69. 0 0
      lib-ce/emqx_management/README.md
  70. 0 0
      lib-ce/emqx_management/etc/emqx_management.conf
  71. 0 0
      lib-ce/emqx_management/include/emqx_mgmt.hrl
  72. 0 0
      lib-ce/emqx_management/priv/emqx_management.schema
  73. 0 0
      lib-ce/emqx_management/rebar.config
  74. 0 0
      lib-ce/emqx_management/src/emqx_management.app.src
  75. 9 0
      lib-opensource/emqx_management/src/emqx_mgmt.erl
  76. 0 0
      lib-ce/emqx_management/src/emqx_mgmt_api.erl
  77. 0 0
      lib-ce/emqx_management/src/emqx_mgmt_api_alarms.erl
  78. 0 0
      lib-ce/emqx_management/src/emqx_mgmt_api_apps.erl
  79. 0 0
      lib-ce/emqx_management/src/emqx_mgmt_api_banned.erl
  80. 0 0
      lib-ce/emqx_management/src/emqx_mgmt_api_brokers.erl
  81. 0 0
      lib-ce/emqx_management/src/emqx_mgmt_api_clients.erl
  82. 0 0
      lib-ce/emqx_management/src/emqx_mgmt_api_data.erl
  83. 28 1
      lib-opensource/emqx_management/src/emqx_mgmt_api_listeners.erl
  84. 0 0
      lib-ce/emqx_management/src/emqx_mgmt_api_metrics.erl
  85. 0 0
      lib-ce/emqx_management/src/emqx_mgmt_api_modules.erl
  86. 0 0
      lib-ce/emqx_management/src/emqx_mgmt_api_nodes.erl
  87. 0 0
      lib-ce/emqx_management/src/emqx_mgmt_api_plugins.erl
  88. 0 0
      lib-ce/emqx_management/src/emqx_mgmt_api_pubsub.erl
  89. 0 0
      lib-ce/emqx_management/src/emqx_mgmt_api_routes.erl
  90. 0 0
      lib-ce/emqx_management/src/emqx_mgmt_api_stats.erl
  91. 0 0
      lib-ce/emqx_management/src/emqx_mgmt_api_subscriptions.erl
  92. 0 0
      lib-ce/emqx_management/src/emqx_mgmt_api_topic_metrics.erl
  93. 0 0
      lib-ce/emqx_management/src/emqx_mgmt_app.erl
  94. 0 0
      lib-ce/emqx_management/src/emqx_mgmt_auth.erl
  95. 59 22
      lib-opensource/emqx_management/src/emqx_mgmt_cli.erl
  96. 0 0
      lib-ce/emqx_management/src/emqx_mgmt_http.erl
  97. 0 0
      lib-ce/emqx_management/src/emqx_mgmt_sup.erl
  98. 0 0
      lib-ce/emqx_management/src/emqx_mgmt_util.erl
  99. 28 4
      lib-opensource/emqx_management/test/emqx_mgmt_SUITE.erl
  100. 0 0
      lib-opensource/emqx_management/test/emqx_mgmt_api_SUITE.erl

+ 6 - 6
apps/emqx_auth_http/src/emqx_auth_http_app.erl

@@ -106,7 +106,7 @@ load_hooks() ->
             ok = emqx_auth_http:register_metrics(),
             PoolOpts = proplists:get_value(pool_opts, AuthReq),
             PoolName = proplists:get_value(pool_name, AuthReq),
-            ehttpc_sup:start_pool(PoolName, PoolOpts),
+            {ok, _} = ehttpc_sup:start_pool(PoolName, PoolOpts),
             case application:get_env(?APP, super_req) of
                 undefined ->
                     emqx:hook('client.authenticate', {emqx_auth_http, check, [#{auth => maps:from_list(AuthReq),
@@ -114,7 +114,7 @@ load_hooks() ->
                 {ok, SuperReq} ->
                     PoolOpts1 = proplists:get_value(pool_opts, SuperReq),
                     PoolName1 = proplists:get_value(pool_name, SuperReq),
-                    ehttpc_sup:start_pool(PoolName1, PoolOpts1),
+                    {ok, _} = ehttpc_sup:start_pool(PoolName1, PoolOpts1),
                     emqx:hook('client.authenticate', {emqx_auth_http, check, [#{auth => maps:from_list(AuthReq),
                                                                                 super => maps:from_list(SuperReq)}]})
             end
@@ -125,7 +125,7 @@ load_hooks() ->
             ok = emqx_acl_http:register_metrics(),
             PoolOpts2 = proplists:get_value(pool_opts, ACLReq),
             PoolName2 = proplists:get_value(pool_name, ACLReq),
-            ehttpc_sup:start_pool(PoolName2, PoolOpts2),
+            {ok, _} = ehttpc_sup:start_pool(PoolName2, PoolOpts2),
             emqx:hook('client.check_acl', {emqx_acl_http, check_acl, [#{acl => maps:from_list(ACLReq)}]})
     end,
     ok.
@@ -133,9 +133,9 @@ load_hooks() ->
 unload_hooks() ->
     emqx:unhook('client.authenticate', {emqx_auth_http, check}),
     emqx:unhook('client.check_acl', {emqx_acl_http, check_acl}),
-    ehttpc_sup:stop_pool('emqx_auth_http/auth_req'),
-    ehttpc_sup:stop_pool('emqx_auth_http/super_req'),
-    ehttpc_sup:stop_pool('emqx_auth_http/acl_req'),
+    _ = ehttpc_sup:stop_pool('emqx_auth_http/auth_req'),
+    _ = ehttpc_sup:stop_pool('emqx_auth_http/super_req'),
+    _ = ehttpc_sup:stop_pool('emqx_auth_http/acl_req'),
     ok.
 
 parse_host(Host) ->

+ 1 - 1
apps/emqx_auth_mnesia/src/emqx_acl_mnesia_api.erl

@@ -129,7 +129,7 @@ add(_Bindings, Params) ->
             case Re of
                 #{result := ok} -> return({ok, Re});
                 #{result := <<"ok">>} -> return({ok, Re});
-                _ -> return({error, Re})
+                _ -> return({error, {add, Re}})
             end
     end.
 

+ 5 - 5
apps/emqx_auth_mnesia/src/emqx_auth_mnesia_cli.erl

@@ -59,12 +59,12 @@ insert_user(User = #emqx_user{login = Login}) ->
 %% @doc Update User
 -spec(update_user(tuple(), binary()) -> ok | {error, any()}).
 update_user(Login, NewPassword) ->
-    User = #emqx_user{login = Login, password = encrypted_data(NewPassword)},
-    ret(mnesia:transaction(fun do_update_user/1, [User])).
+    ret(mnesia:transaction(fun do_update_user/2, [Login, encrypted_data(NewPassword)])).
 
-do_update_user(User = #emqx_user{login = Login}) ->
+do_update_user(Login, NewPassword) ->
     case mnesia:read(?TABLE, Login) of
-        [{?TABLE, Login, _, CreateAt}] -> mnesia:write(User#emqx_user{created_at = CreateAt});
+        [#emqx_user{} = User] ->
+            mnesia:write(User#emqx_user{password = NewPassword});
         [] -> mnesia:abort(noexisted)
     end.
 
@@ -119,7 +119,7 @@ hash(Password, SaltBin, HashType) ->
     emqx_passwd:hash(HashType, <<SaltBin/binary, Password/binary>>).
 
 salt() ->
-    rand:seed(exsplus, erlang:timestamp()),
+    {_AlgHandler, _AlgState} = rand:seed(exsplus, erlang:timestamp()),
     Salt = rand:uniform(16#ffffffff), <<Salt:32>>.
 
 %%--------------------------------------------------------------------

+ 2 - 2
apps/emqx_coap/src/emqx_coap_server.erl

@@ -55,7 +55,7 @@ start_listener({Proto, ListenOn, Opts}) ->
             io:format("Start coap:~s listener on ~s successfully.~n",
                       [Proto, format(ListenOn)]);
         {error, Reason} ->
-            io:format(standard_error, "Failed to start coap:~s listener on ~s - ~0p~n!",
+            io:format(standard_error, "Failed to start coap:~s listener on ~s: ~0p~n",
                       [Proto, format(ListenOn), Reason]),
             error(Reason)
     end.
@@ -71,7 +71,7 @@ stop_listener({Proto, ListenOn, _Opts}) ->
         ok -> io:format("Stop coap:~s listener on ~s successfully.~n",
                         [Proto, format(ListenOn)]);
         {error, Reason} ->
-            io:format(standard_error, "Failed to stop coap:~s listener on ~s - ~p~n.",
+            io:format(standard_error, "Failed to stop coap:~s listener on ~s: ~0p~n.",
                       [Proto, format(ListenOn), Reason])
     end,
     Ret.

+ 4 - 4
apps/emqx_exproto/src/emqx_exproto.erl

@@ -69,7 +69,7 @@ start_connection_handler_instance({_Proto, _LisType, _ListenOn, Opts}) ->
         {ok, _ClientChannelPid} ->
             {_Proto, _LisType, _ListenOn, [{handler, Name} | LisOpts]};
         {error, Reason} ->
-            io:format(standard_error, "Failed to start ~s's connection handler - ~0p~n!",
+            io:format(standard_error, "Failed to start ~s's connection handler: ~0p~n",
                       [Name, Reason]),
             error(Reason)
     end.
@@ -85,7 +85,7 @@ start_server({Name, Port, SSLOptions}) ->
             io:format("Start ~s gRPC server on ~w successfully.~n",
                       [Name, Port]);
         {error, Reason} ->
-            io:format(standard_error, "Failed to start ~s gRPC server on ~w - ~0p~n!",
+            io:format(standard_error, "Failed to start ~s gRPC server on ~w: ~0p~n",
                       [Name, Port, Reason]),
             error({failed_start_server, Reason})
     end.
@@ -101,7 +101,7 @@ start_listener({Proto, LisType, ListenOn, Opts}) ->
             io:format("Start ~s listener on ~s successfully.~n",
                       [Name, format(ListenOn)]);
         {error, Reason} ->
-            io:format(standard_error, "Failed to start ~s listener on ~s - ~0p~n!",
+            io:format(standard_error, "Failed to start ~s listener on ~s: ~0p~n",
                       [Name, format(ListenOn), Reason]),
             error(Reason)
     end.
@@ -132,7 +132,7 @@ stop_listener({Proto, LisType, ListenOn, Opts}) ->
             io:format("Stop ~s listener on ~s successfully.~n",
                       [Name, format(ListenOn)]);
         {error, Reason} ->
-            io:format(standard_error, "Failed to stop ~s listener on ~s - ~p~n.",
+            io:format(standard_error, "Failed to stop ~s listener on ~s: ~0p~n",
                       [Name, format(ListenOn), Reason])
     end,
     StopRet.

+ 2 - 2
apps/emqx_lwm2m/src/emqx_lwm2m_coap_server.erl

@@ -47,7 +47,7 @@ start_listener({Proto, ListenOn, Opts}) ->
             io:format("Start lwm2m:~s listener on ~s successfully.~n",
                       [Proto, format(ListenOn)]);
         {error, Reason} ->
-            io:format(standard_error, "Failed to start lwm2m:~s listener on ~s - ~0p~n!",
+            io:format(standard_error, "Failed to start lwm2m:~s listener on ~s: ~0p~n",
                       [Proto, format(ListenOn), Reason]),
             error(Reason)
     end.
@@ -63,7 +63,7 @@ stop_listener({Proto, ListenOn, _Opts}) ->
         ok -> io:format("Stop lwm2m:~s listener on ~s successfully.~n",
                         [Proto, format(ListenOn)]);
         {error, Reason} ->
-            io:format(standard_error, "Failed to stop lwm2m:~s listener on ~s - ~p~n.",
+            io:format(standard_error, "Failed to stop lwm2m:~s listener on ~s: ~0p~n",
                       [Proto, format(ListenOn), Reason])
     end,
     Ret.

lib-opensource/emqx_rule_engine/.gitignore → apps/emqx_rule_engine/.gitignore


lib-opensource/emqx_rule_engine/README.md → apps/emqx_rule_engine/README.md


lib-opensource/emqx_rule_engine/docs/api_examples.md → apps/emqx_rule_engine/docs/api_examples.md


lib-opensource/emqx_rule_engine/docs/cli_examples.md → apps/emqx_rule_engine/docs/cli_examples.md


lib-opensource/emqx_rule_engine/docs/design.md → apps/emqx_rule_engine/docs/design.md


lib-opensource/emqx_rule_engine/etc/emqx_rule_engine.conf → apps/emqx_rule_engine/etc/emqx_rule_engine.conf


lib-opensource/emqx_rule_engine/include/rule_actions.hrl → apps/emqx_rule_engine/include/rule_actions.hrl


lib-opensource/emqx_rule_engine/include/rule_engine.hrl → apps/emqx_rule_engine/include/rule_engine.hrl


lib-opensource/emqx_rule_engine/priv/emqx_rule_engine.schema → apps/emqx_rule_engine/priv/emqx_rule_engine.schema


lib-opensource/emqx_rule_engine/rebar.config → apps/emqx_rule_engine/rebar.config


lib-opensource/emqx_rule_engine/src/emqx_rule_actions.erl → apps/emqx_rule_engine/src/emqx_rule_actions.erl


lib-opensource/emqx_rule_engine/src/emqx_rule_actions_trans.erl → apps/emqx_rule_engine/src/emqx_rule_actions_trans.erl


lib-opensource/emqx_rule_engine/src/emqx_rule_engine.app.src → apps/emqx_rule_engine/src/emqx_rule_engine.app.src


lib-opensource/emqx_rule_engine/src/emqx_rule_engine.erl → apps/emqx_rule_engine/src/emqx_rule_engine.erl


lib-opensource/emqx_rule_engine/src/emqx_rule_engine_api.erl → apps/emqx_rule_engine/src/emqx_rule_engine_api.erl


lib-opensource/emqx_rule_engine/src/emqx_rule_engine_app.erl → apps/emqx_rule_engine/src/emqx_rule_engine_app.erl


lib-opensource/emqx_rule_engine/src/emqx_rule_engine_cli.erl → apps/emqx_rule_engine/src/emqx_rule_engine_cli.erl


lib-opensource/emqx_rule_engine/src/emqx_rule_engine_sup.erl → apps/emqx_rule_engine/src/emqx_rule_engine_sup.erl


lib-opensource/emqx_rule_engine/src/emqx_rule_events.erl → apps/emqx_rule_engine/src/emqx_rule_events.erl


lib-opensource/emqx_rule_engine/src/emqx_rule_funcs.erl → apps/emqx_rule_engine/src/emqx_rule_funcs.erl


lib-opensource/emqx_rule_engine/src/emqx_rule_id.erl → apps/emqx_rule_engine/src/emqx_rule_id.erl


lib-opensource/emqx_rule_engine/src/emqx_rule_locker.erl → apps/emqx_rule_engine/src/emqx_rule_locker.erl


lib-opensource/emqx_rule_engine/src/emqx_rule_maps.erl → apps/emqx_rule_engine/src/emqx_rule_maps.erl


lib-opensource/emqx_rule_engine/src/emqx_rule_metrics.erl → apps/emqx_rule_engine/src/emqx_rule_metrics.erl


lib-opensource/emqx_rule_engine/src/emqx_rule_registry.erl → apps/emqx_rule_engine/src/emqx_rule_registry.erl


lib-opensource/emqx_rule_engine/src/emqx_rule_runtime.erl → apps/emqx_rule_engine/src/emqx_rule_runtime.erl


lib-opensource/emqx_rule_engine/src/emqx_rule_sqlparser.erl → apps/emqx_rule_engine/src/emqx_rule_sqlparser.erl


lib-opensource/emqx_rule_engine/src/emqx_rule_sqltester.erl → apps/emqx_rule_engine/src/emqx_rule_sqltester.erl


lib-opensource/emqx_rule_engine/src/emqx_rule_utils.erl → apps/emqx_rule_engine/src/emqx_rule_utils.erl


lib-opensource/emqx_rule_engine/src/emqx_rule_validator.erl → apps/emqx_rule_engine/src/emqx_rule_validator.erl


lib-opensource/emqx_rule_engine/test/emqx_rule_engine_SUITE.erl → apps/emqx_rule_engine/test/emqx_rule_engine_SUITE.erl


lib-opensource/emqx_rule_engine/test/emqx_rule_events_SUITE.erl → apps/emqx_rule_engine/test/emqx_rule_events_SUITE.erl


lib-opensource/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl → apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl


lib-opensource/emqx_rule_engine/test/emqx_rule_id_SUITE.erl → apps/emqx_rule_engine/test/emqx_rule_id_SUITE.erl


lib-opensource/emqx_rule_engine/test/emqx_rule_maps_SUITE.erl → apps/emqx_rule_engine/test/emqx_rule_maps_SUITE.erl


lib-opensource/emqx_rule_engine/test/emqx_rule_metrics_SUITE.erl → apps/emqx_rule_engine/test/emqx_rule_metrics_SUITE.erl


lib-opensource/emqx_rule_engine/test/emqx_rule_registry_SUITE.erl → apps/emqx_rule_engine/test/emqx_rule_registry_SUITE.erl


lib-opensource/emqx_rule_engine/test/emqx_rule_utils_SUITE.erl → apps/emqx_rule_engine/test/emqx_rule_utils_SUITE.erl


lib-opensource/emqx_rule_engine/test/emqx_rule_validator_SUITE.erl → apps/emqx_rule_engine/test/emqx_rule_validator_SUITE.erl


lib-opensource/emqx_rule_engine/test/prop_rule_maps.erl → apps/emqx_rule_engine/test/prop_rule_maps.erl


+ 2 - 2
apps/emqx_sn/src/emqx_sn_app.erl

@@ -71,7 +71,7 @@ start_listener({Proto, ListenOn, Options}) ->
         {ok, _} -> io:format("Start mqttsn:~s listener on ~s successfully.~n",
                              [Proto, format(ListenOn)]);
         {error, Reason} ->
-            io:format(standard_error, "Failed to start mqttsn:~s listener on ~s - ~0p~n!",
+            io:format(standard_error, "Failed to start mqttsn:~s listener on ~s: ~0p~n",
                       [Proto, format(ListenOn), Reason]),
             error(Reason)
     end.
@@ -101,7 +101,7 @@ stop_listener({Proto, ListenOn, Opts}) ->
         ok -> io:format("Stop mqttsn:~s listener on ~s successfully.~n",
                         [Proto, format(ListenOn)]);
         {error, Reason} ->
-            io:format(standard_error, "Failed to stop mqttsn:~s listener on ~s - ~p~n.",
+            io:format(standard_error, "Failed to stop mqttsn:~s listener on ~s: ~0p~n",
                       [Proto, format(ListenOn), Reason])
     end,
     StopRet.

+ 1 - 1
apps/emqx_sn/vars

@@ -5,4 +5,4 @@
 {platform_etc_dir,  "etc"}.
 {platform_lib_dir,  "lib"}.
 {platform_log_dir,  "log"}.
-{platform_plugins_dir,  "plugins"}.
+{platform_plugins_dir,  "plugins"}.

+ 2 - 2
apps/emqx_stomp/src/emqx_stomp.erl

@@ -73,7 +73,7 @@ start_listener({Proto, ListenOn, Options}) ->
         {ok, _} -> io:format("Start stomp:~s listener on ~s successfully.~n",
                              [Proto, format(ListenOn)]);
         {error, Reason} ->
-            io:format(standard_error, "Failed to start stomp:~s listener on ~s - ~0p~n!",
+            io:format(standard_error, "Failed to start stomp:~s listener on ~s: ~0p~n",
                       [Proto, format(ListenOn), Reason]),
             error(Reason)
     end.
@@ -102,7 +102,7 @@ stop_listener({Proto, ListenOn, Opts}) ->
         ok -> io:format("Stop stomp:~s listener on ~s successfully.~n",
                         [Proto, format(ListenOn)]);
         {error, Reason} ->
-            io:format(standard_error, "Failed to stop stomp:~s listener on ~s - ~p~n.",
+            io:format(standard_error, "Failed to stop stomp:~s listener on ~s: ~0p~n",
                       [Proto, format(ListenOn), Reason])
     end,
     StopRet.

+ 1 - 1
bin/nodetool

@@ -47,7 +47,7 @@ main(Args) ->
         {true, pong} ->
             ok;
         {false, pong} ->
-            io:format(standard_error, "Failed to connect to node ~p .\n", [TargetNode]),
+            io:format(standard_error, "Failed to connect to node ~p\n", [TargetNode]),
             halt(1);
         {_, pang} ->
             io:format(standard_error, "Node ~p not responding to pings.\n", [TargetNode]),

+ 2 - 2
elvis.config

@@ -5,7 +5,7 @@
    [
     {config,
      [
-      #{dirs => ["src", "apps/**/src", "lib-opensource/**/src"],
+      #{dirs => ["src", "apps/**/src", "lib-ce/**/src"],
         filter => "*.erl",
         ruleset => erl_files,
         rules => [
@@ -16,7 +16,7 @@
                                                                ]}}
            ]
         },
-      #{dirs => ["test", "apps/**/test", "lib-opensource/**/src"],
+      #{dirs => ["test", "apps/**/test", "lib-ce/**/src"],
         filter => "*.erl",
         rules => [
            {elvis_text_style, line_length, #{ limit => 100

+ 2 - 2
get-dashboard.sh

@@ -10,9 +10,9 @@ cd -P -- "$(dirname -- "$0")"
 DOWNLOAD_URL='https://github.com/emqx/emqx-dashboard-frontend/releases/download'
 
 if [ "$EMQX_ENTERPRISE" = 'true' ] || [ "$EMQX_ENTERPRISE" == '1' ]; then
-    DASHBOARD_PATH='lib-enterprise/emqx_dashboard/priv'
+    DASHBOARD_PATH='lib-ee/emqx_dashboard/priv'
 else
-    DASHBOARD_PATH='lib-opensource/emqx_dashboard/priv'
+    DASHBOARD_PATH='lib-ce/emqx_dashboard/priv'
 fi
 
 case $(uname) in

lib-opensource/emqx_dashboard/.gitignore → lib-ce/emqx_dashboard/.gitignore


lib-opensource/emqx_dashboard/README.md → lib-ce/emqx_dashboard/README.md


lib-opensource/emqx_dashboard/etc/emqx_dashboard.conf → lib-ce/emqx_dashboard/etc/emqx_dashboard.conf


lib-opensource/emqx_dashboard/include/emqx_dashboard.hrl → lib-ce/emqx_dashboard/include/emqx_dashboard.hrl


lib-opensource/emqx_dashboard/priv/emqx_dashboard.schema → lib-ce/emqx_dashboard/priv/emqx_dashboard.schema


lib-opensource/emqx_dashboard/rebar.config → lib-ce/emqx_dashboard/rebar.config


lib-opensource/emqx_dashboard/src/emqx_dashboard.app.src → lib-ce/emqx_dashboard/src/emqx_dashboard.app.src


lib-opensource/emqx_dashboard/src/emqx_dashboard.erl → lib-ce/emqx_dashboard/src/emqx_dashboard.erl


lib-opensource/emqx_dashboard/src/emqx_dashboard_admin.erl → lib-ce/emqx_dashboard/src/emqx_dashboard_admin.erl


lib-opensource/emqx_dashboard/src/emqx_dashboard_api.erl → lib-ce/emqx_dashboard/src/emqx_dashboard_api.erl


lib-opensource/emqx_dashboard/src/emqx_dashboard_app.erl → lib-ce/emqx_dashboard/src/emqx_dashboard_app.erl


lib-opensource/emqx_dashboard/src/emqx_dashboard_cli.erl → lib-ce/emqx_dashboard/src/emqx_dashboard_cli.erl


lib-opensource/emqx_dashboard/src/emqx_dashboard_sup.erl → lib-ce/emqx_dashboard/src/emqx_dashboard_sup.erl


lib-opensource/emqx_dashboard/test/.placeholder → lib-ce/emqx_dashboard/test/.placeholder


lib-opensource/emqx_dashboard/test/emqx_dashboard_SUITE.erl → lib-ce/emqx_dashboard/test/emqx_dashboard_SUITE.erl


lib-opensource/emqx_management/.gitignore → lib-ce/emqx_management/.gitignore


lib-opensource/emqx_management/README.md → lib-ce/emqx_management/README.md


lib-opensource/emqx_management/etc/emqx_management.conf → lib-ce/emqx_management/etc/emqx_management.conf


lib-opensource/emqx_management/include/emqx_mgmt.hrl → lib-ce/emqx_management/include/emqx_mgmt.hrl


lib-opensource/emqx_management/priv/emqx_management.schema → lib-ce/emqx_management/priv/emqx_management.schema


lib-opensource/emqx_management/rebar.config → lib-ce/emqx_management/rebar.config


lib-opensource/emqx_management/src/emqx_management.app.src → lib-ce/emqx_management/src/emqx_management.app.src


+ 9 - 0
lib-opensource/emqx_management/src/emqx_mgmt.erl

@@ -102,6 +102,7 @@
 %% Listeners
 -export([ list_listeners/0
         , list_listeners/1
+        , restart_listener/2
         ]).
 
 %% Alarms
@@ -541,6 +542,7 @@ list_listeners(Node) when Node =:= node() ->
     Tcp = lists:map(fun({{Protocol, ListenOn}, _Pid}) ->
         #{protocol        => Protocol,
           listen_on       => ListenOn,
+          identifier      => emqx_listeners:find_id_by_listen_on(ListenOn),
           acceptors       => esockd:get_acceptors({Protocol, ListenOn}),
           max_conns       => esockd:get_max_connections({Protocol, ListenOn}),
           current_conns   => esockd:get_current_connections({Protocol, ListenOn}),
@@ -559,6 +561,12 @@ list_listeners(Node) when Node =:= node() ->
 list_listeners(Node) ->
     rpc_call(Node, list_listeners, [Node]).
 
+restart_listener(Node, Identifier) when Node =:= node() ->
+    emqx_listeners:restart_listener(Identifier);
+
+restart_listener(Node, Identifier) ->
+    rpc_call(Node, restart_listener, [Node, Identifier]).
+
 %%--------------------------------------------------------------------
 %% Get Alarms
 %%--------------------------------------------------------------------
@@ -977,3 +985,4 @@ action_to_prop_list({action_instance, ActionInstId, Name, FallbackActions, Args}
      {name, Name},
      {fallbacks, actions_to_prop_list(FallbackActions)},
      {args, Args}].
+

lib-opensource/emqx_management/src/emqx_mgmt_api.erl → lib-ce/emqx_management/src/emqx_mgmt_api.erl


lib-opensource/emqx_management/src/emqx_mgmt_api_alarms.erl → lib-ce/emqx_management/src/emqx_mgmt_api_alarms.erl


lib-opensource/emqx_management/src/emqx_mgmt_api_apps.erl → lib-ce/emqx_management/src/emqx_mgmt_api_apps.erl


lib-opensource/emqx_management/src/emqx_mgmt_api_banned.erl → lib-ce/emqx_management/src/emqx_mgmt_api_banned.erl


lib-opensource/emqx_management/src/emqx_mgmt_api_brokers.erl → lib-ce/emqx_management/src/emqx_mgmt_api_brokers.erl


lib-opensource/emqx_management/src/emqx_mgmt_api_clients.erl → lib-ce/emqx_management/src/emqx_mgmt_api_clients.erl


lib-opensource/emqx_management/src/emqx_mgmt_api_data.erl → lib-ce/emqx_management/src/emqx_mgmt_api_data.erl


+ 28 - 1
lib-opensource/emqx_management/src/emqx_mgmt_api_listeners.erl

@@ -30,7 +30,19 @@
             func   => list,
             descr  => "A list of listeners on the node"}).
 
--export([list/2]).
+-rest_api(#{name   => restart_listener,
+            method => 'PUT',
+            path   => "/listeners/:bin:identifier/restart",
+            func   => restart,
+            descr  => "Restart a listener in the cluster"}).
+
+-rest_api(#{name   => restart_node_listener,
+            method => 'PUT',
+            path   => "/nodes/:atom:node/listeners/:bin:identifier/restart",
+            func   => restart,
+            descr  => "Restart a listener on a node"}).
+
+-export([list/2, restart/2]).
 
 %% List listeners on a node.
 list(#{node := Node}, _Params) ->
@@ -41,6 +53,21 @@ list(_Binding, _Params) ->
     return({ok, [#{node => Node, listeners => format(Listeners)}
                               || {Node, Listeners} <- emqx_mgmt:list_listeners()]}).
 
+%% Restart listeners on a node.
+restart(#{node := Node, identifier := Identifier}, _Params) ->
+    case emqx_mgmt:restart_listener(Node, Identifier) of
+        ok -> return({ok, "Listener restarted."});
+        {error, Error} -> return({error, Error})
+    end;
+
+%% Restart listeners in the cluster.
+restart(#{identifier := Identifier}, _Params) ->
+    Results = [{Node, emqx_mgmt:restart_listener(Node, Identifier)} || {Node, _Info} <- emqx_mgmt:list_nodes()],
+    case lists:filter(fun({_, Result}) -> Result =/= ok end, Results) of
+        [] -> return(ok);
+        Errors -> return({error, Errors})
+    end.
+
 format(Listeners) when is_list(Listeners) ->
     [ Info#{listen_on => list_to_binary(esockd:to_string(ListenOn))}
      || Info = #{listen_on := ListenOn} <- Listeners ];

lib-opensource/emqx_management/src/emqx_mgmt_api_metrics.erl → lib-ce/emqx_management/src/emqx_mgmt_api_metrics.erl


lib-opensource/emqx_management/src/emqx_mgmt_api_modules.erl → lib-ce/emqx_management/src/emqx_mgmt_api_modules.erl


lib-opensource/emqx_management/src/emqx_mgmt_api_nodes.erl → lib-ce/emqx_management/src/emqx_mgmt_api_nodes.erl


lib-opensource/emqx_management/src/emqx_mgmt_api_plugins.erl → lib-ce/emqx_management/src/emqx_mgmt_api_plugins.erl


lib-opensource/emqx_management/src/emqx_mgmt_api_pubsub.erl → lib-ce/emqx_management/src/emqx_mgmt_api_pubsub.erl


lib-opensource/emqx_management/src/emqx_mgmt_api_routes.erl → lib-ce/emqx_management/src/emqx_mgmt_api_routes.erl


lib-opensource/emqx_management/src/emqx_mgmt_api_stats.erl → lib-ce/emqx_management/src/emqx_mgmt_api_stats.erl


lib-opensource/emqx_management/src/emqx_mgmt_api_subscriptions.erl → lib-ce/emqx_management/src/emqx_mgmt_api_subscriptions.erl


lib-opensource/emqx_management/src/emqx_mgmt_api_topic_metrics.erl → lib-ce/emqx_management/src/emqx_mgmt_api_topic_metrics.erl


lib-opensource/emqx_management/src/emqx_mgmt_app.erl → lib-ce/emqx_management/src/emqx_mgmt_app.erl


lib-opensource/emqx_management/src/emqx_mgmt_auth.erl → lib-ce/emqx_management/src/emqx_mgmt_auth.erl


+ 59 - 22
lib-opensource/emqx_management/src/emqx_mgmt_cli.erl

@@ -157,7 +157,7 @@ cluster(["join", SNode]) ->
         ignore ->
             emqx_ctl:print("Ignore.~n");
         {error, Error} ->
-            emqx_ctl:print("Failed to join the cluster: ~p~n", [Error])
+            emqx_ctl:print("Failed to join the cluster: ~0p~n", [Error])
     end;
 
 cluster(["leave"]) ->
@@ -166,7 +166,7 @@ cluster(["leave"]) ->
             emqx_ctl:print("Leave the cluster successfully.~n"),
             cluster(["status"]);
         {error, Error} ->
-            emqx_ctl:print("Failed to leave the cluster: ~p~n", [Error])
+            emqx_ctl:print("Failed to leave the cluster: ~0p~n", [Error])
     end;
 
 cluster(["force-leave", SNode]) ->
@@ -177,7 +177,7 @@ cluster(["force-leave", SNode]) ->
         ignore ->
             emqx_ctl:print("Ignore.~n");
         {error, Error} ->
-            emqx_ctl:print("Failed to remove the node from cluster: ~p~n", [Error])
+            emqx_ctl:print("Failed to remove the node from cluster: ~0p~n", [Error])
     end;
 
 cluster(["status"]) ->
@@ -510,49 +510,73 @@ trace_off(Who, Name) ->
 
 listeners([]) ->
     foreach(fun({{Protocol, ListenOn}, _Pid}) ->
-                Info = [{acceptors,      esockd:get_acceptors({Protocol, ListenOn})},
+                Info = [{listen_on,      {string, emqx_listeners:format_listen_on(ListenOn)}},
+                        {acceptors,      esockd:get_acceptors({Protocol, ListenOn})},
                         {max_conns,      esockd:get_max_connections({Protocol, ListenOn})},
                         {current_conn,   esockd:get_current_connections({Protocol, ListenOn})},
-                        {shutdown_count, esockd:get_shutdown_count({Protocol, ListenOn})}],
-                    emqx_ctl:print("listener on ~s:~s~n", [Protocol, esockd:to_string(ListenOn)]),
-                foreach(fun({Key, Val}) ->
-                            emqx_ctl:print("  ~-16s: ~w~n", [Key, Val])
-                        end, Info)
+                        {shutdown_count, esockd:get_shutdown_count({Protocol, ListenOn})}
+                       ],
+                    emqx_ctl:print("~s~n", [listener_identifier(Protocol, ListenOn)]),
+                foreach(fun indent_print/1, Info)
             end, esockd:listeners()),
     foreach(fun({Protocol, Opts}) ->
-                Info = [{acceptors,      maps:get(num_acceptors, proplists:get_value(transport_options, Opts, #{}), 0)},
+                Port = proplists:get_value(port, Opts),
+                Info = [{listen_on,      {string, emqx_listeners:format_listen_on(Port)}},
+                        {acceptors,      maps:get(num_acceptors, proplists:get_value(transport_options, Opts, #{}), 0)},
                         {max_conns,      proplists:get_value(max_connections, Opts)},
                         {current_conn,   proplists:get_value(all_connections, Opts)},
                         {shutdown_count, []}],
-                    emqx_ctl:print("listener on ~s:~p~n", [Protocol, proplists:get_value(port, Opts)]),
-                foreach(fun({Key, Val}) ->
-                            emqx_ctl:print("  ~-16s: ~w~n", [Key, Val])
-                        end, Info)
+                    emqx_ctl:print("~s~n", [listener_identifier(Protocol, Port)]),
+                foreach(fun indent_print/1, Info)
             end, ranch:info());
 
-listeners(["stop",  Name = "http" ++ _N, ListenOn]) ->
+listeners(["stop",  Name = "http" ++ _N | _MaybePort]) ->
+    %% _MaybePort is to be backward compatible, to stop http listener, there is no need for the port number
     case minirest:stop_http(list_to_atom(Name)) of
         ok ->
-            emqx_ctl:print("Stop ~s listener on ~s successfully.~n", [Name, ListenOn]);
+            emqx_ctl:print("Stop ~s listener successfully.~n", [Name]);
         {error, Error} ->
-            emqx_ctl:print("Failed to stop ~s listener on ~s, error:~p~n", [Name, ListenOn, Error])
+            emqx_ctl:print("Failed to stop ~s listener: ~0p~n", [Name, Error])
     end;
 
-listeners(["stop", Proto, ListenOn]) ->
+listeners(["stop", "mqtt:" ++ _ = Identifier]) ->
+    stop_listener(emqx_listeners:find_by_id(Identifier), Identifier);
+
+listeners(["stop", _Proto, ListenOn]) ->
+    %% this clause is kept to be backward compatible
     ListenOn1 = case string:tokens(ListenOn, ":") of
         [Port]     -> list_to_integer(Port);
         [IP, Port] -> {IP, list_to_integer(Port)}
     end,
-    case emqx_listeners:stop_listener({list_to_atom(Proto), ListenOn1, []}) of
+    stop_listener(emqx_listeners:find_by_listen_on(ListenOn1), ListenOn1);
+
+listeners(["restart", Identifier]) ->
+    case emqx_listeners:restart_listener(Identifier) of
         ok ->
-            emqx_ctl:print("Stop ~s listener on ~s successfully.~n", [Proto, ListenOn]);
+            emqx_ctl:print("Restarted ~s listener successfully.~n", [Identifier]);
         {error, Error} ->
-            emqx_ctl:print("Failed to stop ~s listener on ~s, error:~p~n", [Proto, ListenOn, Error])
+            emqx_ctl:print("Failed to restart ~s listener: ~0p~n", [Identifier, Error])
     end;
 
 listeners(_) ->
     emqx_ctl:usage([{"listeners",                        "List listeners"},
-                    {"listeners stop    <Proto> <Port>", "Stop a listener"}]).
+                    {"listeners stop    <Identifier>",   "Stop a listener"},
+                    {"listeners stop    <Proto> <Port>", "Stop a listener"},
+                    {"listeners restart <Identifier>",   "Restart a listener"}
+                   ]).
+
+stop_listener(false, Input) ->
+    emqx_ctl:print("No such listener ~p~n", [Input]);
+stop_listener(#{listen_on := ListenOn} = Listener, _Input) ->
+    ID = emqx_listeners:identifier(Listener),
+    ListenOnStr = emqx_listeners:format_listen_on(ListenOn),
+    case emqx_listeners:stop_listener(Listener) of
+        ok ->
+            emqx_ctl:print("Stop ~s listener on ~s successfully.~n", [ID, ListenOnStr]);
+        {error, Reason} ->
+            emqx_ctl:print("Failed to stop ~s listener on ~s: ~0p~n",
+                           [ID, ListenOnStr, Reason])
+    end.
 
 %%--------------------------------------------------------------------
 %% @doc data Command
@@ -707,3 +731,16 @@ format(_, Val) ->
     Val.
 
 bin(S) -> iolist_to_binary(S).
+
+indent_print({Key, {string, Val}}) ->
+    emqx_ctl:print("  ~-16s: ~s~n", [Key, Val]);
+indent_print({Key, Val}) ->
+    emqx_ctl:print("  ~-16s: ~w~n", [Key, Val]).
+
+listener_identifier(Protocol, ListenOn) ->
+    case emqx_listeners:find_id_by_listen_on(ListenOn) of
+        false ->
+            "http" ++ _ = atom_to_list(Protocol); %% assert
+        ID ->
+            ID
+    end.

lib-opensource/emqx_management/src/emqx_mgmt_http.erl → lib-ce/emqx_management/src/emqx_mgmt_http.erl


lib-opensource/emqx_management/src/emqx_mgmt_sup.erl → lib-ce/emqx_management/src/emqx_mgmt_sup.erl


lib-opensource/emqx_management/src/emqx_mgmt_util.erl → lib-ce/emqx_management/src/emqx_mgmt_util.erl


+ 28 - 4
lib-opensource/emqx_management/test/emqx_mgmt_SUITE.erl

@@ -49,7 +49,8 @@ groups() ->
         t_broker_cmd,
         t_router_cmd,
         t_subscriptions_cmd,
-        t_listeners_cmd
+        t_listeners_cmd_old,
+        t_listeners_cmd_new
        ]}].
 
 apps() ->
@@ -275,12 +276,35 @@ t_subscriptions_cmd(_) ->
     ?assertEqual(emqx_mgmt_cli:subscriptions(["del", "client", "b/b/c"]), "ok~n"),
     unmock_print().
 
-t_listeners_cmd(_) ->
+t_listeners_cmd_old(_) ->
+    ok = emqx_listeners:ensure_all_started(),
     mock_print(),
     ?assertEqual(emqx_mgmt_cli:listeners([]), ok),
     ?assertEqual(
-       emqx_mgmt_cli:listeners(["stop", "wss", "8084"]),
-       "Stop wss listener on 8084 successfully.\n"
+       "Stop mqtt:wss:external listener on 0.0.0.0:8084 successfully.\n",
+       emqx_mgmt_cli:listeners(["stop", "wss", "8084"])
+      ),
+    unmock_print().
+
+t_listeners_cmd_new(_) ->
+    ok = emqx_listeners:ensure_all_started(),
+    mock_print(),
+    ?assertEqual(emqx_mgmt_cli:listeners([]), ok),
+    ?assertEqual(
+       "Stop mqtt:wss:external listener on 0.0.0.0:8084 successfully.\n",
+       emqx_mgmt_cli:listeners(["stop", "mqtt:wss:external"])
+      ),
+    ?assertEqual(
+       emqx_mgmt_cli:listeners(["restart", "mqtt:tcp:external"]),
+       "Restarted mqtt:tcp:external listener successfully.\n"
+      ),
+    ?assertEqual(
+       emqx_mgmt_cli:listeners(["restart", "mqtt:ssl:external"]),
+       "Restarted mqtt:ssl:external listener successfully.\n"
+      ),
+    ?assertEqual(
+       emqx_mgmt_cli:listeners(["restart", "bad:listener:identifier"]),
+       "Failed to restart bad:listener:identifier listener: {no_such_listener,\"bad:listener:identifier\"}\n"
       ),
     unmock_print().
 

+ 0 - 0
lib-opensource/emqx_management/test/emqx_mgmt_api_SUITE.erl


Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini