#!/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})/;
# 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;
# 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;
- $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]";
# Append to log
open(LOGFILE,">>$log") or die "No se pudo abrir el archivo de log";
seek(LOGFILE,0,2);
- print LOGFILE "$commonstring - $logentry";
+ 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})
+ {
+ open(LOGFILE,"+<$log");
+ do ($line = <LOGFILE>) until $. == 100;
+ truncate(LOGFILE,tell(LOGFILE));
+ close(LOGFILE);
+ }
+
+ if ($consoleout) { print("$logentry\n"); }
}
sub badCall {
- $callreg = shift;
- logEntry("El siguiente registro de llamada tiene formato invalido\n$callreg");
+ my $callreg = shift(@_);
+ my $numreg = shift(@_);
+ logEntry("El siguiente registro de llamada tiene formato invalido\n$callreg",0);
+ 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("Logdir: $CONFDATA{logdir}\n");
-#print("Logfile: $CONFDATA{logfile}\n");
-#print("Logsize: $CONFDATA{logsize}\n");
-#print("Datadir: $CONFDATA{datadir}\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";
- logEntry("Inicio proceso de: $filename\n");
+ logEntry("Inicio proceso de: $filename",1);
+
open(CALLFILE) or ((warn "No se pudo abrir archivo $filename"),next FILE);
REG: foreach $callreg (<CALLFILE>) {
+ logEntry("Procesando Reg: $regnum | Archivo: $filename",1);
+ chomp($callreg);
$fieldcount = split(';',$callreg);
- if ($fieldcount != 8) { badCall($callreg); next REG; }
@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);
- logEntry("Fin proceso de: $filename\n");
+
+ # La muevo al directorio de procesadas
+ rename $CALLFILE,"$CONFDATA{datadir}/procesadas/$filename";
+
+ logEntry("Fin proceso de: $filename",1);
}
+
+# Unlocking
+unlock();