Index: CENSE
===================================================================
--- /LICENSE	(revision 6310)
+++ 	(revision )
@@ -1,9 +1,0 @@
-Copyright 2006 Roland van Laar. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
-   1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-      2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-
-	  THIS SOFTWARE IS PROVIDED BY ROLAND VAN LAAR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ROLAND VAN LAAR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
Index: kefile
===================================================================
--- /Makefile	(revision 6310)
+++ 	(revision )
@@ -1,28 +1,0 @@
-SQLDB="sqllite.db"
-
-help:
-#Usage
-	@grep -e '[a-z\-]:' -e '^#' Makefile |\
-	 sed -e :a -e '$!N;s/\n#/ /;ta' -e 'P;D' | sed  -e 's/^/make /g' 
-
-debug:
-#Run server in extra debugging mode
-	@./sampleserver/manage.py runserver_plus 8000 --pythonpath=`pwd`
-
-run:
-#Run server in normal power mode
-	@./sampleserver/manage.py runserver 8000 --pythonpath=`pwd`
-
-init:
-#Re-init database
-	@./sampleserver/manage.py syncdb --pythonpath=`pwd`
-
-debug-init:
-# Put debug.sql in database
-	@sqlite3 $(SQLDB) < debug.sql
-
-dist-clean:
-#Remove database
-	@rm -vf $(SQLDB)
-
-new: dist-clean init debug-init debug
Index: ADME
===================================================================
--- /README	(revision 6310)
+++ 	(revision )
@@ -1,34 +1,0 @@
-See LICENSE for the license details; The whole of Exodus falls under this
-license.  
-Roland van Laar email: roland@wirelessleiden.nl
-
-= Directory/File layout =
-doc              = documentation files e.g. papers and transcripts
-exodus           = exodus module
-exodus/static    = exodus static files
-exodus/templates = exodus template files
-sampleserver     = general django layout
-
-= Hacking =
-Install Django 1.0 to $DJANGOROOT
-
-Install Django extentions using http://code.google.com/p/django-command-extensions/wiki/InstallationInstructions
-$ curl -O http://django-command-extensions.googlecode.com/files/django-command-extensions-0.3.tgz
-$ tar xzf django-command-extensions-0.3.tgz
-$ cd django-command-extensions-0.3
-$ python setup.py install
-
-$svn co http://code.djangoproject.com/svn/django/tags/releases/1.0/
-$ cd $DJANGOROOT 
-$ ./sudo python setup.py install
-
-To create the database:
-$ cd $SVNROOT
-$ make init
-
-To run the developmentserver do
-$ cd $SVNROOT
-$ make debug
-
-
-
Index: DO
===================================================================
--- /TODO	(revision 6310)
+++ 	(revision )
@@ -1,48 +1,0 @@
-** Showstoppers
--> Document database layout and choices
-	@rick, I think this todo van be closed, because exodusmodels.dot is available
-
-* Input fields validation
-* Conversion Genesis -> Exodus
-* Exodus, support Genesis output
-* Add check that a domain has a dnsserver if not, named.conf generation gets broken
-* Add reverse lookup fields for named.conf
-* Fix dhcpd.conf template
-* Add ssh_keys
-
-* remove hardcoding in wllogic.py for 172.17 and higher as master ip 
-* Interface cleanups:
-** option to edit/delete fields
-** allignment input fields
-** combine input fields where possible and link
-** Interlink add code
-	->desc
-	->remove hardcoding of 172.16 in freeinterlink ip code
-	->Check if link is possible, ie. master can have multiple interlinks, managed can only have 1
-	->generate SSID
-	->Put correct modes on NIC
-	->Check that: freeinterlinkip() works going from 17.16.0.255 to 172.16.1.0
-	->Check if 1 has an omni, omni needs to be master
-	
-
-* Think:
-** class Interlink return self.iface1 or self.iface1.node
-
-* Genesis compatibility
-	-> add files
-		dhcpd.conf
-		named.conf
-		rc.local
-		rc.node.local
-		resolv.conf
-		snmpd.local.conf
-
-DONE:
-15/08/08 * Make admin work with models.py
-23/08/08 * Interlink add code; Generate ipaddresses and netmask for link works.
-03/09/08 - RZ
-* Check urls and response redirects; Make urls depend on urls.py instead of hardcoding them into
-	views.py and the templates. See:
-	http://www.djangoproject.com/documentation/url_dispatch/#reverse
-
-	
Index: bug.sql
===================================================================
--- /debug.sql	(revision 6310)
+++ 	(revision )
@@ -1,3 +1,0 @@
-INSERT INTO exodus_location VALUES ( 1, 'Zoeterwoude', 10, 30);
-INSERT INTO exodus_node VALUES ( 1, 'Zwet', 1, 1, '172.16.1.2', 1);
-INSERT INTO exodus_node VALUES ( 2, 'Laar', 1, 1, '172.16.2.2', 1);
Index: /trunk/LICENSE
===================================================================
--- /trunk/LICENSE	(revision 6311)
+++ /trunk/LICENSE	(revision 6311)
@@ -0,0 +1,9 @@
+Copyright 2006 Roland van Laar. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+      2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+	  THIS SOFTWARE IS PROVIDED BY ROLAND VAN LAAR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ROLAND VAN LAAR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
Index: /trunk/Makefile
===================================================================
--- /trunk/Makefile	(revision 6311)
+++ /trunk/Makefile	(revision 6311)
@@ -0,0 +1,28 @@
+SQLDB="sqllite.db"
+
+help:
+#Usage
+	@grep -e '[a-z\-]:' -e '^#' Makefile |\
+	 sed -e :a -e '$!N;s/\n#/ /;ta' -e 'P;D' | sed  -e 's/^/make /g' 
+
+debug:
+#Run server in extra debugging mode
+	@./sampleserver/manage.py runserver_plus 8000 --pythonpath=`pwd`
+
+run:
+#Run server in normal power mode
+	@./sampleserver/manage.py runserver 8000 --pythonpath=`pwd`
+
+init:
+#Re-init database
+	@./sampleserver/manage.py syncdb --pythonpath=`pwd`
+
+debug-init:
+# Put debug.sql in database
+	@sqlite3 $(SQLDB) < debug.sql
+
+dist-clean:
+#Remove database
+	@rm -vf $(SQLDB)
+
+new: dist-clean init debug-init debug
Index: /trunk/README
===================================================================
--- /trunk/README	(revision 6311)
+++ /trunk/README	(revision 6311)
@@ -0,0 +1,34 @@
+See LICENSE for the license details; The whole of Exodus falls under this
+license.  
+Roland van Laar email: roland@wirelessleiden.nl
+
+= Directory/File layout =
+doc              = documentation files e.g. papers and transcripts
+exodus           = exodus module
+exodus/static    = exodus static files
+exodus/templates = exodus template files
+sampleserver     = general django layout
+
+= Hacking =
+Install Django 1.0 to $DJANGOROOT
+
+Install Django extentions using http://code.google.com/p/django-command-extensions/wiki/InstallationInstructions
+$ curl -O http://django-command-extensions.googlecode.com/files/django-command-extensions-0.3.tgz
+$ tar xzf django-command-extensions-0.3.tgz
+$ cd django-command-extensions-0.3
+$ python setup.py install
+
+$svn co http://code.djangoproject.com/svn/django/tags/releases/1.0/
+$ cd $DJANGOROOT 
+$ ./sudo python setup.py install
+
+To create the database:
+$ cd $SVNROOT
+$ make init
+
+To run the developmentserver do
+$ cd $SVNROOT
+$ make debug
+
+
+
Index: /trunk/TODO
===================================================================
--- /trunk/TODO	(revision 6311)
+++ /trunk/TODO	(revision 6311)
@@ -0,0 +1,48 @@
+** Showstoppers
+-> Document database layout and choices
+	@rick, I think this todo van be closed, because exodusmodels.dot is available
+
+* Input fields validation
+* Conversion Genesis -> Exodus
+* Exodus, support Genesis output
+* Add check that a domain has a dnsserver if not, named.conf generation gets broken
+* Add reverse lookup fields for named.conf
+* Fix dhcpd.conf template
+* Add ssh_keys
+
+* remove hardcoding in wllogic.py for 172.17 and higher as master ip 
+* Interface cleanups:
+** option to edit/delete fields
+** allignment input fields
+** combine input fields where possible and link
+** Interlink add code
+	->desc
+	->remove hardcoding of 172.16 in freeinterlink ip code
+	->Check if link is possible, ie. master can have multiple interlinks, managed can only have 1
+	->generate SSID
+	->Put correct modes on NIC
+	->Check that: freeinterlinkip() works going from 17.16.0.255 to 172.16.1.0
+	->Check if 1 has an omni, omni needs to be master
+	
+
+* Think:
+** class Interlink return self.iface1 or self.iface1.node
+
+* Genesis compatibility
+	-> add files
+		dhcpd.conf
+		named.conf
+		rc.local
+		rc.node.local
+		resolv.conf
+		snmpd.local.conf
+
+DONE:
+15/08/08 * Make admin work with models.py
+23/08/08 * Interlink add code; Generate ipaddresses and netmask for link works.
+03/09/08 - RZ
+* Check urls and response redirects; Make urls depend on urls.py instead of hardcoding them into
+	views.py and the templates. See:
+	http://www.djangoproject.com/documentation/url_dispatch/#reverse
+
+	
Index: /trunk/debug.sql
===================================================================
--- /trunk/debug.sql	(revision 6311)
+++ /trunk/debug.sql	(revision 6311)
@@ -0,0 +1,3 @@
+INSERT INTO exodus_location VALUES ( 1, 'Zoeterwoude', 10, 30);
+INSERT INTO exodus_node VALUES ( 1, 'Zwet', 1, 1, '172.16.1.2', 1);
+INSERT INTO exodus_node VALUES ( 2, 'Laar', 1, 1, '172.16.2.2', 1);
Index: /trunk/doc/INSTALLdjangotrunk
===================================================================
--- /trunk/doc/INSTALLdjangotrunk	(revision 6311)
+++ /trunk/doc/INSTALLdjangotrunk	(revision 6311)
@@ -0,0 +1,23 @@
+$DJANGOTRUNK = /path/to/django/checkout
+$EXODUS = /path/to/exodus/checkout
+
+= checkout django =
+
+svn co -r 8354 http://code.djangoproject.com/svn/django/trunk/ $DJANGOTRUNK
+
+= remove old django =
+
+For fink:
+sudo rm -v /sw/bin/django-admin.py
+sudo rm -v /sw/lib/python2.5/site-packages/django
+
+= install new django = 
+
+sudo ln -sv $DJANGOTRUNK/django/bin/django-admin.py /sw/bin/django-admin.py
+sudo ln -sv $DJANGOTRUNK/django /sw/lib/python2.5/site-packages/django
+
+= run server and syncdb =
+
+$EXODUS/sampleserver/manage.py syncdb --pythonpath=$EXODUS
+$EXODUS/sampleserver/manage.py runserver --pythonpath=$EXODUS
+
Index: /trunk/doc/README
===================================================================
--- /trunk/doc/README	(revision 6311)
+++ /trunk/doc/README	(revision 6311)
@@ -0,0 +1,20 @@
+= Generate exodusmodels.dot =
+
+exodusmodels.dot is a graphviz file which shows the exodus database.
+
+Install the djangotrunk and the django_extensions 
+which can be fetched from: 
+http://code.google.com/p/django-command-extensions/
+
+Add 'extensions' to settings.py
+
+Using the djangotrunk execute:
+$ ./manage.py graph_models exodus > exodusmodels.dot
+
+= Debug Django =
+
+Install django_extensions, see above for installation description.
+Install Werkzeug from: http://werkzeug.pocoo.org/download
+
+Using werkzeug:
+$ ./manage.py runserver_plus 
Index: /trunk/doc/discussion-08-09-2008.txt
===================================================================
--- /trunk/doc/discussion-08-09-2008.txt	(revision 6311)
+++ /trunk/doc/discussion-08-09-2008.txt	(revision 6311)
@@ -0,0 +1,78 @@
+Talkthrough September 8th 2008
+Attendees: Roland van Laar, Rick van der Zwet
+Goal: Streamline Exodus development, documenting
+
+* URL - OK
+- urls will represent config which needs to be generated
+- Cool URLs do not change
+- URL represent function/state of exodus
+- config files:
+* exodus/config/freebsd-5.0/FooBar/named.conf
+* exodus/config/<version>/<node>/<file>
+
+exodus/add/node
+exodus/add/link (one link)
+...
+
+(confirmation view)
+exodus/delete/node/<node> (recursive, but location)
+exodus/delete/link/<linkid>
+...
+
+exodus/edit/node/<node>
+exodus/edit/link/<node> (all links)
+...
+
+exodus/nodelist -> exodus/view/nodelist (view url, geo-info, nodelist)
+exodus/<node>/node -> exodus/view/node/<node> (generic overview)
+
+* GRAPHICAL VIEW
+- Box and EDIT buttons
+
+* PYTHON FILES/DIRECTORES - OK
+- merge url logic into view logic.
+- split files to match the underlying logic, like on version and templates a
+  subdir version number
+
+* PLAIN VIEW TEMPLATES TO MANY SPACES/RETURN - OK
+- Config file, should be readable, really (genesis style) pretty printing not
+  required due automatic configuration
+
+
+* DATABASE - OK
+- node -> network -> dnsserver
+- seperate dnsserver
+- owner -> network possible if XS is going to happen
+
+* INTERLINK - OK
+- Nic -*> Link -> LinkPool
+- Nic -*> Link -> PublicAP
+- Choice ssid/channel PublicAP precedence
+- Link needed due desc,ip,etc
+- LinkPool, linkID to Link to indentify master
+
+* ACCESS MANAGMENT - OK
+Users:
+SSHKey
+Name:
+username:
+password:
+group -*> Group
+Node -*> Node
+
+Group:
+name
+Network -*> Network
+Node -*> Node
+
+* SITEBAR MENU -
+- Home
+- Add Node
+- View Nodes
+
+* OTHER
+# What to do with statuses? Nodes only planned, up, down.
+  No need for sql table anymore, models.py only
+# API? JSON/XML (2nd round, version 1.x)
+
+
Index: /trunk/doc/examples/README
===================================================================
--- /trunk/doc/examples/README	(revision 6311)
+++ /trunk/doc/examples/README	(revision 6311)
@@ -0,0 +1,1 @@
+Example files which needs to be generated using exodus and sample Genesis input file
Index: /trunk/doc/examples/dhcpd.conf
===================================================================
--- /trunk/doc/examples/dhcpd.conf	(revision 6311)
+++ /trunk/doc/examples/dhcpd.conf	(revision 6311)
@@ -0,0 +1,46 @@
+ 
+# This file specific to wireless
+# leiden. Please make all changes in Genesis.
+#
+# Generated by dellas.wirelessleiden.nl
+# on Thu Sep  4 08:56:05 2008
+#
+#  feb 2003 jasper@WirelessLeiden.NL | maart 2005 rick@WirelessLeiden.NL
+#
+
+
+option domain-name "wLeiden.NET";
+ 
+default-lease-time 7200;
+max-lease-time 2592000;
+
+ddns-update-style none;
+
+# Hack for the WET11
+#
+always-broadcast on;
+
+option domain-name-servers 172.27.129.1;
+
+# ep0 Link naar pc's
+subnet 172.27.129.80 netmask 255.255.255.240 {
+  range 172.27.129.82 172.27.129.94;
+  option broadcast-address 172.27.129.95;
+  option subnet-mask 255.255.255.240;
+  option routers 172.27.129.81;
+}
+
+# wi0 Omni voor de buurt
+subnet 172.27.129.0 netmask 255.255.255.192 {
+  range 172.27.129.10 172.27.129.60;
+  option broadcast-address 172.27.129.63;
+  option subnet-mask 255.255.255.192;
+  option routers 172.27.129.1;
+}
+
+# xl0 Link naar thuisnetwerk 
+subnet 172.27.129.64 netmask 255.255.255.252 {not authoritative; }
+
+# xl1 Link naar duivenhok
+subnet 172.16.1.164 netmask 255.255.255.252 {not authoritative; }
+
Index: /trunk/doc/examples/named.conf
===================================================================
--- /trunk/doc/examples/named.conf	(revision 6311)
+++ /trunk/doc/examples/named.conf	(revision 6311)
@@ -0,0 +1,215 @@
+ 
+# This file specific to wireless
+# leiden. Please make all changes in Genesis.
+#
+# Generated by dellas.wirelessleiden.nl
+# on Thu Sep  4 08:56:08 2008
+#
+#  feb 2003 jasper@WirelessLeiden.NL | maart 2005 rick@WirelessLeiden.NL
+#
+
+
+options {
+  directory "/etc/namedb";
+  pid-file "/var/run/named/pid";
+  forwarders {
+172.17.8.68;
+172.17.143.4;
+172.20.128.98;
+  };
+};
+
+
+zone "." {
+  type hint;
+  file "/etc/namedb/named.root";
+};
+
+zone "0.0.127.IN-ADDR.ARPA" {
+  type master;
+  file "/etc/namedb/master/localhost.rev";
+};
+
+zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.INT" {
+  type master;
+  file "/etc/namedb/master/localhost-v6.rev";
+};
+
+zone "16.172.in-addr.arpa" {
+  type slave;
+  file "slave/slave-16.172.in-addr.arpa";
+  masters {
+    172.17.143.4;
+    172.17.8.68;
+    172.20.128.98;
+  };
+};
+
+zone "17.172.in-addr.arpa" {
+  type slave;
+  file "slave/slave-17.172.in-addr.arpa";
+  masters {
+    172.17.143.4;
+    172.17.8.68;
+    172.20.128.98;
+  };
+};
+
+zone "18.172.in-addr.arpa" {
+  type slave;
+  file "slave/slave-18.172.in-addr.arpa";
+  masters {
+    172.17.143.4;
+    172.17.8.68;
+    172.20.128.98;
+  };
+};
+
+zone "19.172.in-addr.arpa" {
+  type slave;
+  file "slave/slave-19.172.in-addr.arpa";
+  masters {
+    172.17.143.4;
+    172.17.8.68;
+    172.20.128.98;
+  };
+};
+
+zone "20.172.in-addr.arpa" {
+  type slave;
+  file "slave/slave-20.172.in-addr.arpa";
+  masters {
+    172.17.143.4;
+    172.17.8.68;
+    172.20.128.98;
+  };
+};
+
+zone "21.172.in-addr.arpa" {
+  type slave;
+  file "slave/slave-21.172.in-addr.arpa";
+  masters {
+    172.17.143.4;
+    172.17.8.68;
+    172.20.128.98;
+  };
+};
+
+zone "22.172.in-addr.arpa" {
+  type slave;
+  file "slave/slave-22.172.in-addr.arpa";
+  masters {
+    172.17.143.4;
+    172.17.8.68;
+    172.20.128.98;
+  };
+};
+
+zone "23.172.in-addr.arpa" {
+  type slave;
+  file "slave/slave-23.172.in-addr.arpa";
+  masters {
+    172.17.143.4;
+    172.17.8.68;
+    172.20.128.98;
+  };
+};
+
+zone "24.172.in-addr.arpa" {
+  type slave;
+  file "slave/slave-24.172.in-addr.arpa";
+  masters {
+    172.17.143.4;
+    172.17.8.68;
+    172.20.128.98;
+  };
+};
+
+zone "25.172.in-addr.arpa" {
+  type slave;
+  file "slave/slave-25.172.in-addr.arpa";
+  masters {
+    172.17.143.4;
+    172.17.8.68;
+    172.20.128.98;
+  };
+};
+
+zone "26.172.in-addr.arpa" {
+  type slave;
+  file "slave/slave-26.172.in-addr.arpa";
+  masters {
+    172.17.143.4;
+    172.17.8.68;
+    172.20.128.98;
+  };
+};
+
+zone "27.172.in-addr.arpa" {
+  type slave;
+  file "slave/slave-27.172.in-addr.arpa";
+  masters {
+    172.17.143.4;
+    172.17.8.68;
+    172.20.128.98;
+  };
+};
+
+zone "28.172.in-addr.arpa" {
+  type slave;
+  file "slave/slave-28.172.in-addr.arpa";
+  masters {
+    172.17.143.4;
+    172.17.8.68;
+    172.20.128.98;
+  };
+};
+
+zone "29.172.in-addr.arpa" {
+  type slave;
+  file "slave/slave-29.172.in-addr.arpa";
+  masters {
+    172.17.143.4;
+    172.17.8.68;
+    172.20.128.98;
+  };
+};
+
+zone "30.172.in-addr.arpa" {
+  type slave;
+  file "slave/slave-30.172.in-addr.arpa";
+  masters {
+    172.17.143.4;
+    172.17.8.68;
+    172.20.128.98;
+  };
+};
+
+zone "31.172.in-addr.arpa" {
+  type slave;
+  file "slave/slave-31.172.in-addr.arpa";
+  masters {
+    172.17.143.4;
+    172.17.8.68;
+    172.20.128.98;
+  };
+};
+
+zone "wLeiden.NET" {
+  type slave;
+  file "slave/slave-wLeiden.NET";
+  masters {
+    172.17.143.4;
+    172.17.8.68;
+    172.20.128.98;
+  };
+};
+
+zone "wZoeterwoude.NET" {
+  type slave;
+  file "slave/slave-wZoeterwoude.NET";
+  masters {
+    172.27.129.66;
+  };
+};
+
Index: /trunk/doc/examples/rc.node.local
===================================================================
--- /trunk/doc/examples/rc.node.local	(revision 6311)
+++ /trunk/doc/examples/rc.node.local	(revision 6311)
@@ -0,0 +1,21 @@
+ 
+# This file specific to wireless
+# leiden. Please make all changes in Genesis.
+#
+# Generated by dellas.wirelessleiden.nl
+# on Thu Sep  4 08:56:13 2008
+#
+#  feb 2003 jasper@WirelessLeiden.NL | maart 2005 rick@WirelessLeiden.NL
+#
+
+
+hostname="CNodeZwet.wLeiden.NET"
+location="Buurt sportvelden, Particulier dak,Zoeterwoude "
+
+ifconfig_lo0_alias0="inet 172.31.255.1/32"
+#ifconfig_lo0_alias1="inet 172.27.129.1/32"
+
+ifconfig_ep0="inet 172.27.129.81/28 "
+ifconfig_wi0="inet 172.27.129.1/26  ssid ap-omni.zwet.wleiden.net channel 1 mediaopt hostap"
+ifconfig_xl0="inet 172.27.129.65/30 "
+ifconfig_xl1="inet 172.16.1.166/30 "
Index: /trunk/doc/examples/resolv.conf
===================================================================
--- /trunk/doc/examples/resolv.conf	(revision 6311)
+++ /trunk/doc/examples/resolv.conf	(revision 6311)
@@ -0,0 +1,15 @@
+ 
+# This file specific to wireless
+# leiden. Please make all changes in Genesis.
+#
+# Generated by dellas.wirelessleiden.nl
+# on Thu Sep  4 08:56:17 2008
+#
+#  feb 2003 jasper@WirelessLeiden.NL | maart 2005 rick@WirelessLeiden.NL
+#
+
+
+search wleiden.net.
+nameserver 127.0.0.1
+
+nameserver 172.16.1.165 # Link naar duivenhok
Index: /trunk/doc/examples/wleiden.conf
===================================================================
--- /trunk/doc/examples/wleiden.conf	(revision 6311)
+++ /trunk/doc/examples/wleiden.conf	(revision 6311)
@@ -0,0 +1,92 @@
+#  Read by /usr/local/sbin/wireless-up.pl
+#
+# config CNodeZwet 
+$location="Buurt sportvelden, Particulier dak,Zoeterwoude ";
+$master_ip='172.27.129.1';
+$gw_open='closed';
+$nodetype='CNode';
+$nodename='Zwet';
+
+$status='up';
+
+$release="5.0-RELEASE";
+$node_config_version="1";
+$genesis_control="YES";
+
+$OS='FreeBSD';
+$labelpos='left';
+
+# edugis x,y 94319,459273
+$X='94319';
+$Y='459273';
+
+$config{'ep0'}=sprintf <<ED0;
+TYPE=ethernet
+IP=172.27.129.81/28
+DESC=Link naar pc's
+SDESC=2zwet-pc
+
+DHCP=82-94
+
+
+ED0
+
+$config{'xl0'}=sprintf <<ED1;  # Link naar thuisnetwerk
+TYPE=ethernet
+IP=172.27.129.65/30
+
+DESC=Link naar thuisnetwerk 
+SDESC=2home
+SPEED=10240000000
+
+OSPF_BROADCAST=no
+OSPF_NEIGHBORS=no
+
+DHCP=no
+
+ED1
+
+$config{'xl1'}=sprintf <<ED2;  # Link naar Duivenhok
+TYPE=ethernet
+IP=172.16.1.166/30
+
+DESC=Link naar duivenhok
+SDESC=2duivenhok
+SPEED=10240000000
+
+DHCP=no
+
+POINT_TO_POINT=172.16.1.165
+OSPF_BROADCAST=no
+OSPF_NEIGHBORS=172.16.1.165
+
+ED2
+
+$config{'wi0'}=sprintf <<EW0;  # OMNI
+TYPE=wireless
+IP=$master_ip/26
+
+DESC=Omni voor de buurt
+SDESC=omni
+SPEED=11534336
+
+OSPF_BROADCAST=no
+OSPF_NEIGHBORS=no
+
+MODE=master
+ESSID=ap-omni.zwet.wleiden.net
+CHANNEL=1
+
+DHCP=10-60
+
+POLAR=Ver
+ANTENNA=omni
+GAIN=5dBi
+DIRECTION=omni
+BEAMWIDTH=360
+CABLE=5
+HEIGTH=14
+
+EW0
+
+
Index: /trunk/doc/exodus_mysql
===================================================================
--- /trunk/doc/exodus_mysql	(revision 6311)
+++ /trunk/doc/exodus_mysql	(revision 6311)
@@ -0,0 +1,129 @@
+XXX: Initial model dependency design, needs documenting of choices and porting
+to direct code of ../exodus/models.py 
+
+XXX: Mis koppeling interlink en node 
+
+group
+    id
+    name
+    contact -> contact.id
+    network
+    netmask
+
+contact
+    id
+    name
+    adres
+    postcode
+    woonplaats
+    telefoonnr vast
+    telefoonnr mobiel
+    email
+    messengernr
+    function
+    group -> group.id
+    comment
+
+location
+    id
+    owner -> contact.id
+    operator -> contact.id
+    adres
+    postcode
+    woonplaats
+    GPS
+    telefoonnr vast
+    comment
+
+hardware
+    id
+    name
+    cpu
+    memory
+    mainboard
+    aantal pci sloten
+    aantal agp sloten
+    aantal mini pci sloten
+    aantal isa sloten
+    onboard video
+    onboard network
+    disksize
+    comment
+
+connector
+    id
+    name
+
+nictype
+    id
+    name
+    transmissionpower
+    connector
+    slottype
+    comment
+
+nic (zowel ethernet als wifi)
+    id
+    node -> node.id
+    mac address
+    type -> nictype.id
+    mode
+    ssid
+    channel
+    flashversion
+    connector -> connector.id
+    comment
+
+interlink
+    id
+    name
+    comment
+
+nicconfig (kan meer dan 1 per card ivm virtual interfaces)
+    id
+    nic -> nic.id
+    ip
+    hostname
+    network -> ippool.id
+    interlink -> interlink.id
+    comment
+
+antennehw
+    id
+    name
+    gain
+    range
+    height
+    directions
+    connector -> connector.id
+    comment
+
+antenne
+    id
+    nic -> nic.id
+    antennehw -> antennehw.id
+
+NF
+    id
+    versionnr
+    OS
+    OSversionnr
+
+ippool
+    id
+    network
+    netmask
+    group -> group.id
+
+system
+    id
+    name
+    builder -> contact.id
+    administrator -> contact.id
+    backup administrator -> contact.id
+    location -> location.id
+    hardware -> hardware.id
+    status (produktie/pre-produktie)
+    type (node/server)
+    NF ->  NF.id
+    comment
Index: /trunk/doc/exodusmodels.dot
===================================================================
--- /trunk/doc/exodusmodels.dot	(revision 6311)
+++ /trunk/doc/exodusmodels.dot	(revision 6311)
@@ -0,0 +1,716 @@
+
+digraph name {
+  fontname = "Helvetica"
+  fontsize = 8
+
+  node [
+    fontname = "Helvetica"
+    fontsize = 8
+    shape = "plaintext"
+  ]
+  edge [
+    fontname = "Helvetica"
+    fontsize = 8
+  ]
+
+
+
+
+
+  
+    exodus_models_NICType [label=<
+    <TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
+     <TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4"
+     ><FONT FACE="Helvetica Bold" COLOR="white"
+     >NICType</FONT></TD></TR>
+
+    
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">id</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">AutoField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">type</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">CharField</FONT
+        ></TD></TR>
+        
+    
+    </TABLE>
+    >]
+  
+    exodus_models_Polar [label=<
+    <TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
+     <TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4"
+     ><FONT FACE="Helvetica Bold" COLOR="white"
+     >Polar</FONT></TD></TR>
+
+    
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">id</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">AutoField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">polar</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">CharField</FONT
+        ></TD></TR>
+        
+    
+    </TABLE>
+    >]
+  
+    exodus_models_Status [label=<
+    <TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
+     <TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4"
+     ><FONT FACE="Helvetica Bold" COLOR="white"
+     >Status</FONT></TD></TR>
+
+    
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">id</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">AutoField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">status</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">CharField</FONT
+        ></TD></TR>
+        
+    
+    </TABLE>
+    >]
+  
+    exodus_models_Mode [label=<
+    <TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
+     <TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4"
+     ><FONT FACE="Helvetica Bold" COLOR="white"
+     >Mode</FONT></TD></TR>
+
+    
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">id</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">AutoField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">mode</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">CharField</FONT
+        ></TD></TR>
+        
+    
+    </TABLE>
+    >]
+  
+    exodus_models_Antenna [label=<
+    <TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
+     <TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4"
+     ><FONT FACE="Helvetica Bold" COLOR="white"
+     >Antenna</FONT></TD></TR>
+
+    
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">id</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">AutoField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">type</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">CharField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">gain</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">IntegerField</FONT
+        ></TD></TR>
+        
+    
+    </TABLE>
+    >]
+  
+    exodus_models_Location [label=<
+    <TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
+     <TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4"
+     ><FONT FACE="Helvetica Bold" COLOR="white"
+     >Location</FONT></TD></TR>
+
+    
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">id</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">AutoField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">description</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">CharField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">Longitude</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">DecimalField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">Latitude</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">DecimalField</FONT
+        ></TD></TR>
+        
+    
+    </TABLE>
+    >]
+  
+    exodus_models_Network [label=<
+    <TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
+     <TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4"
+     ><FONT FACE="Helvetica Bold" COLOR="white"
+     >Network</FONT></TD></TR>
+
+    
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">id</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">AutoField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">domainname</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">CharField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">ipspacestart</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">IPAddressField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">netmask</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">IntegerField</FONT
+        ></TD></TR>
+        
+    
+    </TABLE>
+    >]
+  
+    exodus_models_DnsServer [label=<
+    <TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
+     <TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4"
+     ><FONT FACE="Helvetica Bold" COLOR="white"
+     >DnsServer</FONT></TD></TR>
+
+    
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">id</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">AutoField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">ipaddress</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">IPAddressField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">domainname</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">ForeignKey</FONT
+        ></TD></TR>
+        
+    
+    </TABLE>
+    >]
+  
+    exodus_models_Node [label=<
+    <TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
+     <TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4"
+     ><FONT FACE="Helvetica Bold" COLOR="white"
+     >Node</FONT></TD></TR>
+
+    
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">id</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">AutoField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">name</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">CharField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">location</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">ForeignKey</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">status</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">ForeignKey</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">masterip</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">IPAddressField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">network</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">ForeignKey</FONT
+        ></TD></TR>
+        
+    
+    </TABLE>
+    >]
+  
+    exodus_models_NIC [label=<
+    <TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
+     <TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4"
+     ><FONT FACE="Helvetica Bold" COLOR="white"
+     >NIC</FONT></TD></TR>
+
+    
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">id</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">AutoField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">node</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">ForeignKey</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">iface</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">CharField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">polar</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">ForeignKey</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">ssid</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">CharField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">mode</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">ForeignKey</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">status</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">ForeignKey</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">channel</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">IntegerField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">antenna</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">ForeignKey</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">type</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">ForeignKey</FONT
+        ></TD></TR>
+        
+    
+    </TABLE>
+    >]
+  
+    exodus_models_Interlink [label=<
+    <TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
+     <TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4"
+     ><FONT FACE="Helvetica Bold" COLOR="white"
+     >Interlink</FONT></TD></TR>
+
+    
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">id</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">AutoField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">status</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">ForeignKey</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">netmask</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">IntegerField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">iface1</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">ForeignKey</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">ip1</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">IPAddressField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">iface2</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">ForeignKey</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">ip2</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">IPAddressField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">shortdesc1</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">CharField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">shortdesc2</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">CharField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">desc1</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">CharField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">desc2</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">CharField</FONT
+        ></TD></TR>
+        
+    
+    </TABLE>
+    >]
+  
+    exodus_models_Omni [label=<
+    <TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
+     <TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4"
+     ><FONT FACE="Helvetica Bold" COLOR="white"
+     >Omni</FONT></TD></TR>
+
+    
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">id</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">AutoField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">iface</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">ForeignKey</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">status</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">ForeignKey</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">ip</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">IPAddressField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">netmask</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">IntegerField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">dhcpstart</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">IPAddressField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">dhcpstop</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">IPAddressField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">shortdesc</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">CharField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">desc</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">CharField</FONT
+        ></TD></TR>
+        
+    
+    </TABLE>
+    >]
+  
+    exodus_models_DhcpStatic [label=<
+    <TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
+     <TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4"
+     ><FONT FACE="Helvetica Bold" COLOR="white"
+     >DhcpStatic</FONT></TD></TR>
+
+    
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">id</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">AutoField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">hostname</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">CharField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">macaddress</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">CharField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">address</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">IPAddressField</FONT
+        ></TD></TR>
+        
+        <TR><TD ALIGN="LEFT" BORDER="0"
+        ><FONT FACE="Helvetica Bold">omni</FONT
+        ></TD>
+        <TD ALIGN="LEFT"
+        ><FONT FACE="Helvetica Bold">ForeignKey</FONT
+        ></TD></TR>
+        
+    
+    </TABLE>
+    >]
+  
+
+
+
+
+  
+    
+  
+    
+  
+    
+  
+    
+  
+    
+  
+    
+  
+    
+  
+    
+    
+    exodus_models_DnsServer -> exodus_models_Network
+    [label="domainname"] ;
+    
+  
+    
+    
+    exodus_models_Node -> exodus_models_Location
+    [label="location"] ;
+    
+    
+    exodus_models_Node -> exodus_models_Status
+    [label="status"] ;
+    
+    
+    exodus_models_Node -> exodus_models_Network
+    [label="network"] ;
+    
+  
+    
+    
+    exodus_models_NIC -> exodus_models_Node
+    [label="node"] ;
+    
+    
+    exodus_models_NIC -> exodus_models_Polar
+    [label="polar"] ;
+    
+    
+    exodus_models_NIC -> exodus_models_Mode
+    [label="mode"] ;
+    
+    
+    exodus_models_NIC -> exodus_models_Status
+    [label="status"] ;
+    
+    
+    exodus_models_NIC -> exodus_models_Antenna
+    [label="antenna"] ;
+    
+    
+    exodus_models_NIC -> exodus_models_NICType
+    [label="type"] ;
+    
+  
+    
+    
+    exodus_models_Interlink -> exodus_models_Status
+    [label="status"] ;
+    
+    
+    exodus_models_Interlink -> exodus_models_NIC
+    [label="iface1"] ;
+    
+    
+    exodus_models_Interlink -> exodus_models_NIC
+    [label="iface2"] ;
+    
+  
+    
+    
+    exodus_models_Omni -> exodus_models_NIC
+    [label="iface"] ;
+    
+    
+    exodus_models_Omni -> exodus_models_Status
+    [label="status"] ;
+    
+  
+    
+    
+    exodus_models_DhcpStatic -> exodus_models_Omni
+    [label="omni"] ;
+    
+  
+
+
+}
+
Index: /trunk/doc/todo.txt
===================================================================
--- /trunk/doc/todo.txt	(revision 6311)
+++ /trunk/doc/todo.txt	(revision 6311)
@@ -0,0 +1,21 @@
+XXX: Old todo list, needs merging with ../TODO
+
+** entries with ** have already been completed
+
+
+07\18\06
+
+-DHCPstart and DHCPstop blank=True,null=True maken 
+-link.status and linkpool.status is redundant
+
+07\19\06
+-Password and authentication
+**-rename table mode to wifimode
+
+08\02\06
+-Add 'network' foreign key to node
+-move wifi capabilities from NIC; split the table
+-Rethink NIC table
+-Link table has descriptions, not NIC
+-addnic has hardcoded '1' for foreignkey mode
+-location based ip, for routing
Index: /trunk/exodus/admin.py
===================================================================
--- /trunk/exodus/admin.py	(revision 6311)
+++ /trunk/exodus/admin.py	(revision 6311)
@@ -0,0 +1,12 @@
+from django.contrib import admin
+from exodus.models import *
+
+
+admin.site.register(Antenna)
+admin.site.register(Location)
+admin.site.register(DnsServer)
+admin.site.register(Network)
+admin.site.register(Node)
+admin.site.register(Interface)
+admin.site.register(PublicAP)
+admin.site.register(DhcpStatic)
Index: /trunk/exodus/models.py
===================================================================
--- /trunk/exodus/models.py	(revision 6311)
+++ /trunk/exodus/models.py	(revision 6311)
@@ -0,0 +1,130 @@
+# (c) Roland van Laar 2006
+#
+from django.db import models
+from django.contrib import admin
+
+# Create your models here.
+
+#No need to formalize it; CHOICES don't change much
+
+STATUS_CHOICES = ( 
+			('up', 'up'),
+			('dw', 'down'),
+			('pl', 'planned'),
+			)
+
+POLAR_CHOICES = (
+			('hr', 'horizontal'),
+			('vr', 'vertical'),
+			)
+
+INTERFACE_TYPE_CHOICES = (
+			('eth', 'eth'),
+			('11a', '11a'),
+			('11b', '11b'),
+			('11g', '11g'),
+			)
+WIFI_MODE_CHOICES = (
+			('ms', 'master'),
+			('mn', 'managed'),
+			)
+
+class Antenna(models.Model):
+    type = models.CharField(max_length=20, unique=True)
+    gain = models.IntegerField(max_length=3)
+
+    def __str__(self):
+        return self.type
+
+class Location(models.Model):
+    description = models.CharField(max_length=200, unique=True)
+    Longitude = models.DecimalField(max_digits=8,decimal_places=6)
+    Latitude = models.DecimalField(max_digits=8,decimal_places=6)
+
+    def __str__(self):
+        return self.description
+
+
+#XXX: Name Domain perhaps?
+class DnsServer(models.Model):
+	ipaddress = models.IPAddressField()
+	domainname = models.CharField(max_length=50, unique=True)
+
+	def __str__(self):
+		return self.ipaddress
+
+class Network(models.Model):
+	name = models.CharField(max_length=50, unique=True)
+	ipspacestart = models.IPAddressField()
+	netmask = models.IntegerField()
+
+	def __str__(self):
+		return self.name
+
+
+class Node(models.Model):
+    name = models.CharField(max_length=30, unique=True)
+    location = models.ForeignKey(Location)
+    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default=1)
+    masterip = models.IPAddressField(unique=True)
+    network = models.ForeignKey(Network,default=1)
+ 
+    class Meta:
+         ordering = ['name']
+
+    def __str__(self):
+        return self.name
+
+class Interface(models.Model):
+	node = models.ForeignKey(Node)
+	type = models.CharField(max_length=10, choices=INTERFACE_TYPE_CHOICES)
+	iface = models.CharField(max_length=10, verbose_name="interface")
+	ip = models.IPAddressField(unique=True)
+	netmask = models.IntegerField(default=30)
+	polar = models.CharField(blank=True, max_length=10, choices=POLAR_CHOICES)
+	ssid = models.CharField(max_length=30, blank=True, null=True)
+	mode = models.CharField(max_length=10, choices=WIFI_MODE_CHOICES)
+	channel = models.IntegerField(blank=True, null=True)
+	antenna = models.ForeignKey(Antenna, blank=True, null=True)
+	shortdesc = models.CharField(blank=True, max_length=10)
+	desc = models.CharField(blank=True, max_length=100)
+	link = models.ForeignKey('self', blank=True, null=True)
+	
+	class Meta:
+		unique_together = ('node', 'iface')
+	
+	def __str__(self):
+		return "%s:%s" % (self.node.name, self.iface)
+
+class InterfaceAlias(models.Model):
+	iface = models.ForeignKey(Interface,related_name='child')
+	ip = models.IPAddressField(unique=True)
+	netmask = models.IntegerField(default=30)
+	shortdesc = models.CharField(blank=True, max_length=10)
+	desc = models.CharField(blank=True, max_length=100)
+	linkAlias = models.ForeignKey('self', blank=True, null=True)
+	link = models.ForeignKey(Interface, blank=True, null=True)
+	
+	def __str__(self):
+		return "Alias %s" % (self.iface)
+
+class PublicAP(models.Model):
+    iface = models.ForeignKey(Interface)
+    ip = models.IPAddressField(unique=True)
+    netmask = models.IntegerField(default=30)
+    dhcpstart = models.IPAddressField()
+    dhcpstop = models.IPAddressField()
+    shortdesc = models.CharField(max_length=10)
+    desc = models.CharField(max_length=100)
+
+    def __str__(self):
+        return "%s" % (self.shortdesc)
+
+class DhcpStatic(models.Model):
+    hostname = models.CharField(max_length=10,unique=True)
+    macaddress = models.CharField(max_length=17)
+    address = models.IPAddressField()
+    PublicAP = models.ForeignKey(PublicAP)
+
+    def __str__(self):
+        return self.hostname
Index: /trunk/exodus/sql/antenna.sql
===================================================================
--- /trunk/exodus/sql/antenna.sql	(revision 6311)
+++ /trunk/exodus/sql/antenna.sql	(revision 6311)
@@ -0,0 +1,7 @@
+INSERT INTO exodus_antenna VALUES ( 1, 'Omni','6');
+INSERT INTO exodus_antenna VALUES ( 2, 'SD9','9');
+INSERT INTO exodus_antenna VALUES ( 3, 'SD15','15');
+INSERT INTO exodus_antenna VALUES ( 4, 'SD19','19');
+INSERT INTO exodus_antenna VALUES ( 5, '2020','??');
+INSERT INTO exodus_antenna VALUES ( 6, '4040','??');
+INSERT INTO exodus_antenna VALUES ( 7, '8080','??');
Index: /trunk/exodus/sql/dnsserver.sql
===================================================================
--- /trunk/exodus/sql/dnsserver.sql	(revision 6311)
+++ /trunk/exodus/sql/dnsserver.sql	(revision 6311)
@@ -0,0 +1,4 @@
+INSERT INTO exodus_DnsServer VALUES ( 1, '172.17.8.68', 1);
+INSERT INTO exodus_DnsServer VALUES ( 2, '172.17.143.4', 1);
+INSERT INTO exodus_DnsServer VALUES ( 3, '172.20.128.98', 1);
+INSERT INTO exodus_DnsServer VALUES ( 4, '172.27.129.66', 1);
Index: /trunk/exodus/sql/linktype.sql
===================================================================
--- /trunk/exodus/sql/linktype.sql	(revision 6311)
+++ /trunk/exodus/sql/linktype.sql	(revision 6311)
@@ -0,0 +1,2 @@
+INSERT INTO exodus_linktype VALUES ( 1, 'interlink');
+INSERT INTO exodus_linktype VALUES ( 2, 'public');
Index: /trunk/exodus/sql/network.sql
===================================================================
--- /trunk/exodus/sql/network.sql	(revision 6311)
+++ /trunk/exodus/sql/network.sql	(revision 6311)
@@ -0,0 +1,2 @@
+INSERT INTO exodus_network VALUES ( 1, 'wleiden.net', '172.16.0.0',12);
+INSERT INTO exodus_network VALUES ( 2, 'wzoeterwoude.net', '172.27.0.0',16);
Index: /trunk/exodus/static/exodus.css
===================================================================
--- /trunk/exodus/static/exodus.css	(revision 6311)
+++ /trunk/exodus/static/exodus.css	(revision 6311)
@@ -0,0 +1,188 @@
+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("/exodus/static/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.menu2table a {
+       color : White;
+       }
+
+TD.menu2l {
+		background-image : url("/exodus/static/topmenu_left.png");
+		background-position : top;
+		width : 8px;
+		height : 25px;
+		}
+
+TD.menu2r {
+		background-image : url("/exodus/static/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("/exodus/static/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: /trunk/exodus/templates/404.html
===================================================================
--- /trunk/exodus/templates/404.html	(revision 6311)
+++ /trunk/exodus/templates/404.html	(revision 6311)
@@ -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: /trunk/exodus/templates/500.html
===================================================================
--- /trunk/exodus/templates/500.html	(revision 6311)
+++ /trunk/exodus/templates/500.html	(revision 6311)
@@ -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: /trunk/exodus/templates/README
===================================================================
--- /trunk/exodus/templates/README	(revision 6311)
+++ /trunk/exodus/templates/README	(revision 6311)
@@ -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: /trunk/exodus/templates/addinterlink.html
===================================================================
--- /trunk/exodus/templates/addinterlink.html	(revision 6311)
+++ /trunk/exodus/templates/addinterlink.html	(revision 6311)
@@ -0,0 +1,13 @@
+{% extends "exodus-template.html" %}
+
+{% block content %}
+
+<h1> add Link </h1>
+{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
+
+<form method="post" action=".">
+<table>{{ form.as_table }}</table>
+<input type="submit" value="submit">
+</form>
+
+{% endblock %}
Index: /trunk/exodus/templates/addlocation.html
===================================================================
--- /trunk/exodus/templates/addlocation.html	(revision 6311)
+++ /trunk/exodus/templates/addlocation.html	(revision 6311)
@@ -0,0 +1,12 @@
+{% extends "exodus-template.html" %}
+
+{% block content %}
+<h1>Create a location</h1>
+
+
+<form method="post" action=".">
+<table>{{ form.as_table }}</table>
+<input type="submit" value="submit">
+</form>
+
+{% endblock %}
Index: /trunk/exodus/templates/addnic.html
===================================================================
--- /trunk/exodus/templates/addnic.html	(revision 6311)
+++ /trunk/exodus/templates/addnic.html	(revision 6311)
@@ -0,0 +1,12 @@
+{% extends "exodus-template.html" %}
+
+{% block content %}
+<h1>Create a Interface</h1>
+{# XXX: Javascript to disable antenna details, when eth selected #}
+
+<form method="post" action=".">
+<table>{{ form.as_table }}</table>
+<input type="submit" value="submit">
+</form>
+
+{% endblock %}
Index: /trunk/exodus/templates/addnode.html
===================================================================
--- /trunk/exodus/templates/addnode.html	(revision 6311)
+++ /trunk/exodus/templates/addnode.html	(revision 6311)
@@ -0,0 +1,13 @@
+{% extends "exodus-template.html" %}
+
+{% block content %}
+
+<h1>Create a Node</h1>
+<h2><em> {{ message }} </em></h2>
+
+<form method="post" action=".">
+<table>{{ form.as_table }}</table>
+<input type="submit" value="submit">
+</form>
+
+{% endblock %}
Index: /trunk/exodus/templates/addomni.html
===================================================================
--- /trunk/exodus/templates/addomni.html	(revision 6311)
+++ /trunk/exodus/templates/addomni.html	(revision 6311)
@@ -0,0 +1,11 @@
+{% extends "exodus-template.html" %}
+
+{% block content %}
+<h1>Add an Omni</h1>
+
+<form method="post" action=".">
+<table>{{ form.as_table }}</table>
+<input type="submit" value="submit">
+</form>
+
+{% endblock %}
Index: /trunk/exodus/templates/delnode.html
===================================================================
--- /trunk/exodus/templates/delnode.html	(revision 6311)
+++ /trunk/exodus/templates/delnode.html	(revision 6311)
@@ -0,0 +1,12 @@
+{% extends "exodus-template.html" %}
+
+{% block content %}
+
+<h1>Create a Node</h1>
+
+<form method="post" action=".">
+<table>{{ form.as_table }}</table>
+<input type="submit" value="submit">
+</form>
+
+{% endblock %}
Index: /trunk/exodus/templates/dhcpd.conf
===================================================================
--- /trunk/exodus/templates/dhcpd.conf	(revision 6311)
+++ /trunk/exodus/templates/dhcpd.conf	(revision 6311)
@@ -0,0 +1,32 @@
+{% load network %}
+# The file is WirelessLeiden specific. Please make all changes in exodus
+#
+# Generated on {% now "G:i j-n-Y" %} 
+# by {{ object.host }}
+#
+# Node: {{ object.name }}
+# File: rc.local
+
+option domain-name "{{ object.network.domainname }}";
+
+default-lease-time 7200;
+max-lease-time 2592000;
+
+ddns-update-style none;
+
+option domain-name-servers {{ object.masterip }};
+
+{{object.interface.all}}
+
+{% for nic in object.interface_set.all %}
+	{% for omni in nic.omni.all %}
+# {{ omni.desc }}
+subnet {% network omni.ip omni.netmask %} netmask {{ omni.netmask|subnet }} {
+	range {{ omni.dhcpstart }} {{ omni.dhcpstop }};
+	option routers {{ omni.ip }};
+	option broadcast-address {% broadcast omni.ip omni.netmask %};
+	option subnet-mask {{ omni.netmask|subnet }};
+} {% endfor %}
+# {{ nic.desc }}
+subnet {% network nic.ip nic.netmask %} netmask {{ nic.netmask|subnet }} { not authoritative; }
+{% endfor %}
Index: /trunk/exodus/templates/exodus-template.html
===================================================================
--- /trunk/exodus/templates/exodus-template.html	(revision 6311)
+++ /trunk/exodus/templates/exodus-template.html	(revision 6311)
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<HTML>
+<HEAD>
+<TITLE>
+WirelessLeiden Exodus
+</TITLE>
+<link rel="stylesheet" href="{% url static path="exodus.css" %}" title="Default" type="text/css"> 
+</HEAD>
+<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="{% url static path="logo.png" %}" border=0></A><br>
+	  <img width="130" height="97" alt="foto" src="{% url static path="foto.jpg" %}"/><br>
+	  &nbsp;&nbsp;<A class="menu" href="{% url root %}">Exodus</a><br>
+	  &nbsp;&nbsp;<A class="menu" href="{% url nodelist %}">Node List</a><br>
+	  &nbsp;&nbsp;<A class="menu" href="{% url exodus.views.addLocation %}">Add Location</a><br>
+	  &nbsp;&nbsp;<A class="menu" href="{% url exodus.views.addNode %}">Add Node</a><br>
+	  &nbsp;&nbsp;<A class="menu" href="{% url exodus.views.addInterface %}">Add Interface</a><br>
+	  &nbsp;&nbsp;<A class="menu" href="{% url exodus.views.addPublicAP %}">Add PublicAP</a><br>
+	  &nbsp;<p>
+	</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; 2008</a> 
+	&nbsp;|&nbsp;<a class="disclaimer" href="#top">top</a>
+	</td>
+  </tr>
+</TABLE>
+</BODY>
+
+</HTML>
Index: /trunk/exodus/templates/head.html
===================================================================
--- /trunk/exodus/templates/head.html	(revision 6311)
+++ /trunk/exodus/templates/head.html	(revision 6311)
@@ -0,0 +1,39 @@
+<HTML>
+<TITLE>
+HTML test with a menu on the left side
+</TITLE>
+<link rel="stylesheet" href="/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="/exodus">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: /trunk/exodus/templates/index.html
===================================================================
--- /trunk/exodus/templates/index.html	(revision 6311)
+++ /trunk/exodus/templates/index.html	(revision 6311)
@@ -0,0 +1,25 @@
+{% 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.  
+<p />
+TODO: More documentation is being written. </br>
+</br>
+
+</p>
+<strong>This site is under construction and not fully operational.</strong></br>
+<br />
+For questions or remarks: <a href="mailto:techniek@lijst.wirelessleiden.nl?subject=exodus%20development">techniek@lijst.wirelessleiden.nl</a> Exodus code to be found in subversion at URL <a href="http://svn.wirelessleiden.nl/svn/code/exodus/">http://svn.wirelessleiden.nl/svn/code/exodus/</a>, please feel free to send patches or participate if needed.
+
+<p />
+Enjoy Exodus!
+<br />
+<a href="mailto:roland@wirelessleiden.nl">Roland</a> and <a href="mailto:rick@wirelessleiden.nl">Rick</a>
+
+{% endblock %}
Index: /trunk/exodus/templates/named.conf
===================================================================
--- /trunk/exodus/templates/named.conf	(revision 6311)
+++ /trunk/exodus/templates/named.conf	(revision 6311)
@@ -0,0 +1,47 @@
+# The file is WirelessLeiden specific. Please make all changes in exodus
+#
+# Generated on {% now "G:i j-n-Y" %} 
+# by {{ object.host }}
+#
+# Node: {{ object.name }}
+# File: named.conf 
+
+options {
+	directory "/etc/namedb";
+	pid-file "/var/run/named.pid";
+	forwarders {
+	{% for server in object.network.dnsserver_set.all %}
+	{{server.ipaddress }}; {% endfor %}
+	};
+};
+
+
+zone "." {
+	type hint;
+	file "/etc/namedb/named.root";
+};
+
+zone "0.0.127.IN-ADDR.ARPA" {
+	type master;
+	file "/etc/namedb/localhost.rev";
+};
+
+zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.INT" {
+	type master;
+	file "/etc/namedb/localhost-v6.rev";
+};
+
+{% for domain in object.domains %}
+
+zone "{{domain.domainname}}" {
+	type slave;
+	file "slave.{{domain.domainname}}";
+	masters {
+		{% for server in domain.dnsserver_set.all %}
+		{{ server.ipaddress }}; {% endfor %}
+	};
+};
+
+{% endfor %}
+
+
Index: /trunk/exodus/templates/node-detail.html
===================================================================
--- /trunk/exodus/templates/node-detail.html	(revision 6311)
+++ /trunk/exodus/templates/node-detail.html	(revision 6311)
@@ -0,0 +1,65 @@
+{% extends "exodus-template.html" %}
+
+{% block content %}
+
+<div style="border:1px solid #000000;">
+<h1> {{ object.name }} </h1>
+<h3> Location </h3>
+Description: {{ object.location.description }} <br>
+Longitude: {{ object.location.longitude }} <br>
+Latitude: {{ object.location.latitude }} <br>
+
+Master ip: {{ object.masterip }} <br>
+<a href="{% url exodus.views.editNode object %}">EDIT</a>
+</div>
+
+<h2>Interfaces</h2>
+<a href="{% url exodus.views.addInterface %}?node={{ object.name }}">Add new interface</a>
+
+{% for nic in object.interface_set.all %}
+	<p>
+	<div style="border:1px solid #000000;">
+	<h3>iface: {{ nic.iface }} </h3>
+	status: {{ nic.status }} <br>
+	type: {{ nic.type }} <br>
+	description: {{ nic.shortdesc }} <br>
+	
+	{% ifnotequal nic.type "eth" %}
+		SSID: {{ nic.ssid }} <br>
+		Channel: {{ nic.channel }} <br>
+		Antenna: {{ nic.antenna }} <br>
+		Polar: {{ nic.polar }} <br>	
+		Mode: {{ nic.mode }} <br>
+	{% endifnotequal %}
+	<a href="{% url exodus.views.editInterface nic %}">EDIT</a>
+	</div>
+
+	{% for interlink in nic.link.interface_set.all %}
+		{% ifnotequal interlink nic %}
+		<ul>
+		<li>Interlink FOR DEBUG PURPOSES</li>
+		<li>Link Name: {{ interlink }}</li>
+		<li>Short description: {{ interlink.shortdesc }} </li>
+		<li>Long description: {{ interlink.desc }} </li> 
+		<li>IP: {{ interlink.ip }}/{{ interlink.netmask }} </li>
+		<li> Link to Node: <a href=../../{{ interlink.node }}/node/>
+			{{ interlink.node }}</a> </li>
+		</ul>
+		{% endifnotequal %}
+	{% endfor %}
+	
+	
+	{% for omni in nic.omni.all %}
+		<ul>
+		<li>DHCP {{ omni.dhcpstart }}-{{ omni.dhcpstop }}</li>
+		{% for dhcp in omni.dhcpstatic.all %}
+			<ul>
+			    <li>Hostname: {{ dhcp.hostname }} </li>
+			    <li>MacAddress: {{ dhcp.macaddress }} </li>
+			</ul>
+		{% endfor %}
+		</ul>
+	{% endfor %}
+{% endfor %}
+
+{% endblock %}
Index: /trunk/exodus/templates/node-list.html
===================================================================
--- /trunk/exodus/templates/node-list.html	(revision 6311)
+++ /trunk/exodus/templates/node-list.html	(revision 6311)
@@ -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="{% url node-detail object.name %}">{{ object.name }}</a></td>
+            <td><a href="{% url exodus.views.conf_dhcpd_conf object.name %}">dhcpd.conf</a></td>
+            <td><a href="{% url exodus.views.conf_named_conf object.name %}">named.conf</a></td>
+            <td><a href="{% url exodus.views.conf_rc_node_local object.name %}">rc.node.local</a></td>
+            <td><a href="{% url exodus.views.conf_resolv_conf object.name %}">resolv.conf</a></td>
+		</tr>
+
+    {% endfor %}
+	</table>
+{% else %}
+    <p class="blue"> No nodes are available </p>
+{% endif %}
+
+{% endblock %}
+
Index: /trunk/exodus/templates/rc-local.txt
===================================================================
--- /trunk/exodus/templates/rc-local.txt	(revision 6311)
+++ /trunk/exodus/templates/rc-local.txt	(revision 6311)
@@ -0,0 +1,20 @@
+# The file is WirelessLeiden specific. Please make all changes in exodus
+#
+# Generated on {% now "G:i j-n-Y" %} 
+# 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: /trunk/exodus/templates/rc-node-local.txt
===================================================================
--- /trunk/exodus/templates/rc-node-local.txt	(revision 6311)
+++ /trunk/exodus/templates/rc-node-local.txt	(revision 6311)
@@ -0,0 +1,23 @@
+# The file is WirelessLeiden specific. Please make all changes in exodus
+#
+# Generated on {% now "G:i j-n-Y" %} 
+# 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 %}
+
+ifconfig {{nic.iface}} {{nic.ip}}/{{nic.netmask}}
+{% endfor %}
+
Index: /trunk/exodus/templates/resolv.conf
===================================================================
--- /trunk/exodus/templates/resolv.conf	(revision 6311)
+++ /trunk/exodus/templates/resolv.conf	(revision 6311)
@@ -0,0 +1,19 @@
+# The file is WirelessLeiden specific. Please make all changes in exodus
+# next door interlink nighboors to be specified, in case of own DNS failures
+#
+# Generated on {% now "G:i j-n-Y" %} 
+# by {{ object.host }}
+#
+# Node: {{ object.name }}
+# File: resolv.conf
+
+nameserver 127.0.0.1 #localhost
+{% spaceless %}
+{% for interface in object.interface_set.all %}
+	{% for interlink in interface.interface_set.all %}
+		{% ifnotequal interlink interface %}
+nameserver {{ interlink.ip }} # {{ interlink.node }}
+		{% endifnotequal %} 
+	{% endfor %} 
+{% endfor %}
+{% endspaceless %}
Index: /trunk/exodus/templates/test.html
===================================================================
--- /trunk/exodus/templates/test.html	(revision 6311)
+++ /trunk/exodus/templates/test.html	(revision 6311)
@@ -0,0 +1,1 @@
+HEY check if this works
Index: /trunk/exodus/templatetags/network.py
===================================================================
--- /trunk/exodus/templatetags/network.py	(revision 6311)
+++ /trunk/exodus/templatetags/network.py	(revision 6311)
@@ -0,0 +1,42 @@
+from django import template
+from django.template import resolve_variable
+from exodus import wllogic
+
+register = template.Library()
+
+class NetworkNode(template.Node):
+	def __init__(self, address, subnet):
+		self.address = address
+		self.subnet = subnet
+	def render(self, context):
+		return (wllogic.getNetwork(resolve_variable(self.address, context),resolve_variable(self.subnet,context)))
+
+class BroadcastNode(template.Node):
+	def __init__(self, address, subnet):
+		self.address = address
+		self.subnet = subnet
+	def render(self, context):
+		return (wllogic.getBroadcast(resolve_variable(self.address, context),resolve_variable(self.subnet,context)))
+
+@register.tag
+def network(parser, token):
+    try:
+        # split_contents() knows not to split quoted strings.
+        tag_name, address, subnet = token.split_contents()
+    except ValueError:
+        raise template.TemplateSyntaxError, "%r tag requires a two arguments" % token.contents.split()[0]
+    return NetworkNode(address, subnet)
+
+@register.tag
+def broadcast(parser, token):
+    try:
+        # split_contents() knows not to split quoted strings.
+        tag_name, address, subnet = token.split_contents()
+    except ValueError:
+        raise template.TemplateSyntaxError, "%r tag requires a two arguments" % token.contents.split()[0]
+    return BroadcastNode(address, subnet)
+
+@register.filter
+def subnet(value):
+	return wllogic.getSubnet(value)
+
Index: /trunk/exodus/urls.py
===================================================================
--- /trunk/exodus/urls.py	(revision 6311)
+++ /trunk/exodus/urls.py	(revision 6311)
@@ -0,0 +1,63 @@
+# (c) Roland van Laar
+
+from django.conf.urls.defaults import *
+from exodus.models import *
+from os import path as os_path
+from django.conf import settings
+
+## experimental databrowse code
+
+from django.contrib import databrowse
+databrowse.site.register(Antenna)
+databrowse.site.register(Location)
+databrowse.site.register(DnsServer)
+databrowse.site.register(Network)
+databrowse.site.register(Node)
+databrowse.site.register(Interface)
+databrowse.site.register(PublicAP)
+databrowse.site.register(DhcpStatic)
+
+node_dict  = {
+    'queryset': Node.objects.all(),
+}
+
+urlpatterns = patterns('',
+
+	# databse thingy
+	(r'^databrowse/(.*)', databrowse.site.root),
+
+	# views
+	url(r'^$', 'django.views.generic.simple.direct_to_template', {'template': 'index.html'}, "root") ,
+	url(r'^nodelist/$', 'django.views.generic.list_detail.object_list', dict(node_dict, template_name='node-list.html'), "nodelist"),
+	url(r'^view/node/(?P<slug>.+)/$', 'django.views.generic.list_detail.object_detail', dict(node_dict,slug_field='name',template_name='node-detail.html'), "node-detail"),
+
+	# config urls
+	(r'^config/freebsd-5.0/(?P<object_id>.+)/dhcpd.conf$', 'exodus.views.conf_dhcpd_conf'),
+	(r'^config/freebsd-5.0/(?P<object_id>.+)/named.conf$', 'exodus.views.conf_named_conf'),
+	(r'^config/freebsd-5.0/(?P<object_id>.+)/rc.node.local$', 'exodus.views.conf_rc_node_local'),
+	(r'^config/freebsd-5.0/(?P<object_id>.+)/resolv.conf$', 'exodus.views.conf_resolv_conf'),
+
+
+	# add urls
+	(r'^add/location/$', 'exodus.views.addLocation'),
+	(r'^add/node/$', 'exodus.views.addNode'),
+	(r'^add/nic/$', 'exodus.views.addInterface'),
+	(r'^add/dhcp/$', 'exodus.views.addPublicAP'),
+
+	# add urls
+	(r'^edit/location/(?P<object_id>.+)/$', 'exodus.views.addLocation'),
+	(r'^edit/node/(?P<objectId>.+)/$', 'exodus.views.editNode'),
+	(r'^edit/nic/(?P<objectId>.+)/$', 'exodus.views.editInterface'),
+	(r'^edit/interlink/(?P<object_id>.+)/$', 'exodus.views.addLink'),
+	(r'^edit/dhcp/(?P<object_id>.+)/$', 'exodus.views.addPublicAP'),
+
+	# delete/remove urls
+	(r'^delete/node/(?P<object_id>.+)$', 'exodus.views.delnode'),
+	(r'^delete/link/(?P<object_id>.+)$', 'exodus.views.delnode'),
+)
+
+if settings.DEBUG:
+	urlpatterns += patterns('',
+	url(r'^static/(?P<path>.*)$$', 'django.views.static.serve', {'document_root': 
+	 settings.DJANGOROOT + '/exodus/static'}, "static"),
+	)
Index: /trunk/exodus/views.py
===================================================================
--- /trunk/exodus/views.py	(revision 6311)
+++ /trunk/exodus/views.py	(revision 6311)
@@ -0,0 +1,276 @@
+# (c) Roland van Laar 2006
+
+from django.db import models
+from django.http import HttpResponse, HttpResponseRedirect
+from django.template import loader, Context 
+from django.shortcuts import render_to_response
+from django.core.urlresolvers import reverse
+from django.forms.formsets import formset_factory
+from django import forms
+from socket import gethostname 
+
+from exodus.models import *
+from exodus.wllogic import freemasterip, newSSIDName, freeinterlinkip
+
+class AddLocationForm(forms.ModelForm):
+	class Meta:
+		model = Location
+
+def addLocation(request):
+	if request.POST:
+		form = AddLocationForm(request.POST)
+		if form.is_valid():
+			form.save()
+			return HttpResponseRedirect(reverse('exodus.views.addNode'))
+	else:
+		form = AddLocationForm()
+	return render_to_response('addlocation.html', {'form': form })
+
+class AddNodeForm(forms.ModelForm):
+	class Meta:
+		model = Node
+		exclude = ( 'masterip' )
+
+def addNode(request):
+	if request.POST:
+		form = AddNodeForm(request.POST)
+		if form.is_valid():
+			# input a valid master ip into new_data
+			instance  = form.save(commit=False)
+			instance.masterip = freemasterip()
+			instance.save()
+			return HttpResponseRedirect(reverse('nodelist'))
+	else:
+		form = AddNodeForm()
+	return render_to_response('addnode.html', {'form': form })
+
+def editNode(request, objectId):
+	node = Node.objects.get(name=objectId)
+	if request.POST:
+		form = AddNodeForm(request.POST, instance=node)
+		if form.is_valid():
+			form.save()
+			#Properly redirect to view/<Node> needed
+			message = 'Node Updated succesfully'
+			return HttpResponseRedirect(reverse('node-detail', args=[objectId]))
+		else:
+			message = 'Form error, please edit and resubmit'
+	else:
+		message = 'Please edit and submit'
+		form = AddNodeForm(instance=node)
+	return render_to_response('addnode.html', {'form': form, 'message' : message })
+
+
+def delnode(request):
+	if request.POST:
+		form = AddNodeForm(request.POST)
+		if form.is_valid():
+			# input a valid master ip into new_data
+			instance  = form.save(commit=False)
+			instance.masterip = freemasterip()
+			instance.save()
+			return HttpResponseRedirect(reverse('nodelist'))
+	else:
+		form = AddNodeForm()
+	return render_to_response('delnode.html', {'form': form })
+
+class addInterfaceForm(forms.ModelForm):
+	class Meta:
+		model = Interface
+		exclude = ( 'ip', 'ssid', 'mode', 'channel', 'shortdesc' )
+
+def saveInterface(form):
+	instance  = form.save(commit=False)
+	if str(instance.type) != "eth":
+		instance.ssid = newSSIDName(instance.node, instance.iface, 'unused')
+		instance.channel = '1'
+		instance.mode = 1 # set to master
+	if instance.link == None:
+		instance.link = instance
+	#XXX: Needs to be dynamic, using some logic
+	instance.ip = '172.16.0.1'
+	instance.save()
+
+def addInterface(request):
+	if request.POST:
+		form = addInterfaceForm(request.POST)
+		if form.is_valid():
+			saveInterface(form)
+			nodeName = Node.objects.get(pk=request.POST['node' ]).name
+			return HttpResponseRedirect(reverse('node-detail', args=[nodeName]))
+	else:
+		#XXX: Link, master interfaces only
+		if 'node' in request.GET:
+			newInterface = Interface()
+			newInterface.node = Node.objects.get(name=request.GET['node'])
+			form = addInterfaceForm(instance=newInterface)
+		else:
+			form = addInterfaceForm()
+	return render_to_response('addnic.html', {'form': form })
+
+def editInterface(request, objectId):
+	nodeName, interfaceName = objectId.split(':')
+	interface = Interface.objects.get(iface=interfaceName, node=nodename2id(nodeName))
+	if request.POST:
+		form = addInterfaceForm(request.POST, instance=interface)
+		if form.is_valid():
+			saveInterface(form)
+			return HttpResponseRedirect(reverse('node-detail', args=[nodeName]))
+	else:
+		#XXX: Link, master interfaces only
+		form = addInterfaceForm(instance = interface)
+	return render_to_response('addnic.html', {'form': form })
+
+class addLinkForm(forms.Form):
+	class Meta:
+		model = Node
+		exclude = ( 'shortdesc', 'desc' )
+
+def addLink(request):
+	if request.POST:
+		form = addLinkForm(request.POST)
+		if form.is_valid():
+			instance = form.save(commit=False)
+			# Get this code working and clean it up afterwards
+			# check if we have two different ifaces from two different nodes
+			# Should add a error message if they are from the same node
+			compatibleInterfaces = False
+			differentNodes = True
+			errorMessage = ""
+			
+			# check if they have the same mode
+			if instance.iface1.node.id == instance.iface2.node.id:
+				differentNodes = False
+			
+			# Interface check
+			# XXX: Make sure interfaces type is defined as beeing a certain type instead of hardcoding
+			if instance.iface1.type == instance.iface2.type:
+				compatibleInterfaces = True
+			if str(instance.iface1.type) == '11b' and str(instance.iface2.type) == '11g':
+				compatibleInterfaces = True
+			if str(instance.iface1.type) == '11g' and str(instance.iface2.type) == '11b':
+				compatibleInterfaces = True
+			
+			if compatibleInterfaces and differentNodes:
+				instance.save()
+				return HttpResponseRedirect(reverse('nodelist'))
+			else:
+				form = addLinkForm(instance = instance)
+				if compatibleInterfaces == False:
+					errorMessage = "Please use compatible interfaces"
+				elif differentNodes == False:
+					errorMessage = "No interlink possible between interfaces on the same node"
+				
+				return render_to_response('addinterlink.html',{'form': form, 'error_message' : errorMessage })
+			#XXX :if wifi: check master and managed states for existings NICs/Interlinks
+			#XXX :check if omni, than Nic must be in master mode
+			#Generate SSID
+			# add descriptions
+			#Generate ips and netmask
+			#Save form
+	else:
+		#XXX: Autofetch new IP numbers
+		newForm = Link()
+		form = addLinkForm(instance = newForm)
+	return render_to_response('addinterlink.html',{'form': form})
+
+class addPublicAPForm(forms.ModelForm):
+	class Meta:
+		model = PublicAP
+		exclude = ('shortdesc', 'desc')
+
+def addPublicAP(request):
+	if request.POST:
+		form = addPublicAPForm(request.POST)
+		if form.is_valid():
+			instance = form.save(commit=False)
+			instance.ssid = newSSIDName(instance.iface.node, instance.iface, 'omni')
+			instance.save()
+			return HttpResponseRedirect(reverse('nodelist'))
+	else:
+		form = addPublicAPForm()
+	return render_to_response('addomni.html', {'form': form })
+
+def nodename2id(node):
+	"""Convert node name to ID if found in the database"""
+	return Node.objects.get(name=node).id
+
+def conf_generator(node, template):
+	object_id = nodename2id(node)
+	object = Node.objects.get(pk=object_id)
+
+	#Some extra values for statictics info
+	object.name = Node.objects.get(pk=object_id).name
+	object.host = gethostname()
+#	object.nic = object.nic_set.all()
+	
+	#Used for named.conf
+	object.domains = Network.objects.all()
+
+	t = loader.get_template(template)
+	c = Context({'object': object})
+	return HttpResponse(t.render(c), mimetype='text/plain')
+
+def conf_dhcpd_conf(request, object_id):
+	"""isc-dhcpd-3-server conf generator"""
+	return conf_generator(object_id, 'dhcpd.conf')
+
+def conf_named_conf(request, object_id):
+	"""bind conf generator"""
+	return conf_generator(object_id, 'named.conf')
+
+def conf_rc_local(request, object_id):
+    """5.X legacy rc.local conf generator"""
+
+    object_id = nodename2id(object_id)
+    object = Node.objects.get(pk=object_id)
+    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('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_id = nodename2id(object_id)
+
+	object.name = Node.objects.get(pk=object_id).name
+	object.host = gethostname()
+
+	t = loader.get_template('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_id = nodename2id(object_id)
+	
+	object = Node.objects.get(pk=object_id).interface_set.all()
+	object.name = Node.objects.get(pk=object_id).name
+	object.host = gethostname()
+
+	t = loader.get_template('rc-node-local.txt')
+	c = Context({'object': object, })
+
+	print c
+	return HttpResponse(t.render(c), mimetype='text/plain')
+
+
+def conf_resolv_conf(request, object_id):
+	"""resolv.conf generator"""
+	return conf_generator(object_id, 'resolv.conf')
+
Index: /trunk/exodus/wllogic.py
===================================================================
--- /trunk/exodus/wllogic.py	(revision 6311)
+++ /trunk/exodus/wllogic.py	(revision 6311)
@@ -0,0 +1,81 @@
+# (c) Roland van Laar
+
+from exodus.models import Node, Network
+
+def newSSIDName(node, nic, desc):
+	"""Generates a new ssid name for a new wifi NIC"""
+
+	# nic is used instead of nic.iface, because string nic is passed on, 
+	# instead of object nic.
+
+	return "%s-%s.%s.%s" % (desc, nic, node.name, node.network.name)
+
+#
+# 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 netmask2subnet(s):
+	"""IPv4 netmask to subnet"""
+	return (0xffffffff << (32 - s))
+
+def getSubnet(netmask):
+	return(showaddr(netmask2subnet(netmask)))
+
+def network(address, netmask):
+	"""IPv4 network address when address and netmask are given"""
+	return(parseaddr(address) & netmask2subnet(netmask))
+
+def broadcast(address, netmask):
+	"""IPv4 network address when address and netmask are given"""
+	return(parseaddr(address) | 0xffffffff >> netmask)
+
+def getNetwork(address, netmask):
+	return(showaddr(network(address,netmask)))
+
+def getBroadcast(address, netmask):
+	return(showaddr(broadcast(address,netmask)))
+
+
+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)
+
+def freeinterlinkip():
+	taken = {}
+	
+	#add all interlink ipaddresses in taken[]
+	for link in Interlink.objects.all():
+		addr = parseaddr(link.ip1)
+		taken[addr] = 1
+		addr = parseaddr(link.ip2)
+		taken[addr] = 1
+	
+	size = 30
+	numaddrs = 1 << (32 -size)
+	i = 0xAC100001L
+	while taken.has_key(i):
+		print showaddr(i)
+		i = i + numaddrs
+	ips = [showaddr(i), showaddr(i+1)]	
+	return ips
Index: /trunk/sampleserver/manage.py
===================================================================
--- /trunk/sampleserver/manage.py	(revision 6311)
+++ /trunk/sampleserver/manage.py	(revision 6311)
@@ -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: /trunk/sampleserver/settings.py
===================================================================
--- /trunk/sampleserver/settings.py	(revision 6311)
+++ /trunk/sampleserver/settings.py	(revision 6311)
@@ -0,0 +1,66 @@
+# Django settings for exodus project.
+import os
+
+DJANGOROOT= os.path.join(os.path.dirname(__file__), '..')
+
+DEBUG = True
+TEMPLATE_DEBUG = DEBUG
+
+ADMINS = (
+    ('Administrator', 'admin@example.org'),
+)
+
+MANAGERS = ADMINS
+
+DATABASE_ENGINE = 'sqlite3'           # 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.
+DATABASE_NAME = DJANGOROOT + '/sqllite.db' # 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
+
+# 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 = 'sampleserver.urls'
+
+TEMPLATE_DIRS = (
+    # Put strings here, like "/home/html/django_templates".
+    # Always use forward slashes, even on Windows.
+)
+
+INSTALLED_APPS = (
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.sites',
+    'django.contrib.admin',
+	'django.contrib.databrowse',
+	'extensions',
+    'exodus',
+)
Index: /trunk/sampleserver/urls.py
===================================================================
--- /trunk/sampleserver/urls.py	(revision 6311)
+++ /trunk/sampleserver/urls.py	(revision 6311)
@@ -0,0 +1,15 @@
+# (c) Roland van Laar
+from django.conf.urls.defaults import *
+
+from django.contrib import admin
+admin.autodiscover()
+
+urlpatterns = patterns('',
+	(r'^exodus/', include('exodus.urls')),
+	#The next line enables admin documents
+    (r'^admin/doc/', include('django.contrib.admindocs.urls')),
+
+	# Uncomment the next line for to enable the admin:
+	(r'^admin/(.*)', admin.site.root),
+
+)
