Revista Do Linux
 
  Pesquise:
  
EDIÇÃO DO MÊS
 CD do Mês

 Capa
 Entrevista
 Corporativo
 Programação
 Segurança
 Ferramenta
 Produto
 Hardware
SEÇÕES
  Anunciantes
  Humor
  Dicas e Truques
  Notícias On-Line
  Comunidade
  Colaboração
  Ofertas de Emprego
  Contato
  Fórum
  Artigos On-Line
  Enquetes
  Assinatura
  Publicidade
  Edições Anteriores

 

Gerenciamento com select

Ele pode ser útil na linha de comando ou em scripts. Possivelmente você já enfrentou o problema de ter de excluir um e-mail da fila antes que ele seja enviado ou manipular rapidamente as filas de impressão. Veremos como lidar com essas situações usando o select.

Sua sintaxe é similar à sintaxe do for:

select VAR in <LISTA>;
do
	comando 1; 
	comando 2;
done

O select gera uma lista de itens numerada como um menu de opções. Exemplo 1:

# select VAR in UM DOIS TRES; do echo $VAR ; done
1) UM
2) DOIS
3) TRES
#?

Você pode selecionar um item da lista pelo número que lhe foi atribuído.

1) UM
2) DOIS
3) TRES
#? 2
DOIS

Para criar um script de manipulação de e-mail é preciso conhecer um pouco o modo pelo qual os e-mails são armazenados quando estão na fila de saída. São criados dois arquivos no diretório /var/spool/mqueue, um contendo todo o cabeçalho e o outro a mensagem.

O nome do arquivo que possui o cabeçalho começa com os caracteres "qf" e seu conteúdo começa com "df" e ambos possuem o mesmo final. Exemplo 2:

qfff4KGnNw00773 = Arquivo de cabeçalho
dfff4KGnNw00773 = Arquivo de conteúdo

Você pode extrair o assunto de uma mensagem pesquisando a palavra chave "Subject" da seguinte forma — Exemplo 3:

# grep ‘Subject:’ /var/spool/mqueue/qfff4KGnNw00773 
H??Subject: Outro teste de email

É possível extrair o autor da mensagem. Exemplo 4:

# grep ‘From:’ /var/spool/mqueue/qfff4KGnNw00773 
H?F?From: Edison Figueira <efigueira@brc.com.br>

Outra informação importante, nesse caso, é o tamanho do e-mail, que é exatamente o tamanho do arquivo "df" e pode ser extraído com um simples ls. Exemplo 5:

# ls /var/spool/mqueue/dff4KGnNw00773 |
awk ‘{print $5}’
30

Agora que sabemos como são armazenados os e-mails que estão na fila de saída, você já pode fazer seu script para dar manutenção neles. Vamos escrever este script totalmente na linha de comando, mas você poderá salvá-lo em um arquivo para não ter de escrevê-lo toda vez. Vamos criar uma lista de e-mails que estão na fila. Exemplo 6:

# for i in qf* ;do echo "$i:$(grep ‘From:’ $i | awk ‘{print $3}’)" ; done

qff4KGmHT00767:<efigueira@brc.com.br> 
qff4KGnNw00773:<neto@brc.com.br> 
qff4KJG4k01649:<mnegrao@brc.com.br>

Se substituirmos o parâmetro <LISTA> do comando select pelo comando acima, aparece esta saída. Exemplo 7:

#select n in ‘for i in qf* ;do echo "$i:$(grep ‘From:’ $i | awk ‘{print $3}’)" ; done’; 
do echo $n; done
1) qff4KGmHT00767:<efigueira@brc.com.br> 
2) qff4KGnNw00773:<neto@brc.com.br> 
3) qff4KJG4k01649:<mnegrao@brc.com.br>
#?

Desse modo você já tem um menu com a lista de e-mails na fila de saída. Agora crie uma lista de comandos para serem usados com essa lista de e-mails. Exemplo 8:

#select y in rm stat more ; do echo $y ; done 

1) rm
2) stat
3) more
#?

Agora pegue o Exemplo 7 e substitua o comando echo $n no Exemplo 8. Assim:

#select n in ‘for i in qf* ;do echo "$i:$(grep ‘From:’ $i | awk ‘{print $3}’)" ; done’; do select y in rm stat more ; do echo $y $n ; done; done
1) qff4KGmHT00767:<efigueira@brc.com.br> 
2) qff4KGnNw00773:<neto@brc.com.br> 
3) qff4KJG4k01649:<mnegrao@brc.com.br>
#? 2
1) rm
2) stat
3) more
#? 1
rm qff4KGnNw00773:<neto@brc.com.br> 

Use o CRTL+D para sair do select.

Agora existem duas variáveis importantes: em $y há o comando que escolhemos e em $n o QID+<FROM>. É preciso testar qual comando foi escolhido e executá-lo, de duas maneiras: if e case. Com o if:

#if [ "$y" -eq "rm" ]; then <executa o comando rm>; fi

Exemplo 9:

# select n in ‘for i in qf* ;do echo "$i:$(grep ‘From:’ $i | awk ‘{print $3}’)" ; done’; do select y in rm stat more ; do ID=‘echo $n|awk -F":" ‘{print $1}’|awk -F"qf" ‘{print $2}’’;if [ "$y" == "rm" ]; then rm -i ?f$ID ; elif [ "$y" == "stat" ]; then stat df$ID ;else more df$ID;fi ; done; done

No segundo select (o que tem os comandos), troque a lista de comandos por outras mensagens: rm = Apagar o e-mail. stat = Ver tamanho e data. more = Ler o e-mail.

O exemplo anterior foi feito utilizando o sendmail como servidor de e-mail. Caso você use outro servidor de e-mail, terá de saber como seus e-mails são guardados. Outro detalhe que deve ser observado é que o sendmail tenta enviar a mensagem diretamente sem criar fila, a fila só é criada quando a mensagem é um pouco grande ou quando não foi possível enviar a mensagem em determinado momento. Mas podemos forçar o sendmail a colocar as mensagens na fila sempre. Basta alterar o parâmetro DeliveryMode=background para DeliveryMode=q, que está no arquivo /etc/sendmail.cf. Como esse comando será utilizado várias vezes, você terá de salvá-lo em um arquivo. Segue abaixo a versão script:

#!/bin/bash
cd /var/spool/mqueue
select n in ‘for i in qf* ;do echo "$i:$(grep ‘From:’ $i | awk ‘{print $3}’)" ; done’; do 
	select y in rm stat more ; 
	do 
		ID=‘echo $n|awk -F":" ‘{print $1}’|awk -F"qf" ‘{print $2}’’;
		if [ "$y" == "rm" ]; 
		then 
			rm -i ?f$ID ; 
		elif [ "$y" == "stat" ]; 
		then 
			stat df$ID ;
		else 
			more df$ID;
		fi ; 
	done; 
done

Agora que você já conhece o potencial do select, poderá fazer um gerenciador de impressão.

Até a próxima!


A Revista do Linux é editada pela Conectiva S/A
Todos os Direitos Reservados.

Política de Privacidade
Anuncie na Revista do Linux