%% Copyright 2014 Frank Hunleth %% %% 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. %%% @doc %%% This module provides a supervisor for the target_syncer %%% module that does all of the syncing work on the remote. %%% @end -module(target_syncer_sup). -behaviour(supervisor). %% API -export([start_link/0, start_child/1]). %% 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, []). -spec start_child(atom()) -> {ok, undefined | pid()} | {ok, undefined | pid(), _} | {error, _}. start_child(Node) -> % Make sure that the code is up to date on the remote Modules = [relsync_lib, target_syncer], [ begin {Mod, Bin, File} = code:get_object_code(Module), {module, Mod} = rpc:call(Node, code, load_binary, [Mod, File, Bin], 5000) end || Module <- Modules ], % Start the supervisor AChild = {{target_syncer, Node}, {target_syncer, start_link, [Node]}, transient, 2000, worker, [ target_syncer ]}, supervisor:start_child(?SERVER, AChild). %%%=================================================================== %%% 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 frequency and child %% specifications. %% %% @spec init(Args) -> {ok, {SupFlags, [ChildSpec]}} | %% ignore | %% {error, Reason} %% @end %%-------------------------------------------------------------------- init([]) -> RestartStrategy = one_for_one, MaxRestarts = 1000, MaxSecondsBetweenRestarts = 3600, SupFlags = {RestartStrategy, MaxRestarts, MaxSecondsBetweenRestarts}, {ok, {SupFlags, []}}. %%%=================================================================== %%% Internal functions %%%===================================================================