%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2010-2016. All Rights Reserved.
%%
%% 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.
%%
%% %CopyrightEnd%
%%
%%
%%----------------------------------------------------------------------
%% Purpose: The HDLT server module.
%% This is just a stub, making future expansion easy.
%% All code in this module is executed in the local node!
%%----------------------------------------------------------------------
-module(hdlt_server).
-export([start/1, stop/0, start_inets/0, start_service/1]).
-export([proxy/1]).
-include_lib("kernel/include/file.hrl").
-include("hdlt_logger.hrl").
-define(PROXY, hdlt_proxy).
%% This function is used to start the proxy process
%% This function is called *after* the nodes has been
%% "connected" with the controller/collector node.
start(Debug) ->
proc_lib:start(?MODULE, proxy, [Debug]).
stop() ->
?PROXY ! stop.
start_inets() ->
?PROXY ! start_inets.
start_service(Config) ->
?PROXY ! {server_start, Config, self()},
receive
{server_start_result, Result} ->
Result
after 15000 ->
{error, timeout}
end.
proxy(Debug) ->
process_flag(trap_exit, true),
erlang:register(?PROXY, self()),
?SET_NAME("HDLT PROXY"),
?SET_LEVEL(Debug),
?LOG("starting", []),
Ref = await_for_controller(10),
CtrlNode = node(Ref),
erlang:monitor_node(CtrlNode, true),
proc_lib:init_ack({ok, self()}),
?DEBUG("started", []),
proxy_loop(Ref, CtrlNode).
await_for_controller(N) when N > 0 ->
case global:whereis_name(hdlt_ctrl) of
Pid when is_pid(Pid) ->
erlang:monitor(process, Pid);
_ ->
timer:sleep(1000),
await_for_controller(N-1)
end;
await_for_controller(_) ->
proc_lib:init_ack({error, controller_not_found, nodes()}),
timer:sleep(500),
halt().
proxy_loop(Ref, CtrlNode) ->
?DEBUG("await command", []),
receive
stop ->
?LOG("received stop", []),
halt();
start_inets ->
?LOG("start the inets service framework", []),
case (catch inets:start()) of
ok ->
?LOG("framework started", []),
proxy_loop(Ref, CtrlNode);
Error ->
?LOG("failed starting inets service framework: "
"~n Error: ~p", [Error]),
halt()
end;
{server_start, Config, From} ->
?LOG("start-server", []),
maybe_start_crypto_and_ssl(Config),
%% inets:enable_trace(max, "/tmp/inets-httpd-trace.log", httpd),
%% inets:enable_trace(max, "/tmp/inets-httpd-trace.log", all),
case (catch inets:start(httpd, Config)) of
{ok, _} ->
?LOG("server started when"
"~n which(inets): ~p"
"~n RootDir: ~p"
"~n System info: ~p", [code:which(inets),
code:root_dir(),
get_node_info()]),
From ! {server_start_result, ok},
proxy_loop(Ref, CtrlNode);
Error ->
?INFO("server start failed"
"~n Error: ~p", [Error]),
From ! {server_start_result, Error},
halt()
end;
{nodedown, CtrlNode} ->
?LOG("received nodedown for controller node - terminate", []),
halt();
{'DOWN', Ref, process, _, _} ->
?LOG("received DOWN message for controller - terminate", []),
%% The controller has terminated, time to die
halt()
end.
maybe_start_crypto_and_ssl(Config) ->
case lists:keysearch(socket_type, 1, Config) of
{value, {socket_type, SocketType}} when ((SocketType =:= ssl) orelse
(SocketType =:= ossl) orelse
(SocketType =:= essl)) ->
?LOG("maybe start crypto and ssl", []),
(catch crypto:start()),
ssl:start();
_ ->
ok
end.
get_node_info() ->
[{cpu_topology, erlang:system_info(cpu_topology)},
{heap_type, erlang:system_info(heap_type)},
{nof_schedulers, erlang:system_info(schedulers)},
{otp_release, erlang:system_info(otp_release)},
{version, erlang:system_info(version)},
{system_version, erlang:system_info(system_version)},
{system_architecture, erlang:system_info(system_architecture)}].