diff options
Diffstat (limited to 'shard/lib/net/addr.ex')
-rw-r--r-- | shard/lib/net/addr.ex | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/shard/lib/net/addr.ex b/shard/lib/net/addr.ex index 630f95a..c1d2f05 100644 --- a/shard/lib/net/addr.ex +++ b/shard/lib/net/addr.ex @@ -1,4 +1,25 @@ defmodule SNet.Addr do + use Agent + + require Logger + + def start_link(_) do + Agent.start_link(__MODULE__, :init, [], name: __MODULE__) + end + + def init() do + Application.ensure_all_started(:inets) + Application.ensure_all_started(:ssl) + case :httpc.request('http://api.ipify.org') do + {:ok, {_, _, body}} -> + {:ok, addr} = :inet.parse_address body + Logger.info "Public IP address: #{body}" + [addr] + _ -> + Logger.info "Could not get public IP address" + [] + end + end def get_if_inet4 do {:ok, ifs} = :inet.getifaddrs @@ -12,20 +33,15 @@ defmodule SNet.Addr do end def get_pub_inet4 do - Application.ensure_all_started(:inets) - Application.ensure_all_started(:ssl) - {:ok, {_, _, body}} = :httpc.request('http://api.ipify.org') - {:ok, addr} = :inet.parse_address body - addr + Agent.get(__MODULE__, &(&1)) end def get_all_inet4 do - addrset = for x <- get_if_inet4(), into: %MapSet{}, do: x - addrset = MapSet.put(addrset, get_pub_inet4()) + addrset = for x <- get_if_inet4() ++ get_pub_inet4(), into: %MapSet{}, do: x MapSet.to_list addrset end def is_local?({:inet, ip, port}) do - port == Application.get_env(:shard, :port) and (ip == {127,0,0,1} or ip in get_if_inet4()) + port == Application.get_env(:shard, :port) and (ip == {127,0,0,1} or ip in get_all_inet4()) end end |