O servidor de cauda registra no XMPP?

8

Então eu tenho dois arquivos, e se uma nova linha aparecer em qualquer um desses arquivos, eu gostaria de receber um IM (de preferência um jabber ou gTalk) contendo o conteúdo dessa linha. Vocês tem alguma sugestão para um daemon do Linux ou algo que possa fazer isso?

    
por icco 30.07.2010 / 20:33

2 respostas

13

Se você estiver registrando através do syslog, o Metalog tem suporte para executar um comando sempre que uma mensagem correspondente a algum critério for registrada. Caso contrário, você pode usar tailf para observar novas linhas em um arquivo de log.

sendxmpp é um pequeno script em perl para enviar mensagens XMPP (possivelmente já disponíveis como um pacote para sua distribuição favorita)

Você pode costurar os dois juntos com um shell script sem muita dificuldade. Para o caso do metalog, crie um script como este:

#!/bin/sh
echo $* |sendxmpp [email protected]

E adicione command = /path/to/script.sh à seção relevante do metalog.conf

Para o caso tailf, você pode tentar algo assim, executado de maneira persistente:

tailf /var/log/file-to-watch.log |(while true; do read M; echo $M | sendxmpp [email protected]; done)

O sendxmpp precisa de uma conta XMPP válida, veja a página do manual para saber como configurar a conta a ser usada.

(pela minha experiência, mensagens de erro entregues pelo XMPP tendem a se tornar muito irritantes se forem muito frequentes ...)

    
por 30.07.2010 / 22:20
2

Eu fiz aquele pequeno script python. Você pode usá-lo como ponto de partida

import xmpp, os, time

login     = 'Your.Login' # @gmail.com
pwd       = 'YourPassword'
recipient = '[email protected]'
logfile   = "/home/myself/test.log"

def sendmsg(text):
  global login, pwd, recipient
  cnx = xmpp.Client('gmail.com')
  cnx.connect( server=('talk.google.com',5223) )
  cnx.auth(login,pwd, 'botty')
  cnx.send( xmpp.Message( recipient , text ) )

oldsize = newsize = os.path.getsize(logfile)
while True:
  newsize = os.path.getsize(logfile)
  if newsize != oldsize:
    f = open(logfile)
    f.seek(oldsize, os.SEEK_SET)
    s = f.read()
    if s[-1] == '\n':
      sendmsg(s)
      oldsize = f.tell()
    f.close()
  time.sleep(10)

Eu usei informações em essa página para conectar o xmpppy ao Google Talk.

    
por 30.07.2010 / 22:31