original in en Georges Tarbouriech
en to pt Bruno Sousa
O Georges é um utilizador de Unix de há longa data. Gosta de produtos que contribuam para o aumento de soluções com software livre na área profissional.
O MySQL e o Perl têm estado presentes em todo o lado há já longos
tempos. São ainda muito usados mesmo que a "moda" esteja a alterar.
Este artigo fala destes dois produtos trabalhando juntos como um todo,
quer na Internet quer na rede local. O exemplo fornecido é escrito para
sistemas Unix, livres ou não, mesmo que possa ser adaptado para outros
"sistemas" bastante usados.
O que é que este artigo é: uma breve revisão do que pode ser feito com
este par, mostrando uma utilização fácil, velocidade, fiabilidade,
segurança...
O que é que este artigo não é : não é nenhum tutorial acerca do MySQL
nem do Perl; nem mesmo uma revisão do MySQL ou do Perl.
Consequentemente, veremos o MySQL a trabalhar em conjunto com o Perl,
sem esquecer que "existe mais do que uma maneira de o fazer".
O MySQL é um sistema de administração de uma base de dados
relacional (RDBMS) disponível em http://www.mysql.com. É apresentado sob
a GPL da GNU, livremente dependendo do seu uso. Verifique as políticas
da licença no site da MySQL. Trabalha quer como um servidor quer como
um cliente em muitas plataformas. Existem alguns RDMS como software
livre mas não tomaremos nenhumas comparações visto que a escolha do
MySQL, para este artigo, foi arbitrária. Nem sequer compararemos com as
grandes armas "comerciais" tais como Informix, Oracle, Sybase... Basta
dizer que o MySQL é, provavelmente, uma das mais DBM utilizadas na
Internet. Para este artigo utilizaremos a versão 3.23.36 (novamente,
arbitrariamente). Na altura da redacção deste artigo, a versão actual e
estável é a 3.23.46 e a experimental, já muita esperada, a versão 4.0.
Podem ser obtidas com o código fonte para ser compilado ou como
pacotes.
Para utilizar o MySQL em conjunto com o Perl, precisa de mais algumas
coisas: os módulos DBI do Perl, pode obter os módulos DBI, os módulos
Msql-Mysql, os módulos Data-Dumper e os módulos Data-ShowTable.
Não falaremos da sua instalação visto que é óbvia e os pacotes fornecem
toda a informação que precisa.
O Perl significa Pratical Extraction and Report Language.
No princípio, tinha o intuito da manipulação de documentos (análise,
extracção...) mas rapidamente foi para além disto. Pode fazer quase
tudo com o Perl. Desde tarefas administrativas a scripts cgi até
aplicações verdadeiras e claro interfaces para base de dados.
O Perl faz parte de muitas (se não todas) distribuições Unix sejam
livres ou não. A versão actual e estável é a 5.6.1 e a experimental é a
5.7.2 na altura de redacção deste artigo. Para este artigo utilizaremos
a velha 5.005_03. No caso de não ter o Perl instalado na sua máquina
(como é que isto é possível ?) pode obtê-lo a partir de http://www.perl.com. O Perl fornece-lhe
toneladas de módulos para praticamente tudo. Pode obtê-los na secção
CPAN deste site : uma mina de ouro!
Por último, mas não o menos importante, para trabalhar com ambos,
surpresa : precisa de um webserver ! O Apache parece a escolha correcta
visto que faz parte de muitas distribuições Unix, livres ou não, como é
normal. No caso de não o ter (onde é que obteve a sua distribuição ?),
está disponível a partir do site http://www.apache.org.
Você, provavelmente já notou que a LinuxFocus é uma revista
multilíngue. O que quer dizer, que se for um editor você precisa de
administrar o estado dos novos artigos, a sua tradução. Por outras
palavras, o que é que cada um está a fazer, quando... De momento.
existem cerca de 200 artigos disponíveis, numa média de 5 línguas. O
que faz cerca de 1000 artigos (que inteligente eu sou ?) e por aí
adiante ! Tudo isto tem de ser arquivado, formatado, resumido... Como é
que pensa que esta administração é feita ? Com o Perl, é claro.
O nosso editor chefe, Guido Socher, escreveu bastante programas Perl
para tornar o nosso trabalho mais fácil. Escreveu também três partes de
tutoriais de Perl e uma revisão de um livro de Perl. Verifique a secção
de referências no fim deste artigo.
O Javi, o editor Espanhol, escreveu um programa para administrar o
estado da tradução... em Perl.
O Atif, uma das nossas estrelas de autores, vem do reino do Perl, é por
isto que a sua linguagem materna é o Perl. Eventualmente, também
contribui para o MySQL, melhorando um utilitário de administração web.
Verifique novamente a secção de referências.
Tudo isto para dizer que se anda à procura do paraíso do Perl...
junte-se à LinuxFocus.
Visto que sou um dos editores Franceses... e como sou um pouco
preguiçoso criei a minha própria base de dados da LinuxFocus
utilizando, advinhe o quê : MySQL e Perl !
Isto assumo que o MySQL foi devidamente instalado, os utilizadores
foram criados e protegidos com palavras-passe. A instalação não está na
abrangência deste artigo e a excelente documentação fornecida com o
MySQL dir-lhe-à tudo.
Inicie o servidor MySQL utilizando a scripts mysql.server, visto
que invoca o demónio safe_mysqld e pode passar parâmetros a este
demónio.
Ligue-se ao servidor utilizando
mysql -h host -u user -p
Se o servidor estiver a correr na sua máquina local então não precisa de -h host.CREATE DATABASE lf;
Este é o nosso exemplo (lf significa LinuxFocus) e obviamente que atribui o nome que deseja para a sua base de dados. De seguida, algumas permissões para os utilizadores autorizados, isto assume que tem o direito de fazer isto (ou seja se tem direito administrativo com o utilizador ligado). Se quiser que um utilizador seja capaz de administrar a base de dados pode-lhe dar os privilégios para o fazer, digitandoGRANT ALL ON lf.* TO username;
Seleccione a base de dados que acabou de criar digitando somenteUSE lf
Crie uma tabela segundo as suas necessidades. No nosso exemplo, criamos uma tabela chamada 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));
Verifiquemos, se foi criada como esperávamos com:
USE lf
SHOW TABLES;
DESCRIBE trissue;
LOAD DATA LOCAL INFILE "maindb.txt" INTO TABLE trissue;
Se o seu ficheiro de texto estiver correcto a sua tabela está agora preenchida. Pode verificar isto com :SELECT * FROM trissue;
Isto devia apresentar uma longa lista. Agora é capaz de obter qualquer tipo de dados utilizando consultas.
O Perl ajudar-nos-á a automatizar as consultas, para apresentar os
resultados num web browser, etc. Novamente isto implica que os módulos
do Perl foram devidamente instalados para utilizar o MySQL em
combinação com o Perl.
Utilizaremos agora as scripts de Perl como scripts cgi. Elas
permitir-nos-ão misturar o Perl e o HTML para consultar a base de
dados e formatar a saída.
Utilizaremos uma script simples como exemplo, permitindo-nos procurar
por todos os artigos escritos pelo mesmo autor. Apresentaremos os
números dos artigos, a categoria, o título, os nomes dos tradutores
para as diferentes línguas (somente para os projectos totalmente
funcionais) e a edição quando os artigos foram publicados.
Pode utilizar esta script como modelo para o seu próprio uso, mas tenha
cuidado que este exemplo não é um programa muito seguro. Pode obter uma
versão mais comentada em =>aqui<=.
#!/usr/bin/perl -Tw
# Primeiro, dizemos que isto é uma script de Perl "Tainted".
#
# Isto é um comentário
# consulta à BD
#
# Utilizamos o módulo do Perl DBI
use DBI;
# Bem como o 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">
# Aqui vem o botão do título para apresentar a página
<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.='"';
# Ligamo-nos à base de dados chamada lf como sendo o utilizador 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 {
# Ligação à Base de Dados (DB)
$dbh = DBI->connect("DBI:mysql:lf","doe",'');
# Search
$sth = $dbh->prepare("
select *
from trissue
");
$sth->execute;
# Apresenta o Resultado
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;
# Desliga
$dbh->disconnect;
exit;
Obviamente, se deseja fornecer um serviço de base de dados no seu site
deve proteger tudo. Claro que não daremos um modo passo-a-passo de
proteger o seu website ou o seu servidor de base de dados. Contudo, é
importante insistir nas operações básicas.
Para reduzir, quando fornece serviços na web a primeira coisa que tem de
proteger é o seu servidor web. Isto está para além da abrangência deste
artigo, se quiser aprender mais acerca desta matéria, existe imensa
documentação disponível. Um bom sítio para começar é o Projecto de Documentação do Linux (LDP).
O próximo passo diz respeito ao servidor de base de dados. Ao instalar
um utilitário como o MySQL não se esqueça de ler a parte de segurança
do manual. Novamente, o básico diz respeito às palavras-passe dos
utilizadores : nunca deixe uma conta sem palavra-passe, especialmente a
conta do root para a base de dados (a qual devia ser diferente da conta
da máquina root). Um outro ponto importante é acerca das permissões :
Não de total acesso a todo o mundo. Parece óbvio ... e é por isso que
muita pessoa se esqueçe !
Indo um pouco mais além, porque não correr a base de dados sem ser o root
? Verifique o artigo do Mark "Chrooting em
todos os serviços do Linux" nesta edição. Ele fala de uma base de dados
diferente mas o que ele diz pode ser aplicado ao MySQL.
Uma outra medida de segurança diz respeito à circulação dos dados. Não é
má ideia enviar e receber os dados através de um túnel. Pode verificar o
artigo Através do túnel para
mais informação.
Por último mas não menos importante, a programação segura é uma das
chaves. O Perl é uma grande linguagem, mas é muito fácil fazer erros com
ele. Um outro artigo da LinuxFocus ensinar-lhe-á o que deve fazer,
especialmente com o Perl. Dê uma vista de olhos aqui. É o último artigo da série
de programação segura e diz respeito, nomeadamente às scripts cgi. A "Ler
sem Falta" !
Claro, que isto assume que você já protegeu o seu sistema das falhas de
segurança mais conhecidas, com últimas actualizações e com muitos
utilitários de segurança obrigatórios tais como o NIDS (Network Intrusion
Detection System - Sistema de detecção de intrusos na rede) como o snort
(disponível em http://www.snort.org),
firewall, e scanners de segurança de portos nmap, nessus), etc.
Se tiver recursos, pode ter um servidor diferente para cada serviço
prestado : um servidor web, outro um servidor de base de dados... e o seu
próprio mirror para alta disponibilidade. E por aí além ! Nunca termina
este processo, visto que a segurança nunca termina. Você somente tenta
reduzir os riscos... e eles estão cada vez pior cada dia que passa. Foi
Avisado !
Como há mais de uma maneira de o fazer, você pode escolher o seu próprio
caminho. Existem imensas RDBMS e muitas linguagens para comunicar com
elas. A ideia por detrás da escrita deste artigo era mostrar como o MySQL
e o Perl trabalham bem em conjunto.
Claro, que a escolha foi muito subjectiva : Eu gosto do MySQL porque é
bastante pequeno no tamanho, trabalha em muitos SOs, é rápido, fiável...
Eu também aprecio o trabalho da equipa do MySQL, sem esquecer os numerosos
contribuidores. E o que eu gosto mais: estas pessoas não tentaram
reinventar a roda. Mantiveram as coisas simples.
Acerca do Perl, já tudo foi dito acerca dele : o que é que posso adicionar
? Eu acredito que não pode trabalhar sem ele, quer seja um administrador
de rede, um programador, ou o quer que seja. A comunidade do Perl é uma
das grandes fontes para partilhar conhecimento com todos. Uma revista está
disponível, chamada o "Perl Journal", a qual é agora incluída na revista
SysAdmin, todas as duas edições. Se quiser subscrever, vá até http://www.samag.com.
Visto que estamos a falar acerca de bom trabalho, aqui vem a secção normal fora de
sentido. Os nosso leitores da LinuxFocus provavelmente não se deram conta
do pequeno número de pessoas envolvidas na revista. Não obstante, pode
lê-la em muitas línguas diferentes. Já alguma vez reparou que algumas
equipas trabalham quase sempre só com uma ou duas pessoas fazendo todo o
trabalho ? São webmasters, tradutores, etc. Verifique a equipa Russa, a
equipa Turca : verá que a maior parte dos artigos são traduzidos pelo
Kirill ou Erdal. Verifique os projectos sob desenvolvimento, tais como o
Português ou o Árabe : o mesmo resultado ! Gostaria de os felicitar a
todos eles pelo seu excelente trabalho que fazem. Obrigado a todos vós: a
comunidade de software livre deve-vos imenso.
Desculpem a digressão, mas acredito que isto tinha de ser dito.
Voltando ao assunto, terminemos com algumas palavras acerca do software
livre. As pessoas do MySQL e do Perl merecem muitos agradecimentos. Eles
fornecem-lhe utilitários praticamente livres. Contudo estes utilitários
são muitas vezes tão bons como os verdadeiros produtos comerciais ( se não
melhores), são actualizados frequentemente, muito bem documentados e pode
utilizá-los quase em todos os sistemas Unix. Consegue encontrar software
equivalente, por aí ? Creio que não !
Este artigo provavelmente não o ajudará muito, contudo se tiver vontade de
experimentar estes produtos não será desnecessário.
Não estamos a viver num tempo espectacular ?
Perl.org
cpan.org, o arquivo de perl
Os tutoriais de Perl do Guido :
Perl I
Perl II
Perl III
Revisão do Livro Professional Perl Programming :
Perl Programming
A contribuição do Atif
para o MySQL.
Uma revisão do MySQL pela LinuxFocus : uma velho artigo mais ainda
actualizado :
MySQL
Dois velhos tutoriais de SQL da LinuxFocus :
SQL Part I
SQL Part II