[Cascavel-pm] Script em Perl
glasswalk3r em yahoo.com.br
glasswalk3r em yahoo.com.br
Terça Fevereiro 27 05:49:10 PST 2007
Olá Rafael,
A primeira coisa que você deveria ter procurado é se já não existe algo
pronto no CPAN (como
http://search.cpan.org/~pjb/Term-Clui-1.37/examples/linux_admin) para ver
se alguém já não resolveu esse seu problema (que me parece bastante comum)
ou mesmo um programa como o Webmin.
Assumindo que você fez isso como exercício, vai alguns sintomas de que seu
script vai mal:
- está mal identado: use algum programa para fazer isso automaticamente pra
você. Eu por exemplo uso Vim 7 com o script perl-support instalado. Nossos
olhos (incluindo o seu) agradecem.
- você está patinando quanto a sintaxe do open(). Talvez seja uma boa idéia
dar uma lida na documentação online do Perl. Li em outra mensagem que você
está usando o livro Programação Perl (conhecido também como Camel Book). O
livro ainda é uma boa referência, mas já está meio velhinho. Sempre
verifique se as coisas já não mudaram na documentação online.
- Sempre teste as entradas de usuário, você não está fazendo isso.
- Cuidado ao ler arquivos inteiros e jogar seu conteúdo dentro de um array.
Se o arquivo for muito grande, você pode acabar com a memória do
computador. Se você não pode garantir o tamanho do arquivo, nunca faça isso.
- Considere usar um banco de dados um pouco mais robusto que um arquivo de
texto. O arquivo texto é bom para o Squid e ruim para seu programa. Se você
usar algo como DBM ou mesmo o SQLLite o programa vai conseguir gerenciar
melhor remover e adicionar sites e então gerar um arquivo texto para o
Squid.
Eu modifiquei o seu programa, fiz um teste rápido e aparentemente ele faz o
que você precisa:
#!/usr/bin/perl
use warnings;
use strict;
use File::Copy;
my $arquivo = '/etc/squid/arquivos/liberados/dl_geral';
my $backup = $arquivo . 'backup';
open( LIBERADOS, '<', $arquivo )
or die("Nao pode abrir o arquivo $arquivo: $!");
while (<LIBERADOS>) {
print $_;
}
close(LIBERADOS);
print 'Insira o site a ser removido: ';
my $site = <STDIN>;
chomp $site;
# :TODO:27/2/2007:ARFJr: implementar testes para a entrada do usuário,
# como verificar se a entrada não é vazia
# e se o site digitado já existe na lista
copy( $arquivo, $backup ) or die "A copia falhou: $!\n";
open( LIBERADOS, '>', $arquivo ) or die "Nao pode criar o arquivo $arquivo:
$!";
open( VELHO, '<', $backup ) or die "Nao pude ler o arquivo $backup:
$!\n";
while (<VELHO>) {
chomp;
next if $_ eq $site;
print LIBERADOS $_, "\n";
}
close(VELHO);
close(LIBERADOS);
# :TODO:27/2/2007:ARFJr: implementar alguma checagem para ver se o arquivo
está ok,
# por exemplo, checar o tamanho do arquivo se é diferente de zero antes de
forçar
# o Squid a ler a configuração novamente
system("squid -k reconfigure") == 0 or die "Could not restart Squid: $!\n";
__END__
A propósito, procure colocar alguma informação mais útil no campo Assunto
do email antes de enviar uma mensagem para a lista. Todo mundo aqui usa um
"script em perl". :-)
[]'s
Alceu
Original Message:
-----------------
From: Rafael Lebrão Martins rafamv1 em ig.com.br
Date: Thu, 22 Feb 2007 15:34:07 -0200
To: cascavel-pm em pm.org
Subject: [Cascavel-pm] Script em Perl
Boa tarde, estou com problemas para criar um script que remove sites de uma
lista do squid. A função do script é receber como argumento o nome do site
a
ser removido, caso o site exista na lista e imprimir na tela a mensagem de
que o site foi removido com sucesso. Fiz o script abaixo, quando o executo
ele imprime a mensagem de que o site foi removido, no entanto, se eu abro o
arquivo do squid o site continua lá. Preciso de ajuda para resolver esse
problema... Segue abaixo o script... Obrigado.
#!/usr/bin/perl
use warnings;
use strict;
my $arquivo = '/etc/squid/arquivos/liberados/dl_geral';
open ( LIBERADOS,$arquivo ) or die ( "Nao pode abrir o arquivo: $!" );
my @linhas = <LIBERADOS>;
close (LIBERADOS);
print "@linhas\n";
print "Insira o site a ser removido: ";
my $site = <STDIN>;
chomp $site;
open ( LIBERADOS,">>$arquivo" ) or die ( "Nao pode abrir o arquivo: $!" );
my $linhas = "@linhas";
if ($linhas =~ $site) {
#delete (LIBERADOS $site};
s/$site/funcionou/gi;
print "O site $site foi removido com sucesso\n";
close ( LIBERADOS ) or die ( "Nao pode fechar o arquivo: $!" );
}
else {
open ( LIBERADOS,">>$arquivo" ) or die ( "Nao pode abrir o arquivo: $!" );
print ( LIBERADOS "\n$site" );
close ( LIBERADOS ) or die ( "Nao pode fechar o arquivo: $!" );
system("squid -k reconfigure");
print " O site foi adicionado com sucesso.\n";
}
--------------------------------------------------------------------
myhosting.com - Premium Microsoft® Windows® and Linux web and application
hosting - http://link.myhosting.com/myhosting
Mais detalhes sobre a lista de discussão Cascavel-pm