]> git.llucax.com Git - z.facultad/75.08/llamadas.git/blob - inst/antifraude.pl
Ya se efectuan todas las validaciones pedidas para cada registro, ahora me falta...
[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         $data_dir = shift;
28         opendir($DIR,"$data_dir/enproceso") or die 'Could not open dir';
29         # Valido solo fisicamente, lo logico ya valido afimonio..
30         @files = grep {/[0-9]{12}\.[0-9]{4}$/ && -f "$data_dir/enproceso/$_"} 
31                         readdir($DIR);
32         @sortedfiles = sort byDate @files;
33         closedir($DIR);
34         return @sortedfiles;
35 }
36
37 # Levanta una variable del archivo AFINSTAL.CONF
38 sub getConfVar {
39         $CONFIGFILE = shift;
40         $linenumber = shift;
41         open(CONFIGFILE) or die "No se pudo abrir el archivo $CONFIGFILE";
42         do { $line = <CONFIGFILE> } until $. == $linenumber;
43         close(CONFIGFILE);
44         chop($line);
45         ($confvar = $line) =~ s/^.*= (.*)/$1/;
46         return $confvar;
47 }
48
49 # Agrega un log entry al logfile del antifraude.pl
50 sub logEntry {
51         $logentry = shift;
52         $consoleout = shift;
53         $log = "$CONFDATA{logdir}/$CONFDATA{logfile}";
54         # Fetch date and Format it
55         ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = gmtime(time);
56         $year += 1900; $year = sprintf("%02d", $year % 100); ++$mon;
57         $user = getlogin || "Unidentified";
58         $commonstring = "[$mday/$mon/$year $hour:$min:$sec|$user|antifraude]";
59         # Append to log
60         open(LOGFILE,">>$log") or die "No se pudo abrir el archivo de log";
61         seek(LOGFILE,0,2);
62         print LOGFILE "$commonstring - $logentry\n";
63         close(LOGFILE);
64
65         if ($consoleout) { print("$logentry\n"); }
66 }
67
68 sub badCall {
69         $callreg = shift;
70         $numreg = shift;
71         logEntry("El siguiente registro de llamada tiene formato invalido\n$callreg",0);
72         print("El registro numero $numreg tiene formato invalido\n");
73         
74 }
75 # --------- MAIN CODE -------- #
76 # En la version final, recibo por param el directorio del .conf, por ahora
77 # recibo un dir donde tengo archivos de llamadas
78 if ((!$ARGV[0]) || (! -d $ARGV[0])) { 
79         print("No se ha ingresado un directorio fuente de llamadas\n");
80         exit 1;
81 }
82 $CONFDIR = shift;
83 $CONFDATA{logdir} = getConfVar("$CONFDIR/afinstal.conf",12);
84 $CONFDATA{logfile} = getConfVar("$CONFDIR/afinstal.conf",13);
85 $CONFDATA{logsize} = getConfVar("$CONFDIR/afinstal.conf",14);
86 $CONFDATA{datadir} = getConfVar("$CONFDIR/afinstal.conf",15);
87
88 # For Debug Only
89 print("\nLogdir: $CONFDATA{logdir}\n");
90 print("Logfile: $CONFDATA{logfile}\n");
91 print("Logsize: $CONFDATA{logsize}\n");
92 print("Datadir: $CONFDATA{datadir}\n\n");
93
94 # Proceso los archivos de llamadas
95 @archivos = getCallFiles($CONFDATA{datadir});
96 FILE: foreach $filename (@archivos) {
97         $regnum = 0;
98         $CALLFILE = "$CONFDATA{datadir}/enproceso/$filename";
99         logEntry("Inicio proceso de: $filename",1);
100
101         open(CALLFILE) or ((warn "No se pudo abrir archivo $filename"),next FILE);
102         REG: foreach $callreg (<CALLFILE>) {
103                 logEntry("Procesando Reg: $regnum | Archivo: $filename",1);
104                 chomp($callreg);
105                 $fieldcount = split(';',$callreg);
106                 @fields = @_;
107                 # Si no tengo 8 campos exactamente, invalido
108                 if ($fieldcount != 8) { badCall($callreg,$regnum); next REG; }
109                 # Si la linea no es un numero, invalido
110                 $fields[0] =~ s/^\s*(\w*)\s*$/$1/;
111                 if (!($fields[0] =~ /^\d+$/)) { badCall($callreg,$regnum); next REG; }
112                 # Si tipo llamada ! E|S o no se informa Origen o Destino, invalido
113                 if (($fields[4] ne 'E') && ($fields[4] ne 'S')) {
114                         badCall($callreg,$regnum); next REG;
115                 }
116                 if (($fields[4] eq 'E') && ($fields[6] eq "")) {
117                         badCall($callreg,$regnum); next REG;
118                 }
119                 if (($fields[4] eq 'S') && ($fields[5] eq "")) {
120                         badCall($callreg,$regnum); next REG;
121                 }
122
123                 # Ya pase todas las validaciones, ahora busco si exite un umbral
124         } continue { ++$regnum }
125         close(CALLFILE);
126
127         logEntry("Fin proceso de: $filename",1);
128 }