]> git.llucax.com Git - z.facultad/75.08/llamadas.git/blob - inst/antifraude.pl
cdb843d526cd0c3c1765dc6ba8c28e6606b0daea
[z.facultad/75.08/llamadas.git] / inst / antifraude.pl
1 #!/usr/bin/perl
2
3 sub is_lock {
4         if ( -e "$ENV{'HOME'}/.antifraude/lock/antifraude.pid" ) {
5                 # Lock file encontrado
6                 return 1;
7         }
8         # No hay lock file!
9         return 0;
10 }
11
12 sub unlock {
13         unlink ("$ENV{'HOME'}/.antifraude/lock/antifraude.pid");
14 }
15
16 sub lock {
17         if (!is_lock()) {
18                 local $lfile = "$ENV{'HOME'}/.antifraude/lock/antifraude.pid";
19                 open(LOCKFILE,">>$lfile");
20                 print LOCKFILE $$;
21                 close(LOCKFILE);
22                 return 1;
23         }
24         return 0;
25 }
26
27 # Comparador de fecha para los archivos de llamada
28 sub byDate {
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})/;
31         
32         # Descarto por año
33         if ($year1 > $year2) { return 1; }
34         elsif ($year1 < $year2) { return -1; }
35
36         # Descarto por mes
37         if ($mon1 > $mon2) { return 1; }
38         elsif ($mon1 < $mon2) { return -1; }
39
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; }
45         else { return 0; }
46 }
47
48 # Devuelve un listado de archivos de llamada y ordenado por fecha ASC
49 sub getCallFiles {
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;
55         closedir($DIR);
56         return @sortedfiles;
57 }
58
59 # Levanta una variable del archivo AFINSTAL.CONF
60 sub getConfVar {
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;
65         close(CONFIGFILE);
66         chop($line);
67         ($confvar = $line) =~ s/^.*= (.*)/$1/;
68         return $confvar;
69 }
70
71 # Agrega un log entry al logfile del antifraude.pl
72 sub logEntry {
73         my $logentry = shift(@_);
74         my $consoleout = shift(@_);
75         my $log = "$CONFDATA{logdir}/$CONFDATA{logfile}";
76         # Fetch date and Format it
77         ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
78         $year += 1900; $year = sprintf("%02d", $year % 100); ++$mon;
79         $user = getlogin || "Unidentified";
80         $commonstring = "[$mday/$mon/$year $hour:$min:$sec|$user|antifraude]";
81         # Append to log
82         open(LOGFILE,">>$log") or die "No se pudo abrir el archivo de log";
83         seek(LOGFILE,0,2);
84         print LOGFILE "$commonstring - $logentry\n";
85         $filesize = tell(LOGFILE);
86         close(LOGFILE);
87
88         # Chequeo el logsize y su lo supero me quedo con 100 lineas
89         if ($filesize > ($CONFDATA{logsize} * 1024 * 1024))
90         {
91                 open(LOGFILE,"+<$log");
92                 do ($line = <LOGFILE>) until $. == 100;
93                 truncate(LOGFILE,tell(LOGFILE));
94                 close(LOGFILE);
95         }
96
97         if ($consoleout) { print("$logentry\n"); }
98 }
99
100 sub badCall {
101         my $callreg = shift(@_);
102         my $numreg = shift(@_);
103         logEntry("El siguiente registro de llamada tiene formato invalido\n$callreg",0);
104         print("Warning: El registro de llamada $numreg tiene formato invalido\n");
105         
106 }
107
108 sub checkUmbrales {
109         local(*callfields) = $_[0];
110         my $callsfile = $_[1];
111         my $matchedUmbral = 0;
112         my $i = 0;
113
114         while (($i <= $#UMBRALES) && ($matchedUmbral == 0)) {
115                 $umbral = $UMBRALES[$i];
116                 chomp($umbral);
117                 ($regid,$phoneline,$oridest,$type,$state) = split(';',$umbral);
118                 if (($state eq 'A') && ($callfields[0] == $phoneline) &&
119                          ($callfields[4] eq $type)) {
120                         # Si es Saliente y coincide el Destino con el Ori/Dest del umbral
121                         if (($type eq 'S') && ($callfields[5] eq $oridest)) {
122                                 $matchedUmbral = $regid;
123                         }
124                         if (($type eq 'E') && ($callfields[6] eq $oridest)) {
125                                 $matchedUmbral = $regid;
126                         }
127                 }                       
128                 ++$i;
129         }
130
131         # Si se matcheo un umbral, grabo una alarma y aviso por consola
132         if ($matchedUmbral > 0) {
133                 # Obtengo algunos datos
134                 ($central = $callsfile) =~ s/^.*\.//;
135                 $user = getlogin || 'Unidentified';
136
137                 # Fetch date and Format it
138                 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
139                 $year += 1900; ++$mon;
140                 $date = "$year$mon$mday";
141                 $time = "$hour$min$sec";
142
143                 # Preparo el registro de alarma
144                 $alarmEntry = "$callfields[7];$central;$callfields[0];$callfields[1];$regid;$callfields[2];$callfields[3];$user;$date;$time";
145
146                 # Grabamos el registro en el archivo de alarmas
147                 $alarmlog = "$CONFDATA{datadir}/alarmas/alarmas.txt";
148                 open(ALARMFILE,">>$alarmlog") or die 'No se pudo abrir el archivo de alarmas';
149                 seek(ALARMFILE,0,2);
150                 print ALARMFILE "$alarmEntry\n";
151                 close(ALARMFILE);
152
153                 # Logeo por consola y logfile que hubo una alarma
154                 logEntry("Alarma: Se ha matcheado el registro procesado con el umbral nro $matchedUmbral",1);
155         }
156 }
157
158 # --------- MAIN CODE -------- #
159 # En la version final, recibo por param el directorio del .conf, por ahora
160 # recibo un dir donde tengo archivos de llamadas
161 if ((!$ARGV[0]) || (! -d $ARGV[0])) { 
162         print("No se ha ingresado un directorio fuente de llamadas\n");
163         exit 1;
164 }
165
166 # File locking..
167 if (is_lock()) { exit 1; }
168 lock();
169
170 # Defino some GLOBALS
171 $CONFDIR = shift;
172 $CONFDATA{logdir} = getConfVar("$CONFDIR/afinstal.conf",12);
173 $CONFDATA{logfile} = getConfVar("$CONFDIR/afinstal.conf",13);
174 $CONFDATA{logsize} = getConfVar("$CONFDIR/afinstal.conf",14);
175 $CONFDATA{datadir} = getConfVar("$CONFDIR/afinstal.conf",15);
176 $CONFDATA{alarmlog} = "$CONFDIR/alarmas/alarmas.txt";
177
178 # Cargo los UMBRALES en memoria
179 open(PARAMFILE,"$CONFDIR/umbrales.param") or die "No se pudo abrir el archivo de umbrales";
180 @UMBRALES = <PARAMFILE>;
181 close(PARAMFILE);
182
183 # For Debug Only
184 print("\nLogdir: $CONFDATA{logdir}\n");
185 print("Logfile: $CONFDATA{logfile}\n");
186 print("Logsize: $CONFDATA{logsize}\n");
187 print("Datadir: $CONFDATA{datadir}\n\n");
188
189 # Proceso los archivos de llamadas
190 @archivos = getCallFiles();
191 FILE: foreach $filename (@archivos) {
192         $regnum = 0;
193         $CALLFILE = "$CONFDATA{datadir}/enproceso/$filename";
194         logEntry("Inicio proceso de: $filename",1);
195
196         open(CALLFILE) or ((warn "No se pudo abrir archivo $filename"),next FILE);
197         REG: foreach $callreg (<CALLFILE>) {
198                 logEntry("Procesando Reg: $regnum | Archivo: $filename",1);
199                 chomp($callreg);
200                 $fieldcount = split(';',$callreg);
201                 @fields = @_;
202                 # Si no tengo 8 campos exactamente, invalido
203                 if ($fieldcount != 8) { badCall($callreg,$regnum); next REG; }
204                 # Si la linea no es un numero, invalido
205                 $fields[0] =~ s/^\s*(\w*)\s*$/$1/;
206                 if (!($fields[0] =~ /^\d+$/)) { badCall($callreg,$regnum); next REG; }
207                 # Si tipo llamada ! E|S o no se informa Origen o Destino, invalido
208                 if (($fields[4] ne 'E') && ($fields[4] ne 'S')) {
209                         badCall($callreg,$regnum); next REG;
210                 }
211                 if (($fields[4] eq 'E') && ($fields[6] eq "")) {
212                         badCall($callreg,$regnum); next REG;
213                 }
214                 if (($fields[4] eq 'S') && ($fields[5] eq "")) {
215                         badCall($callreg,$regnum); next REG;
216                 }
217
218                 # Ya pase todas las validaciones, ahora busco si exite un umbral
219                 checkUmbrales(*fields,$filename);
220         } continue { ++$regnum }
221         close(CALLFILE);
222
223         # La muevo al directorio de procesadas
224         rename $CALLFILE,"$CONFDATA{datadir}/procesadas/$filename";
225
226         logEntry("Fin proceso de: $filename",1);
227 }
228
229 # Unlocking
230 unlock();