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