summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Sommerseth <davids@redhat.com>2012-09-16 15:22:49 +0200
committerDavid Sommerseth <davids@redhat.com>2012-09-16 15:22:49 +0200
commit286cb5485637ff4a4a0371beb775812c0c0ef0b5 (patch)
tree712849a6c05fc8ffac3e7a86c1ca1a3baea34e90
parent2fd3b0c451ce8e3d007029520bf2e4f48afd5d40 (diff)
downloadlogactio-286cb5485637ff4a4a0371beb775812c0c0ef0b5.tar.gz
logactio-286cb5485637ff4a4a0371beb775812c0c0ef0b5.tar.xz
logactio-286cb5485637ff4a4a0371beb775812c0c0ef0b5.zip
Added a simple HTTP reporter module
This will send alerts to a web server via HTTP GET/POST requests Signed-off-by: David Sommerseth <davids@redhat.com>
-rw-r--r--LogActio/Reporters/HTTPreporter.py106
1 files changed, 106 insertions, 0 deletions
diff --git a/LogActio/Reporters/HTTPreporter.py b/LogActio/Reporters/HTTPreporter.py
new file mode 100644
index 0000000..a006310
--- /dev/null
+++ b/LogActio/Reporters/HTTPreporter.py
@@ -0,0 +1,106 @@
+#
+# logactio - simple framework for doing configured action on certain
+# log file events
+#
+# Copyright 2012 David Sommerseth <dazo@users.sourceforge.net>
+#
+# 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.
+#
+
+import sys, urllib, urllib2
+from LogActio import Message, ReporterQueue
+
+
+class HTTPreporter(ReporterQueue.ReporterQueue):
+ """Simple LogActio reporter module, sending alerts via HTTP/HTTPS
+
+ Example configuration to be used in /etc/logactio.cfg
+
+ [Reporter:HTTP]
+ module: HTTPreporter
+ method: POST
+ url: http://alerts.example.com/logactio/alerts.php
+
+ This will send reports to the given URL using POST. If you want
+ to use GET instead of POST, modify or remove the 'method' variable
+ """
+
+ def __init__(self, config, logger = None):
+ if not config.has_key("url"):
+ raise Exception("HTTPreporter is not configured with a URL")
+
+ self.__method = config.has_key("method") and config["method"] or "GET"
+ self.__url = config["url"]
+ self.__log = logger and logger or self.__logfnc
+
+ if self.__method != "GET" and self.__method != "POST":
+ raise Exception("HTTPreporter is configured with an invalid submission method: '%s'" %
+ str(self.__method))
+
+ ReporterQueue.ReporterQueue.__init__(self,
+ "HTTPreporter",
+ "HTTP Reporter",
+ self.__processqueue)
+
+ def __logfnc(self, lvl, msg):
+ print "%s" % msg
+ sys.stdout.flush()
+
+
+ def __processqueue(self):
+ done = False
+
+ # Process the message queue
+ while not done:
+ msg = self._QueueGet()
+
+ if( msg.MessageType() == Message.MSG_SHUTDOWN ):
+ # Prepare for shutdown
+ done = True
+
+ elif( msg.MessageType() == Message.MSG_SEND ):
+ m = msg.Message()
+ m["priority"] = msg.Priority()
+ data = urllib.urlencode(m)
+
+ if self.__method == "GET":
+ req = urllib2.Request("%s?%s" % (self.__url, data))
+ self.__log(1, "[HTTPreporter] GET %s?%s" % (self.__url, data))
+ elif self.__method == "POST":
+ req = urllib2.Request(self.__url, data)
+ self.__log(1, "[HTTPreporter] POST %s {%s}" % (self.__url, data))
+ else:
+ self.__log(0, "[HTTPreporter] Unknown method '%s'" %
+ self.__method)
+ res = urllib2.urlopen(req)
+ self.__log(4, "[HTTPreporter] Repsonse: %s" % res.read())
+
+
+ def ProcessEvent(self, logfile, prefix, msg, count, threshold):
+ # Format the report message
+ msg = {"prefix": prefix, "count": count, "threshold": threshold,
+ "message": msg, "logfile": logfile}
+
+ # Queue the message for sending
+ self._QueueMsg(0, msg)
+
+
+def InitReporter(config, logger = None):
+ return HTTPreporter(config, logger)