Python TD4


Un script cgi



Modules cgi, CGIHTTPServer

La Fédération Française de Friture à Froid organise son séminaire annuel (aux Bahamas).
On vous demande de mettre en ligne un formulaire d'inscription.
Après la clôture des inscriptions, vous devrez fournir à la secrétaire un fichier Excel® contenant pour chaque participant les champs suivants :
Nom, prénom, email, société, téléphone, date d'arrivée, date de départ.
Vous établissez donc un devis comprenant la mise en place d'un serveur dédié, l'installation d'une base de données, quelques dizaines d'heures d'ingénieur pour la réalisation de l'interface, et le coût d'utilisation des licences Microsoft®.
En fait, un fichier csv (comma separated values) peut être lu par n'importe quel tableur. C'est donc ce que vous allez construire.
C'est un simple fichier texte, dans lequel chaque ligne correspond à un enregistrement dont les champs sont séparés par un caractère de votre choix
(à l'origine, la virgule, mais il vaut mieux prendre un caractère qui ne risque pas d'apparaître dans les données, comme "|" par exemple).

Le fichier obtenu pourra ensuite être converti au format voulu par Open/LibreOffice ou Excel®.

Le script cgi appelé lors de la validation du formulaire gérera donc un fichier participants.csv, contenant des lignes de la forme suivante

[jyt@liszt Python]$ cat participants.csv
"Nom" |"Prenom"| "email" | Institution |...
"Mansoif" |"Gérard"| "gerard.mansoif@pernodricard.com"|Pernod | ...
"Garcin"|"Lazare"|"garcin.lazare@sncf.com"|"SNCF"|...


Python possède un module csv mais il est inutile dans ce cas.

On utilisera un formulaire registration.html appelant un script register.cgi.
Noter une petite astuce pour éviter la soumission acidentelle du formulaire si l'utilisateur tape un retour-chariot :
<FORM ACTION="http://www.ffff.org/cgi-bin/sem6/register.cgi" METHOD="POST" onsubmit="return false">
Le formulaire sera soumis (seulement) en cliquant un bouton idoine :
<input TYPE="button" VALUE=" Envoyer " onclick="this.form.submit(  )" />

Pour traiter le formulaire, on utilisera le module cgi de Python.
Une fois cette action complétée, le script renverra une page html résumant les informations soumises. On utilisera pour cela une chaîne de formatage, du type
html = """
<TITLE> INSCRIPTION </TITLE>
<H1> Inscription au 6&egrave;me s&eacute;minaire de la FFFF  </H1>
<H2> 8 au 12 juin 2009, Saint-Tropez (France) </H2>
<BR>
<BR> %(nom)s %(prenom)s
<BR> %(email)s
<BR>
...
<HR>
<FORM ACTION="http://www.ffff.org/index.html">
<INPUT TYPE="submit" VALUE="Retour page d'accueil">
</FORM>
"""



Pour mettre au point le script, on utilisera un serveur minimal en pur Python sur l'interface loopback, par exemple comme ceci :
#!/usr/bin/python

import os

from BaseHTTPServer import HTTPServer
from CGIHTTPServer import CGIHTTPRequestHandler
srvaddr = ('127.0.0.1',80)
server = HTTPServer(srvaddr, CGIHTTPRequestHandler)
server.serve_forever()
Le script register.cgi devra être placé dans un sous-répertoire cgi-bin, et le serveur devra avoir le droit d'exécution.
Seul root peut lancer le serveur sur le port 80.
En tant qu'utilisateur normal, on pourra le lancer sur un port libre, par exemple 8888.
Le formulaire sera alors déclaré avec l'action ACTION="http://127.0.01:8888/cgi-bin/register.cgi"

Une fois le script fonctionnel, on s'assurera que deux processus ne puissent pas ouvrir le fichier en même temps. Le module fcntl permettra d'assurer l'accès au fichier en exclusion mutuelle au moyen d'un fichier de verrouillage
fcntl.flock(lockfile.fileno(), fcntl.LOCK_EX) # pour verrouiller
fcntl.flock(lockfile.fileno(), fcntl.LOCK_UN) # pour relacher

On acquière les verrous sur des fichiers vides créés d'avance (participants.lck) plutôt que sur le fichier à verrouiller lui-même..
Le module fnctl n'est pas disponible sous windows. On trouvera ici une recette pour s'en passer, et une solution plus simple (non testée, à vous de voir).



Une fois le serveur fonctionnel, ajoutez au site une page affichant la liste des participants inscrits avec leurs adresses email (lien mailto:),
et inscrivez quelques camarades avec leurs adresses réelles.
Changement de rôle. Vous êtes maintenant un spammeur sans scrupules.
Ecrivez un script qui collecte les adresses mail contenues sur la page,
puis complétez le pour envoyer automatiquement un spam de votre choix aux adresses que vous avez rassemblées.
Le module smtplib pourra vous être utile.