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("""
+
+ + + + + +
Utiliateur : +
Mot de passe :
+
+
+""" % 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('
') + page.add('' % sid ) + page.add('' % b) + + # titre + if '-' in borne.puissance() : + # réactivation + page.add('%s (borne désactivée)' % borne.Nom()) + page.add('') + else : + # désctivation + page.add('%s (borne activée)' % borne.Nom()) + page.add('') + page.add('
') + + # commentaires + page.add('
 ') + page.add('
'.join(borne.info())) + page.add('
') + + # bouton de validation + if '-' in borne.puissance() : + page.add(u'' % b) + else : + page.add(u'' % b) + + # fin du 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 += "\"En_tete\"
\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'] +} +