diff --git a/migration.mk b/migration.mk index 9f78a8e..0f6ab4a 100644 --- a/migration.mk +++ b/migration.mk @@ -51,7 +51,12 @@ $(OLDBINDDIR): # A nice rule for the command-line. migration-file: $(MIGRATION_FILE_TARGET) -migration: build-client migration-file run-migration-client run-client-genzones copy-old-zones +fix-old-zones-ns: + @echo "fix old zones NS entries" + sed -i "s/ns0.arn-fai.net/ns0.karchnu.fr/g" $(OLDBINDDIR)/* + sed -i "s/alsace.tetaneutral.net/ns1.karchnu.fr/g" $(OLDBINDDIR)/* + +migration: build-client migration-file fix-old-zones-ns run-migration-client run-client-genzones copy-old-zones @echo "next as root: make powerdns-add-zones" # POWERDNS RULES diff --git a/tools/powerdns-sync.cr b/tools/powerdns-sync.cr index 9671849..0e3e6c5 100644 --- a/tools/powerdns-sync.cr +++ b/tools/powerdns-sync.cr @@ -1,8 +1,40 @@ +# Duration to wait before taken modification into account (in minutes). +duration = 5 + if ARGV.size != 2 puts "usage: #{PROGRAM_NAME} dnsmanagerd-bind9-dir powerdns-bind9-dir" exit 0 end +class BrainlessLog + class_property last_text_size : Int32 = 0 + + # In case the lastly `unimportant` written string is to be kept on-screen. + def self.important(str : String) + unimportant "" # Clear the line and last_text_size = 0 + STDOUT.puts str + end + + # Log something that isn't important, meaning text that will be + # rewritten in-place since we don't really want to read it. + # WARNING: user may want to keep the lastly written string, `keep` it. + def self.unimportant(str : String) + STDOUT.write ("\r" + (" " * self.last_text_size)).to_slice # Clear the line. + self.last_text_size = str.size + STDOUT.write ("\r" + str).to_slice + end + + # In case the last `unimportant` string is to be kept on-screen. + def self.keep + STDOUT.puts "" unless self.last_text_size == 0 + end + + # In case the last `unimportant` string should be removed. + def self.flush + unimportant "" if self.last_text_size > 0 + end +end + class Context class_property dnsmanagerd_dir : String = "" class_property powerdns_dir : String = "" @@ -11,11 +43,13 @@ end def copy_domain_files(domain : String) : Nil src = "#{Context.dnsmanagerd_dir}/#{domain}" dest = "#{Context.powerdns_dir}/#{domain}" - puts "copying #{src} -> #{dest}" + BrainlessLog.important "copying #{src} -> #{dest}" i = File.info src File.copy src, dest rescue e : File::AccessDeniedError - puts "You don't have enough rights: #{e}" + BrainlessLog.important "You don't have enough rights: #{e}" +rescue e : File::Error + BrainlessLog.important "File error: #{e}" end def run_process(cmd : String, params : Array(String), env : Hash(String, String)) : Nil @@ -30,25 +64,25 @@ def run_process(cmd : String, params : Array(String), env : Hash(String, String) end def pdns_reload(domain : String) : Nil - puts "reloading a domain: pdns_control bind-reload-now #{domain}" + BrainlessLog.important "reloading a domain: pdns_control bind-reload-now #{domain}" run_process("pdns_control", [ "bind-reload-now", domain ], { "HOME" => "/" }) end def update_domain(domain : String) : Nil - puts "domain to reload: #{domain}" + BrainlessLog.important "domain to reload: #{domain}" copy_domain_files 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}" + BrainlessLog.important "adding a new domain: pdns_control bind-add-zone #{Context.powerdns_dir}/#{domain}" run_process("pdns_control", [ "bind-add-zone", domain, "#{Context.powerdns_dir}/#{domain}" ], { "HOME" => "/" }) end def add_domain(domain : String) : Nil - puts "domain to add: #{domain}" + BrainlessLog.important "domain to add: #{domain}" copy_domain_files domain pdns_add domain end @@ -56,11 +90,11 @@ end def delete_file(path : String) File.delete path rescue e : File::AccessDeniedError - puts "You don't have enough rights: #{e}" + BrainlessLog.important "You don't have enough rights: #{e}" end def del_domain(domain : String) : Nil - puts "domain to delete: #{domain}" + BrainlessLog.important "domain to delete: #{domain}" delete_file "#{Context.powerdns_dir}/#{domain}" # TODO: pdns_control ??? end @@ -77,18 +111,18 @@ both.each do |d| i2 = File.info "#{Context.powerdns_dir}/#{d}" if i1.modification_time > i2.modification_time - puts "has been modified: #{d}" # Wait for a few minutes before changing anything, to avoid useless reloads. - if Time.local > i1.modification_time.shift minutes: 5 - puts "file was modified more than 5 minutes ago" + if Time.local > i1.modification_time.shift minutes: duration + BrainlessLog.important "#{d}: updating" update_domain d else - puts "file has been modified less than 5 minutes ago: do not update yet" + BrainlessLog.unimportant "#{d}: has been modified less than #{duration} minute ago, do not update yet" end else - puts "hasn't been modified: #{d}" + BrainlessLog.unimportant "#{d}: hasn't been modified" end end +BrainlessLog.flush to_add = dnsmanagerd_dir_content - powerdns_dir_content to_add.each { |d| add_domain d }