%%%------------------------------------------------------------------- %% @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]}.