]> git.llucax.com Git - z.facultad/75.08/llamadas.git/blob - doc/Informe7508.lyx
Se agrega código fuente, instalación y util.sh.
[z.facultad/75.08/llamadas.git] / doc / Informe7508.lyx
1 #LyX 1.3 created this file. For more info see http://www.lyx.org/
2 \lyxformat 221
3 \textclass book
4 \language spanish
5 \inputencoding auto
6 \fontscheme palatino
7 \graphics default
8 \paperfontsize default
9 \spacing single 
10 \papersize a4paper
11 \paperpackage widemarginsa4
12 \use_geometry 0
13 \use_amsmath 0
14 \use_natbib 0
15 \use_numerical_citations 0
16 \paperorientation portrait
17 \secnumdepth 3
18 \tocdepth 3
19 \paragraph_separation indent
20 \defskip medskip
21 \quotes_language english
22 \quotes_times 2
23 \papercolumns 1
24 \papersides 1
25 \paperpagestyle default
26
27 \layout Title
28
29 Sistemas Operativos (75.08)
30 \newline 
31 Trabajo Práctico
32 \newline 
33 ANTIFRAUDE
34 \layout Author
35
36
37 \series bold 
38 Grupo 12
39 \series default 
40
41 \series bold 
42 Tema Z
43 \series default 
44
45 \newline 
46 Nicolás Dimov (77624)
47 \newline 
48 Alan Kennedy (78907)
49 \newline 
50 Leandro Lucarella (77891)
51 \newline 
52 Ricardo Markiewicz (78226)
53 \layout Date
54
55 26 de Octubre del 2004
56 \layout Standard
57
58
59 \begin_inset LatexCommand \tableofcontents{}
60
61 \end_inset 
62
63
64 \layout Chapter
65
66 Desarollo e Implementación
67 \layout Section
68
69 Hipotesis y Aclaraciones
70 \layout Itemize
71
72 El programa en su totalidad va a ser ejecutado por un único usuario, una
73  configuración diferente es posible pero queda en manos del administrador.
74 \layout Itemize
75
76 En los archivos de llamada se valida que sean números, y para validar la
77  fecha no se tiene en cuenta casos particulares como el 29, 30, 31 de febrero.
78 \layout Itemize
79
80 Todos los meses pueden tener 31 días.
81 \layout Itemize
82
83 Aficonf utiliza números para describir las acciones Nuevo y Buscar.
84  La opción Borrar es ofrecida requiriendo un número de ID a borrar dependiendo
85  de los resultados de la búsqueda, y dando una opción (-1) para cancelar
86  la acción.
87 \layout Itemize
88
89 El instalador utiliza el archivo 
90 \family typewriter 
91 afinstal.conf
92 \family default 
93 , situado en el directorio 
94 \family typewriter 
95 $PATH_INSTALADOR/conf
96 \family default 
97 , para determinar que componentes se encuentran instalados.
98  Internamente, en base a la información de paths proporcionada por este
99  archivo, busca su los binarios realmente se encuentran en el OS, y en caso
100  contrario permite volver a reinstalarlo/s.
101 \layout Section
102
103
104 \begin_inset LatexCommand \label{sec:Problemas-relevantes}
105
106 \end_inset 
107
108 Problemas relevantes
109 \layout Itemize
110
111 Dado que los distintos componentes del sistema se pueden instalar en diferentes
112  paths dentro del OS, creamos el directorio 
113 \family typewriter 
114 ~$HOME/.antifraude
115 \family default 
116  donde se almacenará información acerca de los paths en donde reside cada
117  uno de ellos y otros archivos de intercambio.
118 \layout Itemize
119
120 Así mismo, como los programas pueden ser instalados en directorios distintos,
121  toda la información compartida es guardada en 
122 \family typewriter 
123 ~$HOME/.antifraude
124 \family default 
125 , para ser mas consistentes con la manera de trabajar en Unix.
126  Lo ideal hubiera sido utilizar 
127 \family typewriter 
128 /etc/antifraude
129 \family default 
130 , pero como no podríamos suponer acceso de 
131 \emph on 
132 root
133 \emph default 
134  preferimos directamente trabajar en el directorio del usuario.
135 \layout Section
136
137 Instalación
138 \layout Standard
139
140 Una vez descargados los fuentes (asumiremos que ha descargado el 
141 \family typewriter 
142 tar.gz
143 \family default 
144 ) solo debe descomprimir el archivo ejecutando el siguiente comando:
145 \layout LyX-Code
146
147 tar xvzf grupo12.tar.gz
148 \layout Standard
149
150 Esto creará la siguiente estructura de directorios:
151 \layout LyX-Code
152
153 ./
154 \layout LyX-Code
155
156  +- grupo12
157 \layout LyX-Code
158
159  |
160 \layout LyX-Code
161
162  +-- README
163 \layout LyX-Code
164
165  +-- COPYING
166 \layout LyX-Code
167
168  +-- afinstal
169 \layout LyX-Code
170
171  +-- conf
172 \layout LyX-Code
173
174  +---- umbrales.param
175 \layout LyX-Code
176
177  +---- umbrales.id
178 \layout LyX-Code
179
180  +---- oridesti.txt
181 \layout LyX-Code
182
183  +-- inst
184 \layout LyX-Code
185
186  +---- afimonio
187 \layout LyX-Code
188
189  +---- antifraude.pl
190 \layout LyX-Code
191
192  +---- aficonf
193 \layout LyX-Code
194
195  +---- afimonio_daemon.sh
196 \layout LyX-Code
197
198  +---- util.sh
199 \layout LyX-Code
200
201  +---- callgen
202 \layout LyX-Code
203
204  +---- testcalls.tar.gz
205 \layout Standard
206
207 Para proceder a la instalación del sistema 
208 \series bold 
209 antifraude
210 \series default 
211  debe correr el script 
212 \series bold 
213 afinstal
214 \series default 
215 :
216 \layout LyX-Code
217
218 ./afinstal
219 \layout Standard
220
221 y seguir los pasos que se le indiquen a continuación.
222  De no ejecutar apropiadamente la instalación, no se garantiza el correcto
223  funcionamiento de los componentes.
224  
225 \layout Section
226
227 Comandos Desarrollados
228 \layout Subsection
229
230 AFIMONIO
231 \layout Subsubsection
232
233 Tipo de comando
234 \layout Standard
235
236 Solicitado.
237 \layout Subsubsection
238
239 Archivos de Input
240 \layout Standard
241
242
243 \series medium 
244 Procesa los archivos que se encuentran en el directorio 
245 \family typewriter 
246 $PATH_ANTIFRAUDE/$DATADIR/aprocesar
247 \family default 
248  y los mueve a 
249 \family typewriter 
250 $PATH_ANTIFRAUDE/$DATADIR/enproce
251 \series default 
252 so
253 \family default 
254 \series medium 
255  o 
256 \family typewriter 
257 \series default 
258 /rechazadas
259 \family default 
260 \series medium 
261  según corresponda.
262 \layout Subsubsection
263
264 Archivos de Output
265 \layout Standard
266
267 El afimonio genera una salida al archivo 
268 \family typewriter 
269 afimonio.log
270 \family default 
271  la cual contiene información sobre la ejecución del programa.
272 \layout Standard
273
274 Si un archivo es válido, se añade una línea con el siguiente formato: 
275 \layout LyX-Code
276
277 $fecha $USER afimonio: "Se detecta archivo de llamadas $file"
278 \layout Standard
279
280 Si el archivo tuviera un nombre inválido, la línea seria la siguiente: 
281 \layout LyX-Code
282
283 $fecha $USER afimonio: "Se rechaza el archivo $file"
284 \layout Standard
285
286 donde:
287 \layout Description
288
289
290 \family typewriter 
291 $fecha
292 \family default 
293  fecha actual con formato Día-Mes-Año-Hora:Minuto.
294 \layout Description
295
296
297 \family typewriter 
298 $USER
299 \family default 
300  nombre de usuario que ejecuto el script.
301 \layout Description
302
303
304 \family typewriter 
305 $file
306 \family default 
307  nombre del archivo que se procesó.
308 \layout Subsubsection
309
310 Ejemplos de invocación
311 \layout Paragraph
312
313
314 \family typewriter 
315 ./afimonio
316 \layout Standard
317
318 Corre el programa en primer plano.
319 \layout Paragraph
320
321
322 \family typewriter 
323 nohup ./afimonio &
324 \layout Standard
325
326 Corre el programa en segundo plano, evitando que se cierre al morir el padre
327  desasociándolo de la terminal.
328  La salida del programa queda en el archivo 
329 \family typewriter 
330 nohup.out
331 \family default 
332  a menos que se redirija a otro archivo.
333 \layout Subsubsection
334
335 Código Fuente
336 \layout LyX-Code
337
338 #!/bin/bash
339 \layout LyX-Code
340
341 \layout LyX-Code
342
343 BASE_DIR=$HOME/.antifraude
344 \layout LyX-Code
345
346 \layout LyX-Code
347
348 # uso las funciones de util.sh
349 \layout LyX-Code
350
351 .
352  "$HOME/.antifraude/util.sh"
353 \layout LyX-Code
354
355 .
356  "$HOME/.antifraude/conf/afimonio.conf"
357 \layout LyX-Code
358
359 .
360  "$HOME/.antifraude/conf/antifraude.conf"
361 \layout LyX-Code
362
363 \layout LyX-Code
364
365 # Es llamada por los trap para deslockear el afimonio 
366 \layout LyX-Code
367
368 finalize() {
369 \layout LyX-Code
370
371         unlock "afimonio" 
372 \layout LyX-Code
373
374         exit 0
375 \layout LyX-Code
376
377 }
378 \layout LyX-Code
379
380 # filtra el nombre del archivo pasado por parametro sacandole
381 \layout LyX-Code
382
383 # todos los caracteres que no sean numeros 
384 \layout LyX-Code
385
386 checkfilename(){
387 \layout LyX-Code
388
389         date=`echo $1 | cut -d "." -f 1`
390 \layout LyX-Code
391
392         central=`echo $1 | cut -d "." -f 2`
393 \layout LyX-Code
394
395         validar_solo_numeros "$date"
396 \layout LyX-Code
397
398         if [ "$?" -ne 0 ]; then
399 \layout LyX-Code
400
401                 return 1
402 \layout LyX-Code
403
404         fi
405 \layout LyX-Code
406
407         mes=${date:4:2}
408 \layout LyX-Code
409
410         validar_rango "$mes" "1" "12"
411 \layout LyX-Code
412
413         if [ "$?" -ne 0 ]; then
414 \layout LyX-Code
415
416                 return 1
417 \layout LyX-Code
418
419         fi
420 \layout LyX-Code
421
422         dia=${date:6:2}
423 \layout LyX-Code
424
425         validar_rango "$dia" "1" "31" 
426 \layout LyX-Code
427
428         if [ "$?" -ne 0 ]; then
429 \layout LyX-Code
430
431                 return 1
432 \layout LyX-Code
433
434         fi
435 \layout LyX-Code
436
437         hora=${date:8:2}
438 \layout LyX-Code
439
440         validar_rango "$hora" "0" "23"
441 \layout LyX-Code
442
443         if [ "$?" -ne 0 ]; then
444 \layout LyX-Code
445
446                 return 1
447 \layout LyX-Code
448
449         fi
450 \layout LyX-Code
451
452         min=${date:10:2}
453 \layout LyX-Code
454
455         validar_rango "$min" "0" "59"
456 \layout LyX-Code
457
458         if [ "$?" -ne 0 ]; then
459 \layout LyX-Code
460
461                 return 1
462 \layout LyX-Code
463
464         fi
465 \layout LyX-Code
466
467         validar_solo_numeros "$central"
468 \layout LyX-Code
469
470         if [ "$?" -ne 0 ]; then
471 \layout LyX-Code
472
473                 return 1
474 \layout LyX-Code
475
476         fi
477 \layout LyX-Code
478
479         return 0                
480 \layout LyX-Code
481
482 }
483 \layout LyX-Code
484
485 #--------------------MAIN SCRIPT----------------------
486 \layout LyX-Code
487
488 # Recupero las rutas a todos los directorios y archivos
489 \layout LyX-Code
490
491 # que necesito del antifraude
492 \layout LyX-Code
493
494 DATADIR=$ANTI_DATADIR
495 \layout LyX-Code
496
497 SOURCEDIR=$DATADIR/aprocesar/
498 \layout LyX-Code
499
500 ACEPTDIR=$DATADIR/enproceso/
501 \layout LyX-Code
502
503 REJECTDIR=$DATADIR/rechazadas/
504 \layout LyX-Code
505
506 BINDIR=$ANTI_BINDIR
507 \layout LyX-Code
508
509 # Del afimonio
510 \layout LyX-Code
511
512 LOGDIR=$AFIM_LOGDIR
513 \layout LyX-Code
514
515 LOGNAME=$AFIM_LOGFILE
516 \layout LyX-Code
517
518 LOGFILE=$LOGDIR/$LOGNAME
519 \layout LyX-Code
520
521 # Capturo señales para salir bien (liberando el lock)
522 \layout LyX-Code
523
524 trap "finalize" INT
525 \layout LyX-Code
526
527 trap "finalize" TERM 
528 \layout LyX-Code
529
530 # Me lockeo
531 \layout LyX-Code
532
533 lock "afimonio" || die "No se puede correr, hay otra 
534 \backslash 
535
536 \layout LyX-Code
537
538 instancia corriendo o no se puede crear el lock file!"
539 \layout LyX-Code
540
541 # Comienza el ciclo infinito que mueve los archivos
542 \layout LyX-Code
543
544 while true; do 
545 \layout LyX-Code
546
547         files=
548 \layout LyX-Code
549
550         for file in `ls $SOURCEDIR` ; do
551 \layout LyX-Code
552
553                 files=1
554 \layout LyX-Code
555
556                 checkfilename $file     
557 \layout LyX-Code
558
559                 if [ "$?" -eq 0 ]; then
560 \layout LyX-Code
561
562                         mv "$SOURCEDIR$file" "$ACEPTDIR"
563 \layout LyX-Code
564
565                         fecha=$(date +%d/%m/%Y-%H:%M)
566 \layout LyX-Code
567
568                         echo "$fecha $USER afimonio:
569 \backslash 
570 "Se detecta " 
571 \backslash 
572
573 \layout LyX-Code
574
575                           "archivo de llamadas $file
576 \backslash 
577 "" >> $LOGFILE
578 \layout LyX-Code
579
580                 else 
581 \layout LyX-Code
582
583                         mv "$SOURCEDIR$file" "$REJECTDIR"
584 \layout LyX-Code
585
586                         fecha=$(date +%d/%m/%Y-%H:%M)
587 \layout LyX-Code
588
589                         echo "$fecha $USER afimonio:
590 \backslash 
591 "Se rechaza " 
592 \backslash 
593
594 \layout LyX-Code
595
596                           "el archivo $file
597 \backslash 
598 "" >> $LOGFILE
599 \layout LyX-Code
600
601                 fi
602 \layout LyX-Code
603
604                 clean_log "$LOGFILE" "$AFIM_LOGSIZE"
605 \layout LyX-Code
606
607         done #for
608 \layout LyX-Code
609
610         # me fijo si el antifraude esta corriendo y si no lo esta
611 \layout LyX-Code
612
613         # lo arranco
614 \layout LyX-Code
615
616         if [ -n $files ] && ! is_lock "antifraude.pl"; then
617 \layout LyX-Code
618
619                 $BINDIR/antifraude.pl &
620 \layout LyX-Code
621
622         fi
623 \layout LyX-Code
624
625         sleep 5
626 \layout LyX-Code
627
628 done #while
629 \layout Subsection
630
631 ANTIFRAUDE
632 \layout Subsubsection
633
634 Tipo de comando
635 \layout Standard
636
637 Solicitado.
638 \layout Subsubsection
639
640 Archivos de Input
641 \layout Standard
642
643 Procesa los archivos de llamadas que encuentre en el momento de invocación
644  en el directorio 
645 \family typewriter 
646 $PATH_ANTIFRAUDE/$DATADIR/enproceso
647 \family default 
648 .
649  El demonio 
650 \family typewriter 
651 \series bold 
652 afimonio
653 \family default 
654 \series default 
655  será quien alimentará al 
656 \family typewriter 
657 \series bold 
658 antifraude
659 \family default 
660 \series default 
661  con dichos archivos, no obstante se lo puede alimentar con archivos de
662  llamadas en forma manual, situándolos en el directorio anteriormente descripto.
663 \layout Standard
664
665 Este comando, en el momento de invocacion genera y guarda internamente un
666  listado de los archivos de llamadas presences en el directorio 
667 \family typewriter 
668 /enproceso
669 \family default 
670 , ordenándolos por fecha (establecida en el nombre del archivo) en forma
671  ascendente.
672  Dado que utiliza durante toda su ejecución esta lista interna, el 
673 \family typewriter 
674 \series bold 
675 Afimonio
676 \family default 
677 \series default 
678  puede alimentar al directorio 
679 \family typewriter 
680 /enproceso
681 \family default 
682  con nuevos archivos mientras el 
683 \family typewriter 
684 \series bold 
685 Antifraude
686 \family default 
687 \series default 
688  corre, pero los mismos no serán tenidos en cuenta (esto es, procesados),
689  hasta la próxima invocación del comando.
690 \layout Subsubsection
691
692 Archivos de Output
693 \layout Description
694
695
696 \family typewriter 
697 Antifraude.log
698 \family default 
699  En este archivo se guarda información del procesamiento de los registros,
700  advertencias provocados por registros no validos y alarmas emitidas por
701  registros que cumplen con un umbral.
702 \layout Description
703
704
705 \family typewriter 
706 Alarmas.txt
707 \family default 
708  En este archivo se guarda información de las alarmas provocadas por registros
709  en los archivos de llamadas, que hayan cumplido un umbral determinado del
710  archivo 
711 \family typewriter 
712 umbrales.param
713 \family default 
714 .
715 \layout Subsubsection
716
717 Ejemplos de invocación
718 \layout Paragraph
719
720
721 \family typewriter 
722 ./antifraude.pl
723 \layout Standard
724
725 El programa procesa las llamadas 
726 \family typewriter 
727 enproceso
728 \family default 
729  como indica el enunciado en primer plano.
730 \layout Paragraph
731
732
733 \family typewriter 
734 perl antifraude.pl
735 \layout Standard
736
737 Ídem anterior.
738 \layout Paragraph
739
740
741 \family typewriter 
742 ./antifraude.pl &
743 \layout Standard
744
745 Ídem anterior pero procesa en segundo plano.
746 \layout Subsubsection
747
748 Código Fuente
749 \layout LyX-Code
750
751 #!/usr/bin/perl
752 \layout LyX-Code
753
754 sub is_lock {
755 \layout LyX-Code
756
757         if ( -e "$ENV{'HOME'}/.antifraude/lock/antifraude.pid" ) {
758 \layout LyX-Code
759
760                 # Lock file encontrado
761 \layout LyX-Code
762
763                 return 1;
764 \layout LyX-Code
765
766         }
767 \layout LyX-Code
768
769         # No hay lock file!
770 \layout LyX-Code
771
772         return 0;
773 \layout LyX-Code
774
775 }
776 \layout LyX-Code
777
778 sub unlock {
779 \layout LyX-Code
780
781         unlink ("$ENV{'HOME'}/.antifraude/lock/antifraude.pid");
782 \layout LyX-Code
783
784 }
785 \layout LyX-Code
786
787 sub lock {
788 \layout LyX-Code
789
790         if (!is_lock()) {
791 \layout LyX-Code
792
793                 local $lfile = "$ENV{'HOME'}/.antifraude/lock/antifraude.pid";
794 \layout LyX-Code
795
796                 open(LOCKFILE,">>$lfile");
797 \layout LyX-Code
798
799                 print LOCKFILE $$;
800 \layout LyX-Code
801
802                 close(LOCKFILE);
803 \layout LyX-Code
804
805                 return 1;
806 \layout LyX-Code
807
808         }
809 \layout LyX-Code
810
811         return 0;
812 \layout LyX-Code
813
814 }
815 \layout LyX-Code
816
817 # Comparador de fecha para los archivos de llamada
818 \layout LyX-Code
819
820 sub byDate {
821 \layout LyX-Code
822
823         ($year1,$mon1,$day1,$hr1,$min1) =
824 \layout LyX-Code
825
826           $a =~ /([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/;
827 \layout LyX-Code
828
829         ($year2,$mon2,$day2,$hr2,$min2) =
830 \layout LyX-Code
831
832           $b =~ /([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/;
833 \layout LyX-Code
834
835         
836 \layout LyX-Code
837
838         # Descarto por año
839 \layout LyX-Code
840
841         if ($year1 > $year2) { return 1; }
842 \layout LyX-Code
843
844         elsif ($year1 < $year2) { return -1; }
845 \layout LyX-Code
846
847         # Descarto por mes
848 \layout LyX-Code
849
850         if ($mon1 > $mon2) { return 1; }
851 \layout LyX-Code
852
853         elsif ($mon1 < $mon2) { return -1; }
854 \layout LyX-Code
855
856         # Calculo minutos de lo restante
857 \layout LyX-Code
858
859         $totalmin1 = ($day1 * 24 * 60) + ($hr1 * 60) + $min1;
860 \layout LyX-Code
861
862         $totalmin2 = ($day2 * 24 * 60) + ($hr2 * 60) + $min2;
863 \layout LyX-Code
864
865         if ($totalmin1 > $totalmin2) { return 1; }
866 \layout LyX-Code
867
868         elsif ($totalmin1 < $totalmin2) { return -1; }
869 \layout LyX-Code
870
871         else { return 0; }
872 \layout LyX-Code
873
874 }
875 \layout LyX-Code
876
877 # Devuelve un listado de archivos de llamada y ordenado por fecha ASC
878 \layout LyX-Code
879
880 sub getCallFiles {
881 \layout LyX-Code
882
883         # Obtengo listado de archivos de llamadas y lo ordeno por fecha
884 \layout LyX-Code
885
886         opendir($DIR,"$CONFDATA{datadir}/enproceso")
887 \layout LyX-Code
888
889           or die 'Could not open dir';
890 \layout LyX-Code
891
892         # Valido solo fisicamente, lo logico ya valido afimonio..
893 \layout LyX-Code
894
895         @files = grep {/[0-9]{12}
896 \backslash 
897 .[0-9]{4}$/
898 \layout LyX-Code
899
900           && -f "$CONFDATA{datadir}/enproceso/$_"} readdir($DIR);
901 \layout LyX-Code
902
903         @sortedfiles = sort byDate @files;
904 \layout LyX-Code
905
906         closedir($DIR);
907 \layout LyX-Code
908
909         return @sortedfiles;
910 \layout LyX-Code
911
912 }
913 \layout LyX-Code
914
915 # Levanta una variable del archivo AFINSTAL.CONF
916 \layout LyX-Code
917
918 sub getConfVar {
919 \layout LyX-Code
920
921         $CONFIGFILE = shift(@_);
922 \layout LyX-Code
923
924         my $linenumber = shift(@_);
925 \layout LyX-Code
926
927         open(CONFIGFILE)
928 \layout LyX-Code
929
930           or die "No se pudo abrir el archivo $CONFIGFILE";
931 \layout LyX-Code
932
933         do { $line = <CONFIGFILE> } until $.
934  == $linenumber;
935 \layout LyX-Code
936
937         close(CONFIGFILE);
938 \layout LyX-Code
939
940         chop($line);
941 \layout LyX-Code
942
943         ($confvar = $line) =~ s/"(.*)"$/$1/;
944 \layout LyX-Code
945
946         $confvar =~ s/^.*=//;
947 \layout LyX-Code
948
949         return $confvar;
950 \layout LyX-Code
951
952 }
953 \layout LyX-Code
954
955 # Agrega un log entry al logfile del antifraude.pl
956 \layout LyX-Code
957
958 sub logEntry {
959 \layout LyX-Code
960
961         my $logentry = shift(@_);
962 \layout LyX-Code
963
964         my $consoleout = shift(@_);
965 \layout LyX-Code
966
967         my $log = "$CONFDATA{logdir}/$CONFDATA{logfile}";
968 \layout LyX-Code
969
970         # Fetch date and Format it
971 \layout LyX-Code
972
973         ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
974 \layout LyX-Code
975
976           = localtime(time);
977 \layout LyX-Code
978
979         $mon =~ s/^(
980 \backslash 
981 d)$/0$1/;
982 \layout LyX-Code
983
984         $mday =~ s/^(
985 \backslash 
986 d)$/0$1/;
987 \layout LyX-Code
988
989         $hour =~ s/^(
990 \backslash 
991 d)$/0$1/;
992 \layout LyX-Code
993
994         $min =~ s/^(
995 \backslash 
996 d)$/0$1/;
997 \layout LyX-Code
998
999         $year += 1900; ++$mon;
1000 \layout LyX-Code
1001
1002         $user = "$ENV{USER}";
1003 \layout LyX-Code
1004
1005         $commonstring = "$mday/$mon/$year-$hour:$min $user antifraude:";
1006 \layout LyX-Code
1007
1008         # Append to log
1009 \layout LyX-Code
1010
1011         open(LOGFILE,">>$log")
1012 \layout LyX-Code
1013
1014           or die "No se pudo abrir el archivo de log";
1015 \layout LyX-Code
1016
1017         seek(LOGFILE,0,2);
1018 \layout LyX-Code
1019
1020         print LOGFILE "$commonstring 
1021 \backslash 
1022 "$logentry
1023 \backslash 
1024 "
1025 \backslash 
1026 n";
1027 \layout LyX-Code
1028
1029         $filesize = tell(LOGFILE);
1030 \layout LyX-Code
1031
1032         close(LOGFILE);
1033 \layout LyX-Code
1034
1035         # Chequeo el logsize y su lo supero me quedo con 100 lineas
1036 \layout LyX-Code
1037
1038         if ($filesize > $CONFDATA{logsize})
1039 \layout LyX-Code
1040
1041         {
1042 \layout LyX-Code
1043
1044                 open(LOGFILE,"+<$log");
1045 \layout LyX-Code
1046
1047                 do ($line = <LOGFILE>) until $.
1048  == 100;
1049 \layout LyX-Code
1050
1051                 truncate(LOGFILE,tell(LOGFILE));
1052 \layout LyX-Code
1053
1054                 close(LOGFILE);
1055 \layout LyX-Code
1056
1057         }
1058 \layout LyX-Code
1059
1060         if ($consoleout) { print("$logentry
1061 \backslash 
1062 n"); }
1063 \layout LyX-Code
1064
1065 }
1066 \layout LyX-Code
1067
1068 sub badCall {
1069 \layout LyX-Code
1070
1071         my $callreg = shift(@_);
1072 \layout LyX-Code
1073
1074         my $numreg = shift(@_);
1075 \layout LyX-Code
1076
1077         logEntry("El siguiente registro de llamada tiene format ".
1078 \layout LyX-Code
1079
1080           "o invalido
1081 \backslash 
1082 n$callreg",0);
1083 \layout LyX-Code
1084
1085         print("Warning: El registro de llamada $numreg tiene ".
1086 \layout LyX-Code
1087
1088           "formato invalido
1089 \backslash 
1090 n");
1091 \layout LyX-Code
1092
1093         
1094 \layout LyX-Code
1095
1096 }
1097 \layout LyX-Code
1098
1099 sub checkUmbrales {
1100 \layout LyX-Code
1101
1102         local(*callfields) = $_[0];
1103 \layout LyX-Code
1104
1105         my $callsfile = $_[1];
1106 \layout LyX-Code
1107
1108         my $matchedUmbral = 0;
1109 \layout LyX-Code
1110
1111         my $i = 0;
1112 \layout LyX-Code
1113
1114         while (($i <= $#UMBRALES) && ($matchedUmbral == 0)) {
1115 \layout LyX-Code
1116
1117                 $umbral = $UMBRALES[$i];
1118 \layout LyX-Code
1119
1120                 chomp($umbral);
1121 \layout LyX-Code
1122
1123                 ($regid,$phoneline,$oridest,$type,$state)
1124 \layout LyX-Code
1125
1126                   = split(';',$umbral);
1127 \layout LyX-Code
1128
1129                 if (($state eq 'A') && ($callfields[0] == $phoneline)
1130 \layout LyX-Code
1131
1132                   && ($callfields[4] eq $type)) {
1133 \layout LyX-Code
1134
1135                         # Si es Saliente y coincide el Destino con el
1136 \layout LyX-Code
1137
1138                         # Ori/Dest del umbral
1139 \layout LyX-Code
1140
1141                         if (($type eq 'S')
1142 \layout LyX-Code
1143
1144                           && ($callfields[5] eq $oridest)) {
1145 \layout LyX-Code
1146
1147                                 $matchedUmbral = $regid;
1148 \layout LyX-Code
1149
1150                         }
1151 \layout LyX-Code
1152
1153                         if (($type eq 'E')
1154 \layout LyX-Code
1155
1156                           && ($callfields[6] eq $oridest)) {
1157 \layout LyX-Code
1158
1159                                 $matchedUmbral = $regid;
1160 \layout LyX-Code
1161
1162                         }
1163 \layout LyX-Code
1164
1165                 }                       
1166 \layout LyX-Code
1167
1168                 ++$i;
1169 \layout LyX-Code
1170
1171         }
1172 \layout LyX-Code
1173
1174         # Si se matcheo un umbral, grabo una alarma y aviso por consola
1175 \layout LyX-Code
1176
1177         if ($matchedUmbral > 0) {
1178 \layout LyX-Code
1179
1180                 # Obtengo algunos datos
1181 \layout LyX-Code
1182
1183                 ($central = $callsfile) =~ s/^.*
1184 \backslash 
1185 .//;
1186 \layout LyX-Code
1187
1188                 $user = "$ENV{USER}";
1189 \layout LyX-Code
1190
1191                 # Fetch date and Format it
1192 \layout LyX-Code
1193
1194                 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
1195 \layout LyX-Code
1196
1197                   = localtime(time);
1198 \layout LyX-Code
1199
1200                 $year += 1900; ++$mon;
1201 \layout LyX-Code
1202
1203                 $mon =~ s/^(
1204 \backslash 
1205 d)$/0$1/;
1206 \layout LyX-Code
1207
1208                 $mday =~ s/^(
1209 \backslash 
1210 d)$/0$1/;
1211 \layout LyX-Code
1212
1213                 $hour =~ s/^(
1214 \backslash 
1215 d)$/0$1/;
1216 \layout LyX-Code
1217
1218                 $min =~ s/^(
1219 \backslash 
1220 d)$/0$1/;
1221 \layout LyX-Code
1222
1223                 $sec =~ s/^(
1224 \backslash 
1225 d)$/0$1/;
1226 \layout LyX-Code
1227
1228                 $user = "$ENV{USER}";
1229 \layout LyX-Code
1230
1231                 $date = "${year}${mon}${mday}";
1232 \layout LyX-Code
1233
1234                 $time = "${hour}${min}${sec}";
1235 \layout LyX-Code
1236
1237                 # Preparo el registro de alarma
1238 \layout LyX-Code
1239
1240                 $alarmEntry = "$callfields[7];$central;$callfields[0];".
1241 \layout LyX-Code
1242
1243                   "$callfields[1];$regid;$callfields[2];".
1244 \layout LyX-Code
1245
1246                   "$callfields[3];$user;$date;$time";
1247 \layout LyX-Code
1248
1249                 # Grabamos el registro en el archivo de alarmas
1250 \layout LyX-Code
1251
1252                 $alarmlog = "$CONFDATA{datadir}/alarmas/alarmas.txt";
1253 \layout LyX-Code
1254
1255                 open(ALARMFILE,">>$alarmlog")
1256 \layout LyX-Code
1257
1258                   or die 'No se pudo abrir el archivo de alarmas';
1259 \layout LyX-Code
1260
1261                 seek(ALARMFILE,0,2);
1262 \layout LyX-Code
1263
1264                 print ALARMFILE "$alarmEntry
1265 \backslash 
1266 n";
1267 \layout LyX-Code
1268
1269                 close(ALARMFILE);
1270 \layout LyX-Code
1271
1272                 # Logeo por consola y logfile que hubo una alarma
1273 \layout LyX-Code
1274
1275                 logEntry("Alarma: Se ha matcheado el registro procesado"
1276 \layout LyX-Code
1277
1278                   ." con el umbral nro $matchedUmbral",1);
1279 \layout LyX-Code
1280
1281         }
1282 \layout LyX-Code
1283
1284 }
1285 \layout LyX-Code
1286
1287 # --------- MAIN CODE -------- #
1288 \layout LyX-Code
1289
1290 # File locking..
1291 \layout LyX-Code
1292
1293 if (is_lock()) { exit 1; }
1294 \layout LyX-Code
1295
1296 lock();
1297 \layout LyX-Code
1298
1299 # Defino some GLOBALS
1300 \layout LyX-Code
1301
1302 $CONFDIR = "$ENV{'HOME'}/.antifraude";
1303 \layout LyX-Code
1304
1305 $CONFDATA{logdir} = getConfVar("$CONFDIR/conf/antifraude.conf",2);
1306 \layout LyX-Code
1307
1308 $CONFDATA{logfile} = getConfVar("$CONFDIR/conf/antifraude.conf",3);
1309 \layout LyX-Code
1310
1311 $CONFDATA{logsize} = getConfVar("$CONFDIR/conf/antifraude.conf",4);
1312 \layout LyX-Code
1313
1314 $CONFDATA{datadir} = getConfVar("$CONFDIR/conf/antifraude.conf",5);
1315 \layout LyX-Code
1316
1317 # Cargo los UMBRALES en memoria
1318 \layout LyX-Code
1319
1320 open(PARAMFILE,"$CONFDIR/umbrales.param") or die "No se pudo abrir el "
1321 \layout LyX-Code
1322
1323   ."archivo de umbrales";
1324 \layout LyX-Code
1325
1326 @UMBRALES = <PARAMFILE>;
1327 \layout LyX-Code
1328
1329 close(PARAMFILE);
1330 \layout LyX-Code
1331
1332 # Proceso los archivos de llamadas
1333 \layout LyX-Code
1334
1335 @archivos = getCallFiles();
1336 \layout LyX-Code
1337
1338 FILE: foreach $filename (@archivos) {
1339 \layout LyX-Code
1340
1341         $regnum = 0;
1342 \layout LyX-Code
1343
1344         $CALLFILE = "$CONFDATA{datadir}/enproceso/$filename";
1345 \layout LyX-Code
1346
1347         logEntry("Inicio proceso de: $filename",1);
1348 \layout LyX-Code
1349
1350         open(CALLFILE)
1351 \layout LyX-Code
1352
1353           or ((warn "No se pudo abrir archivo $filename"),next FILE);
1354 \layout LyX-Code
1355
1356         REG: foreach $callreg (<CALLFILE>) {
1357 \layout LyX-Code
1358
1359                 logEntry("Procesando Reg: $regnum | Archivo: $filename",1);
1360 \layout LyX-Code
1361
1362                 chomp($callreg);
1363 \layout LyX-Code
1364
1365                 $fieldcount = split(';',$callreg);
1366 \layout LyX-Code
1367
1368                 @fields = @_;
1369 \layout LyX-Code
1370
1371                 # Si no tengo 8 campos exactamente, invalido
1372 \layout LyX-Code
1373
1374                 if ($fieldcount != 8)
1375 \layout LyX-Code
1376
1377                 {
1378 \layout LyX-Code
1379
1380                         badCall($callreg,$regnum);
1381 \layout LyX-Code
1382
1383                         next REG;
1384 \layout LyX-Code
1385
1386                 }
1387 \layout LyX-Code
1388
1389                 # Si la linea no es un numero, invalido
1390 \layout LyX-Code
1391
1392                 $fields[0] =~ s/^
1393 \backslash 
1394 s*(
1395 \backslash 
1396 w*)
1397 \backslash 
1398 s*$/$1/;
1399 \layout LyX-Code
1400
1401                 if (!($fields[0] =~ /^
1402 \backslash 
1403 d+$/))
1404 \layout LyX-Code
1405
1406                 {
1407 \layout LyX-Code
1408
1409                         badCall($callreg,$regnum);
1410 \layout LyX-Code
1411
1412                         next REG;
1413 \layout LyX-Code
1414
1415                 }
1416 \layout LyX-Code
1417
1418                 # Si tipo llamada ! E|S o no se informa Origen
1419 \layout LyX-Code
1420
1421                 # o Destino, invalido
1422 \layout LyX-Code
1423
1424                 if (($fields[4] ne 'E') && ($fields[4] ne 'S')) {
1425 \layout LyX-Code
1426
1427                         badCall($callreg,$regnum); next REG;
1428 \layout LyX-Code
1429
1430                 }
1431 \layout LyX-Code
1432
1433                 if (($fields[4] eq 'E') && ($fields[6] eq "")) {
1434 \layout LyX-Code
1435
1436                         badCall($callreg,$regnum); next REG;
1437 \layout LyX-Code
1438
1439                 }
1440 \layout LyX-Code
1441
1442                 if (($fields[4] eq 'S') && ($fields[5] eq "")) {
1443 \layout LyX-Code
1444
1445                         badCall($callreg,$regnum); next REG;
1446 \layout LyX-Code
1447
1448                 }
1449 \layout LyX-Code
1450
1451                 # Ya pase todas las validaciones, ahora busco si
1452 \layout LyX-Code
1453
1454                 # exite un umbral
1455 \layout LyX-Code
1456
1457                 checkUmbrales(*fields,$filename);
1458 \layout LyX-Code
1459
1460         } continue { ++$regnum }
1461 \layout LyX-Code
1462
1463         close(CALLFILE);
1464 \layout LyX-Code
1465
1466         # La muevo al directorio de procesadas
1467 \layout LyX-Code
1468
1469         rename $CALLFILE,"$CONFDATA{datadir}/procesadas/$filename";
1470 \layout LyX-Code
1471
1472         logEntry("Fin proceso de: $filename",1);
1473 \layout LyX-Code
1474
1475 }
1476 \layout LyX-Code
1477
1478 # Unlocking
1479 \layout LyX-Code
1480
1481 unlock();
1482 \layout Subsection
1483
1484 AFICONF
1485 \layout Subsubsection
1486
1487 Tipo de comando
1488 \layout Standard
1489
1490 Solicitado.
1491 \layout Subsubsection
1492
1493 Archivos de Input
1494 \layout Standard
1495
1496 El comando utiliza los archivos 
1497 \family typewriter 
1498 umbrales.param
1499 \family default 
1500  y 
1501 \family typewriter 
1502 oridesti.txt
1503 \family default 
1504  situados en 
1505 \family typewriter 
1506 ~$HOME/.antifraude/
1507 \layout Subsubsection
1508
1509 Archivos de Output
1510 \layout Standard
1511
1512 Solo escribe en 
1513 \family typewriter 
1514 umbrales.param
1515 \family default 
1516  de ser solicitado por el usuario, ya sea por la alta o baja de un umbral.
1517 \layout Subsubsection
1518
1519 Ejemplos de invocación
1520 \layout Paragraph
1521
1522
1523 \family typewriter 
1524 ./aficonf
1525 \layout Standard
1526
1527 Realiza lo pedido en el enunciado.
1528 \layout Subsubsection
1529
1530 Código Fuente
1531 \layout LyX-Code
1532
1533 #!/bin/sh
1534 \layout LyX-Code
1535
1536 #
1537 \layout LyX-Code
1538
1539 # Configurador
1540 \layout LyX-Code
1541
1542 \layout LyX-Code
1543
1544 # Cargo config
1545 \layout LyX-Code
1546
1547 BASE_DIR="$HOME/.antifraude"
1548 \layout LyX-Code
1549
1550 \layout LyX-Code
1551
1552 # Cargo config
1553 \layout LyX-Code
1554
1555 .
1556  "$BASE_DIR/conf/aficonf.conf"
1557 \layout LyX-Code
1558
1559 \layout LyX-Code
1560
1561 # Cargo utilidades
1562 \layout LyX-Code
1563
1564 .
1565  "$BASE_DIR/util.sh"
1566 \layout LyX-Code
1567
1568 LOGDIR=$AFIC_LOGDIR
1569 \layout LyX-Code
1570
1571 LOGNAME=$AFIC_LOGFILE
1572 \layout LyX-Code
1573
1574 LOGFILE=$LOGDIR/$LOGNAME
1575 \layout LyX-Code
1576
1577 \layout LyX-Code
1578
1579 #Valida que exista el pais
1580 \layout LyX-Code
1581
1582 # Parámetros :
1583 \layout LyX-Code
1584
1585 #   $1 = Descripcion a buscar
1586 \layout LyX-Code
1587
1588 #   $2 = Variable donde guardar el código del Pais
1589 \layout LyX-Code
1590
1591 #        en caso de existir
1592 \layout LyX-Code
1593
1594 existe_pais () {
1595 \layout LyX-Code
1596
1597         EXISTE=`cat "$BASE_DIR/oridesti.txt" 
1598 \backslash 
1599
1600 \layout LyX-Code
1601
1602           | egrep "^[A-Z]*;$1" | cut -d ';' -f 1`;
1603 \layout LyX-Code
1604
1605         if [ "$EXISTE" != "" ] ; then
1606 \layout LyX-Code
1607
1608                 #Exite!, debo gaurdar el código
1609 \layout LyX-Code
1610
1611                 eval "$2=$EXISTE"
1612 \layout LyX-Code
1613
1614                 return 0
1615 \layout LyX-Code
1616
1617         fi
1618 \layout LyX-Code
1619
1620         return 1
1621 \layout LyX-Code
1622
1623 }
1624 \layout LyX-Code
1625
1626 \layout LyX-Code
1627
1628 poner_estado_umbral () {
1629 \layout LyX-Code
1630
1631         ID=$1
1632 \layout LyX-Code
1633
1634         ESTADO=$2
1635 \layout LyX-Code
1636
1637         FECHA=`date +"%Y%m%d"`
1638 \layout LyX-Code
1639
1640         HORA=`date +"%H%M%S"`
1641 \layout LyX-Code
1642
1643         
1644 \layout LyX-Code
1645
1646         if [ "$ESTADO" != "A" ] && [ "$ESTADO" != "I" ]
1647 \layout LyX-Code
1648
1649         then
1650 \layout LyX-Code
1651
1652                 return 1
1653 \layout LyX-Code
1654
1655         fi
1656 \layout LyX-Code
1657
1658         SALIDA=`sed "s/^$ID
1659 \backslash 
1660 (;[^;]*;[^;]*;[^;]*;
1661 \backslash 
1662 )[^;]*
1663 \backslash 
1664 (;"
1665 \backslash 
1666
1667 \layout LyX-Code
1668
1669 "[^;]*;[^;]*;[^;]*
1670 \backslash 
1671 )$/$ID
1672 \backslash 
1673 1I;$USER;$FECHA;$HORA/" 
1674 \backslash 
1675
1676 \layout LyX-Code
1677
1678           "$BASE_DIR/umbrales.param"`
1679 \layout LyX-Code
1680
1681         echo "$SALIDA" > "$BASE_DIR/umbrales.param"
1682 \layout LyX-Code
1683
1684         put_log "$LOGFILE" "aficonf" 
1685 \backslash 
1686
1687 \layout LyX-Code
1688
1689           "Se ha cambiado el estado de umbral $ID a $ESTADO" 
1690 \backslash 
1691
1692 \layout LyX-Code
1693
1694           "$AFIC_LOGSIZE"
1695 \layout LyX-Code
1696
1697 }
1698 \layout LyX-Code
1699
1700 \layout LyX-Code
1701
1702 menu () {
1703 \layout LyX-Code
1704
1705         echo "AFICONF"
1706 \layout LyX-Code
1707
1708         echo "======="
1709 \layout LyX-Code
1710
1711         echo
1712 \layout LyX-Code
1713
1714         echo "  1) Alta"
1715 \layout LyX-Code
1716
1717         echo "  2) Buscar"
1718 \layout LyX-Code
1719
1720         echo "  3) Salir"
1721 \layout LyX-Code
1722
1723         preguntar "Su opción" "123" $1
1724 \layout LyX-Code
1725
1726 }
1727 \layout LyX-Code
1728
1729 \layout LyX-Code
1730
1731 existe_umbral () {
1732 \layout LyX-Code
1733
1734         EXISTE=`cat "$BASE_DIR/umbrales.param" | egrep "$1"`;
1735 \layout LyX-Code
1736
1737         if [ "$EXISTE" == "" ] ; then
1738 \layout LyX-Code
1739
1740                 #No existe
1741 \layout LyX-Code
1742
1743                 return 1
1744 \layout LyX-Code
1745
1746         fi
1747 \layout LyX-Code
1748
1749         #Ya existe un umbral!
1750 \layout LyX-Code
1751
1752         return 0
1753 \layout LyX-Code
1754
1755 }
1756 \layout LyX-Code
1757
1758         
1759 \layout LyX-Code
1760
1761 buscar_id_umbral () {
1762 \layout LyX-Code
1763
1764         ID=`cat "$BASE_DIR/umbrales.id"`;
1765 \layout LyX-Code
1766
1767         eval "$1=$ID"
1768 \layout LyX-Code
1769
1770         let ID=$ID+1
1771 \layout LyX-Code
1772
1773         echo "$ID" > "$BASE_DIR/umbrales.id"
1774 \layout LyX-Code
1775
1776 }
1777 \layout LyX-Code
1778
1779 case_altas () {
1780 \layout LyX-Code
1781
1782         DONE=0
1783 \layout LyX-Code
1784
1785         while [ $DONE == 0 ] ; do
1786 \layout LyX-Code
1787
1788                 leer "Número de línea" "" LINEA
1789 \layout LyX-Code
1790
1791                 #TODO Valido
1792 \layout LyX-Code
1793
1794                 if ! validar_solo_numeros "$LINEA" ; then
1795 \layout LyX-Code
1796
1797                         echo "EL NUMERO TE LINEA SOLO DEBE" 
1798 \backslash 
1799
1800 \layout LyX-Code
1801
1802                         "TENER DIGITOS"
1803 \layout LyX-Code
1804
1805                 else
1806 \layout LyX-Code
1807
1808                         DONE=1
1809 \layout LyX-Code
1810
1811                 fi
1812 \layout LyX-Code
1813
1814                 if [ "$LINEA" == "" ] ; then
1815 \layout LyX-Code
1816
1817                         DONE=0
1818 \layout LyX-Code
1819
1820                 fi
1821 \layout LyX-Code
1822
1823         done
1824 \layout LyX-Code
1825
1826         preguntar "Tipo de llamada" "ES" TIPO
1827 \layout LyX-Code
1828
1829         DONE=0
1830 \layout LyX-Code
1831
1832         CODIGO=''
1833 \layout LyX-Code
1834
1835         while [ $DONE == 0 ] ; do
1836 \layout LyX-Code
1837
1838                 leer "Pais (descripción)" "" PAIS 
1839 \layout LyX-Code
1840
1841                 if ! existe_pais "$PAIS" CODIGO ; then
1842 \layout LyX-Code
1843
1844                         echo "No existe el país de descrición '$PAIS'"
1845 \layout LyX-Code
1846
1847                 else
1848 \layout LyX-Code
1849
1850                         DONE=1
1851 \layout LyX-Code
1852
1853                 fi
1854 \layout LyX-Code
1855
1856                 if [ "$PAIS" == "" ] ; then
1857 \layout LyX-Code
1858
1859                         DONE=0
1860 \layout LyX-Code
1861
1862                 fi
1863 \layout LyX-Code
1864
1865         done
1866 \layout LyX-Code
1867
1868         echo "El código de '$PAIS' es '$CODIGO'"
1869 \layout LyX-Code
1870
1871         PAIS=$CODIGO
1872 \layout LyX-Code
1873
1874         # Verifico que el umbral no exista
1875 \layout LyX-Code
1876
1877         FECHA=`date +"%Y%m%d"`
1878 \layout LyX-Code
1879
1880         HORA=`date +"%H%M%S"`
1881 \layout LyX-Code
1882
1883         UMBRAL="$LINEA;$PAIS;$TIPO;A;*;*;*"
1884 \layout LyX-Code
1885
1886         if existe_umbral "$UMBRAL" ; then
1887 \layout LyX-Code
1888
1889                 echo "Ya existe un umbral con los datos ingresados."
1890 \layout LyX-Code
1891
1892                 echo "Abortando..."
1893 \layout LyX-Code
1894
1895                 put_log "$LOGFILE" "aficonf" 
1896 \backslash 
1897
1898 \layout LyX-Code
1899
1900                   "Se trató de insertar un umbral repetido ($UMBRAL)" 
1901 \backslash 
1902
1903 \layout LyX-Code
1904
1905                   "$AFIC_LOGSIZE"
1906 \layout LyX-Code
1907
1908                 return
1909 \layout LyX-Code
1910
1911         fi
1912 \layout LyX-Code
1913
1914         
1915 \layout LyX-Code
1916
1917         # Genero el umbral
1918 \layout LyX-Code
1919
1920         buscar_id_umbral ID
1921 \layout LyX-Code
1922
1923         UMBRAL="$ID;$LINEA;$PAIS;$TIPO;A;$USER;$FECHA;$HORA"
1924 \layout LyX-Code
1925
1926         # Lo guardo
1927 \layout LyX-Code
1928
1929         echo "$UMBRAL" >> "$BASE_DIR/umbrales.param"
1930 \layout LyX-Code
1931
1932         echo ""
1933 \layout LyX-Code
1934
1935         echo "El Umbral fue grabado con éxito"
1936 \layout LyX-Code
1937
1938         echo ""
1939 \layout LyX-Code
1940
1941         put_log "$LOGFILE" 
1942 \backslash 
1943
1944 \layout LyX-Code
1945
1946           "aficonf" "Se inserto un nuevo umbral ($UMBRAL)" 
1947 \backslash 
1948
1949 \layout LyX-Code
1950
1951           "$AFIC_LOGSIZE"
1952 \layout LyX-Code
1953
1954 }
1955 \layout LyX-Code
1956
1957 case_buscar () {
1958 \layout LyX-Code
1959
1960         DONE=0
1961 \layout LyX-Code
1962
1963         while [ $DONE == 0 ] ; do
1964 \layout LyX-Code
1965
1966                 leer "Número de línea" "" LINEA
1967 \layout LyX-Code
1968
1969                 #TODO Valido
1970 \layout LyX-Code
1971
1972                 if ! validar_solo_numeros "$LINEA" ; then
1973 \layout LyX-Code
1974
1975                         echo "EL NUMERO TE LINEA SOLO DEBE" 
1976 \backslash 
1977
1978 \layout LyX-Code
1979
1980                           "TENER DIGITOS"
1981 \layout LyX-Code
1982
1983                 else
1984 \layout LyX-Code
1985
1986                         DONE=1
1987 \layout LyX-Code
1988
1989                 fi
1990 \layout LyX-Code
1991
1992                 if [ "$LINEA" == "" ] ; then
1993 \layout LyX-Code
1994
1995                         DONE=0
1996 \layout LyX-Code
1997
1998                 fi
1999 \layout LyX-Code
2000
2001         done
2002 \layout LyX-Code
2003
2004         DATOS=`cat "$BASE_DIR/umbrales.param" 
2005 \backslash 
2006
2007 \layout LyX-Code
2008
2009           | grep "[0-9]*;$LINEA;[A-Z]*;[E,S];A"`
2010 \layout LyX-Code
2011
2012         if [ "$DATOS" == "" ] ; then
2013 \layout LyX-Code
2014
2015                 echo ""
2016 \layout LyX-Code
2017
2018                 echo "No se han encontrado Umbrales activos" 
2019 \backslash 
2020
2021 \layout LyX-Code
2022
2023                   "para la linea $LINEA."
2024 \layout LyX-Code
2025
2026                 echo "Abortando ..."
2027 \layout LyX-Code
2028
2029                 echo ""
2030 \layout LyX-Code
2031
2032                 put_log "$LOGFILE" "aficonf" 
2033 \backslash 
2034
2035 \layout LyX-Code
2036
2037                   "No se han encontrado umbrales para la línea $LINEA" 
2038 \backslash 
2039
2040 \layout LyX-Code
2041
2042                   "$AFIC_LOGSIZE"
2043 \layout LyX-Code
2044
2045                 return 0
2046 \layout LyX-Code
2047
2048         fi
2049 \layout LyX-Code
2050
2051         printf "%3s      %2s  %1s   %1s    %10s%8s       %6s
2052 \backslash 
2053 n" 
2054 \backslash 
2055
2056 \layout LyX-Code
2057
2058           "ID" "Ciudad" "Tipo" "Estado" "Usuario" "Fecha" "Hora"
2059 \layout LyX-Code
2060
2061         OPCIONES="-1"
2062 \layout LyX-Code
2063
2064         for i in $DATOS ; do
2065 \layout LyX-Code
2066
2067                 ID=`echo "$i" | cut -d ';' -f 1`
2068 \layout LyX-Code
2069
2070                 CIUDAD=`echo "$i" | cut -d ';' -f 3`
2071 \layout LyX-Code
2072
2073                 TIPO=`echo "$i" | cut -d ';' -f 4`
2074 \layout LyX-Code
2075
2076                 ESTADO=`echo "$i" | cut -d ';' -f 5`
2077 \layout LyX-Code
2078
2079                 USUARIO=`echo "$i" | cut -d ';' -f 6`
2080 \layout LyX-Code
2081
2082                 FECHA=`echo "$i" | cut -d ';' -f 7`
2083 \layout LyX-Code
2084
2085                 HORA=`echo "$i" | cut -d ';' -f 8`
2086 \layout LyX-Code
2087
2088                 printf 
2089 \backslash 
2090
2091 \layout LyX-Code
2092
2093 "%3s      %2s      %1s      %1s      %10s      %8s      %6s
2094 \backslash 
2095 n" 
2096 \backslash 
2097
2098 \layout LyX-Code
2099
2100                   "$ID" "$CIUDAD" "$TIPO" "$ESTADO" "$USUARIO" 
2101 \backslash 
2102
2103 \layout LyX-Code
2104
2105                   "$FECHA" "$HORA"
2106 \layout LyX-Code
2107
2108                 OPCIONES="$OPCIONES $ID"
2109 \layout LyX-Code
2110
2111         done
2112 \layout LyX-Code
2113
2114         preguntar "Cual desea borrar (-1 para salir)" "$OPCIONES" OPT
2115 \layout LyX-Code
2116
2117         if [ "$OPT" = "-1" ] ; then
2118 \layout LyX-Code
2119
2120                 return 0
2121 \layout LyX-Code
2122
2123         fi
2124 \layout LyX-Code
2125
2126         echo "Borrando el registro $OPT ..."
2127 \layout LyX-Code
2128
2129         poner_estado_umbral "$OPT" "I"
2130 \layout LyX-Code
2131
2132         put_log "$LOGFILE" "aficonf" 
2133 \backslash 
2134
2135 \layout LyX-Code
2136
2137           "No se ha eliminado elumbral de ID $OPT" "$AFIC_LOGSIZE"
2138 \layout LyX-Code
2139
2140         echo ""
2141 \layout LyX-Code
2142
2143         echo ""
2144 \layout LyX-Code
2145
2146         echo "El Umbral fue eliminado con éxito"
2147 \layout LyX-Code
2148
2149         echo ""
2150 \layout LyX-Code
2151
2152 }
2153 \layout LyX-Code
2154
2155 \layout LyX-Code
2156
2157 # No permito correr 2 instancias de AFICONF
2158 \layout LyX-Code
2159
2160 if is_lock "aficonf" ; then
2161 \layout LyX-Code
2162
2163         echo ""
2164 \layout LyX-Code
2165
2166         echo "Aficonf está corriendo actualmente."
2167 \layout LyX-Code
2168
2169         echo ""
2170 \layout LyX-Code
2171
2172         put_log "$LOGFILE" "aficonf" 
2173 \backslash 
2174
2175 \layout LyX-Code
2176
2177           "Se ha intentado ejecutar aficonf cuando este estaba corriendo"
2178  
2179 \backslash 
2180
2181 \layout LyX-Code
2182
2183           "$AFIC_LOGSIZE"
2184 \layout LyX-Code
2185
2186         exit 1
2187 \layout LyX-Code
2188
2189 fi
2190 \layout LyX-Code
2191
2192 lock "aficonf"
2193 \layout LyX-Code
2194
2195 # Loop Principal
2196 \layout LyX-Code
2197
2198 OPT="0"
2199 \layout LyX-Code
2200
2201 while [ "$OPT" != "3" ] ; do 
2202 \layout LyX-Code
2203
2204         menu OPT
2205 \layout LyX-Code
2206
2207         case $OPT in
2208 \layout LyX-Code
2209
2210                 "1") case_altas ;;
2211 \layout LyX-Code
2212
2213                 "2") case_buscar ;;
2214 \layout LyX-Code
2215
2216         esac
2217 \layout LyX-Code
2218
2219 done
2220 \layout LyX-Code
2221
2222 unlock "aficonf"
2223 \layout Subsection
2224
2225 UTIL
2226 \layout Subsubsection
2227
2228 Tipo de comando
2229 \layout Standard
2230
2231 Auxiliar, escrito en bash.
2232 \layout Standard
2233
2234 Sería equivalente a una biblioteca compartida, no es exactamente un comando
2235  que se pueda ejecutar directamente sino que se incluye desde otros comandos.
2236 \layout Subsubsection
2237
2238 Justificación de su uso
2239 \layout Standard
2240
2241 Es un archivo con varias funciones generales, sirve para no duplicar código
2242  común entre los varios scripts de bash.
2243 \layout Subsubsection
2244
2245 Archivos de Input
2246 \layout Standard
2247
2248 Al ser de propósito general, no tiene ningún archivo de input específico,
2249  aunque hay funciones que utilizan archivos, no se describen aquí sino en
2250  los comandos que usan este archivo.
2251 \layout Subsubsection
2252
2253 Archivos de Output
2254 \layout Standard
2255
2256 Ídem anterior.
2257 \layout Subsubsection
2258
2259 Parámetros
2260 \layout Standard
2261
2262 Al no ser un comando ejecutable, no aplica.
2263 \layout Subsubsection
2264
2265 Opciones
2266 \layout Standard
2267
2268 Ídem anterior.
2269 \layout Subsubsection
2270
2271 Ejemplos de invocación
2272 \layout Standard
2273
2274 Ídem anterior.
2275 \layout Subsubsection
2276
2277 Código fuente
2278 \layout LyX-Code
2279
2280 #/bin/bash
2281 \layout LyX-Code
2282
2283 #
2284 \layout LyX-Code
2285
2286 # Los scrips que incluyan deben definir BASE_DIR
2287 \layout LyX-Code
2288
2289 # antes de incluirme!
2290 \layout LyX-Code
2291
2292 \layout LyX-Code
2293
2294 LOCK_DIR="$BASE_DIR/lock"
2295 \layout LyX-Code
2296
2297 # Lee del teclado un valor
2298 \layout LyX-Code
2299
2300 #
2301 \layout LyX-Code
2302
2303 # parámetros :
2304 \layout LyX-Code
2305
2306 #  $1 = Leyeda a mostrar de pregunta
2307 \layout LyX-Code
2308
2309 #  $2 = Valor default por si el usuario no ingresa nada
2310 \layout LyX-Code
2311
2312 #  $3 = Variable donde guardar el valor ingresado (o el default)
2313 \layout LyX-Code
2314
2315 #
2316 \layout LyX-Code
2317
2318 leer () {
2319 \layout LyX-Code
2320
2321         MSG=$1
2322 \layout LyX-Code
2323
2324         DEFAULT=$2
2325 \layout LyX-Code
2326
2327         read -p "$MSG [$DEFAULT] : " ALGO 
2328 \layout LyX-Code
2329
2330         # Si el usuario no ingresa nada
2331 \layout LyX-Code
2332
2333         # nos quedamos con el valor default
2334 \layout LyX-Code
2335
2336         if [ ! -z "$ALGO" ] ; then
2337 \layout LyX-Code
2338
2339                 eval "$3=$ALGO"
2340 \layout LyX-Code
2341
2342         else
2343 \layout LyX-Code
2344
2345                 eval "$3=$DEFAULT"
2346 \layout LyX-Code
2347
2348         fi
2349 \layout LyX-Code
2350
2351 }
2352 \layout LyX-Code
2353
2354 \layout LyX-Code
2355
2356 # Realiza una pregunta al usuario
2357 \layout LyX-Code
2358
2359 #
2360 \layout LyX-Code
2361
2362 # parámetros :
2363 \layout LyX-Code
2364
2365 #  $1 = Leyeda a mostrar de preguntar
2366 \layout LyX-Code
2367
2368 #  $2 = string con las opciones validas
2369 \layout LyX-Code
2370
2371 #  $3 = Variable donde guardar el valor ingresado
2372 \layout LyX-Code
2373
2374 #  $4 = Valor por defecto si se apreta ENTER
2375 \layout LyX-Code
2376
2377 #
2378 \layout LyX-Code
2379
2380 preguntar () {
2381 \layout LyX-Code
2382
2383         PREGUNTA="$1"
2384 \layout LyX-Code
2385
2386         OPCIONES="$2"
2387 \layout LyX-Code
2388
2389         DEFAULT="$4"
2390 \layout LyX-Code
2391
2392         while true; do
2393 \layout LyX-Code
2394
2395                 read -p "$PREGUNTA [$OPCIONES]: " RTA
2396 \layout LyX-Code
2397
2398                 # Si me pasaron un default y la respuesta es vacía
2399 \layout LyX-Code
2400
2401                 if [ -n "$DEFAULT" -a -z "$RTA" ]; then
2402 \layout LyX-Code
2403
2404                         # devuelvo default
2405 \layout LyX-Code
2406
2407                         RTA="$DEFAULT"
2408 \layout LyX-Code
2409
2410                         return 0
2411 \layout LyX-Code
2412
2413                 fi
2414 \layout LyX-Code
2415
2416                 # Escapeo el caracter '-' por '
2417 \backslash 
2418 -'
2419 \layout LyX-Code
2420
2421                 RTA=$(echo $RTA | sed "s/
2422 \backslash 
2423 -/
2424 \backslash 
2425
2426 \backslash 
2427
2428 \backslash 
2429 -/")
2430 \layout LyX-Code
2431
2432                 IS_OK=`echo "$OPCIONES" | grep "$RTA"`
2433 \layout LyX-Code
2434
2435                 if [ ! -z "$IS_OK" ] && [ ! -z "$RTA" ] ; then
2436 \layout LyX-Code
2437
2438                         eval "$3=$RTA"
2439 \layout LyX-Code
2440
2441                         return 0
2442 \layout LyX-Code
2443
2444                 fi
2445 \layout LyX-Code
2446
2447         done
2448 \layout LyX-Code
2449
2450 }
2451 \layout LyX-Code
2452
2453 \layout LyX-Code
2454
2455 validar_solo_numeros () {
2456 \layout LyX-Code
2457
2458         TEST=`echo "$1" | sed "s/[0-9]*//g"`
2459 \layout LyX-Code
2460
2461         if [ "$TEST" == "" ] ; then
2462 \layout LyX-Code
2463
2464                 #Ok, son solo numeros
2465 \layout LyX-Code
2466
2467                 return 0
2468 \layout LyX-Code
2469
2470         fi
2471 \layout LyX-Code
2472
2473         # ups, hay algo que no es un numero
2474 \layout LyX-Code
2475
2476         return 1
2477 \layout LyX-Code
2478
2479 }
2480 \layout LyX-Code
2481
2482 \layout LyX-Code
2483
2484 # Crea un archivo de lock para un script
2485 \layout LyX-Code
2486
2487 # Devuelve: 0 si ok, 1 si ya esta lockeado, 2 si no pudo crear lock.
2488 \layout LyX-Code
2489
2490 # Uso: lock programa
2491 \layout LyX-Code
2492
2493 lock () {
2494 \layout LyX-Code
2495
2496         # si ya esta loqueado, no lo vuelvo a crear
2497 \layout LyX-Code
2498
2499         is_lock "$1" && return 1
2500 \layout LyX-Code
2501
2502         # Si no puedo escribir en el dir de lock, da error
2503 \layout LyX-Code
2504
2505         [ -w "$LOCK_DIR" ] || return 2
2506 \layout LyX-Code
2507
2508         echo $$ > "$LOCK_DIR/$1.pid"
2509 \layout LyX-Code
2510
2511         return 0
2512 \layout LyX-Code
2513
2514 }
2515 \layout LyX-Code
2516
2517 \layout LyX-Code
2518
2519 # Desbloquea el script
2520 \layout LyX-Code
2521
2522 # Uso: unlock programa
2523 \layout LyX-Code
2524
2525 unlock () {
2526 \layout LyX-Code
2527
2528         rm -rf "$LOCK_DIR/$1.pid"
2529 \layout LyX-Code
2530
2531 }
2532 \layout LyX-Code
2533
2534                         
2535 \layout LyX-Code
2536
2537 # Consulta si un script esta lockeado
2538 \layout LyX-Code
2539
2540 # Uso: is_lock programa
2541 \layout LyX-Code
2542
2543 is_lock () {
2544 \layout LyX-Code
2545
2546         if [ -e "$LOCK_DIR/$1.pid" ] ; then
2547 \layout LyX-Code
2548
2549                 # Lock file encontrado!
2550 \layout LyX-Code
2551
2552                 return 0
2553 \layout LyX-Code
2554
2555         fi
2556 \layout LyX-Code
2557
2558         # No hay lock file!
2559 \layout LyX-Code
2560
2561         return 1
2562 \layout LyX-Code
2563
2564 }
2565 \layout LyX-Code
2566
2567 \layout LyX-Code
2568
2569 # Obtiene el pid de un programa lockeado
2570 \layout LyX-Code
2571
2572 # Uso: lock_pid programa
2573 \layout LyX-Code
2574
2575 lock_pid()
2576 \layout LyX-Code
2577
2578 {
2579 \layout LyX-Code
2580
2581         is_lock "$1" && cat "$LOCK_DIR/$1.pid"
2582 \layout LyX-Code
2583
2584 }
2585 \layout LyX-Code
2586
2587 \layout LyX-Code
2588
2589 # Verifica que un valor este entre otros 2
2590 \layout LyX-Code
2591
2592 # $1 pertecezca a [$2,$3]
2593 \layout LyX-Code
2594
2595 # $1 Numero a validar
2596 \layout LyX-Code
2597
2598 # $2 Cota inferior 
2599 \layout LyX-Code
2600
2601 # $3 Cota superior
2602 \layout LyX-Code
2603
2604 validar_rango(){
2605 \layout LyX-Code
2606
2607         if [ "$1" -ge "$2" ] && [ "$1" -le "$3" ]; then
2608 \layout LyX-Code
2609
2610                 return 0
2611 \layout LyX-Code
2612
2613         else 
2614 \layout LyX-Code
2615
2616                 return 1
2617 \layout LyX-Code
2618
2619         fi
2620 \layout LyX-Code
2621
2622 }
2623 \layout LyX-Code
2624
2625 \layout LyX-Code
2626
2627 # Muestra mensaje y sale con código de error
2628 \layout LyX-Code
2629
2630 # Uso: die mensaje [código de error = 1]
2631 \layout LyX-Code
2632
2633 die()
2634 \layout LyX-Code
2635
2636 {
2637 \layout LyX-Code
2638
2639         echo "$1" >&2
2640 \layout LyX-Code
2641
2642         exit ${2:-1}
2643 \layout LyX-Code
2644
2645 }
2646 \layout LyX-Code
2647
2648 \layout LyX-Code
2649
2650 # Imprime mensaje por salida de error
2651 \layout LyX-Code
2652
2653 # Uso: perr mensajes
2654 \layout LyX-Code
2655
2656 perr()
2657 \layout LyX-Code
2658
2659 {
2660 \layout LyX-Code
2661
2662         echo $@ >&2
2663 \layout LyX-Code
2664
2665 }
2666 \layout LyX-Code
2667
2668 \layout LyX-Code
2669
2670 # Pone un MSG en el log
2671 \layout LyX-Code
2672
2673 # Parametros :
2674 \layout LyX-Code
2675
2676 #  $1 = Archivo del log
2677 \layout LyX-Code
2678
2679 #  $2 = Comando
2680 \layout LyX-Code
2681
2682 #  $3 = Mensaje
2683 \layout LyX-Code
2684
2685 #  $4 = Tamaño maximo
2686 \layout LyX-Code
2687
2688 put_log() {
2689 \layout LyX-Code
2690
2691         fecha=$(date +%d/%m/%Y-%H:%M)
2692 \layout LyX-Code
2693
2694         echo "$fecha $USER $2:
2695 \backslash 
2696 "$3
2697 \backslash 
2698 "" >> $1
2699 \layout LyX-Code
2700
2701         clean_log "$1" "$4"
2702 \layout LyX-Code
2703
2704 }
2705 \layout LyX-Code
2706
2707 \layout LyX-Code
2708
2709 # Trunca un archivo de log si pasa el tamaño máximo.
2710 \layout LyX-Code
2711
2712 # Uso: clean_log log_filename max_log_size_bytes
2713 \layout LyX-Code
2714
2715 clean_log()
2716 \layout LyX-Code
2717
2718 {
2719 \layout LyX-Code
2720
2721         LOGFILE="$1"
2722 \layout LyX-Code
2723
2724         LOGSIZE="$2"
2725 \layout LyX-Code
2726
2727         # Archivo temporal
2728 \layout LyX-Code
2729
2730         tmp=`dirname "$LOGFILE"`"/`basename $0`.$$.temp"
2731 \layout LyX-Code
2732
2733         # Verifico que el logfile no se pase del tamaño maximo
2734 \layout LyX-Code
2735
2736         tam=`stat -c '%s' "$LOGFILE"`
2737 \layout LyX-Code
2738
2739         # Si se paso del maximo dejo las ultimas 100 lineas
2740 \layout LyX-Code
2741
2742         if [ "$tam" -ge "$LOGSIZE" ]; then
2743 \layout LyX-Code
2744
2745                 tail -n 100 "$LOGFILE" > "$tmp"
2746 \layout LyX-Code
2747
2748                 mv "$tmp" "$LOGFILE"
2749 \layout LyX-Code
2750
2751         fi
2752 \layout LyX-Code
2753
2754 }
2755 \layout Subsection
2756
2757 CALLGEN
2758 \layout Subsubsection
2759
2760 Tipo de comando
2761 \layout Standard
2762
2763 Auxiliar, escrito en 
2764 \family typewriter 
2765 perl
2766 \family default 
2767 .
2768 \layout Subsubsection
2769
2770 Justificación de su uso
2771 \layout Standard
2772
2773 Sirve para realizar lotes de prueba con gran cantidad de entradas y variaciones
2774  de forma rápida y cómoda.
2775 \layout Subsubsection
2776
2777 Archivos de Input
2778 \layout Standard
2779
2780 Ninguno, toma los datos necesarios por la entrada estándar, aunque es común
2781  redireccionarle el archivo 
2782 \family typewriter 
2783 oridesti.txt
2784 \family default 
2785 .
2786  De la entrada estándar toma los códigos de origen y destino.
2787  Cada código debe encontrarse en una línea y al comienzo de ésta.
2788  Sólo toma los 2 primeros caracteres, e ignora el resto de la línea (para
2789  compatibilidad con el archivo oridesti.txt).
2790 \layout Subsubsection
2791
2792 Archivos de Output
2793 \layout Standard
2794
2795 Crea una cantidad 
2796 \family typewriter 
2797 N
2798 \family default 
2799  (especificada por el usuario) de archivos con nombre y formato de 
2800 \emph on 
2801 Archivo de Llamadas
2802 \emph default 
2803  en el directorio actual.
2804  Tanto el nombre como la cantidad de líneas y su contenido es generado aleatoria
2805 mente (respetando el formato mencionado y con valores racionales).
2806 \layout Subsubsection
2807
2808 Parámetros
2809 \layout Standard
2810
2811 El comando toma 3 parámetros 
2812 \series bold 
2813 opcionales
2814 \series default 
2815 :
2816 \layout LyX-Code
2817
2818 ./callgen [cant_archivos [min_lineas [max_lineas]]]
2819 \layout Standard
2820
2821
2822 \begin_inset  Tabular
2823 <lyxtabular version="3" rows="4" columns="3">
2824 <features>
2825 <column alignment="center" valignment="top" leftline="true" width="0">
2826 <column alignment="center" valignment="top" leftline="true" width="0">
2827 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
2828 <row topline="true" bottomline="true">
2829 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2830 \begin_inset Text
2831
2832 \layout Standard
2833
2834
2835 \series bold 
2836 Parámetro
2837 \end_inset 
2838 </cell>
2839 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2840 \begin_inset Text
2841
2842 \layout Standard
2843
2844
2845 \series bold 
2846 Descripción
2847 \end_inset 
2848 </cell>
2849 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2850 \begin_inset Text
2851
2852 \layout Standard
2853
2854
2855 \series bold 
2856 Default
2857 \end_inset 
2858 </cell>
2859 </row>
2860 <row topline="true">
2861 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2862 \begin_inset Text
2863
2864 \layout Standard
2865
2866 cant_archivos
2867 \end_inset 
2868 </cell>
2869 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2870 \begin_inset Text
2871
2872 \layout Standard
2873
2874 Cantidad de archivos a generar
2875 \end_inset 
2876 </cell>
2877 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2878 \begin_inset Text
2879
2880 \layout Standard
2881
2882 10
2883 \end_inset 
2884 </cell>
2885 </row>
2886 <row topline="true">
2887 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2888 \begin_inset Text
2889
2890 \layout Standard
2891
2892 min_lineas
2893 \end_inset 
2894 </cell>
2895 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2896 \begin_inset Text
2897
2898 \layout Standard
2899
2900 Mínima cantidad de lineas en un archivo
2901 \end_inset 
2902 </cell>
2903 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2904 \begin_inset Text
2905
2906 \layout Standard
2907
2908 1000
2909 \end_inset 
2910 </cell>
2911 </row>
2912 <row topline="true" bottomline="true">
2913 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2914 \begin_inset Text
2915
2916 \layout Standard
2917
2918 max_linaes
2919 \end_inset 
2920 </cell>
2921 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2922 \begin_inset Text
2923
2924 \layout Standard
2925
2926 Máxima cantidad de lineas en un archivo
2927 \end_inset 
2928 </cell>
2929 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2930 \begin_inset Text
2931
2932 \layout Standard
2933
2934 5000
2935 \end_inset 
2936 </cell>
2937 </row>
2938 </lyxtabular>
2939
2940 \end_inset 
2941
2942
2943 \layout Subsubsection
2944
2945 Opciones
2946 \layout Standard
2947
2948 Pueden cambiarse los valores por defecto editando el código fuente del comando,
2949  en la sección de configuración que se encuentra al comienzo del mismo.
2950  También puede cambiarse el mínimo y máximo año (por defecto 1999 y 2004)
2951  y el mínimo y máximo código de central (por defecto 0000 y 9999).
2952 \layout Subsubsection
2953
2954 Ejemplos de invocación
2955 \layout Paragraph
2956
2957
2958 \family typewriter 
2959 ./callgen
2960 \layout Paragraph
2961
2962
2963 \series medium 
2964 Se escriben por entrada estándar los códigos de origen/destino, se presiona
2965  
2966 \family typewriter 
2967 \series default 
2968 Ctrl-D
2969 \family default 
2970 \series medium 
2971  para cerrar el descriptor de archivo de la entrada estándar y se generan
2972  10 archivos con entre 1000 y 5000 líneas cada uno.
2973 \layout Paragraph
2974
2975
2976 \family typewriter 
2977 ./callgen 2 < oridesti.txt
2978 \layout Paragraph
2979
2980
2981 \series medium 
2982 Genera 2 archivos con entre 1000 y 5000 líneas cada uno tomando los códigos
2983  de origen/destino del archivo 
2984 \family typewriter 
2985 origesti.txt
2986 \family default 
2987 .
2988 \layout Paragraph
2989
2990
2991 \family typewriter 
2992 ./callgen 5 10 < oridesti.txt
2993 \layout Paragraph
2994
2995
2996 \series medium 
2997 Genera 5 archivos con entre 10 y 5000 líneas cada uno tomando los códigos
2998  de origen/destino del archivo 
2999 \family typewriter 
3000 origesti.txt
3001 \family default 
3002 .
3003 \layout Paragraph
3004
3005
3006 \family typewriter 
3007 ./callgen 50 10 50 < oridesti.txt
3008 \layout Paragraph
3009
3010
3011 \series medium 
3012 Genera 50 archivos con entre 10 y 50 líneas cada uno tomando los códigos
3013  de origen/destino del archivo 
3014 \family typewriter 
3015 origesti.txt
3016 \family default 
3017 .
3018 \layout Subsubsection
3019
3020 Código Fuente
3021 \layout LyX-Code
3022
3023 #!/usr/bin/perl -w
3024 \layout LyX-Code
3025
3026 #
3027 \layout LyX-Code
3028
3029 # Generador aleatorio de archivos de llamadas
3030 \layout LyX-Code
3031
3032 #
3033 \layout LyX-Code
3034
3035 # Leandro Lucarella - dom oct 17 18:37:05 ART 2004
3036 \layout LyX-Code
3037
3038 #
3039 \layout LyX-Code
3040
3041 # Bajo licencia GPL.
3042 \layout LyX-Code
3043
3044 #
3045 \layout LyX-Code
3046
3047 # Uso:
3048 \layout LyX-Code
3049
3050 #      ./callgen [cant_archivos [min_lineas [max_lineas]]]
3051 \layout LyX-Code
3052
3053 #
3054 \layout LyX-Code
3055
3056 # cant_archivos Cantidad de archivos a generar.
3057 \layout LyX-Code
3058
3059 # min_lines     Mínima cantidad de líneas que puede tener un archivo.
3060 \layout LyX-Code
3061
3062 # max_lines     Máxima cantidad de líneas que puede tener un archivo.
3063 \layout LyX-Code
3064
3065 #
3066 \layout LyX-Code
3067
3068 # Por la entrada estándar debe recibir los códigos de países para
3069 \layout LyX-Code
3070
3071 # origen y/o destino.
3072  Toma los dos primeros caracteres por línea como
3073 \layout LyX-Code
3074
3075 # un código, ignorando el resto, de manera que se puede hacer:
3076 \layout LyX-Code
3077
3078 #       cat oridesti.txt | ./gencall
3079 \layout LyX-Code
3080
3081 # Configuración
3082 \layout LyX-Code
3083
3084 $CANT_ARCHS = 10;
3085 \layout LyX-Code
3086
3087 $MIN_LINEAS = 1000;
3088 \layout LyX-Code
3089
3090 $MAX_LINEAS = 5000;
3091 \layout LyX-Code
3092
3093 $MIN_ANIO   = "1999";
3094 \layout LyX-Code
3095
3096 $MAX_ANIO   = "2004";
3097 \layout LyX-Code
3098
3099 $MIN_COD    = "0000";
3100 \layout LyX-Code
3101
3102 $MAX_COD    = "9999";
3103 \layout LyX-Code
3104
3105 \layout LyX-Code
3106
3107 #{{{ Variables globales
3108 \layout LyX-Code
3109
3110 our @codes; # Códigos de origen/destino
3111 \layout LyX-Code
3112
3113 #}}}
3114 \layout LyX-Code
3115
3116 \layout LyX-Code
3117
3118 #{{{ Funciones
3119 \layout LyX-Code
3120
3121 \layout LyX-Code
3122
3123 #{{{ load_codes() - Obtiene códigos de origen/destino de la entrada
3124 \layout LyX-Code
3125
3126 #                   estándar
3127 \layout LyX-Code
3128
3129 # Uso: load_codes()
3130 \layout LyX-Code
3131
3132 sub load_codes()
3133 \layout LyX-Code
3134
3135 {
3136 \layout LyX-Code
3137
3138         push(@codes, substr($_, 0, 2)) while (<STDIN>);
3139 \layout LyX-Code
3140
3141 }
3142 \layout LyX-Code
3143
3144 #}}}
3145 \layout LyX-Code
3146
3147 \layout LyX-Code
3148
3149 #{{{ get_rnd_code() - Obtiene un códigos de origen/destino al azar
3150 \layout LyX-Code
3151
3152 # Uso: get_rnd_code()
3153 \layout LyX-Code
3154
3155 sub get_rnd_code()
3156 \layout LyX-Code
3157
3158 {
3159 \layout LyX-Code
3160
3161         my $cant = @codes;
3162 \layout LyX-Code
3163
3164         return $codes[rnd($cant-1)];
3165 \layout LyX-Code
3166
3167 }
3168 \layout LyX-Code
3169
3170 #}}}
3171 \layout LyX-Code
3172
3173 \layout LyX-Code
3174
3175 #{{{ rnd() - Genera números aleatorios
3176 \layout LyX-Code
3177
3178 # Uso: rnd(MAX)      - genera número de 0 a MAX (inclusive)
3179 \layout LyX-Code
3180
3181 #      rnd(MIN, MAX) - genera número de MIN a MAX (inclusive)
3182 \layout LyX-Code
3183
3184 #
3185 \layout LyX-Code
3186
3187 # Nota: respeta el tamaño del campo más chico, es decir, si se usa
3188 \layout LyX-Code
3189
3190 #       rnd 01 250, el número siempre tendrá al menos 2 dígitos
3191 \layout LyX-Code
3192
3193 #       rellenados con ceros, como 04, 28, 123, 08, etc
3194 \layout LyX-Code
3195
3196 sub rnd($;$)
3197 \layout LyX-Code
3198
3199 {
3200 \layout LyX-Code
3201
3202         my ($ini, $fin) = @_;
3203 \layout LyX-Code
3204
3205         if (!$fin)
3206 \layout LyX-Code
3207
3208         {
3209 \layout LyX-Code
3210
3211                 $fin = $ini;
3212 \layout LyX-Code
3213
3214                 $ini = 0;
3215 \layout LyX-Code
3216
3217         }
3218 \layout LyX-Code
3219
3220         return sprintf('%0'.length($ini).'d', $ini + rand()
3221 \layout LyX-Code
3222
3223           * ($fin - $ini + 1));
3224 \layout LyX-Code
3225
3226 }
3227 \layout LyX-Code
3228
3229 #}}}
3230 \layout LyX-Code
3231
3232 \layout LyX-Code
3233
3234 #{{{ Tipos de campos
3235 \layout LyX-Code
3236
3237 sub aaaa() { return rnd($MIN_ANIO, $MAX_ANIO); } # año
3238 \layout LyX-Code
3239
3240 sub mm()   { return rnd("01", 12); }             # mes
3241 \layout LyX-Code
3242
3243 sub dd()   { return rnd("01", 28); }             # día
3244 \layout LyX-Code
3245
3246 sub hh()   { return rnd("00", 23); }             # hora
3247 \layout LyX-Code
3248
3249 sub MM()   { return rnd("00", 59); }             # minutos
3250 \layout LyX-Code
3251
3252 # código de central telefónica
3253 \layout LyX-Code
3254
3255 sub DDDD() { return rnd($MIN_COD, $MAX_COD); }
3256 \layout LyX-Code
3257
3258 # caracter aleatorio
3259 \layout LyX-Code
3260
3261 sub char() { return chr(rnd(65, 90)); }   
3262 \layout LyX-Code
3263
3264 #}}}
3265 \layout LyX-Code
3266
3267 \layout LyX-Code
3268
3269 #{{{ line() - Genera una línea del archivo
3270 \layout LyX-Code
3271
3272 sub line()
3273 \layout LyX-Code
3274
3275 {
3276 \layout LyX-Code
3277
3278         my $f_linea   = rnd(100000, 99999999);
3279 \layout LyX-Code
3280
3281         my $f_minutos = rnd(1, 150);
3282 \layout LyX-Code
3283
3284         my $f_fecha   = aaaa().mm().dd();
3285 \layout LyX-Code
3286
3287         my $f_hora    = dd().hh().MM();
3288 \layout LyX-Code
3289
3290         my ($f_tipo, $f_orig, $f_dest) = ('', '', '');
3291 \layout LyX-Code
3292
3293         if (rnd(1) == 1)
3294 \layout LyX-Code
3295
3296         {
3297 \layout LyX-Code
3298
3299                 $f_tipo = 'E';
3300 \layout LyX-Code
3301
3302                 $f_orig = get_rnd_code();
3303 \layout LyX-Code
3304
3305         }
3306 \layout LyX-Code
3307
3308         else
3309 \layout LyX-Code
3310
3311         {
3312 \layout LyX-Code
3313
3314                 $f_tipo = 'S';
3315 \layout LyX-Code
3316
3317                 $f_dest = get_rnd_code();
3318 \layout LyX-Code
3319
3320         }
3321 \layout LyX-Code
3322
3323         my $f_prest = char().char().char().char().char().
3324 \layout LyX-Code
3325
3326                       char().char().char().char();
3327 \layout LyX-Code
3328
3329         return "$f_linea;$f_minutos;$f_fecha;$f_hora;".
3330 \layout LyX-Code
3331
3332                "$f_tipo;$f_dest;$f_orig;$f_prest";
3333 \layout LyX-Code
3334
3335 }
3336 \layout LyX-Code
3337
3338 #}}}
3339 \layout LyX-Code
3340
3341 \layout LyX-Code
3342
3343 #{{{ gen() - Genera un archivo con entre MIN y MAX llamadas
3344 \layout LyX-Code
3345
3346 # Uso: gen(MIN, MAX)
3347 \layout LyX-Code
3348
3349 sub gen($$)
3350 \layout LyX-Code
3351
3352 {
3353 \layout LyX-Code
3354
3355         my ($ini, $fin) = @_;
3356 \layout LyX-Code
3357
3358         my $file = aaaa().mm().dd().hh().MM().'.'.DDDD();
3359 \layout LyX-Code
3360
3361         # Mientras exista uno, buscamos un nuevo nombre.
3362 \layout LyX-Code
3363
3364         $file = aaaa().mm().dd().hh().MM().'.'.DDDD()
3365 \layout LyX-Code
3366
3367           while (-e $file);
3368 \layout LyX-Code
3369
3370         open(FH, ">$file")
3371 \layout LyX-Code
3372
3373           or die("No puedo abrir el archivo $file!
3374 \backslash 
3375 n");
3376 \layout LyX-Code
3377
3378         for (my $i = rnd($ini, $fin); $i > 0; --$i)
3379 \layout LyX-Code
3380
3381         {
3382 \layout LyX-Code
3383
3384                 print FH line()."
3385 \backslash 
3386 n";
3387 \layout LyX-Code
3388
3389         }
3390 \layout LyX-Code
3391
3392 }
3393 \layout LyX-Code
3394
3395 #}}}
3396 \layout LyX-Code
3397
3398 \layout LyX-Code
3399
3400 #}}}
3401 \layout LyX-Code
3402
3403 \layout LyX-Code
3404
3405 #{{{ Programa
3406 \layout LyX-Code
3407
3408 srand;
3409 \layout LyX-Code
3410
3411 my $cant = $ARGV[0] ? $ARGV[0] : $CANT_ARCHS;
3412 \layout LyX-Code
3413
3414 load_codes();
3415 \layout LyX-Code
3416
3417 for (my $i = 0; $i < $cant; ++$i)
3418 \layout LyX-Code
3419
3420 {
3421 \layout LyX-Code
3422
3423         gen($ARGV[1] ? $ARGV[1] : $MIN_LINEAS,
3424 \layout LyX-Code
3425
3426             $ARGV[2] ? $ARGV[2] : $MAX_LINEAS);
3427 \layout LyX-Code
3428
3429 }
3430 \layout LyX-Code
3431
3432 #}}}
3433 \layout LyX-Code
3434
3435 \layout LyX-Code
3436
3437 # vim: set fdm=marker ts=4 sw=4 :
3438 \layout Section
3439
3440 Archivos
3441 \layout Subsection
3442
3443 Archivos del Enunciado
3444 \layout Subsubsection
3445
3446
3447 \family typewriter 
3448 <comando>.log
3449 \layout Standard
3450
3451 Los archivos de log generados por los distintos comandos, presentan todos
3452  la misma estructura de registro que se detalla a continuación: 
3453 \family typewriter 
3454 YYYYMMDD-hhmm $usuario $comando: ¨$Mensaje¨
3455 \layout Subsubsection
3456
3457
3458 \family typewriter 
3459 oridesti.txt
3460 \layout Standard
3461
3462 En este archivo se tienen los origenes y destinos en base a los cuales hemos
3463  generados los archivos de llamada y los umbrales.
3464 \layout Standard
3465
3466
3467 \begin_inset Float table
3468 placement H
3469 wide false
3470 collapsed true
3471
3472 \layout Caption
3473
3474
3475 \series bold 
3476 Estructura de oridesti.txt
3477 \layout Standard
3478 \align center 
3479
3480 \begin_inset  Tabular
3481 <lyxtabular version="3" rows="2" columns="2">
3482 <features>
3483 <column alignment="center" valignment="top" leftline="true" width="0">
3484 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
3485 <row topline="true" bottomline="true">
3486 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3487 \begin_inset Text
3488
3489 \layout Standard
3490
3491 Código
3492 \end_inset 
3493 </cell>
3494 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3495 \begin_inset Text
3496
3497 \layout Standard
3498
3499 2 caracteres
3500 \end_inset 
3501 </cell>
3502 </row>
3503 <row topline="true" bottomline="true">
3504 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3505 \begin_inset Text
3506
3507 \layout Standard
3508
3509 Descripción
3510 \end_inset 
3511 </cell>
3512 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3513 \begin_inset Text
3514
3515 \layout Standard
3516
3517 N caracteres
3518 \end_inset 
3519 </cell>
3520 </row>
3521 </lyxtabular>
3522
3523 \end_inset 
3524
3525
3526 \end_inset 
3527
3528
3529 \layout Subsubsection
3530
3531
3532 \family typewriter 
3533 umbrales.param
3534 \layout Standard
3535
3536 Este archivo posee los umbrales de llamadas de los cuales se valdra el antifraud
3537 e.pl para emitir o no alarmas durante el proceso de los archivos de llamadas.
3538 \layout Standard
3539
3540
3541 \begin_inset Float table
3542 placement H
3543 wide false
3544 collapsed true
3545
3546 \layout Caption
3547
3548
3549 \series bold 
3550 Estructura de umbrales.param
3551 \layout Standard
3552 \align center 
3553
3554 \begin_inset  Tabular
3555 <lyxtabular version="3" rows="8" columns="2">
3556 <features>
3557 <column alignment="center" valignment="top" leftline="true" width="0">
3558 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
3559 <row topline="true" bottomline="true">
3560 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3561 \begin_inset Text
3562
3563 \layout Standard
3564
3565 Id del registro
3566 \end_inset 
3567 </cell>
3568 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3569 \begin_inset Text
3570
3571 \layout Standard
3572
3573 N caracteres, número secuencial >= 1
3574 \end_inset 
3575 </cell>
3576 </row>
3577 <row topline="true">
3578 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3579 \begin_inset Text
3580
3581 \layout Standard
3582
3583 Número de línea
3584 \end_inset 
3585 </cell>
3586 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3587 \begin_inset Text
3588
3589 \layout Standard
3590
3591 N caracteres, Numérico
3592 \end_inset 
3593 </cell>
3594 </row>
3595 <row topline="true">
3596 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3597 \begin_inset Text
3598
3599 \layout Standard
3600
3601 Origen/Destino
3602 \end_inset 
3603 </cell>
3604 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3605 \begin_inset Text
3606
3607 \layout Standard
3608
3609 2 caracteres, valores posibles segun oridesti.txt
3610 \end_inset 
3611 </cell>
3612 </row>
3613 <row topline="true">
3614 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3615 \begin_inset Text
3616
3617 \layout Standard
3618
3619 Tipo de llamada
3620 \end_inset 
3621 </cell>
3622 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3623 \begin_inset Text
3624
3625 \layout Standard
3626
3627 1 caracter, E = Entrante, S = Salida
3628 \end_inset 
3629 </cell>
3630 </row>
3631 <row topline="true">
3632 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3633 \begin_inset Text
3634
3635 \layout Standard
3636
3637 Estado
3638 \end_inset 
3639 </cell>
3640 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3641 \begin_inset Text
3642
3643 \layout Standard
3644
3645 1 caracter, A = Activo, I = Inactivo
3646 \end_inset 
3647 </cell>
3648 </row>
3649 <row topline="true">
3650 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3651 \begin_inset Text
3652
3653 \layout Standard
3654
3655 Usuario
3656 \end_inset 
3657 </cell>
3658 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3659 \begin_inset Text
3660
3661 \layout Standard
3662
3663 N caracteres = login del user que graba el reg
3664 \end_inset 
3665 </cell>
3666 </row>
3667 <row topline="true">
3668 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3669 \begin_inset Text
3670
3671 \layout Standard
3672
3673 Fecha
3674 \end_inset 
3675 </cell>
3676 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3677 \begin_inset Text
3678
3679 \layout Standard
3680
3681 8 caracteres, formato aaaammdd
3682 \end_inset 
3683 </cell>
3684 </row>
3685 <row topline="true" bottomline="true">
3686 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3687 \begin_inset Text
3688
3689 \layout Standard
3690
3691 Hora
3692 \end_inset 
3693 </cell>
3694 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3695 \begin_inset Text
3696
3697 \layout Standard
3698
3699 6 caracteres, formato hhmmss, hora actual
3700 \end_inset 
3701 </cell>
3702 </row>
3703 </lyxtabular>
3704
3705 \end_inset 
3706
3707
3708 \end_inset 
3709
3710
3711 \layout Subsubsection
3712
3713
3714 \family typewriter 
3715 <archivo de llamada>
3716 \layout Standard
3717
3718 Estos archivos son los que el antifraude procesará en busca de matchs contra
3719  los umbrales.
3720 \layout Standard
3721
3722
3723 \begin_inset Float table
3724 placement H
3725 wide false
3726 collapsed true
3727
3728 \layout Caption
3729
3730
3731 \series bold 
3732 Estructura de un archivo de llamadas
3733 \layout Standard
3734 \align center 
3735
3736 \begin_inset  Tabular
3737 <lyxtabular version="3" rows="8" columns="2">
3738 <features>
3739 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
3740 <column alignment="center" valignment="top" rightline="true" width="0">
3741 <row topline="true" bottomline="true">
3742 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3743 \begin_inset Text
3744
3745 \layout Standard
3746
3747 Número de línea
3748 \end_inset 
3749 </cell>
3750 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3751 \begin_inset Text
3752
3753 \layout Standard
3754
3755 N caracteres, Numérico
3756 \end_inset 
3757 </cell>
3758 </row>
3759 <row topline="true">
3760 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3761 \begin_inset Text
3762
3763 \layout Standard
3764
3765 Cantidad de Minutos
3766 \end_inset 
3767 </cell>
3768 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3769 \begin_inset Text
3770
3771 \layout Standard
3772
3773 N caracteres, Numérico
3774 \end_inset 
3775 </cell>
3776 </row>
3777 <row topline="true">
3778 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3779 \begin_inset Text
3780
3781 \layout Standard
3782
3783 Fecha de Llamada
3784 \end_inset 
3785 </cell>
3786 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3787 \begin_inset Text
3788
3789 \layout Standard
3790
3791 8 caracteres, formato aaaammdd
3792 \end_inset 
3793 </cell>
3794 </row>
3795 <row topline="true">
3796 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3797 \begin_inset Text
3798
3799 \layout Standard
3800
3801 Hora de Llamada
3802 \end_inset 
3803 </cell>
3804 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3805 \begin_inset Text
3806
3807 \layout Standard
3808
3809 6 caracteres, formato hhmmss
3810 \end_inset 
3811 </cell>
3812 </row>
3813 <row topline="true">
3814 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3815 \begin_inset Text
3816
3817 \layout Standard
3818
3819 Tipo de Llamada
3820 \end_inset 
3821 </cell>
3822 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3823 \begin_inset Text
3824
3825 \layout Standard
3826
3827 1 carácter, E = Entrante, S = Salida
3828 \end_inset 
3829 </cell>
3830 </row>
3831 <row topline="true">
3832 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3833 \begin_inset Text
3834
3835 \layout Standard
3836
3837 Destino
3838 \end_inset 
3839 </cell>
3840 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3841 \begin_inset Text
3842
3843 \layout Standard
3844
3845 2 caracteres, solo informado en llamadas salientes
3846 \end_inset 
3847 </cell>
3848 </row>
3849 <row topline="true">
3850 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3851 \begin_inset Text
3852
3853 \layout Standard
3854
3855 Origen
3856 \end_inset 
3857 </cell>
3858 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3859 \begin_inset Text
3860
3861 \layout Standard
3862
3863 2 caracteres, solo informado en llamadas entrantes
3864 \end_inset 
3865 </cell>
3866 </row>
3867 <row topline="true">
3868 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3869 \begin_inset Text
3870
3871 \layout Standard
3872
3873 Prestadora
3874 \end_inset 
3875 </cell>
3876 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3877 \begin_inset Text
3878
3879 \layout Standard
3880
3881 N caracteres
3882 \end_inset 
3883 </cell>
3884 </row>
3885 </lyxtabular>
3886
3887 \end_inset 
3888
3889
3890 \end_inset 
3891
3892
3893 \layout Subsubsection
3894
3895
3896 \family typewriter 
3897 alarmas.txt
3898 \layout Standard
3899
3900 En este archivo el antifraude irá dejando registro de las alarmas emitidas
3901  en base a registros que han tenido un match contra los umbrales.
3902 \layout Standard
3903
3904
3905 \begin_inset Float table
3906 placement H
3907 wide false
3908 collapsed true
3909
3910 \layout Caption
3911
3912
3913 \series bold 
3914 Estructura de alarmas.txt
3915 \layout Standard
3916 \align center 
3917
3918 \begin_inset  Tabular
3919 <lyxtabular version="3" rows="10" columns="2">
3920 <features>
3921 <column alignment="center" valignment="top" leftline="true" width="0">
3922 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
3923 <row topline="true" bottomline="true">
3924 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3925 \begin_inset Text
3926
3927 \layout Standard
3928
3929 Prestadora
3930 \end_inset 
3931 </cell>
3932 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3933 \begin_inset Text
3934
3935 \layout Standard
3936
3937 N caracteres, campo 'Prestadora', archivo de llamadas
3938 \end_inset 
3939 </cell>
3940 </row>
3941 <row topline="true">
3942 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3943 \begin_inset Text
3944
3945 \layout Standard
3946
3947 Central Telefónica
3948 \end_inset 
3949 </cell>
3950 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3951 \begin_inset Text
3952
3953 \layout Standard
3954
3955 4 caracteres, obtenido a partir del archivo de llamadas
3956 \end_inset 
3957 </cell>
3958 </row>
3959 <row topline="true">
3960 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3961 \begin_inset Text
3962
3963 \layout Standard
3964
3965 Número de Línea
3966 \end_inset 
3967 </cell>
3968 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3969 \begin_inset Text
3970
3971 \layout Standard
3972
3973 N caracteres, campo 'Numero de Linea' , archivo de llamadas
3974 \end_inset 
3975 </cell>
3976 </row>
3977 <row topline="true">
3978 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3979 \begin_inset Text
3980
3981 \layout Standard
3982
3983 Cantidad de minutos
3984 \end_inset 
3985 </cell>
3986 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3987 \begin_inset Text
3988
3989 \layout Standard
3990
3991 N caracteres, campo 'Cant de Minutos', archivo de llamadas
3992 \end_inset 
3993 </cell>
3994 </row>
3995 <row topline="true">
3996 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3997 \begin_inset Text
3998
3999 \layout Standard
4000
4001 Regla Aplicada
4002 \end_inset 
4003 </cell>
4004 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4005 \begin_inset Text
4006
4007 \layout Standard
4008
4009 N caracteres, campo 'Id de registro', umbrales.param
4010 \end_inset 
4011 </cell>
4012 </row>
4013 <row topline="true">
4014 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4015 \begin_inset Text
4016
4017 \layout Standard
4018
4019 Fecha de llamada
4020 \end_inset 
4021 </cell>
4022 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4023 \begin_inset Text
4024
4025 \layout Standard
4026
4027 8 caracteres, campo 'Fecha de llamada', archivo de llamadas
4028 \end_inset 
4029 </cell>
4030 </row>
4031 <row topline="true">
4032 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4033 \begin_inset Text
4034
4035 \layout Standard
4036
4037 Hora de llamada
4038 \end_inset 
4039 </cell>
4040 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4041 \begin_inset Text
4042
4043 \layout Standard
4044
4045 6 caracteres, campo 'Hora de llamada', archivo de llamadas
4046 \end_inset 
4047 </cell>
4048 </row>
4049 <row topline="true">
4050 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4051 \begin_inset Text
4052
4053 \layout Standard
4054
4055 Usuario
4056 \end_inset 
4057 </cell>
4058 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4059 \begin_inset Text
4060
4061 \layout Standard
4062
4063 N caracteres, siempre login del usuario que graba el reg
4064 \end_inset 
4065 </cell>
4066 </row>
4067 <row topline="true">
4068 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4069 \begin_inset Text
4070
4071 \layout Standard
4072
4073 Fecha
4074 \end_inset 
4075 </cell>
4076 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4077 \begin_inset Text
4078
4079 \layout Standard
4080
4081 8 caracteres, formato aaaammdd, fecha actual
4082 \end_inset 
4083 </cell>
4084 </row>
4085 <row topline="true" bottomline="true">
4086 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4087 \begin_inset Text
4088
4089 \layout Standard
4090
4091 Hora
4092 \end_inset 
4093 </cell>
4094 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4095 \begin_inset Text
4096
4097 \layout Standard
4098
4099 6 caracteres formato hhmmss, hora actual
4100 \end_inset 
4101 </cell>
4102 </row>
4103 </lyxtabular>
4104
4105 \end_inset 
4106
4107
4108 \end_inset 
4109
4110
4111 \layout Subsection
4112
4113 Archivos Auxiliares
4114 \layout Subsubsection
4115
4116
4117 \family typewriter 
4118 afimonio.conf
4119 \layout Standard
4120
4121 El archivo de configuración 
4122 \family typewriter 
4123 ~/.antifraude/conf/afimonio.conf
4124 \family default 
4125  almacena las rutas a los directorios necesarios para la ejecución del script
4126  
4127 \family typewriter 
4128 afimonio
4129 \family default 
4130  y la ruta, nombre, y tamaño máximo del archivo de log.
4131  
4132 \layout Subsubsection
4133
4134
4135 \family typewriter 
4136 antifraude.conf
4137 \layout Standard
4138
4139 El archivo de configuración 
4140 \family typewriter 
4141 ~/.antifraude/conf/antifraude.conf
4142 \family default 
4143  almacena las rutas a los directorios necesarios para la ejecución del script
4144  
4145 \family typewriter 
4146 antifraude.pl
4147 \family default 
4148  y la ruta, nombre, y tamaño máximo del archivo de log.
4149  
4150 \layout Subsubsection
4151
4152
4153 \family typewriter 
4154 aficonf.conf
4155 \layout Standard
4156
4157 El archivo de configuración 
4158 \family typewriter 
4159 ~/.antifraude/conf/aficonf.conf
4160 \family default 
4161  almacena las rutas a los directorios necesarios para la ejecución del script
4162  
4163 \family typewriter 
4164 aficonf
4165 \family default 
4166  y la ruta, nombre, y tamaño máximo del archivo de log.
4167  
4168 \layout Standard
4169
4170 Estos archivos fueron creados para que los diferentes scripts tengan un
4171  lugar común donde buscar esa información para salvar el problema comentado
4172  en el punto 
4173 \begin_inset LatexCommand \vref{sec:Problemas-relevantes}
4174
4175 \end_inset 
4176
4177 .
4178 \layout Subsection
4179
4180 Set de Prueba (testcalls.tar.gz)
4181 \layout Standard
4182
4183 Para probar el comportamiento del sistema, se preparo un set de prueba distribui
4184 do en el archivo 
4185 \family typewriter 
4186 testcalls.tar.gz
4187 \family default 
4188 , situado en el directorio 
4189 \family typewriter 
4190 /inst
4191 \family default 
4192 , del paquete de instalación.
4193  El set de prueba se copia automáticamente en el momento en que se instale
4194  el componente 
4195 \family typewriter 
4196 \series bold 
4197 antifraude
4198 \family default 
4199 \series default 
4200 , dejando el escenario listo para procesarlos en el momento en que sea arrancado
4201  el 
4202 \family typewriter 
4203 \series bold 
4204 afimonio
4205 \family default 
4206  
4207 \series default 
4208 o bien ejecutando el 
4209 \family typewriter 
4210 \series bold 
4211 antifraude
4212 \family default 
4213 \series default 
4214  en forma manual.
4215 \layout Standard
4216
4217 Este set de prueba consta de 
4218 \series bold 
4219 17 archivos
4220 \series default 
4221 , que se detallan a continuación:
4222 \layout Itemize
4223
4224 14 archivos de llamadas generados con el 
4225 \family typewriter 
4226 \series bold 
4227 callgen
4228 \family default 
4229 \series default 
4230 , con entre 1000 y 5000 registros cada uno, y fecha en el rango año 1999
4231  a 2004.
4232 \layout Itemize
4233
4234 1 archivo de llamadas con registros válidos y otros no válidos.
4235 \layout Itemize
4236
4237 1 archivo con nombre válido según el formato YYYYMMDDhhmm.nnnn, pero con
4238  contenido inválido, el cual es rechazado por 
4239 \family typewriter 
4240 \series bold 
4241 antifraude
4242 \family default 
4243 \series default 
4244 .
4245 \layout Itemize
4246
4247 1 archivo con nombre no válido rechazado en instancia previa por 
4248 \family typewriter 
4249 \series bold 
4250 afimonio
4251 \family default 
4252 \series default 
4253 .
4254 \layout Standard
4255
4256 Se describen en la siguiente tabla, los archivos y registros que disparan
4257  alarmas o tienen close matches contra los 25 umbrales distribuidos en el
4258  paquete de instalación, vía el umbrales.param:
4259 \layout Standard
4260
4261
4262 \begin_inset Float table
4263 placement H
4264 wide false
4265 collapsed true
4266
4267 \layout Caption
4268
4269
4270 \series bold 
4271 Archivos y Registros que disparan alarmas
4272 \layout Standard
4273 \align center 
4274
4275 \begin_inset  Tabular
4276 <lyxtabular version="3" rows="24" columns="3">
4277 <features>
4278 <column alignment="center" valignment="top" leftline="true" width="0">
4279 <column alignment="center" valignment="top" leftline="true" width="0">
4280 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
4281 <row topline="true" bottomline="true">
4282 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4283 \begin_inset Text
4284
4285 \layout Standard
4286
4287
4288 \series bold 
4289 Archivo
4290 \end_inset 
4291 </cell>
4292 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4293 \begin_inset Text
4294
4295 \layout Standard
4296
4297
4298 \series bold 
4299 Nro.
4300  Línea
4301 \end_inset 
4302 </cell>
4303 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4304 \begin_inset Text
4305
4306 \layout Standard
4307
4308
4309 \series bold 
4310 Umbral
4311 \end_inset 
4312 </cell>
4313 </row>
4314 <row topline="true">
4315 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4316 \begin_inset Text
4317
4318 \layout Standard
4319
4320 20007280054.7548
4321 \end_inset 
4322 </cell>
4323 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4324 \begin_inset Text
4325
4326 \layout Standard
4327
4328 10
4329 \end_inset 
4330 </cell>
4331 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4332 \begin_inset Text
4333
4334 \layout Standard
4335
4336 1 (emite alarma)
4337 \end_inset 
4338 </cell>
4339 </row>
4340 <row topline="true">
4341 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4342 \begin_inset Text
4343
4344 \layout Standard
4345
4346 200106131116.0363
4347 \end_inset 
4348 </cell>
4349 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4350 \begin_inset Text
4351
4352 \layout Standard
4353
4354 17
4355 \end_inset 
4356 </cell>
4357 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4358 \begin_inset Text
4359
4360 \layout Standard
4361
4362 3 (emite alarma)
4363 \end_inset 
4364 </cell>
4365 </row>
4366 <row topline="true">
4367 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4368 \begin_inset Text
4369
4370 \layout Standard
4371
4372 200106131116.0363
4373 \end_inset 
4374 </cell>
4375 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4376 \begin_inset Text
4377
4378 \layout Standard
4379
4380 569
4381 \end_inset 
4382 </cell>
4383 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4384 \begin_inset Text
4385
4386 \layout Standard
4387
4388 4 (emite alarma)
4389 \end_inset 
4390 </cell>
4391 </row>
4392 <row topline="true">
4393 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4394 \begin_inset Text
4395
4396 \layout Standard
4397
4398 200208052043.4798
4399 \end_inset 
4400 </cell>
4401 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4402 \begin_inset Text
4403
4404 \layout Standard
4405
4406 11
4407 \end_inset 
4408 </cell>
4409 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4410 \begin_inset Text
4411
4412 \layout Standard
4413
4414 5 (emite alarma)
4415 \end_inset 
4416 </cell>
4417 </row>
4418 <row topline="true">
4419 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4420 \begin_inset Text
4421
4422 \layout Standard
4423
4424 200208052043.4798
4425 \end_inset 
4426 </cell>
4427 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4428 \begin_inset Text
4429
4430 \layout Standard
4431
4432 910
4433 \end_inset 
4434 </cell>
4435 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4436 \begin_inset Text
4437
4438 \layout Standard
4439
4440 6 (emite alarma)
4441 \end_inset 
4442 </cell>
4443 </row>
4444 <row topline="true">
4445 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4446 \begin_inset Text
4447
4448 \layout Standard
4449
4450 200209061048.3349
4451 \end_inset 
4452 </cell>
4453 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4454 \begin_inset Text
4455
4456 \layout Standard
4457
4458 22
4459 \end_inset 
4460 </cell>
4461 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4462 \begin_inset Text
4463
4464 \layout Standard
4465
4466 7 (emite alarma)
4467 \end_inset 
4468 </cell>
4469 </row>
4470 <row topline="true">
4471 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4472 \begin_inset Text
4473
4474 \layout Standard
4475
4476 ídem
4477 \end_inset 
4478 </cell>
4479 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4480 \begin_inset Text
4481
4482 \layout Standard
4483
4484 130
4485 \end_inset 
4486 </cell>
4487 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4488 \begin_inset Text
4489
4490 \layout Standard
4491
4492 8 (emite alarma)
4493 \end_inset 
4494 </cell>
4495 </row>
4496 <row topline="true">
4497 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4498 \begin_inset Text
4499
4500 \layout Standard
4501
4502 ídem
4503 \end_inset 
4504 </cell>
4505 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4506 \begin_inset Text
4507
4508 \layout Standard
4509
4510 241
4511 \end_inset 
4512 </cell>
4513 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4514 \begin_inset Text
4515
4516 \layout Standard
4517
4518 9 (emite alarma)
4519 \end_inset 
4520 </cell>
4521 </row>
4522 <row topline="true">
4523 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4524 \begin_inset Text
4525
4526 \layout Standard
4527
4528 200305081545.6342
4529 \end_inset 
4530 </cell>
4531 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4532 \begin_inset Text
4533
4534 \layout Standard
4535
4536 22
4537 \end_inset 
4538 </cell>
4539 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4540 \begin_inset Text
4541
4542 \layout Standard
4543
4544 10 (emite alarma)
4545 \end_inset 
4546 </cell>
4547 </row>
4548 <row topline="true">
4549 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4550 \begin_inset Text
4551
4552 \layout Standard
4553
4554 200105152014.9258
4555 \end_inset 
4556 </cell>
4557 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4558 \begin_inset Text
4559
4560 \layout Standard
4561
4562 6
4563 \end_inset 
4564 </cell>
4565 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4566 \begin_inset Text
4567
4568 \layout Standard
4569
4570 11 (emite alarma)
4571 \end_inset 
4572 </cell>
4573 </row>
4574 <row topline="true">
4575 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4576 \begin_inset Text
4577
4578 \layout Standard
4579
4580 ídem
4581 \end_inset 
4582 </cell>
4583 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4584 \begin_inset Text
4585
4586 \layout Standard
4587
4588 21
4589 \end_inset 
4590 </cell>
4591 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4592 \begin_inset Text
4593
4594 \layout Standard
4595
4596 12 (emite alarma)
4597 \end_inset 
4598 </cell>
4599 </row>
4600 <row topline="true">
4601 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4602 \begin_inset Text
4603
4604 \layout Standard
4605
4606 200112190950.9888
4607 \end_inset 
4608 </cell>
4609 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4610 \begin_inset Text
4611
4612 \layout Standard
4613
4614 16
4615 \end_inset 
4616 </cell>
4617 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4618 \begin_inset Text
4619
4620 \layout Standard
4621
4622 13 (emite alarma)
4623 \end_inset 
4624 </cell>
4625 </row>
4626 <row topline="true">
4627 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4628 \begin_inset Text
4629
4630 \layout Standard
4631
4632 ídem
4633 \end_inset 
4634 </cell>
4635 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4636 \begin_inset Text
4637
4638 \layout Standard
4639
4640 88
4641 \end_inset 
4642 </cell>
4643 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4644 \begin_inset Text
4645
4646 \layout Standard
4647
4648 14 (emite alarma)
4649 \end_inset 
4650 </cell>
4651 </row>
4652 <row topline="true">
4653 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4654 \begin_inset Text
4655
4656 \layout Standard
4657
4658 ídem
4659 \end_inset 
4660 </cell>
4661 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4662 \begin_inset Text
4663
4664 \layout Standard
4665
4666 400
4667 \end_inset 
4668 </cell>
4669 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4670 \begin_inset Text
4671
4672 \layout Standard
4673
4674 15 (emite alarma)
4675 \end_inset 
4676 </cell>
4677 </row>
4678 <row topline="true">
4679 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4680 \begin_inset Text
4681
4682 \layout Standard
4683
4684 ídem
4685 \end_inset 
4686 </cell>
4687 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4688 \begin_inset Text
4689
4690 \layout Standard
4691
4692 834
4693 \end_inset 
4694 </cell>
4695 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4696 \begin_inset Text
4697
4698 \layout Standard
4699
4700 16 (emite alarma)
4701 \end_inset 
4702 </cell>
4703 </row>
4704 <row topline="true">
4705 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4706 \begin_inset Text
4707
4708 \layout Standard
4709
4710 ídem
4711 \end_inset 
4712 </cell>
4713 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4714 \begin_inset Text
4715
4716 \layout Standard
4717
4718 1063
4719 \end_inset 
4720 </cell>
4721 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4722 \begin_inset Text
4723
4724 \layout Standard
4725
4726 17 (emite alarma)
4727 \end_inset 
4728 </cell>
4729 </row>
4730 <row topline="true">
4731 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4732 \begin_inset Text
4733
4734 \layout Standard
4735
4736 199905161611.9843
4737 \end_inset 
4738 </cell>
4739 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4740 \begin_inset Text
4741
4742 \layout Standard
4743
4744 14
4745 \end_inset 
4746 </cell>
4747 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4748 \begin_inset Text
4749
4750 \layout Standard
4751
4752 18 (emite alarma)
4753 \end_inset 
4754 </cell>
4755 </row>
4756 <row topline="true">
4757 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4758 \begin_inset Text
4759
4760 \layout Standard
4761
4762 ídem
4763 \end_inset 
4764 </cell>
4765 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4766 \begin_inset Text
4767
4768 \layout Standard
4769
4770 2280
4771 \end_inset 
4772 </cell>
4773 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4774 \begin_inset Text
4775
4776 \layout Standard
4777
4778 19 (emite alarma)
4779 \end_inset 
4780 </cell>
4781 </row>
4782 <row topline="true">
4783 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4784 \begin_inset Text
4785
4786 \layout Standard
4787
4788 ídem
4789 \end_inset 
4790 </cell>
4791 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4792 \begin_inset Text
4793
4794 \layout Standard
4795
4796 1921
4797 \end_inset 
4798 </cell>
4799 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4800 \begin_inset Text
4801
4802 \layout Standard
4803
4804 20 (emite alarma)
4805 \end_inset 
4806 </cell>
4807 </row>
4808 <row topline="true">
4809 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4810 \begin_inset Text
4811
4812 \layout Standard
4813
4814 199905161611.9843
4815 \end_inset 
4816 </cell>
4817 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4818 \begin_inset Text
4819
4820 \layout Standard
4821
4822 1994
4823 \end_inset 
4824 </cell>
4825 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4826 \begin_inset Text
4827
4828 \layout Standard
4829
4830 21 (umbral inactivo => no emite alarma)
4831 \end_inset 
4832 </cell>
4833 </row>
4834 <row topline="true">
4835 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4836 \begin_inset Text
4837
4838 \layout Standard
4839
4840 200001190318.4443
4841 \end_inset 
4842 </cell>
4843 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4844 \begin_inset Text
4845
4846 \layout Standard
4847
4848 13
4849 \end_inset 
4850 </cell>
4851 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4852 \begin_inset Text
4853
4854 \layout Standard
4855
4856 Close match umbral 22, difiere tipo de llamada
4857 \end_inset 
4858 </cell>
4859 </row>
4860 <row topline="true">
4861 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4862 \begin_inset Text
4863
4864 \layout Standard
4865
4866 ídem
4867 \end_inset 
4868 </cell>
4869 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4870 \begin_inset Text
4871
4872 \layout Standard
4873
4874 217
4875 \end_inset 
4876 </cell>
4877 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4878 \begin_inset Text
4879
4880 \layout Standard
4881
4882 23 (emite alarma)
4883 \end_inset 
4884 </cell>
4885 </row>
4886 <row topline="true" bottomline="true">
4887 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4888 \begin_inset Text
4889
4890 \layout Standard
4891
4892 200010222338.2540
4893 \end_inset 
4894 </cell>
4895 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4896 \begin_inset Text
4897
4898 \layout Standard
4899
4900 10
4901 \end_inset 
4902 </cell>
4903 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4904 \begin_inset Text
4905
4906 \layout Standard
4907
4908 25 (umbral inactivo => no emite alarma)
4909 \end_inset 
4910 </cell>
4911 </row>
4912 </lyxtabular>
4913
4914 \end_inset 
4915
4916
4917 \end_inset 
4918
4919
4920 \layout Paragraph
4921
4922 Archivo 
4923 \family typewriter 
4924 199908220733.4515
4925 \layout Paragraph
4926
4927
4928 \series medium 
4929 Posee registros no válidos detallados a continuación.
4930  Los registros se contabilizan de 0 a N (Línea 1 = Reg 0)
4931 \layout Itemize
4932
4933
4934 \series bold 
4935 Registro 3
4936 \series default 
4937  -> Posee un 9no campo 
4938 \emph on 
4939 bogus
4940 \layout Itemize
4941
4942
4943 \series bold 
4944 Registro 27
4945 \series default 
4946  -> Posee un 9no campo 
4947 \emph on 
4948 bogus
4949 \layout Itemize
4950
4951
4952 \series bold 
4953 Registro 31
4954 \series default 
4955  -> Posee un tipo de llamada 
4956 \family typewriter 
4957 W
4958 \family default 
4959  no valida
4960 \layout Itemize
4961
4962
4963 \series bold 
4964 Registro 41
4965 \series default 
4966  -> El número de línea (campo1) no es numérico, es un string 
4967 \family typewriter 
4968 'ABCD'
4969 \layout Itemize
4970
4971
4972 \series bold 
4973 Registro 52
4974 \series default 
4975  -> Tiene cantidad de campos insuficiente (siete)
4976 \layout Standard
4977
4978 Estos registros emitirán errores plasmados en el 
4979 \family typewriter 
4980 antifraude.log
4981 \family default 
4982 .
4983  Para verificar esto, realizar una búsqueda en el log, sobre el nombre del
4984  archivo, y ubicarse en el sector donde se indica el comienzo del procesamiento
4985  del mismo con ¨
4986 \family typewriter 
4987 Inicio proceso de: 199908220733.4515
4988 \family default 
4989 ¨.
4990 \layout Paragraph
4991
4992 Archivo 
4993 \family typewriter 
4994 200412010000.6666
4995 \layout Paragraph
4996
4997
4998 \series medium 
4999 Es un archivo de texto el cual pasa el control de Afimonio, pero luego sus
5000  lineas son descartadas por antifraude y dicho error emitido en el antifraude.log
5001 \layout Paragraph
5002
5003 Archivo 
5004 \family typewriter 
5005 200223.1234
5006 \layout Paragraph
5007
5008
5009 \series medium 
5010 El nombre del archivo no es conforme al formato de nombre estipulado en
5011  el TP y el mismo es rechazado de antemano por 
5012 \family typewriter 
5013 \series default 
5014 afimonio
5015 \family default 
5016 \series medium 
5017 .
5018 \layout Section
5019
5020 Apéndice A
5021 \layout Comment
5022
5023 Esto deberia ser una hoja aparte que solo diga 1.6 Apéndice A) y las hojas
5024  posteriores son las páginas 3 en adelante del PDF oficial de la catedra,
5025  sacando la parte de archivos.
5026  3-15 más precisamente es lo que iria.
5027 \the_end