class Splicer::Dynect::Provider

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

Attributes

client[R]

Public Class Methods

new(config) click to toggle source
# File lib/splicer/dynect/provider.rb, line 8
def initialize(config)
  @client = Client.new(config.customer, config.username, config.password)
end

Public Instance Methods

create_record_in_zone(record, zone) click to toggle source
# File lib/splicer/dynect/provider.rb, line 62
def create_record_in_zone(record, zone)
  Splicer.logger.debug "[SPLICER][DYNECT] #create_record_in_zone record=#{record.inspect} zone=#{zone.inspect}"
  client.login

  begin
    get_zone(zone)
  rescue
    client.post "Zone/#{zone.name}", rname: "admin@#{zone.name}", ttl: zone.ttl
  end

  create_record(record, zone)
  publish_zone(zone)
ensure
  client.logout
end
create_zone(zone) click to toggle source
# File lib/splicer/dynect/provider.rb, line 12
def create_zone(zone)
  Splicer.logger.debug "[SPLICER][DYNECT] #create_zone zone=#{zone.inspect}"
  client.login

  client.post "Zone/#{zone.name}", rname: "admin@#{zone.name}", ttl: zone.ttl

  zone.records.each do |record|
    create_record(record, zone)
  end

  publish_zone(zone)
ensure
  client.logout
end
delete_record_in_zone(record, zone) click to toggle source
# File lib/splicer/dynect/provider.rb, line 40
def delete_record_in_zone(record, zone)
  Splicer.logger.debug "[SPLICER][DYNECT] #delete_record_in_zone record=#{record.inspect} zone=#{zone.inspect}"
  return false unless can_delete?(record)
  client.login
  id = find_record_id(record, zone)
  url = record_resource_url(record, zone).concat("/#{id}")
  client.delete(url)
  publish_zone(zone)
ensure
  client.logout
end
delete_zone(zone) click to toggle source
# File lib/splicer/dynect/provider.rb, line 27
def delete_zone(zone)
  Splicer.logger.debug "[SPLICER][DYNECT] #delete_zone zone=#{zone.inspect}"
  client.login
  begin
    get_zone(zone)
    client.delete "Zone/#{zone.name}"
  rescue Splicer::Errors::RequestError => error
    Splicer.logger.debug "[SPLICER][DYNECT] response=#{error}"
  end
ensure
  client.logout
end
update_record_in_zone(record, zone) click to toggle source
# File lib/splicer/dynect/provider.rb, line 52
def update_record_in_zone(record, zone)
  Splicer.logger.debug "[SPLICER][DYNECT] #update_record_in_zone record=#{record.inspect} zone=#{zone.inspect}"
  return false unless can_update?(record)
  client.login
  update_record(record, zone)
  publish_zone(zone)
ensure
  client.logout
end

Private Instance Methods

can_delete?(record)
Alias for: can_update?
can_update?(record) click to toggle source

TODO: Currently MX Record deleting/updating is not supported

# File lib/splicer/dynect/provider.rb, line 81
def can_update?(record)
  !record.is_a?(Splicer::Records::TXTRecord) && !record.is_a?(Splicer::Records::MXRecord)
end
Also aliased as: can_delete?
create_record(record, zone) click to toggle source
# File lib/splicer/dynect/provider.rb, line 136
def create_record(record, zone)
  client.post(record_resource_url(record, zone), record_payload(record))
end
find_record_id(record, zone) click to toggle source
# File lib/splicer/dynect/provider.rb, line 95
def find_record_id(record, zone)
  resources = client.get(record_resource_url(record, zone))
  if resources['data'].empty?
    raise Splicer::Errors::RequestError.new('record not found')
  else
    resources['data'].first.split('/').last
  end
end
get_zone(zone) click to toggle source
# File lib/splicer/dynect/provider.rb, line 87
def get_zone(zone)
  client.get "Zone/#{zone.name}"
end
publish_zone(zone) click to toggle source
# File lib/splicer/dynect/provider.rb, line 91
def publish_zone(zone)
  client.put "Zone/#{zone.name}", publish: true
end
record_payload(record) click to toggle source

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

# File lib/splicer/dynect/provider.rb, line 107
def record_payload(record)
  case record
  when Splicer::Records::ARecord
    { rdata: { address: record.ip }, ttl: record.ttl}
  when Splicer::Records::AAAARecord
    { rdata: { address: record.ip }, ttl: record.ttl}
  when Splicer::Records::CNAMERecord
    { rdata: { cname: record.cname }, ttl: record.ttl}
  when Splicer::Records::MXRecord
    { rdata: { exchange: record.exchanger, preference: record.priority }, ttl: record.ttl}
  when Splicer::Records::NSRecord
    { rdata: { nsdname: record.server }, ttl: record.ttl}
  when Splicer::Records::PTRRecord
    { rdata: { ptrdname: record.host }, ttl: record.ttl}
  when Splicer::Records::SPFRecord
    { rdata: { txtdata: record.text }, ttl: record.ttl}
  when Splicer::Records::SRVRecord
    { rdata: { port: record.port, priority: record.priority, target: record.target, weight: record.weight }, ttl: record.ttl}
  when Splicer::Records::TXTRecord
    { rdata: { txtdata: record.text }, ttl: record.ttl}
  else
    { }
  end
end
record_resource_url(record, zone) click to toggle source
# File lib/splicer/dynect/provider.rb, line 140
def record_resource_url(record, zone)
  resource = record.class.name.split('::').last
  if record.name.nil?
    "#{resource}/#{zone.name}/#{zone.name}"
  else
    "#{resource}/#{zone.name}/#{record.name}.#{zone.name}"
  end
end
update_record(record, zone) click to toggle source
# File lib/splicer/dynect/provider.rb, line 132
def update_record(record, zone)
  client.put(record_resource_url(record, zone), record_payload(record))
end