4 if ( -e "$ENV{'HOME'}/.antifraude/lock/antifraude.pid" ) {
13 unlink ("$ENV{'HOME'}/.antifraude/lock/antifraude.pid");
18 local $lfile = "$ENV{'HOME'}/.antifraude/lock/antifraude.pid";
19 open(LOCKFILE,">>$lfile");
27 # Comparador de fecha para los archivos de llamada
29 ($year1,$mon1,$day1,$hr1,$min1) = $a =~ /([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/;
30 ($year2,$mon2,$day2,$hr2,$min2) = $b =~ /([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/;
33 if ($year1 > $year2) { return 1; }
34 elsif ($year1 < $year2) { return -1; }
37 if ($mon1 > $mon2) { return 1; }
38 elsif ($mon1 < $mon2) { return -1; }
40 # Calculo minutos de lo restante
41 $totalmin1 = ($day1 * 24 * 60) + ($hr1 * 60) + $min1;
42 $totalmin2 = ($day2 * 24 * 60) + ($hr2 * 60) + $min2;
43 if ($totalmin1 > $totalmin2) { return 1; }
44 elsif ($totalmin1 < $totalmin2) { return -1; }
48 # Devuelve un listado de archivos de llamada y ordenado por fecha ASC
50 # Obtengo listado de archivos de llamadas y lo ordeno por fecha
51 opendir($DIR,"$CONFDATA{datadir}/enproceso") or die 'Could not open dir';
52 # Valido solo fisicamente, lo logico ya valido afimonio..
53 @files = grep {/[0-9]{12}\.[0-9]{4}$/ && -f "$CONFDATA{datadir}/enproceso/$_"} readdir($DIR);
54 @sortedfiles = sort byDate @files;
59 # Levanta una variable del archivo AFINSTAL.CONF
61 $CONFIGFILE = shift(@_);
62 my $linenumber = shift(@_);
63 open(CONFIGFILE) or die "No se pudo abrir el archivo $CONFIGFILE";
64 do { $line = <CONFIGFILE> } until $. == $linenumber;
67 ($confvar = $line) =~ s/"(.*)"$/$1/;
72 # Agrega un log entry al logfile del antifraude.pl
74 my $logentry = shift(@_);
75 my $consoleout = shift(@_);
76 my $log = "$CONFDATA{logdir}/$CONFDATA{logfile}";
77 # Fetch date and Format it
78 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
79 $mon =~ s/^(\d)$/0$1/;
80 $mday =~ s/^(\d)$/0$1/;
81 $hour =~ s/^(\d)$/0$1/;
82 $min =~ s/^(\d)$/0$1/;
83 $year += 1900; ++$mon;
85 $commonstring = "$mday/$mon/$year-$hour:$min $user antifraude:";
87 open(LOGFILE,">>$log") or die "No se pudo abrir el archivo de log";
89 print LOGFILE "$commonstring \"$logentry\"\n";
90 $filesize = tell(LOGFILE);
93 # Chequeo el logsize y su lo supero me quedo con 100 lineas
94 if ($filesize > $CONFDATA{logsize})
96 open(LOGFILE,"+<$log");
97 do ($line = <LOGFILE>) until $. == 100;
98 truncate(LOGFILE,tell(LOGFILE));
102 if ($consoleout) { print("$logentry\n"); }
106 my $callreg = shift(@_);
107 my $numreg = shift(@_);
108 logEntry("El siguiente registro de llamada tiene formato invalido\n$callreg",0);
109 print("Warning: El registro de llamada $numreg tiene formato invalido\n");
114 local(*callfields) = $_[0];
115 my $callsfile = $_[1];
116 my $matchedUmbral = 0;
119 while (($i <= $#UMBRALES) && ($matchedUmbral == 0)) {
120 $umbral = $UMBRALES[$i];
122 ($regid,$phoneline,$oridest,$type,$state) = split(';',$umbral);
123 if (($state eq 'A') && ($callfields[0] == $phoneline) &&
124 ($callfields[4] eq $type)) {
125 # Si es Saliente y coincide el Destino con el Ori/Dest del umbral
126 if (($type eq 'S') && ($callfields[5] eq $oridest)) {
127 $matchedUmbral = $regid;
129 if (($type eq 'E') && ($callfields[6] eq $oridest)) {
130 $matchedUmbral = $regid;
136 # Si se matcheo un umbral, grabo una alarma y aviso por consola
137 if ($matchedUmbral > 0) {
138 # Obtengo algunos datos
139 ($central = $callsfile) =~ s/^.*\.//;
140 $user = "$ENV{USER}";
142 # Fetch date and Format it
143 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
144 $year += 1900; ++$mon;
145 $mon =~ s/^(\d)$/0$1/;
146 $mday =~ s/^(\d)$/0$1/;
147 $hour =~ s/^(\d)$/0$1/;
148 $min =~ s/^(\d)$/0$1/;
149 $sec =~ s/^(\d)$/0$1/;
150 $user = "$ENV{USER}";
151 $date = "${year}${mon}${mday}";
152 $time = "${hour}${min}${sec}";
154 # Preparo el registro de alarma
155 $alarmEntry = "$callfields[7];$central;$callfields[0];$callfields[1];$regid;$callfields[2];$callfields[3];$user;$date;$time";
157 # Grabamos el registro en el archivo de alarmas
158 $alarmlog = "$CONFDATA{datadir}/alarmas/alarmas.txt";
159 open(ALARMFILE,">>$alarmlog") or die 'No se pudo abrir el archivo de alarmas';
161 print ALARMFILE "$alarmEntry\n";
164 # Logeo por consola y logfile que hubo una alarma
165 logEntry("Alarma: Se ha matcheado el registro procesado con el umbral nro $matchedUmbral",1);
169 # --------- MAIN CODE -------- #
171 if (is_lock()) { exit 1; }
174 # Defino some GLOBALS
175 $CONFDIR = "$ENV{'HOME'}/.antifraude";
176 $CONFDATA{logdir} = getConfVar("$CONFDIR/conf/antifraude.conf",2);
177 $CONFDATA{logfile} = getConfVar("$CONFDIR/conf/antifraude.conf",3);
178 $CONFDATA{logsize} = getConfVar("$CONFDIR/conf/antifraude.conf",4);
179 $CONFDATA{datadir} = getConfVar("$CONFDIR/conf/antifraude.conf",5);
181 # Cargo los UMBRALES en memoria
182 open(PARAMFILE,"$CONFDIR/umbrales.param") or die "No se pudo abrir el archivo de umbrales";
183 @UMBRALES = <PARAMFILE>;
186 # Proceso los archivos de llamadas
187 @archivos = getCallFiles();
188 FILE: foreach $filename (@archivos) {
190 $CALLFILE = "$CONFDATA{datadir}/enproceso/$filename";
191 logEntry("Inicio proceso de: $filename",1);
193 open(CALLFILE) or ((warn "No se pudo abrir archivo $filename"),next FILE);
194 REG: foreach $callreg (<CALLFILE>) {
195 logEntry("Procesando Reg: $regnum | Archivo: $filename",1);
197 $fieldcount = split(';',$callreg);
199 # Si no tengo 8 campos exactamente, invalido
200 if ($fieldcount != 8) { badCall($callreg,$regnum); next REG; }
201 # Si la linea no es un numero, invalido
202 $fields[0] =~ s/^\s*(\w*)\s*$/$1/;
203 if (!($fields[0] =~ /^\d+$/)) { badCall($callreg,$regnum); next REG; }
204 # Si tipo llamada ! E|S o no se informa Origen o Destino, invalido
205 if (($fields[4] ne 'E') && ($fields[4] ne 'S')) {
206 badCall($callreg,$regnum); next REG;
208 if (($fields[4] eq 'E') && ($fields[6] eq "")) {
209 badCall($callreg,$regnum); next REG;
211 if (($fields[4] eq 'S') && ($fields[5] eq "")) {
212 badCall($callreg,$regnum); next REG;
215 # Ya pase todas las validaciones, ahora busco si exite un umbral
216 checkUmbrales(*fields,$filename);
217 } continue { ++$regnum }
220 # La muevo al directorio de procesadas
221 rename $CALLFILE,"$CONFDATA{datadir}/procesadas/$filename";
223 logEntry("Fin proceso de: $filename",1);