#!/usr/bin/perl -w

=header
AUTOR: Sidney Souza
CRIADO EM: 03/07/2015 12:47

REVISÕES:
--------------------------------------------------------------
2.1 2015-15-07, Sidney Souza
    - Alterada a regra para teste da licença, permitindo que 
	o cliente dite seu comportamento utilizando os ranges do 
	nagios

=cut

use strict;
use warnings;
use English;
use Switch;
use Nagios::Plugin;
use File::Basename;
use Data::Dumper;
use vars qw ($np);
use POSIX 'strftime';

use constant{
    TRUE => 1,
    FALSE => 0,
    VERSION => '2.1',
    UNLIMITED => 0,
    CMD => '/usr/local/opmon/libexec/opservices/opmon_license_properties.php',
    DAY_IN_SECONDS => 86400
};


################################################################################
# Exibe o manual do software
################################################################################
sub getGuideLine {

    my $path = '/usr/local/opmon/libexec/opservices';
    my $cmd = CMD;
    my $program = basename($PROGRAM_NAME);
    print <<EOF;

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

Descrição do plugin:
    Verificar quantidade de dias para a licença do opmon expirar.

Instalação:
    Copiar este plugin para o diretório: $path

Dependências:
    perl module English
    Instalação: yum install "perl(English)" -y

    perl module Switch;
    Instalação: yum install "perl(Switch)" -y

    perl module Nagios::Plugin;
    Instalação: yum install "perl(Nagios::Plugin)" -y

Funcionamento:
    Executa o comando: $cmd 
    para obter os dados da licença e realiza o parse destes dados.
     
Exemplos de execução e retorno do comando:

    $path/$program -w 1 -c 1
    CRITICAL - Licenca expirada

    $path/$program -w 1 -c 1
    OK - Licenca nao expira.

    $path/$program -w 1 -c 1
    OK - Faltam 5 para a licenca expirar. Data: dd/mm/YYYY Hosts: 10 Servicos: Unlimited

    $path/$program -w 5 -c 10
    WARNNING - Faltam 4 para a licenca expirar. Data: dd/mm/YYYY Hosts: 10 Servicos: Unlimited

    $path/$program -w 10 -c 10
    CRITICAL Faltam 5 para a licenca expirar. Data: dd/mm/YYYY Hosts: 10 Servicos: Unlimited
    
    $path/$program -w 1: -c 1:
    OK - Faltam 5 para a licenca expirar. Data: dd/mm/YYYY Hosts: 10 Servicos: Unlimited

    $path/$program -w 3: -c 2:
    WARNNING - Faltam 4 para a licenca expirar. Data: dd/mm/YYYY Hosts: 10 Servicos: Unlimited

    $path/$program -w 7: -c 4:
    CRITICAL Faltam 5 para a licenca expirar. Data: dd/mm/YYYY Hosts: 10 Servicos: Unlimited

EOF
    
    exit (OK);

}

################################################################################
# Seta os atributos da variável global $np
################################################################################

sub setNagios() {

    # Constructor
    $np = Nagios::Plugin->new(
        url => "www.opservices.com.br/suporte",
        version => VERSION,
        license => "Developed by:\n\tOpServices\n"
            . "Author: \n\tSidney Souza - sidney.souza\@opservices.com.br\n",
        usage => "Usage:\n\t%s -w warning -c critical"
    );

    $np->add_arg(spec => "warning|w=s", help => "Warning value", required => TRUE);
    $np->add_arg(spec => "critical|c=s", help => "Critical value", required => TRUE);
    $np->add_arg(spec => "perfdata", help => "Show perfdata");
    $np->add_arg(spec => "man", help=> "Show guideline");

    $np->getopts();
}

################################################################################
# Retorna um hash com as propriedades da licença
# @return %prop Hash com as propriedades da licença ou undef caso a licença
#               esteja expirada
################################################################################
sub getLicenseProperties() {
    open(OUTPUT, CMD . "|");

    my %prop;
    while (my $line = <OUTPUT>) {
        if ($line =~ /License Expired/i) {
            close(OUTPUT);
            return;
        }

        if($line =~ /(?<key>.*)=(?<value>.*)/) {
            $prop{$+{key}} = $+{value};
        }
    }

	close(OUTPUT);
    return %prop;
}

################################################################################
# Processa as propriedades da licença e retorna um hash com a quantidade de 
# dias para ela expirar, quantidade de hosts, quantidade de serviços e a data 
# que a licença expira.
# @return %result Hash com o resultado do processamento
################################################################################
sub processLicenseProperties(%) {
    my %prop = @ARG;
    my $sysTime = time();
    my %result;
    
    $result{daysToExpire} 
        = int(($prop{FILE_EXPIRY} - $sysTime) / DAY_IN_SECONDS);
    $result{hosts} 
        = ($prop{Hosts} == UNLIMITED ? 'Unlimited' : $prop{Hosts});
    $result{services} 
        = ($prop{Services} == UNLIMITED ? 'Unlimited' : $prop{Services});
    $result{expireDate} =  strftime("%d/%m/%Y", localtime($prop{FILE_EXPIRY}));

    return %result;
}

################################################################################
# Rotina principal do programa
################################################################################
sub main() {
    setNagios();

    getGuideLine() if ($np->opts->man);

    print "Debug: " . CMD . "\n" if ($np->opts->verbose == 1);

    my %prop = getLicenseProperties();
    
    print "Debug: " . Dumper(\%prop) if ($np->opts->verbose > 1);

    $np->nagios_die('License Expired', CRITICAL) if(!%prop);

    $np->nagios_exit(
        return_code => OK,
        message => "Licenca nao expira.\n"    
    ) if($prop{FILE_EXPIRY} == UNLIMITED);

    my (%result) = processLicenseProperties(%prop);

    print "Debug: " . Dumper(\%result) if ($np->opts->verbose > 2);

    my $code = $np->check_threshold(
        check => $result{daysToExpire},
        warning => $np->opts->warning,
        critical => $np->opts->critical,
    );

    my $message = sprintf(
        "Faltam %d para a licenca expirar. Data: %s Hosts: %s Servicos: %s\n",
        $result{daysToExpire},
        $result{expireDate},
        $result{hosts},
        $result{services}
    );

    $np->nagios_exit(
        return_code => $code, 
        message => $message
    );
}

&main;

# vim: set smartindent tabstop=4 shiftwidth=4 softtabstop=4 expandtab[ENTER] #
