1 #LyX 1.3 created this file. For more info see http://www.lyx.org/
11 \paperpackage widemarginsa4
15 \use_numerical_citations 0
16 \paperorientation portrait
19 \paragraph_separation indent
21 \quotes_language english
25 \paperpagestyle default
29 Sistemas Operativos (75.08)
50 Leandro Lucarella (77891)
52 Ricardo Markiewicz (78226)
55 26 de Octubre del 2004
59 \begin_inset LatexCommand \tableofcontents{}
66 Desarollo e Implementación
69 Hipotesis y Aclaraciones
72 El programa en su totalidad va a ser ejecutado por un único usuario, una
73 configuración diferente es posible pero queda en manos del administrador.
76 En los archivos de llamada se valida que sean números, y para validar la
77 fecha no se tiene en cuenta casos particulares como el 29, 30, 31 de febrero.
80 Todos los meses pueden tener 31 días.
83 Aficonf utiliza números para describir las acciones Nuevo y Buscar.
84 La opción Borrar es ofrecida requiriendo un número de ID a borrar dependiendo
85 de los resultados de la búsqueda, y dando una opción (-1) para cancelar
89 El instalador utiliza el archivo
93 , situado en el directorio
97 , para determinar que componentes se encuentran instalados.
98 Internamente, en base a la información de paths proporcionada por este
99 archivo, busca su los binarios realmente se encuentran en el OS, y en caso
100 contrario permite volver a reinstalarlo/s.
104 \begin_inset LatexCommand \label{sec:Problemas-relevantes}
111 Dado que los distintos componentes del sistema se pueden instalar en diferentes
112 paths dentro del OS, creamos el directorio
116 donde se almacenará información acerca de los paths en donde reside cada
117 uno de ellos y otros archivos de intercambio.
120 Así mismo, como los programas pueden ser instalados en directorios distintos,
121 toda la información compartida es guardada en
125 , para ser mas consistentes con la manera de trabajar en Unix.
126 Lo ideal hubiera sido utilizar
130 , pero como no podríamos suponer acceso de
134 preferimos directamente trabajar en el directorio del usuario.
140 Una vez descargados los fuentes (asumiremos que ha descargado el
144 ) solo debe descomprimir el archivo ejecutando el siguiente comando:
147 tar xvzf grupo12.tar.gz
150 Esto creará la siguiente estructura de directorios:
195 +---- afimonio_daemon.sh
204 +---- testcalls.tar.gz
207 Para proceder a la instalación del sistema
211 debe correr el script
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.
227 Comandos Desarrollados
231 \layout Subsubsection
237 \layout Subsubsection
244 Procesa los archivos que se encuentran en el directorio
246 $PATH_ANTIFRAUDE/$DATADIR/aprocesar
250 $PATH_ANTIFRAUDE/$DATADIR/enproce
262 \layout Subsubsection
267 El afimonio genera una salida al archivo
271 la cual contiene información sobre la ejecución del programa.
274 Si un archivo es válido, se añade una línea con el siguiente formato:
277 $fecha $USER afimonio: "Se detecta archivo de llamadas $file"
280 Si el archivo tuviera un nombre inválido, la línea seria la siguiente:
283 $fecha $USER afimonio: "Se rechaza el archivo $file"
293 fecha actual con formato Día-Mes-Año-Hora:Minuto.
300 nombre de usuario que ejecuto el script.
307 nombre del archivo que se procesó.
308 \layout Subsubsection
310 Ejemplos de invocación
318 Corre el programa en primer plano.
326 Corre el programa en segundo plano, evitando que se cierre al morir el padre
327 desasociándolo de la terminal.
328 La salida del programa queda en el archivo
332 a menos que se redirija a otro archivo.
333 \layout Subsubsection
343 BASE_DIR=$HOME/.antifraude
348 # uso las funciones de util.sh
352 "$HOME/.antifraude/util.sh"
356 "$HOME/.antifraude/conf/afimonio.conf"
360 "$HOME/.antifraude/conf/antifraude.conf"
365 # Es llamada por los trap para deslockear el afimonio
380 # filtra el nombre del archivo pasado por parametro sacandole
383 # todos los caracteres que no sean numeros
389 date=`echo $1 | cut -d "." -f 1`
392 central=`echo $1 | cut -d "." -f 2`
395 validar_solo_numeros "$date"
398 if [ "$?" -ne 0 ]; then
410 validar_rango "$mes" "1" "12"
413 if [ "$?" -ne 0 ]; then
425 validar_rango "$dia" "1" "31"
428 if [ "$?" -ne 0 ]; then
440 validar_rango "$hora" "0" "23"
443 if [ "$?" -ne 0 ]; then
455 validar_rango "$min" "0" "59"
458 if [ "$?" -ne 0 ]; then
467 validar_solo_numeros "$central"
470 if [ "$?" -ne 0 ]; then
485 #--------------------MAIN SCRIPT----------------------
488 # Recupero las rutas a todos los directorios y archivos
491 # que necesito del antifraude
494 DATADIR=$ANTI_DATADIR
497 SOURCEDIR=$DATADIR/aprocesar/
500 ACEPTDIR=$DATADIR/enproceso/
503 REJECTDIR=$DATADIR/rechazadas/
515 LOGNAME=$AFIM_LOGFILE
518 LOGFILE=$LOGDIR/$LOGNAME
521 # Capturo señales para salir bien (liberando el lock)
533 lock "afimonio" || die "No se puede correr, hay otra
538 instancia corriendo o no se puede crear el lock file!"
541 # Comienza el ciclo infinito que mueve los archivos
550 for file in `ls $SOURCEDIR` ; do
559 if [ "$?" -eq 0 ]; then
562 mv "$SOURCEDIR$file" "$ACEPTDIR"
565 fecha=$(date +%d/%m/%Y-%H:%M)
568 echo "$fecha $USER afimonio:
575 "archivo de llamadas $file
583 mv "$SOURCEDIR$file" "$REJECTDIR"
586 fecha=$(date +%d/%m/%Y-%H:%M)
589 echo "$fecha $USER afimonio:
604 clean_log "$LOGFILE" "$AFIM_LOGSIZE"
610 # me fijo si el antifraude esta corriendo y si no lo esta
616 if [ -n $files ] && ! is_lock "antifraude.pl"; then
619 $BINDIR/antifraude.pl &
632 \layout Subsubsection
638 \layout Subsubsection
643 Procesa los archivos de llamadas que encuentre en el momento de invocación
646 $PATH_ANTIFRAUDE/$DATADIR/enproceso
655 será quien alimentará al
661 con dichos archivos, no obstante se lo puede alimentar con archivos de
662 llamadas en forma manual, situándolos en el directorio anteriormente descripto.
665 Este comando, en el momento de invocacion genera y guarda internamente un
666 listado de los archivos de llamadas presences en el directorio
670 , ordenándolos por fecha (establecida en el nombre del archivo) en forma
672 Dado que utiliza durante toda su ejecución esta lista interna, el
678 puede alimentar al directorio
682 con nuevos archivos mientras el
688 corre, pero los mismos no serán tenidos en cuenta (esto es, procesados),
689 hasta la próxima invocación del comando.
690 \layout Subsubsection
699 En este archivo se guarda información del procesamiento de los registros,
700 advertencias provocados por registros no validos y alarmas emitidas por
701 registros que cumplen con un umbral.
708 En este archivo se guarda información de las alarmas provocadas por registros
709 en los archivos de llamadas, que hayan cumplido un umbral determinado del
715 \layout Subsubsection
717 Ejemplos de invocación
725 El programa procesa las llamadas
729 como indica el enunciado en primer plano.
745 Ídem anterior pero procesa en segundo plano.
746 \layout Subsubsection
757 if ( -e "$ENV{'HOME'}/.antifraude/lock/antifraude.pid" ) {
760 # Lock file encontrado
781 unlink ("$ENV{'HOME'}/.antifraude/lock/antifraude.pid");
793 local $lfile = "$ENV{'HOME'}/.antifraude/lock/antifraude.pid";
796 open(LOCKFILE,">>$lfile");
817 # Comparador de fecha para los archivos de llamada
823 ($year1,$mon1,$day1,$hr1,$min1) =
826 $a =~ /([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/;
829 ($year2,$mon2,$day2,$hr2,$min2) =
832 $b =~ /([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/;
841 if ($year1 > $year2) { return 1; }
844 elsif ($year1 < $year2) { return -1; }
850 if ($mon1 > $mon2) { return 1; }
853 elsif ($mon1 < $mon2) { return -1; }
856 # Calculo minutos de lo restante
859 $totalmin1 = ($day1 * 24 * 60) + ($hr1 * 60) + $min1;
862 $totalmin2 = ($day2 * 24 * 60) + ($hr2 * 60) + $min2;
865 if ($totalmin1 > $totalmin2) { return 1; }
868 elsif ($totalmin1 < $totalmin2) { return -1; }
877 # Devuelve un listado de archivos de llamada y ordenado por fecha ASC
883 # Obtengo listado de archivos de llamadas y lo ordeno por fecha
886 opendir($DIR,"$CONFDATA{datadir}/enproceso")
889 or die 'Could not open dir';
892 # Valido solo fisicamente, lo logico ya valido afimonio..
895 @files = grep {/[0-9]{12}
900 && -f "$CONFDATA{datadir}/enproceso/$_"} readdir($DIR);
903 @sortedfiles = sort byDate @files;
915 # Levanta una variable del archivo AFINSTAL.CONF
921 $CONFIGFILE = shift(@_);
924 my $linenumber = shift(@_);
930 or die "No se pudo abrir el archivo $CONFIGFILE";
933 do { $line = <CONFIGFILE> } until $.
943 ($confvar = $line) =~ s/"(.*)"$/$1/;
946 $confvar =~ s/^.*=//;
955 # Agrega un log entry al logfile del antifraude.pl
961 my $logentry = shift(@_);
964 my $consoleout = shift(@_);
967 my $log = "$CONFDATA{logdir}/$CONFDATA{logfile}";
970 # Fetch date and Format it
973 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
999 $year += 1900; ++$mon;
1002 $user = "$ENV{USER}";
1005 $commonstring = "$mday/$mon/$year-$hour:$min $user antifraude:";
1011 open(LOGFILE,">>$log")
1014 or die "No se pudo abrir el archivo de log";
1020 print LOGFILE "$commonstring
1029 $filesize = tell(LOGFILE);
1035 # Chequeo el logsize y su lo supero me quedo con 100 lineas
1038 if ($filesize > $CONFDATA{logsize})
1044 open(LOGFILE,"+<$log");
1047 do ($line = <LOGFILE>) until $.
1051 truncate(LOGFILE,tell(LOGFILE));
1060 if ($consoleout) { print("$logentry
1071 my $callreg = shift(@_);
1074 my $numreg = shift(@_);
1077 logEntry("El siguiente registro de llamada tiene format ".
1085 print("Warning: El registro de llamada $numreg tiene ".
1102 local(*callfields) = $_[0];
1105 my $callsfile = $_[1];
1108 my $matchedUmbral = 0;
1114 while (($i <= $#UMBRALES) && ($matchedUmbral == 0)) {
1117 $umbral = $UMBRALES[$i];
1123 ($regid,$phoneline,$oridest,$type,$state)
1126 = split(';',$umbral);
1129 if (($state eq 'A') && ($callfields[0] == $phoneline)
1132 && ($callfields[4] eq $type)) {
1135 # Si es Saliente y coincide el Destino con el
1138 # Ori/Dest del umbral
1144 && ($callfields[5] eq $oridest)) {
1147 $matchedUmbral = $regid;
1156 && ($callfields[6] eq $oridest)) {
1159 $matchedUmbral = $regid;
1174 # Si se matcheo un umbral, grabo una alarma y aviso por consola
1177 if ($matchedUmbral > 0) {
1180 # Obtengo algunos datos
1183 ($central = $callsfile) =~ s/^.*
1188 $user = "$ENV{USER}";
1191 # Fetch date and Format it
1194 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
1200 $year += 1900; ++$mon;
1228 $user = "$ENV{USER}";
1231 $date = "${year}${mon}${mday}";
1234 $time = "${hour}${min}${sec}";
1237 # Preparo el registro de alarma
1240 $alarmEntry = "$callfields[7];$central;$callfields[0];".
1243 "$callfields[1];$regid;$callfields[2];".
1246 "$callfields[3];$user;$date;$time";
1249 # Grabamos el registro en el archivo de alarmas
1252 $alarmlog = "$CONFDATA{datadir}/alarmas/alarmas.txt";
1255 open(ALARMFILE,">>$alarmlog")
1258 or die 'No se pudo abrir el archivo de alarmas';
1261 seek(ALARMFILE,0,2);
1264 print ALARMFILE "$alarmEntry
1272 # Logeo por consola y logfile que hubo una alarma
1275 logEntry("Alarma: Se ha matcheado el registro procesado"
1278 ." con el umbral nro $matchedUmbral",1);
1287 # --------- MAIN CODE -------- #
1293 if (is_lock()) { exit 1; }
1299 # Defino some GLOBALS
1302 $CONFDIR = "$ENV{'HOME'}/.antifraude";
1305 $CONFDATA{logdir} = getConfVar("$CONFDIR/conf/antifraude.conf",2);
1308 $CONFDATA{logfile} = getConfVar("$CONFDIR/conf/antifraude.conf",3);
1311 $CONFDATA{logsize} = getConfVar("$CONFDIR/conf/antifraude.conf",4);
1314 $CONFDATA{datadir} = getConfVar("$CONFDIR/conf/antifraude.conf",5);
1317 # Cargo los UMBRALES en memoria
1320 open(PARAMFILE,"$CONFDIR/umbrales.param") or die "No se pudo abrir el "
1323 ."archivo de umbrales";
1326 @UMBRALES = <PARAMFILE>;
1332 # Proceso los archivos de llamadas
1335 @archivos = getCallFiles();
1338 FILE: foreach $filename (@archivos) {
1344 $CALLFILE = "$CONFDATA{datadir}/enproceso/$filename";
1347 logEntry("Inicio proceso de: $filename",1);
1353 or ((warn "No se pudo abrir archivo $filename"),next FILE);
1356 REG: foreach $callreg (<CALLFILE>) {
1359 logEntry("Procesando Reg: $regnum | Archivo: $filename",1);
1365 $fieldcount = split(';',$callreg);
1371 # Si no tengo 8 campos exactamente, invalido
1374 if ($fieldcount != 8)
1380 badCall($callreg,$regnum);
1389 # Si la linea no es un numero, invalido
1401 if (!($fields[0] =~ /^
1409 badCall($callreg,$regnum);
1418 # Si tipo llamada ! E|S o no se informa Origen
1421 # o Destino, invalido
1424 if (($fields[4] ne 'E') && ($fields[4] ne 'S')) {
1427 badCall($callreg,$regnum); next REG;
1433 if (($fields[4] eq 'E') && ($fields[6] eq "")) {
1436 badCall($callreg,$regnum); next REG;
1442 if (($fields[4] eq 'S') && ($fields[5] eq "")) {
1445 badCall($callreg,$regnum); next REG;
1451 # Ya pase todas las validaciones, ahora busco si
1457 checkUmbrales(*fields,$filename);
1460 } continue { ++$regnum }
1466 # La muevo al directorio de procesadas
1469 rename $CALLFILE,"$CONFDATA{datadir}/procesadas/$filename";
1472 logEntry("Fin proceso de: $filename",1);
1485 \layout Subsubsection
1491 \layout Subsubsection
1496 El comando utiliza los archivos
1507 \layout Subsubsection
1516 de ser solicitado por el usuario, ya sea por la alta o baja de un umbral.
1517 \layout Subsubsection
1519 Ejemplos de invocación
1527 Realiza lo pedido en el enunciado.
1528 \layout Subsubsection
1547 BASE_DIR="$HOME/.antifraude"
1556 "$BASE_DIR/conf/aficonf.conf"
1571 LOGNAME=$AFIC_LOGFILE
1574 LOGFILE=$LOGDIR/$LOGNAME
1579 #Valida que exista el pais
1585 # $1 = Descripcion a buscar
1588 # $2 = Variable donde guardar el código del Pais
1591 # en caso de existir
1597 EXISTE=`cat "$BASE_DIR/oridesti.txt"
1602 | egrep "^[A-Z]*;$1" | cut -d ';' -f 1`;
1605 if [ "$EXISTE" != "" ] ; then
1608 #Exite!, debo gaurdar el código
1628 poner_estado_umbral () {
1637 FECHA=`date +"%Y%m%d"`
1640 HORA=`date +"%H%M%S"`
1646 if [ "$ESTADO" != "A" ] && [ "$ESTADO" != "I" ]
1660 (;[^;]*;[^;]*;[^;]*;
1673 1I;$USER;$FECHA;$HORA/"
1678 "$BASE_DIR/umbrales.param"`
1681 echo "$SALIDA" > "$BASE_DIR/umbrales.param"
1684 put_log "$LOGFILE" "aficonf"
1689 "Se ha cambiado el estado de umbral $ID a $ESTADO"
1723 preguntar "Su opción" "123" $1
1734 EXISTE=`cat "$BASE_DIR/umbrales.param" | egrep "$1"`;
1737 if [ "$EXISTE" == "" ] ; then
1749 #Ya existe un umbral!
1761 buscar_id_umbral () {
1764 ID=`cat "$BASE_DIR/umbrales.id"`;
1773 echo "$ID" > "$BASE_DIR/umbrales.id"
1785 while [ $DONE == 0 ] ; do
1788 leer "Número de línea" "" LINEA
1794 if ! validar_solo_numeros "$LINEA" ; then
1797 echo "EL NUMERO TE LINEA SOLO DEBE"
1814 if [ "$LINEA" == "" ] ; then
1826 preguntar "Tipo de llamada" "ES" TIPO
1835 while [ $DONE == 0 ] ; do
1838 leer "Pais (descripción)" "" PAIS
1841 if ! existe_pais "$PAIS" CODIGO ; then
1844 echo "No existe el país de descrición '$PAIS'"
1856 if [ "$PAIS" == "" ] ; then
1868 echo "El código de '$PAIS' es '$CODIGO'"
1874 # Verifico que el umbral no exista
1877 FECHA=`date +"%Y%m%d"`
1880 HORA=`date +"%H%M%S"`
1883 UMBRAL="$LINEA;$PAIS;$TIPO;A;*;*;*"
1886 if existe_umbral "$UMBRAL" ; then
1889 echo "Ya existe un umbral con los datos ingresados."
1895 put_log "$LOGFILE" "aficonf"
1900 "Se trató de insertar un umbral repetido ($UMBRAL)"
1923 UMBRAL="$ID;$LINEA;$PAIS;$TIPO;A;$USER;$FECHA;$HORA"
1929 echo "$UMBRAL" >> "$BASE_DIR/umbrales.param"
1935 echo "El Umbral fue grabado con éxito"
1946 "aficonf" "Se inserto un nuevo umbral ($UMBRAL)"
1963 while [ $DONE == 0 ] ; do
1966 leer "Número de línea" "" LINEA
1972 if ! validar_solo_numeros "$LINEA" ; then
1975 echo "EL NUMERO TE LINEA SOLO DEBE"
1992 if [ "$LINEA" == "" ] ; then
2004 DATOS=`cat "$BASE_DIR/umbrales.param"
2009 | grep "[0-9]*;$LINEA;[A-Z]*;[E,S];A"`
2012 if [ "$DATOS" == "" ] ; then
2018 echo "No se han encontrado Umbrales activos"
2023 "para la linea $LINEA."
2026 echo "Abortando ..."
2032 put_log "$LOGFILE" "aficonf"
2037 "No se han encontrado umbrales para la línea $LINEA"
2051 printf "%3s %2s %1s %1s %10s%8s %6s
2058 "ID" "Ciudad" "Tipo" "Estado" "Usuario" "Fecha" "Hora"
2064 for i in $DATOS ; do
2067 ID=`echo "$i" | cut -d ';' -f 1`
2070 CIUDAD=`echo "$i" | cut -d ';' -f 3`
2073 TIPO=`echo "$i" | cut -d ';' -f 4`
2076 ESTADO=`echo "$i" | cut -d ';' -f 5`
2079 USUARIO=`echo "$i" | cut -d ';' -f 6`
2082 FECHA=`echo "$i" | cut -d ';' -f 7`
2085 HORA=`echo "$i" | cut -d ';' -f 8`
2093 "%3s %2s %1s %1s %10s %8s %6s
2100 "$ID" "$CIUDAD" "$TIPO" "$ESTADO" "$USUARIO"
2108 OPCIONES="$OPCIONES $ID"
2114 preguntar "Cual desea borrar (-1 para salir)" "$OPCIONES" OPT
2117 if [ "$OPT" = "-1" ] ; then
2126 echo "Borrando el registro $OPT ..."
2129 poner_estado_umbral "$OPT" "I"
2132 put_log "$LOGFILE" "aficonf"
2137 "No se ha eliminado elumbral de ID $OPT" "$AFIC_LOGSIZE"
2146 echo "El Umbral fue eliminado con éxito"
2157 # No permito correr 2 instancias de AFICONF
2160 if is_lock "aficonf" ; then
2166 echo "Aficonf está corriendo actualmente."
2172 put_log "$LOGFILE" "aficonf"
2177 "Se ha intentado ejecutar aficonf cuando este estaba corriendo"
2201 while [ "$OPT" != "3" ] ; do
2226 \layout Subsubsection
2231 Auxiliar, escrito en bash.
2234 Sería equivalente a una biblioteca compartida, no es exactamente un comando
2235 que se pueda ejecutar directamente sino que se incluye desde otros comandos.
2236 \layout Subsubsection
2238 Justificación de su uso
2241 Es un archivo con varias funciones generales, sirve para no duplicar código
2242 común entre los varios scripts de bash.
2243 \layout Subsubsection
2248 Al ser de propósito general, no tiene ningún archivo de input específico,
2249 aunque hay funciones que utilizan archivos, no se describen aquí sino en
2250 los comandos que usan este archivo.
2251 \layout Subsubsection
2257 \layout Subsubsection
2262 Al no ser un comando ejecutable, no aplica.
2263 \layout Subsubsection
2269 \layout Subsubsection
2271 Ejemplos de invocación
2275 \layout Subsubsection
2286 # Los scrips que incluyan deben definir BASE_DIR
2289 # antes de incluirme!
2294 LOCK_DIR="$BASE_DIR/lock"
2297 # Lee del teclado un valor
2306 # $1 = Leyeda a mostrar de pregunta
2309 # $2 = Valor default por si el usuario no ingresa nada
2312 # $3 = Variable donde guardar el valor ingresado (o el default)
2327 read -p "$MSG [$DEFAULT] : " ALGO
2330 # Si el usuario no ingresa nada
2333 # nos quedamos con el valor default
2336 if [ ! -z "$ALGO" ] ; then
2356 # Realiza una pregunta al usuario
2365 # $1 = Leyeda a mostrar de preguntar
2368 # $2 = string con las opciones validas
2371 # $3 = Variable donde guardar el valor ingresado
2374 # $4 = Valor por defecto si se apreta ENTER
2395 read -p "$PREGUNTA [$OPCIONES]: " RTA
2398 # Si me pasaron un default y la respuesta es vacía
2401 if [ -n "$DEFAULT" -a -z "$RTA" ]; then
2416 # Escapeo el caracter '-' por '
2421 RTA=$(echo $RTA | sed "s/
2432 IS_OK=`echo "$OPCIONES" | grep "$RTA"`
2435 if [ ! -z "$IS_OK" ] && [ ! -z "$RTA" ] ; then
2455 validar_solo_numeros () {
2458 TEST=`echo "$1" | sed "s/[0-9]*//g"`
2461 if [ "$TEST" == "" ] ; then
2464 #Ok, son solo numeros
2473 # ups, hay algo que no es un numero
2484 # Crea un archivo de lock para un script
2487 # Devuelve: 0 si ok, 1 si ya esta lockeado, 2 si no pudo crear lock.
2490 # Uso: lock programa
2496 # si ya esta loqueado, no lo vuelvo a crear
2499 is_lock "$1" && return 1
2502 # Si no puedo escribir en el dir de lock, da error
2505 [ -w "$LOCK_DIR" ] || return 2
2508 echo $$ > "$LOCK_DIR/$1.pid"
2519 # Desbloquea el script
2522 # Uso: unlock programa
2528 rm -rf "$LOCK_DIR/$1.pid"
2537 # Consulta si un script esta lockeado
2540 # Uso: is_lock programa
2546 if [ -e "$LOCK_DIR/$1.pid" ] ; then
2549 # Lock file encontrado!
2569 # Obtiene el pid de un programa lockeado
2572 # Uso: lock_pid programa
2581 is_lock "$1" && cat "$LOCK_DIR/$1.pid"
2589 # Verifica que un valor este entre otros 2
2592 # $1 pertecezca a [$2,$3]
2595 # $1 Numero a validar
2607 if [ "$1" -ge "$2" ] && [ "$1" -le "$3" ]; then
2627 # Muestra mensaje y sale con código de error
2630 # Uso: die mensaje [código de error = 1]
2650 # Imprime mensaje por salida de error
2653 # Uso: perr mensajes
2670 # Pone un MSG en el log
2676 # $1 = Archivo del log
2685 # $4 = Tamaño maximo
2691 fecha=$(date +%d/%m/%Y-%H:%M)
2694 echo "$fecha $USER $2:
2709 # Trunca un archivo de log si pasa el tamaño máximo.
2712 # Uso: clean_log log_filename max_log_size_bytes
2730 tmp=`dirname "$LOGFILE"`"/`basename $0`.$$.temp"
2733 # Verifico que el logfile no se pase del tamaño maximo
2736 tam=`stat -c '%s' "$LOGFILE"`
2739 # Si se paso del maximo dejo las ultimas 100 lineas
2742 if [ "$tam" -ge "$LOGSIZE" ]; then
2745 tail -n 100 "$LOGFILE" > "$tmp"
2748 mv "$tmp" "$LOGFILE"
2758 \layout Subsubsection
2763 Auxiliar, escrito en
2768 \layout Subsubsection
2770 Justificación de su uso
2773 Sirve para realizar lotes de prueba con gran cantidad de entradas y variaciones
2774 de forma rápida y cómoda.
2775 \layout Subsubsection
2780 Ninguno, toma los datos necesarios por la entrada estándar, aunque es común
2781 redireccionarle el archivo
2786 De la entrada estándar toma los códigos de origen y destino.
2787 Cada código debe encontrarse en una línea y al comienzo de ésta.
2788 Sólo toma los 2 primeros caracteres, e ignora el resto de la línea (para
2789 compatibilidad con el archivo oridesti.txt).
2790 \layout Subsubsection
2799 (especificada por el usuario) de archivos con nombre y formato de
2803 en el directorio actual.
2804 Tanto el nombre como la cantidad de líneas y su contenido es generado aleatoria
2805 mente (respetando el formato mencionado y con valores racionales).
2806 \layout Subsubsection
2811 El comando toma 3 parámetros
2818 ./callgen [cant_archivos [min_lineas [max_lineas]]]
2822 \begin_inset Tabular
2823 <lyxtabular version="3" rows="4" columns="3">
2825 <column alignment="center" valignment="top" leftline="true" width="0">
2826 <column alignment="center" valignment="top" leftline="true" width="0">
2827 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
2828 <row topline="true" bottomline="true">
2829 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2839 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2849 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2860 <row topline="true">
2861 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2869 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2874 Cantidad de archivos a generar
2877 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2886 <row topline="true">
2887 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2895 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2900 Mínima cantidad de lineas en un archivo
2903 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2912 <row topline="true" bottomline="true">
2913 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2921 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2926 Máxima cantidad de lineas en un archivo
2929 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2943 \layout Subsubsection
2948 Pueden cambiarse los valores por defecto editando el código fuente del comando,
2949 en la sección de configuración que se encuentra al comienzo del mismo.
2950 También puede cambiarse el mínimo y máximo año (por defecto 1999 y 2004)
2951 y el mínimo y máximo código de central (por defecto 0000 y 9999).
2952 \layout Subsubsection
2954 Ejemplos de invocación
2964 Se escriben por entrada estándar los códigos de origen/destino, se presiona
2971 para cerrar el descriptor de archivo de la entrada estándar y se generan
2972 10 archivos con entre 1000 y 5000 líneas cada uno.
2977 ./callgen 2 < oridesti.txt
2982 Genera 2 archivos con entre 1000 y 5000 líneas cada uno tomando los códigos
2983 de origen/destino del archivo
2992 ./callgen 5 10 < oridesti.txt
2997 Genera 5 archivos con entre 10 y 5000 líneas cada uno tomando los códigos
2998 de origen/destino del archivo
3007 ./callgen 50 10 50 < oridesti.txt
3012 Genera 50 archivos con entre 10 y 50 líneas cada uno tomando los códigos
3013 de origen/destino del archivo
3018 \layout Subsubsection
3029 # Generador aleatorio de archivos de llamadas
3035 # Leandro Lucarella - dom oct 17 18:37:05 ART 2004
3041 # Bajo licencia GPL.
3050 # ./callgen [cant_archivos [min_lineas [max_lineas]]]
3056 # cant_archivos Cantidad de archivos a generar.
3059 # min_lines Mínima cantidad de líneas que puede tener un archivo.
3062 # max_lines Máxima cantidad de líneas que puede tener un archivo.
3068 # Por la entrada estándar debe recibir los códigos de países para
3071 # origen y/o destino.
3072 Toma los dos primeros caracteres por línea como
3075 # un código, ignorando el resto, de manera que se puede hacer:
3078 # cat oridesti.txt | ./gencall
3107 #{{{ Variables globales
3110 our @codes; # Códigos de origen/destino
3123 #{{{ load_codes() - Obtiene códigos de origen/destino de la entrada
3138 push(@codes, substr($_, 0, 2)) while (<STDIN>);
3149 #{{{ get_rnd_code() - Obtiene un códigos de origen/destino al azar
3152 # Uso: get_rnd_code()
3164 return $codes[rnd($cant-1)];
3175 #{{{ rnd() - Genera números aleatorios
3178 # Uso: rnd(MAX) - genera número de 0 a MAX (inclusive)
3181 # rnd(MIN, MAX) - genera número de MIN a MAX (inclusive)
3187 # Nota: respeta el tamaño del campo más chico, es decir, si se usa
3190 # rnd 01 250, el número siempre tendrá al menos 2 dígitos
3193 # rellenados con ceros, como 04, 28, 123, 08, etc
3202 my ($ini, $fin) = @_;
3220 return sprintf('%0'.length($ini).'d', $ini + rand()
3223 * ($fin - $ini + 1));
3234 #{{{ Tipos de campos
3237 sub aaaa() { return rnd($MIN_ANIO, $MAX_ANIO); } # año
3240 sub mm() { return rnd("01", 12); } # mes
3243 sub dd() { return rnd("01", 28); } # día
3246 sub hh() { return rnd("00", 23); } # hora
3249 sub MM() { return rnd("00", 59); } # minutos
3252 # código de central telefónica
3255 sub DDDD() { return rnd($MIN_COD, $MAX_COD); }
3258 # caracter aleatorio
3261 sub char() { return chr(rnd(65, 90)); }
3269 #{{{ line() - Genera una línea del archivo
3278 my $f_linea = rnd(100000, 99999999);
3281 my $f_minutos = rnd(1, 150);
3284 my $f_fecha = aaaa().mm().dd();
3287 my $f_hora = dd().hh().MM();
3290 my ($f_tipo, $f_orig, $f_dest) = ('', '', '');
3302 $f_orig = get_rnd_code();
3317 $f_dest = get_rnd_code();
3323 my $f_prest = char().char().char().char().char().
3326 char().char().char().char();
3329 return "$f_linea;$f_minutos;$f_fecha;$f_hora;".
3332 "$f_tipo;$f_dest;$f_orig;$f_prest";
3343 #{{{ gen() - Genera un archivo con entre MIN y MAX llamadas
3346 # Uso: gen(MIN, MAX)
3355 my ($ini, $fin) = @_;
3358 my $file = aaaa().mm().dd().hh().MM().'.'.DDDD();
3361 # Mientras exista uno, buscamos un nuevo nombre.
3364 $file = aaaa().mm().dd().hh().MM().'.'.DDDD()
3373 or die("No puedo abrir el archivo $file!
3378 for (my $i = rnd($ini, $fin); $i > 0; --$i)
3411 my $cant = $ARGV[0] ? $ARGV[0] : $CANT_ARCHS;
3417 for (my $i = 0; $i < $cant; ++$i)
3423 gen($ARGV[1] ? $ARGV[1] : $MIN_LINEAS,
3426 $ARGV[2] ? $ARGV[2] : $MAX_LINEAS);
3437 # vim: set fdm=marker ts=4 sw=4 :
3443 Archivos del Enunciado
3444 \layout Subsubsection
3451 Los archivos de log generados por los distintos comandos, presentan todos
3452 la misma estructura de registro que se detalla a continuación:
3454 YYYYMMDD-hhmm $usuario $comando: ¨$Mensaje¨
3455 \layout Subsubsection
3462 En este archivo se tienen los origenes y destinos en base a los cuales hemos
3463 generados los archivos de llamada y los umbrales.
3467 \begin_inset Float table
3476 Estructura de oridesti.txt
3480 \begin_inset Tabular
3481 <lyxtabular version="3" rows="2" columns="2">
3483 <column alignment="center" valignment="top" leftline="true" width="0">
3484 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
3485 <row topline="true" bottomline="true">
3486 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3494 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3503 <row topline="true" bottomline="true">
3504 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3512 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3529 \layout Subsubsection
3536 Este archivo posee los umbrales de llamadas de los cuales se valdra el antifraud
3537 e.pl para emitir o no alarmas durante el proceso de los archivos de llamadas.
3541 \begin_inset Float table
3550 Estructura de umbrales.param
3554 \begin_inset Tabular
3555 <lyxtabular version="3" rows="8" columns="2">
3557 <column alignment="center" valignment="top" leftline="true" width="0">
3558 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
3559 <row topline="true" bottomline="true">
3560 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3568 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3573 N caracteres, número secuencial >= 1
3577 <row topline="true">
3578 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3586 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3591 N caracteres, Numérico
3595 <row topline="true">
3596 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3604 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3609 2 caracteres, valores posibles segun oridesti.txt
3613 <row topline="true">
3614 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3622 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3627 1 caracter, E = Entrante, S = Salida
3631 <row topline="true">
3632 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3640 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3645 1 caracter, A = Activo, I = Inactivo
3649 <row topline="true">
3650 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3658 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3663 N caracteres = login del user que graba el reg
3667 <row topline="true">
3668 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3676 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3681 8 caracteres, formato aaaammdd
3685 <row topline="true" bottomline="true">
3686 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3694 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3699 6 caracteres, formato hhmmss, hora actual
3711 \layout Subsubsection
3715 <archivo de llamada>
3718 Estos archivos son los que el antifraude procesará en busca de matchs contra
3723 \begin_inset Float table
3732 Estructura de un archivo de llamadas
3736 \begin_inset Tabular
3737 <lyxtabular version="3" rows="8" columns="2">
3739 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
3740 <column alignment="center" valignment="top" rightline="true" width="0">
3741 <row topline="true" bottomline="true">
3742 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3750 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3755 N caracteres, Numérico
3759 <row topline="true">
3760 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3768 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3773 N caracteres, Numérico
3777 <row topline="true">
3778 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3786 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3791 8 caracteres, formato aaaammdd
3795 <row topline="true">
3796 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3804 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3809 6 caracteres, formato hhmmss
3813 <row topline="true">
3814 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3822 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3827 1 carácter, E = Entrante, S = Salida
3831 <row topline="true">
3832 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3840 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3845 2 caracteres, solo informado en llamadas salientes
3849 <row topline="true">
3850 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3858 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3863 2 caracteres, solo informado en llamadas entrantes
3867 <row topline="true">
3868 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3876 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3893 \layout Subsubsection
3900 En este archivo el antifraude irá dejando registro de las alarmas emitidas
3901 en base a registros que han tenido un match contra los umbrales.
3905 \begin_inset Float table
3914 Estructura de alarmas.txt
3918 \begin_inset Tabular
3919 <lyxtabular version="3" rows="10" columns="2">
3921 <column alignment="center" valignment="top" leftline="true" width="0">
3922 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
3923 <row topline="true" bottomline="true">
3924 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3932 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3937 N caracteres, campo 'Prestadora', archivo de llamadas
3941 <row topline="true">
3942 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3950 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3955 4 caracteres, obtenido a partir del archivo de llamadas
3959 <row topline="true">
3960 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3968 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3973 N caracteres, campo 'Numero de Linea' , archivo de llamadas
3977 <row topline="true">
3978 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3986 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3991 N caracteres, campo 'Cant de Minutos', archivo de llamadas
3995 <row topline="true">
3996 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4004 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4009 N caracteres, campo 'Id de registro', umbrales.param
4013 <row topline="true">
4014 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4022 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4027 8 caracteres, campo 'Fecha de llamada', archivo de llamadas
4031 <row topline="true">
4032 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4040 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4045 6 caracteres, campo 'Hora de llamada', archivo de llamadas
4049 <row topline="true">
4050 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4058 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4063 N caracteres, siempre login del usuario que graba el reg
4067 <row topline="true">
4068 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4076 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4081 8 caracteres, formato aaaammdd, fecha actual
4085 <row topline="true" bottomline="true">
4086 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4094 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4099 6 caracteres formato hhmmss, hora actual
4114 \layout Subsubsection
4121 El archivo de configuración
4123 ~/.antifraude/conf/afimonio.conf
4125 almacena las rutas a los directorios necesarios para la ejecución del script
4130 y la ruta, nombre, y tamaño máximo del archivo de log.
4132 \layout Subsubsection
4139 El archivo de configuración
4141 ~/.antifraude/conf/antifraude.conf
4143 almacena las rutas a los directorios necesarios para la ejecución del script
4148 y la ruta, nombre, y tamaño máximo del archivo de log.
4150 \layout Subsubsection
4157 El archivo de configuración
4159 ~/.antifraude/conf/aficonf.conf
4161 almacena las rutas a los directorios necesarios para la ejecución del script
4166 y la ruta, nombre, y tamaño máximo del archivo de log.
4170 Estos archivos fueron creados para que los diferentes scripts tengan un
4171 lugar común donde buscar esa información para salvar el problema comentado
4173 \begin_inset LatexCommand \vref{sec:Problemas-relevantes}
4180 Set de Prueba (testcalls.tar.gz)
4183 Para probar el comportamiento del sistema, se preparo un set de prueba distribui
4188 , situado en el directorio
4192 , del paquete de instalación.
4193 El set de prueba se copia automáticamente en el momento en que se instale
4200 , dejando el escenario listo para procesarlos en el momento en que sea arrancado
4208 o bien ejecutando el
4217 Este set de prueba consta de
4221 , que se detallan a continuación:
4224 14 archivos de llamadas generados con el
4230 , con entre 1000 y 5000 registros cada uno, y fecha en el rango año 1999
4234 1 archivo de llamadas con registros válidos y otros no válidos.
4237 1 archivo con nombre válido según el formato YYYYMMDDhhmm.nnnn, pero con
4238 contenido inválido, el cual es rechazado por
4247 1 archivo con nombre no válido rechazado en instancia previa por
4256 Se describen en la siguiente tabla, los archivos y registros que disparan
4257 alarmas o tienen close matches contra los 25 umbrales distribuidos en el
4258 paquete de instalación, vía el umbrales.param:
4262 \begin_inset Float table
4271 Archivos y Registros que disparan alarmas
4275 \begin_inset Tabular
4276 <lyxtabular version="3" rows="24" columns="3">
4278 <column alignment="center" valignment="top" leftline="true" width="0">
4279 <column alignment="center" valignment="top" leftline="true" width="0">
4280 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
4281 <row topline="true" bottomline="true">
4282 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4292 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4303 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4314 <row topline="true">
4315 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4323 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4331 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4340 <row topline="true">
4341 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4349 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4357 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4366 <row topline="true">
4367 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4375 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4383 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4392 <row topline="true">
4393 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4401 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4409 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4418 <row topline="true">
4419 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4427 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4435 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4444 <row topline="true">
4445 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4453 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4461 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4470 <row topline="true">
4471 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4479 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4487 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4496 <row topline="true">
4497 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4505 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4513 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4522 <row topline="true">
4523 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4531 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4539 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4548 <row topline="true">
4549 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4557 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4565 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4574 <row topline="true">
4575 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4583 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4591 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4600 <row topline="true">
4601 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4609 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4617 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4626 <row topline="true">
4627 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4635 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4643 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4652 <row topline="true">
4653 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4661 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4669 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4678 <row topline="true">
4679 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4687 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4695 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4704 <row topline="true">
4705 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4713 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4721 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4730 <row topline="true">
4731 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4739 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4747 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4756 <row topline="true">
4757 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4765 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4773 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4782 <row topline="true">
4783 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4791 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4799 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4808 <row topline="true">
4809 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4817 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4825 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4830 21 (umbral inactivo => no emite alarma)
4834 <row topline="true">
4835 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4843 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4851 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4856 Close match umbral 22, difiere tipo de llamada
4860 <row topline="true">
4861 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4869 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4877 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4886 <row topline="true" bottomline="true">
4887 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4895 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
4903 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
4908 25 (umbral inactivo => no emite alarma)
4929 Posee registros no válidos detallados a continuación.
4930 Los registros se contabilizan de 0 a N (Línea 1 = Reg 0)
4937 -> Posee un 9no campo
4946 -> Posee un 9no campo
4955 -> Posee un tipo de llamada
4966 -> El número de línea (campo1) no es numérico, es un string
4975 -> Tiene cantidad de campos insuficiente (siete)
4978 Estos registros emitirán errores plasmados en el
4983 Para verificar esto, realizar una búsqueda en el log, sobre el nombre del
4984 archivo, y ubicarse en el sector donde se indica el comienzo del procesamiento
4987 Inicio proceso de: 199908220733.4515
4999 Es un archivo de texto el cual pasa el control de Afimonio, pero luego sus
5000 lineas son descartadas por antifraude y dicho error emitido en el antifraude.log
5010 El nombre del archivo no es conforme al formato de nombre estipulado en
5011 el TP y el mismo es rechazado de antemano por
5023 Esto deberia ser una hoja aparte que solo diga 1.6 Apéndice A) y las hojas
5024 posteriores son las páginas 3 en adelante del PDF oficial de la catedra,
5025 sacando la parte de archivos.
5026 3-15 más precisamente es lo que iria.