X-Git-Url: https://git.llucax.com/z.facultad/75.08/llamadas.git/blobdiff_plain/d6ff9bc2cd5838d73e7a96f657a90a6f4b2797dd..c73e52eb8d8b3798ac447fc5a851140a7472ed6c:/inst/antifraude.pl diff --git a/inst/antifraude.pl b/inst/antifraude.pl index 4a6c7d9..cdb843d 100644 --- a/inst/antifraude.pl +++ b/inst/antifraude.pl @@ -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,8 +58,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,24 +70,91 @@ sub getConfVar { # 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} * 1024 * 1024)) + { + open(LOGFILE,"+<$log"); + do ($line = ) 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"); + +} + +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 @@ -73,29 +162,69 @@ if ((!$ARGV[0]) || (! -d $ARGV[0])) { print("No se ha ingresado un directorio fuente de llamadas\n"); exit 1; } + +# File locking.. +if (is_lock()) { exit 1; } +lock(); + +# 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("Logdir: $CONFDATA{logdir}\n"); -#print("Logfile: $CONFDATA{logfile}\n"); -#print("Logsize: $CONFDATA{logsize}\n"); -#print("Datadir: $CONFDATA{datadir}\n"); +print("\nLogdir: $CONFDATA{logdir}\n"); +print("Logfile: $CONFDATA{logfile}\n"); +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"; - 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 () { + 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();