feat: backup data support old versions dir

This commit is contained in:
DDDHuang 2022-03-15 15:05:48 +08:00
parent 1ec0377a69
commit 02e7f3bfe0
1 changed files with 57 additions and 29 deletions

View File

@ -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">>.