#!/usr/bin/python
# Monit status parser plugin for munin

# This is very raw, but it should work for you out of the box.  You of course
# need to have monit configured such that the 'monit status' command works.

# Todd Troxell <ttroxell@debian.org>

STATUS_CMD = "monit status"

import sys
import re
from commands import getstatusoutput

def sanitize(s):
    OK_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789"
    out = str()
    for char in s:
        if char.lower() in OK_CHARS:
            out += char
    return out

procs = dict()

status, output = getstatusoutput(STATUS_CMD)
if status != 0:
    print "Error running status command: %s" % (output)
    sys.exit(status)

output = output.split('\n')
cur_proc = None
for line in output:
    m = re.match("^Process '(.*)'.*$", line)
    if m:
        cur_proc = sanitize(m.group(1))
        try:
            procs[cur_proc]
        except KeyError:
            procs[cur_proc] = dict()
        continue
    m = re.match("  memory total\s+([0-9.]+) ([kMG])B$", line)
    if m:
        prefix = m.group(2)
        multi = 1
        if prefix == 'M':
            multi = 1024
        elif prefix == 'G':
            multi = 1048576
        procs[cur_proc]["total_memory"] = float(m.group(1))*multi
        continue
    m = re.match("  cpu percent total\s+([.0-9]+)%.*$", line)
    if m:
        procs[cur_proc]["total_cpu"] = m.group(1)
        continue

if len(sys.argv) > 1 and sys.argv[1] == 'config':
    print 'graph_title Per process stats from Monit'
    print 'graph_vlabel numbers'
    print 'graph_category monit'
    for process in procs:
        for stat in procs[process]:
            print "monit_%s_%s.label %s.%s" % (process, stat, process, stat)
            if stat == 'total_memory':
                print "monit_%s_%s.warning 1:" % (process, stat)
    sys.exit(0)

for process in procs:
    for stat in procs[process]:
        print "monit_%s_%s.value %s" % (process, stat, procs[process][stat])
