Current section

Files

Jump to
erldns src erldns_config.erl
Raw

src/erldns_config.erl

%% Copyright (c) 2012-2020, DNSimple Corporation
%%
%% Permission to use, copy, modify, and/or distribute this software for any
%% purpose with or without fee is hereby granted, provided that the above
%% copyright notice and this permission notice appear in all copies.
%%
%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-module(erldns_config).
-moduledoc "Provide application-wide configuration access.".
-export([use_root_hints/0]).
-export([
zone_server_env/0,
zone_server_max_processes/0,
zone_server_protocol/0,
zone_server_host/0,
zone_server_port/0
]).
-export([
websocket_env/0,
websocket_protocol/0,
websocket_host/0,
websocket_port/0,
websocket_path/0,
websocket_url/0
]).
-export([
storage_env/0,
storage_type/0,
storage_user/0,
storage_pass/0,
storage_host/0,
storage_port/0,
storage_dir/0
]).
-export([
keyget/2,
keyget/3
]).
-export([
ingress_udp_request_timeout/0,
ingress_tcp_request_timeout/0
]).
-define(DEFAULT_ZONE_SERVER_PORT, 443).
-define(DEFAULT_WEBSOCKET_PATH, "/ws").
-define(DEFAULT_UDP_PROCESS_TIMEOUT, 500).
-define(DEFAULT_TCP_PROCESS_TIMEOUT, 1000).
-spec use_root_hints() -> boolean().
use_root_hints() ->
case application:get_env(erldns, use_root_hints) of
{ok, Flag} ->
Flag;
_ ->
true
end.
keyget(Key, Data) ->
keyget(Key, Data, undefined).
keyget(Key, Data, Default) ->
case lists:keyfind(Key, 1, Data) of
false ->
Default;
{Key, Value} ->
Value
end.
%% Zone server configuration
%% TODO: remove as zone server client logic has been removed
zone_server_env() ->
{ok, ZoneServerEnv} = application:get_env(erldns, zone_server),
ZoneServerEnv.
zone_server_max_processes() ->
keyget(max_processes, zone_server_env(), 16).
zone_server_protocol() ->
keyget(protocol, zone_server_env(), "https").
zone_server_host() ->
keyget(host, zone_server_env(), "localhost").
zone_server_port() ->
keyget(port, zone_server_env(), ?DEFAULT_ZONE_SERVER_PORT).
websocket_env() ->
keyget(websocket, zone_server_env(), []).
websocket_protocol() ->
keyget(protocol, websocket_env(), wss).
websocket_host() ->
keyget(host, websocket_env(), zone_server_host()).
websocket_port() ->
keyget(port, websocket_env(), zone_server_port()).
websocket_path() ->
keyget(path, websocket_env(), ?DEFAULT_WEBSOCKET_PATH).
websocket_url() ->
atom_to_list(websocket_protocol()) ++ "://" ++ websocket_host() ++ ":" ++ integer_to_list(websocket_port()) ++ websocket_path().
%% Storage configuration
storage_type() ->
storage_get(type).
storage_dir() ->
storage_get(dir).
storage_user() ->
storage_get(user).
storage_pass() ->
storage_get(pass).
storage_host() ->
storage_get(host).
storage_port() ->
storage_get(port).
storage_env() ->
get_env(storage).
storage_get(Key) ->
get_env_value(Key, storage).
-spec ingress_udp_request_timeout() -> non_neg_integer().
ingress_udp_request_timeout() ->
case application:get_env(erldns, ingress_udp_request_timeout) of
{ok, UdpTimeout} ->
UdpTimeout;
_ ->
?DEFAULT_UDP_PROCESS_TIMEOUT
end.
-spec ingress_tcp_request_timeout() -> non_neg_integer().
ingress_tcp_request_timeout() ->
case application:get_env(erldns, ingress_tcp_request_timeout) of
{ok, TcpTimeout} ->
TcpTimeout;
_ ->
?DEFAULT_TCP_PROCESS_TIMEOUT
end.
% Private functions
get_env_value(Key, Name) ->
case lists:keyfind(Key, 1, get_env(Name)) of
false ->
undefined;
{Key, Value} ->
Value
end.
get_env(storage) ->
case application:get_env(erldns, storage) of
undefined ->
[{type, erldns_storage_json}, {dir, undefined}, {user, undefined}, {pass, undefined}, {host, undefined}, {port, undefined}];
{ok, Env} ->
Env
end.