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