#!/usr/bin/php
<?php

/*
Plugin to monitor users on a Mumble server (a.k.a. murmur).
Use ICE to to query murmur.

Origional Author: Thomas Leveil
Contributors: none
Version: 1.0

You can specify a different ip:port in the munin-node config file as follow:

[murmur_ice_users]
env.host 127.0.0.1
env.port 6502


#%# family=contrib
#%# capabilities=autoconf
*/

$host = "127.0.0.1";
$port = "6502";

if (isset($_ENV['host'])) $host = $_ENV['host'];
if (isset($_ENV['port'])) $port = $_ENV['port'];


switch ($argv[1]) 
{
	case 'autoconf':
		do_autoconf();
	break;
	
	case 'config':
		do_config();
	break;
	
	default:
		do_count();
	break;
}
exit(1);


function do_autoconf()
{
	global $ICE, $host, $port;
	try
	{
		Ice_loadProfile();
		$iceproxy = $ICE->stringToProxy("Meta:tcp -h $host -p $port");
		$metaServer = $iceproxy->ice_checkedCast("::Murmur::Meta");
		fwrite(STDOUT, "yes\n");
		exit(0);
	}
	catch (Exception $e)
	{
		fwrite(STDOUT, "no\n");
		exit(1);
	}
}

function do_config()
{
	fwrite(STDOUT, "graph_title Mumble Users\n");
	fwrite(STDOUT, "graph_vlabel Connected Users\n");
	fwrite(STDOUT, "graph_category VoIP\n");
	fwrite(STDOUT, "graph_info This graph shows the number of connected users on a murmur server\n");
	fwrite(STDOUT, "maxusers.label Maximum number of users allowed\n");
	fwrite(STDOUT, "maxusers.type GAUGE\n");
	fwrite(STDOUT, "online.label connected users\n");
	fwrite(STDOUT, "online.type GAUGE\n");
	exit(0);
}

function do_count()
{
	global $ICE, $host, $port;
	
	$totalMaxUsers="U";
	$totalConnectedUsers="U";

	try 
	{
		Ice_loadProfile();
		$iceproxy = $ICE->stringToProxy("Meta:tcp -h $host -p $port");
		$metaServer = $iceproxy->ice_checkedCast("::Murmur::Meta");
		$AdefaultConf = $metaServer->getDefaultConf();
		
		$AvirtualServer = $metaServer->getBootedServers();
		
		$totalMaxUsers = 0;
		foreach ($AvirtualServer as $numserver=>$s) 
		{
			$maxusers = $s->getConf('users');
			if (!$maxusers) $maxusers = $AdefaultConf['users'];
			$totalMaxUsers += intval($maxusers);

			$connectedUsers = countConnectedUsers($s->getTree());			
			$totalConnectedUsers += $connectedUsers;
		}
		

		fwrite(STDOUT,  "maxusers.value ".$totalMaxUsers."\n");
		fwrite(STDOUT,  "online.value ".$totalConnectedUsers."\n");
		exit(0);
	}
	catch (Exception $e)
	{
		fwrite(STDERR, $e."\n");
		exit(1);
	}
}

function countConnectedUsers($channelTree) 
{
	$count = intval($channelTree->players);
	
	if (isset($channelTree->children))
	{
		foreach ($channelTree->children as $c)
		{
			$count += countConnectedUsers($c);
		}
	}
	
	return $count;
}

?>