#!/usr/bin/perl
# -----------------------------------------------------------------------------
#  check_combined_status : Nagios plugin for consolidated Stratus status checks
# -----------------------------------------------------------------------------
#  Created by: Andriy Fomenko
#  Authors: Alex Titov, Alex Tsibulnik, Andriy Fomenko
#  QA by:
#  Copyright: videoNEXT Federal, Inc., 2015
# -----------------------------------------------------------------------------

use strict;
use warnings;

use Encode;
use Nagios::Plugin;
use Nagios::Plugin::Getopt;

my $np = Nagios::Plugin->new( usage => "Usage: %s [ -v|--verbose ]" );

$np->getopts;

my $APL=$ENV{APL} || $np->nagios_exit( UNKNOWN, 'APL environment variable is not defined' );
my $BASEDIR = "$APL/hm/bin";

# TODO: need to define some "verbose" type of parameter and to pass it into other scripts for more output

# These checks will be executed before any others and will abort other tests if these fail
my @base_checks = ( 'check_install_result', 'check_patrol', 'check_db_status', 'check_osgi_status' );

my ($combined_result, $combined_message, $err_digest) = ( OK, '', '' );
foreach my $script (@base_checks) {
    call_checker($script);
}

if($combined_result > WARNING) {
    $combined_message = "Application base services check FAILED! $err_digest\n\nSKIPPING ALL OTHER CHECKS!";
    $np->nagios_exit( $combined_result, $combined_message ) ;
}

# Optional checks: these are done only if base checks succeeded
my @check_scripts;
if(opendir(HM_DIR, $BASEDIR)) {
    @check_scripts = grep(/^check_/, readdir(HM_DIR));
    close HM_DIR;
}

foreach my $script (@check_scripts) {
    next if $script ~~ @base_checks;
    next if $script eq 'check_combined_status';
#    print "SCRIPT: '$script'\n";
    call_checker($script);
}

if($combined_result == OK) {
    $combined_message = "Application services are in NORMAL state\n\n$combined_message";
}
else {
    chomp($err_digest);
    $err_digest = substr($err_digest, 0, length($err_digest)-2);
    $combined_message = "Problem[s] found in application services! $err_digest\n\n$combined_message";
}

$np->nagios_exit( $combined_result, $combined_message );

# =============================================================================

sub call_checker {
    my $script = shift;
    my ($exit, $message) = exec_check($script);
    $combined_result = max($combined_result, min($exit, CRITICAL));
    $combined_message .= $message;
    $message=~/\S+\s(\S+)\s-\s(.*)/;
    $err_digest .= "$1: $2; " if $1 ne 'OK';
}

sub exec_check {
    my ($script) = @_;
    
    open(SCRIPT, "$BASEDIR/$script |") 
        || $np->nagios_exit( UNKNOWN, $? & 127 ? "Failed to execute $!. Child died with signal ".($? & 127).', '.($? & 128) ? 'with' : 'without'.' coredump' : "Faield to execute $!" );
    local $/;
    my $message = <SCRIPT>;    
    close SCRIPT;
    my $exit_code = $? >> 8;

    return ($exit_code, $message);
}

sub max {
    my ($a, $b) = @_;
    return $a > $b ? $a : $b;
}

sub min {
    my ($a, $b) = @_;
    return $a > $b ? $b : $a;
}
 