Index: tools/gformat.py
===================================================================
--- tools/gformat.py	(revision 10863)
+++ tools/gformat.py	(revision 10872)
@@ -98,48 +98,56 @@
 
 def get_yaml(item):
-  """ Get configuration yaml for 'item'"""
-  if datadump_cache.has_key(item):
-    return datadump_cache[item].copy()
-
-  gfile = os.path.join(NODE_DIR,item,'wleiden.yaml')
-
-  datadump = {}
-  f = open(gfile, 'r')
-  datadump.update(yaml.load(f,Loader=Loader))
-  if datadump['nodetype'] == 'Hybrid':
-    # Some values are defined implicitly
-    if datadump.has_key('rdr_rules') and datadump['rdr_rules'] and not datadump.has_key('service_incoming_rdr'):
-      datadump['service_incoming_rdr'] = True
-    # Use some boring defaults
-    defaults = { 
-      'service_proxy_normal' : False, 
-      'service_proxy_ileiden' : False, 
-      'service_accesspoint' : True, 
-      'service_incoming_rdr' : False 
-    }
-    for (key,value) in defaults.iteritems():
-      if not datadump.has_key(key):
-        datadump[key] = value
-  f.close()
-
-  # Preformat certain needed variables for formatting and push those into special object
-  datadump['autogen_iface_keys'] = get_interface_keys(datadump)
-
-  wlan_count=0
-  for key in datadump['autogen_iface_keys']:
-    if datadump[key]['type'] in ['11a', '11b', '11g', 'wireless']:
-      datadump[key]['autogen_ifname'] = 'wlan%i' % wlan_count
-      wlan_count += 1
-    else:
-      datadump[key]['autogen_ifname'] = datadump[key]['interface'].split(':')[0]
-
-  dhcp_interfaces = [datadump[key]['autogen_ifname'] for key in datadump['autogen_iface_keys'] if (datadump[key].has_key('dhcp') and datadump[key]['dhcp'])]
-  datadump['autogen_dhcp_interfaces'] = dhcp_interfaces
-  datadump['autogen_item'] = item
-
-  datadump['autogen_realname'] = get_realname(datadump)
-  datadump['autogen_domain'] = datadump['domain'] if datadump.has_key('domain') else 'wleiden.net.'
-  datadump['autogen_fqdn'] = datadump['autogen_realname'] + '.' + datadump['autogen_domain']
-  datadump_cache[item] = datadump.copy()
+  try:
+    """ Get configuration yaml for 'item'"""
+    if datadump_cache.has_key(item):
+      return datadump_cache[item].copy()
+
+    gfile = os.path.join(NODE_DIR,item,'wleiden.yaml')
+
+    datadump = {}
+    f = open(gfile, 'r')
+    datadump.update(yaml.load(f,Loader=Loader))
+    if datadump['nodetype'] == 'Hybrid':
+      # Some values are defined implicitly
+      if datadump.has_key('rdr_rules') and datadump['rdr_rules'] and not datadump.has_key('service_incoming_rdr'):
+        datadump['service_incoming_rdr'] = True
+      # Use some boring defaults
+      defaults = { 
+        'service_proxy_normal' : False, 
+        'service_proxy_ileiden' : False, 
+        'service_accesspoint' : True, 
+        'service_incoming_rdr' : False 
+      }
+      for (key,value) in defaults.iteritems():
+        if not datadump.has_key(key):
+          datadump[key] = value
+    f.close()
+
+    # Preformat certain needed variables for formatting and push those into special object
+    datadump['autogen_iface_keys'] = get_interface_keys(datadump)
+
+    wlan_count=0
+    try:
+      for key in datadump['autogen_iface_keys']:
+        if datadump[key]['type'] in ['11a', '11b', '11g', 'wireless']:
+          datadump[key]['autogen_ifname'] = 'wlan%i' % wlan_count
+          wlan_count += 1
+        else:
+          datadump[key]['autogen_ifname'] = datadump[key]['interface'].split(':')[0]
+    except Exception as e:
+      print "# Error while processing interface %s" % key
+      raise
+
+    dhcp_interfaces = [datadump[key]['autogen_ifname'] for key in datadump['autogen_iface_keys'] if (datadump[key].has_key('dhcp') and datadump[key]['dhcp'])]
+    datadump['autogen_dhcp_interfaces'] = dhcp_interfaces
+    datadump['autogen_item'] = item
+
+    datadump['autogen_realname'] = get_realname(datadump)
+    datadump['autogen_domain'] = datadump['domain'] if datadump.has_key('domain') else 'wleiden.net.'
+    datadump['autogen_fqdn'] = datadump['autogen_realname'] + '.' + datadump['autogen_domain']
+    datadump_cache[item] = datadump.copy()
+  except Exception as e:
+    print "# Error while processing %s" % item
+    raise
   return datadump
 
@@ -1263,5 +1271,6 @@
 \tstatic [outputdir]           =  Generate all config files and store on disk
 \t                                with format ./<outputdir>/%%NODE%%/%%FILE%% [./static]
-\ttest <node> <file>           =  Receive output of CGI script.
+\ttest <node> [<file>]         =  Receive output for certain node [all files].
+\ttest-cgi <node> <file>       =  Receive output of CGI script [all files].
 \tlist <status> <items>        =  List systems which have certain status
 
@@ -1335,4 +1344,24 @@
         logger.info("All done goodbye")
     elif sys.argv[1] == "test":
+      # Basic argument validation
+      try:
+        node = sys.argv[2]
+        datadump = get_yaml(node)
+      except IndexError:
+        print "Invalid argument"
+        exit(1)
+      except IOError as e:
+        print e
+        exit(1)
+        
+
+      # Get files to generate
+      gen_files = sys.argv[3:] if len(sys.argv) > 3 else files
+
+      # Actual config generation
+      for config in gen_files:
+         logger.info("## Generating %s %s", node, config)
+         print generate_config(node, config, datadump)
+    elif sys.argv[1] == "test-cgi":
       os.environ['PATH_INFO'] = "/".join(sys.argv[2:])
       os.environ['SCRIPT_NAME'] = __file__
