#!/usr/bin/env python

# Munin Plugin for Cherokee in Python
# Based on the work of Mateusz Pawlowski: http://www.mobygeek.net/projects/files/cherokee__type_.rb
# Coded by the not-python-programmer Jose Luis Salas <<josacar at gmail dot com>>  ;)

#%# family=contrib
# Cherokee has to have $host/about enabled with server info set to normal
# Or you can change the variables below as you wish
# Handling arguments
#
# cherokee_host_type_data Shows data transferred
# cherokee_host_type_rate Shows data rate transfer
# cherokee_host_type_mod Shows Modules
# cherokee_host_type_conn Shows connections

# USAGE:
# cp /home/user/cherokee__type_.py /usr/share/munin/plugins/cherokee__type_
# chmod +x /usr/share/munin/plugins/cherokee__type_
# ln -s /usr/share/munin/plugins/cherokee__type_ cherokee_host_type_data
# ln -s /usr/share/munin/plugins/cherokee__type_ cherokee_localhost_type_data
# ln -s /usr/share/munin/plugins/cherokee__type_ cherokee_localhost_type_conn
# ln -s /usr/share/munin/plugins/cherokee__type_ cherokee_localhost_type_mod
# ln -s /usr/share/munin/plugins/cherokee__type_ cherokee_localhost_type_rate


import urllib2
import base64
import os
import sys
import re
import json

#py returns invalid json
about_location = "/about/info/js"

#Leave empty if not required
http_user = "admin"
http_pass = "pass"

host = os.getenv('host');
type = 'data';

host = "localhost"

match = re.match('^(?:|.*\/)cherokee_([^_]+)_type_(.+)$', sys.argv[0])
if match:
	host=match.group(1)
	type=match.group(2)
	if re.match('^([^:]+):(\d+)$', host):
		host=match.group(1)
		type=match.group(2)

#print "HOST: " + host + " TYPE: " + type

def output_values(response):
	if type == "mod" :
		section = response["modules"]
		for key in section:
			print key + '.value ' + str(section[key])
	elif type == "data" :
		section = response["traffic"]
		print "sent.value " + str(section["tx"])
		print "received.value " + str(section["rx"])
	elif type == "rate" :
		section = response["traffic"]
		print "sent.value " + str(section["tx"])
		print "received.value " + str(section["rx"])
	elif type == "conn" :
		section = response["connections"]
		for key in section:
			print key + '.value ' + str(section[key])


def get_data():
	global host
	global about_location
	global http_user
	global http_pass
	url = "http://%s%s" % ( host , about_location )
	request = urllib2.Request(url)
	base64string = base64.standard_b64encode('%s:%s' % (http_user, http_pass))
	if len(http_user) > 0 and len(http_pass) > 0:
		#print "DEBUG: AUTH: " + base64string
		request.add_header("Authorization", "Basic %s" % base64string)   
	#print "DEBUG: GET: " + url
	raw_data = urllib2.urlopen(request).read()
	#print "DEBUG: " + raw_data
	return json.loads(raw_data)

def munin_values(res):
	output_values(res)

def munin_config(response):
	global type
	print "graph_category cherokee"
	if type == "rate":
		print "graph_title Cherokee Data Transfer Rate"
		print "graph_vlabel Bits sent(+) / received(-) per ${graph_period}"
		print "graph_args --base 1000"
		print "graph_info"
		print "received.label Received"
		print "received.graph no"
		print "received.type COUNTER"
		print "received.cdef received,8,*"
		print "sent.label bps"
		print "sent.type COUNTER"
		print "sent.negative received"
		print "sent.cdef sent,8,*"
	elif type == "conn":
		print "graph_title Cherokee Connections"
		print "graph_vlabel Connections"
		#print "graph_args --base 1000 --logarithmic"
		print "graph_args --base 1000"
		section = response["connections"]
		for key in section:
			print key.strip() + '.label ' + key.capitalize()
			print key + '.draw AREASTACK'
	elif type == "data":
		print "graph_title Cherokee Data Transferred"
		print "graph_vlabel Bytes"
		print "sent.label Sent"
		print "received.label Received"
	elif type == "mod":
		print "graph_title Cherokee Loaded Modules"
		print "graph_vlabel Modules"
		print "graph_args --base 1000 --lower-limit 0"
		section = response["modules"]
		for key in section:
			print key + '.label ' + key.capitalize()
			print key + '.draw AREASTACK'
	
if len(sys.argv) > 1 and sys.argv[1] == "config":
	munin_config(get_data())
else:
	munin_values(get_data())
