Current section

Files

Jump to
grisp_updater src grisp_updater_tools.erl
Raw

src/grisp_updater_tools.erl

-module(grisp_updater_tools).
%--- Exports -------------------------------------------------------------------
% API Functions
-export([resolve_path/1]).
-export([resolve_file_list/2]).
-export([config_file_list/3]).
-export([config_certificates/3]).
%--- API Functions -------------------------------------------------------------
resolve_path(Path) when is_binary(Path) ->
{ok, Path};
resolve_path(Path) when is_list(Path) ->
{ok, iolist_to_binary(Path)};
resolve_path({priv, AppName, RelPath}) ->
case code:priv_dir(AppName) of
{error, bad_name} ->
{error, {priv_not_found, AppName}};
BaseDir ->
{ok, filename:join(BaseDir, iolist_to_binary(RelPath))}
end.
resolve_file_list(Path, Pattern) when is_list(Pattern) ->
case resolve_path(Path) of
{error, _Reason} = Error -> Error;
{ok, PathBin} ->
PathStr = binary_to_list(PathBin),
case {filelib:is_regular(PathStr), filelib:is_dir(PathStr)} of
{true, false} ->
{ok, [PathBin]};
{false, true} ->
{ok, [list_to_binary(filename:join(PathStr, F))
|| F <- filelib:wildcard(Pattern, PathStr)]};
_ ->
{error, {invalid_file_or_directory, PathBin}}
end
end.
config_file_list(AppName, ConfKey, Pattern) ->
Specs = case application:get_env(AppName, ConfKey) of
{ok, Items} when is_list(Items) -> Items;
{ok, Item} -> [Item];
undefined -> []
end,
multi_resolve_file_list(Specs, Pattern, [], []).
config_certificates(AppName, ConfKey, Pattern) ->
{Filenames, Errors1} = config_file_list(AppName, ConfKey, Pattern),
{Certs, Errors2} = multi_load_certificate(Filenames, [], []),
{Certs, Errors1 ++ Errors2}.
%--- Internal Functions --------------------------------------------------------
multi_resolve_file_list([], _Ptrn, Results, Errors) ->
{lists:append(lists:reverse(Results)), lists:reverse(Errors)};
multi_resolve_file_list([Spec | Rest], Ptrn, Results, Errors) ->
case resolve_file_list(Spec, Ptrn) of
{error, Reason} ->
multi_resolve_file_list(Rest, Ptrn, Results, [Reason | Errors]);
{ok, Filenames} ->
multi_resolve_file_list(Rest, Ptrn, [Filenames | Results], Errors)
end.
multi_load_certificate([], Results, Errors) ->
{lists:append(lists:reverse(Results)), lists:reverse(Errors)};
multi_load_certificate([Filename | Rest], Results, Errors) ->
try termseal:load_certificates(Filename) of
Certificates ->
multi_load_certificate(Rest, [Certificates | Results], Errors)
catch
Reason ->
multi_load_certificate(Rest, Results, [Reason | Errors])
end.