#!/usr/bin/perl

#
# OpServices Tenologia da Informacao
# @author Junior Cunha
# @version 1.0
# @date 16/03/2007
#

use IPC::Open2;
use Symbol;
use strict;

our $s3270 = "/usr/local/bin/s3270 -script -model 5";
our $host = "mf-sysd";
our $debug = 0;

our $log_dir = "/usr/local/opmon/libexec/tmon/";
our %files = (
	"SYSA"	=>	$log_dir . "SYSA.txt",
	"SYSB"	=>	$log_dir . "SYSB.txt",
	"SYSD"	=>	$log_dir . "SYSD.txt",
	"SYSX"	=>	$log_dir . "SYSX.txt"
	);

our $WTR = gensym();
our $RDR = gensym();

our ($host, $user, $pass, $name, $w, $c) = @ARGV;
our $MAX = "600"; # Change this when you have a maximun value

sub main {

   # Parse args
   &parse_args();

   # Create s3270 process
   our $pid = open2( $RDR , $WTR , "$s3270 $host" );

   if (not $pid) {
      print "CRITICAL - Nao foi possivel conectar no host $host.\n";
      print_all("CRITICAL - Nao foi possivel conectar no host $host.\n");
      exit(2);
   }

   # Select CMF program
   print $WTR "Ascii\n";
   print $WTR "String(\"CMF\")\n";
   print $WTR "Enter\n";
   print $WTR "Ascii\n";
   print $WTR "Wait InputField\n";
   print $WTR "Enter\n";
   print $WTR "Ascii\n";
   print $WTR "Info\n";

   if ( (not &verify_result("userid")) && (&verify_result("APLICACAO NAO DISPONIVEL")) ) {
      print "CRITICAL - Erro ao selecionar a aplicacao CMF.\n";
      print_all("CRITICAL - Erro ao selecionar a aplicacao CMF.\n");
      exit(2);
   }

   # Put the user ...
   print $WTR "Ascii\n";
   print $WTR "String(\"$user\")\n";
   print $WTR "Enter\n";
   print $WTR "Ascii\n";
   print $WTR "Wait InputField\n";
   print $WTR "Enter\n";
   print $WTR "Ascii\n";
   print $WTR "Info\n";

   if ( not &verify_result("PLEASE ENTER CURRENT PASSWORD") ) {
      print "CRITICAL - Erro ao inserir o nome do usuario $user.\n";
      print_all("CRITICAL - Erro ao inserir o nome do usuario $user.\n");
      exit(2);
   }

   # ... and put the password
   print $WTR "Ascii\n";
   print $WTR "String(\"$pass\")\n";
   print $WTR "Enter\n";
   print $WTR "Ascii\n";
   print $WTR "Wait InputField\n";
   print $WTR "Enter\n";
   print $WTR "Ascii\n";
   print $WTR "Info\n";

   if ( not &verify_result("The user screen definition dataset is optional") ) {
      print "CRITICAL - Falha no processo de autenticacao.\n";
      print_all("CRITICAL - Falha no processo de autenticacao.\n");
      exit(2);
   }

   # Hit Enter twice
   print $WTR "Ascii\n";
   print $WTR "Enter\n";
   print $WTR "Wait Output\n";
   print $WTR "Ascii\n";
   print $WTR "Info\n";

   if ( not &verify_result("Parameters and Options") ) {
      print "CRITICAL - Erro ao acessar o Menu de Opcoes.\n";
      print_all("CRITICAL - Erro ao acessar o Menu de Opcoes.\n");
      exit(2);
   }

   # Select PLEX Management 
   print $WTR "Ascii\n";
   print $WTR "String(\"P\")\n";
   print $WTR "Enter\n";
   print $WTR "Ascii\n";
   print $WTR "Info\n";

   if ( not &verify_result("SESSION CONTROL PARAMETERS") ) {
      print "CRITICAL - Erro ao acessar a aplicacao PLEX Management.\n";
      print_all("CRITICAL - Erro ao acessar a aplicacao PLEX Management.\n");
      exit(2);
   }

   # Hit Enter Again
   print $WTR "Ascii\n";
   print $WTR "Enter\n";
   print $WTR "Ascii\n";
   print $WTR "Info\n";

   if ( &verify_result("SCREEN SIZE MISMATCH")) {
      print "CRITICAL - Erro ao acessar a Screen OPMON.\n";
      print_all("CRITICAL - Erro ao acessar a Screen OPMON.\n");
      exit(2);
   }

   # Parse the results
   print $WTR "Ascii\n";
   print $WTR "Info\n";

   #data:    SYSA      97      350     281  80.3                    342 NO    N/A     N/A    SYSA
   #data:    SYSB      80      240     203  84.5                    191 NO    N/A     N/A    SYSB
   #data:    SYSD      20       40      28  70.5                     32 NO    N/A     N/A    SYSD
   #data:    SYSX       3       76       2   3.1                      3 NO    N/A     N/A    SYSX
   #data:    SYSB      85      N/A     128   N/A                    128   0.30 

   my %msus;
   while (<$RDR>) {
      if (m/(SYS\S+)\s*[\d]+\s*[^\s*]+\s*(\d+)\s*[^\s]+[\s*\+]*(\d*)\s*/) {
         $msus{$1}{M} = $2;
         $msus{$1}{A} = $3;
      }
      last if (m/error/i);
   }

   # Close connections
   print $WTR "=x\n";
   print $WTR "PF(3)\n";
   print $WTR "PF(3)\n";
   print $WTR "PF(3)\n";
   print $WTR "disconnect\n";
   print $WTR "quit\n";

   close($WTR);
   close($RDR);

   if (not keys (%msus) ) {
      print "Critical - Nenhuma informacao encontrada!\n";
      print_all("Critical - Nenhuma informacao encontrada!\n");
      exit(2);
   } else {

      foreach my $msu ( sort keys %msus ) {

         if ($name eq $msu) {
            unlink($files{$msu});
            next;
         }
   
         my $status = "Ok";
         $status = "Warning" if ($msus{$msu}{A} >= $w);
         $status = "Critical" if ($msus{$msu}{A} >= $c);

         print_to_file($files{$msu}, "$status - Utilizacao de MSU - Atual => $msus{$msu}{A}, Media => $msus{$msu}{M} | msu_atual=$msus{$msu}{A};$w;$c;0;$MAX msu_media=$msus{$msu}{M};;;0;$MAX\n" );

      }

      my $status = "Ok";
      my $code = 0;

      if ($msus{$name}{A} >= $c) {
         $status = "Critical";
         $code = 2;
      } elsif ($msus{$name}{A} >= $w) {
         $status = "Warning";
         $code = 1;
      }

      print "$status - Utilizacao de MSU - Atual => $msus{$name}{A}, Media => $msus{$name}{M} | msu_atual=$msus{$name}{A};$w;$c;0;$MAX msu_media=$msus{$name}{M};;;0;$MAX\n";
      exit($code);

   }
      
}

sub parse_args {

   if ($#ARGV<5) {
      print "Usage:\n\t$0 [host] [user] [pass] [name] [warning] [critical]\n";
      exit(1);
   }

}

sub verify_result {

   my ($param) = shift;

   my $p = 0;
   while (<$RDR>) {
      print $_ if ($debug);
      $p = 1 if (m/$param/);
      last if (m/error/);
   }

   return $p;
}

sub get_coordinates {

   my $name = shift;
   my ($x, $y);

   my $count = 0;
   while(<$RDR>) {
      print "$count - ", $_ if ($debug);
      if (m/$name/) {
         $x = $count;
         $y = 2; # Don't count string "data: *"
      }
      last if (m/error/);
      $count++;
   }
      
   return "$x,$y";

}

sub print_all {

   my $msg = shift;

   foreach my $file ( sort keys %files ) {

      open( FILE, ">$files{$file}");
      print FILE "$msg";
      close( FILE );

   }

}

sub print_to_file {

   my $file = shift;
   my $msg = shift;

   open( FILE, ">$file" );
   print FILE "$msg";
   close( FILE );

}

&main;

