dnsmanager/tools/powerdns-sync.cr

124 lines
3.1 KiB
Crystal

if ARGV.size != 2
puts "usage: #{PROGRAM_NAME} dnsmanagerd-bind9-dir powerdns-bind9-dir"
exit 0
end
class Context
class_property dnsmanagerd_dir : String = ""
class_property powerdns_dir : String = ""
end
def copy_file(domain : String) : Nil
src = "#{Context.dnsmanagerd_dir}/#{domain}"
dest = "#{Context.powerdns_dir}/#{domain}"
puts "copying #{src} -> #{dest}"
i = File.info src
File.copy src, dest
rescue e : File::AccessDeniedError
puts "You don't have enough rights: #{e}"
end
def pdns_reload(domain : String) : Nil
puts "reloading a domain: pdns_control bind-reload-now #{domain}"
unless Process.run("pdns_control",
# PARAMETERS
[ "bind-reload-now", domain ],
# ENV
{ "HOME" => "/" },
true # clear environment
# input: Process::Redirect::Inherit,
# output: Process::Redirect::Inherit,
# error: Process::Redirect::Inherit
).success?
puts "cannot run pdns_control bind-reload-now #{domain}"
end
end
def update_domain(domain : String) : Nil
puts "domain to reload: #{domain}"
copy_file domain
pdns_reload domain
end
def pdns_add(domain : String) : Nil
puts "adding a new domain: pdns_control bind-add-zone #{Context.powerdns_dir}/#{domain}"
unless Process.run("pdns_control",
# PARAMETERS
[ "bind-add-zone", domain, "#{Context.powerdns_dir}/#{domain}" ],
# ENV
{ "HOME" => "/" },
true # clear environment
# input: Process::Redirect::Inherit,
# output: Process::Redirect::Inherit,
# error: Process::Redirect::Inherit
).success?
puts "cannot run pdns_control bind-add-zone #{Context.powerdns_dir}/#{domain}"
end
end
def add_domain(domain : String) : Nil
puts "domain to add: #{domain}"
copy_file domain
pdns_add domain
end
def delete_file(path : String)
File.delete path
rescue e : File::AccessDeniedError
puts "You don't have enough rights: #{e}"
end
def del_domain(domain : String) : Nil
puts "domain to delete: #{domain}"
delete_file "#{Context.powerdns_dir}/#{domain}"
# TODO: pdns_control ???
end
Context.dnsmanagerd_dir = ARGV[0]
Context.powerdns_dir = ARGV[1]
dnsmanagerd_dir_content = Dir.children(Context.dnsmanagerd_dir).select { |d| ! d.ends_with? ".wip" }
powerdns_dir_content = Dir.children(Context.powerdns_dir)
if dnsmanagerd_dir_content.size < 1
puts "There is no entries in the dnsmanagerd bind9 directory"
puts "Assuming a configuration error"
exit 1
end
if powerdns_dir_content.size < 1
puts "There is no entries in the powerdns bind9 directory"
puts "Assuming a configuration error"
exit 2
end
#dnsmanagerd_dir_content.each do |d|
# puts "dnsmanagerd_dir_content: #{d}"
#end
#powerdns_dir_content.each do |d|
# puts "powerdns_dir_content: #{d}"
#end
both = dnsmanagerd_dir_content & powerdns_dir_content
both.each do |d|
i1 = File.info "#{Context.dnsmanagerd_dir}/#{d}"
i2 = File.info "#{Context.powerdns_dir}/#{d}"
if i1.modification_time > i2.modification_time
puts "has been modified: #{d}"
update_domain d
else
puts "hasn't been modified: #{d}"
end
end
to_add = dnsmanagerd_dir_content - powerdns_dir_content
to_add.each do |d|
add_domain d
end
to_delete = powerdns_dir_content - dnsmanagerd_dir_content
to_delete.each do |d|
del_domain d
end