Current section

Files

Jump to
nova src nova_sup.erl
Raw

src/nova_sup.erl

%%%-------------------------------------------------------------------
%%% @author Niclas Axelsson <niclas@burbas.se>
%%% @copyright (C) 2018, Niclas Axelsson
%%% @doc
%%%
%%% @end
%%% Created : 26 Jun 2018 by Niclas Axelsson <niclas@burbas.se>
%%%-------------------------------------------------------------------
-module(nova_sup).
-behaviour(supervisor).
%% API
-export([start_link/0]).
%% Supervisor callbacks
-export([init/1]).
-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),
logger: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},
Children = [
child(nova_router, nova_router),
child(nova_session, nova_session)
],
Children2 = case application:get_env(rest_only) of
{ok, true} ->
logger:info("Starting Nova with rest_only option. Views will not be compiled"),
Children;
_ ->
logger:info("Starting Nova as normal..."),
[child(nova_compiler, nova_compiler)|Children]
end,
Children3 =
case application:get_env(dev_mode) of
{ok, true} ->
logger:info("Nova reloader starting..."),
[child(nova_reloader, nova_reloader)|Children2];
_ ->
Children2
end,
{ok, {SupFlags, Children3}}.
%%%===================================================================
%%% 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,
logger:info("Nova is running on port ~p", [Port]),
{ok, _} = cowboy:start_clear(
nova_listener,
[{port, Port}],
#{}).
start_cowboy_secure(CACert, Cert) ->
Port = case application:get_env(ssl_port) of
undefined -> 8443;
{ok, SSLPort} -> SSLPort
end,
logger:info("Nova is running SSL on port ~p", [Port]),
{ok, _} = cowboy:start_tls(nova_listener, [
{port, Port},
{certfile, Cert},
{cacertfile, CACert}
], #{}).