lunes, 28 de septiembre de 2009

Modificaciones en fichero de configuración

Hemos realizado ciertas modificaciones en nuestro fichero de configuración, concretamente permitimos que el tamaño asignado por el usuario a la política sea un numero infinito de dígitos. Anteriormente tan solo permitiamos una serie de 3 dígitos, con la expresión regular [0-9][0-9][0-9], lo hemos modificado a [0-9]*, que tal y como hemos comentado nos permitirá introducir un número infinito de dígitos.

Debido a esto también necesitamos modificar como se guarda este valor en nuestro array, ya que anteriormente utilizabamos la instrucción substring, que nos devolvia una subcadena con los tres primeros valores de la variable: 010, 346, etc.
Al ya no ser un valor fijo de 3 dígitos necesitamos utilizar la instrucción "match" que nos devolverá la posición del primer caracter que coincida con nuestra expresión regular, en este caso usaremos algo parecido a esto:

_index=match($mystring,/[\%|M|K|G]/)

Esto guardará en nuestra variable "_index" la posición en la que se cumple la expresión regular, con esto podremos realizar la asignacion de subcadenas a nuestro array, para poder trabajar con los datos.

Ejecución shell script desde awk

Tal como comentabamos en el anterior post, debíamos encontrar una forma de ejecutar nuestro shell script desde awk, esta forma es mediante la instrucción "system". Describimos el funcionamiento de esta instrucción con un ejemplo:

system("sh myscript " var1 " texto2 " var3 " " var4)

Nuestro comando de shell "sh myscript" debe ir entrecomillado, ya que es el comando shell que queremos ejecutar, a este le pasaremos ciertos parámetros, tanto cadenas como variables que podrán ser cadenas, números o cualquier otro tipo de datos. Las variables no deberán ir entrecomilladas y tan solo tendremos que escribir el nombre de la variable sin simbolos tipo "$" antes de ellas, el resto de parámetros que pasemos deberán ir entrecomillados. También importante que deberemos tener en cuenta los espacios entre los parámetros, por ello vemos que hay espacios en "sh myscript ", " texto2 ", y que hemos escrito " " para generar un espacio entre las variables var3 y var4.

Una vez que ya hemos descubierto como ejecutar nuestro shell script desde awk, hemos realizado el algoritmo que procesa tal ejecución con los parámetros correspondientes para cada política.

domingo, 27 de septiembre de 2009

Modificando lectura fichero de configuración

Hicimos una primera versión de como leer nuestro fichero de configuración (file.conf) con awk, y la idea inicial era leer cada politica, y pasar esos datos a nuestro shell script, ya que desde awk el propio cuerpo del programa nos realiza una interación, es decir leeriamos la primera política y llamaríamos a nuestro shell script pasándole los datos de esa política, cuando terminase de ejecutar el shell script volveria a awk y este le volveria a pasar una nueva politica, y así hasta el fin de políticas.
Pero la lógica informática que se ha desarrollado durante los últimos años consiste en completar la lectura del fichero de configuración, antes de ejecutar cualquier programa con estos datos, esto tiene sentido en cualquier caso que nuestro fichero de configuración no sea del todo correcto, ya que estaríamos ejerciendo un trabajo inneceseario y tal vez erroneo, de ahí nuestra modificación. Los cambios que hemos realizado procuran que en el cuerpo de awk donde se realiza una iteración automàtica, sirva para almacenar los datos en un array, con estos datos, al final de nuestro programa awk, generamos un bucle anidado que ejecutará tantas veces como políticas existan nuestro shell script y le pasará a este los datos necesarios para su ejecución.

Tras este cambio, solo nos falta encontrar el comando que ejecute nuestro shell script desde awk.

sábado, 26 de septiembre de 2009

Agilizando la ejecución del código

Nos interesa modificar nuestro actual código para que se compruebe fichero a fichero (de cada política) si excede el tamaño que queremos utilizar de la caché.

Tenemos dos posibles soluciones, adecuar parte de nuestro código actual, o hacer unos cambios mas significativos, presentamos ambos pseudocódigos posibles y los analizamos.

Posibilidad 1:
para cada fichero
calcula tamaño archivo
fin_para

para cada fichero
si total < espacio_libre
cachear todos los archivos
sino
si total_archivos+nuevo_archivo < espacio_libre
cachear archivo
sino
salir
fin_si
fin_si
fin_para

Posibilidad 2:

para cada fichero
si total+fichero < espacio_libre
cachear archivo
sino
salir
fin_si
fin_para

Podemos ver que la posibilidad 1 va a tener un tiempo de ejecución de n, donde n^2 serà la entrada de datos, en cambio la posibilidad 2 va a tener un tiempo de ejecución de n.

A parte realizamos pruebas de tiempo en ambos scripts, tanto en los casos en los que "tamaño total de todos los ficheros < espacio libre", como en los casos de "tamaño total de todos los ficheros > espacio libre", y en ambos casos comprobamos que el tiempo de ejeución con la posibilidad 2 es sensiblemente inferior al de la posibilidad 1

domingo, 13 de septiembre de 2009

Programando tarea con crontab

Esta tarea corresponde a una fecha anterior a la creación del post de (creando el fichero de configuración).

Comentar que estuvimos alrededor de dos días haciendo pruebas para conseguir lanzar un script de forma programada desde unix, programandolo para que se ejecutará cada minuto, en el momento en que decidamos cada cuanto se tiene que ejecutar esta tarea se modificarán los parámetros pertinentes del script que crea una tarea programada.

leyendo fichero .conf(2)

Respecto al problema comentado en el anterior post, creo que una forma de solucionarlo es con un array, guardaré todas las politicas en un array y desglosare cada una de mis politicas de una forma facil y rapida en mi array, para que el posterior trabajo sobre los datos guardados en mi array sea más rápido. Por otro lado intentando solucionar el problema de dejar una variable vacia en mi fichero de configuración (file.conf), al no conseguir evitar este problema con expresiones regulares hemos creado unas sentencias if que permitirán que pasen solo las políticas que tengan todas las variables introducidas.

Leyendo fichero .conf

En el anterior post comentamos el que supuestamente será nuestro fichero de configuración, sinó al menos un esbozo de él. Ahora mismo estoy trabajando en como poder leer tal fichero de configuración, y que solo admita las lineas de configuración que cumplan todos los requisitos estipulados, estamos depurando al máximo este código para que no pueda ocurrir ningún tipo de error, y que tan solo lea las líneas que sean totalmente correctas respecto a nuestros criterios. Una vez resuelto esto, el problema será aislar todos estos datos y conseguir una manera para trabajar con ellos, debido a que el número de políticas podría ser infinito nos encontramos con que el número de variables no es un número fijo, cosa que nos genera un problema que debemos solucionar.

jueves, 10 de septiembre de 2009

Creando el fichero de configuración

Para tener un fichero de configuración editable y entendible por el usuario, y que el error en la edición por parte del usuario no provoque fallos graves en la ejecución, vamos a crear un fichero que luego leeremos con awk.

A continuación explicamos su estructura y ponemos 3 ejemplos.

Los primeros 3 caracteres nos indican el tamanyo a usar por la politica, como ejemplos tenemos el primero 010, que indicara o bien el 10% o 10 MB, KB o GB, Siempre que no se usen las 3 cifras se rellenaran ceros por delante.

El cuarto caracter indicara si es un porcentaje (%), o si son MB (M), GB (G), KB (K), etc.

El quinto caracter indicara si el espacio solicitado en los 4 primeros caracteres se refiere a la cache (C), o al disco (F), indicando si el porcentaje o el tamanyo seran de espacio en la cache o de espacio en el disco.

Tras el primer tabulador, los siguientes caracteres que encontremos nos especificaran el tipo de documento que queremos cachear, documentos de word, jpg, excel, etc, si escribimos none indicara que queremos cachear cualquier tipo de documento en esta politica.

Tras el segundo tabulador los caracteres que encontramos nos indicaran si queremos delimitar en algun tamanyo los archivos que cacheara la politica, si en el primer caracter especificamos (<) indicamos que cachee todos los ficheros de menor tamanyo que..., si especificamos (>) indicamos que cachee los ficheros de mayor tamanyo que ..., tb podremos dar la opcion de no restringir por tamanyo de fichero, es lo que hace la tercera politica.

Por ultimo tras el tercer tabulador indicaremos skip/count/skip/count/bs, skip sera los bloques iniciales que se salte al hacer dd, donde iniciara el cacheo del fichero, count indicara cuantos bloques cacheara desde donde marque el primer skip, el segundo skip marcara indicara cuantos bloques se saltara desde acabar el primer count, y el segundo count indicara cuantos bloques cacheara desde donde marco el segundo skip, por ultimo tendremos bs que marcara el tamanyo de los bloques, cada uno de estos estara definido por dos caracteres poniendo a 0 el primero en caso de ser una cifra menor a 10, en el ultimo caso, bs anayadira al final de estos dos caracteres un tercero para indicar KB (K), MB (M), etc, en caso de querer cachear todo el fichero sin saltos se marcaran skip/count/skip/count/bs de esta forma 00/00/00/00/02K siendo necesarios estos 3 ultimos caracteres
para indicar cada cuanto tamanyo hara los saltos el dd para cachear.

010%F doc <50k 02/04/02/02/02K 055XF none >30M 03/03/02/03/05K
029%F jfkdlsj82jlsa =00M 02/02/02/05/05M