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