anchor.diff:      end,
       timer:sleep(?RESTART_DELAY).
   
  --spec node_monitor(nonempty_string(), node(), {bool(), bool()}) -> _.
  +-spec node_monitor(host(), node(), {boolean(), boolean()}) -> 'ok'.
   node_monitor(Host, Node, WebConfig) ->
       monitor_node(Node, true),
       start_ddfs_node(Node, WebConfig),
  
positive.code:                 self(),
                  disco:get_setting("DISCO_ERLANG")).
  
  -spec is_master(nonempty_string()) -> bool().
  is_master(Host) ->
      % the underlying tcp connection used by net_adm:names() may hang,
      % so we use a timed rpc.
  
negative.code: -define(RPC_CALL_TIMEOUT, 30000).
  -define(RPC_RETRY_TIMEOUT, 120000).
  
  -type host() :: nonempty_string().
  
  -spec start_link(host()) -> pid().
  start_link(Host) ->
      spawn_link(fun() -> spawn_node(Host) end).
  
  -spec spawn_node(host()) -> 'ok'.
  spawn_node(Host) ->
      process_flag(trap_exit, true),
      spawn_node(Host, is_master(Host)).
  
  -spec spawn_node(host(), boolean()) -> 'ok'.
  spawn_node(Host, IsMaster) ->
      case {IsMaster, catch slave_start(Host)} of
          {true, {ok, Node}} ->
  