[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