summaryrefslogtreecommitdiff
path: root/deps/rabbitmq_cli/lib/rabbitmq/cli/core/networking.ex
blob: 12d99df7c166456e1379a08c0f3aaa4035c43066 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
## This Source Code Form is subject to the terms of the Mozilla Public
## License, v. 2.0. If a copy of the MPL was not distributed with this
## file, You can obtain one at https://mozilla.org/MPL/2.0/.
##
## Copyright (c) 2007-2020 VMware, Inc. or its affiliates.  All rights reserved.

defmodule RabbitMQ.CLI.Core.Networking do
  @type address_family() :: :inet | :inet6

  @spec address_family(String.t() | atom() | charlist() | binary()) :: address_family()
  def address_family(value) do
    val = RabbitMQ.CLI.Core.DataCoercion.to_atom(value)
    case val do
      :inet  -> :inet
      :inet4 -> :inet
      :inet6 -> :inet6
      :ipv4  -> :inet
      :ipv6  -> :inet6
      :IPv4  -> :inet
      :IPv6  -> :inet6
    end
  end

  @spec address_family(String.t() | atom()) :: boolean()
  def valid_address_family?(value) when is_atom(value) do
    valid_address_family?(to_string(value))
  end
  def valid_address_family?("inet"),  do: true
  def valid_address_family?("inet4"), do: true
  def valid_address_family?("inet6"), do: true
  def valid_address_family?("ipv4"),  do: true
  def valid_address_family?("ipv6"),  do: true
  def valid_address_family?("IPv4"),  do: true
  def valid_address_family?("IPv6"),  do: true
  def valid_address_family?(_other),  do: false

  @spec format_address(:inet.ip_address()) :: String.t()
  def format_address(addr) do
    to_string(:inet.ntoa(addr))
  end

  @spec format_addresses([:inet.ip_address()]) :: [String.t()]
  def format_addresses(addrs) do
    Enum.map(addrs, &format_address/1)
  end

  @spec inetrc_map(nonempty_list()) :: map()
  def inetrc_map(list) do
    Enum.reduce(list, %{},
      fn hosts, acc when is_list(hosts) ->
           Map.put(acc, "hosts", host_resolution_map(hosts))
         {k, v}, acc when k == :domain or k == :resolv_conf or k == :hosts_file ->
           Map.put(acc, to_string(k), to_string(v))
         {k, v}, acc when is_list(v) when k == :search or k == :lookup ->
           Map.put(acc, to_string(k), Enum.join(Enum.map(v, &to_string/1), ", "))
         {k, v}, acc when is_integer(v) ->
           Map.put(acc, to_string(k), v)
         {k, v, v2}, acc when is_tuple(v) when k == :nameserver or k == :nameservers or k == :alt_nameserver ->
           Map.put(acc, to_string(k), "#{:inet.ntoa(v)}:#{v2}")
         {k, v}, acc when is_tuple(v) when k == :nameserver or k == :nameservers or k == :alt_nameserver ->
           Map.put(acc, to_string(k), to_string(:inet.ntoa(v)))
         {k, v}, acc ->
           Map.put(acc, to_string(k), to_string(v))
      end)
  end

  def host_resolution_map(hosts) do
    Enum.reduce(hosts, %{},
        fn {:host, address, hosts}, acc ->
          Map.put(acc, to_string(:inet.ntoa(address)), Enum.map(hosts, &to_string/1))
        end)
  end
end