#!/usr/bin/perl -w

#$Header: /home2/cvsroot/LogTrend/ComplexAlarm/ComplexAlarm,v 1.10 2002/01/08 12:42:56 lsimonneau Exp $
##*****************************************************************************
##  ComplexAlarm 
##  Description  : Implement a complex alarm
##
##  Project      : LogTrend 1.0.0.0 - Atrid Systemes
##  Author       : Laurent Simonneau l.simonneau@atrid.fr
##*****************************************************************************
#$Log: ComplexAlarm,v $
#Revision 1.10  2002/01/08 12:42:56  lsimonneau
#Major bugfixes : Correct signature crash in daemon mode and use /usr/lib/sendmail -t -i
#to send mail insetead of MIME::Entity->smtpsend
#
#Revision 1.9  2001/10/01 09:12:00  lsimonneau
#Rename xmessageAction.pm into XmessageAction.pm
#--------------------------------------------
#
#Revision 1.8  2001/07/25 12:07:49  lsimonneau
#Moved module files to the right directories
#Updated package names and uses to reflect those changes
#
#Revision 1.6  2001/07/24 14:12:39  lsimonneau
#Modification du mode Daemon (utilisation de setsid)
#
#Revision 1.5  2001/06/29 11:55:01  lsimonneau
#Amlioration des message d'erreur, Die -> die.
#
#Revision 1.4  2001/06/11 15:46:20  lsimonneau
#deamon => daemon
#
#Revision 1.3  2001/06/08 08:17:55  lsimonneau
#Correction d'un petit oublie dans le passage a Logtrend::
#
#Revision 1.2  2001/06/07 14:41:04  lsimonneau
#Passage du unshift @INC, '..' au LogTrend::
#
#Revision 1.1  2001/05/30 09:36:57  lsimonneau
#Premire version du module d'alarmes complexes dans le CVS.
#Toutes les fonctionnalits ont t testes et correctement.
#

use strict;
use LogTrend::ComplexAlarm;
use Getopt::Long;
use LogTrend::Common::LogDie;
use POSIX qw(setsid);

my $CurFilename = "";

sub display_help {
    print "Usage : ComplexAlarm [-r] <file_and_dir_list>\n";
    print "                     [-f] <frequency>\n";
    print "                     [-d]\n\n";
    
    print "<file_and_dir_list> A list of alarm description files and directories\n";
    print "<frequency> The alarm check frequency in minutes\n\n";
    print "Option :\n";
    print "  -r, --register \t\tRegister complex alarm description in database\n";
    print "  -f, --frequency \t\tSpecify the alarm check frequency in minutes\n\n";
    print "  -d, --daemon \t\t\tRun as daemon\n\n";
}

sub daemon_mode
{
   OpenLog( "ComplexAlarm", "daemon" );
   #chdir '/' || Die( "chdir / :$!" );
   open( STDIN, "</dev/null");
   open( STDOUT, ">/dev/null");
   open( STDERR, ">/dev/null");
   
   if( ( my $x = fork() ) > 0 )
   { exit(0); }
   elsif( $x == -1 )
   { die("fork: $!"); }

   Die("setsid: $!") if( setsid() == -1 );

   open( FILE, ">/var/run/ComplexAlarm.pid" ) || return;
   printf FILE "$$\n";
   close FILE;
}


sub main {
    my $alarm;
    my $mode = 0;
    my %opt;
    my @file_list;
    my @alarm_list;
    
    GetOptions(\%opt, "register|r", "frequency|f=i", "daemon|d","help|h");
        
    if((! defined $ARGV[0]) or defined $opt{help}){
	display_help();
	exit 0;
    }

    if(defined $opt{register}){
	$mode = 1;
    }
 
    if(defined $opt{daemon}){
	daemon_mode();
    }
    $SIG{__WARN__} = sub {    
      LogTrend::Common::LogDie::SysLog("$CurFilename : $_[0]");
    };
    
    $SIG{__DIE__}  = sub {  
      LogTrend::Common::LogDie::Die("$CurFilename : $_[0]\n");
	exit(-1);
    };
    
    $opt{frequency} = 5 unless defined $opt{frequency};
    $opt{frequency} *= 60;
    
    # for each file and directory on the list
    foreach my $arg (@ARGV) {
	# if it is a directory
	if(-d $arg) {
	    # add all XML file of this dir. in to list
	    my $ls_result = `ls -1 $arg/*.xml`;
	    push @file_list, split(/^/m, $ls_result);
	}
	# if it's a file
	elsif(-f $arg) {
	    push @file_list, $arg;
	}
	else {
	    display_help();
	    exit 0;
	}
    }
    
    my $time_by_alarm = $opt{frequency} / ($#file_list+1);


    # create a ComplexAlarm object for each file
    foreach my $filename (@file_list) {
	chomp $filename;
	$CurFilename = $filename;
	
	push @alarm_list, LogTrend::ComplexAlarm->new($CurFilename);
	
	if($mode == 1) {
	    $alarm_list[$#alarm_list]->Register();
	}    
    }
    
    exit 0 if $mode == 1;
    
    while(1) {
	for (my $i=0; $i <= $#alarm_list; $i++){
	    $alarm = $alarm_list[$i];
	    $CurFilename = $file_list[$i];

	    my $launch_date = time;
	    
	    $alarm->Run();
	    my $exec_time = time - $launch_date;
	    
	    if($exec_time < $time_by_alarm) {
		sleep($time_by_alarm - $exec_time);
	    }
	}
    }
    
}

main();
