Index: /nodes/generate-config.py
===================================================================
--- /nodes/generate-config.py	(revision 8267)
+++ /nodes/generate-config.py	(revision 8268)
@@ -34,28 +34,27 @@
 # Configuratie gegenereerd met configurator versie %(version)s
 #
-$location="Locatie XXX, Straat XXX, XXXX XX, Leiden";
-$master_ip='%(master_ip)s';  
-$nodetype='CNode';
-$nodename='%(nodename)s';
-$status='up';
-$release="8.0-RELEASE";
-$X='XXXXX';
-$Y='XXXXXX';
-$LON='4.XXX';
-$LAT='52.XXX';
+location : "Locatie XXX, Straat XXX, XXXX XX, Leiden"
+master_ip: '%(master_ip)s'  
+nodetype: 'CNode'
+nodename: '%(nodename)s'
+status: 'up'
+release: "8.0-RELEASE"
+rndap_x: 'XXXXX'
+rNdap_y: 'XXXXXX'
+lon: '4.XXX'
+lat: '52.XXX'
 """ % variables
 
 # Accesspoint
 print """
-$config{'ath0'}=sprintf <<ATH0;  # Access point Buurt
-TYPE=wireless
-IP=%(master_ip)s/26
-DESC=AP
-SDESC=ap
-DHCP=10-60
-MODE=master
-ESSID=ap-WirelessLeiden-%(nodename)s
-CHANNEL=8
-ATH0
+iface_ath0:
+  type: wireless
+  ip: %(master_ip)s/26
+  desc: ap
+  sdesc: ap
+  dhcp: 10-60
+  mode: master
+  essid: ap-WirelessLeiden-%(nodename)s
+  channel: 8
 """ % variables
 
@@ -63,17 +62,17 @@
 for index, ifname in enumerate(interfaces):
     print """
-$config{'%(ifname)s'}=sprintf <<%(ifname_caps)s;  # Link naar XXX
-TYPE=ethernet
-EXTRA_TYPE=eth2wifibridge
-IP=%(ip)s/29
-DESC=Link naar XXX
-SDESC=2xxx-%(ifname)s
-#MODE=XXX
-#ESSID=XX-XX.%(nodename_lower)s.wleiden.net
-#CHANNEL=XX
-#NSMAC=
-#NS_IP=%(ns_ip)s/29
-DHCP=no
-%(ifname_caps)s
+iface_%(ifname)s:
+  comment: Link naar XXX
+  type: ethernet
+  extra_type: eth2wifibridge
+  ip: %(ip)s/29
+  desc: Link naar XXX
+  sdesc: 2xxx-%(ifname)s
+  mode: XXX
+  essid: XX-XX.%(nodename_lower)s.wleiden.net
+  channel: XX
+  nsmac: 
+  ns_ip: %(ns_ip)s/29
+  dhcp: no
 """ % { 'nodename_lower' : nodename.lower(),
         'ifname' : ifname,
Index: /nodes/gindent.py
===================================================================
--- /nodes/gindent.py	(revision 8268)
+++ /nodes/gindent.py	(revision 8268)
@@ -0,0 +1,33 @@
+#!/usr/bin/env python
+# vim:ts=2:et:sw=2:ai
+#
+# Build topological network graph
+# Rick van der Zwet <info@rickvanderzwet.nl>
+import gformat
+import sys
+
+__version__ = '$Id$'
+
+def gindent(hosts):
+  """ Pretty indent all files automatically """
+  try:
+    for host in hosts:
+      print "## Processing host %-20s: " % host,
+      datadump = gformat.get_yaml(host)
+      gformat.write_yaml(host, datadump)
+      print "OK"
+  except (KeyError, ValueError), e:
+    print "[ERROR] in '%s' interface '%s'" % (host,iface_key) 
+    print e
+    sys.exit(1)
+
+
+if __name__ == "__main__":
+  if len(sys.argv) == 1:
+    print "Usage: %s <all|host [host2 host3 ...]>" % sys.argv[0]
+    sys.exit(1)
+  elif sys.argv[1] == "all":
+    gindent(gformat.get_proxylist() + gformat.get_nodelist())
+  else:
+    gindent(sys.argv[1:])
+
Index: /nodes/make-network-graph.py
===================================================================
--- /nodes/make-network-graph.py	(revision 8267)
+++ /nodes/make-network-graph.py	(revision 8268)
@@ -1,56 +1,50 @@
 #!/usr/bin/env python
-# zoek de eerste vrije (== niet in een wleiden.conf gedefinieerde) interlink
-# range
-# lodewijk@wirelessleiden.nl
+# vim:ts=2:et:sw=2:ai
+#
+# Build topological network graph
+# Rick van der Zwet <info@rickvanderzwet.nl>
 import re
 import sys
 import glob
-import getrange
 import tempfile
 import subprocess
+import gformat
 
 OUTFILE = 'network.png'
 
 def make_graph():
-	substre = re.compile("^(\$[a-zA-Z][^ =]*) ?= ?'([^']*)';")
-	
-	
-	poel = {}
-	
-	#XXX: Make parsing global, merge with getrange.get_ranges if possible
-	for fname in glob.glob("*/wleiden.conf"):
-		substs = {}
-		lineNr = 0
-		for l in open(fname):
-			lineNr += 1
-			l = l[:-1]
-			match = substre.match(l)
-			if match != None:
-				substs[match.group(1)] = match.group(2)
-			if l.startswith("IP="):
-				right = l[3:]
-				if '/' not in right:
-					addr = right
-					mask = 32
-				else:
-					addr, mask = right.split('/')
-					if addr in substs:
-						addr = substs[addr]
-				try:
-					addr = getrange.parseaddr(addr)
-					mask = int(mask)
-					addr = addr & ~((1 << (32 - mask)) - 1)
-					cname = fname.split('/')[0]
-					if poel.has_key(addr): 
-						poel[addr] += [cname]
-					else: 
-						poel[addr] = [cname]
-				except ValueError, e:
-					print "[FOUT] in bestand '%s' regel '%i': %s" % (fname, lineNr, l)
+  poel = {}
+  link_type = {}
+  try:
+    for host in gformat.get_proxylist() + gformat.get_nodelist():
+      print "## Processing host", host
+      datadump = gformat.get_yaml(host)
+      iface_keys = [elem for elem in datadump.keys() if (elem.startswith('iface_') and not "lo0" in elem)]
+      for iface_key in iface_keys:
+        l = datadump[iface_key]['ip']
+        addr, mask = l.split('/')
 
-	f = tempfile.NamedTemporaryFile(bufsize=0)
-	sys.stderr.write("# Building temponary graph file\n")
-	print >> f, "Graph WirelessLeidenNetwork {"
-	print >> f ,"""
+        addr = gformat.parseaddr(addr)
+        mask = int(mask)
+        addr = addr & ~((1 << (32 - mask)) - 1)
+        if poel.has_key(addr): 
+          poel[addr] += [host]
+        else: 
+          poel[addr] = [host]
+          # Assume all eth2wifibridge to be 11a for a moment
+          if datadump[iface_key].has_key('eth2wifibridge'):
+            link_type[addr] = '11a'
+          else:
+            link_type[addr] = datadump[iface_key]['type']
+          print "### %s [%s] is of type %s" % (gformat.showaddr(addr), iface_key, link_type[addr])
+  except (KeyError, ValueError), e:
+    print "[FOUT] in '%s' interface '%s'" % (host,iface_key) 
+    print e
+    sys.exit(1)
+
+  f = tempfile.NamedTemporaryFile(bufsize=0)
+  sys.stderr.write("# Building temponary graph file\n")
+  print >> f, "Graph WirelessLeidenNetwork {"
+  print >> f ,"""
 graph [ fontsize = 36,
         overlap = scalexy,
@@ -58,20 +52,29 @@
       ]
 """
-	for addr,leden in poel.iteritems():
-		leden = sorted(set(leden))
-		for index,lid in enumerate(leden[:-1]):
-			for buur in leden[index + 1:]:
-				print >> f,'  %s -- %s [label="%s"]' % (lid, buur, getrange.showaddr(addr))
-	print >> f, "}"
-	sys.stderr.write("# Plotting temponary graph file using graphviz\n")
-	retval = subprocess.call(["neato","-Tpng",f.name, "-o", OUTFILE])
-	if retval != 0:
-		sys.stderr.write("# FAILED [%i]\n" % retval)
-		subprocess.call(["cat",f.name])
-		exit(1)
-	sys.stderr.write("# COMPLETED find your output in %s\n" % OUTFILE)
+  for addr,leden in poel.iteritems():
+    if link_type[addr] == '11a':
+      color = 'red'
+      weight = 4
+    elif link_type[addr] == 'eth':
+      color = 'blue'
+      weight = 8
+    else:
+      color = 'black'
+      weight = 1
+    leden = sorted(set(leden))
+    for index,lid in enumerate(leden[:-1]):
+      for buur in leden[index + 1:]:
+        print >> f,'  %s -- %s [label="%s", color="%s", weight="%s"]' % (lid, buur, gformat.showaddr(addr), color, weight)
+  print >> f, "}"
+  sys.stderr.write("# Plotting temponary graph file using graphviz\n")
+  retval = subprocess.call(["neato","-Tpng",f.name, "-o", OUTFILE])
+  if retval != 0:
+    sys.stderr.write("# FAILED [%i]\n" % retval)
+    subprocess.call(["cat",f.name])
+    exit(1)
+  sys.stderr.write("# COMPLETED find your output in %s\n" % OUTFILE)
     
 
 if __name__ == "__main__":
-	make_graph()
+  make_graph()
 
Index: /nodes/syntax-checker.py
===================================================================
--- /nodes/syntax-checker.py	(revision 8268)
+++ /nodes/syntax-checker.py	(revision 8268)
@@ -0,0 +1,53 @@
+#!/usr/bin/env python
+# vim:ts=2:et:sw=2:ai
+#
+# Build topological network graph
+# Rick van der Zwet <info@rickvanderzwet.nl>
+import gformat
+import sys
+
+__version__ = '$Id$'
+
+allowed_multi_use = ['0.0.0.0', '192.168.1.100']
+
+def check_double_ip():
+  pool = {}
+  try:
+    for host in gformat.get_proxylist() + gformat.get_nodelist():
+      print "## Processing host %-20s: " % host,
+      datadump = gformat.get_yaml(host)
+      iface_keys = [elem for elem in datadump.keys() if (elem.startswith('iface_') and not "lo0" in elem)]
+      for iface_key in iface_keys:
+        l = datadump[iface_key]['ip']
+        addr, mask = l.split('/')
+
+        label = "%s - %s" % (host, iface_key)
+        if pool.has_key(addr): 
+          pool[addr] += [label]
+        else: 
+          pool[addr] = [label]
+      print "OK"
+  except (KeyError, ValueError), e:
+    print "[ERROR] in '%s' interface '%s'" % (host,iface_key) 
+    print e
+    sys.exit(1)
+
+  error = False
+  for addr,leden in pool.iteritems():
+    if len(leden) > 1:
+      if not addr in allowed_multi_use:
+        print "[ERROR] Multiple usages of IP %s:" % (addr)
+        print "  -", "\n  - ".join(leden)
+        error = True
+
+  if error:
+    print "# Errors found"
+    return 1
+  else:
+    print "# No multiple usages of IPs found"
+    return 0
+
+
+if __name__ == "__main__":
+  sys.exit(check_double_ip())
+
