class Splicer::DnsMadeEasy::Provider

@author Matthew A. Johnston <warmwaffles@gmail.com>

Attributes

client[R]
records[R]

Public Class Methods

new(config) click to toggle source
# File lib/splicer/dns_made_easy/provider.rb, line 8
def initialize(config)
  @config = config
  @client = Client.new(config.key, config.secret, api_mode: config.api_mode, use_ssl: config.use_ssl)
end

Public Instance Methods

create_record_in_zone(record, zone) click to toggle source
# File lib/splicer/dns_made_easy/provider.rb, line 54
def create_record_in_zone(record, zone)
  Splicer.logger.debug "[SPLICER][DNSMADEEASY] #create_record_in_zone record=#{record.inspect} zone=#{zone.inspect}"
  domain = find_domain(zone.name)
  unless domain.persisted?
    create_domain(zone)
    domain = find_domain(zone.name)
  end

  records = find_records(record.name, record.type, domain.id)
  return false unless records.empty?
  create_record(domain.id, record)
end
create_zone(zone) click to toggle source
# File lib/splicer/dns_made_easy/provider.rb, line 13
def create_zone(zone)
  Splicer.logger.debug "[SPLICER][DNSMADEEASY] #create_zone zone=#{zone.inspect}"
  domain = find_domain(zone.name)
  return false if domain.persisted?

  create_domain(zone)

  zone.records.each do |record|
    create_record(domain.id, record)
  end
  true
end
delete_record_in_zone(record, zone) click to toggle source
# File lib/splicer/dns_made_easy/provider.rb, line 33
def delete_record_in_zone(record, zone)
  Splicer.logger.debug "[SPLICER][DNSMADEEASY] #delete_record_in_zone record=#{record.inspect} zone=#{zone.inspect}"
  domain = find_domain(zone.name)
  return [] unless domain.persisted?

  records = find_records(record.name, record.type, domain.id)
  return false if records.empty?

  delete_record(domain.id, records.first.id)
end
delete_zone(zone) click to toggle source
# File lib/splicer/dns_made_easy/provider.rb, line 26
def delete_zone(zone)
  Splicer.logger.debug "[SPLICER][DNSMADEEASY] #delete_zone zone=#{zone.inspect}"
  domain = find_domain(zone.name)
  return false unless domain.persisted?
  client.delete(domain_resource_url(domain.id))
end
get_records_for(zone) click to toggle source
# File lib/splicer/dns_made_easy/provider.rb, line 72
def get_records_for(zone)
  Splicer.logger.debug "[SPLICER][DNSMADEEASY] #get_records_for zone=#{zone.inspect}"
  domain = find_domain(zone.name)
  return [] unless domain.persisted?
  fetch_records(domain.id)
end
get_zone_for(zone) click to toggle source
# File lib/splicer/dns_made_easy/provider.rb, line 67
def get_zone_for(zone)
  Splicer.logger.debug "[SPLICER][DNSMADEEASY] #get_zone_for zone=#{zone.inspect}"
  find_domain(zone.name)
end
update_record_in_zone(record, zone) click to toggle source
# File lib/splicer/dns_made_easy/provider.rb, line 44
def update_record_in_zone(record, zone)
  Splicer.logger.debug "[SPLICER][DNSMADEEASY] #update_record_in_zone record=#{record.inspect} zone=#{zone.inspect}"
  domain = find_domain(zone.name)
  return false unless domain.persisted?

  records = find_records(record.name, record.type, domain.id)
  return false if records.empty?
  update_record(domain.id, records.first.id, record)
end

Private Instance Methods

create_domain(zone) click to toggle source
# File lib/splicer/dns_made_easy/provider.rb, line 118
def create_domain(zone)
  client.post('dns/managed', name: zone.name)
end
create_record(domain_id, splicer_record) click to toggle source

@param [Integer] domain_id @param [Splicer::Records::Record] splicer_record @return [String]

# File lib/splicer/dns_made_easy/provider.rb, line 125
def create_record(domain_id, splicer_record)
  url = record_url(domain_id)
  payload = record_payload(splicer_record)
  client.post(url, payload)
end
delete_record(domain_id, record_id) click to toggle source

@param [Integer] record_id @param [Integer] domain_id @return [String]

# File lib/splicer/dns_made_easy/provider.rb, line 144
def delete_record(domain_id, record_id)
  url = record_url(domain_id, record_id)
  payload = { id: record_id }
  client.delete(url, payload)
end
domain_resource_url(domain_id) click to toggle source

@param [Integer] domain_id @return [String]

# File lib/splicer/dns_made_easy/provider.rb, line 162
def domain_resource_url(domain_id)
  "dns/managed/#{domain_id}"
end
fetch_records(domain_id) click to toggle source

@param [Integer] domain_id @return [Array<Splicer::DnsMadeEasy::Record>]

# File lib/splicer/dns_made_easy/provider.rb, line 83
def fetch_records(domain_id)
  records_call = client.get(record_url(domain_id))
  records = JSON.parse(records_call)['data']

  @records = []
  records.each do |record|
    new_record = Record.new
    record.each do |attribute, type|
      new_record.send(:"#{attribute}=", type) if new_record.respond_to?(:"#{attribute}=")
    end
    @records << new_record
  end
  @records
end
find_domain(name) click to toggle source
# File lib/splicer/dns_made_easy/provider.rb, line 166
def find_domain(name)
  response = JSON.parse(client.get("dns/managed/id/#{name}"))
  Domain.new(response)
rescue Splicer::Errors::RequestError => error
  Domain.new({error: error.data})
end
find_records(name, type, domain_id) click to toggle source

@param [Integer] domain_id @param [String] type @return [Array<Splicer::DnsMadeEasy::Record>]

# File lib/splicer/dns_made_easy/provider.rb, line 101
def find_records(name, type, domain_id)
  payload = {
    type: type,
    recordName: name || ''
  }
  response = JSON.parse(client.get(record_url(domain_id), payload))
  if response['data'].is_a?(Array)
    list = []
    response['data'].each do |params|
      list << Record.new(params)
    end
    list
  else
    [Record.new(response['data'])]
  end
end
record_payload(record) click to toggle source

Returns a hash for the record data @param [Splicer::Records::Record] record @return [Hash]

# File lib/splicer/dns_made_easy/provider.rb, line 176
def record_payload(record)
  payload = {
    type: record.type,
    gtdLocation: 'DEFAULT',
    name: record.name || '',
    ttl: record.ttl
  }
  case record
  when Splicer::Records::ARecord
    payload.merge!({ value: record.ip })
  when Splicer::Records::AAAARecord
    payload.merge!({ value: record.ip })
  when Splicer::Records::CNAMERecord
    payload.merge!({ value: record.cname })
  when Splicer::Records::MXRecord
    payload.merge!({ value: record.exchanger, mxLevel: record.priority })
  when Splicer::Records::NSRecord
    payload.merge!({ value: record.server })
  when Splicer::Records::PTRRecord
    payload.merge!({ value: record.host })
  when Splicer::Records::SRVRecord
    payload.merge!({
      value: record.target,
      weight: record.weight,
      priority: record.priority,
      port: record.port
    })
  when Splicer::Records::TXTRecord
    payload.merge!({
      value: record.text
    })
  else
    payload = {}
  end
  payload
end
record_url(domain_id, record_id=nil) click to toggle source

@param [Integer] domain_id @return [String]

# File lib/splicer/dns_made_easy/provider.rb, line 152
def record_url(domain_id, record_id=nil)
  if record_id
    "dns/managed/#{domain_id}/records/#{record_id}"
  else
    "dns/managed/#{domain_id}/records"
  end
end
update_record(domain_id, record_id, splicer_record) click to toggle source

@param [Integer] record_id @param [Integer] domain_id @param [Splicer::Records::Record] splicer_record @return [String]

# File lib/splicer/dns_made_easy/provider.rb, line 135
def update_record(domain_id, record_id, splicer_record)
  url = record_url(domain_id, record_id)
  payload = record_payload(splicer_record).merge({id: record_id})
  client.put(url, payload)
end