#!/usr/bin/perl
#%# family=auto
#%# capabilities=autoconf

use strict;

use LWP;
use JSON;

if ( $ARGV[0] and $ARGV[0] eq "autoconf")
{
	print "yes\n";
	exit 0;
}


my $url = $ENV{oxJolokiaUrl};
my $username = $ENV{oxJolokiaUser};
my $password = $ENV{oxJolokiaPassword};

if ( $ARGV[0] and $ARGV[0] eq "config") {
    callUrlForConfig();
    exit 0
}

callUrl();

sub callUrl {
	my @shortvals;
	my @longvals;
	
	my $shortcombined = 0;
	my $longcombined = 0;
	my $ua = LWP::UserAgent->new();
	my $req = HTTP::Request->new(GET => "$url/read/com.openexchange.sessiond:name=SessionD Toolkit");
	$req->authorization_basic($username,$password);
	
	$req->header('Accept', => 'text/html');
	
	my $response = $ua->request($req);
	
	if ($response->is_success) {
		my $json = decode_json($response->decoded_content);
		if (defined $json->{value}){
			@shortvals = @{$json->{value}->{NumberOfShortTermSessions}};
			@longvals = @{$json->{value}{NumberOfLongTermSessions}};
			print "multigraph ox_sessioncontainer.short\n";
			for (my $i = 0; $i < @shortvals; $i++) {
				print "short$i.value $shortvals[$i]\n";
				$shortcombined = $shortcombined + $shortvals[$i];
			}
			
			print "multigraph ox_sessioncontainer.long\n";
			for (my $i = 0; $i < @longvals; $i++) {
				print "long$i.value $longvals[$i]\n";
				$longcombined = $longcombined + $longvals[$i];
			}
			print "multigraph ox_sessioncontainer\n";
			print "short.value $shortcombined\n";
			print "long.value $longcombined\n";
		}
	}
	else {
		my $status = $response->status_line;
		if ($status == 404) {
			die "Link to servlet might not be set correctly, this can be done by altering /etc/munin/plugin-conf.d/ox and setting the correct path to your jolokia servlet";
		}
		elsif ($status == 401) {
			die "Credentials to login might be not set correctly. The credentials are set inside /opt/open-xchange/etc/jolokia.properties on the OX, for munin, those need to be altered at /etc/munin/plugin-conf.d/ox";
		}
		else {
			die "Something went wrong:\n",$status;
		}
	}
}

sub callUrlForConfig {
	my @shortvals;
	my @longvals;
	my $ua = LWP::UserAgent->new();
	my $req = HTTP::Request->new(GET => "$url/read/com.openexchange.sessiond:name=SessionD Toolkit");
	$req->authorization_basic($username,$password);
	
	$req->header('Accept', => 'text/html');
	
	my $response = $ua->request($req);
	
	if ($response->is_success) {
		print "multigraph ox_sessioncontainer\n";
		print "graph_title Sessions per Container\n";
		print "graph_args --base 1000 -l 0\n";
		print "graph_category Open Xchange\n";
		print "graph_vlabel Number\n";
		print "short.label Short term sessions combined\n";
		print "short.draw AREASTACK\n";
		print "long.label Long term sessions combined\n";
		print "long.draw AREASTACK\n";

		my $json = decode_json($response->decoded_content);
		if (defined $json->{value}){
			
			@shortvals = @{$json->{value}{NumberOfShortTermSessions}};
			@longvals = @{$json->{value}{NumberOfLongTermSessions}};
			
			print "multigraph ox_sessioncontainer.short\n";
			print "graph_title Short term sessions\n";
			print "graph_args --base 1000 -l 0\n";
			print "graph_category Open Xchange\n";
			print "graph_vlabel Number total\n";
			my $colour = 0;
			for (my $i = 0; $i < @shortvals; $i++) {
				print "short$i.label Short term session container $i\n";
				print "short$i.draw AREASTACK\n";
				print "short$i.colour COLOUR$colour\n";
				$colour = $colour + 1;
				if ($colour == 29) {
					$colour = 0;
				}
			}
			
			print "multigraph ox_sessioncontainer.long\n";
			print "graph_title Long term sessions\n";
			print "graph_args --base 1000 -l 0\n";
			print "graph_category Open Xchange\n";
			print "graph_vlabel Number total\n";
			my $colour = 0;
			for (my $i = 0; $i < @longvals; $i++) {
				print "long$i.label Long term session container $i\n";
				print "long$i.draw AREASTACK\n";
				print "long$i.colour COLOUR$colour\n";
				$colour = $colour + 1;
				if ($colour == 29) {
					$colour = 0;
				}
			}
		}
	}
	else {
		my $status = $response->status_line;
		if ($status == 404) {
			die "Link to servlet might not be set correctly, this can be done by altering /etc/munin/plugin-conf.d/ox and setting the correct path to your jolokia servlet";
		}
		elsif ($status == 401) {
			die "Credentials to login might be not set correctly. The credentials are set inside /opt/open-xchange/etc/jolokia.properties on the OX, for munin, those need to be altered at /etc/munin/plugin-conf.d/ox";
		}
		else {
			die "Something went wrong:\n",$status;
		}
	}
}