Index: /nodes/gformat.py
===================================================================
--- /nodes/gformat.py	(revision 8583)
+++ /nodes/gformat.py	(revision 8584)
@@ -14,4 +14,5 @@
 import sys
 import time
+from pprint import pprint
 try:
   import yaml
@@ -139,4 +140,15 @@
   """ Display IPv4 addr in (dotted) CIDR notation """
   return "%d.%d.%d.%d" % ((a >> 24) & 0xff, (a >> 16) & 0xff, (a >> 8) & 0xff, a & 0xff)
+
+
+def is_member(ip, mask, canidate):
+  """ Return True if canidate is part of ip/mask block"""
+  ip_addr = gformat.parseaddr(ip)
+  ip_canidate = gformat.parseaddr(canidate)
+  mask = int(mask)
+  ip_addr = ip_addr & ~((1 << (32 - mask)) - 1)
+  ip_canidate = ip_canidate & ~((1 << (32 - mask)) - 1)
+  return ip_addr == ip_canidate
+ 
 
 
@@ -524,4 +536,74 @@
           f.write(generate_config(node, config, datadump))
           f.close()
+    elif sys.argv[1] == "dns":
+      items = dict()
+      # hostname is key, IP is value
+      wleiden_zone = dict()
+      wleiden_cname = dict()
+      pool = dict()
+      for node in get_hostlist():
+        datadump = get_yaml(node)
+  
+        # Proxy naming convention is special
+        if datadump['nodetype'] == 'Proxy':
+          fqdn = datadump['nodename']
+        else:
+          # By default the full name is listed and also a shortname CNAME for easy use.
+          fqdn = datadump['nodetype'] + datadump['nodename']
+          wleiden_cname[datadump['nodename']] = fqdn
+        wleiden_zone[fqdn] = datadump['masterip']
+
+        #items['node'] = node
+        #items['wdir'] = "./static/%(node)s" % items
+        #if not os.path.isdir(items['wdir']):
+        #  os.makedirs(items['wdir'])
+        for iface_key in get_interface_keys(datadump):
+          iface_name = datadump[iface_key]['interface'].replace(':',"_alias_")
+          (ip, netmask) = datadump[iface_key]['ip'].split('/')
+          try:
+            (dhcp_start, dhcp_stop) = datadump[iface_key]['dhcp'].split('-')
+            datadump[iface_key]['subnet'] = netmask2subnet(netmask)
+            dhcp_part = ".".join(ip.split('.')[0:3])
+            wleiden_zone["dhcp-gateway-%s.%s" % (iface_name, fqdn)] = 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)
+          except (AttributeError, ValueError):
+            # First push it into a pool, to indentify the counter-part later on
+            addr = parseaddr(ip)
+            netmask = int(netmask)
+            addr = addr & ~((1 << (32 - netmask)) - 1)
+            if pool.has_key(addr): 
+              pool[addr] += [(iface_name, fqdn, ip)]
+            else: 
+              pool[addr] = [(iface_name, fqdn, ip)]
+            continue
+
+      # wleiden_zone["2%s-%s.%s" % ("unused", iface_name, fqdn)] = ip
+      # #XXX: automatic naming convention namely 2 + remote.lower()
+      for (key,value) in pool.iteritems():
+        if len(value) == 1:
+          (iface_name, fqdn, ip) = value[0]
+          wleiden_zone["2unused-%s.%s" % (iface_name, fqdn)] = ip
+        elif len(value) == 2:
+          (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
+        else:
+          pool_members = [k[1] for k in value]
+          for item in value:
+            (iface_name, fqdn, ip) = item 
+            pool_name = "2pool-" + showaddr(key).replace('.','-') + "-" + "_".join(sorted(list(set(pool_members) - set([fqdn]))))
+            wleiden_zone["%s.%s" % (pool_name, fqdn)] = ip
+          
+        
+      #pprint(pool)
+      pprint(wleiden_zone)
+        #for config in files:
+        #  items['config'] = config
+        #  print "## Generating %(node)s %(config)s" % items
+        #  f = open("%(wdir)s/%(config)s" % items, "w")
+        #  f.write(generate_config(node, config, datadump))
+        #  f.close()
     else:
       usage()
