Current section

Files

Jump to
nova src nova_sup.erl
Raw

src/nova_sup.erl

%%% @author Niclas Axelsson <niclas@burbas.se>
%%% @doc
%%% Nova supervisor
%%% @end
-module(nova_sup).
-behaviour(supervisor).
%% API
-export([start_link/0]).
%% Supervisor callbacks
-export([init/1]).
-include_lib("nova/include/nova.hrl").
-define(SERVER, ?MODULE).
%%%===================================================================
%%% API functions
%%%===================================================================
%%--------------------------------------------------------------------
%% @doc
%% Starts the supervisor
%%
%% @spec start_link() -> {ok, Pid} | ignore | {error, Error}
%% @end
%%--------------------------------------------------------------------
start_link() ->
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
%%%===================================================================
%%% Supervisor callbacks
%%%===================================================================
%%--------------------------------------------------------------------
%% @private
%% @doc
%% Whenever a supervisor is started using supervisor:start_link/[2,3],
%% this function is called by the new process to find out about
%% restart strategy, maximum restart intensity, and child
%% specifications.
%%
%% @spec init(Args) -> {ok, {SupFlags, [ChildSpec]}} |
%% ignore |
%% {error, Reason}
%% @end
%%--------------------------------------------------------------------
init([]) ->
%% This is a bit ugly, but we need to do this anyhow(?)
application:ensure_all_started(ranch),
case application:get_env(use_ssl) of
{ok, true} ->
{ok, Cert} = application:get_env(ssl_certfile),
{ok, CACert} = application:get_env(ssl_cacertfile),
?INFO("Starting Nova with SSL support. Cert: ~s, CACert: ~s", [Cert, CACert]),
start_cowboy_secure(CACert, Cert);
_ ->
start_cowboy()
end,
SupFlags = #{strategy => one_for_one,
intensity => 1,
period => 5},
SessionManager =
case application:get_env(session_manager) of
{ok, Manager} ->
Manager;
_ ->
%% Default to the nova_session_ets manager
nova_session_ets
end,
Children = [
child(nova_router, nova_router),
child(nova_handlers, nova_handlers),
child(SessionManager, SessionManager)
],
case application:get_env(dev_mode) of
{ok, true} ->
?INFO("Starting nova in developer mode...");
_ ->
?INFO("Starting nova in production mode...")
end,
{ok, {SupFlags, Children}}.
%%%===================================================================
%%% Internal functions
%%%===================================================================
child(Id, Mod) ->
#{id => Id,
start => {Mod, start_link, []},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [Mod]}.
start_cowboy() ->
Port =
case application:get_env(web_port) of
undefined ->
8080;
{ok, WebPort} ->
WebPort
end,
?INFO("Nova is running on port ~p", [Port]),
{ok, _} = cowboy:start_clear(
nova_listener,
[{port, Port}],
#{middlewares => [cowboy_router, nova_security_handler, cowboy_handler],
stream_handlers => [nova_stream_h, cowboy_compress_h, cowboy_stream_h],
compress => true}).
start_cowboy_secure(CACert, Cert) ->
Port = case application:get_env(ssl_port) of
undefined -> 8443;
{ok, SSLPort} -> SSLPort
end,
?INFO("Nova is running SSL on port ~p", [Port]),
{ok, _} = cowboy:start_tls(nova_listener, [
{port, Port},
{certfile, Cert},
{cacertfile, CACert}
],
#{middlewares => [cowboy_router, nova_security_handler, cowboy_handler]}).