class Acmesmith::ChallengeResponders::Designate

Public Class Methods

new(config) click to toggle source
# File lib/acmesmith/challenge_responders/designate.rb, line 12
def initialize(config)
  @config = config
  config_yao(@config[:identity])
end

Public Instance Methods

cleanup(domain, challenge) click to toggle source
# File lib/acmesmith/challenge_responders/designate.rb, line 27
def cleanup(domain, challenge)
  domain = canonicalize(domain)
  zone = find_zone(domain)
  name = [challenge.record_name, domain].join(?.)
  if record = zone.records.list.find {|r| r.name == name }
    zone.records.destroy(record.id)
  end
end
respond(domain, challenge) click to toggle source
# File lib/acmesmith/challenge_responders/designate.rb, line 17
def respond(domain, challenge)
  domain = canonicalize(domain)
  find_zone(domain).records.create(
    name: [challenge.record_name, domain].join(?.),
    type: challenge.record_type,
    data: challenge.record_content,
    ttl: @config[:ttl],
  )
end
support?(type) click to toggle source
# File lib/acmesmith/challenge_responders/designate.rb, line 8
def support?(type)
  type == 'dns-01'
end

Private Instance Methods

canonicalize(domain) click to toggle source
# File lib/acmesmith/challenge_responders/designate.rb, line 38
def canonicalize(domain)
  "#{domain}.".gsub(/\.{2,}/, '.')
end
config_yao(identity) click to toggle source
# File lib/acmesmith/challenge_responders/designate.rb, line 51
def config_yao(identity)
  Yao.config do
    auth_url(identity&.dig('auth_url') || ENV['OS_AUTH_URL'])
    tenant_name(identity&.dig('tenant_name') || ENV['OS_TENANT_NAME'])
    username(identity&.dig('username') || ENV['OS_USERNAME'])
    password(identity&.dig('password') || ENV['OS_PASSWORD'])
  end
end
find_zone(domain) click to toggle source
# File lib/acmesmith/challenge_responders/designate.rb, line 46
def find_zone(domain)
  zones.select {|z| domain =~ /(?:\A|\.)#{Regexp.escape(z.name)}\z/ }.max_by {|z| z.name.length } or
    fail "Domain #{domain} is not configured in Designate"
end
zones() click to toggle source
# File lib/acmesmith/challenge_responders/designate.rb, line 42
def zones
  @zones ||= Yao::Domain.list
end