original in en Georges Tarbouriech
en to nl Guus Snijders
Georges een lange-tijd Unix gebruiker. Hij houdt van produkten die meedragen aan het verspreiden van vrije software oplossingen in het professionele gebied.
MySQL en Perl bestaan reeds langere tijd. Ze worden nog steeds veel gebruikt,
ondanks dat de "mode" veranderlijk is. Dit artikel gaat over samenwerking tussen
deze 2 produkten, of het nu op het Internet is of op je lokale netwerk. Het gegeven
voorbeeld is voor Unix systemen, vrij of niet, ook al kan het aangepast worden aan
andere wijdverspreide "systemen".
Wat dit artikel is: een klein voorbeeld van wat je kunt doen met dit paar, het laten
zien van eenvoudig gebruik, snelheid, betrouwbaarheid, veiligheid...
Wat dit artikel niet is: geen MySQL tutorial of Perl tutorial;
geen MySQL of Perl review.
Aansluitend, we zullen MySQL aan het werk zien in combinatie met Perl, zonder te
vergeten dat "er meer dan een manier is om dingen gedaan te krijgen".
MySQL is een Relational DataBase Management System (RDBMS) en is beschikbaar
op http://www.mysql.com. Het wordt verspreid onder
de GNU GPL, vrij, afhankelijk van waarvoor het gebruikt wordt. Bekijk de licentie
politiek op MySQL's website. Het werkt als server of client op vele platformen.
Enkele andere RDBMS'en bestaan als vrije software en we zullen geen verglijkingen
maken, daar de keuze van MySQL voor dit artikel een voorwaarde was. Ook zullen we
niet kijken naar de grote "commerciële" jongens zoals Informix, Oracle, Sybase...
Het volstaat te vermelden dat MySQL waarschijnlijk het meest gebruikte RDBM op het
Internet is. Voor dit artikel zullen we gebruik maken van 3.23.36 (weer, voorwaardelijk).
Op moment van schrijven is de huidige stabiele versie 3.23.46 en
de experimentele is de lang verwachte versie 4.0. Deze kunnen gedownload worden
als broncode om te compileren of als pakketten.
Om MySQL in combinatie met Perl te gebruiken, heb je nog iets meer nodig: de Perl
DBI modules. Op z'n minst kun je downloaden DBI, Msql-Mysql-modules, Data-Dumper
en Data-ShowTable.
De installatie ervan komt hier verder niet ter sprake, daar deze niet moeilijk is en
pakketten voorzien je van alles wat je moet weten.
Perl staat voor Practical Extraction and Report Language. In het begin was
het bedoelt voor het manipuleren van documenten (parsen, uitpakken...) maar al snel
werd het meer dan dit. Je kunt bijna alles doen met Perl. Van administratieve zaken
tot cgi scripts via echte applicaties en natuurlijk, database interfaces.
Perl is onderdeel van vele (zo niet alle) Unix distributies of ze nu vrij zijn of
niet. De huidige stabiele versie is 5.6.1 en de experimentele is 5.7.2 op moment van
schrijven. Voor het artikel zullen we een goede oude gebruiken, 5.005_03. Voor het
geval dat je Perl niet geïnstalleerd hebt (hoe is dit mogelijk?) kun je het krijgen
op http://www.perl.com. Perl voorziet je van tonnen
modules voor bijna alles. Je kunt ze vinden op het CPAN gedeelte van deze website:
een ware goudmijn!
Ten slotte, om met beide tools te werken, verassing: je hebt een webserver nodig!
Apache lijkt de juiste keus, daar het onderdeel is van veel Unix distributies, vrij
of niet, zoals gebruikelijk. Voor het geval je hem niet hebt (waar heb je die distro
gevonden?), hij is beschikbaar op http://www.apache.org.
Je hebt waarschijnlijk al gemerkt dat LinuxFocus een meertalige magazine is.
Dat betekend dat, als je een redacteur bent, je de status van veel artikelen moet
managen, zoals de vertaling ervan. In andere woorden, wie doet wat, wanneer... Op het
moment zijn er zo'n 200 artikelen beschikbaar, gemiddeld in zo'n 5 talen. Dat
maakt samen zo'n 1000 artikelen (hoe slim ben ik?) en de teller loopt nog steeds!
Dit spul moet worden opgeslagen, geformatteerd, samengevat... Hoe denk je dat dit
management word gedaan? Met Perl, natuurlijk.
Onze hoofdredateur, Guido Socher heeft veel Perl programma's geschreven om het werk
eenvoudiger te maken. Hij schreef ook een driedelige Perl turtorial en een Perl boek
bespreking. Zie de referentie sectie aan het eind van het artikel.
Javi, de Spaanse redacteur, schreef een programma om de status van de vertalingen te
managen... in Perl.
Atif, een van onze ster auteurs, komt uit Perl land, dat is waarom zijn Perl zijn
moedertaal is. Ook heeft hij bijgedragen aan MySQL, met het verbeteren van een web
administratie tool. Wederom, zie de referenties sectie.
Al dit om te zeggen dat als je op zoek bent naar een Perl paradijs... kom bij
Linuxfocus.
Daar ik een van de Franse Linuxfocus redacteuren ben... en nogal lui, creëerde ik
mijn eigen LinuxFocus database, met behulp van, raad eens: MySQL en Perl!
Dit gaat ervan uit dat MySQL correct geïnstalleerd is, users aangemaakt en
beschermt met passwords. De installatie valt buiten het bereik van dit artikel
en de geweldige documentatie die met MySQL wordt bijgeleverd zou je alles moeten
vertellen.
Start de MySQL server met het mysql.server script, daar deze de
safe_mysqld daemon aanroept en je zo opties kunt doorgeven aan deze daemon.
Maak contact met de server met
mysql -h host -u user -p
Als de server op je locale computer draait, hoef je -h host niet te gebruiken.CREATE DATABASE lf;
Dit is ons voorbeeld (lf staat voor LinuxFocus) en vanzelfsprekend kun je hier iedere naam opgeven die je wilt. Vervolgens is het tijd om de toegestane users permissies toe te kennen, hier wordt aangenomen dat je het recht hebt om dat te doen (oftewel, dat je administratie rechten hebt als de verbonden user). Als je een user in staat wilt stellen de database te managen, kun je hem de permissies geven metGRANT ALL ON lf.* TO username;
Selecteer de database die je zojuist hebt aangemaakt metUSE lf
Maak een tabel aan die voldoet aan jouw eisen. In ons voorbeeld maken we een tabel aan genaamd trissue:CREATE 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));
controleer of hij is aangemaakt zoals verwacht met:
USE lf
SHOW TABLES;
DESCRIBE trissue;
LOAD DATA LOCAL INFILE "maindb.txt" INTO TABLE trissue;
Als je text bestand correct is, is de tabel nu gevuld. Je kunt het controleren met:SELECT * FROM trissue;
Dit zou een lange lijst moeten laten zien. Nu ben je in staat om ieder type data op te halen met behulp van queries.
Perl zal ons helpen om de queries te automatiseren, de resultaten in een web browser
weer te geven, enz. Wederom, dit gaat ervan uit dat de Perl modules juist geïnstalleerd
zijn om MySQL te gebruiken in combinatie met Perl.
We zullen nu Perl scripts schrijven om te gebruiken als cgi scripts. Deze stellen ons
in staat om Perl en HTML te mixen om de database te ondervragen en de output te
op te maken (te formatteren).
We zullen een eenvoudig voorbeeld script gebruiken, welke ons toestaat alle artikelen
te zoeken die geschreven zijn door dezelfde auteur. We zullen de artikel nummers
weergeven, de category, de titel, de namen van de vertalers voor de verschillende talen
(alleen volledig werkende projecten) en de uitgave van wanneer de artikelen
gepubliceerd zijn.
Je kunt dit script gebruiken als een model voor eigen gebruik, maar pas op dat dit een
niet erg veilig programma is. Een versie voorzien van meer commentaar kun je
=>hier<= downloaden.
#!/usr/bin/perl -Tw
# Eerst zeggen we dat dit een "Tainted" Perl script is.
#
# Dit is commentaar
# db consult
#
# We zullen de Perl DBI module gebruiken
use DBI;
# Als 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">
# Hier komt de titel van de knop van de startpagina
<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.='"';
# We melden ons bij de database genaamd lf aan als gebruiker doe
$dbh = DBI->connect("DBI:mysql:lf","doe",'');
$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 {
# DB Connect
$dbh = DBI->connect("DBI:mysql:lf","doe",'');
# Zoek
$sth = $dbh->prepare("
select *
from trissue
");
$sth->execute;
# Display result
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;
# Verbreek de verbinding
$dbh->disconnect;
exit;
Vanzelfsprekend, als je een database service op je website wilt aanbieden, moet
je het geheel beveiligen. Uiteraard gaan we geen stap-voor-stap manier geven om
een website of database server te beveiligen. Echter, het is belangrijk om in te
gaan op de basis.
In het kort, als je services gaat aanbieden op het web, is het eerste dat je moet
beveiligen, je web server. Dit gaat ver voorbij dit artikel. als je meer wilt leren
over het onderwerp, is er zat documentatie beschikbaar.
Een goede plaats om te beginnen is het
A nice place to start is het Linux Documentatie Project.
De volgende stap is de database server. als je een tool als MySQL installeert,
vergeet niet om het beveilings deel van de manual te lezen. Weer, de basis
gaat over user passwords: laat nooit een account achter zonder password, in het
byzonder de root account van de database (welke niet dezelfde zou moeten zijn
de machine's root account). Een ander belangrijk punt is permissies: geef niet
iedereen volledige rechten. Het lijkt logisch... en dat is waarom veel mensen
het vergeten!
Om een stap verder te gaan, waarom de database niet chroot draaien? zie
Mark's artikel "Alle diensten in Linux onder
Chroot draaien " in deze uitgave. Hij spreekt over een andere database, maar
wat hij zegt kan ook wordentoegepast op MySQL.
Een andere beveiligings maatregel gaat over de data circulatie. Het is geen
slecht idee om de data te zenden en ontvangen door een tunnel. Je kunt het
artikel Through the tunnel lezen
voor meer informatie
Last but not least, veilig programmeren is een van de sleutels. Perl is een
prachtige taal, maar het is vrij makkelijk om programmeer fouten ermee te
maken. Een ander LinuxFocus artikel zal je leren wat te doen, vooral met Perl.
Werp een blik hier.
Het is het laatste artikel van en Secure Programming serie en behelst in het
byzonder cgi scripts. Een "must read"!
Let wel, dit gaat er vanuit dat je reeds een gehard systeem hebt zonder
bekende beveilingsgaten, met de nieuwste patches, en vele verplichte beveiligings
tools met een NIDS (Network Intrusion Detection System) zoals snort (van
http://www.snort.org), firewall, poort en
beveiligings scanners (nmap, nessus), enz.
Als je het je kunt veroorloven kun je ook een aparte server voor iedere geleverde
server inzetten: een web server, een database server... en de mirrors voor hoge
beschikbaarheid. En zo verder! Er komt nooit een eind aan, daar veiligheid nooit
volledig bereikt is. Je probeert alleen de risico's te reduceren... en ze worden
iedere dag erger. Je bent gewaarschuwd.
Daar er meer dan een manier is, kun je je eigen weg kiezen. Er zijn vele RDMBS en
vele talen om ermee te communiceren. Het idee achter het schrijfen van dit artikel
was om te laten zien hoe MySQL en Perl goed kunnen samenwerken.
Uiteraard was de keuze nogal subjectief: Ik hou van MySQL omdat het nogal klein in
grootte is, werkt met vele besturingssystemen, het is snel, betrouwbaar... Ook heb
ik veel waardering voor het werk gedaan door het MySQL team, zonder de vele deelnemers
te vergeten. En wat ik het mooiste vind: die mensen probeerden niet het wiel opnieuw
uit te vinden. Ze hielden de dingen eenvoudig.
Wat betreft Perl, alles is er reeds over gezegd: wat zou ik nog kunnen toevoegen?
Ikzelf ben van mening dat je niet zonder kunt, of je nu een netwerkbeheerder bent of
een ontwikkelaar, of wat dan ook. De Perl gemeenschap is een van de grootste bronnen
van kennisdeling daar buiten. Er is ook een tijdschrift beschikbaar, genaamd
Perl Journal, deze is nu opgenomen in SysAdmin magazine en verschijnt iedere 2 uitgaven.
Als je je wilt inschrijven, ga naar http://www.samag.com.
Nu we het hebben over goed werk, hier komt het gebruikelijke off-topic gedeelte.
Onze LinuxFocus lezers hebben waarschijnlijk niet het kleine aantal personen
opgemerkt die betrokken zijn bij LinuxFocus. Desalniettemin kun je het lezen in
veel verschillende talen. Heb je ooit opgemerkt dat sommige teams werken met
slechts een of twee personen die al het werk doen? Zij zijn webmasters, vertalers,
enz. Zie het Russische team, het Turkse Team: Je zult zien dat de meeste artikelen
zijn vertaald door Kirill of Erdal. Zie de projecten in ontwikkeling zoals Portugees
of Arabisch: zelfde resultaat! Hierbij wil ik ze alle feliciteren voor het goede
werk dat ze doen. Allen bedankt: de vrije software gemeenschap heeft veel aan jullie
te danken.
Sorry voor de afleiding, maar ik geloof dat gezegd moest worden.
Terug naar het onderwerp, laten we afsluiten met een paar woorden over vrije software.
De mensen van MySQL of Perl verdienen veel bedankjes. Ze voorzien ons van fantastische
tools, en meestal voor niks. Deze tools zijn echter even goed als echte commerciële
produkten (zo niet beter), worden vaak geüpdate, zeer goed gedocumenteerd en je kunt
ze gebruiken op vrijwel alle Unix systemen. Kun je een verglijkbaar produkt ergens anders
vinden? Ik ben bang van niet!
Dit artikel zal je waarschijnlijk niet veel leren, echter als het je stimuleert te
kijken naar die producten, is het niet voor niks.
Leven we niet in een prachtige tijd?
Perl.org
cpan.org, het perl archief
Guido's Perl tutorial:
Perl I
Perl II
Perl III
Professional Perl Programming boek bespreking:
Perl Programming
Atif's bijdrage aan MySQL.
Een LinuxFocus MySQL bespreking: een oud artikel, nog altijd up-to-date:
MySQL
Een oude LinuxFocus tweedelige SQL tutorial:
SQL Part I
SQL Part II