100 lines
3.7 KiB
Erlang
100 lines
3.7 KiB
Erlang
%% Copyright (c) 2018 EMQ Technologies Co., Ltd. All Rights Reserved.
|
|
%%
|
|
%% Licensed under the Apache License, Version 2.0 (the "License");
|
|
%% you may not use this file except in compliance with the License.
|
|
%% You may obtain a copy of the License at
|
|
%%
|
|
%% http://www.apache.org/licenses/LICENSE-2.0
|
|
%%
|
|
%% Unless required by applicable law or agreed to in writing, software
|
|
%% distributed under the License is distributed on an "AS IS" BASIS,
|
|
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
%% See the License for the specific language governing permissions and
|
|
%% limitations under the License.
|
|
|
|
-module(emqx_ct_broker_helpers).
|
|
|
|
-compile(export_all).
|
|
-compile(nowarn_export_all).
|
|
|
|
-define(APP, emqx).
|
|
|
|
-define(MQTT_SSL_TWOWAY, [{cacertfile, "certs/cacert.pem"},
|
|
{verify, verify_peer},
|
|
{fail_if_no_peer_cert, true}]).
|
|
|
|
-define(MQTT_SSL_CLIENT, [{keyfile, "certs/client-key.pem"},
|
|
{cacertfile, "certs/cacert.pem"},
|
|
{certfile, "certs/client-cert.pem"}]).
|
|
|
|
|
|
run_setup_steps() ->
|
|
NewConfig = generate_config(),
|
|
lists:foreach(fun set_app_env/1, NewConfig),
|
|
application:ensure_all_started(?APP).
|
|
|
|
run_teardown_steps() ->
|
|
?APP:shutdown().
|
|
|
|
generate_config() ->
|
|
Schema = cuttlefish_schema:files([local_path(["priv", "emqx.schema"])]),
|
|
Conf = conf_parse:file([local_path(["etc", "emqx.conf"])]),
|
|
cuttlefish_generator:map(Schema, Conf).
|
|
|
|
get_base_dir(Module) ->
|
|
{file, Here} = code:is_loaded(Module),
|
|
filename:dirname(filename:dirname(Here)).
|
|
|
|
get_base_dir() ->
|
|
get_base_dir(?MODULE).
|
|
|
|
local_path(Components, Module) ->
|
|
filename:join([get_base_dir(Module) | Components]).
|
|
|
|
local_path(Components) ->
|
|
local_path(Components, ?MODULE).
|
|
|
|
set_app_env({App, Lists}) ->
|
|
lists:foreach(fun({acl_file, _Var}) ->
|
|
application:set_env(App, acl_file, local_path(["etc", "acl.conf"]));
|
|
({plugins_loaded_file, _Var}) ->
|
|
application:set_env(App, plugins_loaded_file, local_path(["test", "emqx_SUITE_data","loaded_plugins"]));
|
|
({Par, Var}) ->
|
|
application:set_env(App, Par, Var)
|
|
end, Lists).
|
|
|
|
change_opts(SslType) ->
|
|
{ok, Listeners} = application:get_env(?APP, listeners),
|
|
NewListeners =
|
|
lists:foldl(fun({Protocol, Port, Opts} = Listener, Acc) ->
|
|
case Protocol of
|
|
ssl ->
|
|
SslOpts = proplists:get_value(sslopts, Opts),
|
|
Keyfile = local_path(["etc/certs", "key.pem"]),
|
|
Certfile = local_path(["etc/certs", "cert.pem"]),
|
|
TupleList1 = lists:keyreplace(keyfile, 1, SslOpts, {keyfile, Keyfile}),
|
|
TupleList2 = lists:keyreplace(certfile, 1, TupleList1, {certfile, Certfile}),
|
|
TupleList3 =
|
|
case SslType of
|
|
ssl_twoway->
|
|
CAfile = local_path(["etc", proplists:get_value(cacertfile, ?MQTT_SSL_TWOWAY)]),
|
|
MutSslList = lists:keyreplace(cacertfile, 1, ?MQTT_SSL_TWOWAY, {cacertfile, CAfile}),
|
|
lists:merge(TupleList2, MutSslList);
|
|
_ ->
|
|
lists:filter(fun ({cacertfile, _}) -> false;
|
|
({verify, _}) -> false;
|
|
({fail_if_no_peer_cert, _}) -> false;
|
|
(_) -> true
|
|
end, TupleList2)
|
|
end,
|
|
[{Protocol, Port, lists:keyreplace(sslopts, 1, Opts, {sslopts, TupleList3})} | Acc];
|
|
_ ->
|
|
[Listener | Acc]
|
|
end
|
|
end, [], Listeners),
|
|
application:set_env(?APP, listeners, NewListeners).
|
|
|
|
client_ssl() ->
|
|
[{Key, local_path(["etc", File])} || {Key, File} <- ?MQTT_SSL_CLIENT].
|
|
|