original in en Georges Tarbouriech
en to fr Georges Tarbouriech
Georges est un vieil utilisateur d'Unix. Il appr�cie tous ces produits qui ont contribu� � r�pandre les solutions bas�es sur le logiciel libre dans le domaine professionnel.
MySQL et Perl font partie du paysage depuis d�j� longtemps.
Ils sont toujours largement utilis�s m�me si la "mode" est en train de
changer. Cet article parle de ces deux produits utilis�s conjointement soit
sur Internet, soit sur votre r�seau local. L'exemple propos� concerne les
syst�mes Unix, libres ou non, m�me s'il peut �tre adapt� � d'autres
"syst�mes" largement r�pandus.
Ce qu'est cet article : un petit tour d'horizon de ce que l'on peut faire
avec ce couple, en insistant sur la facilit� d'utilisation, la rapidit�, la
fiabilit�, la s�curit�...
Ce que cet article n'est pas : ni un tutoriel MySQL ou Perl, ni une
pr�sentation approfondie de MySQL ou Perl.
Par cons�quent, nous y verrons MySQL au travail en liaison avec Perl, sans
oublier "qu'il y a plus d'une fa�on de le faire".
MySQL est un Syst�me de Gestion de Bases de Donn�es Relationnelles
(SGBDR) disponible sur
http://www.mysql.com. Il est publi� sous licence
GNU GPL gratuitement en fonction de l'usage pour lequel il est pr�vu.
V�rifiez la politique de licence sur le site de MySQL. Il fonctionne en tant
que client ou serveur sur de nombreuses plate-formes. D'autres SGBDR libres
existent et nous ne ferons aucune comparaison puisque le choix de MySQL pour
cet article est purement arbitraire. De m�me nous ne comparerons pas avec
les "gros" produits commerciaux tels qu'Informix, Oracle, Sybase...
Pr�cisons toutefois que MySQL est probablement l'un des SGBD les plus
utilis�s sur Internet. Pour cet article nous avons choisi (toujours
arbitrairement) la version 3.23.36. Au moment d'�crire ces lignes, la
derni�re version stable est la 3.23.46 et la version exp�rimentale est la
tant attendue version 4.0. Tout ceci peut �tre t�l�charg� sous forme de code
source � compiler ou sous forme de paquetage.
Pour utiliser MySQL avec Perl, vous aurez besoin d'autre chose : les modules
DBI de Perl. Vous devez au moins t�l�charger DBI, Msql-Mysql-modules, Data-Dumper
et Data-ShowTable.
Nous ne parlerons pas de leur installation puisqu'elle est �vidente et que
les distributions vous fournissent tout ce que vous avez besoin de savoir.
Perl signifie Practical Extraction and Report Language. Au tout d�but
il �tait destin� � la manipulation de document (analyse, extraction...) mais
il est rapidement devenu beaucoup plus que �a. Vous pouvez pratiquement tout
faire avec Perl, depuis les t�ches d'administration aux scripts cgi, en
passant par de v�ritables applications et bien s�r, l'interfa�age de bases
de donn�es.
Perl fait partie de nombreuses (sinon toutes) distributions Unix, qu'elles
soient libres ou non. La version stable actuelle est la 5.6.1 et
l'exp�rimentale est la 5.7.2 au moment d'�crire ces lignes. Pour cet article
nous utiliserons la bonne vieille 5.005_03. Si Perl n'est pas install� sur
votre machine (comment est-ce possible ?), vous pouvez l'obtenir sur
http://www.perl.com. Perl propose des tonnes de
modules pour pratiquement tout. Vous pouvez les obtenir � partir de la
section CPAN de ce m�me site : une mine d'or !
Dernier point et non le moindre, pour travailler avec les deux outils
r�unis, surprise : il vous faut un serveur web ! Apache semble le bon choix
puisqu'il fait partie de nombreuses distributions Unix. Si vous ne l'avez
pas (o� avez-vous trouv� votre distribution ?), il est disponible �
http://www.apache.org.
Vous avez sans doute remarqu� que LinuxFocus est un magazine multilingue. Ca
signifie que lorsque vous �tes un �diteur, vous devez g�rer le statut des
nouveaux articles, leur traduction. En d'autres termes, qui fait quoi,
quand... Actuellement, il y a environ 200 articles, traduits en moyenne en 5
langues. Ce qui fait un millier d'articles (que je suis bon !) et �a
augmente tous les mois ! Tout cela doit �tre archiv�, format�, r�capitul�...
Comment croyez-vous que cette gestion fonctionne ? Gr�ce � Perl, bien s�r.
Notre �diteur en chef, Guido Socher, a �crit de nombreux programmes en Perl
pour nous faciliter la t�che. Il a �galement �crit un tutoriel Perl en trois
parties ainsi que la pr�sentation d'un livre sur Perl. Voir la partie
"R�f�rences" � la fin de l'article.
Javi, l'�diteur Espagnol, a �crit un programme pour g�rer l'avancement des
traductions... en Perl.
Atif, l'un de nos auteurs �toile, vient du royaume de Perl, et c'est pour
cela que sa langue maternelle... est Perl. Accessoirement, il a �galement
contribu� � MySQL, en am�liorant un outil d'administration web. Voir
�galement la partie R�f�rences.
Tout cela pour dire que si vous cherchez un paradis Perl... rejoignez
LinuxFocus.
Comme je suis l'un des �diteurs Fran�ais... et que je suis plut�t paresseux,
j'ai cr�e ma propre base de donn�es LinuxFocus en utilisant, devinez quoi :
MySQL et Perl !
Cela suppose que MySQL a �t� correctement install�, que des utilisateurs ont
�t� cr�es et ont �t� prot�g�s par des mots de passe. L'installation n'entre
pas dans le cadre de cet article et la documentation d'excellente qualit�
fournie avec MySQL vous dira tout.
D�marrez le serveur MySQL � l'aide du script mysql.server, puisqu'il
invoque le d�mon safe_mysqld auquel vous pouvez passer des options.
Connectez-vous au serveur en tapant
mysql -h host -u user -p
. Si le serveur est sur votre machine, -h host est inutile.CREATE DATABASE lf;
Il s'agit de notre exemple (lf pour LinuxFocus) et il est �vident que vous donnez le nom de votre choix � votre propre base. Ensuite, garantissez certaines permissions aux utilisateurs autoris�s, en supposant que vous ayez le droit de le faire (c'est-�-dire que l'utilisateur connect� poss�de des droits d'administrateur). Si vous souhaitez qu'un utilisateur puisse g�rer la base, vous pouvez lui en donner les privil�ges en tapantGRANT ALL ON lf.* TO username;
S�lectionnez la base que vous venez de cr�er en tapantUSE lf
. Cr�ez une table en fonction de vos besoins. Dans notre exemple, nous d�finissons une table nomm�e trissueCREATE TABLE trissue (num INTEGER UNSIGNED, category VARCHAR(25), title VARCHAR(40), author VARCHAR(20), en VARCHAR(20), es VARCHAR(20), fr VARCHAR(20),de VARCHAR(20), nl VARCHAR(20), ru VARCHAR(20), tk VARCHAR(20), issue VARCHAR(20));
. V�rifions qu'elle correspond bien � ce que l'on attend avec :
USE lf
SHOW TABLES;
DESCRIBE trissue;
LOAD DATA LOCAL INFILE "maindb.txt" INTO TABLE trissue;
Si votre fichier texte est correct, la table est maintenant peupl�e. Vous pouvez le v�rifier par :SELECT * FROM trissue;
Ceci devrait afficher une longue liste. Vous pouvez d�s lors retrouver n'importe quelle donn�e � l'aide de requ�tes.
Perl va nous aider � automatiser les requ�tes, � afficher les r�sultats dans
un navigateur web, etc. Encore une fois, ceci implique que les modules Perl
ont �t� correctement install�s pour permettre l'utilisation de MySQL en
liaison avec Perl.
Nous allons maintenant �crire des scripts Perl utilis�s en tant que scripts
cgi. Ils vont nous permettre de m�ler Perl et HTML pour interroger la
base et formater le r�sultat.
Nous ne traiterons que d'un simple exemple de script, nous autorisant �
rechercher tous les articles d'un m�me auteur. Nous afficherons les num�ros
des articles, la cat�gorie, le titre, les noms des traducteurs des
diff�rentes langues (uniquement celles des projets �tablis), et le mois
de parution de l'article.
Vous pouvez utiliser ce script comme mod�le pour votre usage personnel, mais
sachez que cet exemple n'est pas un programme particuli�rement s�curis�.
Vous pouvez obtenir une version un peu plus comment�e
=>ici<=.
#!/usr/bin/perl -Tw
# D'abord, disons qu'il s'agit d'un script Perl "Tainted".
#
# Ceci est un commentaire
# consultation de la base
#
# Utilisons le module Perl DBI
use DBI;
# en tant que cgi :
use CGI qw(param());
print <<END_of_start;
Content-type: text/html
<html>
<title>LFAuthors main db</title>
<center><TABLE>
<TR VALIGN=TOP>
<TD><form action="/cgi-bin/lf.cgi" method="get">
# Voici le titre du bouton de la page de lancement
<input type="submit" value=" LFAuth ">
</form>
</TD>
</TR>
</TABLE>
<center><H2>Search by author</H2></center>
<form action=\"/cgi-bin/lf.cgi\" method=\"get\">Author name : <input
type=\"text\" size=\"30\" name=\"author\"><input type=\"submit\"
value=\"Search...\"></form></center>
END_of_start
if (param("author") ne '') {
$author = param("author");
$autsrch.='"';
$autsrch.=$author;
$autsrch.='"';
# Nous nous connectons � la base nomm�e lf en tant qu'utilisateur untel
$dbh = DBI->connect("DBI:mysql:lf","untel",'');
$sth = $dbh->prepare("
select *
from trissue
where
author = $autsrch
");
$sth->execute;
print <<END_suite;
<center>
<TABLE BORDER=>
<tr bgcolor=#A1C4EE>
<th width=60 align=CENTER><font color=#000000> Num </font></th>
<th width=110 align=CENTER><font color=#000000> Category </font></th>
<th width=110 align=CENTER><font color=#000000> Title </font></th>
<th width=110 align=CENTER><font color=#000000> Author </font></th>
<th width=110 align=CENTER><font color=#000000> En </font></th>
<th width=110 align=CENTER><font color=#000000> Es </font></th>
<th width=110 align=CENTER><font color=#000000> Fr </font></th>
<th width=110 align=CENTER><font color=#000000> De </font></th>
<th width=110 align=CENTER><font color=#000000> Nl </font></th>
<th width=110 align=CENTER><font color=#000000> Ru </font></th>
<th width=110 align=CENTER><font color=#000000> Tk </font></th>
<th width=110 align=CENTER><font color=#000000> Issue </font></th>
</tr>
END_suite
while( ($num,$category,$title,$author,$en,$es,$fr,$de,$nl,$ru,$tk,$issue) =$sth->fetchrow() ) {
print "<tr>";
print "<td width=60 bgcolor=#FFFFE8 align=center> $num</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $category</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $title</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $author</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $en</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $es</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $fr</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $de</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $nl</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $ru</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $tk</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $issue</td>";
print "</tr>";
}
print "</TABLE>";
print "<BR>";
print "<BR>";
print "<br>";
} else {
# Connexion � la base
$dbh = DBI->connect("DBI:mysql:lf","untel",'');
# Recherche
$sth = $dbh->prepare("
select *
from trissue
");
$sth->execute;
# Affichage du r�sultat
print <<SUITE;
<center>
<TABLE BORDER=>
<tr bgcolor=#A1C4EE>
<th width=60 align=CENTER><font color=#000000> Num </font></th>
<th width=110 align=CENTER><font color=#000000> Category </font></th>
<th width=110 align=CENTER><font color=#000000> Title </font></th>
<th width=110 align=CENTER><font color=#000000> Author </font></th>
<th width=110 align=CENTER><font color=#000000> En </font></th>
<th width=110 align=CENTER><font color=#000000> Es </font></th>
<th width=110 align=CENTER><font color=#000000> Fr </font></th>
<th width=110 align=CENTER><font color=#000000> De </font></th>
<th width=110 align=CENTER><font color=#000000> Nl </font></th>
<th width=110 align=CENTER><font color=#000000> Ru </font></th>
<th width=110 align=CENTER><font color=#000000> Tk </font></th>
<th width=110 align=CENTER><font color=#000000> Issue </font></th>
</tr>
SUITE
while( ($num,$category,$title,$author,$en,$es,$fr,$de,$nl,$ru,$tk,$issue) =$sth->fetchrow() ) {
print "<tr>";
print "<td width=60 bgcolor=#FFFFE8 align=center> $num</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $category</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $title</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $author</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $en</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $es</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $fr</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $de</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $nl</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $ru</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $tk</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $issue</td>";
print "</tr>";
}
print "</TABLE>";
print "<BR>";
}
print end_html;
$sth->finish;
# D�connexion
$dbh->disconnect;
exit;
De toute �vidence, si vous souhaitez proposer un service de base de donn�es sur
votre site, vous devez s�curiser l'ensemble. Bien s�r, nous ne fournirons pas de
m�thode pas � pas pour s�curiser votre site ou votre serveur de bases de
donn�es. Toutefois, il est important d'insister sur ce qui est basique.
En bref, lorsque vous proposez des services sur Internet, la premi�re chose �
faire consiste � s�curiser votre serveur web. Ceci est tr�s loin du cadre de cet
article. Si vous voulez en savoir plus sur le sujet, il existe une �norme
documentation. Un bon endroit pour commencer n'est autre que
le Linux Documentation Project.
L'�tape suivante concerne le serveur de bases de donn�es. Lorsque vous
installez un outil tel que MySQL, n'oubliez pas de lire le chapitre s�curit�
du manuel. Encore une fois, le travail de base concerne les mots de passe
des utilisateurs : ne laissez jamais un compte sans mot de passe,
particuli�rement celui de root (qui devrait �tre diff�rent de celui de la
machine). L'autre point important concerne les permissions : n'autorisez pas
tout � tout le monde. Cela para�t �vident... et c'est la raison pour
laquelle nombreux sont ceux qui l'oublient !
Pour aller un peu plus loin, pourquoi ne pas "chrooter" la base ? Lisez
l'article de
Mark "Chrooter tous les services" dans ce num�ro. Il
y parle d'une autre base mais ce qu'il dit peut �tre appliqu� � MySQL.
Une autre mesure de s�curit� concerne la circulation des donn�es. Ce n'est
pas une mauvaise id�e d'envoyer et de recevoir les donn�es par un canal
s�curis�. Vous pouvez lire l'article
Par le tunnel pour plus ample
information.
Enfin, l'essentiel, la programmation s�curis�e est l'une des cl�s. Perl est
un langage extraordinaire mais il est tr�s facile de faire de grosses
erreurs de programmation avec lui. Un autre article de LinuxFocus vous dira
ce qu'il faut faire, particuli�rement avec Perl. Jetez un oeil (et m�me les
deux)
l�. C'est le dernier article de la
s�rie sur la programmation s�curis�e et il concerne plus sp�cialement les
scripts cgi. A lire absolument !
Alors, bien s�r, tout ceci suppose que votre syst�me est d�j� s�curis�, sans
trous de s�curit� bien connus, avec tous les derniers correctifs, et avec de
nombreux outils de s�curit� obligatoires tels qu'un NIDS
(Network Intrusion Detection System) comme snort (http://www.snort.org), un pare-feu, des scanners
de ports et de s�curit� (nmap, nessus), etc.
Si vos moyens vous le permettent, vous pouvez aussi avoir un serveur
diff�rent pour chaque service propos� : un serveur web, un serveur de bases
de donn�es... et leur miroir pour garantir une haute disponibilit�. Ainsi de
suite ! Ce n'est jamais fini, puisque la s�curit� n'est jamais aboutie. Vous
essayez seulement de r�duire les risques... et ils sont tous les jours plus
gros. Vous voil� avertis.
Comme Il Y a toujours Plus d'Une Fa�on de Le Faire (TIMTOWDI c'est quand m�me
plus parlant que IYPUFDLF), vous pouvez choisir celle qui vous convient le
mieux. Il existe de nombreux SGBDR ainsi que de nombreux langages pour
communiquer avec eux. L'id�e derri�re cet article �tait de montrer que
MySQL et Perl fonctionnent vraiment bien ensemble.
Certes, le choix �tait enti�rement subjectif : j'adore MySQL pour sa relative
petite taille, parce qu'il fonctionne sous de nombreux OS, qu'il est rapide,
fiable... J'appr�cie �galement beaucoup le travail de l'�quipe de MySQL, sans
oublier les nombreux contributeurs. Et ce que pr�f�re : ces gens n'ont pas
essay� de r�inventer la roue. Ils ont conserv� la simplicit�.
Pour ce qui est de Perl, tout a �t� dit : que pourrais-je ajouter ? Je crois
vraiment qu'il est impossible de travailler sans lui, que vous soyez
administrateur r�seau, d�veloppeur ou que sais-je. La communaut� Perl est
l'un des si�ges du partage des connaissances. Un magazine existe, nomm� le
Perl Journal, qui est maintenant int�gr� au magazine SysAdmin, tous les deux
num�ros. Si vous voulez vous abonner, visitez http://www.samag.com.
Puisque nous parlons de beau travail, voici l'habituelle partie hors-sujet.
Vous, lecteurs de LinuxFocus, n'avaient sans doute pas remarqu� le petit nombre
de personnes investies dans le magazine. Pourtant, vous pouvez le lire dans de
nombreuses langues. Avez-vous remarqu� que certaines �quipes travaillent
presque toujours avec une ou deux personnes qui font tout ? Ils sont
traducteurs, webmestres, etc. Regardez du c�t� de l'�quipe Russe ou de l'�quipe
Turque : vous verrez que la plupart des articles sont traduits par Kirill ou
Erdal. Jetez un oeil sur les projets en cours de d�veloppement, tels que le
Portugais ou l'Arabe : m�me r�sultat ! J'aimerais les f�liciter pour l'�norme
travail r�alis�. Merci � vous tous : la communaut� du logiciel libre peut vous �tre
reconnaissante.
Pardon pour la digression, mais je crois qu'il fallait que ce soit dit.
Pour en revenir au sujet, terminons par quelques mots sur le logiciel libre. Les
gens de MySQL et de Perl m�ritent un grand merci. Ils nous fournissent des
outils extraordinaires, presque toujours gratuitement. Pourtant ces outils sont
souvent aussi "bons" que les v�ritables produits commerciaux (sinon meilleurs),
ils sont fr�quemment mis � jour, tr�s bien document�s et vous pouvez les
utiliser sur la plupart des syst�mes Unix. Connaissez-vous un �quivalent
ailleurs ? J'ai bien peur que non !
Cet article ne vous apprendra sans doute pas grand chose, mais s'il vous
donne envie d'essayer ces produits, il n'aura pas �t� inutile.
Quand je vous dis qu'on vit une �poque formidable !
Perl mongers
Le tutorial Perl de Guido :
Perl I
Perl II
Perl III
Revue du livre Programmation Professionnelle de Perl :
Programmation avec Perl
La
contribution d'Atif � MySQL.
Une revue de MySQL sur LinuxFocus : vieil article encore d'actualit� :
MySQL
Un vieux tutoriel SQL en deux parties sur LinuxFocus :
SQL Partie I
SQL Partie II