From ab206a90b61f7b411dae49e0676cd64165ee10f2 Mon Sep 17 00:00:00 2001 From: Lindolfo 'Lorn' Rodrigues Date: Wed, 13 Feb 2019 16:40:19 -0200 Subject: Support Elixir-1.8 Also dropped support for elixir < 1.6 --- lib/powerdnsex.ex | 23 ++++------ lib/powerdnsex/config.ex | 22 +++++---- lib/powerdnsex/converter.ex | 9 ++-- lib/powerdnsex/gen_server/server.ex | 6 ++- lib/powerdnsex/http_client.ex | 10 ++-- lib/powerdnsex/managers/records_manager.ex | 8 ++-- lib/powerdnsex/managers/zones_manager.ex | 24 +++++----- lib/powerdnsex/models/error.ex | 2 +- lib/powerdnsex/models/record.ex | 4 +- lib/powerdnsex/models/resource_record_set.ex | 69 +++++++++++++++------------- lib/powerdnsex/models/zone.ex | 23 +++++++--- 11 files changed, 114 insertions(+), 86 deletions(-) (limited to 'lib') diff --git a/lib/powerdnsex.ex b/lib/powerdnsex.ex index 0f7876b..6568319 100644 --- a/lib/powerdnsex.ex +++ b/lib/powerdnsex.ex @@ -5,9 +5,9 @@ defmodule PowerDNSex do @name :PowerDNSex - def start(_,_), do: start() + def start(_, _), do: start() - @spec start() :: GenServer.on_start + @spec start() :: GenServer.on_start() @doc false def start() do import Supervisor.Spec @@ -16,7 +16,7 @@ defmodule PowerDNSex do options = [strategy: :one_for_one, name: :"#{@name}.Supervisor"] try do - Config.valid? + Config.valid?() case Supervisor.start_link(children, options) do {:ok, pid} -> {:ok, pid} @@ -34,7 +34,7 @@ defmodule PowerDNSex do # Zones # ######### - @spec create_zone(Zone.t, String.t) :: Zone.t | Error.t + @spec create_zone(Zone.t(), String.t()) :: Zone.t() | Error.t() @doc """ Create a new Zone on PowerDNS """ @@ -42,8 +42,7 @@ defmodule PowerDNSex do call({:create_zone, zone, server_name}) end - - @spec show_zone(String.t, String.t) :: :ok | {:error, String.t} + @spec show_zone(String.t(), String.t()) :: :ok | {:error, String.t()} @doc """ Show / Retrive info of the specific Zone """ @@ -51,8 +50,7 @@ defmodule PowerDNSex do call({:show_zone, zone, server_name}) end - - @spec delete_zone(String.t, String.t) :: :ok | {:error, String.t} + @spec delete_zone(String.t(), String.t()) :: :ok | {:error, String.t()} @doc """ Delete specific Zone on PowerDNS """ @@ -64,7 +62,7 @@ defmodule PowerDNSex do # Records # ########### - @spec create_record(Zone.t, struct) :: :ok | {:error, String.t} + @spec create_record(Zone.t(), struct) :: :ok | {:error, String.t()} @doc """ Create a new Record for the given Zone """ @@ -72,7 +70,7 @@ defmodule PowerDNSex do call({:create_record, zone, rrset_attrs}) end - @spec show_record(String.t, struct) :: :ok | {:error, String.t} + @spec show_record(String.t(), struct) :: :ok | {:error, String.t()} @doc """ Show / Retrive info of the specific Record of the given Zone name """ @@ -80,7 +78,7 @@ defmodule PowerDNSex do call({:show_record, zone_name, rrset_attrs}) end - @spec update_record(Zone.t, struct) :: :ok | {:error, String.t} + @spec update_record(Zone.t(), struct) :: :ok | {:error, String.t()} @doc """ Update Record of the given Zone """ @@ -88,7 +86,7 @@ defmodule PowerDNSex do call({:update_record, zone, rrset_attrs}) end - @spec delete_record(Zone.t, struct) :: :ok | {:error, String.t} + @spec delete_record(Zone.t(), struct) :: :ok | {:error, String.t()} @doc """ Delete specific Record of given Zone """ @@ -101,5 +99,4 @@ defmodule PowerDNSex do ########### defp call(params), do: GenServer.call(@name, params) - end diff --git a/lib/powerdnsex/config.ex b/lib/powerdnsex/config.ex index 0d97cb2..34d5889 100644 --- a/lib/powerdnsex/config.ex +++ b/lib/powerdnsex/config.ex @@ -5,22 +5,22 @@ defmodule PowerDNSex.Config do alias PowerDNSex.Config def data do - set_attr_value = &(Map.put(&2, &1, get_key(&1))) + set_attr_value = &Map.put(&2, &1, get_key(&1)) %Config{} - |> Map.from_struct - |> Map.keys + |> Map.from_struct() + |> Map.keys() |> Enum.reduce(%Config{}, set_attr_value) end def powerdns_url do - url = data.url - if String.ends_with?(url, "/"), do: url, else: url <> "/" + url = data().url + if String.ends_with?(url, "/"), do: url, else: url <> "/" end - def powerdns_token, do: data.token + def powerdns_token, do: data().token - def valid?(), do: powerdns_url && powerdns_token + def valid?(), do: powerdns_url() && powerdns_token() ### # Private @@ -28,8 +28,12 @@ defmodule PowerDNSex.Config do defp get_key(key) do case Application.fetch_env(:powerdnsex, key) do - {:ok, {:system, env_var_name}} -> System.get_env(env_var_name) - {:ok, value} -> value + {:ok, {:system, env_var_name}} -> + System.get_env(env_var_name) + + {:ok, value} -> + value + _ -> raise "[PowerDNSex] PowerDNS #{Atom.to_string(key)} not configured." end diff --git a/lib/powerdnsex/converter.ex b/lib/powerdnsex/converter.ex index 507c119..8f8639e 100644 --- a/lib/powerdnsex/converter.ex +++ b/lib/powerdnsex/converter.ex @@ -7,9 +7,12 @@ defmodule PowerDNSex.Converter do for {key, value} <- struct, into: %{} do n_key = if is_binary(key), do: String.to_atom(key), else: key - n_value = if is_map(value) or is_list(value) do - keys_to_atom(value) - else value end + n_value = + if is_map(value) or is_list(value) do + keys_to_atom(value) + else + value + end {n_key, n_value} end diff --git a/lib/powerdnsex/gen_server/server.ex b/lib/powerdnsex/gen_server/server.ex index 3b24503..a0bb7d8 100644 --- a/lib/powerdnsex/gen_server/server.ex +++ b/lib/powerdnsex/gen_server/server.ex @@ -2,7 +2,11 @@ defmodule PowerDNSex.Server do use GenServer alias PowerDNSex.Managers.{ZonesManager, RecordsManager} - alias PowerDNSex.{Models.Zone, Converter} + alias PowerDNSex.Converter + + def init(args) do + {:ok, args} + end def start_link(name) do GenServer.start_link(__MODULE__, :ok, name: name) diff --git a/lib/powerdnsex/http_client.ex b/lib/powerdnsex/http_client.ex index 0a242b5..13e5023 100644 --- a/lib/powerdnsex/http_client.ex +++ b/lib/powerdnsex/http_client.ex @@ -1,5 +1,5 @@ defmodule PowerDNSex.HttpClient do - @moduledoc""" + @moduledoc """ Client to do http requests for PowerDns API """ @@ -7,10 +7,10 @@ defmodule PowerDNSex.HttpClient do alias PowerDNSex.Config - def process_url(url), do: Config.powerdns_url <> url + def process_url(url), do: Config.powerdns_url() <> url - defp process_request_headers(headers) do - custom = ["X-API-Key": Config.powerdns_token] - Enum.into(headers, custom) + def process_request_headers(headers) do + custom = ["X-API-Key": Config.powerdns_token()] + Keyword.merge(headers, custom) end end diff --git a/lib/powerdnsex/managers/records_manager.ex b/lib/powerdnsex/managers/records_manager.ex index 9b6a96f..f2ef6b5 100644 --- a/lib/powerdnsex/managers/records_manager.ex +++ b/lib/powerdnsex/managers/records_manager.ex @@ -7,7 +7,6 @@ defmodule PowerDNSex.Managers.RecordsManager do alias PowerDNSex.Managers.ZonesManager alias HTTPoison.Response - def create(%Zone{} = zone, %{} = rrset_attrs) do rrset_attrs = Map.merge(rrset_attrs, %{changetype: "REPLACE"}) patch(zone, rrset_attrs) @@ -45,9 +44,12 @@ defmodule PowerDNSex.Managers.RecordsManager do defp process_request_response(%Response{body: body, status_code: status}) do case status do - s when s == 204 -> :ok + s when s == 204 -> + :ok + s when s < 300 -> :ok + s when s >= 300 -> error = Poison.decode!(body, as: %Error{}) {:error, %{error | http_status_code: s}} @@ -60,7 +62,7 @@ defmodule PowerDNSex.Managers.RecordsManager do defp patch(%Zone{} = zone, %RRSet{} = rrset) do rrset_body = RRSet.as_body(rrset) - Logger.info "Request to [#{zone.name}] with params [#{rrset_body}]" + Logger.info("Request to [#{zone.name}] with params [#{rrset_body}]") zone.url |> HttpClient.patch!(rrset_body) diff --git a/lib/powerdnsex/managers/zones_manager.ex b/lib/powerdnsex/managers/zones_manager.ex index c7ec1ab..23bab1d 100644 --- a/lib/powerdnsex/managers/zones_manager.ex +++ b/lib/powerdnsex/managers/zones_manager.ex @@ -1,5 +1,4 @@ defmodule PowerDNSex.Managers.ZonesManager do - @default_server "localhost" alias PowerDNSex.HttpClient @@ -15,19 +14,17 @@ defmodule PowerDNSex.Managers.ZonesManager do def show(zone_name, server_name \\ @default_server) when is_bitstring(zone_name) do - server_name |> zone_path(zone_name) - |> HttpClient.get! + |> HttpClient.get!() |> process_request_response end def delete(zone_name, server_name \\ @default_server) when is_bitstring(zone_name) do - server_name |> zone_path(zone_name) - |> HttpClient.delete! + |> HttpClient.delete!() |> process_request_response end @@ -45,20 +42,25 @@ defmodule PowerDNSex.Managers.ZonesManager do defp process_request_response(%Response{body: body, status_code: status}) do case status do - s when s == 204 -> {:ok, %{}} - s when s < 300 -> {:ok, decode_body(body)} + s when s == 204 -> + {:ok, %{}} + + s when s < 300 -> + {:ok, decode_body(body)} + s when s == 500 -> {:error, %Error{error: "Internal Server Error", http_status_code: s}} + s when s >= 300 -> - error = %{Poison.decode!(body,as: %Error{}) | http_status_code: s} + error = %{Poison.decode!(body, as: %Error{}) | http_status_code: s} {:error, error} end end defp decode_body(body) do - zone = body - |> Poison.decode!(as: %Zone{rrsets: - [%ResourceRecordSet{records: [%Record{}]}]}) + zone = + body + |> Poison.decode!(as: %Zone{rrsets: [%ResourceRecordSet{records: [%Record{}]}]}) nameservers = ResourceRecordSet.nameservers(zone.rrsets) Map.put(zone, :nameservers, nameservers) diff --git a/lib/powerdnsex/models/error.ex b/lib/powerdnsex/models/error.ex index b4397df..c1626f0 100644 --- a/lib/powerdnsex/models/error.ex +++ b/lib/powerdnsex/models/error.ex @@ -1,5 +1,5 @@ defmodule PowerDNSex.Models.Error do defstruct [:error, :http_status_code] - @type t :: %__MODULE__{error: String.t} + @type t :: %__MODULE__{error: String.t()} end diff --git a/lib/powerdnsex/models/record.ex b/lib/powerdnsex/models/record.ex index ed0e327..b73cd98 100644 --- a/lib/powerdnsex/models/record.ex +++ b/lib/powerdnsex/models/record.ex @@ -20,8 +20,8 @@ defmodule PowerDNSex.Models.Record do end def find(records, attrs) when is_list(records) do - Enum.find(records, fn(record) -> - Enum.all?(attrs, fn({attr, attr_value}) -> + Enum.find(records, fn record -> + Enum.all?(attrs, fn {attr, attr_value} -> Map.get(record, attr) == attr_value end) end) diff --git a/lib/powerdnsex/models/resource_record_set.ex b/lib/powerdnsex/models/resource_record_set.ex index 1a410b1..dbb90b3 100644 --- a/lib/powerdnsex/models/resource_record_set.ex +++ b/lib/powerdnsex/models/resource_record_set.ex @@ -1,5 +1,4 @@ defmodule PowerDNSex.Models.ResourceRecordSet do - alias PowerDNSex.Models.Record defstruct [:name, :type, :ttl, :records, :changetype] @@ -10,21 +9,23 @@ defmodule PowerDNSex.Models.ResourceRecordSet do end def as_body(%__MODULE__{} = rrset) do - %{rrsets: [ - %{ - name: rrset.name, - type: rrset.type, - ttl: rrset.ttl, - changetype: rrset.changetype, - records: Record.as_body(rrset.records) - } - ]} - |> Poison.encode! + %{ + rrsets: [ + %{ + name: rrset.name, + type: rrset.type, + ttl: rrset.ttl, + changetype: rrset.changetype, + records: Record.as_body(rrset.records) + } + ] + } + |> Poison.encode!() end def find(rrsets, %{} = attrs) when is_list(rrsets) do - Enum.find(rrsets, fn(rrset) -> - Enum.all?(attrs, fn({attr, attr_value}) -> + Enum.find(rrsets, fn rrset -> + Enum.all?(attrs, fn {attr, attr_value} -> if Enum.member?(Map.keys(%__MODULE__{}), attr) do equal_attr?(attr, attr_value, rrset) else @@ -35,23 +36,26 @@ defmodule PowerDNSex.Models.ResourceRecordSet do end def update(%__MODULE__{} = rrset, %{} = new_attrs) do - Enum.reduce(@permited_attrs, rrset, fn(attr_name, rrset) -> - case Map.fetch(new_attrs, attr_name) do - {:ok, new_value} -> - if attr_name == :records do - new_value = Record.build(new_value) - end - %{rrset | attr_name => new_value} - _ -> rrset - end - end) + Enum.reduce(@permited_attrs, rrset, fn attr_name, rrset -> + case {attr_name, Map.fetch(new_attrs, attr_name)} do + {:records, {:ok, new_value}} -> + %{rrset | attr_name => Record.build(new_value)} + + {_, {:ok, new_value}} -> + %{rrset | attr_name => new_value} + + _ -> + rrset + end + end) end def nameservers(rrsets) do - rrset = Enum.find(rrsets, fn(rrset) -> rrset.type == "NS" end) - nameservers = case rrset do + rrset = Enum.find(rrsets, fn rrset -> rrset.type == "NS" end) + + case rrset do nil -> [] - _ -> Enum.map(rrset.records, &(&1.content) ) + _ -> Enum.map(rrset.records, & &1.content) end end @@ -62,10 +66,11 @@ defmodule PowerDNSex.Models.ResourceRecordSet do defp set_attrs(rrset, attr_name, attrs) do if Map.has_key?(attrs, attr_name) do - attr_value = case attr_name do - :records -> Record.build(Map.fetch!(attrs, attr_name)) - _ -> Map.fetch!(attrs, attr_name) - end + attr_value = + case attr_name do + :records -> Record.build(Map.fetch!(attrs, attr_name)) + _ -> Map.fetch!(attrs, attr_name) + end %{rrset | attr_name => attr_value} else @@ -80,7 +85,7 @@ defmodule PowerDNSex.Models.ResourceRecordSet do defp build_rrset(rrset_attrs) do %__MODULE__{} - |> Map.keys - |> Enum.reduce(%__MODULE__{}, &(set_attrs(&2, &1, rrset_attrs))) + |> Map.keys() + |> Enum.reduce(%__MODULE__{}, &set_attrs(&2, &1, rrset_attrs)) end end diff --git a/lib/powerdnsex/models/zone.ex b/lib/powerdnsex/models/zone.ex index 8620443..96089e0 100644 --- a/lib/powerdnsex/models/zone.ex +++ b/lib/powerdnsex/models/zone.ex @@ -6,15 +6,26 @@ defmodule PowerDNSex.Models.Zone do @body_attrs ~w(account dns kind masters name nameservers records serial soa_edit soa_edit_api)a - defstruct name: nil, kind: "Native", masters: [], nameservers: [], rrsets: [], - account: nil, comments: [], dnssec: false, id: nil, last_check: 0, - notified_serial: 0, serial: nil, soa_edit: "", soa_edit_api: "", + defstruct name: nil, + kind: "Native", + masters: [], + nameservers: [], + rrsets: [], + account: nil, + comments: [], + dnssec: false, + id: nil, + last_check: 0, + notified_serial: 0, + serial: nil, + soa_edit: "", + soa_edit_api: "", url: nil @type t :: %__MODULE__{} def as_body(%__MODULE__{} = zone) do - get_valid_attrs = fn({attr, value}, body) -> + get_valid_attrs = fn {attr, value}, body -> if Enum.member?(@body_attrs, attr) do Map.merge(body, %{attr => value}) else @@ -23,8 +34,8 @@ defmodule PowerDNSex.Models.Zone do end zone - |> Map.from_struct + |> Map.from_struct() |> Enum.reduce(%{}, get_valid_attrs) - |> Poison.encode! + |> Poison.encode!() end end -- cgit v1.2.3