From de75f70bd685c8851fcf6ad66d86d53e4b2739ed Mon Sep 17 00:00:00 2001 From: Alan Kennedy Date: Mon, 18 Oct 2004 05:44:07 +0000 Subject: [PATCH] Terminado, creo. Hay que fijarse como se comporta si no se le dan los premisos bonitos para escribir sobre los logs files o mismo leer input files, pero en primera instancia tiene los OR DIE, por lo que cortaria el proceso. Para probarlo, basta con instalar el antifraude, copiarle al directorio aprocesar el archivo de llamada que esta en inst/llamadas y ejecutar el script pasandole como parametro el path al afinstal.conf --- inst/antifraude.pl | 88 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 74 insertions(+), 14 deletions(-) diff --git a/inst/antifraude.pl b/inst/antifraude.pl index 49520e8..8417306 100644 --- a/inst/antifraude.pl +++ b/inst/antifraude.pl @@ -24,11 +24,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,8 +34,8 @@ 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 = } until $. == $linenumber; close(CONFIGFILE); @@ -48,11 +46,11 @@ sub getConfVar { # 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]"; @@ -66,12 +64,63 @@ sub logEntry { } 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"); } + +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); + } +} + # --------- MAIN CODE -------- # # En la version final, recibo por param el directorio del .conf, por ahora # recibo un dir donde tengo archivos de llamadas @@ -79,11 +128,18 @@ if ((!$ARGV[0]) || (! -d $ARGV[0])) { print("No se ha ingresado un directorio fuente de llamadas\n"); exit 1; } +# Defino some GLOBALS $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); +$CONFDATA{alarmlog} = "$CONFDIR/alarmas/alarmas.txt"; + +# Cargo los UMBRALES en memoria +open(PARAMFILE,"$CONFDIR/umbrales.param") or die "No se pudo abrir el archivo de umbrales"; +@UMBRALES = ; +close(PARAMFILE); # For Debug Only print("\nLogdir: $CONFDATA{logdir}\n"); @@ -92,7 +148,7 @@ print("Logsize: $CONFDATA{logsize}\n"); print("Datadir: $CONFDATA{datadir}\n\n"); # Proceso los archivos de llamadas -@archivos = getCallFiles($CONFDATA{datadir}); +@archivos = getCallFiles(); FILE: foreach $filename (@archivos) { $regnum = 0; $CALLFILE = "$CONFDATA{datadir}/enproceso/$filename"; @@ -121,8 +177,12 @@ FILE: foreach $filename (@archivos) { } # 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); } -- 2.43.0