Project

General

Profile

Download (2.22 KB) Statistics
| Branch: | Tag: | Revision:
module DnsInterface
extend ActiveSupport::Concern

RECORD_TYPES = [:a, :aaaa, :ptr4, :ptr6]

def dns_record(type)
validate_record_type(type)

record = get_dns_record(type)
return record if record.present?

return unless dns_feasible?(type)

handle_validation_errors do
store_dns_record(type,
dns_class(type).new(send(:"dns_#{type}_record_attrs")))
end
end

protected

def dns_feasible?(type)
validate_record_type(type)

case type
when :a
return dns?
when :aaaa
return dns6?
when :ptr6
return reverse_dns6?
when :ptr4
return reverse_dns?
end
end

def recreate_dns_record(type)
set_dns_record(type) unless dns_record(type).nil? || dns_record(type).valid?
end

def set_dns_record(type)
dns_record(type).create
end

def set_conflicting_dns_record(type)
dns_record(type).conflicts.each { |c| c.create }
end

def del_dns_record(type)
dns_record(type).destroy
end

def del_conflicting_dns_record(type)
dns_record(type).conflicts.each { |c| c.destroy }
end

def del_dns_record_safe(type)
return unless dns_record(type).present?
del_dns_record(type)
rescue => e
Foreman::Logging.exception "Proxy failed to delete DNS #{type}_record for #{name} (#{ip}/#{ip6})", e, :level => :error
end

private

def dns_class(type)
validate_record_type(type)
"Net::DNS::#{type.upcase}Record".constantize
end

def get_dns_record(type)
instance_variable_get("@dns_#{type}_record")
end

def store_dns_record(type, value)
instance_variable_set("@dns_#{type}_record", value)
end

def validate_record_type(type)
::Foreman::Exception.new(N_("%s is not a valid DNS record type"), type) unless RECORD_TYPES.include?(type)
end

def dns_a_record_attrs
{ :hostname => hostname, :ip => ip, :resolver => domain.resolver, :proxy => domain.proxy }
end

def dns_aaaa_record_attrs
{ :hostname => hostname, :ip => ip6, :resolver => domain.resolver, :proxy => domain.proxy }
end

def dns_ptr4_record_attrs
{ :hostname => hostname, :ip => ip, :proxy => subnet.dns_proxy }
end

def dns_ptr6_record_attrs
{ :hostname => hostname, :ip => ip6, :proxy => subnet6.dns_proxy }
end
end
(8-8/28)