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

use strict;
no strict "subs";

use Module::Load::Conditional qw[check_install];

### Munin conf init

if ( $ARGV[0] and $ARGV[0] eq "autoconf") {
    if (-e "/opt/open-xchange/bundles/com.openexchange.office.monitoring.jar") {
        print "yes\n";
        exit 0;
    } else {
        print "no\n";
        exit 0;
    }
}

### Graph settings

if ( $ARGV[0] and $ARGV[0] eq "config") {
    print "graph_title Documents CalcEngine Documents\n";
    print "graph_args -l 0\n";
    print "graph_scale no\n";
    print "graph_category Open Xchange\n";
    print "graph_vlabel Documents\n";

    print "calcengine_documents_init.label Documents - Init\n";
    print "calcengine_documents_init.draw LINE1\n";
    print "calcengine_documents_init.type DERIVE\n";
    print "calcengine_documents_init.min 0\n";
    
    print "calcengine_documents_exit.label Documents - Exit\n";
    print "calcengine_documents_exit.draw LINE1\n";
    print "calcengine_documents_exit.type DERIVE\n";
    print "calcengine_documents_exit.min 0\n";

    print "calcengine_documents_error.label Documents - Error\n";
    print "calcengine_documents_error.draw LINE1\n";
    print "calcengine_documents_error.type DERIVE\n";
    print "calcengine_documents_error.min 0\n";

    print "calcengine_documents_reloaded.label Documents - Reloaded\n";
    print "calcengine_documents_reloaded.draw LINE1\n";
    print "calcengine_documents_reloaded.type DERIVE\n";
    print "calcengine_documents_reloaded.min 0\n";
 
    exit 0
}

### using Jmx4Perl or the going the classic way

my $jolokiaUrl = $ENV{oxJolokiaUrl};

### check if the Jolokia Url is set and if the jmx4perl module is available
if ( $jolokiaUrl && (length($jolokiaUrl) > 0) && check_install(module => 'JMX::Jmx4Perl') ) {
    ### Settings and connection Testing
    require JMX::Jmx4Perl;
    require JMX::Jmx4Perl::Request;
    
    my $jmx = new JMX::Jmx4Perl(url => $jolokiaUrl,
    	user => $ENV{oxJolokiaUser},
    	password => $ENV{oxJolokiaPassword});
    
    ### test if a connection can be made
    my $request = new JMX::Jmx4Perl::Request({type => "version"});
    my $response = $jmx->request($request);
    
    if ($response->is_error()){
        my $status = $response->status();
        
    	if ($status == 404) {
            die "Link to servlet might be wrong";
        }
        elsif ($status == 401) {
            die "Credentials to login might be wrong";
        }
        else {
            die "Something went wrong ",$status;
        }
    }
    
    ### sending the request

    $request = new JMX::Jmx4Perl::Request("read",
        "com.openexchange.office:name=OfficeMonitoring",
        "CalcEngine_Documents_Init");
    $response = $jmx->request($request);
    
    if ($response->is_ok()){
        print "calcengine_documents_init.value ",$response->value(),"\n";
    }

    ###

    $request = new JMX::Jmx4Perl::Request("read",
        "com.openexchange.office:name=OfficeMonitoring",
        "CalcEngine_Documents_Exit");
    $response = $jmx->request($request);
    
    if ($response->is_ok()){
        print "calcengine_documents_exit.value ",$response->value(),"\n";
    }

    ###

    $request = new JMX::Jmx4Perl::Request("read",
        "com.openexchange.office:name=OfficeMonitoring",
        "CalcEngine_Documents_Error");
    $response = $jmx->request($request);
    
    if ($response->is_ok()){
        print "calcengine_documents_error.value ",$response->value(),"\n";
    }

    ###
   
    $request = new JMX::Jmx4Perl::Request("read",
        "com.openexchange.office:name=OfficeMonitoring",
        "CalcEngine_Documents_Reloaded");
    $response = $jmx->request($request);
    
    if ($response->is_ok()){
        print "calcengine_documents_reloaded.value ",$response->value(),"\n";
    }

} else {
    my $showruntimestats="/opt/open-xchange/sbin/showruntimestats";
    my $showexec="$showruntimestats -f";
    my $val;

    open(SHOWRUNTIME,"$showexec |") || die "can not read monitoring output";   
    
    while (<SHOWRUNTIME>)
    {
    if ($_ =~ /OfficeMonitoring,CalcEngine_Documents_Init/) {
            s/.*\=//; 
            $val=$_+0;
            print "calcengine_documents_init.value $val\n";
            next;
        } elsif ($_ =~ /OfficeMonitoring,CalcEngine_Documents_Exit/) {
            s/.*\=//; 
            $val=$_+0;
            print "calcengine_documents_exit.value $val\n";
            next;
        } elsif ($_ =~ /OfficeMonitoring,CalcEngine_Documents_Error/) {
            s/.*\=//; 
            $val=$_+0;
            print "calcengine_documents_error.value $val\n";
            next;
        } elsif ($_ =~ /OfficeMonitoring,CalcEngine_Documents_Reloaded/) {
            s/.*\=//; 
            $val=$_+0;
            print "calcengine_documents_reloaded.value $val\n";
            next;
        } 
    }
    
    close (SHOWRUNTIME);
}
