feat: backup data support old versions dir
This commit is contained in:
parent
1ec0377a69
commit
02e7f3bfe0
|
@ -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">>.
|
||||||
|
|
Loading…
Reference in New Issue