#!/usr/bin/php
<?php

require_once '/usr/local/opmon/etc/config.php';
require_once '/usr/local/opmon/libexec/php-nagios-plugins/Nagios_Plugin.php';

define("VERSION", "2.0");

$plugin = null;

/*******************************************************************************
* Exibir o manual do software
********************************************************************************/

function getGuideLine()
{

    $name = basename(__FILE__);
    $realpath = realpath(__FILE__);
    print <<<EOF

-------------------------------------------------------------------------------
Manual de exemplo.
-------------------------------------------------------------------------------

Descrição do plugin:
    Checa a latencia das checagems de hosts e serviços.

Instalação:
    Copiar este plugin para a pasta de plugins no path abaixo:
    /usr/local/opmon/libexec/opservices.

    Dar permissão de execução( chmod +x $realpath )

Dependências:
    Nagios_Plugins para php

Funcionamento:
    Obtém, a partir do mklivestatus, o valor da latencia das checagems (diferença
entre o tempo que a checagem foi agendada para ser executada e o tempo em que ela
foi realmente executada) para hosts e serviços.

Exemplos de execução:
    ./$name -w 1 -c 2

EOF;

    exit(OK);
}

/*******************************************************************************
* Seta os atributos da variável global $plugin
********************************************************************************/

function setup_plugin()
{
    global $plugin;

    $plugin = new Nagios_Plugin(
        array (
            'version' => VERSION . " [www.opservices.com.br/suporte]",
            'blurb' => "Developed by:\n\tOpServices\n"
            . "Author: \n\tOtavio Honorio - otavio.honorio\@opservices.com.br\n",
            'usage' => "Usage:\n\t%s -w <warning> -c <critical> [--man]"
        )
    );

    $plugin->add_arg("warning|w=i", "Warning value in seconds");
    $plugin->add_arg("critical|c=i", "Critical value in seconds");
    $plugin->add_arg("man", "Show guideline");

    $plugin->getopts();

}

function getLatencyFor($table, $conn)
{
    $equals = $conn->createOperator('=');
    $filter = $conn->createFilter(array('active_checks_enabled', $equals, 1));

    $conn->from($table)
        ->filterBy($filter)
        ->aggregateBy('avg', 'latency')
        ->outputFormat('csv');

    $rst = $conn->execute();
    $result = array_shift($rst->fetchAll());
    return round($result->stats_1, 2);
}

/*******************************************************************************
 * Rotina principal do programa
 *******************************************************************************/
function main()
{
    global $plugin;
    setup_plugin();

    if (isset($plugin->opts['man'])) {
        getGuideLine();
    }

    if (! isset($plugin->opts['warning'], $plugin->opts['critical'])) {
        $plugin->nagios_exit(CRITICAL, "Need to define warning and critical values!");
    }

    $conn = Livestatus\Connection\ConnectionProvider::factory();
    $servicesLatency = getLatencyFor('services', $conn);
    $hostsLatency = getLatencyFor('hosts', $conn);

    $plugin->add_perfdata("service_latency", $servicesLatency, 's');
    $plugin->add_perfdata("host_latency", $hostsLatency, 's');

    $plugin->set_thresholds($plugin->opts['warning'], $plugin->opts['critical'], 0);
    $code = max($plugin->check_threshold($servicesLatency), $plugin->check_threshold($hostsLatency));

    $message = sprintf("Latency - Host: %ss / Service: %ss", $hostsLatency, $servicesLatency);
    $plugin->nagios_exit($code, $message);
}

main();
/* vim: set smartindent tabstop=4 shiftwidth=4 softtabstop=4 expandtab[ENTER] */
