#!/usr/bin/env ruby # vim:expandtab shiftwidth=2 softtabstop=2 require 'rubygems' require 'getoptions' require 'net/dns/resolver' PROGNAME = File.basename($0) def usage warn "#{PROGNAME} zone slave [...]" exit 64 end options = GetOptions.new(%w(srcaddr=s timeout=i verbose+)) verbosity = options[:verbose] || 0 zone, *slaves = ARGV usage if slaves.empty? packet = Net::DNS::Packet.new(zone, 'SOA') packet.header = Net::DNS::Header.new(:opCode => Net::DNS::Header::NOTIFY, :aa => 1, :rd => 0) p packet if verbosity > 1 res = Net::DNS::Resolver.new res.udp_timeout = options[:timeout] if options[:timeout] res.source_address = options[:srcaddr] if options[:srcaddr] res.log_level = Net::DNS::WARN slaves.each do |slave| res.nameservers = slave print "#{zone}: notify #{slave}: " if verbosity > 0 begin reply = res.send(packet) rescue NoResponseError => exc print "#{zone}: notify #{slave}: " if verbosity < 1 puts "error: #{exc.message}" end if reply error, cause = reply.header.rCode_str case error when 'NoError' puts "#{error} (#{cause})" if verbosity > 0 else print "#{zone}: notify #{slave}: " if verbosity < 1 puts "#{error} (#{cause})" end p reply if verbosity > 1 end end exit 0