Index: /tools/gformat.py
===================================================================
--- /tools/gformat.py	(revision 10403)
+++ /tools/gformat.py	(revision 10410)
@@ -65,4 +65,5 @@
     'authorized_keys',
     'dnsmasq.conf',
+    'dhcpd.conf',
     'rc.conf.local',
     'resolv.conf',
@@ -327,8 +328,67 @@
 
 
-
-def netmask2subnet(netmask):
+def cidr2netmask(netmask):
   """ Given a 'netmask' return corresponding CIDR """
   return showaddr(0xffffffff & (0xffffffff << (32 - int(netmask))))
+
+def get_network(addr, mask):
+  return showaddr(parseaddr(addr) & ~((1 << (32 - int(mask))) - 1))
+
+
+def generate_dhcpd_conf(datadump):
+  """ Generate config file '/usr/local/etc/dhcpd.conf """
+  output = generate_header()
+  output += Template("""\
+# option definitions common to all supported networks...
+option domain-name "dhcp.{{ autogen_fqdn }}";
+
+default-lease-time 600;
+max-lease-time 7200;
+
+# Use this to enble / disable dynamic dns updates globally.
+#ddns-update-style none;
+
+# If this DHCP server is the official DHCP server for the local
+# network, the authoritative directive should be uncommented.
+authoritative;
+
+# Use this to send dhcp log messages to a different log file (you also
+# have to hack syslog.conf to complete the redirection).
+log-facility local7;
+
+#
+# Interface definitions
+#
+
+}
+\n""").render(datadump)
+
+  for iface_key in datadump['autogen_iface_keys']:
+    if not datadump[iface_key].has_key('comment'):
+      datadump[iface_key]['comment'] = none
+    output += "## %(interface)s - %(desc)s - %(comment)s\n" % datadump[iface_key]
+
+    (addr, mask) = datadump[iface_key]['ip'].split('/')
+    datadump[iface_key]['addr'] = addr
+    datadump[iface_key]['netmask'] = cidr2netmask(mask)
+    datadump[iface_key]['subnet'] = get_network(addr, mask)
+    try:
+      (dhcp_start, dhcp_stop) = datadump[iface_key]['dhcp'].split('-')
+    except (AttributeError, ValueError):
+      output += "subnet %(subnet)s netmask %(netmask)s {\n  ### not autoritive\n}\n\n" % datadump[iface_key]
+      continue
+
+    dhcp_part = ".".join(addr.split('.')[0:3])
+    datadump[iface_key]['dhcp_start'] = dhcp_part + "." + dhcp_start
+    datadump[iface_key]['dhcp_stop'] =  dhcp_part + "." + dhcp_stop
+    output += """\
+subnet %(subnet)s netmask %(netmask)s {
+  range %(dhcp_start)s %(dhcp_stop)s;
+  option routers %(addr)s;
+  option domain-name-servers %(addr)s;
+}
+\n""" % datadump[iface_key]
+
+  return output
 
 
@@ -353,11 +413,11 @@
   for iface_key in datadump['autogen_iface_keys']:
     if not datadump[iface_key].has_key('comment'):
-      datadump[iface_key]['comment'] = None
+      datadump[iface_key]['comment'] = none
     output += "## %(interface)s - %(desc)s - %(comment)s\n" % datadump[iface_key]
 
     try:
       (dhcp_start, dhcp_stop) = datadump[iface_key]['dhcp'].split('-')
-      (ip, netmask) = datadump[iface_key]['ip'].split('/')
-      datadump[iface_key]['subnet'] = netmask2subnet(netmask)
+      (ip, cidr) = datadump[iface_key]['ip'].split('/')
+      datadump[iface_key]['netmask'] = cidr2netmask(cidr)
     except (AttributeError, ValueError):
       output += "# not autoritive\n\n"
@@ -367,5 +427,5 @@
     datadump[iface_key]['dhcp_start'] = dhcp_part + "." + dhcp_start
     datadump[iface_key]['dhcp_stop'] =  dhcp_part + "." + dhcp_stop
-    output += "dhcp-range=%(interface)s,%(dhcp_start)s,%(dhcp_stop)s,%(subnet)s,24h\n\n" % datadump[iface_key]
+    output += "dhcp-range=%(interface)s,%(dhcp_start)s,%(dhcp_stop)s,%(netmask)s,24h\n\n" % datadump[iface_key]
 
   return output
@@ -701,4 +761,6 @@
     elif config == 'dnsmasq.conf':
       output += generate_dnsmasq_conf(datadump)
+    elif config == 'dhcpd.conf':
+      output += generate_dhcpd_conf(datadump)
     elif config == 'rc.conf.local':
       output += generate_rc_conf_local(datadump)
@@ -791,8 +853,8 @@
     for iface_key in get_interface_keys(datadump):
       iface_name = datadump[iface_key]['interface'].replace(':',"-alias-")
-      (ip, netmask) = datadump[iface_key]['ip'].split('/')
+      (ip, cidr) = datadump[iface_key]['ip'].split('/')
       try:
         (dhcp_start, dhcp_stop) = datadump[iface_key]['dhcp'].split('-')
-        datadump[iface_key]['subnet'] = netmask2subnet(netmask)
+        datadump[iface_key]['netmask'] = cidr2netmask(cidr)
         dhcp_part = ".".join(ip.split('.')[0:3])
         if ip != datadump['masterip']:
