]> git.llucax.com Git - z.facultad/75.08/llamadas.git/blobdiff - inst/antifraude.pl
bugfix.
[z.facultad/75.08/llamadas.git] / inst / antifraude.pl
index dc2b18fd0e438794651e9ee1ea5d1a8884284d12..8f02a6d8fb8581288beafa2fc3e13b15ca63aba3 100644 (file)
@@ -1,5 +1,29 @@
 #!/usr/bin/perl
 
+sub is_lock {
+       if ( -e "$ENV{'HOME'}/.antifraude/lock/antifraude.pid" ) {
+               # Lock file encontrado
+               return 1;
+       }
+       # No hay lock file!
+       return 0;
+}
+
+sub unlock {
+       unlink ("$ENV{'HOME'}/.antifraude/lock/antifraude.pid");
+}
+
+sub lock {
+       if (!is_lock()) {
+               local $lfile = "$ENV{'HOME'}/.antifraude/lock/antifraude.pid";
+               open(LOCKFILE,">>$lfile");
+               print LOCKFILE $$;
+               close(LOCKFILE);
+               return 1;
+       }
+       return 0;
+}
+
 # Comparador de fecha para los archivos de llamada
 sub byDate {
        ($year1,$mon1,$day1,$hr1,$min1) = $a =~ /([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/;
@@ -24,11 +48,9 @@ sub byDate {
 # Devuelve un listado de archivos de llamada y ordenado por fecha ASC
 sub getCallFiles {
        # Obtengo listado de archivos de llamadas y lo ordeno por fecha
-       $data_dir = shift;
-       opendir($DIR,"$data_dir/enproceso") or die 'Could not open dir';
+       opendir($DIR,"$CONFDATA{datadir}/enproceso") or die 'Could not open dir';
        # Valido solo fisicamente, lo logico ya valido afimonio..
-       @files = grep {/[0-9]{12}\.[0-9]{4}$/ && -f "$data_dir/enproceso/$_"} 
-                       readdir($DIR);
+       @files = grep {/[0-9]{12}\.[0-9]{4}$/ && -f "$CONFDATA{datadir}/enproceso/$_"} readdir($DIR);
        @sortedfiles = sort byDate @files;
        closedir($DIR);
        return @sortedfiles;
@@ -36,23 +58,24 @@ sub getCallFiles {
 
 # Levanta una variable del archivo AFINSTAL.CONF
 sub getConfVar {
-       $CONFIGFILE = shift;
-       $linenumber = shift;
+       $CONFIGFILE = shift(@_);
+       my $linenumber = shift(@_);
        open(CONFIGFILE) or die "No se pudo abrir el archivo $CONFIGFILE";
        do { $line = <CONFIGFILE> } until $. == $linenumber;
        close(CONFIGFILE);
        chop($line);
-       ($confvar = $line) =~ s/^.*= (.*)/$1/;
+       ($confvar = $line) =~ s/"(.*)"$/$1/;
+       $confvar =~ s/^.*=//;
        return $confvar;
 }
 
 # Agrega un log entry al logfile del antifraude.pl
 sub logEntry {
-       $logentry = shift;
-       $consoleout = shift;
-       $log = "$CONFDATA{logdir}/$CONFDATA{logfile}";
+       my $logentry = shift(@_);
+       my $consoleout = shift(@_);
+       my $log = "$CONFDATA{logdir}/$CONFDATA{logfile}";
        # Fetch date and Format it
-       ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = gmtime(time);
+       ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
        $year += 1900; $year = sprintf("%02d", $year % 100); ++$mon;
        $user = getlogin || "Unidentified";
        $commonstring = "[$mday/$mon/$year $hour:$min:$sec|$user|antifraude]";
@@ -60,39 +83,98 @@ sub logEntry {
        open(LOGFILE,">>$log") or die "No se pudo abrir el archivo de log";
        seek(LOGFILE,0,2);
        print LOGFILE "$commonstring - $logentry\n";
+       $filesize = tell(LOGFILE);
        close(LOGFILE);
 
+       # Chequeo el logsize y su lo supero me quedo con 100 lineas
+       if ($filesize > ($CONFDATA{logsize} * 1024 * 1024))
+       {
+               open(LOGFILE,"+<$log");
+               do ($line = <LOGFILE>) until $. == 100;
+               truncate(LOGFILE,tell(LOGFILE));
+               close(LOGFILE);
+       }
+
        if ($consoleout) { print("$logentry\n"); }
 }
 
 sub badCall {
-       $callreg = shift;
-       $numreg = shift;
+       my $callreg = shift(@_);
+       my $numreg = shift(@_);
        logEntry("El siguiente registro de llamada tiene formato invalido\n$callreg",0);
-       print("El registro numero $numreg tiene formato invalido\n");
+       print("Warning: El registro de llamada $numreg tiene formato invalido\n");
        
 }
-# --------- MAIN CODE -------- #
-# En la version final, recibo por param el directorio del .conf, por ahora
-# recibo un dir donde tengo archivos de llamadas
-if ((!$ARGV[0]) || (! -d $ARGV[0])) { 
-       print("No se ha ingresado un directorio fuente de llamadas\n");
-       exit 1;
+
+sub checkUmbrales {
+       local(*callfields) = $_[0];
+       my $callsfile = $_[1];
+       my $matchedUmbral = 0;
+       my $i = 0;
+
+       while (($i <= $#UMBRALES) && ($matchedUmbral == 0)) {
+               $umbral = $UMBRALES[$i];
+               chomp($umbral);
+               ($regid,$phoneline,$oridest,$type,$state) = split(';',$umbral);
+               if (($state eq 'A') && ($callfields[0] == $phoneline) &&
+                        ($callfields[4] eq $type)) {
+                       # Si es Saliente y coincide el Destino con el Ori/Dest del umbral
+                       if (($type eq 'S') && ($callfields[5] eq $oridest)) {
+                               $matchedUmbral = $regid;
+                       }
+                       if (($type eq 'E') && ($callfields[6] eq $oridest)) {
+                               $matchedUmbral = $regid;
+                       }
+               }                       
+               ++$i;
+       }
+
+       # Si se matcheo un umbral, grabo una alarma y aviso por consola
+       if ($matchedUmbral > 0) {
+               # Obtengo algunos datos
+               ($central = $callsfile) =~ s/^.*\.//;
+               $user = getlogin || 'Unidentified';
+
+               # Fetch date and Format it
+               ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
+               $year += 1900; ++$mon;
+               $date = "$year$mon$mday";
+               $time = "$hour$min$sec";
+
+               # Preparo el registro de alarma
+               $alarmEntry = "$callfields[7];$central;$callfields[0];$callfields[1];$regid;$callfields[2];$callfields[3];$user;$date;$time";
+
+               # Grabamos el registro en el archivo de alarmas
+               $alarmlog = "$CONFDATA{datadir}/alarmas/alarmas.txt";
+               open(ALARMFILE,">>$alarmlog") or die 'No se pudo abrir el archivo de alarmas';
+               seek(ALARMFILE,0,2);
+               print ALARMFILE "$alarmEntry\n";
+               close(ALARMFILE);
+
+               # Logeo por consola y logfile que hubo una alarma
+               logEntry("Alarma: Se ha matcheado el registro procesado con el umbral nro $matchedUmbral",1);
+       }
 }
-$CONFDIR = shift;
-$CONFDATA{logdir} = getConfVar("$CONFDIR/afinstal.conf",12);
-$CONFDATA{logfile} = getConfVar("$CONFDIR/afinstal.conf",13);
-$CONFDATA{logsize} = getConfVar("$CONFDIR/afinstal.conf",14);
-$CONFDATA{datadir} = getConfVar("$CONFDIR/afinstal.conf",15);
-
-# For Debug Only
-print("\nLogdir: $CONFDATA{logdir}\n");
-print("Logfile: $CONFDATA{logfile}\n");
-print("Logsize: $CONFDATA{logsize}\n");
-print("Datadir: $CONFDATA{datadir}\n\n");
+
+# --------- MAIN CODE -------- #
+# File locking..
+if (is_lock()) { exit 1; }
+lock();
+
+# Defino some GLOBALS
+$CONFDIR = "$ENV{'HOME'}/.antifraude";
+$CONFDATA{logdir} = getConfVar("$CONFDIR/conf/antifraude.conf",2);
+$CONFDATA{logfile} = getConfVar("$CONFDIR/conf/antifraude.conf",3);
+$CONFDATA{logsize} = getConfVar("$CONFDIR/conf/antifraude.conf",4);
+$CONFDATA{datadir} = getConfVar("$CONFDIR/conf/antifraude.conf",5);
+
+# Cargo los UMBRALES en memoria
+open(PARAMFILE,"$CONFDIR/umbrales.param") or die "No se pudo abrir el archivo de umbrales";
+@UMBRALES = <PARAMFILE>;
+close(PARAMFILE);
 
 # Proceso los archivos de llamadas
-@archivos = getCallFiles($CONFDATA{datadir});
+@archivos = getCallFiles();
 FILE: foreach $filename (@archivos) {
        $regnum = 0;
        $CALLFILE = "$CONFDATA{datadir}/enproceso/$filename";
@@ -104,9 +186,32 @@ FILE: foreach $filename (@archivos) {
                chomp($callreg);
                $fieldcount = split(';',$callreg);
                @fields = @_;
+               # Si no tengo 8 campos exactamente, invalido
                if ($fieldcount != 8) { badCall($callreg,$regnum); next REG; }
+               # Si la linea no es un numero, invalido
+               $fields[0] =~ s/^\s*(\w*)\s*$/$1/;
+               if (!($fields[0] =~ /^\d+$/)) { badCall($callreg,$regnum); next REG; }
+               # Si tipo llamada ! E|S o no se informa Origen o Destino, invalido
+               if (($fields[4] ne 'E') && ($fields[4] ne 'S')) {
+                       badCall($callreg,$regnum); next REG;
+               }
+               if (($fields[4] eq 'E') && ($fields[6] eq "")) {
+                       badCall($callreg,$regnum); next REG;
+               }
+               if (($fields[4] eq 'S') && ($fields[5] eq "")) {
+                       badCall($callreg,$regnum); next REG;
+               }
+
+               # Ya pase todas las validaciones, ahora busco si exite un umbral
+               checkUmbrales(*fields,$filename);
        } continue { ++$regnum }
        close(CALLFILE);
 
+       # La muevo al directorio de procesadas
+       rename $CALLFILE,"$CONFDATA{datadir}/procesadas/$filename";
+
        logEntry("Fin proceso de: $filename",1);
 }
+
+# Unlocking
+unlock();