class DnsMadeEasy::Api::Client

Attributes

api_key[R]
api_secret[R]
base_uri[RW]
request_limit[R]
requests_remaining[R]

Public Class Methods

new(api_key, api_secret, sandbox = false, options = {}) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 26
def initialize(api_key, api_secret, sandbox = false, options = {})
  fail 'api_key is undefined' unless api_key
  fail 'api_secret is undefined' unless api_secret

  @api_key            = api_key
  @api_secret         = api_secret
  @options            = options
  @requests_remaining = -1
  @request_limit      = -1

  sandbox ? on_sandbox : on_production
end
public_operations() click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 15
def public_operations
  (new('a', 'b').methods - Object.methods).map(&:to_s).reject { |r| r =~ /[=]$|^(api_|on_|request)/ }.sort
end

Public Instance Methods

all(domain_name)
Alias for: records_for
create_a_record(domain_name, name, value, options = {}) click to toggle source

Specific record types

# File lib/dnsmadeeasy/api/client.rb, line 128
def create_a_record(domain_name, name, value, options = {})
  # TODO: match IPv4 for value
  create_record domain_name, name, 'A', value, options
end
create_aaaa_record(domain_name, name, value, options = {}) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 133
def create_aaaa_record(domain_name, name, value, options = {})
  # TODO: match IPv6 for value
  create_record domain_name, name, 'AAAA', value, options
end
create_cname_record(domain_name, name, value, options = {}) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 148
def create_cname_record(domain_name, name, value, options = {})
  # TODO: match CNAME value
  create_record domain_name, name, 'CNAME', value, options
end
create_domain(domain_name) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 71
def create_domain(domain_name)
  create_domains([domain_name])
end
create_domains(names) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 67
def create_domains(names)
  post('/dns/managed/', names: names)
end
create_httpred_record(domain_name, name, value, redirectType = 'STANDARD - 302', description = '', keywords = '', title = '', options = {}) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 172
def create_httpred_record(domain_name, name, value, redirectType = 'STANDARD - 302', description = '', keywords = '', title = '', options = {})
  options.merge!('redirectType' => redirectType, 'description' => description, 'keywords' => keywords, 'title' => title)
  create_record domain_name, name, 'HTTPRED', value, options
end
create_mx_record(domain_name, name, priority, value, options = {}) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 162
def create_mx_record(domain_name, name, priority, value, options = {})
  options.merge!('mxLevel' => priority)

  create_record domain_name, name, 'MX', value, options
end
create_ns_record(domain_name, name, value, options = {}) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 153
def create_ns_record(domain_name, name, value, options = {})
  # TODO: match domainname for value
  create_record domain_name, name, 'NS', value, options
end
create_ptr_record(domain_name, name, value, options = {}) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 138
def create_ptr_record(domain_name, name, value, options = {})
  # TODO: match PTR value
  create_record domain_name, name, 'PTR', value, options
end
create_record(domain_name, name, type, value, options = {}) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 121
def create_record(domain_name, name, type, value, options = {})
  body = { 'name' => name, 'type' => type, 'value' => value, 'ttl' => 3600, 'gtdLocation' => 'DEFAULT' }
  post "/dns/managed/#{get_id_by_domain(domain_name)}/records/", body.merge(options)
end
create_secondary_domain(domain_name, ip_set_id) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 213
def create_secondary_domain(domain_name, ip_set_id)
  domains = [domain_name]
  create_secondary_domains(domains, ip_set_id)
end
create_secondary_domains(domain_names, ip_set_id) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 208
def create_secondary_domains(domain_names, ip_set_id)
  body = { names: domain_names, ipSetId: ip_set_id }
  post '/dns/secondary', body
end
create_secondary_ip_set(name, ips) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 248
def create_secondary_ip_set(name, ips)
  body = { name: name, ips: ips }
  post '/dns/secondary/ipSet', body
end
create_spf_record(domain_name, name, value, options = {}) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 158
def create_spf_record(domain_name, name, value, options = {})
  create_record domain_name, name, 'SPF', value, options
end
create_srv_record(domain_name, name, priority, weight, port, value, options = {}) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 168
def create_srv_record(domain_name, name, priority, weight, port, value, options = {})
  options.merge!('priority' => priority, 'weight' => weight, 'port' => port)
  create_record domain_name, name, 'SRV', value, options
end
create_txt_record(domain_name, name, value, options = {}) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 143
def create_txt_record(domain_name, name, value, options = {})
  # TODO: match TXT value
  create_record domain_name, name, 'TXT', value, options
end
delete_all_records(domain_name) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 116
def delete_all_records(domain_name)
  domain_id = get_id_by_domain(domain_name)
  delete "/dns/managed/#{domain_id}/records"
end
delete_domain(domain_name) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 63
def delete_domain(domain_name)
  delete "/dns/managed/#{get_id_by_domain(domain_name)}"
end
delete_record(domain_name, record_id) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 104
def delete_record(domain_name, record_id)
  delete "/dns/managed/#{get_id_by_domain(domain_name)}/records/#{record_id}/"
end
delete_records(domain_name, ids = []) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 108
def delete_records(domain_name, ids = [])
  return if ids.empty?

  domain_id = get_id_by_domain(domain_name)

  delete "/dns/managed/#{domain_id}/records?ids=#{ids.join(',')}"
end
delete_secondary_domain(domain_name) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 232
def delete_secondary_domain(domain_name)
  delete "/dns/secondary/#{get_id_by_secondary_domain(domain_name)}"
end
delete_secondary_ip_set(ip_set_id) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 258
def delete_secondary_ip_set(ip_set_id)
  delete "/dns/secondary/ipSet/#{ip_set_id}"
end
domain(domain_name) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 59
def domain(domain_name)
  get "/dns/managed/#{get_id_by_domain(domain_name)}"
end
domains() click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 55
def domains
  get '/dns/managed/'
end
find_all(domain_name, name, type) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 85
def find_all(domain_name, name, type)
  records = records_for(domain_name)
  return nil unless records

  records['data'].select { |r| r['name'] == name && r['type'] == type }
end
find_first(domain_name, name, type) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 92
def find_first(domain_name, name, type)
  records = records_for(domain_name)
  return nil unless records

  records['data'].detect { |r| r['name'] == name && r['type'] == type }
end
find_record_ids(domain_name, name, type) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 99
def find_record_ids(domain_name, name, type)
  records = records_for(domain_name)
  records['data'].select { |r| r['name'] == name && r['type'] == type }.map { |r| r['id'] }
end
get_id_by_domain(domain_name) click to toggle source

————- DOMAINS ————-


# File lib/dnsmadeeasy/api/client.rb, line 51
def get_id_by_domain(domain_name)
  get("/dns/managed/id/#{domain_name}")['id']
end
get_id_by_secondary_domain(domain_name) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 223
def get_id_by_secondary_domain(domain_name)
  domain_data = secondary_domains['data'].find do |domain|
    domain['name'] == domain_name
  end
  raise NoDomainError, "#{domain_name} does not exist" unless domain_data

  domain_data['id']
end
on_production(&block) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 43
def on_production(&block)
  with_url(::DnsMadeEasy::API_BASE_URL_PRODUCTION, &block)
end
on_sandbox(&block) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 39
def on_sandbox(&block)
  with_url(::DnsMadeEasy::API_BASE_URL_SANDBOX, &block)
end
records_for(domain_name) click to toggle source

————- RECORDS ————-


# File lib/dnsmadeeasy/api/client.rb, line 79
def records_for(domain_name)
  get "/dns/managed/#{get_id_by_domain(domain_name)}/records"
end
Also aliased as: all
secondary_domain(domain_id) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 204
def secondary_domain(domain_id)
  get "/dns/secondary/#{domain_id}"
end
secondary_domains() click to toggle source

——- Secondary Domains ———


# File lib/dnsmadeeasy/api/client.rb, line 200
def secondary_domains
  get '/dns/secondary'
end
secondary_ip_set(ip_set_id) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 244
def secondary_ip_set(ip_set_id)
  get "/dns/secondary/ipSet/#{ip_set_id}"
end
secondary_ip_sets() click to toggle source

——- Secondary IpSet ———–


# File lib/dnsmadeeasy/api/client.rb, line 240
def secondary_ip_sets
  get '/dns/secondary/ipSet'
end
update_record(domain, record_id, name, type, value, options = {}) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 177
def update_record(domain, record_id, name, type, value, options = {})
  body = { 'name' => name, 'type' => type, 'value' => value, 'ttl' => 3600, 'gtdLocation' => 'DEFAULT', 'id' => record_id }
  put "/dns/managed/#{get_id_by_domain(domain)}/records/#{record_id}/", body.merge(options)
end
update_records(domain, records, options = {}) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 182
def update_records(domain, records, options = {})
  body = records.map do |record|
    {
      'id' => record['id'],
      'name' => record['name'],
      'type' => record['type'],
      'value' => record['value'],
      'gtdLocation' => record['gtdLocation'],
      'ttl' => record['ttl']
    }.merge(options)
  end
  put "/dns/managed/#{get_id_by_domain(domain)}/records/updateMulti/", body
end
update_secondary_domains(domain_ids, ip_set_id) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 218
def update_secondary_domains(domain_ids, ip_set_id)
  body = { ids: domain_ids, ipSetId: ip_set_id }
  put '/dns/secondary', body
end
update_secondary_ip_set(ip_set_id, name, ips) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 253
def update_secondary_ip_set(ip_set_id, name, ips)
  body = { name: name, id: ip_set_id, ips: ips }
  put "/dns/secondary/ipSet/#{ip_set_id}", body
end

Private Instance Methods

delete(path, body = nil) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 270
def delete(path, body = nil)
  request(path) do |uri|
    req      = Net::HTTP::Delete.new(uri)
    req.body = body.to_json if body
    req
  end
end
get(path) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 264
def get(path)
  request(path) do |uri|
    Net::HTTP::Get.new(uri)
  end
end
post(path, body) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 286
def post(path, body)
  request(path) do |uri|
    req      = Net::HTTP::Post.new(uri)
    req.body = body.to_json
    req
  end
end
process_rate_limits(response) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 325
def process_rate_limits(response)
  response.each_header do |header, value|
    @requests_remaining = value.to_i if header == 'x-dnsme-requestsremaining'
    @request_limit      = value.to_i if header == 'x-dnsme-requestlimit'
  end
end
process_response!(response) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 312
def process_response!(response)
  response.value # raise Net::HTTPServerException unless response was 2xx
  process_rate_limits(response)
  unparsed_json = response.body.to_s.empty? ? '{}' : response.body
  Hashie::Mash.new(JSON.parse(unparsed_json))
rescue Net::HTTPServerException => e
  if e.message =~ /403.*forbidden/i
    raise ::DnsMadeEasy::AuthenticationError, e
  else
    raise e
  end
end
put(path, body = nil) click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 278
def put(path, body = nil)
  request(path) do |uri|
    req      = Net::HTTP::Put.new(uri)
    req.body = body.to_json if body
    req
  end
end
request(path) { |uri| ... } click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 294
def request(path)
  uri = URI("#{base_uri}#{path}")

  http              = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl      = true
  http.verify_mode  = OpenSSL::SSL::VERIFY_NONE if @options.key?(:ssl_verify_none)
  http.open_timeout = @options[:open_timeout] if @options.key?(:open_timeout)
  http.read_timeout = @options[:read_timeout] if @options.key?(:read_timeout)

  request = yield(uri)

  request_headers.each do |key, value|
    request[key] = value
  end

  process_response!(http.request(request))
end
request_headers() click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 332
def request_headers
  request_date = Time.now.httpdate
  hmac         = OpenSSL::HMAC.hexdigest('sha1', @api_secret, request_date)
  {
    'Accept' => 'application/json',
    'x-dnsme-apiKey' => @api_key,
    'x-dnsme-requestDate' => request_date,
    'x-dnsme-hmac' => hmac
  }
end
with_url(url) { || ... } click to toggle source
# File lib/dnsmadeeasy/api/client.rb, line 343
def with_url(url)
  old_value     = base_uri
  self.base_uri = url
  if block_given?
    yield
    self.base_uri = old_value
  end
  self
end