Guest User

Untitled

a guest
Feb 22nd, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 1.92 KB | None | 0 0
  1. #!/usr/bin/ruby -w
  2.  
  3. module MyBIND
  4.  
  5. ZONEFMT =<<EOS
  6. zone "%s" {
  7.   type slave;
  8.   masters { %s};
  9.   file "%s";
  10. };
  11. EOS
  12.  
  13. TYPE_RE = /type\s+slave\s*;/
  14. MASTERS_LIST_RE = /masters\s+\{([^}]+)\}\s*;/
  15. FILENAME_RE = /file\s+"([^"]+)"\s*;/
  16. ZONENAME_RE = /^zone\s+"([^"]+)"/
  17. ZONE_RE = /^zone\s+"[^"]+"\s*\{\s*
  18.                    .*?
  19.                 ^\s*\}\s*;\s*$/mx
  20.  
  21. #ZONE_RE = /^zone\s+"([^"]+)"\s*\{\s*
  22. #               (?:(?:#{TYPE_RE}|#{FILENAME_RE}|#{MASTERS_LIST_RE})\s*)+
  23. #            \s*\}\s*;\s*$/mx
  24.  
  25.  
  26. # reads a named.conf.slave file
  27. # and builds an array with information about
  28. # zone name, masters list and filename
  29. def self.readconf(conffilename)
  30.   result = []
  31.   File.read(conffilename).scan(ZONE_RE) do |m|
  32.     if TYPE_RE.match(m)
  33.       zonename = ZONENAME_RE.match(m)[1]
  34.       masters_list = MASTERS_LIST_RE.match(m)[1].split(";").collect{|e| e.strip}
  35.       filename = FILENAME_RE.match(m)[1]
  36.       result << [zonename, masters_list, filename]
  37.     end
  38.   end
  39.   result
  40. end
  41.  
  42. # builds a conf string from a named.conf.slave hash
  43. # with information about zone name, masters list and filename
  44. def self.writeconf(hash)
  45.   hash.keys.sort.inject("") do |conf, zonename|
  46.     conf << ZONEFMT % [ zonename,
  47.                         hash[zonename][:masters].sort.reverse.join("; "),
  48.                         hash[zonename][:file] ]
  49.   end
  50. end
  51.  
  52. # merges two named.conf.slave arrays into a hash.
  53. def self.mergeconf(a, b)
  54.   zones = Hash.new {|h, k| h[k] = {:masters => []} }
  55.  
  56.   (a | b).each do |r|
  57.     zones[r[0]][:masters] |= r[1]
  58.     zones[r[0]][:file] = r[2]
  59.   end
  60.  
  61.   zones
  62. end
  63.  
  64. end # module MyBIND
  65.  
  66. if __FILE__ == $0
  67.  
  68. def usage
  69.   warn "Usage:
  70.  #{File.basename $0} slave_file_1 slave_file_2"
  71.   exit 1
  72. end
  73.  
  74. usage if ARGV.size != 2
  75. filenames = ARGV
  76.  
  77. confs = filenames.inject([]) {|m, filename| m << MyBIND.readconf(filename)}
  78. mergedconf = MyBIND.mergeconf(*confs)
  79. print MyBIND.writeconf(mergedconf)
  80.  
  81. end
Add Comment
Please, Sign In to add comment