#!/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 Text Saved\n";
    print "graph_args -l 0\n";
    print "graph_scale no\n";
    print "graph_category Open Xchange\n";
    print "graph_vlabel Documents Text Saved per second\n";

    print "textdocssaved_total.label Documents Text Saved - Total\n";
    print "textdocssaved_total.draw LINE1\n";
    print "textdocssaved_total.type DERIVE\n";
    print "textdocssaved_total.min 0\n";
    
    print "textdocssaved_close.label Documents Text Saved - Close\n";
    print "textdocssaved_close.draw LINE1\n";
    print "textdocssaved_close.type DERIVE\n";
    print "textdocssaved_close.min 0\n";

    print "textdocssaved_100ops.label Documents Text Saved - 100ops\n";
    print "textdocssaved_100ops.draw LINE1\n";
    print "textdocssaved_100ops.type DERIVE\n";
    print "textdocssaved_100ops.min 0\n";

    print "textdocssaved_15mins.label Documents Text Saved - 15mins\n";
    print "textdocssaved_15mins.draw LINE1\n";
    print "textdocssaved_15mins.type DERIVE\n";
    print "textdocssaved_15mins.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",
        "DocumentsSaved_Text_Total");
    $response = $jmx->request($request);
    
    if ($response->is_ok()){
        print "textdocssaved_total.value ",$response->value(),"\n";
    }

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

    ###

    $request = new JMX::Jmx4Perl::Request("read",
        "com.openexchange.office:name=OfficeMonitoring",
        "DocumentsSaved_Text_100ops");
    $response = $jmx->request($request);
    
    if ($response->is_ok()){
        print "textdocssaved_100ops.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,DocumentsSaved_Text_Total/) {
            s/.*\=//; 
            $val=$_+0;
            print "textdocssaved_total.value $val\n";
            next;
        } elsif ($_ =~ /OfficeMonitoring,DocumentsSaved_Text_Close/) {
            s/.*\=//; 
            $val=$_+0;
            print "textdocssaved_close.value $val\n";
            next;
        } elsif ($_ =~ /OfficeMonitoring,DocumentsSaved_Text_100ops/) {
            s/.*\=//; 
            $val=$_+0;
            print "textdocssaved_100ops.value $val\n";
            next;
        } elsif ($_ =~ /OfficeMonitoring,DocumentsSaved_Text_15mins/) {
            s/.*\=//; 
            $val=$_+0;
            print "textdocssaved_15mins.value $val\n";
            next;
        }
    }
    
    close (SHOWRUNTIME);
}
