foreman/app/models/orchestration/dns.rb @ 017a7d84
90b83222 | Ohad Levy | module Orchestration::DNS
|
|
def self.included(base)
|
|||
base.send :include, InstanceMethods
|
|||
base.class_eval do
|
|||
ffb24832 | Ohad Levy | after_validation :dns_conflict_detected?, :queue_dns
|
|
acb50a39 | Ohad Levy | before_destroy :queue_dns_destroy
|
|
90b83222 | Ohad Levy | end
|
|
end
|
|||
module InstanceMethods
|
|||
def dns?
|
|||
9bb4e25f | Ohad Levy | !domain.nil? and !domain.proxy.nil? and managed?
|
|
90b83222 | Ohad Levy | end
|
|
dd42df0a | Ohad Levy | def reverse_dns?
|
|
!subnet.nil? and !subnet.dns_proxy.nil? and managed? and capabilities.include?(:build)
|
|||
end
|
|||
acb50a39 | Ohad Levy | def dns_a_record
|
|
5265048e | Paul Kelly | return unless dns? or @dns_a_record
|
|
acb50a39 | Ohad Levy | @dns_a_record ||= Net::DNS::ARecord.new dns_record_attrs
|
|
90b83222 | Ohad Levy | end
|
|
acb50a39 | Ohad Levy | def dns_ptr_record
|
|
dd42df0a | Ohad Levy | return unless reverse_dns? or @dns_ptr_record
|
|
@dns_ptr_record ||= Net::DNS::PTRRecord.new reverse_dns_record_attrs
|
|||
90b83222 | Ohad Levy | end
|
|
acb50a39 | Ohad Levy | protected
|
|
90b83222 | Ohad Levy | ||
acb50a39 | Ohad Levy | def set_dns_a_record
|
|
dns_a_record.create
|
|||
90b83222 | Ohad Levy | end
|
|
30ae12bf | Ohad Levy | def set_conflicting_dns_a_record
|
|
dns_a_record.conflicts.each { |c| c.create }
|
|||
end
|
|||
acb50a39 | Ohad Levy | def set_dns_ptr_record
|
|
dns_ptr_record.create
|
|||
90b83222 | Ohad Levy | end
|
|
30ae12bf | Ohad Levy | def set_conflicting_dns_ptr_record
|
|
dns_ptr_record.conflicts.each { |c| c.create }
|
|||
end
|
|||
acb50a39 | Ohad Levy | def del_dns_a_record
|
|
dns_a_record.destroy
|
|||
end
|
|||
90b83222 | Ohad Levy | ||
30ae12bf | Ohad Levy | def del_conflicting_dns_a_record
|
|
dns_a_record.conflicts.each { |c| c.destroy }
|
|||
end
|
|||
acb50a39 | Ohad Levy | def del_dns_ptr_record
|
|
dns_ptr_record.destroy
|
|||
90b83222 | Ohad Levy | end
|
|
30ae12bf | Ohad Levy | def del_conflicting_dns_ptr_record
|
|
dns_ptr_record.conflicts.each { |c| c.destroy }
|
|||
90b83222 | Ohad Levy | end
|
|
30ae12bf | Ohad Levy | private
|
|
acb50a39 | Ohad Levy | def dns_record_attrs
|
|
{ :hostname => name, :ip => ip, :resolver => domain.resolver, :proxy => domain.proxy }
|
|||
90b83222 | Ohad Levy | end
|
|
dd42df0a | Ohad Levy | def reverse_dns_record_attrs
|
|
{ :hostname => name, :ip => ip, :proxy => subnet.dns_proxy }
|
|||
end
|
|||
90b83222 | Ohad Levy | def queue_dns
|
|
dd42df0a | Ohad Levy | return unless (dns? or reverse_dns?) and errors.empty?
|
|
ffb24832 | Ohad Levy | queue_remove_dns_conflicts if overwrite?
|
|
90b83222 | Ohad Levy | new_record? ? queue_dns_create : queue_dns_update
|
|
end
|
|||
def queue_dns_create
|
|||
30ae12bf | Ohad Levy | logger.debug "Scheduling new DNS entries"
|
|
dd42df0a | Ohad Levy | queue.create(:name => "Create DNS record for #{self}", :priority => 10,
|
|
acb50a39 | Ohad Levy | :action => [self, :set_dns_a_record])
|
|
dd42df0a | Ohad Levy | queue.create(:name => "Create Reverse DNS record for #{self}", :priority => 10,
|
|
:action => [self, :set_dns_ptr_record]) if reverse_dns?
|
|||
90b83222 | Ohad Levy | end
|
|
def queue_dns_update
|
|||
if old.ip != ip or old.name != name
|
|||
017a7d84 | Ohad Levy | queue.create(:name => "Remove DNS record for #{old}", :priority => 9,
|
|
dd42df0a | Ohad Levy | :action => [old, :del_dns_a_record]) if old.dns?
|
|
017a7d84 | Ohad Levy | queue.create(:name => "Remove Reverse DNS record for #{old}", :priority => 9,
|
|
dd42df0a | Ohad Levy | :action => [old, :del_dns_ptr_record]) if old.reverse_dns?
|
|
90b83222 | Ohad Levy | queue_dns_create
|
|
end
|
|||
end
|
|||
def queue_dns_destroy
|
|||
dd42df0a | Ohad Levy | return unless errors.empty?
|
|
acb50a39 | Ohad Levy | queue.create(:name => "Remove DNS record for #{self}", :priority => 1,
|
|
dd42df0a | Ohad Levy | :action => [self, :del_dns_a_record]) if dns?
|
|
acb50a39 | Ohad Levy | queue.create(:name => "Remove Reverse DNS record for #{self}", :priority => 1,
|
|
dd42df0a | Ohad Levy | :action => [self, :del_dns_ptr_record]) if reverse_dns?
|
|
90b83222 | Ohad Levy | end
|
|
30ae12bf | Ohad Levy | def queue_remove_dns_conflicts
|
|
dd42df0a | Ohad Levy | return unless errors.empty?
|
|
30ae12bf | Ohad Levy | return unless overwrite?
|
|
logger.debug "Scheduling DNS conflict removal"
|
|||
ffb24832 | Ohad Levy | queue.create(:name => "Remove conflicting DNS record for #{self}", :priority => 0,
|
|
dd42df0a | Ohad Levy | :action => [self, :del_conflicting_dns_a_record]) if dns? and dns_a_record and dns_a_record.conflicting?
|
|
ffb24832 | Ohad Levy | queue.create(:name => "Remove conflicting Reverse DNS record for #{self}", :priority => 0,
|
|
dd42df0a | Ohad Levy | :action => [self, :del_conflicting_dns_ptr_record]) if reverse_dns? and dns_ptr_record and dns_ptr_record.conflicting?
|
|
30ae12bf | Ohad Levy | ||
end
|
|||
def dns_conflict_detected?
|
|||
ffb24832 | Ohad Levy | return false if ip.blank? or name.blank?
|
|
# can't validate anything if dont have an ip-address yet
|
|||
dd42df0a | Ohad Levy | return false unless require_ip_validation?
|
|
ffb24832 | Ohad Levy | # we should only alert on conflicts if overwrite mode is off
|
|
30ae12bf | Ohad Levy | return false if overwrite?
|
|
ffb24832 | Ohad Levy | ||
30ae12bf | Ohad Levy | status = true
|
|
ffb24832 | Ohad Levy | status = failure("DNS A Record #{dns_a_record.conflicts[0]} already exists", nil, :conflict) if dns? and dns_a_record and dns_a_record.conflicting?
|
|
status &= failure("DNS PTR Record #{dns_ptr_record.conflicts[0]} already exists", nil, :conflict) if reverse_dns? and dns_ptr_record and dns_ptr_record.conflicting?
|
|||
30ae12bf | Ohad Levy | status
|
|
end
|
|||
90b83222 | Ohad Levy | end
|
|
end
|