#!/usr/bin/perl 

#monitora_licença.pl
#
#Description:   Plugin analisa o arquivo de licenca do opmon (/var/local/opmon/lic/xxx.zl) verificando os itens abaixo
#               1) se exite mais de 1 arquivo no diretorio
#               2) se nao existe arquivos no diretorio
#               3) se o arquivo de *.zl estiver vazio
#               Caso os parametros de warning e critical nao forem passados, fica o padrao 7 para warning e 1 para critical
#               Ou seja, quando faltarem 7 dias para o vencimento=warning, quando faltar 1 dia=critical
#
#Author:
#        Boris Vasquez (boris.vasquez@opservices.com.br)
#
#Version:
#        1.0 11-01-2009 : Criacao 
#
use strict;
use Getopt::Long;
use POSIX;
use File::Basename;
use Date::Parse;

#--------------------------------------------------
# Setting environment
#-------------------------------------------------- 
$ENV{"USER"}="opuser";
$ENV{"HOME"}="/home/opuser";
#--------------------------------------------------
# Globlal variables
#--------------------------------------------------
our $name = basename($0, ".pl");
our $opt_version = "1.0";
our $path = "/usr/local/opmon/libexec";
our $temp_log = "$path/$name.log";
our ($opt_help, $opt_debug ,$opt_warn,$opt_crit);

#--------------------------------------------------
# Variaveis extras
#-------------------------------------------------- 

our ($dir,@list,$opt_num_arq,$count,$arq_lic,@lines,$opt_crit);
our ($dia_lic,$mes_lic,$ano_lic);

$dir ="/var/local/opmon/lic/";
#$dir ="/home/opuser/";
$count = 0;

sub main {

	getoption();
	my ($dia,$mes,$ano) = (localtime(time))[3,4,5];
	$mes++;
	$ano +=1900;
	#--------------------------------------------------
	# Este bloco de cod analisa se existem mais de 1 arquivo no diretorio de licencas
	#-------------------------------------------------- 
	if (! defined ($opt_num_arq)){$opt_num_arq = 1;}
	opendir (DIR,"$dir");
	@list = readdir(DIR);
	close (DIR);
	foreach (@list){
	    next if ($_ eq "." || $_ eq "..");

	    $arq_lic=$_;
	    $count++;
	}
	print "$arq_lic\n" if ($opt_debug);
	print "$count\n" if ($opt_debug);
	print "$#list\n" if ($opt_debug);
	print "$list[2]\n" if ($opt_debug);
	$arq_lic = $dir.$arq_lic;

	#--------------------------------------------------
	# Analisa se existe mais de n arquivos no diretorio, se nao informado $opt_num_arq fica default 1
	#-------------------------------------------------- 
	if ($count > $opt_num_arq){
	    print "Critical - Existem $count arquivos no diretorio $dir\n";
	    exit(2);
	#--------------------------------------------------
	# Alerta critical se nao existir arquivos no diretorio
	#-------------------------------------------------- 
	}elsif($count < $opt_num_arq){
	    print "Critical - Nao existe arquivo no diretorio $dir\n";
	    exit(2);
	#--------------------------------------------------
	# Alerta critical se o arquivo de licenca estiver zerado
	#-------------------------------------------------- 
	}elsif (-z $arq_lic){
	    print "Critical - Arquivo de licenca $arq_lic esta vazio\n";
	    exit(2);
	}


	#--------------------------------------------------
	# Bloco que analisa o conteudo do arquivo
	#-------------------------------------------------- 
	my ($prod_name,$reg,$exp,$hard,$host_lic,$serv_lic);
	open (FILE,"$arq_lic")
	    or die ("Nao foi possivel abrir o arquivo $arq_lic\n");
	@lines = <FILE>;
	close (FILE);
	if ($lines[5]=~/^+Services/i){
	    $reg = $lines[1];
	    $exp = $lines[2];
	    $host_lic = $lines[4];
	    $serv_lic = $lines[5];
	}else{
	    $reg = $lines[1];
	    $exp = $lines[2];
	    $host_lic = $lines[4];
	    $serv_lic = "Services = 0";
	}

	my @out = split (/=/,$exp);
	chomp ($out[1]);
	my @return = split (/ /,$out[1]);
	if ($out[1] =~ /Never/i){
	    print "OK - Licenca nunca expira\n";
	    exit (0);
	}
	($dia_lic,$mes_lic,$ano_lic) = split (/\-/,$return[1]);
	my ($total_sec_lic,$total_sec_sys,$result_sec);
	$total_sec_lic = str2time("$dia_lic-$mes_lic-$ano_lic");
	$total_sec_sys = str2time("$mes-$dia-$ano");
	$result_sec = ($total_sec_lic-$total_sec_sys)/86400;

	if (! defined ($opt_crit)){$opt_crit = 1;}
	if (! defined ($opt_warn)){$opt_warn = 7;}

	#--------------------------------------------------
	# Bloco que analisa a saida dos dados
	#-------------------------------------------------- 

	if ($result_sec <= $opt_warn && $result_sec > $opt_crit){
	    print "Warning - Licenca expira em $result_sec dia(s) ($dia_lic/$mes_lic/$ano_lic)\n";
	    exit(1);
	}elsif ($result_sec <= $opt_crit && $result_sec >= 0){
	    print "Critical - Licenca expira em $result_sec dia(s) ($dia_lic/$mes_lic/$ano_lic)\n";
	    exit (2);
	}elsif($result_sec < 0){
	    print "Critical - Licenca esta expirada a ".($result_sec*-1)." dia(s) ($dia_lic/$mes_lic/$ano_lic)\n";
	    exit(2);
	}else{
	    print "OK - Lincenca expira em ($dia_lic/$mes_lic/$ano_lic)\n";
	    exit(0);
	}

	#--------------------------------------------------
	# print "$result_sec\n";
	# my $saida = ("$mes-$dia-$ano");
	# print "dia = $dia_lic mes: $mes_lic ano: $ano_lic\n";
	# print "hoje: dia: $dia mes: $mes ano: $ano\n";
	# print "$return[1]\n";
	# print "$total_sec_lic\n";
	# print "$total_sec_sys\n";
	# print "$saida\n";
	# print "$_" foreach (@return);
	#-------------------------------------------------- 




}
#--------------------------------------------------------------------------------------
sub getoption  {
	Getopt::Long::Configure('bundling');
	GetOptions(
            'd|debug=i'                 => \$opt_debug,
            'h|help=s'                  => \$opt_help,
            'w|warning=f'               => \$opt_warn,
            'c|critical=f'              => \$opt_crit,
            'v|version=s'               => \$opt_version,
            'n|number=s'               => \$opt_num_arq,
        )or do{
            printUsage();
            exit();
        };
	#--------------------------------------------------
	# if ((!$opt_warn) or (!$opt_crit)){
	#     printUsage();
	#     exit();
	# }
	#-------------------------------------------------- 

        if ($opt_debug){
            $opt_debug = 1;
        }else{
            $opt_debug = 0;
        }

}

#--------------------------------------------------------------------------------------
sub logger {

        return (0) if (not defined $opt_debug);

        my $msg = shift (@_);
        my $log = "$path/$name.log";

        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
        $wday++;
        $yday++;
        $mon++;
        $year+=1900;
        $isdst++;

        if ($opt_debug == 1){
            print "$msg\n";
        }else {
           open(LOG, ">>$log");
           printf LOG ("%02i/%02i/%i - %02i:%02i:%02i => %s\n",$mday,$mon,$year,$hour,$min,$sec,$msg);
           close(LOG);
        }

}
#--------------------------------------------------------------------------------------

sub printUsage {

       print <<EOB

Usage: $name.pl [OPTION]...

        -w, --warning      Threshold para warning
        -c, --critical     Threshold para critical
        -h, --help         Exibe o help
        -v, --version      Exibe a versão do plugin

        -d, --debug        1 = Habilita o debug
                           2 = Gera o arquivo de log

EOB

}
#--------------------------------------------------------------------------------------
sub print_error {
    my $msg = shift;
    print "Critical - $msg\n";
    exit (2);
}

&main


