Tail server logs into XMPP?
So I have two files, and if a new line appears on either of these files, I'd like to receive an IM (preferably jabber or gTalk) containing the contents of that line. Do you guys have any suggestions for a Linux daemon or something that could do that?
If you are logging trough syslog, Metalog has support to execute a command whenever a message matching some criterion gets logged. Otherwise, you can use tailf
to watch for new lines in a log file.
sendxmpp is a small perl script to send XMPP messages (possibly already available as a package for your favorite distribution)
You could stitch those two together with a shell script without too much difficulty. For the metalog case, create a script like this one:
#!/bin/sh
echo $* |sendxmpp [email protected]
And add command = /path/to/script.sh
to the relevant section of metalog.conf
For the tailf case, you could try something like this, run in a persistent way:
tailf /var/log/file-to-watch.log |(while true; do read M; echo $M | sendxmpp [email protected]; done)
sendxmpp needs a valid XMPP account, see the man page for how to configure the account to be used.
(from my experience, XMPP-delivered error messages tend to become quite annoying if they're too frequent...)
I made that little python script. You can use it as a starting point
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)
I used information on that page for connecting xmpppy to Google Talk.