#!/usr/bin/env python2 # # logactio - simple framework for doing configured action on certain # log file events # # Copyright 2012 David Sommerseth # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # For the avoidance of doubt the "preferred form" of this code is one which # is in an open unpatent encumbered format. Where cryptographic key signing # forms part of the process of creating an executable the information # including keys needed to generate an equivalently functional executable # are deemed to be part of the source code. # # # This is a simple Qpid consumer script, which reports all alerts to stdout # import sys, json, socket from optparse import OptionParser from qpid.util import connect from qpid.connection import Connection from qpid.datatypes import Message, RangedSet, uuid4 from qpid.queue import Empty if __name__ == "__main__": parser = OptionParser() parser.add_option("--broker", action="store", dest="broker", default="localhost", metavar="HOSTNAME", help="Qpid broker to connect to") parser.add_option("--port", action="store", dest="port", default=5672, metavar="PORT", help="Qpid broker port") parser.add_option("--exchange", action="store", dest="exchange", metavar="EXCHANGE", help="Qpid exchange to pull messages from") parser.add_option("--bind-key", action="store", dest="bindkey", metavar="BIND-KEY", help="Routing key to bind against") (opts, args) = parser.parse_args() if opts.exchange is None or opts.bindkey is None: print "** ERROR ** Missing --exchange or --bind-key" sys.exit(1) qpidsock = connect(opts.broker, opts.port) connection = Connection (sock=qpidsock, host=opts.broker, service="qpidd") connection.start() session = connection.session(str(uuid4())) session.queue_declare(queue="qpidalerter", exclusive=True) session.exchange_bind(exchange=opts.exchange, queue="qpidalerter", binding_key=opts.bindkey) local_queue = session.incoming("local_qpidalerter") session.message_subscribe(queue="qpidalerter", destination="local_qpidalerter") local_queue.start() print "Started qpid-alert-watcher\n" while True: try: message = local_queue.get() alert = json.loads(message.body) session.message_accept(RangedSet(message.id)) print "== LogActio Alert ===============================================" print "Alert prefix: %-20s [Count %i, threshold %i]" % ( alert["prefix"], alert["count"], alert["threshold"]) print "Logfile: %s" % alert["logfile"] if alert["message"] is not None: almsg = "\n ".join(alert["message"].split("|")) else: almsg = "(No message)" print "Message: %s" % almsg print "-----------------------------------------------------------------" except Empty: print ">> (Empty message received)" except socket.gaierror, e: print "** WARNING ** Socket error - %s" % str(e) print " Trying again in 10 seconds" time.sleep(10) except socket.error, e: print "** WARNING ** Socket error - %s" % str(e) print " Trying again in 20 seconds" time.sleep(20)