diff options
Diffstat (limited to 'shard/lib/net')
-rw-r--r-- | shard/lib/net/addr.ex | 32 | ||||
-rw-r--r-- | shard/lib/net/manager.ex | 4 |
2 files changed, 26 insertions, 10 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 diff --git a/shard/lib/net/manager.ex b/shard/lib/net/manager.ex index 624d7e6..dd80347 100644 --- a/shard/lib/net/manager.ex +++ b/shard/lib/net/manager.ex @@ -72,7 +72,7 @@ defmodule SNet.Manager do [] -> my_port = Application.get_env(:shard, :port) {:ok, pid} = SNet.TCPConn.start_link(%{connect_to: peer_info, my_port: my_port, auth: auth}) - :ets.insert(:connections, {peer_info, pid, nil}) + :ets.insert(:connections, {peer_info, pid, auth}) pid end end @@ -93,7 +93,7 @@ defmodule SNet.Manager do Return the list of all connected peers """ def list_connections() do - for [x] <- :ets.match(:connections, :"$1"), do: x + :ets.tab2list(:connections) end @doc""" |