]> git.llucax.com Git - z.facultad/75.08/llamadas.git/blob - inst/antifraude.pl
ups, hice cagadas :-P
[z.facultad/75.08/llamadas.git] / inst / antifraude.pl
1 #!/usr/bin/perl
2
3 # Comparador de fecha para los archivos de llamada
4 sub byDate {
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})/;
7         
8         # Descarto por año
9         if ($year1 > $year2) { return 1; }
10         elsif ($year1 < $year2) { return -1; }
11
12         # Descarto por mes
13         if ($mon1 > $mon2) { return 1; }
14         elsif ($mon1 < $mon2) { return -1; }
15
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; }
21         else { return 0; }
22 }
23
24 # Devuelve un listado de archivos de llamada y ordenado por fecha ASC
25 sub getCallFiles {
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;
31         closedir($DIR);
32         return @sortedfiles;
33 }
34
35 # Levanta una variable del archivo AFINSTAL.CONF
36 sub getConfVar {
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;
41         close(CONFIGFILE);
42         chop($line);
43         ($confvar = $line) =~ s/^.*= (.*)/$1/;
44         return $confvar;
45 }
46
47 # Agrega un log entry al logfile del antifraude.pl
48 sub logEntry {
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]";
57         # Append to log
58         open(LOGFILE,">>$log") or die "No se pudo abrir el archivo de log";
59         seek(LOGFILE,0,2);
60         print LOGFILE "$commonstring - $logentry\n";
61         close(LOGFILE);
62
63         if ($consoleout) { print("$logentry\n"); }
64 }
65
66 sub badCall {
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");
71         
72 }
73
74 sub checkUmbrales {
75         local(*callfields) = @_[0];
76         my $callsfile = @_[1];
77         my $matchedUmbral = 0;
78         my $i = 0;
79
80         while (($i <= $#UMBRALES) && ($matchedUmbral == 0)) {
81                 $umbral = $UMBRALES[$i];
82                 chomp($umbral);
83                 ($regid,$phoneline,$oridest,$type,$state) = split(';',$umbral);
84                 if (($state eq 'A') && ($callfields[0] == $phoneline) &&
85                          ($callfields[4] eq $type)) {
86                         # Si es Saliente y coincide el Destino con el Ori/Dest del umbral
87                         if (($type eq 'S') && ($callfields[5] eq $oridest)) {
88                                 $matchedUmbral = $regid;
89                         }
90                         if (($type eq 'E') && ($callfields[6] eq $oridest)) {
91                                 $matchedUmbral = $regid;
92                         }
93                 }                       
94                 ++$i;
95         }
96
97         # Si se matcheo un umbral, grabo una alarma y aviso por consola
98         if ($matchedUmbral > 0) {
99                 # Obtengo algunos datos
100                 ($central = $callsfile) =~ s/^.*\.//;
101                 $user = getlogin || 'Unidentified';
102
103                 # Fetch date and Format it
104                 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
105                 $year += 1900; ++$mon;
106                 $date = "$year$mon$mday";
107                 $time = "$hour$min$sec";
108
109                 # Preparo el registro de alarma
110                 $alarmEntry = "$callfields[7];$central;$callfields[0];$callfields[1];$regid;$callfields[2];$callfields[3];$user;$date;$time";
111
112                 # Grabamos el registro en el archivo de alarmas
113                 $alarmlog = "$CONFDATA{datadir}/alarmas/alarmas.txt";
114                 open(ALARMFILE,">>$alarmlog") or die 'No se pudo abrir el archivo de alarmas';
115                 seek(ALARMFILE,0,2);
116                 print ALARMFILE "$alarmEntry\n";
117                 close(ALARMFILE);
118
119                 # Logeo por consola y logfile que hubo una alarma
120                 logEntry("Alarma: Se ha matcheado el registro procesado con el umbral nro $matchedUmbral",1);
121         }
122 }
123
124 # --------- MAIN CODE -------- #
125 # En la version final, recibo por param el directorio del .conf, por ahora
126 # recibo un dir donde tengo archivos de llamadas
127 if ((!$ARGV[0]) || (! -d $ARGV[0])) { 
128         print("No se ha ingresado un directorio fuente de llamadas\n");
129         exit 1;
130 }
131 # Defino some GLOBALS
132 $CONFDIR = shift;
133 $CONFDATA{logdir} = getConfVar("$CONFDIR/afinstal.conf",12);
134 $CONFDATA{logfile} = getConfVar("$CONFDIR/afinstal.conf",13);
135 $CONFDATA{logsize} = getConfVar("$CONFDIR/afinstal.conf",14);
136 $CONFDATA{datadir} = getConfVar("$CONFDIR/afinstal.conf",15);
137 $CONFDATA{alarmlog} = "$CONFDIR/alarmas/alarmas.txt";
138
139 # Cargo los UMBRALES en memoria
140 open(PARAMFILE,"$CONFDIR/umbrales.param") or die "No se pudo abrir el archivo de umbrales";
141 @UMBRALES = <PARAMFILE>;
142 close(PARAMFILE);
143
144 # For Debug Only
145 print("\nLogdir: $CONFDATA{logdir}\n");
146 print("Logfile: $CONFDATA{logfile}\n");
147 print("Logsize: $CONFDATA{logsize}\n");
148 print("Datadir: $CONFDATA{datadir}\n\n");
149
150 # Proceso los archivos de llamadas
151 @archivos = getCallFiles();
152 FILE: foreach $filename (@archivos) {
153         $regnum = 0;
154         $CALLFILE = "$CONFDATA{datadir}/enproceso/$filename";
155         logEntry("Inicio proceso de: $filename",1);
156
157         open(CALLFILE) or ((warn "No se pudo abrir archivo $filename"),next FILE);
158         REG: foreach $callreg (<CALLFILE>) {
159                 logEntry("Procesando Reg: $regnum | Archivo: $filename",1);
160                 chomp($callreg);
161                 $fieldcount = split(';',$callreg);
162                 @fields = @_;
163                 # Si no tengo 8 campos exactamente, invalido
164                 if ($fieldcount != 8) { badCall($callreg,$regnum); next REG; }
165                 # Si la linea no es un numero, invalido
166                 $fields[0] =~ s/^\s*(\w*)\s*$/$1/;
167                 if (!($fields[0] =~ /^\d+$/)) { badCall($callreg,$regnum); next REG; }
168                 # Si tipo llamada ! E|S o no se informa Origen o Destino, invalido
169                 if (($fields[4] ne 'E') && ($fields[4] ne 'S')) {
170                         badCall($callreg,$regnum); next REG;
171                 }
172                 if (($fields[4] eq 'E') && ($fields[6] eq "")) {
173                         badCall($callreg,$regnum); next REG;
174                 }
175                 if (($fields[4] eq 'S') && ($fields[5] eq "")) {
176                         badCall($callreg,$regnum); next REG;
177                 }
178
179                 # Ya pase todas las validaciones, ahora busco si exite un umbral
180                 checkUmbrales(*fields,$filename);
181         } continue { ++$regnum }
182         close(CALLFILE);
183
184         # La muevo al directorio de procesadas
185         rename $CALLFILE,"$CONFDATA{datadir}/procesadas/$filename";
186
187         logEntry("Fin proceso de: $filename",1);
188 }