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. end.
list_backup_file() -> list_backup_file() ->
{ok, Files} = file:list_dir_all(backup_dir()), Filter =
lists:foldl( fun(File) ->
fun(File, Acc) -> case file:read_file_info(File) of
case filename:extension(File) =:= ".json" of {ok, #file_info{size = Size, ctime = CTime = {{Y, M, D}, {H, MM, S}}}} ->
true -> Seconds = calendar:datetime_to_gregorian_seconds(CTime),
{ok, FileName} = ensure_file_name(File), BaseFilename = to_binary(filename:basename(File)),
case file:read_file_info(FileName) of CreatedAt = to_binary(io_lib:format("~p-~p-~p ~p:~p:~p", [Y, M, D, H, MM, S])),
{ok, #file_info{size = Size, ctime = CTime = {{Y, M, D}, {H, MM, S}}}} -> Info = {
CreatedAt = io_lib:format("~p-~p-~p ~p:~p:~p", [Y, M, D, H, MM, S]), Seconds,
Seconds = calendar:datetime_to_gregorian_seconds(CTime), [{filename, BaseFilename},
[{Seconds, [{filename, list_to_binary(File)}, {size, Size},
{size, Size}, {created_at, CreatedAt},
{created_at, list_to_binary(CreatedAt)}, {node, node()}
{node, node()} ]
]} | Acc]; },
{error, Reason} -> {true, Info};
logger:error("Read file info of ~s failed with: ~p", [File, Reason]), _ ->
Acc false
end;
false -> Acc
end 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) -> read_backup_file(Filename0) ->
case ensure_file_name(Filename0) of case look_up_file(Filename0) of
{ok, Filename} -> {ok, Filename} ->
case file:read_file(Filename) of case file:read_file(Filename) of
{ok, Bin} -> {ok, Bin} ->
{ok, #{filename => to_binary(Filename0), {ok, #{filename => to_binary(Filename0),
file => Bin}}; file => Bin}};
{error, Reason} -> {error, Reason} ->
{error, Reason} logger:error("read file ~p failed ~p", [Filename, Reason]),
{error, bad_file}
end; end;
{error, Reason} -> {error, not_found} ->
{error, Reason} {error, not_found}
end. end.
delete_backup_file(Filename0) -> delete_backup_file(Filename0) ->
case ensure_file_name(Filename0) of case look_up_file(Filename0) of
{ok, Filename} -> {ok, Filename} ->
case file:read_file_info(Filename) of case file:read_file_info(Filename) of
{ok, #file_info{}} -> {ok, #file_info{}} ->
@ -681,7 +703,7 @@ delete_backup_file(Filename0) ->
_ -> _ ->
{error, not_found} {error, not_found}
end; end;
{error, _Reason} -> {error, not_found} ->
{error, not_found} {error, not_found}
end. end.
@ -788,8 +810,11 @@ import(Filename, OverridesJson) ->
-spec(check_import_json(binary() | string()) -> {ok, map()} | {error, term()}). -spec(check_import_json(binary() | string()) -> {ok, map()} | {error, term()}).
check_import_json(Filename) -> check_import_json(Filename) ->
ReadFile = fun(F) -> file:read_file(F) end, FunList = [
FunList = [fun ensure_file_name/1, ReadFile, fun check_json/1], fun look_up_file/1,
fun(F) -> file:read_file(F) end,
fun check_json/1
],
check_import_json(Filename, FunList). check_import_json(Filename, FunList).
check_import_json(Res, []) -> check_import_json(Res, []) ->
@ -815,6 +840,9 @@ backup_dir() ->
ok = filelib:ensure_dir(filename:join([Dir, dummy])), ok = filelib:ensure_dir(filename:join([Dir, dummy])),
Dir. Dir.
backup_dir_odl_version() ->
emqx:get_env(data_dir).
legal_filename(Filename) -> legal_filename(Filename) ->
MaybeJson = filename:extension(Filename), MaybeJson = filename:extension(Filename),
MaybeJson == ".json" orelse MaybeJson == <<".json">>. MaybeJson == ".json" orelse MaybeJson == <<".json">>.