diff --git a/wifiweb/bornes.py b/wifiweb/bornes.py
new file mode 100755
index 00000000..d87df713
--- /dev/null
+++ b/wifiweb/bornes.py
@@ -0,0 +1,176 @@
+#! /usr/bin/env python
+# -*- coding: iso-8859-15 -*-
+
+import cgi, sys, os, sha, time
+from html import html
+from session import session
+from utilisateurs import users
+
+sys.path.append('/usr/scripts/gestion')
+from ldap_crans import crans_ldap
+db = crans_ldap()
+
+######################################################
+# fontion pour logguer un truc
+def log (message) :
+ f = open('/var/log/wifiweb.log','a+')
+ f.write( time.strftime('%d/%m/%Y %H:%M:%S',time.localtime(time.time())) + ' ' + message + '\n')
+ f.close()
+
+######################################################
+# initialisation des variables
+
+# initialisation de la page html
+page = html()
+page.sendheaderstobrowser()
+page.titre("Gestion des bornes wifi")
+
+# récupération des données du formulaire
+form = cgi.FieldStorage()
+sid = form.getvalue('sid')
+action = form.getvalue('action','auth')
+
+# création de la session
+try :
+ sess = session(sid)
+except :
+ sess = session()
+sid = sess.sid
+
+######################################################
+# authentification
+
+if action == 'valid-auth' :
+ sess.data['user'] = form.getvalue('user','')
+ sess.data['password'] = sha.new(form.getvalue('password','')).hexdigest()
+ if users.has_key( sess.data['user'] + ':' + sess.data['password'] ) :
+ log(sess.data['user'] + ' s\'est connecté' )
+ action = 'liste'
+
+if action != 'auth' :
+ try :
+ if not users.has_key( sess.data['user'] + ':' + sess.data['password'] ) :
+ log(sess.data['user'] + ' mauvais user/pass' )
+ raise ValueError, 'Mauvais user/pass'
+ bornes = users[ sess.data['user'] + ':' + sess.data['password'] ]
+ except :
+ page.add('Erreur d\'authentification !
')
+ log(sess.data['user'] + ' erreur d\'authentification' )
+ action = 'auth'
+
+######################################################
+# page : authentification
+
+if action == 'auth' :
+ page.add("""
+
+
+""" % sid )
+
+######################################################
+# désactivation d'un borne
+
+if action == 'desactive' :
+ if form.getvalue('borne','') in bornes :
+ log(sess.data['user'] + ' a désactivé %s' % form.getvalue('borne','') )
+ page.add('La borne %s sera désactivée dans quelques instants
' % form.getvalue('borne','') )
+ borne = db.search('host=%s.wifi.crans.org' % form.getvalue('borne',''), 'w' )['machine'][0]
+ if int(borne.puissance()) > 0 :
+ borne.puissance(-int(borne.puissance()))
+ borne.save()
+ else :
+ log(sess.data['user'] + ' a tenté de désactiver %s' % form.getvalue('borne','') )
+ page.add('Vous n\'êtes pas authorisé à modifier la borne %s
' % form.getvalue('borne','') )
+ action = 'liste'
+
+######################################################
+# activation d'un borne
+
+if action == 'active' :
+ if form.getvalue('borne','') in bornes :
+ log(sess.data['user'] + ' a activé %s' % form.getvalue('borne','') )
+ page.add('La borne %s sera réactivée dans quelques instants
' % form.getvalue('borne','') )
+ borne = db.search('host=%s.wifi.crans.org' % form.getvalue('borne',''),'w' )['machine'][0]
+ if int(borne.puissance()) < 0 :
+ borne.puissance(int(borne.puissance().replace('-','')))
+ borne.save()
+ else :
+ log(sess.data['user'] + ' a tenté d\'activer %s' % form.getvalue('borne','') )
+ page.add('Vous n\'êtes pas authorisé à modifier la borne %s
' % form.getvalue('borne','') )
+ action = 'liste'
+
+######################################################
+# page : liste des bornes
+
+if action == 'liste' :
+ page.sous_titre('Liste des bornes')
+
+ for b in bornes :
+ borne = db.search('host=%s.wifi.crans.org' % b)['machine'][0]
+
+ # formulaire
+ page.add('')
+
+ # bouton quitter
+ page.add("""
+
+
+""" % (sid, sid) )
+
+######################################################
+# page : logout
+
+if action == 'logout' :
+ log(sess.data['user'] + ' s\'est déconnecté' )
+ page.sous_titre('Seen you soon')
+ sess.destroy()
+
+######################################################
+# fin du script
+page.sendtobrowser()
diff --git a/wifiweb/html.py b/wifiweb/html.py
new file mode 100755
index 00000000..028bcc57
--- /dev/null
+++ b/wifiweb/html.py
@@ -0,0 +1,101 @@
+#! /usr/bin/env python
+# -*- coding: iso-8859-15 -*-
+
+class html :
+
+ def __init__ (self) :
+ self._titre = ''
+ self._sous_titre = ''
+ self._corp = ''
+ self._refresh = 0
+
+ def titre(self, titre = None) :
+ """ Définit ou retourne le titre """
+ if titre != None :
+ self._titre = titre
+ return self._titre
+
+ def sous_titre (self, sous_titre = None) :
+ """ Définit ou retourne le sous titre """
+ if sous_titre != None :
+ self._sous_titre = sous_titre
+ return self._sous_titre
+
+ def refresh (self, refresh = None) :
+ """ Définit ou retourne la durée du refresh """
+
+ if _refresh != None :
+ self._refresh = _refresh
+ return self._refresh
+
+ def corp (self, corp = None) :
+ """ Définit ou retourne le contenu du corp """
+ if corp != None :
+ self._corp = corp
+ return self._corp
+
+ def add (self, string) :
+ """ Ajoute une ligne au corp de la page """
+ self._corp += string + "\n"
+
+ def make (self) :
+ """ Génère la page HTML finiale """
+
+ page = ""
+
+ page += "\n"
+ page += "\n"
+
+ # en-têtes de la page
+ #####################
+
+ page += "\n"
+ page += " %s\n" % self._titre
+ if self._refresh :
+ page += " \n" % str(self._refresh)
+ page += " \n"
+ page += "\n\n"
+
+ # début du corp de la page
+ ##########################
+
+ page += "\n"
+ page += "
\n\n"
+
+ # division du titre
+ page += "\n"
+ page += "%s\n" % self._titre
+ page += "
\n\n"
+
+ # division du sous titre
+ page += "\n"
+ page += "%s\n" % self._sous_titre
+ page += "
\n\n"
+
+ # division du contenu
+ page += "\n"
+ page += self._corp.encode('iso-8859-15')
+ page += "
\n\n"
+
+ # fin de la page
+ ################
+
+ page += "\n"
+ page += "\n"
+
+ return page
+
+ def sendheaderstobrowser (self) :
+ """ Envoie les entetes au navigateur """
+ print "content-type: text/html"
+ print
+
+ def sendtobrowser (self) :
+ """ Envoie la page au navigateur """
+ print self.make()
+
+ def savetofile (self, fichier) :
+ """ Enregistre la page dans un fichier """
+ f = open(fichier,'w')
+ f.write( self.make() )
+ f.close()
diff --git a/wifiweb/session.py b/wifiweb/session.py
new file mode 100755
index 00000000..2f8e22ae
--- /dev/null
+++ b/wifiweb/session.py
@@ -0,0 +1,91 @@
+#! /usr/bin/env python
+# -*- coding: iso-8859-15 -*-
+
+import os, random
+from time import time
+
+class session :
+
+ def __init__ (self, sid = None) :
+ """
+ Si sid est fournit, on regarde si la session est valide ;
+ on soulève un exeption si il y a un problème
+
+ Si sid n'est pas fourni un créé une nouvelle session
+ """
+ self.save = True
+
+ if sid :
+
+ # on vérifie la validité
+ if not os.access( self._sess_file(sid), os.W_OK ) :
+ raise ValueError, 'Session inconnue'
+
+ # on exporte le sid
+ self.sid = sid
+
+ # on lit les données
+ self.data = {}
+ f = open(self._sess_file(sid))
+ for i in f.readlines() :
+ if not i.strip() :
+ continue
+ key = i.split(' ')[0]
+ value = ' '.join(i.split(' ')[1:]).strip()
+ self.data[key] = value
+
+ if int(self.data['perime']) < int(time()) :
+ self.destroy()
+ raise ValueError, 'Session périmée'
+
+ else :
+
+ # on créé un nouveau sid
+ self.data = {}
+ ok = False
+ while not ok :
+ sid = ''.join( [ random.choice('abcdefghijklmnopqrstuvwxyz0123456789') for i in range(0,30) ])
+ # est ce que la session existe ?
+ if not os.path.exists(self._sess_file(sid)) :
+ # on créé un nouveau fichier avec un timeout de 60
+ f = os.open(self._sess_file(sid), os.O_WRONLY + os.O_CREAT , 0600)
+ f
+ # on valide
+ ok = True
+ self.sid = sid
+
+ # on initialise les données
+ self.data = {'timeout' : '600'}
+
+ def _sess_file (self, sid = None) :
+ """ Retourne le nom du fichier correspondant à la session """
+ if not sid :
+ sid = self.sid
+ return '/tmp/pysession-%s' % sid
+
+ def __del__ (self) :
+ """ On enregsitre la session à la destruction de l'instance """
+
+ if self.save :
+ # epok de peromption
+ self.data['perime'] = str(int(time() + int(self.data['timeout'])))
+
+ f = open(self._sess_file(), 'w')
+ for k in self.data.keys() :
+ f.write( '%s %s\n' % (k,self.data[k]) )
+ f.close()
+
+ def destroy(self) :
+ """ Supprime la session """
+ self.save = False
+ os.remove( self._sess_file() )
+
+# on supprime toutes les vieilles sessions
+for file in os.listdir('/tmp') :
+ if file[0:10] == 'pysession-' :
+ #print file[10:]
+ try :
+ s = session(file[10:])
+ s.save = False
+ except :
+ continue
diff --git a/wifiweb/utilisateurs.py b/wifiweb/utilisateurs.py
new file mode 100755
index 00000000..7eb52dad
--- /dev/null
+++ b/wifiweb/utilisateurs.py
@@ -0,0 +1,10 @@
+#! /usr/bin/env python
+# -*- coding: iso-8859-15 -*-
+
+# les mots de passe sont cryptés avec la commande :
+# python -c "import sha ; print sha.new('***').hexdigest()"
+
+users = {
+ 'bilou:b6831110716ea7782b636469b31dc3a695b26386' : ['valhalla','aegir']
+}
+