|
|
@@ -19,6 +19,7 @@
|
|
|
-module(emqx_dashboard_admin).
|
|
|
|
|
|
-include("emqx_dashboard.hrl").
|
|
|
+-include_lib("emqx/include/logger.hrl").
|
|
|
-include_lib("stdlib/include/ms_transform.hrl").
|
|
|
|
|
|
-boot_mnesia({mnesia, [boot]}).
|
|
|
@@ -50,7 +51,8 @@
|
|
|
|
|
|
-export([
|
|
|
add_default_user/0,
|
|
|
- default_username/0
|
|
|
+ default_username/0,
|
|
|
+ add_bootstrap_user/0
|
|
|
]).
|
|
|
|
|
|
-type emqx_admin() :: #?ADMIN{}.
|
|
|
@@ -74,6 +76,29 @@ mnesia(boot) ->
|
|
|
]}
|
|
|
]).
|
|
|
|
|
|
+%%--------------------------------------------------------------------
|
|
|
+%% bootstrap API
|
|
|
+%%--------------------------------------------------------------------
|
|
|
+
|
|
|
+-spec add_default_user() -> {ok, map() | empty | default_user_exists} | {error, any()}.
|
|
|
+add_default_user() ->
|
|
|
+ add_default_user(binenv(default_username), binenv(default_password)).
|
|
|
+
|
|
|
+-spec add_bootstrap_user() -> ok | {error, _}.
|
|
|
+add_bootstrap_user() ->
|
|
|
+ case emqx:get_config([dashboard, bootstrap_user], undefined) of
|
|
|
+ undefined ->
|
|
|
+ ok;
|
|
|
+ File ->
|
|
|
+ case mnesia:table_info(?ADMIN, size) of
|
|
|
+ 0 ->
|
|
|
+ ?SLOG(debug, #{msg => "Add dashboard bootstrap users", file => File}),
|
|
|
+ add_bootstrap_user(File);
|
|
|
+ _ ->
|
|
|
+ ok
|
|
|
+ end
|
|
|
+ end.
|
|
|
+
|
|
|
%%--------------------------------------------------------------------
|
|
|
%% API
|
|
|
%%--------------------------------------------------------------------
|
|
|
@@ -272,11 +297,6 @@ destroy_token_by_username(Username, Token) ->
|
|
|
%%--------------------------------------------------------------------
|
|
|
%% Internal functions
|
|
|
%%--------------------------------------------------------------------
|
|
|
-
|
|
|
--spec add_default_user() -> {ok, map() | empty | default_user_exists} | {error, any()}.
|
|
|
-add_default_user() ->
|
|
|
- add_default_user(binenv(default_username), binenv(default_password)).
|
|
|
-
|
|
|
default_username() ->
|
|
|
binenv(default_username).
|
|
|
|
|
|
@@ -290,3 +310,36 @@ add_default_user(Username, Password) ->
|
|
|
[] -> add_user(Username, Password, <<"administrator">>);
|
|
|
_ -> {ok, default_user_exists}
|
|
|
end.
|
|
|
+
|
|
|
+add_bootstrap_user(File) ->
|
|
|
+ case file:open(File, [read]) of
|
|
|
+ {ok, Dev} ->
|
|
|
+ {ok, MP} = re:compile(<<"(\.+):(\.+)">>),
|
|
|
+ try
|
|
|
+ load_bootstrap_user(Dev, MP)
|
|
|
+ catch
|
|
|
+ Type:Reason ->
|
|
|
+ {error, {Type, Reason}}
|
|
|
+ after
|
|
|
+ file:close(Dev)
|
|
|
+ end;
|
|
|
+ Error ->
|
|
|
+ Error
|
|
|
+ end.
|
|
|
+
|
|
|
+load_bootstrap_user(Dev, MP) ->
|
|
|
+ case file:read_line(Dev) of
|
|
|
+ {ok, Line} ->
|
|
|
+ case re:run(Line, MP, [global, {capture, all_but_first, binary}]) of
|
|
|
+ {match, Captured} ->
|
|
|
+ _ = [add_user(Username, Password, <<>>) || [Username, Password] <- Captured],
|
|
|
+ ok;
|
|
|
+ _ ->
|
|
|
+ ok
|
|
|
+ end,
|
|
|
+ load_bootstrap_user(Dev, MP);
|
|
|
+ eof ->
|
|
|
+ ok;
|
|
|
+ Error ->
|
|
|
+ Error
|
|
|
+ end.
|