Add rc.d style config dir for FLU server startup
This commit is contained in:
parent
e9b1134cd9
commit
cf0829b934
5 changed files with 82 additions and 1 deletions
|
@ -3,6 +3,12 @@
|
||||||
%% Data directory for all FLUs.
|
%% Data directory for all FLUs.
|
||||||
{flu_data_dir, "{{platform_data_dir}}"},
|
{flu_data_dir, "{{platform_data_dir}}"},
|
||||||
|
|
||||||
|
%% FLU config directory
|
||||||
|
{flu_config_dir, "{{platform_etc_dir}}/flu-config"},
|
||||||
|
|
||||||
|
%% Chain config directory
|
||||||
|
{chain_config_dir, "{{platform_etc_dir}}/chain-config"},
|
||||||
|
|
||||||
%% FLUs to start at app start.
|
%% FLUs to start at app start.
|
||||||
{initial_flus, [
|
{initial_flus, [
|
||||||
%% Remember, this is a list, so separate all tuples
|
%% Remember, this is a list, so separate all tuples
|
||||||
|
|
|
@ -93,6 +93,8 @@
|
||||||
|
|
||||||
{template, "files/vm.args", "etc/vm.args"},
|
{template, "files/vm.args", "etc/vm.args"},
|
||||||
{template, "files/app.config", "etc/app.config"},
|
{template, "files/app.config", "etc/app.config"},
|
||||||
|
{mkdir, "etc/chain-config"},
|
||||||
|
{mkdir, "etc/flu-config"},
|
||||||
{mkdir, "lib/basho-patches"}
|
{mkdir, "lib/basho-patches"}
|
||||||
%% {copy, "../apps/machi/ebin/etop_txt.beam", "lib/basho-patches"}
|
%% {copy, "../apps/machi/ebin/etop_txt.beam", "lib/basho-patches"}
|
||||||
]}.
|
]}.
|
||||||
|
|
|
@ -83,6 +83,8 @@
|
||||||
%% Supervisor callbacks
|
%% Supervisor callbacks
|
||||||
-export([init/1]).
|
-export([init/1]).
|
||||||
|
|
||||||
|
make_package_spec(#p_srvr{name=FluName, port=TcpPort, props=Props}) when is_list(Props) ->
|
||||||
|
make_package_spec({FluName, TcpPort, Props});
|
||||||
make_package_spec({FluName, TcpPort, Props}) when is_list(Props) ->
|
make_package_spec({FluName, TcpPort, Props}) when is_list(Props) ->
|
||||||
FluDataDir = get_env(flu_data_dir, undefined_is_invalid),
|
FluDataDir = get_env(flu_data_dir, undefined_is_invalid),
|
||||||
MyDataDir = filename:join(FluDataDir, atom_to_list(FluName)),
|
MyDataDir = filename:join(FluDataDir, atom_to_list(FluName)),
|
||||||
|
|
|
@ -29,8 +29,11 @@
|
||||||
-behaviour(supervisor).
|
-behaviour(supervisor).
|
||||||
|
|
||||||
-include("machi.hrl").
|
-include("machi.hrl").
|
||||||
|
-include("machi_projection.hrl").
|
||||||
-include("machi_verbose.hrl").
|
-include("machi_verbose.hrl").
|
||||||
|
|
||||||
|
-ifdef(TEST).
|
||||||
|
-compile(export_all).
|
||||||
-ifdef(PULSE).
|
-ifdef(PULSE).
|
||||||
-compile({parse_transform, pulse_instrument}).
|
-compile({parse_transform, pulse_instrument}).
|
||||||
-include_lib("pulse_otp/include/pulse_otp.hrl").
|
-include_lib("pulse_otp/include/pulse_otp.hrl").
|
||||||
|
@ -38,6 +41,7 @@
|
||||||
-else.
|
-else.
|
||||||
-define(SHUTDOWN, 5000).
|
-define(SHUTDOWN, 5000).
|
||||||
-endif.
|
-endif.
|
||||||
|
-endif. %TEST
|
||||||
|
|
||||||
%% API
|
%% API
|
||||||
-export([start_link/0]).
|
-export([start_link/0]).
|
||||||
|
@ -69,5 +73,59 @@ get_initial_flus() ->
|
||||||
[].
|
[].
|
||||||
-else. % PULSE
|
-else. % PULSE
|
||||||
get_initial_flus() ->
|
get_initial_flus() ->
|
||||||
application:get_env(machi, initial_flus, []).
|
DoesNotExist = "/tmp/does/not/exist",
|
||||||
|
ConfigDir = case application:get_env(machi, flu_config_dir, DoesNotExist) of
|
||||||
|
DoesNotExist ->
|
||||||
|
DoesNotExist;
|
||||||
|
Dir ->
|
||||||
|
ok = filelib:ensure_dir(Dir ++ "/unused"),
|
||||||
|
Dir
|
||||||
|
end,
|
||||||
|
sanitize_p_srvr_records(load_rc_d_files_from_dir(ConfigDir)).
|
||||||
-endif. % PULSE
|
-endif. % PULSE
|
||||||
|
|
||||||
|
load_rc_d_files_from_dir(Dir) ->
|
||||||
|
Files = filelib:wildcard(Dir ++ "/*"),
|
||||||
|
lists:append([case file:consult(File) of
|
||||||
|
{ok, X} -> X;
|
||||||
|
_ -> []
|
||||||
|
end || File <- Files]).
|
||||||
|
|
||||||
|
sanitize_p_srvr_records(Ps) ->
|
||||||
|
{Sane, _} = lists:foldl(fun sanitize_p_srvr_rec/2, {[], dict:new()}, Ps),
|
||||||
|
Sane.
|
||||||
|
|
||||||
|
sanitize_p_srvr_rec(Whole, {Acc, D}) ->
|
||||||
|
try
|
||||||
|
#p_srvr{name=Name,
|
||||||
|
proto_mod=PMod,
|
||||||
|
address=Address,
|
||||||
|
port=Port,
|
||||||
|
props=Props} = Whole,
|
||||||
|
true = is_atom(Name),
|
||||||
|
NameK = {name, Name},
|
||||||
|
error = dict:find(NameK, D),
|
||||||
|
true = is_atom(PMod),
|
||||||
|
case code:is_loaded(PMod) of
|
||||||
|
{file, _} -> ok;
|
||||||
|
_ -> {module, _} = code:load_file(PMod), ok
|
||||||
|
end,
|
||||||
|
if is_list(Address) -> ok;
|
||||||
|
is_tuple(Address) -> ok % Erlang-style IPv4 or IPv6
|
||||||
|
end,
|
||||||
|
true = is_integer(Port) andalso Port >= 1024 andalso Port =< 65534,
|
||||||
|
PortK = {port, Port},
|
||||||
|
error = dict:find(PortK, D),
|
||||||
|
true = is_list(Props),
|
||||||
|
|
||||||
|
%% All is sane enough.
|
||||||
|
D2 = dict:store(NameK, Name,
|
||||||
|
dict:store(PortK, Port, D)),
|
||||||
|
{[Whole|Acc], D2}
|
||||||
|
catch _:_ ->
|
||||||
|
_ = lager:log(error, self(),
|
||||||
|
"~s: Bad (or duplicate name/port) p_srvr record, "
|
||||||
|
"skipping: ~P\n",
|
||||||
|
[?MODULE, Whole, 15]),
|
||||||
|
{Acc, D}
|
||||||
|
end.
|
||||||
|
|
|
@ -173,6 +173,19 @@ partial_stop_restart2() ->
|
||||||
ok
|
ok
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
p_srvr_rec_test() ->
|
||||||
|
P = #p_srvr{name=a, address="localhost", port=1024, props=[yo]},
|
||||||
|
[P] = machi_flu_sup:sanitize_p_srvr_records([P]),
|
||||||
|
[P] = machi_flu_sup:sanitize_p_srvr_records([P,P]),
|
||||||
|
[] = machi_flu_sup:sanitize_p_srvr_records([nope]),
|
||||||
|
[] = machi_flu_sup:sanitize_p_srvr_records([#p_srvr{proto_mod=does_not_exist}]),
|
||||||
|
[] = machi_flu_sup:sanitize_p_srvr_records([#p_srvr{proto_mod="lists"}]),
|
||||||
|
[] = machi_flu_sup:sanitize_p_srvr_records([#p_srvr{address=7}]),
|
||||||
|
[] = machi_flu_sup:sanitize_p_srvr_records([#p_srvr{port=5}]),
|
||||||
|
[] = machi_flu_sup:sanitize_p_srvr_records([#p_srvr{port=foo}]),
|
||||||
|
[] = machi_flu_sup:sanitize_p_srvr_records([#p_srvr{props=foo}]),
|
||||||
|
ok.
|
||||||
|
|
||||||
-endif. % !PULSE
|
-endif. % !PULSE
|
||||||
-endif. % TEST
|
-endif. % TEST
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue