Index: /README
===================================================================
--- /README	(revision 6175)
+++ /README	(revision 6176)
@@ -1,20 +1,26 @@
-See LICENSE for the license details; The whole of Exodus falls under this license.
+See LICENSE for the license details; The whole of Exodus falls under this
+license.  
+Roland van Laar email: roland@wirelessleiden.nl
 
-Roland van Laar
-email: roland@wirelessleiden.nl
-
-Install django 0.96 Follow the website
-Do a avn checkout svn.wirelessleiden.nl/svn/code/exodus
-
-In django_exodus/settings.py 
-change MEDIA_ROOT to PATH/django_media
-Let template dirs point to: $PATH/django_templates
+= Directory/File layout =
+django        = general django layout
+django/exodus = django/exodus
+media         = static media files
+templates     = template files
 
 
+= Hacking =
+Install django 0.96 Follow the website, via macports
+`sudo port install py25-django-devel`
+Do a avn checkout svn.wirelessleiden.nl/svn/code/exodus hereafter referred to
+it as SVNROOT
+
+In $SVNROOT/django/settings.py 
+change MEDIA_ROOT to $SVNROOT/media
+Let template dirs point to: $SVNROOT/templates
+
 To run the developmentserver do
-$ cd django_exodus
-$ ./manage.py runserver 8000
-
-The portnumber is optional
+$ cd $SVNROOT/django
+$ ./manage.py runserver <8000>
 
 
Index: /django/exodus/models.py
===================================================================
--- /django/exodus/models.py	(revision 6176)
+++ /django/exodus/models.py	(revision 6176)
@@ -0,0 +1,152 @@
+# (c) Roland van Laar 2006
+#
+from django.db import models
+
+# Create your models here.
+
+class NICType(models.Model):
+    type = models.CharField(maxlength=10)
+    class Admin:
+        pass 
+
+    def __str__(self):
+        return self.type
+
+class Polar(models.Model):
+    polar = models.CharField(maxlength=10)
+    class Admin:
+        pass
+    
+    def __str__(self):
+        return self.polar
+
+class Status(models.Model):
+    status = models.CharField(maxlength=200)
+    class Admin:
+        pass
+    
+    def __str__(self):
+        return self.status
+
+class Mode(models.Model):
+    mode = models.CharField(maxlength=10)
+    class Admin:
+        pass
+
+    class Meta:
+        verbose_name = "wifi mode"
+
+    def __str__(self):
+        return self.mode
+
+class Antenna(models.Model):
+    type = models.CharField(maxlength=20)
+    gain = models.IntegerField(maxlength=3)
+    class Admin:
+        pass
+
+    def __str__(self):
+        return self.type
+
+class LinkType(models.Model):
+    type = models.CharField(maxlength=10)
+    class Admin:
+        pass
+
+    def __str__(self):
+        return self.type
+
+class Location(models.Model):
+    description = models.CharField(maxlength=200)
+    coordinateX = models.IntegerField(maxlength=10)
+    coordinateY = models.IntegerField(maxlength=10)
+    class Admin:
+        pass
+
+    def __str__(self):
+        return self.description
+
+class Node(models.Model):
+    name = models.CharField(maxlength=30, unique=True)
+    location = models.ForeignKey(Location)
+    status = models.ForeignKey(Status)
+    masterip = models.IPAddressField()
+
+    class Admin:
+        pass
+ 
+    class Meta:
+         ordering = ['name']
+
+    def __str__(self):
+        return self.name
+
+class NIC(models.Model): 
+    iface = models.CharField(maxlength=10)
+    polar = models.ForeignKey(Polar, blank=True, null=True)
+    shortdesc = models.CharField(maxlength=10)
+    desc = models.CharField(maxlength=200)
+    ssid = models.CharField(maxlength=30, blank=True, null=True)
+    mode = models.ForeignKey(Mode, blank=True, null=True)
+    status = models.ForeignKey(Status)
+    channel = models.IntegerField(blank=True, null=True)
+    antenna = models.ForeignKey(Antenna, blank=True, null=True) 
+    node = models.ForeignKey(Node)
+    type = models.ForeignKey(NICType)
+
+    class Admin:
+        pass
+
+    def __str__(self):
+        return "%s, %s" % (self.node.name, self.iface)
+
+class LinkPool(models.Model):
+    status = models.ForeignKey(Status)
+    type = models.ForeignKey(LinkType)
+    netmask = models.IntegerField()
+    dhcpstart = models.IntegerField()
+    dhcpstop = models.IntegerField()
+    class Admin:
+        pass
+
+    def smap(self,entry):
+        s = entry.iface 
+        return str(s)
+
+    def __str__(self):
+        return "id: %s links: %s" % (self.id, " ".join(map(self.smap,self.link_set.all())))
+
+class Link(models.Model):
+    shortdesc = models.CharField(maxlength=10)
+    desc = models.CharField(maxlength=100)
+    ip = models.IPAddressField()
+    status = models.ForeignKey(Status)
+    iface = models.ForeignKey(NIC)
+    linkpool = models.ForeignKey(LinkPool)
+    class Admin:
+        pass
+
+    def __str__(self):
+        return "%s %s" % (self.iface.node.name, self.shortdesc)
+
+class DhcpStatic(models.Model):
+    hostname = models.CharField(maxlength=10)
+    macaddress = models.CharField(maxlength=17) 
+    address = models.IPAddressField()
+    link = models.ForeignKey(LinkPool)
+    class Admin:
+        pass
+
+    def __str__(self):
+        return self.hostname
+
+class Network(models.Model):
+    domainname = models.CharField(maxlength=50)
+    ipspacestart = models.IPAddressField()
+    netmask = models.IntegerField() 
+
+    class Admin:
+        pass
+
+    def __str__(self):
+        return self.domainname
Index: /django/exodus/urls.py
===================================================================
--- /django/exodus/urls.py	(revision 6176)
+++ /django/exodus/urls.py	(revision 6176)
@@ -0,0 +1,30 @@
+# (c) Roland van Laar
+
+from django.conf.urls.defaults import *
+from django_exodus.exodus_01.models import *
+
+node_dict  = {
+    'queryset': Node.objects.all(),
+}
+
+urlpatterns = patterns('',
+
+	# views
+	(r'^$', 'django.views.generic.simple.direct_to_template', {'template': 'exodus_01/index.html'}) ,
+	(r'^nodelist/$', 'django.views.generic.list_detail.object_list', node_dict),
+	(r'^(?P<object_id>\d+)/node/$', 'django.views.generic.list_detail.object_detail', node_dict),
+
+	# config urls
+	(r'^(?P<object_id>\d+)/dhcp.conf/$', 'django_exodus.exodus_01.views.conf_dhcp_conf'),
+	(r'^(?P<object_id>\d+)/named.conf/$', 'django_exodus.exodus_01.views.conf_named_conf'),
+	(r'^(?P<object_id>\d+)/rc.node.local/$', 'django_exodus.exodus_01.views.conf_rc_node_local'),
+	(r'^(?P<object_id>\d+)/resolv.conf/$', 'django_exodus.exodus_01.views.conf_resolv_conf'),
+
+
+	# add urls
+	(r'^addlocation/$', 'django_exodus.exodus_01.views.addlocation'),
+	(r'^addnode/$', 'django_exodus.exodus_01.views.addnode'),
+	(r'^addnic/$', 'django_exodus.exodus_01.views.addnic'),
+	(r'^addinterlink/$', 'django_exodus.exodus_01.views.addinterlink'),
+	(r'^addomni/$', 'django_exodus.exodus_01.views.addomni')
+)
Index: /django/exodus/views.py
===================================================================
--- /django/exodus/views.py	(revision 6176)
+++ /django/exodus/views.py	(revision 6176)
@@ -0,0 +1,228 @@
+# (c) Roland van Laar 2006
+
+from django.http import HttpResponse, HttpResponseRedirect
+from django.template import loader, Context 
+from django.shortcuts import render_to_response
+from django import forms
+from datetime import datetime
+from socket import gethostname 
+
+from django_exodus.exodus_01.models import NIC, Node, Location, Link, LinkPool
+from django_exodus.exodus_01.wllogic import freemasterip, newssidname
+
+def addlocation(request):
+    manipulator = Location.AddManipulator()
+
+	
+    if request.POST:
+        new_data = request.POST.copy()
+
+        for data in new_data:
+				print "%s" % len(new_data)
+
+        print "%s" % new_data['description']
+
+        errors = manipulator.get_validation_errors(new_data)
+
+        if not errors:
+            manipulator.do_html2python(new_data)
+            new_place = manipulator.save(new_data)
+
+            return HttpResponseRedirect("/exodus_01/")
+
+    else:
+       errors = new_data = {}
+
+    form = forms.FormWrapper(manipulator, new_data, errors)
+    return render_to_response('exodus_01/addlocation.html', {'form': form, 'new_data': new_data})
+
+def addnode(request):
+	manipulator = Node.AddManipulator()
+
+	if request.POST:
+		new_data = request.POST.copy()
+
+		# input a valid master ip into new_data
+		new_data['masterip'] = freemasterip()
+
+		errors = manipulator.get_validation_errors(new_data)
+
+		if not errors:
+			manipulator.do_html2python(new_data)
+			new_place = manipulator.save(new_data)
+
+			return HttpResponseRedirect("/exodus_01/")
+
+	else:
+		errors = new_data = {}
+
+	form = forms.FormWrapper(manipulator, new_data, errors)
+	return render_to_response('exodus_01/addnode.html', {'form': form })
+
+def addnic(request):
+	manipulator = NIC.AddManipulator()
+
+	if request.POST:
+		new_data = request.POST.copy()
+
+		print new_data
+		
+		# generated data for the NIC
+
+		new_data['shortdesc'] = "bogus"
+		new_data['desc'] = "bogus"
+
+		print new_data
+		print new_data['node']
+
+		if str(new_data['type']) != "eth":
+			new_data['ssid'] = newssidname(new_data['node'],new_data['iface'])
+			new_data['channel'] = '1'
+			new_data['mode'] = '1' # set to master
+
+		print new_data
+			
+		errors = manipulator.get_validation_errors(new_data)
+
+		
+		if not errors:
+			manipulator.do_html2python(new_data)
+			new_place = manipulator.save(new_data)
+
+			return HttpResponseRedirect("/exodus_01/")
+
+	else:
+		errors = new_data = {}
+
+	form = forms.FormWrapper(manipulator, new_data, errors)
+	return render_to_response('exodus_01/addnic.html', {'form': form })
+
+def addinterlink(request):
+	link1_manipulator = Link.AddManipulator()
+	link2_manipulator = Link.AddManipulator()
+	linkpool_manipulator = LinkPool.AddManipulator()
+
+
+	if request.POST:
+		new_data = request.POST.copy()
+	
+		print new_data
+		alliface = new_data.getlist("iface")
+
+		iface1 = NIC.objects.get(id=alliface[0])
+		iface2 = NIC.objects.get(id=alliface[1])
+
+		print iface1
+		print iface2
+
+		if iface1.type != iface2.type:
+			print "not compatible"
+			linkerror["compat"] = "choose twomcompatible"	
+
+
+		errors = link1_manipulator.get_validation_errors(new_data)
+
+		if not errors:
+			link1_manipulator.do_html2python(new_data)
+
+			return HttpResponseRedirect("/exodus_01/")
+		
+	else:
+		errors = new_data = {}
+
+	form1 = forms.FormWrapper(link1_manipulator, new_data, errors)
+	form2 = forms.FormWrapper(link2_manipulator, new_data, errors)
+	return render_to_response('exodus_01/addinterlink.html',{'form1':form1, 'form2':form2})
+
+def addomni(request):
+	link_manipulator = Link.AddManipulator()
+	linkpool_manipulator = LinkPool.AddManipulator()
+
+	if request.POST:
+		new_data = request.POST.copy()
+
+		# pull data and 
+		#
+
+		link_errors = link_manipulator.get_validation_errors(new_data)
+		linkpool_errors = linkpool_manipulator.get_validation_errors(new_data)
+
+	else:
+		errors = new_data = {}
+	
+	form1 = forms.FormWrapper(link_manipulator, new_data, errors)
+	form2 = forms.FormWrapper(linkpool_manipulator, new_data, errors)
+	return render_to_response('exodus_01/addomni.html',{'form1':form1, 'form2':form2})
+
+    
+
+def conf_rc_local(request, object_id):
+    """5.X legacy rc.local conf generator"""
+    object = Node.objects.get(pk=object_id).nic_set.all()
+    object.date = datetime.now()
+    object.name = Node.objects.get(pk=object_id).name
+    object.host = gethostname()
+
+    # check if it is a wireless nic, and add wifimode for wicontrol  
+    for nic in object:
+        if nic.ssid:
+            if nic.mode.mode == 'master':
+                nic.wifimode = 6
+                nic.wifidesc = 'master mode'
+            else:
+                nic.wifimode = 1
+                nic.wifidesc = 'managed mode'
+    t = loader.get_template('exodus_01/rc_local.txt')
+    c = Context({'object': object, 
+        })
+    return HttpResponse(t.render(c), mimetype='text/plain')
+
+def conf_rc_node_local5X(request, object_id):
+	"""5.X Legacy rc.node.local conf generator"""
+
+	object.date = datetime.now()
+	object.name = Node.objects.get(pk=object_id).name
+	object.host = gethostname()
+
+	t = loader.get_template('exodus_01/rc_node_local.txt')
+	c = Context({'object': object,
+	    })
+	return HttpResponse(t.render(c), mimetype='text/plain')
+
+def conf_rc_node_local(request, object_id):
+	"""rc.node.local conf generator"""
+
+	object = Node.objects.get(pk=object_id).nic_set.all()
+	object.date = datetime.now()
+	object.name = Node.objects.get(pk=object_id).name
+	object.host = gethostname()
+
+	t = loader.get_template('exodus_01/rc_node_local.txt')
+	c = Context({'object': object, })
+
+	print c
+	return HttpResponse(t.render(c), mimetype='text.plain')
+
+def conf_rc_node_localorig(request, object_id):
+	"""rc.node.local conf generator"""
+
+	object = Node.objects.get(pk=object_id).nic_set.all()
+	object.date = datetime.now()
+	object.name = Node.objects.get(pk=object_id).name
+	object.host = gethostname()
+
+	# check if it is a wireless nic, and add wifimode for wicontrol  
+	for nic in object:
+		if nic.ssid:
+			if nic.mode.mode == 'master':
+				nic.wifimode = 6
+				nic.wifidesc = 'master mode'
+			else:
+				nic.wifimode = 1
+				nic.wifidesc = 'managed mode'
+
+	print "boek"
+	t = loader.get_template('exodus_01/rc_node_local.txt')
+	c = Context({'object': object, 
+		})
+	return HttpResponse(t.render(c), mimetype='text/plain')
Index: /django/exodus/wllogic.py
===================================================================
--- /django/exodus/wllogic.py	(revision 6176)
+++ /django/exodus/wllogic.py	(revision 6176)
@@ -0,0 +1,39 @@
+# (c) Roland van Laar
+
+from django_exodus.exodus_01.models import Node, Network
+
+def newssidname(node,desc):
+	"""Generates a new ssid name for a new wifi NIC"""
+
+	return "%s.%s.%s" % (desc, Node.objects.get(pk=6).name, Network.objects.get(pk=1).domainname)
+
+def newname(test):
+	return "%s.%s.%s" % ( test, test, test )
+#
+# Taken from lvoege@gmail.com's getrange.py
+#
+def parseaddr(s):
+	f = s.split('.')
+	return (long(f[0]) << 24L) + \
+		(long(f[1]) << 16L) + \
+		(long(f[2]) << 8L) + \
+		long(f[3])
+
+def showaddr(a):
+	return "%d.%d.%d.%d" % ((a >> 24) & 0xff, (a >> 16) & 0xff, (a >> 8) & 0xff, a & 0xff)
+
+def freemasterip():
+	taken = {}
+
+	for node in Node.objects.all():
+		addr = parseaddr(node.masterip)
+		taken[addr] = 1
+
+	size = 24
+	numaddrs = 1 << (32 - size)
+
+	i = 0xAC110001L # hardcoded 172.17.0.1 ## need to fix this
+	while taken.has_key(i):
+		i = i + numaddrs
+    
+	return showaddr(i)
Index: /django/manage.py
===================================================================
--- /django/manage.py	(revision 6176)
+++ /django/manage.py	(revision 6176)
@@ -0,0 +1,11 @@
+#!/usr/bin/env python
+from django.core.management import execute_manager
+try:
+    import settings # Assumed to be in the same directory.
+except ImportError:
+    import sys
+    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
+    sys.exit(1)
+
+if __name__ == "__main__":
+    execute_manager(settings)
Index: /django/settings.py
===================================================================
--- /django/settings.py	(revision 6176)
+++ /django/settings.py	(revision 6176)
@@ -0,0 +1,76 @@
+# Django settings for exodus project.
+
+DEBUG = True
+TEMPLATE_DEBUG = DEBUG
+
+ADMINS = (
+    ('Roland van Laar', 'roland@micite.net'),
+)
+
+MANAGERS = ADMINS
+
+DATABASE_ENGINE = 'postgresql'           # 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.
+DATABASE_NAME = 'django'             # Or path to database file if using sqlite3.
+DATABASE_USER = 'roland'             # Not used with sqlite3.
+DATABASE_PASSWORD = ''         # Not used with sqlite3.
+DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
+DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.
+
+# Local time zone for this installation. All choices can be found here:
+# http://www.postgresql.org/docs/current/static/datetime-keywords.html#DATETIME-TIMEZONE-SET-TABLE
+TIME_ZONE = 'Europe/Amsterdam'
+
+# Language code for this installation. All choices can be found here:
+# http://www.w3.org/TR/REC-html40/struct/dirlang.html#langcodes
+# http://blogs.law.harvard.edu/tech/stories/storyReader$15
+LANGUAGE_CODE = 'en-us'
+
+SITE_ID = 1
+
+# Absolute path to the directory that holds media.
+# Example: "/home/media/media.lawrence.com/"
+MEDIA_ROOT = '/Users/roland/WL/exodus_svn/exodus/media'
+
+# URL that handles the media served from MEDIA_ROOT.
+# Example: "http://media.lawrence.com"
+MEDIA_URL = ''
+
+# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
+# trailing slash.
+# Examples: "http://foo.com/media/", "/media/".
+ADMIN_MEDIA_PREFIX = '/media/'
+
+# Make this unique, and don't share it with anybody.
+SECRET_KEY = 'l+plhHJKNIkiasdfh12lsk0Lkf,.=+-asdjdknmnaladfasdmnm,90934jknmnsdaf09'
+
+# List of callables that know how to import templates from various sources.
+TEMPLATE_LOADERS = (
+    'django.template.loaders.filesystem.load_template_source',
+    'django.template.loaders.app_directories.load_template_source',
+#     'django.template.loaders.eggs.load_template_source',
+)
+
+MIDDLEWARE_CLASSES = (
+    'django.middleware.common.CommonMiddleware',
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+    'django.middleware.doc.XViewMiddleware',
+)
+
+ROOT_URLCONF = 'django_exodus.urls'
+
+TEMPLATE_DIRS = (
+    # Put strings here, like "/home/html/django_templates".
+    # Always use forward slashes, even on Windows.
+
+   "~/exodus/templates"
+)
+
+INSTALLED_APPS = (
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.sites',
+    'django.contrib.admin',
+    'django.exodus',
+)
Index: /django/urls.py
===================================================================
--- /django/urls.py	(revision 6176)
+++ /django/urls.py	(revision 6176)
@@ -0,0 +1,10 @@
+# (c) Roland van Laar
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('',
+     (r'^exodus/', include('django.exodus.urls')),
+	 (r'^site_media/(.*)$', 'django.views.static.serve', {'document_root': 
+	 '/Users/roland/WL/exodus/django_media'}),
+     (r'^admin/', include('django.contrib.admin.urls')),
+
+)
Index: /media/exodus.css
===================================================================
--- /media/exodus.css	(revision 6176)
+++ /media/exodus.css	(revision 6176)
@@ -0,0 +1,184 @@
+BODY {
+		font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;
+		font-size : 12px;
+		color : Black;
+	}
+
+A	{
+		color : #4471AA;
+		text-decoration : None;
+	}
+
+A.list {
+		font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;
+		font-size : 13px;
+		background-color : #CAFFFF;
+		}
+
+TD {
+		font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;
+		font-size : 12px;
+		color : Black;
+	}
+
+TD.disclaimer {
+		text-align : center;
+	}
+
+TD.title {
+		font-family : Courier New, Courier, monospace;
+		font-weight : Bold;
+		font-size : 24px;
+		background-color : Black;
+		line-height : 31 px;
+		color : White;
+		text-align : right;
+		width : 644px;
+	}
+
+TD.list {
+		font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;
+		font-size : 13px;
+		background-color : #CAFFFF;
+		}
+
+TD.menu {
+		font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;
+		line-height : 20px;
+		font-size : 16px;
+		color : White;
+		background-color : #CA2424;
+		width : 130px;
+		}
+
+TD.menu2 {
+        font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;
+        font-size : 16px;
+        color : White;
+		background-image : url("/site_media/topmenu.png");
+		background-position : bottom;
+		width : 644px;
+		height : 25px;
+		}
+
+TD.menu2table {
+        font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;
+        font-size : 16px;
+        color : White;
+		background-position : bottom;
+		width : 644px;
+		height : 25px;
+		}
+
+TD.menu2l {
+		background-image : url("/site_media/topmenu_left.png");
+		background-position : top;
+		width : 8px;
+		height : 25px;
+		}
+
+TD.menu2r {
+		background-image : url("/site_media/topmenu_right.png");
+		background-position : top;
+		width : 8px;
+		height : 25px;
+		}
+
+TD.main {
+		font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;
+		font-size : 12px;
+		background-image : url("/site_media/background.png");
+		background-position : 0;
+		width : 644px;
+		padding-top : 10px;
+		line-height: 16px;
+		}
+
+TD.mainl {
+		width : 8px;
+		}
+
+TD.mainr {
+		width : 8px;
+		background-color : #D3E0F1;
+		}
+
+TD.right {
+		font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;
+		font-size : 12px;
+		background-position : 0;
+		width : 660px;
+		}
+
+TD.title {
+		font-family : Courier New, Courier, monospace;
+		font-weight : Bold;
+		background-color : black;
+		line-height : 31px;
+		color : White;
+		text-align : right;
+		width : 644px;
+		}
+
+TD.titlel {
+		background-color : Black;
+		line-height : 31px;
+		width : 8px;
+		}
+
+TD.titler {
+		background-color : Black;
+		line-height : 31px;
+		width : 8px;
+		}
+
+P.menu {
+		padding-left : 10px;
+		}
+
+P.title {
+		font-size : 16px;
+		font-weight : bold;
+		}
+
+P.blue {
+		font-size : 14px;
+		font-weight : Bold;
+		color : Black;
+		background-color : #EECC99;
+		padding-left : 10px;
+		padding-right : 10px;
+		padding-bottom : 2px;
+		}
+
+A.menu { 
+		text-decoration : none;
+		color : White;
+		background-color : #CA2424;
+		border-bottom-style : none;
+		border-bottom-width : 1px;
+		}
+
+A.title {
+		color : white;
+		background-color: black;
+		text-decoration : none;
+		border-bottom-style : none;
+		border-bottom-width : 1px;
+		border-bottom-color : #CA2424;
+		}
+
+A.menu:HOVER {
+        color : white;
+        background-color : #CA2424;
+        border-bottom-style : solid;
+        border-bottom-width : 1px;
+        border-bottom-color : black;
+		}
+
+A.disclaimer {
+		font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;
+		font-size : 9px;
+		color : #444444;
+		text-decoration : none;
+		}
Index: /templates/404.html
===================================================================
--- /templates/404.html	(revision 6176)
+++ /templates/404.html	(revision 6176)
@@ -0,0 +1,12 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block title %}{% trans 'Page not found' %}{% endblock %}
+
+{% block content %}
+
+<h2>{% trans 'Page not found' %}</h2>
+
+<p>{% trans "We're sorry, but the requested page could not be found." %}</p>
+
+{% endblock %}
Index: /templates/500.html
===================================================================
--- /templates/500.html	(revision 6176)
+++ /templates/500.html	(revision 6176)
@@ -0,0 +1,12 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="/">{% trans "Home" %}</a> &rsaquo; {% trans "Server error" %}</div>{% endblock %}
+
+{% block title %}{% trans 'Server error (500)' %}{% endblock %}
+
+{% block content %}
+<h1>{% trans 'Server Error <em>(500)</em>' %}</h1>
+<p>{% trans "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience." %}</p>
+
+{% endblock %}
Index: /templates/admin/base_site.html
===================================================================
--- /templates/admin/base_site.html	(revision 6176)
+++ /templates/admin/base_site.html	(revision 6176)
@@ -0,0 +1,10 @@
+{% extends "admin/base.html" %}
+{% load i18n %}
+
+{% block title %}{{ title }} | {% trans 'Django site admin' %}{% endblock %}
+
+{% block branding %}
+<h1 id="site-name">{% trans 'Django administration' %}</h1>
+{% endblock %}
+
+{% block nav-global %}{% endblock %}
Index: /templates/exodus/README
===================================================================
--- /templates/exodus/README	(revision 6176)
+++ /templates/exodus/README	(revision 6176)
@@ -0,0 +1,7 @@
+This README contains information about the file standard in this template directory
+
+.html 	HTML files
+.txt	TEXT files
+
+For the exodus txt configuration files contain underscores _, where a dot . is used
+for the actual filename .
Index: /templates/exodus/addinterlink.html
===================================================================
--- /templates/exodus/addinterlink.html	(revision 6176)
+++ /templates/exodus/addinterlink.html	(revision 6176)
@@ -0,0 +1,21 @@
+{% extends "exodus_template.html" %}
+
+{% block content %}
+
+<h1> add an interlink </h1>
+
+<form method="post" action=".">
+<div>
+	<label for="id_status">Status:</label> {{ form1.status }}
+	{% if form1.status.errors %} *** {{ form1.status.errors|join:", " }}{% endif %}
+</div>
+<div>
+	<label for="id_iface1">Iface 1:</label> {{ form1.iface }}
+</div>
+<div>
+	<label for="id_iface2">Iface 2:</label> {{ form2.iface }}
+</div>
+<input type="submit" value="submit">
+</form>
+
+{% endblock %}
Index: /templates/exodus/addlocation.html
===================================================================
--- /templates/exodus/addlocation.html	(revision 6176)
+++ /templates/exodus/addlocation.html	(revision 6176)
@@ -0,0 +1,24 @@
+{% extends "exodus_template.html" %}
+
+{% block content %}
+<h1>Create a location</h1>
+
+
+<form method="post" action=".">
+<p>
+    <label for="id_description">Description:</label> {{ form.description }}
+    {% if form.description.errors %}*** {{ form.description.errors|join:", " }}{% endif %}
+</p>
+<p>
+    <label for="id_coordinateX">X coordinate:</label> {{ form.coordinateX }} 
+    {% if form.coordinateX.errors %}*** {{ form.coordinateX.errors|join:", " }}{% endif %}
+</p>
+<p>
+    <label for="id_coordinateY">Y coordinate:</label> {{ form.coordinateY }} 
+    {% if form.coordinateY.errors %}*** {{ form.coordinateY.errors|join:", " }}{% endif %}
+</p>
+
+<input type="submit" value="sumbit" />
+</form>
+
+{% endblock %}
Index: /templates/exodus/addnic.html
===================================================================
--- /templates/exodus/addnic.html	(revision 6176)
+++ /templates/exodus/addnic.html	(revision 6176)
@@ -0,0 +1,34 @@
+{% extends "exodus_template.html" %}
+
+{% block content %}
+<h1>Create a NIC</h1>
+
+<form method="post" action=".">
+<div>
+    <label for="id_node">Node Name:</label> {{ form.node }}
+	{% if form.node.errors %} *** {{ form.node.errors|join:", " }}{% endif %}
+</div>
+<div>
+    <label for="id_iface">Iface name:</label> {{ form.iface}}
+	{% if form.iface.errors %} *** {{ form.iface.errors|join:", " }}{% endif %}
+</div>
+<div>
+    <label for="id_type">Type:</label> {{ form.type}}
+	{% if form.type.errors %} *** {{ form.type.errors|join:", " }}{% endif %}
+</div>
+<div>
+    <label for="id_antenna">Antenna:</label> {{ form.antenna }}
+	{% if form.iface.errors %} *** {{ form.iface.errors|join:", " }}{% endif %}
+</div>
+<div>
+    <label for="id_polar">Polarisation:</label> {{ form.polar }}
+	{% if form.polar.errors %} *** {{ form.polar.errors|join:", " }}{% endif %}
+</div>
+<div>
+    <label for="id_status">Status:</label> {{ form.status }}
+	{% if form.status.errors %} *** {{ form.status.errors|join:", " }}{% endif %}
+</div>
+<input type="submit" value="submit">
+</form>
+
+{% endblock %}
Index: /templates/exodus/addnode.html
===================================================================
--- /templates/exodus/addnode.html	(revision 6176)
+++ /templates/exodus/addnode.html	(revision 6176)
@@ -0,0 +1,26 @@
+{% extends "exodus_template.html" %}
+
+{% block content %}
+
+<h1>Create a Node</h1>
+
+<form method="post" action=".">
+<div>
+	<label for="id_name">Node Name:</label> {{ form.name }}
+	{% if form.name.errors %} *** {{ form.name.errors|join:", " }}{% endif %}
+</div>
+<div>
+	<label for="id_location">Node Location:</label> {{ form.location}}
+	{% if form.location.errors %} *** {{ form.location.errors|join:", " }}{% endif %}
+</div>
+<div>
+	<label for="id_status">Node Status:</label> {{ form.status }}
+	{% if form.status.errors %} *** {{ form.status.errors|join:", " }}{% endif %}
+</div>
+<div>
+	{% if form.masterip.errors %} *** MasterIP {{ form.masterip.errors|join:", " }} {% endif %}
+</div>
+<input type="submit" value="submit">
+</form>
+
+{% endblock %}
Index: /templates/exodus/addomni.html
===================================================================
--- /templates/exodus/addomni.html	(revision 6176)
+++ /templates/exodus/addomni.html	(revision 6176)
@@ -0,0 +1,8 @@
+{% extends "exodus_template.html" %}
+
+{% block content %}
+<h1>Add an Omni</h1>
+
+<strong> Under construction </strong>
+
+{% endblock %}
Index: /templates/exodus/bottom.html
===================================================================
--- /templates/exodus/bottom.html	(revision 6176)
+++ /templates/exodus/bottom.html	(revision 6176)
@@ -0,0 +1,17 @@
+	 	</td>
+	    <td class="mainr">&nbsp;</td>
+	  </tr>
+	  <tr><td class="bottom" colspan="3"></td></tr>
+	</table>
+	</td>
+  </TR>
+  <tr>
+    <td class="disclaimer" colspan="2">
+    <a class="disclaimer" href="http://www.wirelessleiden.nl/stichting/disclaimer.shtml">disclaimer &copy; 2006 </a> 
+	&nbsp;|&nbsp;<a class="disclaimer" href="#top">top</a>
+	</td>
+  </tr>
+</TABLE>
+</BODY>
+
+</HTML>
Index: /templates/exodus/head.html
===================================================================
--- /templates/exodus/head.html	(revision 6176)
+++ /templates/exodus/head.html	(revision 6176)
@@ -0,0 +1,39 @@
+<HTML>
+<TITLE>
+HTML test with a menu on the left side
+</TITLE>
+<link rel="stylesheet" href="/site_media/exodus.css" title="Default" type="text/css" />
+
+<BODY>
+<TABLE border="0" cellspacing="0" cellpadding="0">
+  <TR>
+    <td class="menu" valign="top">
+	  <A name="top"><img width="130" height="82" alt="logo" src="logo.png" border=0/></A></br>
+	  <img width="130" height="97" alt="foto" src="foto.jpg"/><br/>
+	  &nbsp;&nbsp;<A class="menu" href="http://localhost:8080/exodus_01/">Exodus</a></br/>
+	</td>
+	<td valign="top" class="right">
+
+	<table border=0 cellspacing="0" cellpadding="0">
+	  <tr>
+	    <td class="titlel">&nbsp;</td>
+		<td class="title">
+		  <a class="title" href="http://www.wirelessleiden.nl">WirelessLeiden.NL</a>
+	    </td>
+		<td class="titler">&nbsp;</td>
+	  </tr>
+	  <tr>
+		<td class="menu2l" background="topmenu_left.png">&nbsp;</td> 
+		<td class="menu2" background="topmenu.png">
+		  <table border="0">
+		    <tr>
+			  <td class="menu2">Exodus</td>
+			</tr>
+		  </table>
+		</td>
+		<td class="menu2r" background="topmenu_right.png">&nbsp;</td>
+	  </tr>
+   	  <tr>
+		<td class="mainl">&nbsp;</td>
+		<td class="main" background="background.png"> 
+		  <br/>
Index: /templates/exodus/index-old.html
===================================================================
--- /templates/exodus/index-old.html	(revision 6176)
+++ /templates/exodus/index-old.html	(revision 6176)
@@ -0,0 +1,31 @@
+<html>
+<head>
+	<title>Exodus Development Site</title>
+</head>
+
+<body> 
+<div>
+<strong>This is the WL exodus site. </strong><br>
+<b>Exodus is a webbased program which enables you 
+to view, alter and add nodes.</b>
+For questions or remarks: <a href="mailto:roland@wirelessleiden.nl">roland@wirelessleiden.nl</a>
+</div>
+<div>
+<ul>
+	<li><a href="nodelist/">Node List</a></li>
+</ul>
+</div>
+
+<div>
+<strong>Add</strong>
+<ul>
+	<li><a href="addlocation/">Add Location</a></li>
+	<li><a href="addnode/">Add Node</a></li>
+	<li><a href="addnic/">Add NIC</a></li>
+	<li><a href="addinterlink/">Add InterLink</a></li>
+	<li><a href="addomni/">Add Omni</a></li>
+</ul>
+</div>
+
+</body>
+</html>
Index: /templates/exodus/index.html
===================================================================
--- /templates/exodus/index.html	(revision 6176)
+++ /templates/exodus/index.html	(revision 6176)
@@ -0,0 +1,16 @@
+{% extends "exodus_template.html" %}
+
+{% block content %}
+
+<P class="blue">WirelessLeiden Exodus</P>
+This is the WirelessLeiden Exodus site. Exodus is the next generation configuration
+management database for WireslessLeiden. Development is still ongoing since not all 
+features of Genesis, our current management system, are available in genesis.
+More documentation is being written. </br>
+</br>
+
+<strong>This site is under construction and not fully operational.</strong></br>
+
+For questions or remarks: <a href="mailto:roland@wirelessleiden.nl">roland@wirelessleiden.nl</a>
+
+{% endblock %}
Index: /templates/exodus/node_detail.html
===================================================================
--- /templates/exodus/node_detail.html	(revision 6176)
+++ /templates/exodus/node_detail.html	(revision 6176)
@@ -0,0 +1,69 @@
+{% extends "exodus_template.html" %}
+
+{% block content %}
+<h1> {{ object.name }} </h1>
+
+<div>
+
+Location: {{ object.location.description }} <br>
+X: {{ object.location.coordinateX }} <br>
+Y: {{ object.location.coordinateY }} <br>
+
+Master ip: {{ object.masterip }}
+
+</div>
+
+<h2>Interfaces</h2>
+
+{% for nic in object.nic_set.all %}
+<p>
+<h3>iface: {{ nic.iface }} </h3>
+status: {{ nic.status }} <br>
+type: {{ nic.type }} <br>
+description: {{ nic.shortdesc }} <br>
+
+{% if nic.ssid %}
+SSID: {{ nic.ssid }} <br>
+Channel: {{ nic.channel }} <br>
+Antenna: {{ nic.antenna }} <br>
+Polar: {{ nic.polar }} <br>	
+Mode: {{ nic.mode }} <br>
+{% endif %}
+
+{% for link in nic.link_set.all %}
+<ul>
+<li>Description: {{ link.shortdesc }} </li>
+<li>IP: {{ link.ip }}/{{ link.linkpool.netmask }} </li>
+
+<li>LinkPool id: {{ link.linkpool.id }} </li>
+<li>Type: {{ link.linkpool.type }}
+<ul>
+{% for linknic in link.linkpool.link_set.all %}
+    {% ifequal linknic.iface.id nic.id %}
+        <li> {{ linknic.iface.node }} </li>
+    {% else %}
+        <li><a href=../../{{ linknic.iface.node.id }}/node> {{ linknic.iface.node }}</a></li>
+    {% endifequal %}
+{% endfor %}
+</ul>
+
+{% if link.linkpool.dhcpstart %}
+    <li>DHCP {{ link.linkpool.dhcpstart }}-{{ link.linkpool.dhcpstop }}</li>
+    {% for dhcp in link.linkpool.dhcpstatic_set.all %}
+    <ul>
+        <li>Hostname: {{ dhcp.hostname }} </li>
+        <li>MacAddress: {{ dhcp.macaddress }} </li>
+    </ul>
+    {% endfor %}
+{% endif %}
+
+
+
+</ul>
+
+{% endfor %}
+
+</p>
+{% endfor %}
+
+{% endblock %}
Index: /templates/exodus/node_list.html
===================================================================
--- /templates/exodus/node_list.html	(revision 6176)
+++ /templates/exodus/node_list.html	(revision 6176)
@@ -0,0 +1,25 @@
+{% extends "exodus_template.html" %}
+
+{% block content %}
+
+<P class="blue"> Node List </P>
+
+{% if object_list %}
+	<table border="3" cellpadding="1">
+    {% for object in object_list %}
+		<tr>
+        	<td class="list" ><a class="list"href=../{{ object.id }}/node/> {{ object.name }} </a><td>
+            <td><a href=../{{ object.id }}/dhcpd.conf/>dhcpd.conf</a></td>
+            <td><a href=../{{ object.id }}/named.conf/>named.conf</a></td>
+            <td><a href=../{{ object.id }}/rc.node.local/>rc.node.local</a></td>
+            <td><a href=../{{ object.id }}/resolve.conf/>resolv.conf</a></td>
+		</tr>
+
+    {% endfor %}
+	</table>
+{% else %}
+    <p class="blue"> No nodes are available </p>
+{% endif %}
+
+{% endblock %}
+
Index: /templates/exodus/rc_local.txt
===================================================================
--- /templates/exodus/rc_local.txt	(revision 6176)
+++ /templates/exodus/rc_local.txt	(revision 6176)
@@ -0,0 +1,20 @@
+# The file is WirelessLeiden specific. Please make all changes in exodus
+#
+# Generated on {{ object.date.day }}-{{ object.date.month }}-{{ object.date.year }} 
+# by {{ object.host }}
+#
+# Node: {{ object.name }}
+# File: rc.local
+
+{% for nic in object %}
+{% if nic.ssid %}
+/usr/sbin/wicontrol -i {{ nic.iface }} -s {{ nic.shortdesc }} # Nickname
+/usr/sbin/wicontrol -i {{ nic.iface }} -P 0  # PowerSave
+/usr/sbin/wicontrol -i {{ nic.iface }} -Z    # Zero SNR cache
+/usr/sbin/wicontrol -i {{ nic.iface }} -p {{ nic.wifimode }}  # {{ nic.wifidesc }}
+/usr/sbin/wicontrol -i {{ nic.iface }} -c 1  # broadcasting essid on
+/usr/sbin/wicontrol -i {{ nic.iface }} -n {{ nic.ssid }} # network name
+/usr/sbin/wicontrol -i {{ nic.iface }} -q {{ nic.ssid }} # ESSID
+/usr/sbin/wicontrol -i {{ nic.iface }} -f {{ nic.channel }} # Channel
+{% endif %}
+{% endfor %}
Index: /templates/exodus/rc_node_local.txt
===================================================================
--- /templates/exodus/rc_node_local.txt	(revision 6176)
+++ /templates/exodus/rc_node_local.txt	(revision 6176)
@@ -0,0 +1,20 @@
+# The file is WirelessLeiden specific. Please make all changes in exodus
+#
+# Generated on {{ object.date.day }}-{{ object.date.month }}-{{ object.date.year }} 
+# by {{ object.host }}
+#
+# Node: {{ object.name }}
+# File: rc.local
+
+{% for nic in object %}
+{% if nic.ssid %}
+/usr/sbin/wicontrol -i {{ nic.iface }} -s {{ nic.shortdesc }} # Nickname
+/usr/sbin/wicontrol -i {{ nic.iface }} -P 0  # PowerSave
+/usr/sbin/wicontrol -i {{ nic.iface }} -Z    # Zero SNR cache
+/usr/sbin/wicontrol -i {{ nic.iface }} -p {{ nic.wifimode }}  # {{ nic.wifidesc }}
+/usr/sbin/wicontrol -i {{ nic.iface }} -c 1  # broadcasting essid on
+/usr/sbin/wicontrol -i {{ nic.iface }} -n {{ nic.ssid }} # network name
+/usr/sbin/wicontrol -i {{ nic.iface }} -q {{ nic.ssid }} # ESSID
+/usr/sbin/wicontrol -i {{ nic.iface }} -f {{ nic.channel }} # Channel
+{% endif %}
+{% endfor %}
Index: /templates/exodus/test.html
===================================================================
--- /templates/exodus/test.html	(revision 6176)
+++ /templates/exodus/test.html	(revision 6176)
@@ -0,0 +1,1 @@
+HEY check if this works
Index: /templates/exodus_template.html
===================================================================
--- /templates/exodus_template.html	(revision 6176)
+++ /templates/exodus_template.html	(revision 6176)
@@ -0,0 +1,64 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<HTML>
+<TITLE>
+WirelessLeiden Exodus
+</TITLE>
+<link rel="stylesheet" href="/site_media/exodus.css" title="Default" type="text/css" />
+
+<BODY>
+<TABLE border="0" cellspacing="0" cellpadding="0">
+  <TR>
+    <td class="menu" valign="top">
+	  <A name="top"><img width="130" height="82" alt="logo" src="/site_media/logo.png" border=0/></A></br>
+	  <img width="130" height="97" alt="foto" src="/site_media/foto.jpg"/><br/>
+	  &nbsp;&nbsp;<A class="menu" href="/exodus">Exodus</a></br/>
+	  &nbsp;&nbsp;<A class="menu" href="/exodus/nodelist">Node List</a><br/>
+	  &nbsp;&nbsp;<A class="menu" href="/exodus/addlocation">Add Location</a></br>
+	  &nbsp;&nbsp;<A class="menu" href="/exodus/addnode">Add Node</a></br>
+	  &nbsp;&nbsp;<A class="menu" href="/exodus/addnic">Add NIC</a></br>
+	  &nbsp;&nbsp;<A class="menu" href="/exodus/addinterlink">Add Interlink</a></br>
+	  &nbsp;&nbsp;<A class="menu" href="/exodus/addomni">Add Omni</a></br>
+	</td>
+	<td valign="top" class="right">
+
+	<table border=0 cellspacing="0" cellpadding="0">
+	  <tr>
+	    <td class="titlel">&nbsp;</td>
+		<td class="title">
+		  <a class="title" href="http://www.wirelessleiden.nl">WirelessLeiden.NL</a>
+	    </td>
+		<td class="titler">&nbsp;</td>
+	  </tr>
+	  <tr>
+		<td class="menu2l">&nbsp;</td> 
+		<td class="menu2">
+		  <table border="0">
+		    <tr>
+			  <td class="menu2table">Exodus</td>
+			</tr>
+		  </table>
+		</td>
+		<td class="menu2r">&nbsp;</td>
+	  </tr>
+   	  <tr>
+		<td class="mainl">&nbsp;</td>
+		<td class="main"> 
+		  <br/>
+		  {% block content %}	 {% endblock %}
+	 	</td>
+	    <td class="mainr">&nbsp;</td>
+	  </tr>
+	  <tr><td class="bottom" colspan="3"></td></tr>
+	</table>
+	</td>
+  </TR>
+  <tr>
+    <td class="disclaimer" colspan="2">
+    <a class="disclaimer" href="http://www.wirelessleiden.nl/stichting/disclaimer.shtml">disclaimer &copy; 2006 </a> 
+	&nbsp;|&nbsp;<a class="disclaimer" href="#top">top</a>
+	</td>
+  </tr>
+</TABLE>
+</BODY>
+
+</HTML>
