From 02e7f3bfe0b52b239d2e065fcd30be1a372f1618 Mon Sep 17 00:00:00 2001 From: DDDHuang <44492639+DDDHuang@users.noreply.github.com> Date: Tue, 15 Mar 2022 15:05:48 +0800 Subject: [PATCH] feat: backup data support old versions dir --- .../src/emqx_mgmt_data_backup.erl | 86 ++++++++++++------- 1 file changed, 57 insertions(+), 29 deletions(-) diff --git a/apps/emqx_management/src/emqx_mgmt_data_backup.erl b/apps/emqx_management/src/emqx_mgmt_data_backup.erl index 9ecc4d57e..d5c6c7b97 100644 --- a/apps/emqx_management/src/emqx_mgmt_data_backup.erl +++ b/apps/emqx_management/src/emqx_mgmt_data_backup.erl @@ -627,45 +627,67 @@ upload_backup_file(Filename0, Bin) -> end. list_backup_file() -> - {ok, Files} = file:list_dir_all(backup_dir()), - lists:foldl( - fun(File, Acc) -> - case filename:extension(File) =:= ".json" of - true -> - {ok, FileName} = ensure_file_name(File), - case file:read_file_info(FileName) of - {ok, #file_info{size = Size, ctime = CTime = {{Y, M, D}, {H, MM, S}}}} -> - CreatedAt = io_lib:format("~p-~p-~p ~p:~p:~p", [Y, M, D, H, MM, S]), - Seconds = calendar:datetime_to_gregorian_seconds(CTime), - [{Seconds, [{filename, list_to_binary(File)}, - {size, Size}, - {created_at, list_to_binary(CreatedAt)}, - {node, node()} - ]} | Acc]; - {error, Reason} -> - logger:error("Read file info of ~s failed with: ~p", [File, Reason]), - Acc - end; - false -> Acc + Filter = + fun(File) -> + case file:read_file_info(File) of + {ok, #file_info{size = Size, ctime = CTime = {{Y, M, D}, {H, MM, S}}}} -> + Seconds = calendar:datetime_to_gregorian_seconds(CTime), + BaseFilename = to_binary(filename:basename(File)), + CreatedAt = to_binary(io_lib:format("~p-~p-~p ~p:~p:~p", [Y, M, D, H, MM, S])), + Info = { + Seconds, + [{filename, BaseFilename}, + {size, Size}, + {created_at, CreatedAt}, + {node, node()} + ] + }, + {true, Info}; + _ -> + false end - end, [], Files). + end, + lists:filtermap(Filter, backup_files()). + +backup_files() -> + backup_files(backup_dir()) ++ backup_files(backup_dir_odl_version()). + +backup_files(Dir) -> + {ok, FilesAll} = file:list_dir_all(Dir), + Files = lists:filtermap(fun legal_filename/1, FilesAll), + [filename:join([Dir, File]) || File <- Files]. + +look_up_file(Filename) when is_binary(Filename) -> + look_up_file(binary_to_list(Filename)); +look_up_file(Filename) -> + Filter = + fun(MaybeFile) -> + filename:basename(MaybeFile) == Filename + end, + case lists:filter(Filter, backup_files()) of + [] -> + {error, not_found}; + List -> + {ok, hd(List)} + end. read_backup_file(Filename0) -> - case ensure_file_name(Filename0) of + case look_up_file(Filename0) of {ok, Filename} -> case file:read_file(Filename) of {ok, Bin} -> {ok, #{filename => to_binary(Filename0), file => Bin}}; {error, Reason} -> - {error, Reason} + logger:error("read file ~p failed ~p", [Filename, Reason]), + {error, bad_file} end; - {error, Reason} -> - {error, Reason} + {error, not_found} -> + {error, not_found} end. delete_backup_file(Filename0) -> - case ensure_file_name(Filename0) of + case look_up_file(Filename0) of {ok, Filename} -> case file:read_file_info(Filename) of {ok, #file_info{}} -> @@ -681,7 +703,7 @@ delete_backup_file(Filename0) -> _ -> {error, not_found} end; - {error, _Reason} -> + {error, not_found} -> {error, not_found} end. @@ -788,8 +810,11 @@ import(Filename, OverridesJson) -> -spec(check_import_json(binary() | string()) -> {ok, map()} | {error, term()}). check_import_json(Filename) -> - ReadFile = fun(F) -> file:read_file(F) end, - FunList = [fun ensure_file_name/1, ReadFile, fun check_json/1], + FunList = [ + fun look_up_file/1, + fun(F) -> file:read_file(F) end, + fun check_json/1 + ], check_import_json(Filename, FunList). check_import_json(Res, []) -> @@ -815,6 +840,9 @@ backup_dir() -> ok = filelib:ensure_dir(filename:join([Dir, dummy])), Dir. +backup_dir_odl_version() -> + emqx:get_env(data_dir). + legal_filename(Filename) -> MaybeJson = filename:extension(Filename), MaybeJson == ".json" orelse MaybeJson == <<".json">>.