Como usar o procmail para colocar uma mensagem em uma variável

1

Estou tentando fazer com que as alterações registradas por nossa instalação RANCID sejam registradas e enviadas para um sistema interno de difusão de comunicações que temos. Eu posso falar com isso diretamente via netcat, por exemplo, isso vai funcionar:

echo "Hello world" | netcat localhost 12345

O RANCID envia as alterações por e-mail, por isso estou tentando usar o procmail para interceptar esses e-mails e fazer com que eles enviem para o nosso pastebin local e enviar a resposta (que contém o URL) para o netcat.

Eu posso replicar todo esse fluxo na linha de comando da seguinte forma:

testmail=$(cat testmail.txt)
URL=$(curl --silent -d "text=$testmail" -d "title=Logged Activity" http://paste/api/create) && echo "RANCID logged some changes: $URL" | netcat localhost 12345

Aqui está o meu .procmailrc no momento:

## store the body in MESSAGE
:0 b
MESSAGE=|

##Send that message to Wirehive pastebin
:0
| URL=$(curl -d "text=$MESSAGE" -d "title=Logged Activity" http://paste/api/create) && echo "RANCID logged some changes: $URL" | netcat localhost 12345

Verificando o registro de e-mail, o roteamento de e-mail está funcionando bem. Com o arquivo todo comentado e verificando a caixa de correio de usuários de recebimento no mutt, consigo ver a mensagem entrar. Com o arquivo descomentado, a mensagem não aparece na caixa de correio, portanto .procmailrc está sendo processado e a mensagem está passando para ele.

Provavelmente vale a pena notar que isso está no Ubuntu 12.04.

    
por SimonJGreen 24.04.2013 / 01:00

1 resposta

1

A designação MESSAGE não funciona da maneira como você a escreveu. Tente isto:

:0b
MESSAGE=| cat

Além disso, a designação URL=... não é um comando válido; você tem que refatorar a atribuição da variável para estar fora da receita:

URL='curl --silent -d "text=$testmail" -d "title=Logged Activity" http://paste/api/create'
:0
| echo "RANCID logged some changes: $URL" | netcat localhost 12345

... ou talvez você consiga fazer isso invocar um shell, geralmente adicionando um dos SHELLMETAS :

:0  # notice semicolon at end
| URL=$(curl -d "text=$MESSAGE" -d "title=Logged Activity" http://paste/api/create) \
  && echo "RANCID logged some changes: $URL" | netcat localhost 12345 ;

... mas, na verdade, gosto da alternativa antiga e mais legível.

Se você puder refatorar de alguma forma a linha de comando curl para ler entrada padrão e gravar na saída padrão, isso pode ser mais elegante, pelo menos para evitar a variável MESSAGE separada e possivelmente até mesmo ser refatorado em apenas um one-liner.

    
por 25.04.2013 / 08:25