3 # Comparador de fecha para los archivos de llamada
5 ($year1,$mon1,$day1,$hr1,$min1) = $a =~ /([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/;
6 ($year2,$mon2,$day2,$hr2,$min2) = $b =~ /([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/;
9 if ($year1 > $year2) { return 1; }
10 elsif ($year1 < $year2) { return -1; }
13 if ($mon1 > $mon2) { return 1; }
14 elsif ($mon1 < $mon2) { return -1; }
16 # Calculo minutos de lo restante
17 $totalmin1 = ($day1 * 24 * 60) + ($hr1 * 60) + $min1;
18 $totalmin2 = ($day2 * 24 * 60) + ($hr2 * 60) + $min2;
19 if ($totalmin1 > $totalmin2) { return 1; }
20 elsif ($totalmin1 < $totalmin2) { return -1; }
24 # Devuelve un listado de archivos de llamada y ordenado por fecha ASC
26 # Obtengo listado de archivos de llamadas y lo ordeno por fecha
27 opendir($DIR,"$CONFDATA{datadir}/enproceso") or die 'Could not open dir';
28 # Valido solo fisicamente, lo logico ya valido afimonio..
29 @files = grep {/[0-9]{12}\.[0-9]{4}$/ && -f "$CONFDATA{datadir}/enproceso/$_"} readdir($DIR);
30 @sortedfiles = sort byDate @files;
35 # Levanta una variable del archivo AFINSTAL.CONF
37 $CONFIGFILE = shift(@_);
38 my $linenumber = shift(@_);
39 open(CONFIGFILE) or die "No se pudo abrir el archivo $CONFIGFILE";
40 do { $line = <CONFIGFILE> } until $. == $linenumber;
43 ($confvar = $line) =~ s/^.*= (.*)/$1/;
47 # Agrega un log entry al logfile del antifraude.pl
49 my $logentry = shift(@_);
50 my $consoleout = shift(@_);
51 my $log = "$CONFDATA{logdir}/$CONFDATA{logfile}";
52 # Fetch date and Format it
53 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
54 $year += 1900; $year = sprintf("%02d", $year % 100); ++$mon;
55 $user = getlogin || "Unidentified";
56 $commonstring = "[$mday/$mon/$year $hour:$min:$sec|$user|antifraude]";
58 open(LOGFILE,">>$log") or die "No se pudo abrir el archivo de log";
60 print LOGFILE "$commonstring - $logentry\n";
63 if ($consoleout) { print("$logentry\n"); }
67 my $callreg = shift(@_);
68 my $numreg = shift(@_);
69 logEntry("El siguiente registro de llamada tiene formato invalido\n$callreg",0);
70 print("Warning: El registro de llamada $numreg tiene formato invalido\n");
75 local(*callfields) = $_[0];
76 my $callsfile = $_[1];
77 print("Callfields: @callfields\n");
78 print("Callfile: $callsfile\n");
79 my $matchedUmbral = 0;
82 while (($i <= $#UMBRALES) && ($matchedUmbral == 0)) {
83 $umbral = $UMBRALES[$i];
85 ($regid,$phoneline,$oridest,$type,$state) = split(';',$umbral);
86 if (($state eq 'A') && ($callfields[0] == $phoneline) &&
87 ($callfields[4] eq $type)) {
88 # Si es Saliente y coincide el Destino con el Ori/Dest del umbral
89 if (($type eq 'S') && ($callfields[5] eq $oridest)) {
90 $matchedUmbral = $regid;
92 if (($type eq 'E') && ($callfields[6] eq $oridest)) {
93 $matchedUmbral = $regid;
99 # Si se matcheo un umbral, grabo una alarma y aviso por consola
100 if ($matchedUmbral > 0) {
101 # Obtengo algunos datos
102 ($central = $callsfile) =~ s/^.*\.//;
103 $user = getlogin || 'Unidentified';
105 # Fetch date and Format it
106 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
107 $year += 1900; ++$mon;
108 $date = "$year$mon$mday";
109 $time = "$hour$min$sec";
111 # Preparo el registro de alarma
112 $alarmEntry = "$callfields[7];$central;$callfields[0];$callfields[1];$regid;$callfields[2];$callfields[3];$user;$date;$time";
114 # Grabamos el registro en el archivo de alarmas
115 $alarmlog = "$CONFDATA{datadir}/alarmas/alarmas.txt";
116 open(ALARMFILE,">>$alarmlog") or die 'No se pudo abrir el archivo de alarmas';
118 print ALARMFILE "$alarmEntry\n";
121 # Logeo por consola y logfile que hubo una alarma
122 logEntry("Alarma: Se ha matcheado el registro procesado con el umbral nro $matchedUmbral",1);
126 # --------- MAIN CODE -------- #
127 # En la version final, recibo por param el directorio del .conf, por ahora
128 # recibo un dir donde tengo archivos de llamadas
129 if ((!$ARGV[0]) || (! -d $ARGV[0])) {
130 print("No se ha ingresado un directorio fuente de llamadas\n");
133 # Defino some GLOBALS
135 $CONFDATA{logdir} = getConfVar("$CONFDIR/afinstal.conf",12);
136 $CONFDATA{logfile} = getConfVar("$CONFDIR/afinstal.conf",13);
137 $CONFDATA{logsize} = getConfVar("$CONFDIR/afinstal.conf",14);
138 $CONFDATA{datadir} = getConfVar("$CONFDIR/afinstal.conf",15);
139 $CONFDATA{alarmlog} = "$CONFDIR/alarmas/alarmas.txt";
141 # Cargo los UMBRALES en memoria
142 open(PARAMFILE,"$CONFDIR/umbrales.param") or die "No se pudo abrir el archivo de umbrales";
143 @UMBRALES = <PARAMFILE>;
147 print("\nLogdir: $CONFDATA{logdir}\n");
148 print("Logfile: $CONFDATA{logfile}\n");
149 print("Logsize: $CONFDATA{logsize}\n");
150 print("Datadir: $CONFDATA{datadir}\n\n");
152 # Proceso los archivos de llamadas
153 @archivos = getCallFiles();
154 FILE: foreach $filename (@archivos) {
156 $CALLFILE = "$CONFDATA{datadir}/enproceso/$filename";
157 logEntry("Inicio proceso de: $filename",1);
159 open(CALLFILE) or ((warn "No se pudo abrir archivo $filename"),next FILE);
160 REG: foreach $callreg (<CALLFILE>) {
161 logEntry("Procesando Reg: $regnum | Archivo: $filename",1);
163 $fieldcount = split(';',$callreg);
165 # Si no tengo 8 campos exactamente, invalido
166 if ($fieldcount != 8) { badCall($callreg,$regnum); next REG; }
167 # Si la linea no es un numero, invalido
168 $fields[0] =~ s/^\s*(\w*)\s*$/$1/;
169 if (!($fields[0] =~ /^\d+$/)) { badCall($callreg,$regnum); next REG; }
170 # Si tipo llamada ! E|S o no se informa Origen o Destino, invalido
171 if (($fields[4] ne 'E') && ($fields[4] ne 'S')) {
172 badCall($callreg,$regnum); next REG;
174 if (($fields[4] eq 'E') && ($fields[6] eq "")) {
175 badCall($callreg,$regnum); next REG;
177 if (($fields[4] eq 'S') && ($fields[5] eq "")) {
178 badCall($callreg,$regnum); next REG;
181 # Ya pase todas las validaciones, ahora busco si exite un umbral
182 checkUmbrales(*fields,$filename);
183 } continue { ++$regnum }
186 # La muevo al directorio de procesadas
187 rename $CALLFILE,"$CONFDATA{datadir}/procesadas/$filename";
189 logEntry("Fin proceso de: $filename",1);