Revision 8fcaacd6
Added by Marc Dequènes about 14 years ago
- ID 8fcaacd6b9f666dcfb94138e296b2c320fe9799f
lib/cyborghood/services/dns.rb | ||
---|---|---|
|
||
require 'fileutils'
|
||
|
||
# ensure we can find the needed programs (should be handled somewhere else)
|
||
ENV['PATH'] = (ENV['PATH'].split(":") + ["/sbin", "/usr/sbin", "/usr/local/sbin"]).uniq.join(":")
|
||
|
||
module CyborgHood
|
||
module Services
|
||
class DNS
|
||
def initialize
|
||
@config = Config.instance
|
||
|
||
@zone_files_pattern = @config.dns.master_zone_pattern.gsub("#ZONE#", "*")
|
||
@zone_files_regex = Regexp.new("^" + @config.dns.master_zone_pattern.gsub("#ZONE#", "(.*)") + "$")
|
||
end
|
||
|
||
def zones(zone = nil)
|
||
if zone.nil?
|
||
Dir.glob(@zone_files_pattern).collect do |file|
|
||
$1 if file =~ @zone_files_regex
|
||
end
|
||
else
|
||
Zone.new(zone)
|
||
end
|
||
end
|
||
end
|
||
|
||
class Zone
|
||
attr_reader :zone
|
||
attr_accessor :content
|
||
|
||
... | ... | |
@content = nil
|
||
|
||
@filename = @config.dns.master_zone_pattern.gsub("#ZONE#", @zone)
|
||
|
||
# ensure we can find the needed programs (should be handled somewhere else)
|
||
ENV['PATH'] = (ENV['PATH'].split(":") + ["/sbin", "/usr/sbin", "/usr/local/sbin"]).uniq.join(":")
|
||
end
|
||
|
||
def read_zone
|
||
... | ... | |
end
|
||
|
||
def serial
|
||
case @config.dns.nameserver || :bind
|
||
when :bind
|
||
case @config.dns.software
|
||
when 'bind'
|
||
output = []
|
||
begin
|
||
IO.popen("named-checkzone -i none '#{@zone}' #{@filename}") do |fp|
|
||
output << fp.gets.chomp! until fp.eof?
|
||
end
|
||
rescue
|
||
raise CyberError.new(:unrecoverable, "services/dns", "zone serial for '#{@zone}' could not be found")
|
||
raise CyberError.new(:unrecoverable, "services/dns", "zone serial for '#{@zone}' could not be found (I/O error)")
|
||
end
|
||
raise CyberError.new(:unrecoverable, "services/dns", "zone serial for '#{@zone}' could not be found (#{output.first})") unless $?.success?
|
||
|
||
if $? == 0
|
||
serial = nil
|
||
... | ... | |
else
|
||
nil
|
||
end
|
||
else
|
||
# TODO: should be checked at startup time
|
||
raise CyberError.new(:unrecoverable, "services/dns", "erroneous configuration: unknown nameserver")
|
||
end
|
||
end
|
||
|
||
def check_zone_file(filename)
|
||
case @config.dns.nameserver || :bind
|
||
when :bind
|
||
case @config.dns.software
|
||
when 'bind'
|
||
output = []
|
||
begin
|
||
IO.popen("named-checkzone '#{@zone}' #{filename}") do |fp|
|
||
... | ... | |
else
|
||
return {:ok => false, :errors => messages}.to_ostruct
|
||
end
|
||
else
|
||
# TODO: should be checked at startup time
|
||
raise CyberError.new(:unrecoverable, "services/dns", "erroneous configuration: unknown nameserver")
|
||
end
|
||
end
|
||
|
Also available in: Unified diff
[evol] work on cyborg server protocol and API #7 (refs #31)