Current section
Files
Jump to
Current section
Files
lib/utils.ex
defmodule Pika.Utils do
@moduledoc false
defp validate_address(address) do
case address do
nil -> :error
[0, 0, 0, 0, 0, 0] -> :error
[_, _, _, _, _, _] = addr -> {:ok, addr}
_ -> :error
end
end
def get_mac_address do
{:ok, addresses} = :inet.getifaddrs()
{_if_name, if_mac} = Enum.reduce(addresses, [], fn ({if_name, if_data}, acc) ->
case Keyword.get(if_data, :hwaddr) |> validate_address do
{:ok, address} -> [{to_string(if_name), address} | acc]
_ -> acc
end
end)
|> List.first()
if_mac
|> Enum.map_join(":", fn i -> Integer.to_string(i, 16) |> String.pad_leading(2, "0") end)
end
@spec compute_node_id() :: integer()
def compute_node_id do
{id, _} = get_mac_address() |> String.replace(":", "") |> Integer.parse(16)
rem(id, 1024)
end
def filter_prefixes(prefix, prefixes) do
Enum.filter(prefixes, fn record -> record.prefix == prefix end)
end
end