defmodule SNet.Addr do def get_if_inet4 do {:ok, ifs} = :inet.getifaddrs for {_, opts} <- ifs, {:addr, addr} <- opts, tuple_size(addr) == 4, addr != {127,0,0,1} do addr end 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 end def get_all_inet4 do addrset = for x <- get_if_inet4(), into: %MapSet{}, do: x addrset = MapSet.put(addrset, get_pub_inet4()) 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()) end end