Process Monit HTTP/XML
Nomit
=====
Nomit is a small library that can be used to process HTTP/XML POST
requests from Monit_ instances. While it is a relatively trivial adaption
of Python's `BaseHTTPRequestHandler`_, it may be useful to multiple
other projects. For this reason Nomit is registered as its own little
project.
Monit_ is a free utility for managing Unix systems. Multiple Monit
instances can be centrally managed by its sister project MMonit.
Monit communicates with MMonit through HTTP/XML POST request.
Requirements
------------
Nomit uses the `lxml.objectify` module from the lxml_ project. Many Linux
distributions provide lxml_ in their native package format.
The `MonitHandler` class
------------------------
Nomit provides a single class `MonitHandler` which is a sub-class of
`BaseHTTPRequestHandler`_. `MonitHandler` is meant to be sub-classed
itself.
It provides two methods:
- `handle_unparsed()` is called with the raw XML of the HTTP/XML POST request.
- `handle_parsed()` is called after the XML has been parsed by `lxml.objectify.fromstring()`.
The default implementation of these methods does nothing. Any derived class must
implement these methods as necessary.
Example
--------
The example below implements `handle_unparsed()` to print the raw XML as
POSTed by the Monit agent and uses `handle_parsed()` to display the data
structure returned by `lxml.objectify.fromstring()`::
import BaseHTTPServer
import xml.dom.minidom
import lxml.objectify
import nomit
class ExampleHandler(nomit.MonitXmlHandler):
def handle_unparsed(self, s):
print xml.dom.minidom.parseString(s).toprettyxml()
def handle_parsed(self, o):
print lxml.objectify.dump(o)
server = BaseHTTPServer.HTTPServer(("127.0.0.1", 2811), ExampleHandler)
server.serve_forever()
Monit configuration
-------------------
The Monit agent must be told to POST status information to the Python
script above. From the agent's point of view the script is simply (another[1]_)
MMonit server.
``monit.conf``::
set mmonit http://monit:monit@mmonit.example.com:8080/collector
http://localhost:2811/
_[1] The ``set mmonit`` directive accepts multiple URLs.
.. _Monit: http://mmonit.com/monit/
.. _MMonit: http://mmonit.com/monit/#mmonit
.. _`BaseHTTPRequestHandler`: https://docs.python.org/2/library/basehttpserver.html
.. _lxml: http://lxml.de/