Skip to main content

src/vpn_peer_sup.erl

%%%-------------------------------------------------------------------
%% @doc Supervisor for configured vpn peers.
%%%-------------------------------------------------------------------
-module(vpn_peer_sup).

-behaviour(supervisor).

-export([start_link/0, start_peer/1, stop_peer/1]).
-export([init/1]).

-define(SERVER, ?MODULE).

start_link() ->
    supervisor:start_link({local, ?SERVER}, ?MODULE, []).

start_peer(PeerConfig) ->
    supervisor:start_child(?SERVER, peer_child_spec(PeerConfig)).

stop_peer(PeerId) ->
    ChildId = {vpn_peer, PeerId},
    case supervisor:terminate_child(?SERVER, ChildId) of
        ok ->
            supervisor:delete_child(?SERVER, ChildId);
        {error, Reason} ->
            {error, Reason}
    end.

init([]) ->
    Peers = application:get_env(vpn, peers, []),
    SupFlags = #{
        strategy => one_for_one,
        intensity => 5,
        period => 10
    },
    ChildSpecs = [peer_child_spec(PeerConfig) || PeerConfig <- Peers],
    {ok, {SupFlags, ChildSpecs}}.

peer_child_spec(PeerConfig) ->
    PeerId = maps:get(id, PeerConfig),
    PeerModule = maps:get(peer_module, PeerConfig, vpn_peer),
    #{id => {vpn_peer, PeerId},
      start => {PeerModule, start_link, [PeerConfig]},
      restart => permanent,
      shutdown => 5000,
      type => worker,
      modules => [PeerModule]}.