Add emqx_gen_config module

This commit is contained in:
turtled 2019-03-29 09:57:18 +08:00
parent c5d16a3368
commit cfd91f481e
3 changed files with 173 additions and 0 deletions

106
etc/vm.args Normal file
View File

@ -0,0 +1,106 @@
##############################
# Erlang VM Args
##############################
## NOTE:
##
## Arguments configured in this file might be overridden by configs from `emqx.conf`.
##
## Some basic VM arguments are to be configured in `emqx.conf`,
## such as `node.name` for `-name` and `node.cooke` for `-setcookie`.
## Sets the maximum number of simultaneously existing processes for this system.
#+P 2048000
## Sets the maximum number of simultaneously existing ports for this system.
#+Q 1024000
## Sets the maximum number of ETS tables
#+e 256000
## Sets the maximum number of atoms the virtual machine can handle.
#+t 1048576
## Set the location of crash dumps
#-env ERL_CRASH_DUMP log/crash.dump
## Set how many times generational garbages collections can be done without
## forcing a fullsweep collection.
#-env ERL_FULLSWEEP_AFTER 1000
## Heartbeat management; auto-restarts VM if it dies or becomes unresponsive
## (Disabled by default..use with caution!)
#-heart
## Specify the erlang distributed protocol.
## Can be one of: inet_tcp, inet6_tcp, inet_tls
#-proto_dist inet_tcp
## Specify SSL Options in the file if using SSL for Erlang Distribution.
## Used only when -proto_dist set to inet_tls
#-ssl_dist_optfile etc/ssl_dist.conf
## Specifies the net_kernel tick time in seconds.
## This is the approximate time a connected node may be unresponsive until
## it is considered down and thereby disconnected.
#-kernel net_ticktime 60
## Sets the distribution buffer busy limit (dist_buf_busy_limit).
#+zdbbl 8192
## Sets default scheduler hint for port parallelism.
+spp true
## Sets the number of threads in async thread pool. Valid range is 0-1024.
#+A 8
## Sets the default heap size of processes to the size Size.
#+hms 233
## Sets the default binary virtual heap size of processes to the size Size.
#+hmbs 46422
## Sets the number of IO pollsets to use when polling for I/O.
#+IOp 1
## Sets the number of IO poll threads to use when polling for I/O.
#+IOt 1
## Sets the number of scheduler threads to create and scheduler threads to set online.
#+S 8:8
## Sets the number of dirty CPU scheduler threads to create and dirty CPU scheduler threads to set online.
#+SDcpu 8:8
## Sets the number of dirty I/O scheduler threads to create.
#+SDio 10
## Suggested stack size, in kilowords, for scheduler threads.
#+sss 32
## Suggested stack size, in kilowords, for dirty CPU scheduler threads.
#+sssdcpu 40
## Suggested stack size, in kilowords, for dirty IO scheduler threads.
#+sssdio 40
## Sets scheduler bind type.
## Can be one of: u, ns, ts, ps, s, nnts, nnps, tnnps, db
#+sbt db
## Sets a user-defined CPU topology.
#+sct L0-3c0-3p0N0:L4-7c0-3p1N1
## Sets the mapping of warning messages for error_logger
#+W w
-kernel net_ticktime 60
-env ERL_CRASH_DUMP log/crash.dump
+e 256000
-env ERL_FULLSWEEP_AFTER 1000
+Q 1024000
+P 2048000
+A 32
-setcookie emqxsecretcookie
-proto_dist inet_tcp
-name emqx@127.0.0.1
+zdbbl 8192

View File

@ -27,6 +27,8 @@
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
start(_Type, _Args) -> start(_Type, _Args) ->
emqx_gen_config:generate_config("etc/emqx.conf", "etc/plugins", "data/configs", "releases/3.1/schema"),
%% We'd like to configure the primary logger level here, rather than set the %% We'd like to configure the primary logger level here, rather than set the
%% kernel config `logger_level` before starting the erlang vm. %% kernel config `logger_level` before starting the erlang vm.
%% This is because the latter approach an annoying debug msg will be printed out: %% This is because the latter approach an annoying debug msg will be printed out:

65
src/emqx_gen_config.erl Normal file
View File

@ -0,0 +1,65 @@
%% Copyright (c) 2013-2019 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_gen_config).
-include("logger.hrl").
-export([generate_config/4]).
generate_config(EmqCfg, PluginsEtc, DestDir, SchemaDir) ->
case mergeconf(EmqCfg, PluginsEtc, DestDir) of
{error, Error} ->
exit(Error);
AppConf ->
Schemas = filelib:wildcard("*.schema", SchemaDir),
Schemas1 = lists:map(
fun(Schema) ->
filename:join(SchemaDir, Schema)
end, Schemas),
Schemas2 = cuttlefish_schema:files(Schemas1),
case cuttlefish_generator:map(Schemas2, cuttlefish_conf:file(AppConf)) of
{error, Error1} ->
exit(Error1);
AllConfigs ->
[[application:set_env(App, Key, Val) || {Key, Val} <- Configs]|| {App, Configs} <- AllConfigs]
end
end.
mergeconf(EmqCfg, PluginsEtc, DestDir) ->
filelib:ensure_dir(DestDir),
AppConf = filename:join(DestDir, appconf()),
case file:open(AppConf, [write]) of
{ok, DestFd} ->
CfgFiles = [EmqCfg | cfgfiles(PluginsEtc)],
lists:foreach(fun(CfgFile) ->
{ok, CfgData} = file:read_file(CfgFile),
file:write(DestFd, CfgData),
file:write(DestFd, <<"\n">>)
end, CfgFiles),
file:close(DestFd),
AppConf;
{error, Error} ->
?LOG(error, "Error opening file: ", [Error]),
{error, Error}
end.
appconf() ->
{{Y, M, D}, {H, MM, S}} = calendar:local_time(),
lists:flatten(
io_lib:format(
"app.~4..0w.~2..0w.~2..0w.~2..0w.~2..0w.~2..0w.conf", [Y, M, D, H, MM, S])).
cfgfiles(Dir) ->
[filename:join(Dir, CfgFile) || CfgFile <- filelib:wildcard("*.conf", Dir)].