Index: tools/gformat.py
===================================================================
--- tools/gformat.py	(revision 10638)
+++ tools/gformat.py	(revision 10642)
@@ -929,5 +929,5 @@
 
   # hostname is key, IP is value
-  wleiden_zone = dict()
+  wleiden_zone = defaultdict(list)
   wleiden_cname = dict()
 
@@ -941,5 +941,5 @@
       wleiden_cname[datadump['nodename']] = fqdn
 
-    wleiden_zone[fqdn] = datadump['masterip']
+    wleiden_zone[fqdn].append(datadump['masterip'])
 
     # Hacking to get proper DHCP IPs and hostnames
@@ -952,7 +952,7 @@
         dhcp_part = ".".join(ip.split('.')[0:3])
         if ip != datadump['masterip']:
-          wleiden_zone["dhcp-gateway-%s.%s" % (iface_name, fqdn)] = ip
+          wleiden_zone["dhcp-gateway-%s.%s" % (iface_name, fqdn)].append(ip)
         for i in range(int(dhcp_start), int(dhcp_stop) + 1):
-          wleiden_zone["dhcp-%s-%s.%s" % (i, iface_name, fqdn)] = "%s.%s" % (dhcp_part, i)
+          wleiden_zone["dhcp-%s-%s.%s" % (i, iface_name, fqdn)].append("%s.%s" % (dhcp_part, i))
       except (AttributeError, ValueError):
         # First push it into a pool, to indentify the counter-part later on
@@ -994,9 +994,9 @@
     if len(value) == 1:
       (iface_name, fqdn, ip) = value[0]
-      wleiden_zone["2unused-%s.%s" % (iface_name, fqdn)] = ip
+      wleiden_zone["2unused-%s.%s" % (iface_name, fqdn)].append(ip)
 
       # Device DNS names
       if 'cnode' in fqdn.lower():
-        wleiden_zone["d-at-%s.%s" % (iface_name, fqdn)] = showaddr(parseaddr(ip) + 1)
+        wleiden_zone["d-at-%s.%s" % (iface_name, fqdn)].append(showaddr(parseaddr(ip) + 1))
         wleiden_cname["d-at-%s.%s" % (iface_name,sn(fqdn))] = "d-at-%s.%s" % (iface_name, fqdn)
 
@@ -1004,11 +1004,11 @@
       (a_iface_name, a_fqdn, a_ip) = value[0]
       (b_iface_name, b_fqdn, b_ip) = value[1]
-      wleiden_zone["2%s.%s" % (b_fqdn,a_fqdn)] = a_ip
-      wleiden_zone["2%s.%s" % (a_fqdn,b_fqdn)] = b_ip
+      wleiden_zone["2%s.%s" % (b_fqdn,a_fqdn)].append(a_ip)
+      wleiden_zone["2%s.%s" % (a_fqdn,b_fqdn)].append(b_ip)
 
       # Device DNS names
       if 'cnode' in a_fqdn.lower() and 'cnode' in b_fqdn.lower():
-        wleiden_zone["d-at-%s.%s" % (a_iface_name, a_fqdn)] = showaddr(parseaddr(a_ip) + 1)
-        wleiden_zone["d-at-%s.%s" % (b_iface_name, b_fqdn)] = showaddr(parseaddr(b_ip) - 1)
+        wleiden_zone["d-at-%s.%s" % (a_iface_name, a_fqdn)].append(showaddr(parseaddr(a_ip) + 1))
+        wleiden_zone["d-at-%s.%s" % (b_iface_name, b_fqdn)].append(showaddr(parseaddr(b_ip) - 1))
         wleiden_cname["d-at-%s.%s" % (a_iface_name,sn(a_fqdn))] = "d-at-%s.%s" % (a_iface_name, a_fqdn)
         wleiden_cname["d-at-%s.%s" % (b_iface_name,sn(b_fqdn))] = "d-at-%s.%s" % (b_iface_name, b_fqdn)
@@ -1021,5 +1021,5 @@
         (iface_name, fqdn, ip) = item
         pool_name = "2pool-" + showaddr(key).replace('.','-') + "-" + pool_to_name(fqdn,pool_members)
-        wleiden_zone["%s.%s" % (pool_name, fqdn)] = ip
+        wleiden_zone["%s.%s" % (pool_name, fqdn)].append(ip)
 
   # Include static DNS entries
@@ -1030,16 +1030,19 @@
   ## roomburgh=CNodeRoomburgh1
   ## apkerk1.CNodeVosko=172.17.176.8 ;this as well
-  dns = yaml.load(open(os.path.join(NODE_DIR,'../dns/staticDNS.yaml'),'r'))
+  dns_list = yaml.load(open(os.path.join(NODE_DIR,'../dns/staticDNS.yaml'),'r'))
 
   # Hack to allow special entries, for development
-  wleiden_raw = dns['raw']
-  del dns['raw']
-
-  for comment, block in dns.iteritems():
-    for k,v in block.iteritems():
-      if valid_addr(v):
-        wleiden_zone[k] = v
+  wleiden_raw = {}
+
+  for line in dns_list:
+    k, items = line.items()[0]
+    items = [items] if type(items) == str else items
+    for item in items:
+      if item.startswith('IN '):
+        wleiden_raw[k] = item
+      elif valid_addr(item):
+        wleiden_zone[k].append(item)
       else:
-        wleiden_cname[k] = v
+        wleiden_cname[k] = item
 
   details = dict()
@@ -1070,7 +1073,8 @@
   f.write(dns_header % details)
 
-  for host,ip in wleiden_zone.iteritems():
-    if valid_addr(ip):
-      f.write("%s.wleiden.net. IN A %s \n" % (host.lower(), ip))
+  for host,ips in wleiden_zone.iteritems():
+    for ip in ips:
+      if valid_addr(ip):
+        f.write("%s.wleiden.net. IN A %s \n" % (host.lower(), ip))
   for source,dest in wleiden_cname.iteritems():
     f.write("%s.wleiden.net. IN CNAME %s.wleiden.net.\n" % (source.lower(), dest.lower()))
@@ -1087,9 +1091,10 @@
     #XXX: Not effient, fix to proper data structure and do checks at other
     # stages
-    for host,ip in wleiden_zone.iteritems():
-      if valid_addr(ip):
-        if int(ip.split('.')[1]) == s:
-          rev_ip = '.'.join(reversed(ip.split('.')))
-          f.write("%s.in-addr.arpa. IN PTR %s.wleiden.net.\n" % (rev_ip.lower(), host.lower()))
+    for host,ips in wleiden_zone.iteritems():
+      for ip in ips:
+        if valid_addr(ip):
+          if int(ip.split('.')[1]) == s:
+            rev_ip = '.'.join(reversed(ip.split('.')))
+            f.write("%s.in-addr.arpa. IN PTR %s.wleiden.net.\n" % (rev_ip.lower(), host.lower()))
     f.close()
 
